[Pkg-ceph-commits] [ceph] 01/04: New upstream version 10.2.5

James Downing Page jamespage at moszumanska.debian.org
Wed Dec 14 13:50:43 UTC 2016


This is an automated email from the git hooks/post-receive script.

jamespage pushed a commit to branch ubuntu/xenial
in repository ceph.

commit a2bed4f400a4a9c3a48ce7de9468875c1e4f03ed
Author: James Page <james.page at ubuntu.com>
Date:   Wed Dec 14 11:21:22 2016 +0000

    New upstream version 10.2.5
---
 AUTHORS                                            |    30 +-
 CMakeLists.txt                                     |   367 +
 ChangeLog                                          |   277 +-
 Makefile.am                                        |    10 +-
 Makefile.in                                        |    59 +-
 aclocal.m4                                         |    73 +-
 ar-lib                                             |     2 +-
 ceph.spec                                          |    15 +-
 ceph.spec.in                                       |    13 +-
 compile                                            |     2 +-
 config.guess                                       |   233 +-
 config.sub                                         |    60 +-
 configure                                          |  3486 ++-
 configure.ac                                       |     2 +-
 depcomp                                            |     2 +-
 doc/.gitignore                                     |     3 +
 doc/Makefile                                       |   561 +
 doc/Makefile.am                                    |    60 +-
 doc/Makefile.in                                    |    85 +-
 doc/_templates/layout.html                         |     5 +
 doc/_templates/smarttoc.html                       |    16 +
 doc/_themes/ceph/static/nature.css_t               |   310 +
 doc/_themes/ceph/theme.conf                        |     4 +
 doc/api/index.rst                                  |    47 +
 doc/api/libcephfs-java.rst                         |     9 +
 doc/architecture.rst                               |  1600 +
 doc/cephfs/administration.rst                      |   137 +
 doc/cephfs/cephfs-journal-tool.rst                 |   238 +
 doc/cephfs/client-auth.rst                         |   107 +
 doc/cephfs/createfs.rst                            |    61 +
 doc/cephfs/disaster-recovery.rst                   |   162 +
 doc/cephfs/early-adopters.rst                      |    61 +
 doc/cephfs/eviction.rst                            |   119 +
 doc/cephfs/experimental-features.rst               |    81 +
 doc/cephfs/file-layouts.rst                        |   176 +
 doc/cephfs/fstab.rst                               |    47 +
 doc/cephfs/full.rst                                |    60 +
 doc/cephfs/fuse.rst                                |    36 +
 doc/cephfs/hadoop.rst                              |   202 +
 doc/cephfs/index.rst                               |   101 +
 doc/cephfs/journaler.rst                           |    49 +
 doc/cephfs/kernel.rst                              |    34 +
 doc/cephfs/mds-config-ref.rst                      |   610 +
 doc/cephfs/posix.rst                               |    49 +
 doc/cephfs/quota.rst                               |    70 +
 doc/cephfs/standby.rst                             |   208 +
 doc/cephfs/troubleshooting.rst                     |    28 +
 doc/cephfs/upgrading.rst                           |    34 +
 doc/changelog/v0.48.1argonaut.txt                  |  1286 +
 doc/changelog/v0.48.2argonaut.txt                  |   476 +
 doc/changelog/v0.48.3argonaut.txt                  |   895 +
 doc/changelog/v0.56.1.txt                          |   316 +
 doc/changelog/v0.56.2.txt                          |  1294 +
 doc/changelog/v0.56.3.txt                          |   562 +
 doc/changelog/v0.56.4.txt                          |  1126 +
 doc/changelog/v0.56.5.txt                          |  1972 ++
 doc/changelog/v0.56.6.txt                          |    40 +
 doc/changelog/v0.56.7.txt                          |   454 +
 doc/changelog/v0.61.1.txt                          |   139 +
 doc/changelog/v0.61.2.txt                          |    27 +
 doc/changelog/v0.61.3.txt                          |   831 +
 doc/changelog/v0.61.4.txt                          |   823 +
 doc/changelog/v0.61.5.txt                          |  1199 +
 doc/changelog/v0.61.6.txt                          |    75 +
 doc/changelog/v0.61.7.txt                          |   220 +
 doc/changelog/v0.61.8.txt                          |   810 +
 doc/changelog/v0.61.9.txt                          |   571 +
 doc/changelog/v0.67.1.txt                          |   142 +
 doc/changelog/v0.67.10.txt                         |   669 +
 doc/changelog/v0.67.11.txt                         |   215 +
 doc/changelog/v0.67.2.txt                          |   207 +
 doc/changelog/v0.67.3.txt                          |   700 +
 doc/changelog/v0.67.4.txt                          |   550 +
 doc/changelog/v0.67.5.txt                          |   711 +
 doc/changelog/v0.67.6.txt                          |  1258 +
 doc/changelog/v0.67.7.txt                          |   110 +
 doc/changelog/v0.67.8.txt                          |  1220 +
 doc/changelog/v0.67.9.txt                          |   233 +
 doc/changelog/v0.72.2.txt                          |   189 +
 doc/changelog/v0.80.1.txt                          |   216 +
 doc/changelog/v0.80.10.txt                         |  3308 ++
 doc/changelog/v0.80.11.txt                         |  3184 ++
 doc/changelog/v0.80.2.txt                          |  1187 +
 doc/changelog/v0.80.3.txt                          |    19 +
 doc/changelog/v0.80.4.txt                          |    36 +
 doc/changelog/v0.80.5.txt                          |   354 +
 doc/changelog/v0.80.6.txt                          |  3266 ++
 doc/changelog/v0.80.7.txt                          |    70 +
 doc/changelog/v0.80.8.txt                          |  2547 ++
 doc/changelog/v0.80.9.txt                          |  1148 +
 doc/changelog/v0.87.1.txt                          |  2151 ++
 doc/changelog/v0.87.2.txt                          |  1413 +
 doc/changelog/v0.94.1.txt                          |    74 +
 doc/changelog/v0.94.2.txt                          |  1563 +
 doc/changelog/v0.94.3.txt                          |  2660 ++
 doc/changelog/v0.94.4.txt                          |  3576 +++
 doc/changelog/v0.94.5.txt                          |    86 +
 doc/changelog/v0.94.6.txt                          |  4027 +++
 doc/changelog/v9.2.1.txt                           |  1637 +
 doc/conf.py                                        |    52 +
 doc/dev/PlanningImplementation.txt                 |    43 +
 doc/dev/cache-pool.rst                             |   200 +
 doc/dev/cephx_protocol.rst                         |   335 +
 doc/dev/config.rst                                 |    90 +
 doc/dev/confusing.txt                              |    36 +
 doc/dev/context.rst                                |    20 +
 doc/dev/corpus.rst                                 |    95 +
 doc/dev/cpu-profiler.rst                           |    54 +
 doc/dev/delayed-delete.rst                         |    12 +
 doc/dev/dev_cluster_deployement.rst                |   129 +
 doc/dev/development-workflow.rst                   |   255 +
 doc/dev/documenting.rst                            |   108 +
 doc/dev/erasure-coded-pool.rst                     |   137 +
 doc/dev/file-striping.rst                          |   161 +
 doc/dev/generatedocs.rst                           |    66 +
 doc/dev/index-old.rst                              |    39 +
 doc/dev/index.rst                                  |  1396 +
 doc/dev/kernel-client-troubleshooting.rst          |    17 +
 doc/dev/libs.rst                                   |    18 +
 doc/dev/logs.rst                                   |    57 +
 doc/dev/mds_internals/data-structures.rst          |    36 +
 doc/dev/mds_internals/index.rst                    |    10 +
 doc/dev/messenger.rst                              |    33 +
 doc/dev/mon-bootstrap.rst                          |   199 +
 doc/dev/network-encoding.rst                       |   214 +
 doc/dev/network-protocol.rst                       |   197 +
 doc/dev/object-store.rst                           |    67 +
 doc/dev/osd-class-path.rst                         |    16 +
 doc/dev/osd_internals/backfill_reservation.rst     |    38 +
 doc/dev/osd_internals/erasure_coding.rst           |    82 +
 .../erasure_coding/developer_notes.rst             |   223 +
 doc/dev/osd_internals/erasure_coding/jerasure.rst  |    33 +
 doc/dev/osd_internals/erasure_coding/pgbackend.rst |   320 +
 doc/dev/osd_internals/index.rst                    |    10 +
 doc/dev/osd_internals/last_epoch_started.rst       |    60 +
 doc/dev/osd_internals/map_message_handling.rst     |   131 +
 doc/dev/osd_internals/osd_overview.rst             |   106 +
 doc/dev/osd_internals/osd_throttles.rst            |    93 +
 doc/dev/osd_internals/osd_throttles.txt            |    21 +
 doc/dev/osd_internals/pg.rst                       |    31 +
 doc/dev/osd_internals/pg_removal.rst               |    56 +
 doc/dev/osd_internals/recovery_reservation.rst     |    74 +
 doc/dev/osd_internals/scrub.rst                    |    30 +
 doc/dev/osd_internals/snaps.rst                    |   124 +
 doc/dev/osd_internals/watch_notify.rst             |    81 +
 doc/dev/osd_internals/wbthrottle.rst               |    28 +
 doc/dev/peering.rst                                |   259 +
 doc/dev/perf_counters.rst                          |   166 +
 doc/dev/placement-group.rst                        |   152 +
 doc/dev/quick_guide.rst                            |   119 +
 doc/dev/radosgw/admin/adminops_nonimplemented.rst  |   495 +
 doc/dev/radosgw/index.rst                          |    13 +
 doc/dev/radosgw/s3_compliance.rst                  |   304 +
 doc/dev/radosgw/usage.rst                          |    84 +
 doc/dev/rbd-diff.rst                               |    69 +
 doc/dev/rbd-layering.rst                           |   281 +
 doc/dev/release-process.rst                        |   173 +
 doc/dev/repo-access.rst                            |    38 +
 doc/dev/sepia.rst                                  |     9 +
 doc/dev/session_authentication.rst                 |   160 +
 doc/dev/versions.rst                               |    42 +
 doc/dev/wireshark.rst                              |    41 +
 doc/favicon.ico                                    |   Bin 0 -> 1150 bytes
 doc/glossary.rst                                   |   150 +
 doc/images/CRUSH.jpg                               |   Bin 0 -> 90271 bytes
 doc/images/RADOS.jpg                               |   Bin 0 -> 58212 bytes
 doc/images/RBD.jpg                                 |   Bin 0 -> 71953 bytes
 doc/images/RDBSnapshots.jpg                        |   Bin 0 -> 43211 bytes
 doc/images/docreviewprocess.jpg                    |   Bin 0 -> 26248 bytes
 doc/images/region-sync.png                         |   Bin 0 -> 68497 bytes
 doc/images/region-sync.svg                         | 30426 +++++++++++++++++++
 doc/images/stack.png                               |   Bin 0 -> 16414 bytes
 doc/images/zone-sync.png                           |   Bin 0 -> 47495 bytes
 doc/images/zone-sync.svg                           | 21935 +++++++++++++
 doc/index.rst                                      |   106 +
 doc/install/build-ceph.rst                         |   103 +
 doc/install/clone-source.rst                       |   101 +
 doc/install/get-packages.rst                       |   467 +
 doc/install/get-tarballs.rst                       |    14 +
 doc/install/index.rst                              |    70 +
 doc/install/install-ceph-deploy.rst                |    23 +
 doc/install/install-ceph-gateway.rst               |   583 +
 doc/install/install-storage-cluster.rst            |    94 +
 doc/install/install-vm-cloud.rst                   |   128 +
 doc/install/manual-deployment.rst                  |   488 +
 doc/install/mirrors.rst                            |    65 +
 doc/install/upgrading-ceph.rst                     |   751 +
 doc/logo.png                                       |   Bin 0 -> 3898 bytes
 doc/man/8/mount.ceph.rst                           |     9 +-
 doc/man/8/radosgw-admin.rst                        |    14 +
 doc/man/8/rbd.rst                                  |    59 +-
 doc/mon/README.txt                                 |    27 +
 doc/mon/paxos-call-chain.dot                       |    82 +
 doc/rados/api/index.rst                            |    21 +
 doc/rados/api/librados-intro.rst                   |   992 +
 doc/rados/api/librados.rst                         |   187 +
 doc/rados/api/libradospp.rst                       |     5 +
 doc/rados/api/python.rst                           |   397 +
 doc/rados/configuration/auth-config-ref.rst        |   432 +
 doc/rados/configuration/ceph-conf.rst              |   528 +
 doc/rados/configuration/demo-ceph.conf             |    31 +
 doc/rados/configuration/filestore-config-ref.rst   |   307 +
 .../configuration/filesystem-recommendations.rst   |   100 +
 doc/rados/configuration/general-config-ref.rst     |    66 +
 doc/rados/configuration/index.rst                  |    63 +
 doc/rados/configuration/journal-ref.rst            |   116 +
 doc/rados/configuration/mon-config-ref.rst         |   879 +
 doc/rados/configuration/mon-osd-interaction.rst    |   392 +
 doc/rados/configuration/ms-ref.rst                 |    83 +
 doc/rados/configuration/network-config-ref.rst     |   467 +
 doc/rados/configuration/osd-config-ref.rst         |   724 +
 doc/rados/configuration/pool-pg-config-ref.rst     |   177 +
 doc/rados/configuration/pool-pg.conf               |    20 +
 doc/rados/deployment/ceph-deploy-admin.rst         |    38 +
 doc/rados/deployment/ceph-deploy-install.rst       |    46 +
 doc/rados/deployment/ceph-deploy-keys.rst          |    32 +
 doc/rados/deployment/ceph-deploy-mds.rst           |    46 +
 doc/rados/deployment/ceph-deploy-mon.rst           |    56 +
 doc/rados/deployment/ceph-deploy-new.rst           |    66 +
 doc/rados/deployment/ceph-deploy-osd.rst           |   117 +
 doc/rados/deployment/ceph-deploy-purge.rst         |    25 +
 doc/rados/deployment/index.rst                     |    58 +
 doc/rados/deployment/preflight-checklist.rst       |   109 +
 doc/rados/index.rst                                |    76 +
 doc/rados/man/index.rst                            |    31 +
 doc/rados/operations/add-or-rm-mons.rst            |   370 +
 doc/rados/operations/add-or-rm-osds.rst            |   330 +
 doc/rados/operations/cache-tiering.rst             |   412 +
 doc/rados/operations/control.rst                   |   405 +
 doc/rados/operations/crush-map.rst                 |  1247 +
 doc/rados/operations/data-placement.rst            |    39 +
 doc/rados/operations/erasure-code-isa.rst          |    94 +
 doc/rados/operations/erasure-code-jerasure.rst     |   109 +
 doc/rados/operations/erasure-code-lrc.rst          |   360 +
 doc/rados/operations/erasure-code-profile.rst      |   103 +
 doc/rados/operations/erasure-code-shec.rst         |   133 +
 doc/rados/operations/erasure-code.rst              |   174 +
 doc/rados/operations/index.rst                     |    87 +
 doc/rados/operations/monitoring-osd-pg.rst         |   617 +
 doc/rados/operations/monitoring.rst                |   291 +
 doc/rados/operations/operating.rst                 |   359 +
 doc/rados/operations/pg-concepts.rst               |   102 +
 doc/rados/operations/pg-states.rst                 |    80 +
 doc/rados/operations/placement-groups.rst          |   436 +
 doc/rados/operations/pools.rst                     |   715 +
 doc/rados/operations/user-management.rst           |   655 +
 doc/rados/troubleshooting/community.rst            |    29 +
 doc/rados/troubleshooting/cpu-profiling.rst        |    67 +
 doc/rados/troubleshooting/index.rst                |    19 +
 doc/rados/troubleshooting/log-and-debug.rst        |   557 +
 doc/rados/troubleshooting/memory-profiling.rst     |   142 +
 doc/rados/troubleshooting/troubleshooting-mon.rst  |   565 +
 doc/rados/troubleshooting/troubleshooting-osd.rst  |   484 +
 doc/rados/troubleshooting/troubleshooting-pg.rst   |   565 +
 doc/radosgw/admin.rst                              |   480 +
 doc/radosgw/adminops.rst                           |  1918 ++
 doc/radosgw/config-ref.rst                         |  1043 +
 doc/radosgw/config.rst                             |   591 +
 doc/radosgw/federated-config.rst                   |   826 +
 doc/radosgw/index.rst                              |    54 +
 doc/radosgw/keystone.rst                           |   120 +
 doc/radosgw/layout.rst                             |   199 +
 doc/radosgw/multisite.rst                          |   751 +
 doc/radosgw/multitenancy.rst                       |   102 +
 doc/radosgw/rgw-centos.conf                        |    30 +
 doc/radosgw/rgw-debian.conf                        |    29 +
 doc/radosgw/rgw.conf                               |    30 +
 doc/radosgw/s3.rst                                 |    95 +
 doc/radosgw/s3/authentication.rst                  |    75 +
 doc/radosgw/s3/bucketops.rst                       |   377 +
 doc/radosgw/s3/commons.rst                         |   107 +
 doc/radosgw/s3/cpp.rst                             |   331 +
 doc/radosgw/s3/csharp.rst                          |   199 +
 doc/radosgw/s3/java.rst                            |   212 +
 doc/radosgw/s3/objectops.rst                       |   403 +
 doc/radosgw/s3/perl.rst                            |   192 +
 doc/radosgw/s3/php.rst                             |   208 +
 doc/radosgw/s3/python.rst                          |   171 +
 doc/radosgw/s3/ruby.rst                            |   364 +
 doc/radosgw/s3/serviceops.rst                      |    39 +
 doc/radosgw/swift.rst                              |    75 +
 doc/radosgw/swift/auth.rst                         |    76 +
 doc/radosgw/swift/containerops.rst                 |   279 +
 doc/radosgw/swift/java.rst                         |   170 +
 doc/radosgw/swift/objectops.rst                    |   271 +
 doc/radosgw/swift/python.rst                       |   114 +
 doc/radosgw/swift/ruby.rst                         |   119 +
 doc/radosgw/swift/serviceops.rst                   |    76 +
 doc/radosgw/swift/tempurl.rst                      |    85 +
 doc/radosgw/swift/tutorial.rst                     |    60 +
 doc/radosgw/troubleshooting.rst                    |   179 +
 doc/rbd/disk.conf                                  |     8 +
 doc/rbd/librbdpy.rst                               |    82 +
 doc/rbd/libvirt.rst                                |   303 +
 doc/rbd/qemu-rbd.rst                               |   218 +
 doc/rbd/rados-rbd-cmds.rst                         |   117 +
 doc/rbd/rbd-cloudstack.rst                         |   130 +
 doc/rbd/rbd-config-ref.rst                         |   136 +
 doc/rbd/rbd-ko.rst                                 |    59 +
 doc/rbd/rbd-mirroring.rst                          |   282 +
 doc/rbd/rbd-openstack.rst                          |   475 +
 doc/rbd/rbd-replay.rst                             |    42 +
 doc/rbd/rbd-snapshot.rst                           |   308 +
 doc/rbd/rbd.rst                                    |    72 +
 doc/release-notes.rst                              | 13299 ++++++++
 doc/releases.rst                                   |   299 +
 doc/scripts/gen_state_diagram.py                   |   201 +
 doc/start/ceph.conf                                |    41 +
 doc/start/documenting-ceph.rst                     |   605 +
 doc/start/get-involved.rst                         |    91 +
 doc/start/hardware-recommendations.rst             |   357 +
 doc/start/index.rst                                |    47 +
 doc/start/intro.rst                                |    72 +
 doc/start/os-recommendations.rst                   |   128 +
 doc/start/quick-ceph-deploy.rst                    |   401 +
 doc/start/quick-cephfs.rst                         |   119 +
 doc/start/quick-common.rst                         |    19 +
 doc/start/quick-rbd.rst                            |    81 +
 doc/start/quick-rgw-old.rst                        |    28 +
 doc/start/quick-rgw.rst                            |   101 +
 doc/start/quick-start-preflight.rst                |   340 +
 doc/start/rgw.conf                                 |    30 +
 install-sh                                         |   373 +-
 ltmain.sh                                          |  5533 ++--
 m4/ax_arm.m4                                       |    15 +-
 m4/libtool.m4                                      |  2521 +-
 m4/ltoptions.m4                                    |   127 +-
 m4/ltsugar.m4                                      |     7 +-
 m4/ltversion.m4                                    |    12 +-
 m4/lt~obsolete.m4                                  |     7 +-
 m4/pkg.m4                                          |   230 +-
 man/CMakeLists.txt                                 |    43 +
 man/Makefile.am                                    |     2 +-
 man/Makefile.in                                    |    32 +-
 man/ceph-authtool.8                                |     2 +-
 man/ceph-clsinfo.8                                 |     2 +-
 man/ceph-conf.8                                    |     2 +-
 man/ceph-create-keys.8                             |     2 +-
 man/ceph-debugpack.8                               |     2 +-
 man/ceph-dencoder.8                                |     2 +-
 man/ceph-deploy.8                                  |     4 +-
 man/ceph-detect-init.8                             |     2 +-
 man/ceph-disk.8                                    |     2 +-
 man/ceph-fuse.8                                    |     2 +-
 man/ceph-mds.8                                     |     2 +-
 man/ceph-mon.8                                     |     2 +-
 man/ceph-osd.8                                     |     2 +-
 man/ceph-post-file.8                               |     2 +-
 man/ceph-rbdnamer.8                                |     2 +-
 man/ceph-rest-api.8                                |     2 +-
 man/ceph-run.8                                     |     2 +-
 man/ceph-syn.8                                     |     2 +-
 man/ceph.8                                         |     2 +-
 man/cephfs.8                                       |     2 +-
 man/crushtool.8                                    |     2 +-
 man/librados-config.8                              |     2 +-
 man/monmaptool.8                                   |     2 +-
 man/mount.ceph.8                                   |    11 +-
 man/osdmaptool.8                                   |     2 +-
 man/rados.8                                        |     2 +-
 man/radosgw-admin.8                                |    19 +-
 man/radosgw.8                                      |     2 +-
 man/rbd-fuse.8                                     |     2 +-
 man/rbd-mirror.8                                   |     2 +-
 man/rbd-nbd.8                                      |     2 +-
 man/rbd-replay-many.8                              |     2 +-
 man/rbd-replay-prep.8                              |     2 +-
 man/rbd-replay.8                                   |     2 +-
 man/rbd.8                                          |    60 +-
 man/rbdmap.8                                       |     2 +-
 missing                                            |     2 +-
 py-compile                                         |     2 +-
 qa/Makefile                                        |     4 +
 qa/btrfs/.gitignore                                |     3 +
 qa/btrfs/Makefile                                  |    11 +
 qa/btrfs/clone_range.c                             |    35 +
 qa/btrfs/create_async_snap.c                       |    34 +
 qa/btrfs/test_async_snap.c                         |    83 +
 qa/btrfs/test_rmdir_async_snap                     |   Bin 0 -> 8559 bytes
 qa/btrfs/test_rmdir_async_snap.c                   |    62 +
 qa/client/30_subdir_mount.sh                       |    22 +
 qa/client/common.sh                                |    58 +
 qa/client/gen-1774.sh                              |  2067 ++
 qa/fs/.gitignore                                   |     1 +
 qa/libceph/Makefile                                |    11 +
 qa/libceph/trivial_libceph.c                       |    69 +
 qa/loopall.sh                                      |    28 +
 qa/mds/test_anchortable.sh                         |    26 +
 qa/mds/test_mdstable_failures.sh                   |    13 +
 qa/mon/bootstrap/host.sh                           |    29 +
 qa/mon/bootstrap/initial_members.sh                |    39 +
 qa/mon/bootstrap/initial_members_asok.sh           |    66 +
 qa/mon/bootstrap/simple.sh                         |    36 +
 qa/mon/bootstrap/simple_expand.sh                  |    60 +
 qa/mon/bootstrap/simple_expand_monmap.sh           |    44 +
 qa/mon/bootstrap/simple_single_expand.sh           |    54 +
 qa/mon/bootstrap/simple_single_expand2.sh          |    40 +
 qa/mon/bootstrap/single_host.sh                    |    29 +
 qa/mon/bootstrap/single_host_multi.sh              |    39 +
 qa/qa_scripts/RbdLib.pm                            |   530 +
 qa/qa_scripts/S3Lib.pm                             |   166 +
 qa/qa_scripts/cephscrub.sh                         |    32 +
 qa/qa_scripts/load-bucket-1000-obj.pl              |   171 +
 qa/qa_scripts/rbd_cli_tests.pl                     |   386 +
 qa/qa_scripts/rbd_functional_tests.pl              |   532 +
 qa/qa_scripts/rgw_install_config.pl                |   287 +
 qa/qa_scripts/s3-file-test.pl                      |   241 +
 qa/qa_scripts/sample.pl                            |   108 +
 qa/qa_scripts/script_gen.pl                        |    59 +
 qa/rbd/common.sh                                   |   103 +
 qa/rbd/rbd.sh                                      |    49 +
 qa/run_xfstests-obsolete.sh                        |   458 +
 qa/run_xfstests.sh                                 |   519 +
 qa/run_xfstests_krbd.sh                            |    91 +
 qa/run_xfstests_qemu.sh                            |    29 +
 qa/runallonce.sh                                   |    25 +
 qa/runoncfuse.sh                                   |     7 +
 qa/runonkclient.sh                                 |     8 +
 qa/setup-chroot.sh                                 |    65 +
 qa/workunits/Makefile                              |     4 +
 qa/workunits/caps/mon_commands.sh                  |    25 +
 qa/workunits/ceph-disk/60-ceph-by-partuuid.rules   |    29 +
 qa/workunits/ceph-disk/ceph-disk-no-lockbox        |  4598 +++
 qa/workunits/ceph-disk/ceph-disk-test.py           |   697 +
 qa/workunits/ceph-disk/ceph-disk.sh                |    43 +
 qa/workunits/ceph-helpers-root.sh                  |    91 +
 qa/workunits/ceph-helpers.sh                       |  1498 +
 qa/workunits/ceph-tests/ceph-admin-commands.sh     |    13 +
 qa/workunits/cephtool/test.sh                      |  1977 ++
 qa/workunits/cephtool/test_daemon.sh               |    43 +
 qa/workunits/cls/test_cls_hello.sh                 |     5 +
 qa/workunits/cls/test_cls_lock.sh                  |     5 +
 qa/workunits/cls/test_cls_numops.sh                |     5 +
 qa/workunits/cls/test_cls_rbd.sh                   |     6 +
 qa/workunits/cls/test_cls_refcount.sh              |     5 +
 qa/workunits/cls/test_cls_rgw.sh                   |     8 +
 qa/workunits/direct_io/.gitignore                  |     3 +
 qa/workunits/direct_io/Makefile                    |    11 +
 qa/workunits/direct_io/big.sh                      |     6 +
 qa/workunits/direct_io/direct_io_test.c            |   312 +
 qa/workunits/direct_io/misc.sh                     |    16 +
 qa/workunits/direct_io/test_short_dio_read.c       |    57 +
 qa/workunits/direct_io/test_sync_io.c              |   250 +
 qa/workunits/erasure-code/.gitignore               |     2 +
 qa/workunits/erasure-code/bench.html               |    34 +
 qa/workunits/erasure-code/bench.sh                 |   194 +
 qa/workunits/erasure-code/examples.css             |    97 +
 .../erasure-code/jquery.flot.categories.js         |   190 +
 qa/workunits/erasure-code/jquery.flot.js           |  3168 ++
 qa/workunits/erasure-code/jquery.js                |  9472 ++++++
 qa/workunits/erasure-code/plot.js                  |    98 +
 qa/workunits/false.sh                              |     3 +
 qa/workunits/fs/.gitignore                         |     1 +
 qa/workunits/fs/Makefile                           |    11 +
 qa/workunits/fs/misc/acl.sh                        |    34 +
 qa/workunits/fs/misc/chmod.sh                      |    60 +
 qa/workunits/fs/misc/direct_io.py                  |    47 +
 qa/workunits/fs/misc/dirfrag.sh                    |    52 +
 qa/workunits/fs/misc/filelock_deadlock.py          |    68 +
 qa/workunits/fs/misc/filelock_interrupt.py         |    85 +
 qa/workunits/fs/misc/i_complete_vs_rename.sh       |    31 +
 qa/workunits/fs/misc/layout_vxattrs.sh             |   109 +
 qa/workunits/fs/misc/mkpool_layout_vxattrs.sh      |    15 +
 qa/workunits/fs/misc/multiple_rsync.sh             |    25 +
 qa/workunits/fs/misc/trivial_sync.sh               |     7 +
 qa/workunits/fs/misc/xattrs.sh                     |    14 +
 qa/workunits/fs/multiclient_sync_read_eof.py       |    44 +
 qa/workunits/fs/norstats/kernel_untar_tar.sh       |    26 +
 qa/workunits/fs/quota/quota.sh                     |   129 +
 qa/workunits/fs/snaps/snap-rm-diff.sh              |    11 +
 qa/workunits/fs/snaps/snaptest-0.sh                |    27 +
 qa/workunits/fs/snaps/snaptest-1.sh                |    31 +
 qa/workunits/fs/snaps/snaptest-2.sh                |    61 +
 qa/workunits/fs/snaps/snaptest-authwb.sh           |    14 +
 qa/workunits/fs/snaps/snaptest-capwb.sh            |    35 +
 qa/workunits/fs/snaps/snaptest-dir-rename.sh       |    19 +
 qa/workunits/fs/snaps/snaptest-double-null.sh      |    25 +
 qa/workunits/fs/snaps/snaptest-estale.sh           |    15 +
 qa/workunits/fs/snaps/snaptest-git-ceph.sh         |    35 +
 qa/workunits/fs/snaps/snaptest-intodir.sh          |    24 +
 .../fs/snaps/snaptest-multiple-capsnaps.sh         |    44 +
 qa/workunits/fs/snaps/snaptest-parents.sh          |    41 +
 qa/workunits/fs/snaps/snaptest-snap-rename.sh      |    35 +
 qa/workunits/fs/snaps/snaptest-snap-rm-cmp.sh      |    26 +
 qa/workunits/fs/snaps/snaptest-upchildrealms.sh    |    30 +
 qa/workunits/fs/snaps/snaptest-xattrwb.sh          |    31 +
 qa/workunits/fs/snaps/untar_snap_rm.sh             |    20 +
 qa/workunits/fs/test_o_trunc.c                     |    45 +
 qa/workunits/fs/test_o_trunc.sh                    |     7 +
 qa/workunits/fs/test_python.sh                     |    10 +
 qa/workunits/hadoop/repl.sh                        |    42 +
 qa/workunits/hadoop/terasort.sh                    |    76 +
 qa/workunits/hadoop/wordcount.sh                   |    35 +
 qa/workunits/kernel_untar_build.sh                 |    20 +
 qa/workunits/libcephfs-java/test.sh                |    39 +
 qa/workunits/libcephfs/test.sh                     |     5 +
 qa/workunits/mon/auth_caps.sh                      |   140 +
 qa/workunits/mon/caps.py                           |   367 +
 qa/workunits/mon/caps.sh                           |    55 +
 qa/workunits/mon/crush_ops.sh                      |   108 +
 qa/workunits/mon/osd.sh                            |    24 +
 qa/workunits/mon/ping.py                           |   104 +
 qa/workunits/mon/pool_ops.sh                       |    49 +
 qa/workunits/mon/rbd_snaps_ops.sh                  |    53 +
 qa/workunits/mon/test_mon_config_key.py            |   400 +
 qa/workunits/mon/workloadgen.sh                    |   169 +
 qa/workunits/objectstore/test_fuse.sh              |   117 +
 qa/workunits/osdc/stress_objectcacher.sh           |    28 +
 qa/workunits/post-file.sh                          |     7 +
 qa/workunits/rados/clone.sh                        |    13 +
 qa/workunits/rados/load-gen-big.sh                 |    10 +
 qa/workunits/rados/load-gen-mix-small-long.sh      |    10 +
 qa/workunits/rados/load-gen-mix-small.sh           |    10 +
 qa/workunits/rados/load-gen-mix.sh                 |    10 +
 qa/workunits/rados/load-gen-mostlyread.sh          |    10 +
 qa/workunits/rados/stress_watch.sh                 |     7 +
 qa/workunits/rados/test-upgrade-v11.0.0.sh         |    50 +
 qa/workunits/rados/test.sh                         |    49 +
 qa/workunits/rados/test_alloc_hint.sh              |   174 +
 qa/workunits/rados/test_cache_pool.sh              |   137 +
 qa/workunits/rados/test_hang.sh                    |     8 +
 qa/workunits/rados/test_pool_quota.sh              |    66 +
 qa/workunits/rados/test_python.sh                  |     8 +
 qa/workunits/rados/test_rados_timeouts.sh          |    47 +
 qa/workunits/rados/test_rados_tool.sh              |   327 +
 qa/workunits/rados/test_tmap_to_omap.sh            |    28 +
 qa/workunits/rbd/concurrent.sh                     |   375 +
 qa/workunits/rbd/copy.sh                           |   350 +
 qa/workunits/rbd/diff.sh                           |    52 +
 qa/workunits/rbd/diff_continuous.sh                |    59 +
 qa/workunits/rbd/huge-tickets.sh                   |    41 +
 qa/workunits/rbd/image_read.sh                     |   677 +
 qa/workunits/rbd/import_export.sh                  |   153 +
 qa/workunits/rbd/journal.sh                        |   310 +
 qa/workunits/rbd/kernel.sh                         |    89 +
 qa/workunits/rbd/map-snapshot-io.sh                |    17 +
 qa/workunits/rbd/map-unmap.sh                      |    44 +
 qa/workunits/rbd/merge_diff.sh                     |   474 +
 qa/workunits/rbd/notify_master.sh                  |     7 +
 qa/workunits/rbd/notify_slave.sh                   |     7 +
 qa/workunits/rbd/permissions.sh                    |   146 +
 qa/workunits/rbd/qemu-iotests.sh                   |    42 +
 qa/workunits/rbd/qemu_dynamic_features.sh          |    48 +
 qa/workunits/rbd/qemu_rebuild_object_map.sh        |    36 +
 qa/workunits/rbd/rbd-nbd.sh                        |   115 +
 qa/workunits/rbd/rbd_mirror.sh                     |   333 +
 qa/workunits/rbd/rbd_mirror_helpers.sh             |   787 +
 qa/workunits/rbd/rbd_mirror_stress.sh              |   188 +
 qa/workunits/rbd/read-flags.sh                     |    60 +
 qa/workunits/rbd/run_cli_tests.sh                  |     5 +
 qa/workunits/rbd/set_ro.py                         |   113 +
 qa/workunits/rbd/simple_big.sh                     |    12 +
 qa/workunits/rbd/smalliobench.sh                   |    18 +
 qa/workunits/rbd/test_admin_socket.sh              |   152 +
 qa/workunits/rbd/test_librbd.sh                    |     9 +
 qa/workunits/rbd/test_librbd_api.sh                |     4 +
 qa/workunits/rbd/test_librbd_python.sh             |    14 +
 qa/workunits/rbd/test_lock_fence.sh                |    49 +
 qa/workunits/rbd/test_rbd_mirror.sh                |     9 +
 qa/workunits/rbd/test_rbdmap_RBDMAPFILE.sh         |    37 +
 qa/workunits/rbd/verify_pool.sh                    |    26 +
 qa/workunits/rename/all.sh                         |    36 +
 qa/workunits/rename/dir_pri_nul.sh                 |    28 +
 qa/workunits/rename/dir_pri_pri.sh                 |    11 +
 qa/workunits/rename/plan.txt                       |   111 +
 qa/workunits/rename/prepare.sh                     |    21 +
 qa/workunits/rename/pri_nul.sh                     |    11 +
 qa/workunits/rename/pri_pri.sh                     |    12 +
 qa/workunits/rename/pri_rem.sh                     |    31 +
 qa/workunits/rename/rem_nul.sh                     |    29 +
 qa/workunits/rename/rem_pri.sh                     |    29 +
 qa/workunits/rename/rem_rem.sh                     |    61 +
 qa/workunits/rest/test.py                          |   417 +
 qa/workunits/restart/test-backtraces.py            |   252 +
 qa/workunits/rgw/s3_bucket_quota.pl                |   393 +
 qa/workunits/rgw/s3_multipart_upload.pl            |   151 +
 qa/workunits/rgw/s3_user_quota.pl                  |   191 +
 qa/workunits/rgw/s3_utilities.pm                   |   220 +
 qa/workunits/suites/blogbench.sh                   |    15 +
 qa/workunits/suites/bonnie.sh                      |    11 +
 qa/workunits/suites/cephfs_journal_tool_smoke.sh   |    89 +
 qa/workunits/suites/dbench-short.sh                |     5 +
 qa/workunits/suites/dbench.sh                      |     6 +
 qa/workunits/suites/ffsb.sh                        |    22 +
 qa/workunits/suites/fio.sh                         |    42 +
 qa/workunits/suites/fsstress.sh                    |    20 +
 qa/workunits/suites/fsx.sh                         |    16 +
 qa/workunits/suites/fsync-tester.sh                |    12 +
 qa/workunits/suites/iogen.sh                       |    17 +
 qa/workunits/suites/iozone-sync.sh                 |    22 +
 qa/workunits/suites/iozone.sh                      |     7 +
 qa/workunits/suites/pjd.sh                         |    18 +
 qa/workunits/suites/random_write.32.ffsb           |    48 +
 qa/workunits/true.sh                               |     3 +
 selinux/Makefile.in                                |    25 +-
 share/id_dsa_drop.ceph.com                         |    12 -
 share/id_dsa_drop.ceph.com.pub                     |     1 -
 share/id_rsa_drop.ceph.com                         |    27 +
 share/id_rsa_drop.ceph.com.pub                     |     1 +
 src/.git_version                                   |     4 +-
 src/CMakeLists.txt                                 |  1297 +
 src/Makefile.am                                    |     1 +
 src/Makefile.in                                    |   931 +-
 src/acconfig.h.in                                  |     3 +-
 src/auth/Crypto.h                                  |     2 +
 src/auth/cephx/CephxClientHandler.cc               |     6 +
 src/auth/cephx/CephxProtocol.cc                    |    10 +-
 src/ceph-create-keys                               |    31 +-
 src/ceph-detect-init/CMakeLists.txt                |     6 +
 src/ceph-detect-init/Makefile.am                   |     1 +
 src/ceph-disk/CMakeLists.txt                       |     6 +
 src/ceph-disk/Makefile.am                          |     1 +
 src/ceph-disk/ceph_disk/main.py                    |   236 +-
 src/ceph-disk/tests/test_main.py                   |    13 +-
 src/ceph-disk/tox.ini                              |     2 +-
 src/ceph-osd-prestart.sh                           |     7 +
 src/ceph-post-file.in                              |    12 +-
 src/client/Client.cc                               |   227 +-
 src/client/Client.h                                |     7 +-
 src/client/Inode.cc                                |    10 +-
 src/client/Inode.h                                 |    85 +-
 src/cls/CMakeLists.txt                             |   130 +
 src/cls/Makefile.am                                |     2 +
 src/cls/cephfs/cls_cephfs.cc                       |     2 +-
 src/cls/journal/cls_journal_client.cc              |    13 +-
 src/cls/journal/cls_journal_client.h               |     3 +
 src/cls/rbd/cls_rbd.cc                             |     3 +
 src/cls/rgw/cls_rgw_ops.h                          |     3 +-
 src/common/AsyncOpTracker.cc                       |    53 +
 src/common/AsyncOpTracker.h                        |    31 +
 src/common/Makefile.am                             |     4 +-
 src/common/TextTable.cc                            |     2 +-
 src/common/TextTable.h                             |     6 +-
 src/common/ceph_context.cc                         |     6 +-
 src/common/ceph_json.cc                            |     2 +-
 src/common/ceph_json.h                             |     3 +-
 src/common/ceph_timer.h                            |    46 +-
 src/common/common_init.h                           |     2 +-
 src/common/config.cc                               |     2 +-
 src/common/config_opts.h                           |     8 +-
 src/common/crc32c_aarch64.c                        |     3 +
 src/common/hobject.h                               |    14 +-
 src/common/strtol.cc                               |     6 +-
 src/compressor/CMakeLists.txt                      |    19 +
 src/compressor/Makefile.am                         |     2 +
 src/compressor/snappy/CMakeLists.txt               |    14 +
 src/compressor/snappy/Makefile.am                  |     2 +
 src/compressor/zlib/CMakeLists.txt                 |    14 +
 src/compressor/zlib/Makefile.am                    |     2 +
 src/crush/CrushTester.cc                           |     3 +-
 src/crush/CrushWrapper.cc                          |     6 +-
 src/crush/CrushWrapper.h                           |    33 +-
 src/crush/builder.c                                |     3 +-
 src/erasure-code/CMakeLists.txt                    |    91 +
 src/erasure-code/Makefile.am                       |     2 +
 src/erasure-code/isa/CMakeLists.txt                |    58 +
 src/erasure-code/isa/Makefile.am                   |     2 +
 src/erasure-code/jerasure/CMakeLists.txt           |    95 +
 src/erasure-code/jerasure/Makefile.am              |     2 +
 src/erasure-code/lrc/CMakeLists.txt                |    14 +
 src/erasure-code/lrc/Makefile.am                   |     2 +
 src/erasure-code/shec/CMakeLists.txt               |    67 +
 src/erasure-code/shec/Makefile.am                  |     2 +
 src/gmock/Makefile.in                              |    70 +-
 src/gmock/aclocal.m4                               |  2741 +-
 src/gmock/build-aux/compile                        |     2 +-
 src/gmock/build-aux/config.guess                   |   233 +-
 src/gmock/build-aux/config.h.in                    |     3 +-
 src/gmock/build-aux/config.sub                     |    60 +-
 src/gmock/build-aux/depcomp                        |     2 +-
 src/gmock/build-aux/install-sh                     |   373 +-
 src/gmock/build-aux/ltmain.sh                      |  5533 ++--
 src/gmock/build-aux/missing                        |     2 +-
 src/gmock/build-aux/test-driver                    |    15 +-
 src/gmock/configure                                |  3124 +-
 src/gmock/gtest/Makefile.in                        |    70 +-
 src/gmock/gtest/aclocal.m4                         |    67 +-
 src/gmock/gtest/build-aux/compile                  |     2 +-
 src/gmock/gtest/build-aux/config.guess             |   233 +-
 src/gmock/gtest/build-aux/config.h.in              |     3 +-
 src/gmock/gtest/build-aux/config.sub               |    60 +-
 src/gmock/gtest/build-aux/depcomp                  |     2 +-
 src/gmock/gtest/build-aux/install-sh               |   373 +-
 src/gmock/gtest/build-aux/ltmain.sh                |  5533 ++--
 src/gmock/gtest/build-aux/missing                  |     2 +-
 src/gmock/gtest/build-aux/test-driver              |    15 +-
 src/gmock/gtest/configure                          |  3124 +-
 src/gmock/gtest/m4/libtool.m4                      |  2521 +-
 src/gmock/gtest/m4/ltoptions.m4                    |   127 +-
 src/gmock/gtest/m4/ltsugar.m4                      |     7 +-
 src/gmock/gtest/m4/ltversion.m4                    |    12 +-
 src/gmock/gtest/m4/lt~obsolete.m4                  |     7 +-
 src/include/krbd.h                                 |     6 +-
 src/include/rados/librgw.h                         |     7 +
 src/include/rados/rgw_file.h                       |    24 +-
 src/init-radosgw                                   |    10 +-
 src/java/Makefile.in                               |    25 +-
 src/journal/AsyncOpTracker.cc                      |    64 -
 src/journal/AsyncOpTracker.h                       |    38 -
 src/journal/JournalMetadata.cc                     |    89 +-
 src/journal/JournalMetadata.h                      |    26 +-
 src/journal/JournalPlayer.h                        |     2 +-
 src/journal/JournalRecorder.cc                     |    52 +-
 src/journal/JournalRecorder.h                      |    18 +-
 src/journal/JournalTrimmer.cc                      |     9 +-
 src/journal/JournalTrimmer.h                       |     2 +-
 src/journal/Journaler.cc                           |    13 +-
 src/journal/Journaler.h                            |     3 +
 src/journal/Makefile.am                            |     2 -
 src/journal/ObjectRecorder.cc                      |   209 +-
 src/journal/ObjectRecorder.h                       |    23 +-
 src/journal/Settings.h                             |     3 +
 src/json_spirit/CMakeLists.txt                     |     4 +
 src/json_spirit/Makefile.am                        |     2 +
 src/krbd.cc                                        |    71 +-
 src/kv/CMakeLists.txt                              |    19 +
 src/kv/Makefile.am                                 |     2 +
 src/libradosstriper/CMakeLists.txt                 |     7 +
 src/libradosstriper/Makefile.am                    |     2 +
 src/librbd/AioImageRequest.cc                      |    31 +-
 src/librbd/CMakeLists.txt                          |    91 +
 src/librbd/ImageCtx.cc                             |     6 +-
 src/librbd/ImageCtx.h                              |     2 +
 src/librbd/ImageWatcher.cc                         |    20 +-
 src/librbd/Journal.cc                              |   398 +-
 src/librbd/Journal.h                               |    43 +-
 src/librbd/Makefile.am                             |     3 +
 src/librbd/Operations.cc                           |    23 +-
 src/librbd/Utils.h                                 |    36 +
 src/librbd/exclusive_lock/AcquireRequest.cc        |     9 +-
 src/librbd/image/CloseRequest.cc                   |     5 +-
 src/librbd/image/RefreshRequest.cc                 |    23 +-
 src/librbd/internal.cc                             |   378 +-
 src/librbd/internal.h                              |     7 +-
 src/librbd/journal/DisabledPolicy.h                |    32 +
 src/librbd/journal/Policy.h                        |     1 +
 src/librbd/journal/Replay.cc                       |    18 +-
 src/librbd/journal/StandardPolicy.h                |     3 +
 src/librbd/journal/Types.cc                        |    58 +-
 src/librbd/journal/Types.h                         |    56 +-
 src/librbd/librbd.cc                               |     8 +-
 src/librbd/operation/RenameRequest.cc              |     6 +-
 src/librbd/operation/ResizeRequest.cc              |    41 +-
 src/librbd/operation/ResizeRequest.h               |     8 +-
 src/librbd/operation/SnapshotProtectRequest.cc     |     6 +-
 src/librbd/operation/SnapshotRemoveRequest.cc      |     6 +-
 src/librbd/operation/SnapshotRenameRequest.cc      |     6 +-
 src/librbd/operation/SnapshotUnprotectRequest.cc   |     6 +-
 src/log/Log.cc                                     |     4 +-
 src/logrotate.conf                                 |     2 +-
 src/mds/CDir.cc                                    |    27 +-
 src/mds/CDir.h                                     |     4 +
 src/mds/DamageTable.cc                             |    28 +-
 src/mds/LogEvent.h                                 |     2 +-
 src/mds/MDCache.cc                                 |     6 -
 src/mds/MDSMap.h                                   |     2 +-
 src/mds/MDSRank.cc                                 |     4 +-
 src/mds/Mutation.h                                 |     4 +-
 src/mds/Server.cc                                  |     1 +
 src/mds/SessionMap.cc                              |     2 +-
 src/mds/flock.h                                    |     6 +-
 src/mds/mdstypes.h                                 |     7 +-
 src/messages/MForward.h                            |    53 +-
 src/messages/MMDSBeacon.h                          |     7 +-
 src/mon/AuthMonitor.cc                             |     2 +-
 src/mon/AuthMonitor.h                              |     2 +-
 src/mon/LogMonitor.cc                              |     2 +-
 src/mon/MDSMonitor.cc                              |    15 +-
 src/mon/MonCommands.h                              |     2 +-
 src/mon/MonMap.h                                   |     2 +-
 src/mon/MonmapMonitor.cc                           |     3 +-
 src/mon/OSDMonitor.cc                              |   166 +-
 src/mon/PGMonitor.cc                               |    11 +-
 src/mon/PGMonitor.h                                |    15 +-
 src/msg/Message.cc                                 |     5 +
 src/msg/Message.h                                  |     9 +-
 src/msg/msg_types.h                                |    20 +-
 src/msg/simple/Pipe.cc                             |    71 +-
 src/ocf/Makefile.in                                |    26 +-
 src/os/filestore/CollectionIndex.h                 |     2 +
 src/os/filestore/FileJournal.cc                    |     7 +-
 src/os/filestore/FileStore.cc                      |    14 +
 src/os/filestore/FileStore.h                       |     2 +
 src/os/filestore/HashIndex.cc                      |    58 +-
 src/os/filestore/HashIndex.h                       |     6 +
 src/osd/OSD.cc                                     |    10 +-
 src/osd/OSD.h                                      |    14 +
 src/osd/OSDMap.cc                                  |    12 +-
 src/osd/OSDMap.h                                   |     6 +-
 src/osd/PG.cc                                      |   174 +-
 src/osd/PG.h                                       |    37 +-
 src/osd/ReplicatedPG.cc                            |    13 +-
 src/osd/ReplicatedPG.h                             |    16 +
 src/osd/osd_types.cc                               |    41 +-
 src/osd/osd_types.h                                |    25 +-
 src/osdc/Journaler.cc                              |     2 +-
 src/osdc/ObjectCacher.cc                           |     6 +-
 src/osdc/ObjectCacher.h                            |    26 +-
 src/pybind/CMakeLists.txt                          |    13 +
 src/pybind/Makefile.am                             |     2 +
 src/pybind/cephfs/CMakeLists.txt                   |    13 +
 src/pybind/cephfs/Makefile.am                      |     5 +-
 src/pybind/rados/CMakeLists.txt                    |    13 +
 src/pybind/rados/Makefile.am                       |     5 +-
 src/pybind/rbd/CMakeLists.txt                      |    13 +
 src/pybind/rbd/Makefile.am                         |     5 +-
 src/rbd_replay/CMakeLists.txt                      |    52 +
 src/rbd_replay/Makefile.am                         |     2 +
 src/rbd_replay/ios.cc                              |     2 +-
 src/rbd_replay/ios.hpp                             |     2 +-
 src/rgw/librgw.cc                                  |    11 +-
 src/rgw/rgw_admin.cc                               |     2 +
 src/rgw/rgw_common.cc                              |     1 +
 src/rgw/rgw_common.h                               |     1 +
 src/rgw/rgw_coroutine.cc                           |    15 +-
 src/rgw/rgw_data_sync.cc                           |    97 +-
 src/rgw/rgw_dencoder.cc                            |     4 +
 src/rgw/rgw_file.cc                                |   307 +-
 src/rgw/rgw_file.h                                 |   195 +-
 src/rgw/rgw_json_enc.cc                            |     1 +
 src/rgw/rgw_ldap.cc                                |    84 +
 src/rgw/rgw_ldap.h                                 |    68 +-
 src/rgw/rgw_metadata.cc                            |     9 +
 src/rgw/rgw_op.cc                                  |    83 +-
 src/rgw/rgw_op.h                                   |    24 +
 src/rgw/rgw_policy_s3.cc                           |     4 +-
 src/rgw/rgw_quota.cc                               |    56 +-
 src/rgw/rgw_rados.cc                               |   122 +-
 src/rgw/rgw_rados.h                                |    44 +-
 src/rgw/rgw_rest_s3.cc                             |    19 +-
 src/rgw/rgw_rest_user.cc                           |    31 +
 src/rgw/rgw_swift_auth.cc                          |     2 +
 src/rgw/rgw_sync.h                                 |    36 +-
 src/rgw/rgw_user.cc                                |    34 +-
 src/rgw/rgw_xml.cc                                 |     2 +-
 src/rgw/rgw_xml.h                                  |     2 +-
 src/test/CMakeLists.txt                            |   789 +
 src/test/Makefile.am                               |    37 +
 src/test/ObjectMap/CMakeLists.txt                  |    47 +
 src/test/bench/CMakeLists.txt                      |    75 +
 src/test/centos-6/ceph.spec.in                     |    13 +-
 src/test/centos-7/ceph.spec.in                     |    13 +-
 src/test/cli/radosgw-admin/help.t                  |     1 +
 src/test/cli/rbd/help.t                            |    25 +-
 src/test/cls_hello/CMakeLists.txt                  |    15 +
 src/test/cls_lock/CMakeLists.txt                   |    17 +
 src/test/cls_log/CMakeLists.txt                    |    17 +
 src/test/cls_numops/CMakeLists.txt                 |    16 +
 src/test/cls_rbd/CMakeLists.txt                    |    24 +
 src/test/cls_refcount/CMakeLists.txt               |    18 +
 src/test/cls_replica_log/CMakeLists.txt            |    18 +
 src/test/cls_rgw/CMakeLists.txt                    |    17 +
 src/test/cls_statelog/CMakeLists.txt               |    18 +
 src/test/cls_version/CMakeLists.txt                |    18 +
 src/test/common/CMakeLists.txt                     |   190 +
 src/test/compressor/CMakeLists.txt                 |    76 +
 src/test/compressor/Makefile.am                    |     2 +
 src/test/crush/CMakeLists.txt                      |    13 +
 src/test/crush/CrushWrapper.cc                     |    42 +
 src/test/encoding/CMakeLists.txt                   |     4 +
 src/test/encoding/types.h                          |     2 +-
 src/test/erasure-code/CMakeLists.txt               |   298 +
 src/test/erasure-code/Makefile.am                  |     2 +
 src/test/fedora-21/ceph.spec.in                    |    13 +-
 src/test/filestore/CMakeLists.txt                  |     8 +
 src/test/fs/CMakeLists.txt                         |     6 +
 src/test/journal/CMakeLists.txt                    |    35 +
 src/test/journal/RadosTestFixture.cc               |     4 +-
 src/test/journal/RadosTestFixture.h                |     3 +-
 src/test/journal/mock/MockJournaler.h              |    15 +-
 src/test/journal/test_JournalMetadata.cc           |    71 +-
 src/test/journal/test_ObjectRecorder.cc            |   105 +-
 src/test/libcephfs/CMakeLists.txt                  |    21 +
 src/test/librados/CMakeLists.txt                   |   172 +
 src/test/librados_test_stub/CMakeLists.txt         |    10 +
 src/test/libradosstriper/CMakeLists.txt            |    14 +
 src/test/librbd/CMakeLists.txt                     |   141 +
 .../exclusive_lock/test_mock_AcquireRequest.cc     |    44 +-
 src/test/librbd/fsx.cc                             |     2 +-
 src/test/librbd/image/test_mock_RefreshRequest.cc  |   148 +-
 src/test/librbd/journal/test_Replay.cc             |     8 +-
 src/test/librbd/mock/MockImageCtx.h                |     9 +-
 src/test/librbd/mock/MockJournal.h                 |    16 +-
 src/test/librbd/mock/MockJournalPolicy.h           |     1 +
 .../librbd/operation/test_mock_ResizeRequest.cc    |    34 +-
 src/test/librbd/test_internal.cc                   |    17 +-
 src/test/librbd/test_librbd.cc                     |    54 +-
 src/test/librbd/test_mirroring.cc                  |     6 +-
 src/test/librbd/test_mock_Journal.cc               |   368 +-
 src/test/librgw_file_aw.cc                         |     4 +-
 src/test/librgw_file_gp.cc                         |     2 +-
 src/test/librgw_file_nfsns.cc                      |   121 +-
 src/test/mds/CMakeLists.txt                        |    15 +
 src/test/messenger/CMakeLists.txt                  |    44 +
 src/test/messenger/Makefile.am                     |     2 +
 src/test/mon/CMakeLists.txt                        |    50 +
 src/test/msgr/CMakeLists.txt                       |    28 +
 src/test/msgr/test_msgr.cc                         |   198 +-
 src/test/objectstore/CMakeLists.txt                |   116 +
 src/test/opensuse-13.2/ceph.spec.in                |    13 +-
 src/test/os/CMakeLists.txt                         |     7 +
 src/test/osd/CMakeLists.txt                        |    90 +
 src/test/osd/TestOpStat.cc                         |     4 +-
 src/test/osd/TestOpStat.h                          |     6 +-
 src/test/osdc/CMakeLists.txt                       |    12 +
 src/test/pybind/CMakeLists.txt                     |     2 +
 src/test/rbd_mirror/CMakeLists.txt                 |    81 +
 .../image_replayer/test_mock_BootstrapRequest.cc   |   578 +-
 src/test/rbd_mirror/test_ImageDeleter.cc           |    53 +-
 src/test/rbd_mirror/test_ImageReplayer.cc          |    97 +-
 src/test/rbd_mirror/test_mock_ImageReplayer.cc     |     1 -
 .../rbd_mirror/test_mock_ImageSyncThrottler.cc     |     1 -
 src/test/rbd_mirror/test_mock_fixture.h            |     6 +
 src/test/rgw/CMakeLists.txt                        |    62 +
 src/test/system/CMakeLists.txt                     |    57 +
 src/tools/Makefile-server.am                       |     6 +-
 src/tools/ceph_monstore_tool.cc                    |   204 +-
 src/tools/ceph_objectstore_tool.cc                 |    98 +-
 src/tools/crushtool.cc                             |     2 +-
 src/tools/osdmaptool.cc                            |     2 +-
 src/tools/rbd/action/BenchWrite.cc                 |    11 +-
 src/tools/rbd/action/Journal.cc                    |   104 +
 src/tools/rbd/action/Kernel.cc                     |    55 +-
 src/tools/rbd_mirror/ImageDeleter.cc               |    37 +-
 src/tools/rbd_mirror/ImageDeleter.h                |    21 +-
 src/tools/rbd_mirror/ImageReplayer.cc              |   247 +-
 src/tools/rbd_mirror/ImageReplayer.h               |    42 +-
 src/tools/rbd_mirror/Replayer.cc                   |     8 +-
 .../rbd_mirror/image_replayer/BootstrapRequest.cc  |   225 +-
 .../rbd_mirror/image_replayer/BootstrapRequest.h   |    97 +-
 .../image_replayer/OpenLocalImageRequest.cc        |     3 +
 .../image_replayer/ReplayStatusFormatter.cc        |    12 +-
 src/tools/rbd_nbd/rbd-nbd.cc                       |    17 +-
 src/tools/rebuild_mondb.cc                         |   388 +
 src/tools/rebuild_mondb.h                          |     9 +
 src/tracing/CMakeLists.txt                         |    40 +
 src/tracing/Makefile.am                            |     1 +
 systemd/Makefile.in                                |    25 +-
 systemd/ceph-disk at .service                         |     2 +-
 systemd/rbdmap.service                             |     3 +
 test-driver                                        |    15 +-
 941 files changed, 242166 insertions(+), 17740 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index 4352f3e..57b2e4d 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -17,6 +17,7 @@ Alan Grosskurth <code at alan.grosskurth.ca>
 Alan Somers <asomers at gmail.com>
 Albert Tu <albert.t at inwinstack.com>
 Alexander Chuzhoy <achuzhoy at redhat.com>
+Alexander Graf <agraf at suse.de>
 Alexandre Derumier <aderumier at odiso.com>
 Alexandre Marangone <alexandre.marangone at inktank.com>
 Alexandre Marangone <amarango at redhat.com>
@@ -35,6 +36,7 @@ Alphat-PC <AlphatPC at gmail.com>
 Anand Bhat <anand.bhat at sandisk.com>
 Andras Elso <elso.andras at gmail.com>
 Andreas Bluemle <andreas.bluemle at itxperts.de>
+Andreas Gerstmayr <andreas.gerstmayr at gmail.com>
 Andreas Peters <andreas.joachim.peters at cern.ch>
 Andre Noll <maan at systemlinux.org>
 Andrew Bartlett <abartlet at catalyst.net.nz>
@@ -44,6 +46,7 @@ Andrew Woodward <awoodward at mirantis.com>
 Andrey Kuznetsov <Andrey_Kuznetsov at epam.com>
 Andrey Stepachev <octo at yandex-team.ru>
 Andy Allan <andy at gravitystorm.co.uk>
+Anirudha Bose <ani07nov at gmail.com>
 Anis Ayari <ayari_anis at live.fr>
 Anthony Alba <ascanio.alba7 at gmail.com>
 Anton Aksola <anton.aksola at nebula.fi>
@@ -64,8 +67,8 @@ Benjamin Kerensa <bkerensa at gmail.com>
 Benoît Knecht <benoit.knecht at fsfe.org>
 Billy Olsen <billy.olsen at canonical.com>
 Bin Zheng <zhengbin.08747 at h3c.com>
-BJ Lougee <almightybeeij at gmail.com>
 Bjørnar Ness <bjornar.ness at gmail.com>
+BJ Lougee <almightybeeij at gmail.com>
 Blaine Gardner <blaine.gardner at hp.com>
 Bo Cai <cai.bo at h3c.com>
 Boris Ranto <branto at redhat.com>
@@ -125,6 +128,7 @@ Darrell Enns <darrell at darrellenns.com>
 David Anderson <dave at natulte.net>
 David Coles <dcoles at gaikai.com>
 David Disseldorp <ddiss at suse.de>
+David Galloway <dgallowa at redhat.com>
 David Moreau Simard <dmsimard at iweb.com>
 David Zafman <david.zafman at inktank.com>
 David Zafman <dzafman at redhat.com>
@@ -173,12 +177,12 @@ Florent Manens <florent at beezim.fr>
 Florian Coste <fcoste21 at gmail.com>
 Florian Haas <florian at hastexo.com>
 Florian Marsylle <florian.marsylle at hotmail.fr>
-Francois Deppierraz <francois at ctrlaltdel.ch>
 François Lafont <flafdivers at free.fr>
+Francois Deppierraz <francois at ctrlaltdel.ch>
 Frank Yu <flyxiaoyu at gmail.com>
 Fred Ar <ar.fred at yahoo.com>
-Gabriel Sentucq <perso at kazhord.fr>
 Gaël Fenet-Garde <gael.fenet.garde at gmail.com>
+Gabriel Sentucq <perso at kazhord.fr>
 Gary Lowell <gary.lowell at inktank.com>
 Gaurav Kumar Garg <garg.gaurav52 at gmail.com>
 George Ryall <george.ryall at stfc.ac.uk>
@@ -196,6 +200,7 @@ Haifeng Liu <haifeng at yahoo-inc.com>
 Hannes Reinecke <hare at suse.de>
 Hannu Valtonen <hannu.valtonen at ormod.com>
 Haomai Wang <haomai at xsky.com>
+Harald Klein <hari at vt100.at>
 Harpreet Dhillon <harpreet at ironsystems.com>
 Harry Harrington <git-harry at live.co.uk>
 Hazem Amara <hazem.amara at telecom-bretagne.eu>
@@ -219,8 +224,8 @@ Ira Cooper <ira at redhat.com>
 Ira Cooper <ira at samba.org>
 Ismael Serrano <ismael.serrano at gmail.com>
 Ivan Grcic <igrcic at gmail.com>
-Jacek J. Lakis <jacek.lakis at intel.com>
 Jacek J. Łakis <jacek.lakis at intel.com>
+Jacek J. Lakis <jacek.lakis at intel.com>
 James Liu <james.liu at ssi.samsung.com>
 James Page <james.page at ubuntu.com>
 James Ryan Cresawn <jrcresawn at gmail.com>
@@ -231,10 +236,13 @@ Jason Dillaman <dillaman at redhat.com>
 Javen Wu <javen.wu at xtaotech.com>
 Javier Guerra <javier at guerrag.com>
 Javier M. Mellid <jmunhoz at igalia.com>
+Jayashree Candadai <jayaajay at indiana.edu>
 Jean-Rémi Deveaux <jeanremi.deveaux at gmail.com>
 Jeff Epstein <jepst79 at gmail.com>
+Jeff Layton <jlayton at redhat.com>
 Jeffrey Lu <lzhng2000 at aliyun.com>
 Jeff Weber <jweber at cofront.net>
+Jelle vd Kooij <vdkooij.jelle at gmail.com>
 Jenkins Build Slave User <ceph-release-team at redhat.com>
 Jenkins Build Slave User <jenkins-build at trusty-huge--11a52675-9585-4db4-a514-798db40d6da2.localdomain>
 Jenkins Build Slave User <jenkins-build at trusty-huge--abdffd45-81df-4aa8-a769-e169993c7a0f.localdomain>
@@ -290,11 +298,11 @@ Kai Zhang <zakir.exe at gmail.com>
 Karel Striegel <karel.striegel at ipc.be>
 Karl Eichwalder <ke at suse.de>
 Karol Mroz <kmroz at suse.com>
+Kévin Caradant <kevin.caradant at gmail.com>
 Kefu Chai <kchai at redhat.com>
 Ken Dreyer <kdreyer at redhat.com>
 Ken Dreyer <ken.dreyer at inktank.com>
 Ketor Meng <d.ketor at gmail.com>
-Kévin Caradant <kevin.caradant at gmail.com>
 Kevin Cox <kevincox at kevincox.ca>
 Kevin Dalley <kevin at kelphead.org>
 Kevin Jones <k.j.jonez at gmail.com>
@@ -307,6 +315,7 @@ Kuan Kai Chiu <big.chiu at bigtera.com>
 Kun Huang <academicgareth at gmail.com>
 Kyle Bader <kyle.bader at dreamhost.com>
 Kyle Marsh <kyle.marsh at dreamhost.com>
+la-sguduru <SGuduru at walmartlabs.com>
 Laszlo Boszormenyi <gcs at debian.hu>
 Laurent Barbe <laurent at ksperis.com>
 Lee Revell <rlrevell at gmail.com>
@@ -359,6 +368,7 @@ Mike Lundy <mike at fluffypenguin.org>
 Mike Ryan <mike.ryan at inktank.com>
 Mike Shuey <shuey at purdue.edu>
 Milan Broz <mbroz at redhat.com>
+Min Chen <chenmin at xsky.com>
 Min Chen <minchen at ubuntukylin.com>
 MingXin Liu <mingxin.liu at kylin-cloud.com>
 Mingyue Zhao <zhao.mingyue at h3c.com>
@@ -412,9 +422,9 @@ Rahul Aggarwal <rahul.1aggarwal at gmail.com>
 Rajesh Nambiar <rajesh.n at msystechnologies.com>
 Raju Kurunkad <raju.kurunkad at sandisk.com>
 Ramana Raja <rraja at redhat.com>
+Rémi Buisson <remi.buisson at cdiscount.com>
 Ray Lv <xiangyulv at gmail.com>
 rca <bertosmailbox at gmail.com>
-Rémi Buisson <remi.buisson at cdiscount.com>
 Ren Huanwen <ren.huanwen at zte.com.cn>
 Ricardo Dias <rdias at suse.com>
 riccardo80 <riccardo80 at 29311d96-e01e-0410-9327-a35deaab8ce9>
@@ -433,6 +443,7 @@ Roland Mechler <rmechler at cisco.com>
 Roman Haritonov <reclosedev at gmail.com>
 Ron Allred <rallred at itrefined.com>
 Rongze Zhu <zrzhit at gmail.com>
+root <root at ceph-node1.homeoffice.wal-mart.com>
 root <root at phenom.dyweni.com>
 Ross Turk <ross.turk at inktank.com>
 Ross Turk <rturk at redhat.com>
@@ -441,6 +452,7 @@ Ruifeng Yang <yangruifeng.09209 at h3c.com>
 runsisi <runsisi at hust.edu.cn>
 Rust Shen <rustinpeace at 163.com>
 Rutger ter Borg <rutger at terborg.net>
+Sébastien Han <shan at redhat.com>
 Sage Weil <sage at inktank.com>
 Sage Weil <sweil at redhat.com>
 Sahid Orentino Ferdjaoui <sahid.ferdjaoui at cloudwatt.com>
@@ -455,7 +467,6 @@ Sarthak Munshi <sarthakmunshi at gmail.com>
 Scott A. Brandt <scott at cs.ucsc.edu>
 Scott Devoid <devoid at anl.gov>
 Sean Channel <pentabular at gmail.com>
-Sébastien Han <shan at redhat.com>
 Sebastien Ponce <sebastien.ponce at cern.ch>
 Sergey Arkhipov <nineseconds at yandex.ru>
 Shang Ding <dingshang2013 at 163.com>
@@ -471,6 +482,7 @@ Shylesh Kumar <shmohan at redhat.com>
 Siddharth Sharma <siddharth at redhat.com>
 Simone Gotti <simone.gotti at gmail.com>
 Simon Leinen <simon.leinen at switch.ch>
+SirishaGuduru <SGuduru at walmartlabs.com>
 Somnath Roy <somnath.roy at sandisk.com>
 Sondra.Menthers <sondra.menthers at dreamhost.com>
 Song Baisen <song.baisen at zte.com.cn>
@@ -515,6 +527,7 @@ Tom Callaway <spot at redhat.com>
 Tommi Virtanen <tv at inktank.com>
 topher <topher at 29311d96-e01e-0410-9327-a35deaab8ce9>
 Travis Rhoden <trhoden at redhat.com>
+tserlin <tserlin at redhat.com>
 Tyler Brekke <tbrekke at redhat.com>
 Tyler Brekke <tyler.brekke at inktank.com>
 Valentin Arshanes Thomas <valentin.arshanes.thomas at gmail.com>
@@ -528,6 +541,7 @@ Vicente Cheng <freeze.bilsted at gmail.com>
 Vikhyat Umrao <vumrao at redhat.com>
 Viktor Suprun <popsul1993 at gmail.com>
 Vitja Makarov <vitja.makarov at gmail.com>
+Vladislav Odintsov <odivlad at gmail.com>
 Volker Assmann <volker at twisted-nerve.de>
 VRan Liu <gliuwr at gmail.com>
 Vu Pham <vu at mellanox.com>
@@ -564,6 +578,7 @@ Xinze Chi <xinze at xksy.com>
 Xinze Chi <xinze at xsky.com>
 Xiong Yiliang <xiongyiliang at xunlei.com>
 Xuan Liu <liu.xuan at h3c.com>
+Yang Honggang <joseph.yang at xtaotech.com>
 Yan Jun <yan.jun8 at zte.com.cn>
 Yankun Li <liyankun at unitedstack.com>
 Yann Dupont <yann at objoo.org>
@@ -588,6 +603,7 @@ Zack Cerza <zack at redhat.com>
 Zengran Zhang <zhangzengran at h3c.com>
 Zeqiang Zhuang <zhuang.zeqiang at h3c.com>
 Zhang Huan <zhanghuan at ict.ac.cn>
+zhangweibing <zhangweibing at unitedstack.com>
 Zhao Junwang <zhjwpku at gmail.com>
 Zhe Zhang <zzxuanyuan at gmail.com>
 Zhicheng Wei <zhicheng at opensourceforge.net>
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..d6b3a26
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,367 @@
+cmake_minimum_required(VERSION 2.8.11)
+
+project(Ceph)
+set(VERSION 10.2.5)
+
+if (NOT (CMAKE_MAJOR_VERSION LESS 3))
+  # Tweak policies (this one disables "missing" dependency warning)
+  cmake_policy(SET CMP0046 OLD)
+endif(NOT (CMAKE_MAJOR_VERSION LESS 3))
+# we use LINK_PRIVATE keyword instead of PRIVATE, but do not specify the LINK_PUBLIC
+# for target_link_libraries() command when PUBLIC should be used instead, it's just
+# for backward compatibility with cmake 2.8.11.
+if (POLICY CMP0022)
+cmake_policy(SET CMP0022 OLD)
+endif (POLICY CMP0022)
+if (POLICY CMP0023)
+cmake_policy(SET CMP0023 OLD)
+endif (POLICY CMP0023)
+
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
+
+option(WITH_CCACHE "Build with ccache.")
+if(WITH_CCACHE)
+  find_program(CCACHE_FOUND ccache)
+  if(CCACHE_FOUND)
+    message(STATUS "Building with ccache: ${CCACHE_FOUND}, CCACHE_DIR=$ENV{CCACHE_DIR}")
+    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+    # ccache does not accelerate link (ld), but let it handle it. by passing it
+    # along with cc to python's distutils, we are able to workaround
+    # https://bugs.python.org/issue8027.
+    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
+  else(CCACHE_FOUND)
+    message(FATAL_ERROR "Can't find ccache. Is it installed?")
+  endif(CCACHE_FOUND)
+endif(WITH_CCACHE)
+
+include_directories(
+  ${PROJECT_BINARY_DIR}/src/include
+  ${OFED_PREFIX}/include
+  ${LEVELDB_PREFIX}/include
+  ${PROJECT_SOURCE_DIR}/src
+)
+
+link_directories(
+  ${OFED_PREFIX}/lib
+  ${LEVELDB_PREFIX}/lib
+)
+
+#put all the libs and binaries in one place
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+#Check Includes
+include(CheckIncludeFiles)
+include(CheckIncludeFileCXX)
+include(CheckFunctionExists)
+
+#put all the libs and binaries in one place
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+CHECK_FUNCTION_EXISTS(fallocate CEPH_HAVE_FALLOCATE)
+CHECK_FUNCTION_EXISTS(posix_fadvise HAVE_POSIX_FADVISE)
+CHECK_FUNCTION_EXISTS(posix_fallocate HAVE_POSIX_FALLOCATE)
+CHECK_FUNCTION_EXISTS(syncfs HAVE_SYS_SYNCFS)
+CHECK_FUNCTION_EXISTS(sync_file_range HAVE_SYNC_FILE_RANGE)
+CHECK_FUNCTION_EXISTS(mallinfo HAVE_MALLINFO)
+CHECK_FUNCTION_EXISTS(pwritev HAVE_PWRITEV)
+CHECK_INCLUDE_FILES("arpa/inet.h" HAVE_ARPA_INET_H)
+CHECK_INCLUDE_FILES("boost/random/discrete_distribution.hpp" HAVE_BOOST_RANDOM_DISCRETE_DISTRIBUTION)
+CHECK_INCLUDE_FILE_CXX("boost/asio/coroutine.hpp" HAVE_BOOST_ASIO_COROUTINE)
+CHECK_INCLUDE_FILES("dirent.h" HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES("dlfcn.h" HAVE_DLFCN_H)
+CHECK_INCLUDE_FILES("inttypes.h" HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES("linux/types.h" HAVE_LINUX_TYPES_H)
+CHECK_INCLUDE_FILES("memory.h" HAVE_MEMORY_H)
+CHECK_INCLUDE_FILES("ndir.h" HAVE_NDIR_H)
+CHECK_INCLUDE_FILES("netdb.h" HAVE_NETDB_H)
+CHECK_INCLUDE_FILES("netinet/in.h" HAVE_NETINET_IN_H)
+CHECK_INCLUDE_FILES("stdint.h" HAVE_STDINT_H)
+CHECK_INCLUDE_FILES("stdlib.h" HAVE_STDLIB_H)
+CHECK_INCLUDE_FILES("arpa/inet.h" HAVE_ARPA_INET_H)
+CHECK_INCLUDE_FILES("strings.h" HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES("string.h" HAVE_STRING_H)
+CHECK_INCLUDE_FILES("syslog.h" HAVE_SYSLOG_H)
+CHECK_INCLUDE_FILES("sys/dir.h" HAVE_SYS_DIR_H)
+CHECK_INCLUDE_FILES("sys/file.h" HAVE_SYS_FILE_H)
+CHECK_INCLUDE_FILES("sys/ioctl.h" HAVE_SYS_IOCTL_H)
+CHECK_INCLUDE_FILES("sys/mount.h" HAVE_SYS_MOUNT_H)
+CHECK_INCLUDE_FILES("sys/ndir.h" HAVE_SYS_NDIR_H)
+CHECK_INCLUDE_FILES("sys/param.h" HAVE_SYS_PARAM_H)
+CHECK_INCLUDE_FILES("sys/socket.h" HAVE_SYS_SOCKET_H)
+CHECK_INCLUDE_FILES("sys/statvfs.h" HAVE_SYS_STATVFS_H)
+CHECK_INCLUDE_FILES("sys/stat.h" HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILES("sys/time.h" HAVE_SYS_TIME_H)
+CHECK_INCLUDE_FILES("sys/types.h" HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILES("sys/vfs.h" HAVE_SYS_VFS_H)
+CHECK_INCLUDE_FILES("sys/wait.h" HAVE_SYS_WAIT_H)
+CHECK_INCLUDE_FILES("sys/xattr.h" HAVE_SYS_XATTR_H)
+CHECK_INCLUDE_FILES("unistd.h" HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES("utime.h" HAVE_UTIME_H)
+CHECK_INCLUDE_FILES("${CMAKE_SOURCE_DIR}/src/include/fiemap.h" HAVE_FIEMAP_H)
+CHECK_INCLUDE_FILES("fuse/fuse_lowlevel.h" HAVE_FUSE_LOWLEVEL_H)
+CHECK_INCLUDE_FILES("fuse/fuse.h" HAVE_FUSE_H)
+CHECK_INCLUDE_FILES("fcgi_config.h"  HAVE_FASTCGI_CONFIG_H)
+CHECK_INCLUDE_FILES("fastcgi.h" HAVE_FASTCGI_H)
+CHECK_INCLUDE_FILES("fcgiapp.h" FASTCGI_FASTCGI_APP_DIR)
+CHECK_INCLUDE_FILES("fcgimisc.h" HAVE_FASTCGI_MISC_H)
+CHECK_INCLUDE_FILES("fcgio.h" HAVE_FASTCGIO_H)
+CHECK_INCLUDE_FILES("fcgios.h" FASTCGI_FASTCGIOS_DIR)
+CHECK_INCLUDE_FILES("fcgi_stdio.h" HAVE_FASTCGI_STDIO_H)
+CHECK_INCLUDE_FILES("keyutils.h" HAVE_KEYUTILS_H)
+CHECK_INCLUDE_FILES("execinfo.h" HAVE_EXECINFO_H)
+
+include(CheckSymbolExists)
+CHECK_SYMBOL_EXISTS(__u8 "sys/types.h;linux/types.h" HAVE___U8)
+CHECK_SYMBOL_EXISTS(__u64 "sys/types.h;linux/types.h" HAVE___U64)
+CHECK_SYMBOL_EXISTS(__s64 "sys/types.h;linux/types.h" HAVE___S64)
+
+CHECK_SYMBOL_EXISTS(res_nquery "resolv.h" HAVE_RES_NQUERY)
+
+include(CheckCXXSourceCompiles)
+CHECK_CXX_SOURCE_COMPILES("
+  #include <string.h>
+  int main() { char x = *strerror_r(0, &x, sizeof(x)); return 0; }
+  " STRERROR_R_CHAR_P)
+
+set(CEPH_MAN_DIR "share/man" CACHE STRING "Install location for man pages (relative to prefix).")
+
+option(ENABLE_SHARED "build shared libraries" ON)
+if(${ENABLE_SHARED})
+ set(CEPH_SHARED SHARED)
+else(${ENABLE_SHARED})
+ set(CEPH_SHARED STATIC)
+endif(${ENABLE_SHARED})
+
+find_package(execinfo)
+
+find_package(udev REQUIRED)
+set(HAVE_UDEV ${UDEV_FOUND})
+
+option(WITH_AIO "AIO is here ON" ON)
+if(${WITH_AIO})
+find_package(aio REQUIRED)
+set(HAVE_LIBAIO ${AIO_FOUND})
+message(STATUS "${AIO_LIBS}")
+endif(${WITH_AIO})
+
+option(WITH_OPENLDAP "OPENLDAP is here" ON)
+if(${WITH_OPENLDAP})
+find_package(OpenLdap REQUIRED)
+set(HAVE_OPENLDAP ${OPENLDAP_FOUND})
+message(STATUS "${OPENLDAP_LIBS}")
+endif(${WITH_OPENLDAP})
+
+option(WITH_OPENSSL "OPENSSL is here" ON)
+if(${WITH_OPENSSL})
+find_package(OpenSSL REQUIRED)
+set(HAVE_OPENSSL ON)
+#message(STATUS "${OPENSSL_LIBRARIES}")
+else(${WITH_OPENSSL})
+set(HAVE_OPENSSL OFF)
+set(OPENSSL_LIBRARIES)
+endif(${WITH_OPENSSL})
+
+option(WITH_FUSE "Fuse is here" ON)
+if(${WITH_FUSE})
+find_package(fuse)
+set(HAVE_LIBFUSE ${FUSE_FOUND})
+CHECK_FUNCTION_EXISTS(fuse_getgroups HAVE_FUSE_GETGROUPS)
+endif(${WITH_FUSE})
+
+option(WITH_XFS "XFS is here" ON)
+if(${WITH_XFS})
+find_package(xfs)
+set(HAVE_XFS ${XFS_FOUND})
+endif(${WITH_XFS})
+
+option(WITH_SPDK "Enable SPDK" OFF)
+if(WITH_SPDK)
+  find_package(pciaccess REQUIRED)
+  find_package(dpdk REQUIRED)
+  set(HAVE_SPDK TRUE)
+endif(WITH_SPDK)
+
+find_package(blkid REQUIRED)
+set(HAVE_LIBBLKID ${BLKID_FOUND})
+
+# probably fuse etc need this -- how to check? XXX
+option(WITH_MDS "MDS is here" ON)
+
+# needs mds and? XXX
+option(WITH_CLIENT "Client is here" ON)
+option(WITH_LIBCEPHFS "libcephfs client library" ON)
+
+# key-value store
+option(WITH_KVS "Key value store is here" ON)
+
+# remote block storage
+option(WITH_RBD "Remote block storage is here" ON)
+
+option(WITH_LEVELDB "LevelDB is here" ON)
+if(${WITH_LEVELDB})
+find_package(leveldb REQUIRED)
+set(HAVE_LIBLEVELDB ${LEVELDB_FOUND})
+find_file(HAVE_LEVELDB_FILTER_POLICY filter_policy.h PATHS /usr/include/leveldb)
+endif(${WITH_LEVELDB})
+
+option(WITH_EXPAT "EXPAT is here" ON)
+if(${WITH_EXPAT})
+find_package(expat REQUIRED)
+set(HAVE_EXPAT ${EXPAT_FOUND})
+endif(${WITH_EXPAT})
+
+find_package(Cython REQUIRED)
+find_package(fcgi REQUIRED)
+
+find_package(atomic_ops REQUIRED)
+set(HAVE_ATOMIC_OPS ${ATOMIC_OPS_FOUND})
+message(STATUS "${ATOMIC_OPS_LIBRARIES}")
+
+option(WITH_GPERFTOOLS "gperftools is here" ON)
+if(${WITH_GPERFTOOLS})
+	find_package(gperftools)
+	set(HAVE_GPERFTOOLS ${GPERFTOOLS_FOUND})
+	if(${HAVE_GPERFTOOLS})
+		find_file(HAVE_GPERFTOOLS_HEAP_PROFILER_H heap-profiler.h PATHS /usr/include/gperftools)
+		find_file(HAVE_GPERFTOOLS_MALLOC_EXTENSION_H malloc_extension.h PATHS /usr/include/gperftools)
+		find_file(HAVE_GPERFTOOLS_PROFILER_H profiler.h PATHS /usr/include/gperftools)
+	endif(${HAVE_GPERFTOOLS})
+endif(${WITH_GPERFTOOLS})
+
+find_package(snappy REQUIRED)
+
+#if allocator is set on command line make sure it matches below strings
+if(ALLOCATOR)
+  if(${ALLOCATOR} STREQUAL "tcmalloc")
+    find_package(tcmalloc REQUIRED)
+    set(HAVE_LIBTCMALLOC ${Tcmalloc_FOUND})
+  elseif(${ALLOCATOR} STREQUAL "jemalloc")
+    find_package(JeMalloc REQUIRED)
+  endif()
+else(ALLOCATOR)
+  find_package(tcmalloc)
+  set(HAVE_LIBTCMALLOC ${Tcmalloc_FOUND})
+  find_package(JeMalloc)
+  if(NOT Tcmalloc_FOUND AND NOT JEMALLOC_FOUND)
+    message(WARNING "tcmalloc and jemalloc not found, falling back to libc")
+    set(ALLOCATOR "libc")
+  endif(NOT Tcmalloc_FOUND AND NOT JEMALLOC_FOUND)
+endif(ALLOCATOR)
+
+find_package(keyutils REQUIRED)
+
+find_package(libuuid REQUIRED)
+
+find_package(libcurl REQUIRED)
+
+option(USE_CRYPTOPP "Cryptopp is ON" ON)
+find_package(cryptopp)
+if(CRYPTOPP_FOUND)
+        MESSAGE(STATUS "${CRYPTOPP_LIBRARIES}")
+        set(CRYPTO_LIBS ${CRYPTOPP_LIBRARIES})
+	set(USE_NSS 0)
+else()
+        MESSAGE(STATUS "Cryptopp not found using NSS instead")
+	find_package(NSS REQUIRED)
+        if(NSS_FOUND)
+		set(USE_NSS 1)
+		set(USE_CRYPTOPP 0)
+		find_package(NSPR)
+		if(NSPR_FOUND)
+			set(CRYPTO_LIBS ${NSS_LIBRARIES} ${NSPR_LIBRARIES})
+			#MESSAGE(STATUS "${CRYPTO_LIBS}")
+			#MESSAGE(STATUS "${NSS_INCLUDE_DIR} ${NSPR_INCLUDE_DIR}")
+		endif(NSPR_FOUND)
+	endif(NSS_FOUND)
+endif(CRYPTOPP_FOUND)
+
+option(WITH_XIO "Enable XIO messaging" OFF)
+if(WITH_XIO)
+  find_package(xio REQUIRED)
+set(HAVE_XIO ${Xio_FOUND})
+endif(WITH_XIO)
+
+#option for RGW
+option(WITH_RADOSGW "Rados Gateway is enabled" ON)
+
+#option for CephFS
+option(WITH_CEPHFS "CephFS is enabled" ON)
+
+option(WITH_THREAD_SAFE_RES_QUERY "res_query is thread safe" OFF)
+if(WITH_THREAD_SAFE_RES_QUERY)
+    set(HAVE_THREAD_SAFE_RES_QUERY 1 CACHE INTERNAL "Thread safe res_query supported.")
+endif(WITH_THREAD_SAFE_RES_QUERY)
+
+option(WITH_REENTRANT_STRSIGNAL "strsignal is reentrant" OFF)
+if(WITH_REENTRANT_STRSIGNAL)
+    set(HAVE_REENTRANT_STRSIGNAL 1 CACHE INTERNAL "Reentrant strsignal is supported.")
+endif(WITH_REENTRANT_STRSIGNAL)
+
+set(HAVE_LIBROCKSDB 1)
+
+# -lz link into kv
+find_package(ZLIB REQUIRED)
+
+#option for LTTng
+#currently off by default because lttng-gen-tp run unconditionally and forces a rebuild
+option(WITH_LTTNG "LTTng tracing is enabled" OFF)
+if(${WITH_LTTNG})
+  find_package(lttng-ust)
+  set(WITH_LTTNG ${LTTNG_FOUND})
+endif(${WITH_LTTNG})
+
+#option for Babeltrace
+option(HAVE_BABELTRACE "Babeltrace libraries are enabled" ON)
+if(${HAVE_BABELTRACE})
+  find_package(babeltrace REQUIRED)
+  set(WITH_BABELTRACE ${BABELTRACE_FOUND})
+  set(HAVE_BABELTRACE_BABELTRACE_H ${BABELTRACE_FOUND})
+  set(HAVE_BABELTRACE_CTF_EVENTS_H ${BABELTRACE_FOUND})
+endif(${HAVE_BABELTRACE})
+
+# Now create a useable config.h
+configure_file(
+  ${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake
+  ${PROJECT_BINARY_DIR}/include/acconfig.h
+)
+include_directories(${PROJECT_BINARY_DIR}/include)
+
+add_definitions(-D__linux__)
+
+if(${ENABLE_SHARED})
+  set(Boost_USE_STATIC_LIBS   OFF)
+else(${ENABLE_SHARED})
+  set(Boost_USE_STATIC_LIBS   ON)
+endif(${ENABLE_SHARED})
+
+set(Boost_USE_MULTITHREADED ON)
+find_package(Boost COMPONENTS thread system regex random program_options date_time iostreams REQUIRED)
+include_directories(${Boost_INCLUDE_DIRS})
+
+find_package(Threads REQUIRED)
+
+# find out which platform we are building on
+if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+  set(LINUX ON)
+  set(UNIX ON)
+  FIND_PACKAGE(Threads)
+endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
+
+# find out which platform we are building on
+if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+set(OperatingSystem "Mac OS X")
+endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
+
+# enables testing and creates Make check command
+enable_testing()
+set(CMAKE_CTEST_COMMAND ctest -V)
+add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+
+add_subdirectory(src)
+
+# man pages must be preprocessed, not supported yet
+#add_subdirectory(man)
diff --git a/ChangeLog b/ChangeLog
index 3ace453..4ef423a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,247 @@
-ecc2377 (HEAD, tag: v10.2.3, origin/jewel) 10.2.3
+c461ee1 (HEAD, tag: v10.2.5, origin/jewel) 10.2.5
+f7abffe msg/simple/Pipe: avoid returning 0 on poll timeout
+9411351 (tag: v10.2.4) 10.2.4
+d194db8 OSDMonitor: only reject MOSDBoot based on up_from if inst matches
+00de014 mon: MonmapMonitor: drop unnecessary 'goto' statements
+25f1b39 mon: MonmapMonitor: return success when monitor will be removed
+79be070 librados: remove new setxattr overload to avoid breaking the C++ ABI
+4d6f848 crush: condition latest tunable encoding on features
+bf96b30 crush/CrushWrapper: encode with features
+c5f5b94 crush/CrushWrapper: drop unused 'lean' encode() argument
+c66c556 osd/osd_types: encode pg_pool_t like hammer if features indicate hammer
+85caf34 osd/osd_types: conditional pg_pool_t encoding
+3cc29c6 os/filestore/HashIndex: fix list_by_hash_* termination on reaching end
+8b595f5 ceph-create-keys: add missing argument comma
+eea546f mon: expose require_jewel_osds flag to user
+f8ee076 mon/OSDMonitor: encode OSDMap::Incremental with same features as OSDMap
+1f629b2 mon/OSDMonitor: health warn if require_{jewel,kraken} flags aren't set
+34555f1 mon/OSDMonitor: encode canonical full osdmap based on osdmap flags
+eb30cc5 ceph-post-file: Ignore keys offered by ssh-agent
+43282b0 ceph-post-file: migrate to RSA SSH keys
+d48e603 msg: adjust byte_throttler from Message::encode
+1bc6161 msg/Message: fix set_middle vs throttler
+5d5b595 messages/MForward: reencode forwarded message if target has differing features
+e068c92 messages/MForward: fix encoding features
+158b003 all: add const to operator<< param
+3e1edde test/ceph_test_msgr: do not use Message::middle for holding transient data
+8f75bd6 test/ceph_test_msgr: fix circular locking dependency
+f960db4 ceph_test_msgr: use ceph log infrastructure to output
+39b8e78 rgw: fix put_acls for objects starting and ending with underscore
+779af22 qa: remove EnumerateObjects from librados upgrade tests
+4cb83c1 librbd: discard after write can result in assertion failure
+dc2ffda rgw: handle empty POST condition
+cd99a64 ceph-disk: allow using a regular file as a journal
+a800402 ceph-disk: PEP8ify
+e200b17 ceph-disk: Set space_symlink to the path, not file object
+9191825 ceph-disk: Use os.path.isabs instead of .startswith('/')
+f1c2de7 ceph-disk: Use context manager with FileLock
+26cb5b6 ceph-disk: Fix bug in FileLock
+91a9ca3 ceph-disk: Use true integer division in get_dev_size
+2373ccb ceph-disk: Compatibility fixes for Python 3
+79cf633 ceph-disk: change ownership of init file to ceph:ceph
+7964187 rgw: Do not archive metadata by default
+1eedf18 mon: fix missing osd metadata (again)
+f5e37ab journal: do not prematurely flag object recorder as closed
+2f9a5be Don't loop forever when reading data from 0 sized segment.
+4f9e02c test: TestJournalReplay test cases need to wait for committed journal event
+e8e1acb librbd: ignore cache busy errors when shrinking an image
+ba2e87e librbd: invalidate cache before trimming image
+d7c0873 rbd-nbd: mask out-of-bounds IO errors caused by image shrink
+0ce342d rbd-nbd: fix kernel deadlock during teuthology testing
+eb6c3cb rgw: set correct instance on the object
+084108e rgw: fix regression with handling double underscore
+f400ff2 tests: ceph-disk: force debug monc = 0
+25a35d4 doc: fill keyring with caps before passing it to ceph-monstore-tool
+73ea926 tools/ceph_monstore_tool: bail out if no caps found for a key
+4ebf87b tools/ceph_monstore_tool: update pgmap_meta also when rebuilding store.db
+d2deed6 tools/rebuild_mondb: kill compiling warning
+0970126 tools/rebuild_mondb: avoid unnecessary result code cast
+5191b06 doc: add rados/operations/disaster-recovery.rst
+8c8d5ce tools/ceph_monstore_tool: add "rebuild" command
+1fcb0bb tools/ceph-objectstore-tool: add "update-mon-db" command
+4167502 mon/AuthMonitor: make AuthMonitor::IncType public
+caf08d7 rgw: avoid corruption when running old radosgw-admin on a newer rgw
+e5f7854 rgw: Fix missing master zone for default region conversion
+ec2fb02 rgw: mark configuration as converted to avoid corruption when running older admins
+91bd342 AArch64: Detect crc32 extension support from assembler
+d205b74 tests: populate /dev/disk/by-partuuid for scsi_debug
+86eef27 Allow building RGW with LDAP disabled
+6575545 doc: Modification for "TEST S3 ACCESS" section
+50fd48f rgw:response information is error when geting token of swift account The header is X-Trans-Id instead of x-amz-request-id in the response header
+7423661 doc: Radosgw multitenancy config paramater change
+6356664 rgw: fix versioned object IO error
+40689d1 rgw: don't fail if lost race when setting acls
+5a53ffa rgw: remove user email index using helper function
+ad54bf9 rgw:user email can modify to empty
+4babd3f librbd: corrected use-after-free in ImageWatcher
+1ca4dc6 librbd: possible deadlock if cluster connection closed after image
+b73356b librbd: block name prefix might overflow fixed size C-string
+b410c8e librbd: potential deadlock closing image with in-flight readahead
+32d84e0 librbd: update_features should handle Infernalis OSDs
+b4e1380 cls/rbd: set_features should adjust the mask to known features
+dd93e00 rbd: cleanup - Proxied operations shouldn't result in error messages if replayed
+391936a librbd: enable/disable of features is not allowed when already enabled/disabled
+7d6801b rbd: restrict mirror enable/disable actions on parents/clones
+cf47628 rgw: Add documentation for RGW default quota
+2234815 rgw: Do not bother to check against conf values during quota handling
+0b8ecce rgw: Let the default quota settings take effect during user creation
+1c76ef4 journal: ensure in-flight ops are complete destroying journaler
+9bc5e44 journal: complete action only after notification completed
+7487332 qa/workunits: reduce amount of client IO for rbd-mirror stress
+d51a2f6 rbd-mirror: potential race allocating tag during shut down
+cea000c librbd: ignore attempts to request lock if already lock owner
+912ce37 journal: clean up object recorder closed/overflow callback
+310f3f7 journal: delay moving overflowed buffers until quiesced
+9f36143 journal: use reverse iterator search to find flush record
+21502d9 journal: avoid holding lock while sending journal append
+e0de824 rbd-mirror: wait for in-flight event commit notifications
+efa12f7 journal: fix AsyncOpTracker compiler error
+2460a3d common: move AsyncOpTracker to common library
+1748b38 librbd: support deleting image by id instead of name
+bb5f6b6 rbd-mirror: use pool id + global image id as deletion primary key
+96d551d rbd-mirror: concurrent access of event might result in heap corruption
+8070d6a rbd-mirror: test: Fixed timeout problem in rbd_mirror_stress.sh
+6ea4cde rbd: Fix race between journal flush and append events
+180a86b journal: make librados call async in ObjectRecorder
+5edbfe2 journal: increase concurrency of journal recorder
+9ad132e journal: send update notification when tag allocated
+f9aae06 librbd: new journal listener event for force promotion
+4f5ce86 librbd: helper class for quiescing in-flight async ops
+829ff8c librbd: unify journal event callbacks into single interface
+41cf3d9 journal: expose ability to retrieve partial tag list
+2f9e641 qa/workunits/rbd: fix remove mirrored image race conditions
+2ec5e93 qa/workunits/rbd: new mirroring forced promotion test
+5d1d898 test/rbd: fix possible mock journal race conditions
+775a999 qa/workunits/rbd: before removing image make sure it is not bootstrapped
+3bbd8ba librbd: fix journal create compilation error
+89c6618 test: fixed unused function warnings in unittest_rbd_mirror
+ca94f25 rbd-mirror: prevent syncing to non-primary image after failover
+7a43484 rbd-mirror: demote/promote in same cluster results in split-brain
+f8f3bbd librbd: normalize journal promotion/demotion events
+4baea6a librbd: block RPC requests when demoting the image
+8ccdad6 librbd: separate journal::TagData predecessor data into new struct
+13daaff rbd-mirror: include tag tid in bootstrap debug log messages
+d775680 qa/workunits/rbd: demote/promote image on same cluster
+f7ffbfa rbd-mirror: option to automatically resync after journal client disconnect
+0b40239 rbd-mirror: stop replay when client is disconnected
+80aa7e0 rbd-mirror: resync was possible only when image replayer start had succeeded
+170476e rbd-mirror: decode_client_meta should return false on error
+7382e1a rbd: new command to disconnect journal client
+d3ad2ff librbd: optionally flag "laggy" journal clients disconnected
+4056e36 journal: allow to trim journal for "laggy" clients
+3aec576 cls/journal: add async client_update_state method
+d66bb7a build: include more files in "make dist" tarball
+3bb2a9e librbd: ignore notify errors on missing image header
+5173563 client: properly set inode number of created inode in replay request
+2c4e1c1 mds: log path with CDir damage messages
+d52f190 mds: s/used_ions/used_inos/
+494687b rbd: expose rbd unmap options
+6b02267 rbd: fix up terminology in help texts
+071bd47 rbd: recognize lock_on_read option
+7d0714e doc: clarify rbd size units
+ca8fc6f ceph-create-keys: fix existing-but-different case
+0a17741 client: fix readdir vs fragmentation race
+3a79db1 mds: remove fail-safe queueing replay request
+10e603b client: fix segment fault in Client::_invalidate_kernel_dcache().
+3320da0 mds: catch duplicates in DamageTable
+5d0e2f8 common: only call crypto::init once per CephContext
+483d8c4 cephx: Fix multiple segfaults due to attempts to encrypt or decrypt an empty secret and a null CryptoKeyHandler
+5ae4f31 os/filestore/FileJournal: fail out if FileJournal is not block device or regular file
+c2d4239 mds: remove max_mds config option
+57f08fe mds: make mds_role_t member order match constructor
+c19326c mon: don't crash on invalid standby_for_fscid
+cbd9a39 messages: fix MMDSBeacon constructor
+cca589f init-radosgw: do not use systemd-run in sysvinit
+83a91ba rgw: forward input data when forwarding set_bucket_version to master
+0986aff rgw: set args when rebuilding req_info
+bb81f9d librbd: permit disabling journaling if in corrupt state
+b14d7f1 librbd: new journal policy to disable initializing the journal
+77ea511 doc/radosgw: fix description of response elements 'Part'
+1a7faefd rgw_file:  pre-assign times
+0c932b9 rgw_file: fix set_attrs operation
+0de3390 rgw_file: implement rgw_setattr
+00f3fbe rgw: remove duplicated calls to getattr
+c539928 rgw: rgw file fix bug of rgw_lookup can not exact match file name
+9f5c737 rgw: fix the wrong return value
+cf1353c rgw_file: restore local definition of RGWLibFS gc interval
+7a648ed rgw_file:  explain semantics of RGWFileHandle::commit
+0135da7 ceph_timer: prefer using directive to typedef
+2a9233f librgw: add API version defines for librgw and rgw_file
+2d6966f rgw file: allow RGWLibFS::write_completion_interval_s to be set in conf
+7071845 rgw_file:  log on write completion events at level 10
+95310c7 rgw_file: add RGW_OPEN_FLAG_STATELESS as a synonym for V3
+697d4ef rgw_file: implement stateless write completion timer
+4a31509 rgw_file: fix/update rgw_create flag arguments
+73f9a0b rgw_file: fix/update rgw_open flag arguments
+4ceb70e rgw file: remove busy-wait in RGWLibFS::gc()
+8e1515b rgw_file: unlock() must precede out label
+88eeaa9 rgw nfs: fix write continuations
+f0b1799 rgw nfs: don't leak fh->mtx in lookup_handle()
+f16ac90 rgw file: refuse to rename directories
+23b749f rgw_file: refuse ops on deleted targets
+345de45 rgw_file: implement rgw_setattr
+88b5027 rgw_file: refuse partial, out-of-order writes
+be24369 rgw_file: fix rename cases and unify unlink
+a10d700 add ldap auth custom search filter feature patch - http://tracker.ceph.com/issues/17185
+7486638 rgw ldap:  protect rgw::from_base64 from non-base64 input
+68788fb rgw ldap: enforce simple_bind w/LDAPv3
+871caeb rgw: add reinit/rebind logic (ldap)
+de0c4e1 rgw: RGWDataSyncCR fails on errors from RGWListBucketIndexesCR
+8833c64 PG: block writes and scan log for scrub using inclusive upper bound
+0e2338e osd_types,PG: force the map used in _scrub to be sorted correctly
+16f9d95 src/osd: relax the requirement that we scrub a whole hash value
+2176c84 hobject: clarify is_snap and has_snapset for max
+35660d1 mon: OSDMonitor: Missing nearfull flag set
+3cb0a5e ceph-objectstore-tool: add a way to split filestore directories offline
+de672a0 logrotate: Run as root/ceph
+9cb45e1 log: Log.cc: Assign LOG_INFO priority to syslog calls
+165e5ab librados: modify Pipe::connect() to return the error code
+5ab5e82 doc: fix description for rsize and rasize
+ecc2377 (tag: v10.2.3) 10.2.3
+c94244d Add Install section to systemd rbdmap.service file
+e2ce857 Add two options to radosgw-admin.rst manpage
+4e66f9e radosgw-admin: add "--orphan-stale-secs" to --help
+bfa90a1 doc: add "--orphan-stale-secs" to radosgw-admin(8)
+cefd6f5 rgw: fix collection of object sync errors
+aa36981 rgw: fix marker tracker completion handling
+bce19a3 rgw: collect() stops if error encoutered
+f82b593 rgw: back off bucket sync on failures, don't store marker
+f337a07 krbd: don't segfault if images are unmapped concurrently
+2399d4a qa: rbd/simple_big.sh: drop extraneous sudo
+472cb29 qa: rbd/concurrent.sh: suppress rbd map output
+667d42a qa: rbd: don't modprobe, chown sysfs files or udevadm settle
+866c3e5 qa: rbd/map-snapshot-io.sh: don't chown sysfs files
+cf211d7 client: fix shutdown with open inodes
+1bc047b client: add missing client_lock for get_root
+086f6e0 rgw: fix upgrade from old multisite to new multisite configuration
+23d73dc rgw: delete region map after upgrade to zonegroup map
+27626ba rgw_file: restore local definition of RGWLibFS gc interval
+91b65e7 rgw file: remove busy-wait in RGWLibFS::gc()
+e72e7a2 qa/workunits: support filtering cls_rbd unit test cases
+a25a483 ReplicatedPG: call op_applied for submit_log_entries based repops
+5ef9085 Cleanup: delete find_best_info again
+dea93dc ceph-disk: do not activate device that is not ready
+58b7c52 PG: use upset rather than up for _update_calc_stats
+4e2b491 PG: introduce and maintain upset
+c0db9fb ceph: don't fudge the ctime in stat() unless it's really older than the mtime
+66cd43b client: only skip querying the MDS in _lookup when we have the necessary caps
+fb4a939 client: plumb a mask argument into _lookup
+b5cbd57 client: add mask parameter to _do_lookup
+416ec6f rgw: fix radosgw daemon core when reopen logs
+f034fd0 rgw: fix period update --commit return error
+457d78f rgw: adjust manifest head object
+77e497d rgw: adjust objs when copying obj with explicit_objs set
+c1250ee rgw: patch manifest to handle explicit objs copy issue
+2311ab2 ObjectCacher: fix last_write check in bh_write_adjacencies()
+c3c2910 rpm: proper packaging of udev directories
+7d92e2e crush: When consider rule size use the correct method.
+c2cf21d mon/PGMonitor: calc the %USED of pool using used/(used+avail)
+109da6f mon/PGMonitor: mark dump_object_stat_sum() as static
+bd63666 librbd: fix possible inconsistent state when disabling mirroring
+117aa35 common: instantiate strict_si_cast<long> not strict_si_cast<int64_t>
+d93eda8 common: add int64_t template for strict_si_cast()
+f7cd284 common/config: cast OPT_U32 options using uint32_t
+518883d Revert "common: add int64_t template for strict_si_cast()"
 577336e mds: fix double-unlock on shutdown
 21da103 rgw: collect skips a specific coroutine stack
 98779c3 rgw: fix compilation
@@ -18,6 +261,7 @@ ac557e0 rgw: data sync debug logging
 ecea6dc librbd: delay acquiring exclusive lock if watch has failed
 49a39eb librbd: convert ImageWatcher class to template
 f4fb598 build/ops: bump rocksdb submodule
+29a8701 ceph-osd-prestart.sh: check existence of OSD data directory
 1cbc839 osd: set objecter.osdmap when starts
 4d37cfb mon/MonClient: should update sub_sent with sub_new
 5498377 librbd: cache was not switching to writeback after first flush
@@ -42,11 +286,14 @@ d0c0c2f librbd: discard hangs when 'rbd_skip_partial_discard' is enabled
 5bf4398 librbd: object_may_exist always return true when you write an empty object
 6786106 librbd: ensure that AIO ops are started prior to request
 47279f8 librbd: helper method for creating and starting AioCompletions
+80e25b0 rbd: bench io-size should not be larger than image size
+f7d23d5 LTTng-UST disabled for openSUSE
 d336735 rbd-mirror: potential assertion failure during error-induced shutdown
 d1e0512 rbd-mirror: potential race condition during failure shutdown
 48ee3aa rbd-mirror: replaying state should include flush action
 e098fb1 doc: added rbdmap man page to RBD restructured index
 b7793d7 rbdmap: specify bash shell interpreter
+e6ac214 librbd: request exclusive lock if current owner cannot execute op
 92d7882 rbd-mirror: remove ceph_test_rbd_mirror_image_replay test case
 0d9d573 qa/workunits/rbd: override rbd-mirror integration test poll frequency
 96cdb11 rbd-mirror: do not cancel maintenance ops with missing finish events
@@ -82,7 +329,12 @@ b88a851 rbd-mirror: image deleter should use provided librados connection
 f298643 rgw: ONLY improve code formatting in rgw_object_expirer_core.{cc,h}.
 e7be5a5 rgw: fix skipping some objects to delete by RadosGW's object expirer.
 af7e1e0 rgw: fix trimming object expirer's hints.
+0b93a9a fast dispatch heartbeat message
 dc154cd osd: fix the mem leak of RepGather
+0dcefd2 mon/osdmonitor: fix incorrect output of "osd df" due to osd out
+ac27352 mon/osdmonitor: initialize local variable "kb_avail_i"
+430ab1b ceph-disk: timeout ceph-disk to avoid blocking forever
+0b30a1d mon/osdmonitor: decouple adjust_heartbeat_grace and min_down_reporters
 96ad2d1 rgw: can set negative max_buckets on RGWUserInfo
 dbf8cf0 rgw: improve support for Swift's object versioning.
 5ffdc34 doc: format 2 now is the default image format
@@ -121,16 +373,21 @@ ce986aa rgw: RGWMetaSyncCR holds refs to stacks for wakeup
 2485efc rgw: clear realm watch on failed watch_restart
 fa2e42d rgw: use endpoints from master zone instead of zonegroup
 a865f26 radosgw-admin: zone[group] modify can change realm id
+92581a3 rgw: fix marker tracker completion handling
+fb36dd0 rgw: fix potential memory leaks in RGWPutCORS_ObjStore_S3::get_params
 f5db5a4 mon: tolerate missing osd metadata
 36e5c86 mon: fix metadata dumps for empty lists
 de99bd5 mon: 'std::move` Metadata when updating it
 828df39 mon: fix 'mon metadata' for lone monitors
 308f514 ceph.spec.in: fix rpm package building error as follows:
 727a704 udev: always populate /dev/disk/by-parttypeuuid
+775c78d librbd: prevent creation of v2 image ids that are too large
+2b27212 librbd: prevent creation of clone from non-primary mirrored image
 9fc5b41 librbd: optimize away unnecessary object map updates
 81a2534 rbd-replay: decode and replay discard IO operations
 5968664 librbd: failed assertion after shrinking a clone image twice
 8316b6a rbd-mirror: gracefully fail if object map is unavailable
+18a66cb librbd: journal::Replay no longer holds lock while completing callback
 5ae0e43 subman: use replace instead of format
 0ca2772 cmake: script that sets env vars for unit tests
 0ff0960 ExclusiveArch for suse_version
@@ -173,6 +430,7 @@ fe57ace rgw ldap: fix ldap bindpw parsing
 8cd7f44 rgw: aws4: add STREAMING-AWS4-HMAC-SHA256-PAYLOAD support
 276ec72 rgw: use std::unique_ptr for rgw_aws4_auth management.
 2c422e3 rgw: add handling of memory allocation failure in AWS4 auth.
+79e2acb crush: reset bucket->h.items[i] when removing tree item
 2cd3ed8 ceph_volume_client: allow read-only authorization for volumes
 46246e3 osd: increment stas on recovery pull also
 3da251f pybind/ceph_argparse: handle non ascii unicode args
@@ -220,6 +478,7 @@ c34dbd4 rgw: data sync squash, prioritize object removal
 9591e50 rgw: dont need atomic RGWRados::next_rados_handle
 047379c rgw: remove unneeded RGWRados::num_rados_handles
 7848482 rgw: use vector for librados handles
+d94e5bc common: fix value of CINIT_FLAG_DEFER_DROP_PRIVILEGES
 2c39d36 rgw: Add documentation for the Multi-tenancy feature
 9e5a3ae RGW:add socket backlog setting for via ceph.conf http://tracker.ceph.com/issues/16406
 aa39361 mds: disallow 'open truncate' non-regular inode
@@ -232,6 +491,7 @@ a7987f0 MDSMonitor.cc: fix mdsmap.<namespace> subscriptions
 d244b7a mds: add maximum fragment size constraint
 64d99b1 mds: fix Session::check_access()
 bce5646 client: skip executing async invalidates while umounting
+54b6b5e client: kill QuotaTree
 fd7ff96 ceph-fuse: add option to disable kernel pagecache
 3f76e4a rgw: finish error_repo cr in stop_spawned_services()
 a5f5513 test: fix CMake build of ceph_test_objectcacher_stress
@@ -284,9 +544,11 @@ b751d48 librbd: flag image as updated after proxying maintenance op
 a34b227 xio: add MNop.h to dist tarball
 393bf7e rgw: check for -ERR_NOT_MODIFIED in rgw_rest_s3.cc
 6b41d76 TaskFinisher: cancel all tasks wait until finisher done
+47605a2 msg/msg_types: update sockaddr, sockaddr_storage accessors
 762db30 rgw: support size suffixes for --max-size in radosgw-admin command
 e3a99c0 common: add int64_t template for strict_si_cast()
 f8e4911 rados: Add cleanup message with time to rados bench output
+d5c77c8 osd: add peer_addr in heartbeat_check log message
 8b82bb8 qa/workunits/rbd: respect RBD_CREATE_ARGS environment variable
 9415d38 rados: Improve list-inconsistent json format
 2fd6e7c test: Fix test to not use jq -S which isn't avail in all distributions
@@ -470,6 +732,7 @@ e9f9916 rgw: add missing metadata_heap pool to old zones
 2266287 mds: wrongly treat symlink inode as normal file/dir when symlink inode is stale on kcephfs
 be9e85d tests: rm -fr /tmp/*virtualenv*
 0bdc8fd rgw : cleanup radosgw-admin temp command as it was deprecated and also implementation code for this command was removed in commit 8d7c8828b02c46e119adc4b9e8f655551512fc2d
+5ffee35 mon : Display full flag in ceph status if full flag is set
 8fbb555 cls_journal: Select min commit position for new clients
 576ff0c cls_journal: remove duplicated key generation
 fae360f rgw: fix manager selection when APIs customized
@@ -5133,7 +5396,7 @@ b48f3d7 rgw: fix wrong length in Content-Range HTTP header of Swift's DLO.
 94be452 rgw: refactor arrangement of parameters for rgw_read_user_buckets().
 58addda rgw: add support for "end_marker" on listing Swift account.
 1b6a7e3 doc: note that cephfs auth stuff is new in jewel
-2c7c712 tests: osd-scrub-snaps.sh to display full osd logs on error
+2c7c7129 tests: osd-scrub-snaps.sh to display full osd logs on error
 71690e7 rbd: add --object-size option
 a69367d ceph-mds:add --help/-h
 07c334a doc:file must be empty when writing layout fields of file use "setfattr"
@@ -5208,7 +5471,7 @@ c3524d7 librados: new style pgls
 3ee7731 osd: set handle to start of next PG on pgnls end of pg
 fc8ea3f osd/osd_types: add pg_t::get_hobj_{start,end} methods
 91f01bd librbd: partial revert of commit 9b0e359
-4e15c03 pybind/rbd.pyx: Return something useful from str() and repr()
+4e15c0399 pybind/rbd.pyx: Return something useful from str() and repr()
 6e7f9c8 doc/dev/index.rst: start writing Bugfixing chapter
 b328131 cmake: add rgw_basic_types.cc to librgw.a
 002d26b doc/dev/index.rst: rewrite introductory material
@@ -12935,7 +13198,7 @@ ca10ce4 Add one more case ( "=" ) and test get_str_vec as well. Signed-off-by: Y
 1858f06 Crush: Ensuring at most num-rep osds are selected
 01e389a Crush: Ensuring at most num-rep osds are selected
 f1becf9 qa: ceph tell must retry on ENXIO
-234b066 Crush: Ensuring at most num-rep osds are selected
+234b066b Crush: Ensuring at most num-rep osds are selected
 5c6c366 debian/control: fix python-ceph -> ceph file move to allow upgrades
 35fd272 messages: provide an explicit COMPAT_VERSION in MMDSBeacon
 177a33b MemStore: Need set/get_allow_sharded_objects() to work for ceph_objectstore_tool
@@ -23016,7 +23279,7 @@ dd855b3 monmaptool.cc: use empty() instead of size() to check for emptiness
 6f0175e OSDMonitor.cc: use !empty() instead of size()
 8fcd31f Monitor.cc: use empty() instead of size()
 f7078b4 MonCaps.cc: use !empty() instead of size()
-d7705ed OSDMonitor.h: use !reporters.empty() instead of size()
+d7705edf OSDMonitor.h: use !reporters.empty() instead of size()
 180cae5 AuthMonitor.cc: use !pending_auth.empty() instead of 'size() > 0'
 6b8458d CInode.h: use !old_inodes.empty() instead of size()
 a3970e5 CephxProtocol.h: pass CryptoKey by reference to decode_decrypt()
@@ -39977,7 +40240,7 @@ a418ff1 kclient: mark debug vars __read_mostly
 058b9ea initscript: --btrfs flag
 cfb33b7 mds: flush journal on truncate if readers/writers are waiting
 7846f51 kclient: include ceph_ver.h in kernel patch series, package
-1b6450b kclient: remove /sys/fs/ceph when doing cleanup
+1b6450b2 kclient: remove /sys/fs/ceph when doing cleanup
 2727657 mds: logger typo
 97ec829 cosd: fixes
 7762ea9 mkcephfs: bit more verbose
@@ -40419,7 +40682,7 @@ d7ecf25 mds: end of traverse may be indoe or projected_inode
 698400c kclient: use CEPH_INO_ROOT constant
 b2d23ad mds: include projected dn+inode to client if xlock_done
 b0f2842 mds: fix LOCK_LOCK -> LOCK_LOCK_SYNC issue_lease transition logic
-5e9be53 mds: allow FileLock wrlock when client holding FILE_EXCL
+5e9be53f mds: allow FileLock wrlock when client holding FILE_EXCL
 c7c72b4 mds: issue cap on mkdir; set authlock to EXCL on open O_CREAT.
 ddb07d9 mds: fix encode_inode caps issue logic
 94f28a9 mds: loner if only client with cap on a dir
diff --git a/Makefile.am b/Makefile.am
index a7f0e3e..e742861 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,6 +5,8 @@ EXTRA_DIST = autogen.sh ceph.spec.in ceph.spec install-deps.sh
 SUBDIRS = . src man doc systemd selinux
 
 EXTRA_DIST += \
+	CMakeLists.txt \
+	qa \
 	src/test/run-cli-tests \
 	src/test/run-cli-tests-maybe-unset-ccache \
 	src/test/cli \
@@ -18,8 +20,8 @@ EXTRA_DIST += \
 	udev/60-ceph-by-parttypeuuid.rules \
 	udev/95-ceph-osd.rules \
 	share/known_hosts_drop.ceph.com \
-	share/id_dsa_drop.ceph.com \
-	share/id_dsa_drop.ceph.com.pub
+	share/id_rsa_drop.ceph.com \
+	share/id_rsa_drop.ceph.com.pub
 
 NPROC = nproc
 if FREEBSD
@@ -30,8 +32,8 @@ endif
 install-data-local::
 	-mkdir -p $(DESTDIR)$(datadir)/ceph
 	-install -m 600 share/known_hosts_drop.ceph.com $(DESTDIR)$(datadir)/ceph/known_hosts_drop.ceph.com
-	-install -m 600 share/id_dsa_drop.ceph.com $(DESTDIR)$(datadir)/ceph/id_dsa_drop.ceph.com
-	-install -m 600 share/id_dsa_drop.ceph.com.pub $(DESTDIR)$(datadir)/ceph/id_dsa_drop.ceph.com.pub
+	-install -m 600 share/id_rsa_drop.ceph.com $(DESTDIR)$(datadir)/ceph/id_rsa_drop.ceph.com
+	-install -m 600 share/id_rsa_drop.ceph.com.pub $(DESTDIR)$(datadir)/ceph/id_rsa_drop.ceph.com.pub
 
 all-local::
 if WITH_DEBUG
diff --git a/Makefile.in b/Makefile.in
index 94fa726..601448d 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,7 +14,17 @@
 
 @SET_MAKE@
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -79,11 +89,6 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = .
-DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
-	$(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(top_srcdir)/configure $(am__configure_deps) \
-	$(srcdir)/ceph.spec.in test-driver COPYING ar-lib compile \
-	config.guess config.sub install-sh missing ltmain.sh
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/ac_prog_jar.m4 \
@@ -102,6 +107,8 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
@@ -367,6 +374,10 @@ TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
 	$(TEST_LOG_FLAGS)
 DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/ceph.spec.in AUTHORS \
+	COPYING ChangeLog INSTALL NEWS README ar-lib compile \
+	config.guess config.sub install-sh ltmain.sh missing \
+	test-driver
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -414,7 +425,6 @@ AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -500,6 +510,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -598,6 +609,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -615,7 +627,7 @@ top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = gnu
 ACLOCAL_AMFLAGS = -I m4
 EXTRA_DIST = autogen.sh ceph.spec.in ceph.spec install-deps.sh \
-	src/test/run-cli-tests \
+	CMakeLists.txt qa src/test/run-cli-tests \
 	src/test/run-cli-tests-maybe-unset-ccache src/test/cli \
 	src/test/downloads systemd/ceph.tmpfiles.d etc/default/ceph \
 	etc/sysconfig/ceph \
@@ -623,7 +635,7 @@ EXTRA_DIST = autogen.sh ceph.spec.in ceph.spec install-deps.sh \
 	etc/sysconfig/SuSEfirewall2.d/services/ceph-osd-mds \
 	udev/50-rbd.rules udev/60-ceph-by-parttypeuuid.rules \
 	udev/95-ceph-osd.rules share/known_hosts_drop.ceph.com \
-	share/id_dsa_drop.ceph.com share/id_dsa_drop.ceph.com.pub
+	share/id_rsa_drop.ceph.com share/id_rsa_drop.ceph.com.pub
 # the "." here makes sure check-local builds gtest and gmock before they are used
 SUBDIRS = . src man doc systemd selinux
 NPROC = nproc
@@ -651,7 +663,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --gnu Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -818,7 +829,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1035,15 +1046,15 @@ dist-xz: distdir
 	$(am__post_remove_distdir)
 
 dist-tarZ: distdir
-	@echo WARNING: "Support for shar distribution archives is" \
-	               "deprecated." >&2
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__post_remove_distdir)
 
 dist-shar: distdir
-	@echo WARNING: "Support for distribution archives compressed with" \
-		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
@@ -1079,17 +1090,17 @@ distcheck: dist
 	esac
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_inst
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
 	chmod a-w $(distdir)
 	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
 	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	    --srcdir=.. --prefix="$$dc_install_base" \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -1272,14 +1283,16 @@ uninstall-am:
 	mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 @FREEBSD_TRUE@	NPROC = sysctl -n hw.ncpu
 
 # why is it so hard to make autotools to this?
 install-data-local::
 	-mkdir -p $(DESTDIR)$(datadir)/ceph
 	-install -m 600 share/known_hosts_drop.ceph.com $(DESTDIR)$(datadir)/ceph/known_hosts_drop.ceph.com
-	-install -m 600 share/id_dsa_drop.ceph.com $(DESTDIR)$(datadir)/ceph/id_dsa_drop.ceph.com
-	-install -m 600 share/id_dsa_drop.ceph.com.pub $(DESTDIR)$(datadir)/ceph/id_dsa_drop.ceph.com.pub
+	-install -m 600 share/id_rsa_drop.ceph.com $(DESTDIR)$(datadir)/ceph/id_rsa_drop.ceph.com
+	-install -m 600 share/id_rsa_drop.ceph.com.pub $(DESTDIR)$(datadir)/ceph/id_rsa_drop.ceph.com.pub
 
 all-local::
 #	We need gtest to build the rados-api tests. We only build those in
diff --git a/aclocal.m4 b/aclocal.m4
index da19afc..aa640de 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.14'
+[am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.14.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,12 +51,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.14.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -118,7 +118,7 @@ AC_SUBST([AR])dnl
 
 # Figure out how to run the assembler.                      -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -138,7 +138,7 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -183,15 +183,14 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_COND_IF                                            -*- Autoconf -*-
 
-# Copyright (C) 2008-2013 Free Software Foundation, Inc.
+# Copyright (C) 2008-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -228,7 +227,7 @@ fi[]dnl
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -259,7 +258,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -450,7 +449,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -526,7 +525,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -616,8 +615,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -690,7 +689,11 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
@@ -719,7 +722,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -730,7 +733,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -740,7 +743,7 @@ if test x"${install_sh}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -761,7 +764,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -811,7 +814,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -850,7 +853,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -879,7 +882,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -926,7 +929,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1161,7 +1164,7 @@ for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
 sys.exit(sys.hexversion < minverhex)"
   AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1180,7 +1183,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1261,7 +1264,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1321,7 +1324,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1349,7 +1352,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1368,7 +1371,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/ar-lib b/ar-lib
index fe2301e..463b9ec 100755
--- a/ar-lib
+++ b/ar-lib
@@ -4,7 +4,7 @@
 me=ar-lib
 scriptversion=2012-03-01.08; # UTC
 
-# Copyright (C) 2010-2013 Free Software Foundation, Inc.
+# Copyright (C) 2010-2014 Free Software Foundation, Inc.
 # Written by Peter Rosin <peda at lysator.liu.se>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/ceph.spec b/ceph.spec
index fa3a932..5337023 100644
--- a/ceph.spec
+++ b/ceph.spec
@@ -33,10 +33,12 @@
 %bcond_with selinux
 %endif
 
-# LTTng-UST enabled on Fedora, RHEL 6+, and SLES 12
-%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version} == 1315
+# LTTng-UST enabled on Fedora, RHEL 6+, and SLE (not openSUSE)
+%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version}
+%if ! 0%{?is_opensuse}
 %bcond_without lttng
 %endif
+%endif
 
 %if %{with selinux}
 # get selinux policy version
@@ -54,7 +56,7 @@
 # common
 #################################################################################
 Name:		ceph
-Version:	10.2.3
+Version:	10.2.5
 Release:	0%{?dist}
 Epoch:		1
 Summary:	User space components of the Ceph file system
@@ -116,6 +118,7 @@ BuildRequires:	python-requests
 BuildRequires:	python-sphinx
 BuildRequires:	python-virtualenv
 BuildRequires:	snappy-devel
+BuildRequires:	udev
 BuildRequires:	util-linux
 BuildRequires:	valgrind-devel
 BuildRequires:	xfsprogs
@@ -878,8 +881,8 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_mandir}/man8/rbd-replay-prep.8*
 %dir %{_datadir}/ceph/
 %{_datadir}/ceph/known_hosts_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com.pub
+%{_datadir}/ceph/id_rsa_drop.ceph.com
+%{_datadir}/ceph/id_rsa_drop.ceph.com.pub
 %dir %{_sysconfdir}/ceph/
 %config %{_sysconfdir}/bash_completion.d/rados
 %config %{_sysconfdir}/bash_completion.d/rbd
@@ -887,6 +890,7 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_unitdir}/rbdmap.service
 %{python_sitelib}/ceph_argparse.py*
 %{python_sitelib}/ceph_daemon.py*
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/50-rbd.rules
 %attr(3770,ceph,ceph) %dir %{_localstatedir}/log/ceph/
 %attr(750,ceph,ceph) %dir %{_localstatedir}/lib/ceph/
@@ -1156,6 +1160,7 @@ fi
 %{_sbindir}/ceph-disk
 %{_sbindir}/ceph-disk-udev
 %{_libexecdir}/ceph/ceph-osd-prestart.sh
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/60-ceph-by-parttypeuuid.rules
 %{_udevrulesdir}/95-ceph-osd.rules
 %{_mandir}/man8/ceph-clsinfo.8*
diff --git a/ceph.spec.in b/ceph.spec.in
index b2e4b12..9ddd75f 100644
--- a/ceph.spec.in
+++ b/ceph.spec.in
@@ -33,10 +33,12 @@
 %bcond_with selinux
 %endif
 
-# LTTng-UST enabled on Fedora, RHEL 6+, and SLES 12
-%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version} == 1315
+# LTTng-UST enabled on Fedora, RHEL 6+, and SLE (not openSUSE)
+%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version}
+%if ! 0%{?is_opensuse}
 %bcond_without lttng
 %endif
+%endif
 
 %if %{with selinux}
 # get selinux policy version
@@ -116,6 +118,7 @@ BuildRequires:	python-requests
 BuildRequires:	python-sphinx
 BuildRequires:	python-virtualenv
 BuildRequires:	snappy-devel
+BuildRequires:	udev
 BuildRequires:	util-linux
 BuildRequires:	valgrind-devel
 BuildRequires:	xfsprogs
@@ -878,8 +881,8 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_mandir}/man8/rbd-replay-prep.8*
 %dir %{_datadir}/ceph/
 %{_datadir}/ceph/known_hosts_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com.pub
+%{_datadir}/ceph/id_rsa_drop.ceph.com
+%{_datadir}/ceph/id_rsa_drop.ceph.com.pub
 %dir %{_sysconfdir}/ceph/
 %config %{_sysconfdir}/bash_completion.d/rados
 %config %{_sysconfdir}/bash_completion.d/rbd
@@ -887,6 +890,7 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_unitdir}/rbdmap.service
 %{python_sitelib}/ceph_argparse.py*
 %{python_sitelib}/ceph_daemon.py*
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/50-rbd.rules
 %attr(3770,ceph,ceph) %dir %{_localstatedir}/log/ceph/
 %attr(750,ceph,ceph) %dir %{_localstatedir}/lib/ceph/
@@ -1156,6 +1160,7 @@ fi
 %{_sbindir}/ceph-disk
 %{_sbindir}/ceph-disk-udev
 %{_libexecdir}/ceph/ceph-osd-prestart.sh
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/60-ceph-by-parttypeuuid.rules
 %{_udevrulesdir}/95-ceph-osd.rules
 %{_mandir}/man8/ceph-clsinfo.8*
diff --git a/compile b/compile
index 531136b..a85b723 100755
--- a/compile
+++ b/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey at cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/config.guess b/config.guess
index b79252d..1659250 100755
--- a/config.guess
+++ b/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-06-10'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@ timestamp='2013-06-10'
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 #
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
 	LIBC=gnu
 	#endif
 	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
 	;;
 esac
 
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -235,6 +249,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -579,8 +596,9 @@ EOF
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -826,7 +844,7 @@ EOF
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
     i*:windows32*:*)
@@ -932,6 +950,9 @@ EOF
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -969,10 +990,10 @@ EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or1k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
 	exit ;;
-    or32:Linux:*:*)
+    or32:Linux:*:* | or1k*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
@@ -1020,7 +1041,7 @@ EOF
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1260,16 +1281,26 @@ EOF
 	if test "$UNAME_PROCESSOR" = unknown ; then
 	    UNAME_PROCESSOR=powerpc
 	fi
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		case $UNAME_PROCESSOR in
-		    i386) UNAME_PROCESSOR=x86_64 ;;
-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		esac
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
 	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
 	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
@@ -1361,154 +1392,6 @@ EOF
 	exit ;;
 esac
 
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
 cat >&2 <<EOF
 $0: unable to guess system type
 
diff --git a/config.sub b/config.sub
index 9633db7..1acc966 100755
--- a/config.sub
+++ b/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-08-10'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ timestamp='2013-08-10'
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -68,7 +68,7 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,7 +117,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
@@ -255,16 +255,18 @@ case $basic_machine in
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
 	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
 	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
@@ -282,8 +284,10 @@ case $basic_machine in
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipsr5900 | mipsr5900el \
@@ -295,14 +299,14 @@ case $basic_machine in
 	| nds32 | nds32le | nds32be \
 	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -310,6 +314,7 @@ case $basic_machine in
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -324,7 +329,10 @@ case $basic_machine in
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -369,18 +377,20 @@ case $basic_machine in
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
 	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
@@ -400,8 +410,10 @@ case $basic_machine in
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipsr5900-* | mipsr5900el-* \
@@ -413,16 +425,18 @@ case $basic_machine in
 	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -430,6 +444,7 @@ case $basic_machine in
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -506,6 +521,9 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-aros
 		;;
+        asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -767,6 +785,9 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -822,6 +843,10 @@ case $basic_machine in
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -1354,7 +1379,7 @@ case $os in
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
@@ -1367,14 +1392,14 @@ case $os in
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1592,9 +1617,6 @@ case $basic_machine in
 	mips*-*)
 		os=-elf
 		;;
-	or1k-*)
-		os=-elf
-		;;
 	or32-*)
 		os=-coff
 		;;
diff --git a/configure b/configure
index 1cc95de..d434fb9 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for ceph 10.2.3.
+# Generated by GNU Autoconf 2.69 for ceph 10.2.5.
 #
 # Report bugs to <ceph-devel at vger.kernel.org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='ceph'
 PACKAGE_TARNAME='ceph'
-PACKAGE_VERSION='10.2.3'
-PACKAGE_STRING='ceph 10.2.3'
+PACKAGE_VERSION='10.2.5'
+PACKAGE_STRING='ceph 10.2.5'
 PACKAGE_BUGREPORT='ceph-devel at vger.kernel.org'
 PACKAGE_URL=''
 
@@ -706,7 +706,6 @@ HAVE_ARMV8_CRC_TRUE
 HAVE_NEON_FALSE
 HAVE_NEON_TRUE
 ARM_FLAGS
-ARM_CRC_FLAGS
 ARM_NEON_FLAGS
 WITH_OCF_FALSE
 WITH_OCF_TRUE
@@ -865,6 +864,7 @@ CCASFLAGS
 CCAS
 CXXCPP
 CPP
+LT_SYS_LIBRARY_PATH
 OTOOL64
 OTOOL
 LIPO
@@ -936,6 +936,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -963,6 +964,7 @@ enable_shared
 enable_static
 with_pic
 enable_fast_install
+with_aix_soname
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
@@ -1022,6 +1024,7 @@ CPPFLAGS
 CCC
 CC
 CFLAGS
+LT_SYS_LIBRARY_PATH
 CPP
 CXXCPP
 CCAS
@@ -1080,6 +1083,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1332,6 +1336,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1469,7 +1482,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1582,7 +1595,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures ceph 10.2.3 to adapt to many kinds of systems.
+\`configure' configures ceph 10.2.5 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1622,6 +1635,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1653,7 +1667,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of ceph 10.2.3:";;
+     short | recursive ) echo "Configuration of ceph 10.2.5:";;
    esac
   cat <<\_ACEOF
 
@@ -1688,9 +1702,12 @@ Optional Packages:
   --with-man-pages        build man pages
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
   --with-rados            build with librados support
   --with-rbd              build rbd files
   --with-cython           build python bindings for libraries
@@ -1739,6 +1756,8 @@ Some influential environment variables:
               you have headers in a nonstandard directory <include dir>
   CC          C compiler command
   CFLAGS      C compiler flags
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
   CPP         C preprocessor
   CXXCPP      C++ preprocessor
   CCAS        assembler compiler command (defaults to CC)
@@ -1837,7 +1856,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-ceph configure 10.2.3
+ceph configure 10.2.5
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2598,6 +2617,48 @@ rm -f conftest.val
 
 } # ac_fn_c_compute_int
 
+# ac_fn_cxx_try_run LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_cxx_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_run
+
 # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
 # ----------------------------------------------------
 # Tries to find if the field MEMBER exists in type AGGR, after including
@@ -2867,53 +2928,11 @@ $as_echo "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_cxx_check_func
-
-# ac_fn_cxx_try_run LINENO
-# ------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_cxx_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_cxx_try_run
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by ceph $as_me 10.2.3, which was
+It was created by ceph $as_me 10.2.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4227,8 +4246,8 @@ test -n "$target_alias" &&
   program_prefix=${target_alias}-
 
 # Fix automake problems in 1.12
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5011,8 +5030,8 @@ esac
 
 
 
-macro_version='2.4.2'
-macro_revision='1.3337'
+macro_version='2.4.6'
+macro_revision='2.4.6'
 
 
 
@@ -5026,7 +5045,7 @@ macro_revision='1.3337'
 
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 # Backslashify metacharacters that are still active within
 # double-quoted strings.
@@ -5075,7 +5094,7 @@ func_echo_all ()
     $ECHO ""
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
 $as_echo "printf" >&6; } ;;
   print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
@@ -5398,19 +5417,19 @@ test -z "$GREP" && GREP=grep
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -5424,7 +5443,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -5435,7 +5454,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -5446,32 +5465,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -5514,33 +5533,38 @@ if ${lt_cv_path_NM+:} false; then :
 else
   if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -5551,15 +5575,15 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
 $as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
@@ -5665,9 +5689,9 @@ esac
   fi
 fi
 
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -5675,8 +5699,8 @@ fi
     esac
   fi
 
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -5727,7 +5751,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then :
   $as_echo_n "(cached) " >&6
 else
     i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -5767,7 +5791,7 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -5818,22 +5842,22 @@ else
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-	test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -5851,7 +5875,7 @@ else
 
 fi
 
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
 $as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
@@ -5869,30 +5893,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
@@ -6015,13 +6015,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -6149,13 +6149,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[4-9]*)
@@ -6182,8 +6182,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -6279,8 +6278,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
@@ -6333,6 +6332,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 
 fi
@@ -6490,8 +6492,8 @@ else
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -6503,7 +6505,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 
@@ -6657,7 +6659,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
@@ -6665,7 +6667,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -6678,7 +6680,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
 $as_echo "$lt_cv_ar_at_file" >&6; }
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -6895,7 +6897,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -7027,7 +7029,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[ABCDEGRST]'
   fi
   ;;
@@ -7060,14 +7062,44 @@ case `$NM -V 2>&1` in
   symcode='[ABCDGIRSTW]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -7085,21 +7117,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -7147,11 +7182,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
@@ -7177,7 +7212,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -7197,13 +7232,13 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
 	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -7224,7 +7259,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -7277,6 +7312,16 @@ fi
 
 
 
+
+
+
+
+
+
+
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
 $as_echo_n "checking for sysroot... " >&6; }
 
@@ -7289,9 +7334,9 @@ fi
 
 
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -7301,8 +7346,8 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
    as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
    ;;
 esac
@@ -7314,18 +7359,99 @@ $as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
 # Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then :
   enableval=$enable_libtool_lock;
 fi
 
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7334,24 +7460,25 @@ ia64-*-hpux*)
   test $ac_status = 0; }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -7380,9 +7507,50 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7405,10 +7573,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 		;;
 	    esac
 	    ;;
-	  powerpc64le-*)
+	  powerpc64le-*linux*)
 	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  powerpc64-*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -7427,10 +7595,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  powerpcle-*)
+	  powerpcle-*linux*)
 	    LD="${LD-ld} -m elf64lppc"
 	    ;;
-	  powerpc-*)
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -7448,7 +7616,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
 $as_echo_n "checking whether the C compiler needs -belf... " >&6; }
@@ -7488,13 +7656,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
 $as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7506,7 +7675,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -7515,7 +7684,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -7531,7 +7700,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
@@ -7642,7 +7811,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
 $as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 
@@ -8145,7 +8314,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -8163,7 +8332,7 @@ else
 	  cat conftest.err >&5
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&5
@@ -8202,7 +8371,7 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
@@ -8231,7 +8400,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&5
@@ -8244,32 +8413,32 @@ fi
 $as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -8277,6 +8446,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
     ;;
   esac
 
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -8561,9 +8765,9 @@ done
 
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
   esac
 } # func_stripname_cnf
 
@@ -8590,14 +8794,14 @@ if test "${enable_shared+set}" = set; then :
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8621,14 +8825,14 @@ if test "${enable_static+set}" = set; then :
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8652,14 +8856,14 @@ if test "${with_pic+set}" = set; then :
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8667,8 +8871,6 @@ else
 fi
 
 
-test -z "$pic_mode" && pic_mode=default
-
 
 
 
@@ -8684,14 +8886,14 @@ if test "${enable_fast_install+set}" = set; then :
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8705,11 +8907,63 @@ fi
 
 
 
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
 
 
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -8758,7 +9012,7 @@ test -z "$LN_S" && LN_S="ln -s"
 
 
 
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -8797,7 +9051,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -8808,14 +9062,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -8824,15 +9078,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
 test -z "$LD" && LD=ld
 test -z "$ac_objext" && ac_objext=o
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
 # Only perform the check for file, if the check method requires it
@@ -8847,22 +9094,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8885,13 +9132,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8913,22 +9160,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8951,13 +9198,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8978,7 +9225,7 @@ esac
 
 # Use C for the default configuration in the libtool script
 
-lt_save_CC="$CC"
+lt_save_CC=$CC
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -9040,7 +9287,7 @@ if test -n "$compiler"; then
 
 lt_prog_compiler_no_builtin_flag=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
@@ -9056,7 +9303,7 @@ else
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -9086,7 +9333,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
     :
@@ -9104,17 +9351,18 @@ lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
 
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     lt_prog_compiler_wl='-Wl,'
     lt_prog_compiler_static='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       fi
+      lt_prog_compiler_pic='-fPIC'
       ;;
 
     amigaos*)
@@ -9125,8 +9373,8 @@ lt_prog_compiler_static=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -9142,6 +9390,11 @@ lt_prog_compiler_static=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -9212,7 +9465,7 @@ lt_prog_compiler_static=
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       else
@@ -9220,10 +9473,29 @@ lt_prog_compiler_static=
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -9239,7 +9511,7 @@ lt_prog_compiler_static=
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      lt_prog_compiler_static='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -9250,7 +9522,7 @@ lt_prog_compiler_static=
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	lt_prog_compiler_wl='-Wl,'
 	lt_prog_compiler_pic='-KPIC'
@@ -9275,6 +9547,12 @@ lt_prog_compiler_static=
 	lt_prog_compiler_pic='-PIC'
 	lt_prog_compiler_static='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -9372,7 +9650,7 @@ lt_prog_compiler_static=
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	lt_prog_compiler_pic='-Kconform_pic'
 	lt_prog_compiler_static='-Bstatic'
       fi
@@ -9401,7 +9679,7 @@ lt_prog_compiler_static=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic=
     ;;
@@ -9433,7 +9711,7 @@ else
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -9463,7 +9741,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
     case $lt_prog_compiler_pic in
      "" | " "*) ;;
      *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
@@ -9495,7 +9773,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -9514,13 +9792,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
 $as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works"; then
     :
 else
     lt_prog_compiler_static=
@@ -9640,8 +9918,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -9653,9 +9931,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -9698,9 +9976,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # included in the symbol list
   include_expsyms=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -9715,7 +9993,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -9723,7 +10001,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -9736,7 +10014,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -9758,24 +10036,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       whole_archive_flag_spec=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -9788,7 +10066,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
@@ -9807,7 +10085,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9823,7 +10101,7 @@ _LT_EOF
 	allow_undefined_flag=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9833,7 +10111,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
@@ -9841,61 +10119,89 @@ _LT_EOF
       exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	ld_shlibs=no
       fi
       ;;
 
     haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       link_all_deplibs=yes
       ;;
 
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -9906,42 +10212,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  whole_archive_flag_spec=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
 	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -9955,8 +10266,8 @@ _LT_EOF
 	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -9974,8 +10285,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9987,7 +10298,7 @@ _LT_EOF
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -10002,9 +10313,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    ld_shlibs=no
 	  fi
@@ -10021,15 +10332,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
       ;;
     esac
 
-    if test "$ld_shlibs" = no; then
+    if test no = "$ld_shlibs"; then
       runpath_var=
       hardcode_libdir_flag_spec=
       export_dynamic_flag_spec=
@@ -10045,7 +10356,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	hardcode_direct=unsupported
@@ -10053,34 +10364,57 @@ _LT_EOF
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -10099,13 +10433,21 @@ _LT_EOF
       hardcode_direct_absolute=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[012]|aix4.[012].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -10124,36 +10466,42 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
-	link_all_deplibs=no
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      export_dynamic_flag_spec='${wl}-bexpall'
+      export_dynamic_flag_spec='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
+        if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -10188,7 +10536,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -10196,17 +10544,17 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
 	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
+	 if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -10241,7 +10589,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -10249,21 +10597,33 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    whole_archive_flag_spec='$convenience'
 	  fi
 	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) >  [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -10272,7 +10632,7 @@ fi
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -10302,16 +10662,17 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
 	enable_shared_with_static_runtimes=yes
@@ -10320,18 +10681,18 @@ fi
 	# Don't use ranlib
 	old_postinstall_cmds='chmod 644 $oldlib'
 	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -10340,7 +10701,7 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -10359,24 +10720,24 @@ fi
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec=''
   fi
   link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
+  allow_undefined_flag=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
 
   else
   ld_shlibs=no
@@ -10418,33 +10779,33 @@ fi
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_direct=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
+      export_dynamic_flag_spec='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 	hardcode_direct=yes
 	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
+	export_dynamic_flag_spec='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	hardcode_minus_L=yes
@@ -10452,25 +10813,25 @@ fi
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 
@@ -10482,7 +10843,7 @@ if ${lt_cv_prog_compiler__b+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -b"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -10501,14 +10862,14 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
 $as_echo "$lt_cv_prog_compiler__b" >&6; }
 
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 else
     archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
 fi
@@ -10516,8 +10877,8 @@ fi
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 
 	case $host_cpu in
@@ -10528,7 +10889,7 @@ fi
 	*)
 	  hardcode_direct=yes
 	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
+	  export_dynamic_flag_spec='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -10539,8 +10900,8 @@ fi
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
@@ -10550,8 +10911,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >
 if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo (void) { return 0; }
@@ -10563,24 +10924,35 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
+           LDFLAGS=$save_LDFLAGS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
 $as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	link_all_deplibs=no
       else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       inherit_rpath=yes
       link_all_deplibs=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -10595,7 +10967,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     newsos6)
       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_shlibpath_var=no
       ;;
@@ -10603,27 +10975,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	hardcode_direct=yes
 	hardcode_shlibpath_var=no
 	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
 	fi
       else
 	ld_shlibs=no
@@ -10634,33 +10998,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	hardcode_libdir_flag_spec='-rpath $libdir'
@@ -10671,24 +11055,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
     solaris*)
       no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -10698,11 +11082,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
 	fi
@@ -10712,10 +11096,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -10764,43 +11148,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
+      no_undefined_flag='$wl-z,text'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
+      export_dynamic_flag_spec='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -10815,10 +11199,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	export_dynamic_flag_spec='$wl-Blargedynsym'
 	;;
       esac
     fi
@@ -10826,7 +11210,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
 $as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+test no = "$ld_shlibs" && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
 
@@ -10852,7 +11236,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -11067,14 +11451,14 @@ esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -11090,28 +11474,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -11125,7 +11516,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -11134,7 +11525,7 @@ fi
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -11151,14 +11542,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -11166,41 +11559,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -11210,18 +11653,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -11229,8 +11672,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -11242,7 +11685,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -11251,8 +11694,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -11268,17 +11711,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -11287,8 +11730,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -11315,7 +11758,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -11328,8 +11771,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -11342,7 +11785,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -11355,8 +11798,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -11369,8 +11812,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11388,12 +11831,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -11423,10 +11867,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -11444,14 +11888,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -11459,8 +11904,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -11469,8 +11914,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -11483,8 +11928,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -11495,7 +11940,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -11503,8 +11948,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -11523,8 +11968,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -11533,13 +11978,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -11583,7 +12048,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -11615,12 +12085,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -11630,7 +12100,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -11639,58 +12109,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -11701,8 +12181,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -11712,11 +12192,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -11724,8 +12204,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -11746,24 +12226,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -11781,7 +12261,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -11789,8 +12269,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11800,20 +12280,35 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
 
 
 
@@ -11910,15 +12405,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
+   test yes = "$hardcode_automatic"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
+  if test no != "$hardcode_direct" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action=relink
   else
@@ -11933,12 +12428,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
 $as_echo "$hardcode_action" >&6; }
 
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -11948,7 +12443,7 @@ fi
 
 
 
-  if test "x$enable_dlopen" != xyes; then
+  if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -11958,23 +12453,23 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 if ${ac_cv_lib_dl_dlopen+:} false; then :
@@ -12012,10 +12507,10 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
 
-    lt_cv_dlopen="dyld"
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
 
@@ -12023,10 +12518,18 @@ fi
 
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
 if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
+  lt_cv_dlopen=shl_load
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
 $as_echo_n "checking for shl_load in -ldld... " >&6; }
@@ -12065,11 +12568,11 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
 $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
 if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
 else
   ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
 if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
+  lt_cv_dlopen=dlopen
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -12108,7 +12611,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
 $as_echo_n "checking for dlopen in -lsvld... " >&6; }
@@ -12147,7 +12650,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
 $as_echo "$ac_cv_lib_svld_dlopen" >&6; }
 if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
 $as_echo_n "checking for dld_link in -ldld... " >&6; }
@@ -12186,7 +12689,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
 $as_echo "$ac_cv_lib_dld_dld_link" >&6; }
 if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
 fi
 
 
@@ -12207,21 +12710,21 @@ fi
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
@@ -12229,7 +12732,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -12276,9 +12779,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -12308,7 +12811,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -12328,14 +12831,14 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
 $as_echo "$lt_cv_dlopen_self" >&6; }
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self_static+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self_static=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -12382,9 +12885,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -12414,7 +12917,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -12435,9 +12938,9 @@ fi
 $as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -12481,7 +12984,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -12509,7 +13012,7 @@ fi
 
 
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
 $as_echo_n "checking if libtool supports shared libraries... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
@@ -12517,13 +13020,13 @@ $as_echo "$can_build_shared" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
 $as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -12531,8 +13034,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -12542,7 +13049,7 @@ $as_echo "$enable_shared" >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
 $as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
 $as_echo "$enable_static" >&6; }
 
@@ -12556,11 +13063,11 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-CC="$lt_save_CC"
+CC=$lt_save_CC
 
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -12739,7 +13246,7 @@ objext_CXX=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -12800,46 +13307,39 @@ $RM -r conftest*
   CFLAGS=$CXXFLAGS
   compiler=$CC
   compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
     else
       lt_prog_compiler_no_builtin_flag_CXX=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
 
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -12853,7 +13353,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -12864,7 +13364,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -12875,32 +13375,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -12936,22 +13436,22 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           whole_archive_flag_spec_CXX=
         fi
@@ -12988,18 +13488,30 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         ld_shlibs_CXX=no
         ;;
       aix[4-9]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -13009,6 +13521,13 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -13027,13 +13546,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         hardcode_direct_absolute_CXX=yes
         hardcode_libdir_separator_CXX=':'
         link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[012]|aix4.[012].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -13051,36 +13578,44 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
+          if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -13115,7 +13650,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
@@ -13123,18 +13658,18 @@ fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
 	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
-	    if test "${lt_cv_aix_libpath+set}" = set; then
+	    if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -13169,7 +13704,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
@@ -13177,22 +13712,34 @@ fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    no_undefined_flag_CXX=' $wl-bernotok'
+	    allow_undefined_flag_CXX=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      whole_archive_flag_spec_CXX='$convenience'
 	    fi
 	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_sy [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -13202,7 +13749,7 @@ fi
 	  allow_undefined_flag_CXX=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  ld_shlibs_CXX=no
 	fi
@@ -13230,57 +13777,58 @@ fi
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
 	  enable_shared_with_static_runtimes_CXX=yes
 	  # Don't use ranlib
 	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
 	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
 	  allow_undefined_flag_CXX=unsupported
 	  always_export_symbols_CXX=no
 	  enable_shared_with_static_runtimes_CXX=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    ld_shlibs_CXX=no
 	  fi
@@ -13294,27 +13842,27 @@ fi
   hardcode_direct_CXX=no
   hardcode_automatic_CXX=yes
   hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec_CXX=''
   fi
   link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 
   else
@@ -13323,6 +13871,34 @@ fi
 
 	;;
 
+      os2*)
+	hardcode_libdir_flag_spec_CXX='-L$libdir'
+	hardcode_minus_L_CXX=yes
+	allow_undefined_flag_CXX=unsupported
+	shrext_cmds=.dll
+	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	enable_shared_with_static_runtimes_CXX=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -13358,14 +13934,14 @@ fi
         ;;
 
       haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
         ;;
 
       hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
         hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
+        export_dynamic_flag_spec_CXX='$wl-E'
         hardcode_direct_CXX=yes
         hardcode_minus_L_CXX=yes # Not in the search PATH,
 				             # but as the default
@@ -13377,7 +13953,7 @@ fi
             ld_shlibs_CXX=no
             ;;
           aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -13386,11 +13962,11 @@ fi
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               ld_shlibs_CXX=no
@@ -13400,15 +13976,15 @@ fi
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
 	  hardcode_libdir_separator_CXX=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
+	      export_dynamic_flag_spec_CXX='$wl-E'
               ;;
           esac
         fi
@@ -13434,13 +14010,13 @@ fi
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -13451,20 +14027,20 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -13479,22 +14055,22 @@ fi
       interix[3-9]*)
 	hardcode_direct_CXX=no
 	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
+	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -13503,17 +14079,17 @@ fi
 	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    link_all_deplibs_CXX=yes
 	    ;;
         esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
         hardcode_libdir_separator_CXX=:
         inherit_rpath_CXX=yes
         ;;
@@ -13526,8 +14102,8 @@ fi
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -13536,10 +14112,10 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -13553,59 +14129,59 @@ fi
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
 	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
@@ -13619,18 +14195,18 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -13638,10 +14214,10 @@ fi
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      compiler_needs_object_CXX=yes
 
 	      # Not sure whether something based on
@@ -13699,22 +14275,17 @@ fi
         ld_shlibs_CXX=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  hardcode_direct_CXX=yes
 	  hardcode_shlibpath_var_CXX=no
 	  hardcode_direct_absolute_CXX=yes
 	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='$wl-E'
+	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -13730,9 +14301,9 @@ fi
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
 	    hardcode_libdir_separator_CXX=:
 
 	    # Archives containing C++ object files must be created using
@@ -13750,17 +14321,17 @@ fi
           cxx*)
 	    case $host in
 	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
 		;;
 	    esac
@@ -13775,21 +14346,21 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
 	      hardcode_libdir_separator_CXX=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -13835,9 +14406,9 @@ fi
 	    # Sun C++ 4.2, 5.x and Centerline C++
             archive_cmds_need_lc_CXX=yes
 	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    hardcode_libdir_flag_spec_CXX='-R$libdir'
 	    hardcode_shlibpath_var_CXX=no
@@ -13845,7 +14416,7 @@ fi
 	      solaris2.[0-5] | solaris2.[0-5].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -13862,30 +14433,30 @@ fi
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -13893,11 +14464,11 @@ fi
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[0-5] | solaris2.[0-5].*) ;;
 		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -13906,52 +14477,52 @@ fi
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
+      no_undefined_flag_CXX='$wl-z,text'
       archive_cmds_need_lc_CXX=no
       hardcode_shlibpath_var_CXX=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	no_undefined_flag_CXX='$wl-z,text'
+	allow_undefined_flag_CXX='$wl-z,nodefs'
 	archive_cmds_need_lc_CXX=no
 	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
 	hardcode_libdir_separator_CXX=':'
 	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	export_dynamic_flag_spec_CXX='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-	      '"$old_archive_cmds_CXX"
+              '"$old_archive_cmds_CXX"
 	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-	      '"$reload_cmds_CXX"
+              '"$reload_cmds_CXX"
 	    ;;
 	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -13983,10 +14554,10 @@ fi
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
 
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
+    GCC_CXX=$GXX
+    LD_CXX=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -14030,13 +14601,13 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -14052,16 +14623,16 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
+	     compiler_lib_search_path_CXX=$prev$p
 	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -14069,9 +14640,9 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 	 esac
        else
 	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
+	   postdeps_CXX=$prev$p
 	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	   postdeps_CXX="${postdeps_CXX} $prev$p"
 	 fi
        fi
        prev=
@@ -14086,15 +14657,15 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
+	   predep_objects_CXX=$p
 	 else
 	   predep_objects_CXX="$predep_objects_CXX $p"
 	 fi
        else
 	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
+	   postdep_objects_CXX=$p
 	 else
 	   postdep_objects_CXX="$postdep_objects_CXX $p"
 	 fi
@@ -14124,51 +14695,6 @@ interix[3-9]*)
   postdep_objects_CXX=
   postdeps_CXX=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 
 
@@ -14177,7 +14703,7 @@ case " $postdeps_CXX " in
 esac
  compiler_lib_search_dirs_CXX=
 if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 
 
@@ -14216,17 +14742,18 @@ lt_prog_compiler_static_CXX=
 
 
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     lt_prog_compiler_wl_CXX='-Wl,'
     lt_prog_compiler_static_CXX='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static_CXX='-Bstatic'
       fi
+      lt_prog_compiler_pic_CXX='-fPIC'
       ;;
 
     amigaos*)
@@ -14237,8 +14764,8 @@ lt_prog_compiler_static_CXX=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -14253,6 +14780,11 @@ lt_prog_compiler_static_CXX=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_CXX='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -14302,7 +14834,7 @@ lt_prog_compiler_static_CXX=
     case $host_os in
       aix[4-9]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  lt_prog_compiler_static_CXX='-Bstatic'
 	else
@@ -14342,14 +14874,14 @@ lt_prog_compiler_static_CXX=
 	case $cc_basename in
 	  CC*)
 	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      lt_prog_compiler_pic_CXX='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -14386,7 +14918,7 @@ lt_prog_compiler_static_CXX=
 	    lt_prog_compiler_pic_CXX='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    lt_prog_compiler_wl_CXX='-Wl,'
 	    lt_prog_compiler_pic_CXX='-KPIC'
 	    lt_prog_compiler_static_CXX='-static'
@@ -14531,7 +15063,7 @@ lt_prog_compiler_static_CXX=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic_CXX=
     ;;
@@ -14563,7 +15095,7 @@ else
   lt_cv_prog_compiler_pic_works_CXX=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -14593,7 +15125,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
     case $lt_prog_compiler_pic_CXX in
      "" | " "*) ;;
      *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
@@ -14619,7 +15151,7 @@ if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -14638,13 +15170,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
     :
 else
     lt_prog_compiler_static_CXX=
@@ -14758,8 +15290,8 @@ $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -14771,9 +15303,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -14790,17 +15322,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   case $host_os in
   aix[4-9]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
+    export_symbols_cmds_CXX=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -14823,7 +15359,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+test no = "$ld_shlibs_CXX" && can_build_shared=no
 
 with_gnu_ld_CXX=$with_gnu_ld
 
@@ -14840,7 +15376,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc_CXX=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds_CXX in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -14968,7 +15504,7 @@ $as_echo_n "checking dynamic linker characteristics... " >&6; }
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -14985,14 +15521,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -15000,41 +15538,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -15044,18 +15632,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -15063,8 +15651,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -15076,7 +15664,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -15085,8 +15673,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -15102,16 +15690,16 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -15120,8 +15708,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -15148,7 +15736,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -15161,8 +15749,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -15175,7 +15763,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -15188,8 +15776,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -15201,8 +15789,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -15220,12 +15808,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -15255,10 +15844,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -15276,14 +15865,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -15291,8 +15881,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -15301,8 +15891,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -15315,8 +15905,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -15327,7 +15917,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -15335,8 +15925,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -15355,8 +15945,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -15365,13 +15955,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -15415,7 +16025,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -15447,12 +16062,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -15462,7 +16077,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -15471,58 +16086,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -15533,8 +16158,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -15544,11 +16169,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -15556,8 +16181,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -15578,24 +16203,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -15613,7 +16238,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -15621,8 +16246,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -15632,20 +16257,32 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
 
 
 
@@ -15688,15 +16325,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action_CXX=
 if test -n "$hardcode_libdir_flag_spec_CXX" ||
    test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+   test yes = "$hardcode_automatic_CXX"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
+  if test no != "$hardcode_direct_CXX" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action_CXX=relink
   else
@@ -15711,12 +16348,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
 $as_echo "$hardcode_action_CXX" >&6; }
 
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -15739,7 +16376,7 @@ fi
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -15976,7 +16613,7 @@ fi
 
 
 
-am__api_version='1.14'
+am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -16165,7 +16802,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -16408,7 +17045,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='ceph'
- VERSION='10.2.3'
+ VERSION='10.2.5'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -16442,8 +17079,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -16872,6 +17509,7 @@ END
     as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
   fi
 fi
+
 # enable make V=0 (if automake >1.11)
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
@@ -20777,7 +21415,7 @@ else
 JAVA_TEST=Test.java
 CLASS_TEST=Test.class
 cat << \EOF > $JAVA_TEST
-/* #line 20780 "configure" */
+/* #line 21418 "configure" */
 public class Test {
 }
 EOF
@@ -21761,48 +22399,47 @@ $as_echo "#define HAVE_NEON /**/" >>confdefs.h
 
 
       fi
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -march=armv8-a+crc" >&5
-$as_echo_n "checking whether C compiler accepts -march=armv8-a+crc... " >&6; }
-if ${ax_cv_check_cflags___march_armv8_apcrc+:} false; then :
+
+
+      ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports crc extensions" >&5
+$as_echo_n "checking whether the assembler supports crc extensions... " >&6; }
+if ${ax_cv_support_crc_ext+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -march=armv8-a+crc"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+          #define CRC32CX(crc, value) __asm__("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value))
+          asm(".arch_extension crc");
+          unsigned int foo(unsigned int ret) {
+              CRC32CX(ret, 0);
+              return ret;
+          }
 int
 main ()
 {
-
+ foo(0);
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___march_armv8_apcrc=yes
-else
-  ax_cv_check_cflags___march_armv8_apcrc=no
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_support_crc_ext=yes
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___march_armv8_apcrc" >&5
-$as_echo "$ax_cv_check_cflags___march_armv8_apcrc" >&6; }
-if test x"$ax_cv_check_cflags___march_armv8_apcrc" = xyes; then :
-  ax_cv_support_crc_ext=yes
-else
-  :
 fi
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_support_crc_ext" >&5
+$as_echo "$ax_cv_support_crc_ext" >&6; }
       if test x"$ax_cv_support_crc_ext" = x"yes"; then
-        ARM_ARCH_FLAGS="$ARM_ARCH_FLAGS+crc"
-        ARM_CRC_FLAGS="-march=armv8-a+crc -DARCH_AARCH64"
 
 $as_echo "#define HAVE_ARMV8_CRC /**/" >>confdefs.h
 
-
       fi
         ARM_FLAGS="$ARM_ARCH_FLAGS $ARM_DEFINE_FLAGS"
     ;;
@@ -21831,14 +22468,14 @@ fi
 
   case $target_cpu in
     i[3456]86*|x86_64*|amd64*)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse" >&5
-$as_echo_n "checking whether C compiler accepts -msse... " >&6; }
-if ${ax_cv_check_cflags___msse+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse" >&5
+$as_echo_n "checking whether C++ compiler accepts -msse... " >&6; }
+if ${ax_cv_check_cxxflags___msse+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -msse"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -msse"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -21850,17 +22487,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___msse=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___msse=yes
 else
-  ax_cv_check_cflags___msse=no
+  ax_cv_check_cxxflags___msse=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse" >&5
-$as_echo "$ax_cv_check_cflags___msse" >&6; }
-if test x"$ax_cv_check_cflags___msse" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse" >&5
+$as_echo "$ax_cv_check_cxxflags___msse" >&6; }
+if test x"$ax_cv_check_cxxflags___msse" = xyes; then :
   ax_cv_support_sse_ext=yes
 else
   :
@@ -21875,14 +22512,14 @@ $as_echo "#define HAVE_SSE /**/" >>confdefs.h
 
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse2" >&5
-$as_echo_n "checking whether C compiler accepts -msse2... " >&6; }
-if ${ax_cv_check_cflags___msse2+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse2" >&5
+$as_echo_n "checking whether C++ compiler accepts -msse2... " >&6; }
+if ${ax_cv_check_cxxflags___msse2+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -msse2"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -msse2"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -21894,17 +22531,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___msse2=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___msse2=yes
 else
-  ax_cv_check_cflags___msse2=no
+  ax_cv_check_cxxflags___msse2=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse2" >&5
-$as_echo "$ax_cv_check_cflags___msse2" >&6; }
-if test x"$ax_cv_check_cflags___msse2" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse2" >&5
+$as_echo "$ax_cv_check_cxxflags___msse2" >&6; }
+if test x"$ax_cv_check_cxxflags___msse2" = xyes; then :
   ax_cv_support_sse2_ext=yes
 else
   :
@@ -21919,14 +22556,14 @@ $as_echo "#define HAVE_SSE2 /**/" >>confdefs.h
 
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse3" >&5
-$as_echo_n "checking whether C compiler accepts -msse3... " >&6; }
-if ${ax_cv_check_cflags___msse3+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse3" >&5
+$as_echo_n "checking whether C++ compiler accepts -msse3... " >&6; }
+if ${ax_cv_check_cxxflags___msse3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -msse3"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -msse3"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -21938,17 +22575,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___msse3=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___msse3=yes
 else
-  ax_cv_check_cflags___msse3=no
+  ax_cv_check_cxxflags___msse3=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse3" >&5
-$as_echo "$ax_cv_check_cflags___msse3" >&6; }
-if test x"$ax_cv_check_cflags___msse3" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse3" >&5
+$as_echo "$ax_cv_check_cxxflags___msse3" >&6; }
+if test x"$ax_cv_check_cxxflags___msse3" = xyes; then :
   ax_cv_support_sse3_ext=yes
 else
   :
@@ -21963,14 +22600,14 @@ $as_echo "#define HAVE_SSE3 /**/" >>confdefs.h
 
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mssse3" >&5
-$as_echo_n "checking whether C compiler accepts -mssse3... " >&6; }
-if ${ax_cv_check_cflags___mssse3+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mssse3" >&5
+$as_echo_n "checking whether C++ compiler accepts -mssse3... " >&6; }
+if ${ax_cv_check_cxxflags___mssse3+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -mssse3"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -mssse3"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -21982,17 +22619,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___mssse3=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___mssse3=yes
 else
-  ax_cv_check_cflags___mssse3=no
+  ax_cv_check_cxxflags___mssse3=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mssse3" >&5
-$as_echo "$ax_cv_check_cflags___mssse3" >&6; }
-if test x"$ax_cv_check_cflags___mssse3" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mssse3" >&5
+$as_echo "$ax_cv_check_cxxflags___mssse3" >&6; }
+if test x"$ax_cv_check_cxxflags___mssse3" = xyes; then :
   ax_cv_support_ssse3_ext=yes
 else
   :
@@ -22011,14 +22648,14 @@ $as_echo "#define HAVE_SSSE3 /**/" >>confdefs.h
 
   case $target_cpu in
   x86_64*|amd64*)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mpclmul" >&5
-$as_echo_n "checking whether C compiler accepts -mpclmul... " >&6; }
-if ${ax_cv_check_cflags___mpclmul+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -mpclmul" >&5
+$as_echo_n "checking whether C++ compiler accepts -mpclmul... " >&6; }
+if ${ax_cv_check_cxxflags___mpclmul+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -mpclmul"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -mpclmul"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -22030,17 +22667,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___mpclmul=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___mpclmul=yes
 else
-  ax_cv_check_cflags___mpclmul=no
+  ax_cv_check_cxxflags___mpclmul=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mpclmul" >&5
-$as_echo "$ax_cv_check_cflags___mpclmul" >&6; }
-if test x"$ax_cv_check_cflags___mpclmul" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___mpclmul" >&5
+$as_echo "$ax_cv_check_cxxflags___mpclmul" >&6; }
+if test x"$ax_cv_check_cxxflags___mpclmul" = xyes; then :
   ax_cv_support_pclmuldq_ext=yes
 else
   :
@@ -22055,14 +22692,14 @@ $as_echo "#define HAVE_PCLMUL /**/" >>confdefs.h
 
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse4.1" >&5
-$as_echo_n "checking whether C compiler accepts -msse4.1... " >&6; }
-if ${ax_cv_check_cflags___msse4_1+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse4.1" >&5
+$as_echo_n "checking whether C++ compiler accepts -msse4.1... " >&6; }
+if ${ax_cv_check_cxxflags___msse4_1+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -msse4.1"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -msse4.1"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -22074,17 +22711,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___msse4_1=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___msse4_1=yes
 else
-  ax_cv_check_cflags___msse4_1=no
+  ax_cv_check_cxxflags___msse4_1=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse4_1" >&5
-$as_echo "$ax_cv_check_cflags___msse4_1" >&6; }
-if test x"$ax_cv_check_cflags___msse4_1" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse4_1" >&5
+$as_echo "$ax_cv_check_cxxflags___msse4_1" >&6; }
+if test x"$ax_cv_check_cxxflags___msse4_1" = xyes; then :
   ax_cv_support_sse41_ext=yes
 else
   :
@@ -22099,14 +22736,14 @@ $as_echo "#define HAVE_SSE4_1 /**/" >>confdefs.h
 
       fi
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse4.2" >&5
-$as_echo_n "checking whether C compiler accepts -msse4.2... " >&6; }
-if ${ax_cv_check_cflags___msse4_2+:} false; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -msse4.2" >&5
+$as_echo_n "checking whether C++ compiler accepts -msse4.2... " >&6; }
+if ${ax_cv_check_cxxflags___msse4_2+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-  ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS  -msse4.2"
+  ax_check_save_flags=$CXXFLAGS
+  CXXFLAGS="$CXXFLAGS  -msse4.2"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -22118,17 +22755,17 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags___msse4_2=yes
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ax_cv_check_cxxflags___msse4_2=yes
 else
-  ax_cv_check_cflags___msse4_2=no
+  ax_cv_check_cxxflags___msse4_2=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS=$ax_check_save_flags
+  CXXFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse4_2" >&5
-$as_echo "$ax_cv_check_cflags___msse4_2" >&6; }
-if test x"$ax_cv_check_cflags___msse4_2" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___msse4_2" >&5
+$as_echo "$ax_cv_check_cxxflags___msse4_2" >&6; }
+if test x"$ax_cv_check_cxxflags___msse4_2" = xyes; then :
   ax_cv_support_sse42_ext=yes
 else
   :
@@ -22361,11 +22998,11 @@ $as_echo "$ac_res" >&6; }
       fi
     done
   fi
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
   if test x$ax_cxx_compile_cxx11_required = xtrue; then
     if test x$ac_success = xno; then
@@ -22496,7 +23133,7 @@ return open ();
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
   ac_cv_lib_rocksdb_open=yes
 else
   ac_cv_lib_rocksdb_open=no
@@ -22567,13 +23204,13 @@ fi
 # rocksdb detects bzlib and lz4 in its Makefile, which forces us to do the same.
 if test "x$with_librocksdb_static" = "xyes"; then :
 
-  ac_fn_c_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default"
+  ac_fn_cxx_check_header_mongrel "$LINENO" "bzlib.h" "ac_cv_header_bzlib_h" "$ac_includes_default"
 if test "x$ac_cv_header_bzlib_h" = xyes; then :
   have_bzlib=yes
 fi
 
 
-  ac_fn_c_check_header_mongrel "$LINENO" "lz4.h" "ac_cv_header_lz4_h" "$ac_includes_default"
+  ac_fn_cxx_check_header_mongrel "$LINENO" "lz4.h" "ac_cv_header_lz4_h" "$ac_includes_default"
 if test "x$ac_cv_header_lz4_h" = xyes; then :
   have_lz4=yes
 fi
@@ -22624,7 +23261,7 @@ return curl_easy_init ();
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
   ac_cv_lib_curl_curl_easy_init=yes
 else
   ac_cv_lib_curl_curl_easy_init=no
@@ -22671,7 +23308,7 @@ return xmlParseChunk ();
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
   ac_cv_lib_xml2_xmlParseChunk=yes
 else
   ac_cv_lib_xml2_xmlParseChunk=no
@@ -22730,7 +23367,7 @@ return io_submit ();
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"; then :
   ac_cv_lib_aio_io_submit=yes
 else
   ac_cv_lib_aio_io_submit=no
@@ -22752,7 +23389,7 @@ fi
 
 fi
 if test "x$with_libaio" != xno; then :
-  ac_fn_c_check_header_mongrel "$LINENO" "libaio.h" "ac_cv_header_libaio_h" "$ac_includes_default"
+  ac_fn_cxx_check_header_mongrel "$LINENO" "libaio.h" "ac_cv_header_libaio_h" "$ac_includes_default"
 if test "x$ac_cv_header_libaio_h" = xyes; then :
 
 fi
@@ -22785,7 +23422,7 @@ fi
 if test "x$with_libxfs" != "xno"; then :
 
   # xfs/xfs.h presence and XFS_XFLAG_EXTSIZE define
-  ac_fn_c_check_header_mongrel "$LINENO" "xfs/xfs.h" "ac_cv_header_xfs_xfs_h" "$ac_includes_default"
+  ac_fn_cxx_check_header_mongrel "$LINENO" "xfs/xfs.h" "ac_cv_header_xfs_xfs_h" "$ac_includes_default"
 if test "x$ac_cv_header_xfs_xfs_h" = xyes; then :
 
 else
@@ -22952,7 +23589,7 @@ return 0;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
   eval "$as_ac_Header=yes"
 else
   eval "$as_ac_Header=no"
@@ -23004,7 +23641,7 @@ for ac_lib in '' dir; do
     ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
   fi
-  if ac_fn_c_try_link "$LINENO"; then :
+  if ac_fn_cxx_try_link "$LINENO"; then :
   ac_cv_search_opendir=$ac_res
 fi
 rm -f core conftest.err conftest.$ac_objext \
@@ -23061,7 +23698,7 @@ for ac_lib in '' x; do
     ac_res=-l$ac_lib
     LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
   fi
-  if ac_fn_c_try_link "$LINENO"; then :
+  if ac_fn_cxx_try_link "$LINENO"; then :
   ac_cv_search_opendir=$ac_res
 fi
 rm -f core conftest.err conftest.$ac_objext \
@@ -23108,7 +23745,7 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
   ac_cv_header_stdc=yes
 else
   ac_cv_header_stdc=no
@@ -23181,7 +23818,7 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_cxx_try_run "$LINENO"; then :
 
 else
   ac_cv_header_stdc=no
@@ -23226,7 +23863,7 @@ main ()
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"; then :
   ac_cv_header_sys_wait_h=yes
 else
   ac_cv_header_sys_wait_h=no
@@ -26100,7 +26737,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by ceph $as_me 10.2.3, which was
+This file was extended by ceph $as_me 10.2.5, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -26166,7 +26803,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-ceph config.status 10.2.3
+ceph config.status 10.2.5
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -26300,6 +26937,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
@@ -26349,10 +26987,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -26417,7 +27058,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -26522,9 +27164,12 @@ CFLAGS \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
 nm_file_list_spec \
+lt_cv_truncate_bin \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
@@ -26590,7 +27235,7 @@ postdeps_CXX \
 compiler_lib_search_path_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -26617,7 +27262,8 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
 reload_cmds_CXX \
 old_archive_cmds_CXX \
 old_archive_from_new_cmds_CXX \
@@ -26631,7 +27277,7 @@ prelink_cmds_CXX \
 postlink_cmds_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -26640,19 +27286,16 @@ postlink_cmds_CXX; do
 done
 
 ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
 
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'
 
@@ -27280,55 +27923,53 @@ $as_echo "$as_me: executing $ac_file commands" >&6;}
   case $ac_file$ac_mode in
     "libtool":C)
 
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # The names of the tagged configurations supported by this script.
-available_tags="CXX "
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
 
 # ### BEGIN LIBTOOL CONFIG
 
@@ -27348,6 +27989,9 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
@@ -27465,18 +28109,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
 lt_sysroot=$lt_sysroot
 
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
@@ -27567,8 +28220,11 @@ hardcode_into_libs=$hardcode_into_libs
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
@@ -27661,13 +28317,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
@@ -27733,13 +28389,72 @@ compiler_lib_search_path=$lt_compiler_lib_search_path
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -27748,7 +28463,7 @@ _LT_EOF
   esac
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
@@ -27758,165 +28473,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -28003,13 +28559,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
diff --git a/configure.ac b/configure.ac
index fcc500b..32e273f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8,7 +8,7 @@ AC_PREREQ(2.59)
 # VERSION define is not used by the code.  It gets a version string
 # from 'git describe'; see src/ceph_ver.[ch]
 
-AC_INIT([ceph], [10.2.3], [ceph-devel at vger.kernel.org])
+AC_INIT([ceph], [10.2.5], [ceph-devel at vger.kernel.org])
 
 AX_CXX_COMPILE_STDCXX_11(, mandatory)
 
diff --git a/depcomp b/depcomp
index 4ebd5b3..fc98710 100755
--- a/depcomp
+++ b/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/doc/.gitignore b/doc/.gitignore
new file mode 100644
index 0000000..aca7518
--- /dev/null
+++ b/doc/.gitignore
@@ -0,0 +1,3 @@
+/overview.png
+/object_store.png
+/Makefile
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..c13fccf
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,561 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# doc/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/ceph
+pkgincludedir = $(includedir)/ceph
+pkglibdir = $(libdir)/ceph
+pkglibexecdir = $(libexecdir)/ceph
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-pc-linux-gnu
+host_triplet = x86_64-pc-linux-gnu
+target_triplet = x86_64-pc-linux-gnu
+subdir = doc
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
+	$(top_srcdir)/m4/ac_prog_jar.m4 \
+	$(top_srcdir)/m4/ac_prog_javac.m4 \
+	$(top_srcdir)/m4/ac_prog_javac_works.m4 \
+	$(top_srcdir)/m4/ac_prog_javah.m4 \
+	$(top_srcdir)/m4/acx_pthread.m4 $(top_srcdir)/m4/ax_arm.m4 \
+	$(top_srcdir)/m4/ax_c_pretty_func.m4 \
+	$(top_srcdir)/m4/ax_c_var_func.m4 \
+	$(top_srcdir)/m4/ax_check_compile_flag.m4 \
+	$(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \
+	$(top_srcdir)/m4/ax_cxx_static_cast.m4 \
+	$(top_srcdir)/m4/ax_intel.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/acconfig.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_$(V))
+am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY))
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+am__v_at_1 = 
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/jenkins-build/build/workspace/ceph-setup/missing aclocal-1.15
+AMTAR = $${TAR-tar}
+AM_CXXFLAGS =  -I/usr/include/nss -I/usr/include/nspr 
+AM_DEFAULT_VERBOSITY = 0
+AR = ar
+ARM_FLAGS = 
+ARM_NEON_FLAGS = 
+AUTOCONF = ${SHELL} /home/jenkins-build/build/workspace/ceph-setup/missing autoconf
+AUTOHEADER = ${SHELL} /home/jenkins-build/build/workspace/ceph-setup/missing autoheader
+AUTOMAKE = ${SHELL} /home/jenkins-build/build/workspace/ceph-setup/missing automake-1.15
+AWK = gawk
+BOOST_PROGRAM_OPTIONS_LIBS = -lboost_program_options 
+BOOST_RANDOM_LIBS = -lboost_random 
+BOOST_REGEX_LIBS = -lboost_regex 
+BOOST_THREAD_LIBS = -lboost_thread 
+CC = gcc
+CCAS = gcc
+CCASDEPMODE = depmode=gcc3
+CCASFLAGS =  -Wno-unused-parameter
+CCDEPMODE = depmode=gcc3
+CFLAGS = -D_LARGEFILE64_SOURCE  -Wno-unused-parameter
+CPP = gcc -E
+CPPFLAGS = 
+CRYPTOPP_CFLAGS = 
+CRYPTOPP_LIBS = 
+CRYPTO_CFLAGS = -I/usr/include/nss -I/usr/include/nspr
+CRYPTO_LIBS = -lnss3 -lnssutil3 -lsmime3 -lssl3 -lplds4 -lplc4 -lnspr4
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS =   -Wno-unused-parameter -std=gnu++11
+CYGPATH_W = echo
+CYTHON_CHECK = yes
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DLLTOOL = false
+DSYMUTIL = 
+DUMPBIN = 
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /bin/grep -E
+EXEEXT = 
+EXTRA_CLASSPATH_JAR = 
+FGREP = /bin/grep -F
+GCOV_PREFIX_STRIP = 6
+GIT_CHECK = yes
+GREP = /bin/grep
+HAVE_CXX11 = 1
+HAVE_VALGRIND = yes
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+INTEL_FLAGS =  -msse -DINTEL_SSE -msse2 -DINTEL_SSE2 -msse3 -DINTEL_SSE3 -mssse3 -DINTEL_SSSE3 -mpclmul -DINTEL_SSE4_PCLMUL -msse4.1 -DINTEL_SSE4 -msse4.2 -DINTEL_SSE4
+INTEL_PCLMUL_FLAGS = -mpclmul -DINTEL_SSE4_PCLMUL
+INTEL_SSE2_FLAGS = -msse2 -DINTEL_SSE2
+INTEL_SSE3_FLAGS = -msse3 -DINTEL_SSE3
+INTEL_SSE4_1_FLAGS = -msse4.1 -DINTEL_SSE4
+INTEL_SSE4_2_FLAGS = -msse4.2 -DINTEL_SSE4
+INTEL_SSE_FLAGS = -msse -DINTEL_SSE
+INTEL_SSSE3_FLAGS = -mssse3 -DINTEL_SSSE3
+JAR = 
+JAVAC = 
+JAVAH = 
+JDK_CPPFLAGS = 
+KEYUTILS_LIB = -lkeyutils
+LD = /usr/bin/ld -m elf_x86_64
+LDFLAGS = 
+LIBDPDK_CFLAGS = 
+LIBDPDK_LIBS = 
+LIBFUSE_CFLAGS = -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse
+LIBFUSE_LIBS = -lfuse -pthread
+LIBJEMALLOC = 
+LIBOBJS = 
+LIBPCIACCESS_CFLAGS = 
+LIBPCIACCESS_LIBS = 
+LIBROCKSDB_CFLAGS = 
+LIBROCKSDB_LIBS = 
+LIBS = -lboost_iostreams -lboost_system 
+LIBTCMALLOC = -ltcmalloc
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIBZFS_CFLAGS = 
+LIBZFS_LIBS = 
+LIPO = 
+LN_S = ln -s
+LTLIBOBJS = 
+LTTNG_GEN_TP_CHECK = 
+LTTNG_GEN_TP_PROG = 
+LT_SYS_LIBRARY_PATH = 
+MAKEINFO = ${SHELL} /home/jenkins-build/build/workspace/ceph-setup/missing makeinfo
+MANIFEST_TOOL = :
+MKDIR_P = /bin/mkdir -p
+NM = /usr/bin/nm -B
+NMEDIT = 
+NSS_CFLAGS = -I/usr/include/nss -I/usr/include/nspr
+NSS_LIBS = -lnss3 -lnssutil3 -lsmime3 -lssl3 -lplds4 -lplc4 -lnspr4
+OBJDUMP = objdump
+OBJEXT = o
+OTOOL = 
+OTOOL64 = 
+PACKAGE = ceph
+PACKAGE_BUGREPORT = ceph-devel at vger.kernel.org
+PACKAGE_NAME = ceph
+PACKAGE_STRING = ceph 10.2.5
+PACKAGE_TARNAME = ceph
+PACKAGE_URL = 
+PACKAGE_VERSION = 10.2.5
+PATH_SEPARATOR = :
+PKG_CONFIG = /usr/bin/pkg-config
+PKG_CONFIG_LIBDIR = 
+PKG_CONFIG_PATH = 
+PTHREAD_CC = gcc
+PTHREAD_CFLAGS = -pthread
+PTHREAD_LIBS =  -lpthread
+PYTHON = /usr/bin/python
+PYTHON_CFLAGS = -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7  -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fstack-protector-strong -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes
+PYTHON_CONFIG_CHECK = yes
+PYTHON_EXEC_PREFIX = ${exec_prefix}
+PYTHON_LDFLAGS = -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
+PYTHON_PLATFORM = linux2
+PYTHON_PREFIX = ${prefix}
+PYTHON_VERSION = 2.7
+RANLIB = ranlib
+RDYNAMIC_FLAG = -rdynamic
+RESOLV_LIBS = -lresolv
+RPM_RELEASE = 0
+SED = /bin/sed
+SET_MAKE = 
+SHELL = /bin/bash
+SPHINX_BUILD = sphinx-build
+STRIP = strip
+VERSION = 10.2.5
+WARN_ERROR_FORMAT_SECURITY = -Werror=format-security
+WARN_IGNORED_QUALIFIERS = -Wignored-qualifiers
+WARN_TYPE_LIMITS = -Wtype-limits
+XIO_LIBS = 
+YASM_CHECK = yes
+abs_builddir = /home/jenkins-build/build/workspace/ceph-setup/doc
+abs_srcdir = /home/jenkins-build/build/workspace/ceph-setup/doc
+abs_top_builddir = /home/jenkins-build/build/workspace/ceph-setup
+abs_top_srcdir = /home/jenkins-build/build/workspace/ceph-setup
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_DUMPBIN = 
+acx_pthread_config = 
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = tar --format=ustar -chf - "$$tardir"
+am__untar = tar -xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-pc-linux-gnu
+build_alias = 
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = pc
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-pc-linux-gnu
+host_alias = 
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = pc
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = ${SHELL} /home/jenkins-build/build/workspace/ceph-setup/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = /var
+mandir = ${datarootdir}/man
+mkdir_p = $(MKDIR_P)
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+pkgpyexecdir = ${pyexecdir}/ceph
+pkgpythondir = ${pythondir}/ceph
+prefix = /usr
+program_transform_name = s,x,x,
+psdir = ${docdir}
+pyexecdir = ${exec_prefix}/lib/python2.7/dist-packages
+pythondir = ${prefix}/lib/python2.7/dist-packages
+runstatedir = ${localstatedir}/run
+sbindir = /sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+subdirs =  src/gmock
+sysconfdir = /etc
+systemd_unit_dir = /lib/systemd/system
+target = x86_64-pc-linux-gnu
+target_alias = 
+target_cpu = x86_64
+target_os = linux-gnu
+target_vendor = pc
+top_build_prefix = ../
+top_builddir = ..
+top_srcdir = ..
+EXTRA_DIST = \
+	man \
+	api \
+	architecture.rst \
+	cephfs \
+	conf.py \
+	dev \
+	favicon.ico \
+	glossary.rst /
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign doc/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+tags TAGS:
+
+ctags CTAGS:
+
+cscope cscopelist:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	cscopelist-am ctags-am distclean distclean-generic \
+	distclean-libtool distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+	images /
+	index.rst /
+	install /
+	logo.png /
+	Makefile.am /
+	man /
+	mon /
+	rados /
+	radosgw /
+	rbd /
+	release-notes.rst /
+	releases.rst /
+	scripts /
+	start /
+	_templates /
+	_themes
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/doc/Makefile.am b/doc/Makefile.am
index c4bcfc7..2ca0add 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,37 +1,25 @@
 EXTRA_DIST = \
-	man/8/ceph-authtool.rst	\
-	man/8/ceph-clsinfo.rst	\
-	man/8/ceph-conf.rst	\
-	man/8/ceph-create-keys.rst	\
-	man/8/ceph-debugpack.rst	\
-	man/8/ceph-dencoder.rst	\
-	man/8/ceph-deploy.rst	\
-	man/8/ceph-detect-init.rst	\
-	man/8/ceph-disk.rst	\
-	man/8/cephfs.rst	\
-	man/8/ceph-fuse.rst	\
-	man/8/ceph-mds.rst	\
-	man/8/ceph-mon.rst	\
-	man/8/ceph-osd.rst	\
-	man/8/ceph-post-file.rst	\
-	man/8/ceph-rbdnamer.rst	\
-	man/8/ceph-rest-api.rst	\
-	man/8/ceph.rst	\
-	man/8/ceph-run.rst	\
-	man/8/ceph-syn.rst	\
-	man/8/crushtool.rst	\
-	man/8/librados-config.rst	\
-	man/8/monmaptool.rst	\
-	man/8/mount.ceph.rst	\
-	man/8/osdmaptool.rst	\
-	man/8/radosgw-admin.rst	\
-	man/8/radosgw.rst	\
-	man/8/rados.rst	\
-	man/8/rbd-fuse.rst	\
-	man/8/rbd-mirror.rst	\
-	man/8/rbd-nbd.rst	\
-	man/8/rbd-replay-many.rst	\
-	man/8/rbd-replay-prep.rst	\
-	man/8/rbd-replay.rst	\
-	man/8/rbd.rst           \
-	man/8/rbdmap.rst
+	man \
+	api \
+	architecture.rst \
+	cephfs \
+	conf.py \
+	dev \
+	favicon.ico \
+	glossary.rst /
+	images /
+	index.rst /
+	install /
+	logo.png /
+	Makefile.am /
+	man /
+	mon /
+	rados /
+	radosgw /
+	rbd /
+	release-notes.rst /
+	releases.rst /
+	scripts /
+	start /
+	_templates /
+	_themes
diff --git a/doc/Makefile.in b/doc/Makefile.in
index c3bae77..d133f4b 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,7 +14,17 @@
 
 @SET_MAKE@
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -79,7 +89,6 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = doc
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/ac_prog_jar.m4 \
@@ -98,6 +107,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/acconfig.h
 CONFIG_CLEAN_FILES =
@@ -122,13 +132,13 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -214,6 +224,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -312,6 +323,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -327,42 +339,14 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 EXTRA_DIST = \
-	man/8/ceph-authtool.rst	\
-	man/8/ceph-clsinfo.rst	\
-	man/8/ceph-conf.rst	\
-	man/8/ceph-create-keys.rst	\
-	man/8/ceph-debugpack.rst	\
-	man/8/ceph-dencoder.rst	\
-	man/8/ceph-deploy.rst	\
-	man/8/ceph-detect-init.rst	\
-	man/8/ceph-disk.rst	\
-	man/8/cephfs.rst	\
-	man/8/ceph-fuse.rst	\
-	man/8/ceph-mds.rst	\
-	man/8/ceph-mon.rst	\
-	man/8/ceph-osd.rst	\
-	man/8/ceph-post-file.rst	\
-	man/8/ceph-rbdnamer.rst	\
-	man/8/ceph-rest-api.rst	\
-	man/8/ceph.rst	\
-	man/8/ceph-run.rst	\
-	man/8/ceph-syn.rst	\
-	man/8/crushtool.rst	\
-	man/8/librados-config.rst	\
-	man/8/monmaptool.rst	\
-	man/8/mount.ceph.rst	\
-	man/8/osdmaptool.rst	\
-	man/8/radosgw-admin.rst	\
-	man/8/radosgw.rst	\
-	man/8/rados.rst	\
-	man/8/rbd-fuse.rst	\
-	man/8/rbd-mirror.rst	\
-	man/8/rbd-nbd.rst	\
-	man/8/rbd-replay-many.rst	\
-	man/8/rbd-replay-prep.rst	\
-	man/8/rbd-replay.rst	\
-	man/8/rbd.rst           \
-	man/8/rbdmap.rst
+	man \
+	api \
+	architecture.rst \
+	cephfs \
+	conf.py \
+	dev \
+	favicon.ico \
+	glossary.rst /
 
 all: all-am
 
@@ -379,7 +363,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign doc/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -554,6 +537,24 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
+	images /
+	index.rst /
+	install /
+	logo.png /
+	Makefile.am /
+	man /
+	mon /
+	rados /
+	radosgw /
+	rbd /
+	release-notes.rst /
+	releases.rst /
+	scripts /
+	start /
+	_templates /
+	_themes
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html
new file mode 100644
index 0000000..c6f5709
--- /dev/null
+++ b/doc/_templates/layout.html
@@ -0,0 +1,5 @@
+{% extends "!layout.html" %}
+
+{%- block extrahead %}
+    <script type="text/javascript" src="http://ayni.ceph.com/public/js/ceph.js"></script>
+{% endblock %}
diff --git a/doc/_templates/smarttoc.html b/doc/_templates/smarttoc.html
new file mode 100644
index 0000000..8ec60cd
--- /dev/null
+++ b/doc/_templates/smarttoc.html
@@ -0,0 +1,16 @@
+{#
+    Sphinx sidebar template: smart table of contents.
+
+    Shows a sidebar ToC that gives you a more global view of the
+    documentation, and not the confusing cur/prev/next which is the
+    default sidebar.
+
+    The ToC will open and collapse automatically to show the part of the
+    hierarchy you are in. Top-level items will always be visible.
+
+#}
+<h3><a href="{{ pathto(master_doc) }}">{{ _('Table Of Contents') }}</a></h3>
+{{ toctree(maxdepth=-1) }}
+
+<!-- ugly kludge to make genindex look like it's part of the toc -->
+<ul style="margin-top: -10px"><li class="toctree-l1"><a class="reference internal" href="{{ pathto('genindex') }}">Index</a></li></ul>
diff --git a/doc/_themes/ceph/static/nature.css_t b/doc/_themes/ceph/static/nature.css_t
new file mode 100644
index 0000000..71fb56f
--- /dev/null
+++ b/doc/_themes/ceph/static/nature.css_t
@@ -0,0 +1,310 @@
+/*
+ * nature.css_t
+ * ~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- nature theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+ 
+ at import url("basic.css");
+ 
+/* -- page layout ----------------------------------------------------------- */
+
+ at import url('http://fonts.googleapis.com/css?family=Titillium+Web:400,300,700');
+
+body {
+    font: 14px/1.4 Helvetica, Arial, sans-serif;
+    background-color: #E6E8E8;
+    color: #37424A;
+    margin: 0;
+    padding: 0;
+    border-top: 5px solid #F05C56;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 330px;
+}
+
+hr {
+    border: 1px solid #B1B4B6;
+}
+ 
+div.document {
+    background-color: #ffffff;
+}
+ 
+div.body {
+    background-color: #ffffff;
+    color: #3E4349;
+    padding: 0 30px 30px 30px;
+}
+ 
+div.footer {
+    color: #222B31;
+    width: 100%;
+    padding: 13px 0;
+    text-align: center;
+    font-size: 75%;
+}
+ 
+div.footer a {
+    color: #444;
+    text-decoration: underline;
+}
+ 
+div.related {
+    background-color: #80D2DC;
+    line-height: 32px;
+    color: #37424A;
+    // text-shadow: 0px 1px 0 #444;
+    font-size: 100%;
+    border-top: #9C4850 5px solid;
+}
+ 
+div.related a {
+    color: #37424A;
+    text-decoration: none;
+}
+
+div.related a:hover {
+    color: #fff;
+    // text-decoration: underline;
+}
+ 
+div.sphinxsidebar {
+    // font-size: 100%;
+    line-height: 1.5em;
+    width: 330px;
+}
+
+div.sphinxsidebarwrapper{
+    padding: 20px 0;
+    background-color: #efefef;
+}
+ 
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+    font-family: 'Titillium Web', sans-serif;
+    color: #e6e8e8;
+    font-size: 1.2em;
+    font-weight: 500;
+    margin: 0;
+    padding: 5px 10px;
+    background-color: #5e6a71;
+    // text-shadow: 1px 1px 0 white;
+    text-transform: uppercase;
+}
+
+div.sphinxsidebar h4{
+    font-size: 1.1em;
+}
+ 
+div.sphinxsidebar h3 a {
+    color: #e6e8e8;
+}
+ 
+ 
+div.sphinxsidebar p {
+    color: #888;
+    padding: 5px 20px;
+}
+ 
+div.sphinxsidebar p.topless {
+}
+ 
+div.sphinxsidebar ul {
+    margin: 10px 5px 10px 20px;
+    padding: 0;
+    color: #000;
+}
+ 
+div.sphinxsidebar a {
+    color: #444;
+}
+ 
+div.sphinxsidebar input {
+    border: 1px solid #ccc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar input[type=text]{
+    margin-left: 20px;
+}
+ 
+/* -- body styles ----------------------------------------------------------- */
+ 
+a {
+    color: #F05C56;
+    text-decoration: none;
+}
+
+a:hover {
+    color: #F05C56;
+    text-decoration: underline;
+}
+ 
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    margin: 30px 0px 10px 0px;
+    padding: 5px 0 5px 0px;
+    text-transform: uppercase;
+}
+ 
+div.body h1 { font: 20px/2.0 'Titillium Web'; color: #37424A; border-top: 20px solid white; margin-top: 0; }
+div.body h2 { font: 18px/1.8 'Titillium Web'; background-color: #5E6A71; color: #E6E8E8; padding: 5px 10px; }
+div.body h3 { font: 16px/1.6 'Titillium Web'; color: #37424A; }
+div.body h4 { font: 14px/1.4 Helvetica, Arial, sans-serif;  color: #37424A; }
+div.body h5 { font: 12px/1.2 Helvetica, Arial, sans-serif;  color: #37424A; }
+div.body h6 { font-size: 100%; color: #37424A; }
+
+// div.body h2 { font-size: 150%; background-color: #E6E8E8; color: #37424A; }
+// div.body h3 { font-size: 120%; background-color: #E6E8E8; color: #37424A; }
+// div.body h4 { font-size: 110%; background-color: #E6E8E8; color: #37424A; }
+// div.body h5 { font-size: 100%; background-color: #E6E8E8; color: #37424A; }
+// div.body h6 { font-size: 100%; background-color: #E6E8E8; color: #37424A; }
+ 
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+ 
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+ 
+div.body p, div.body dd, div.body li {
+    line-height: 1.5em;
+}
+ 
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.highlight {
+    background-color: white;
+}
+
+div.note {
+    background-color: #e6e8e8;
+    border: 1px solid #ccc;
+}
+ 
+div.seealso {
+    background-color: #ffc;
+    border: 1px solid #ff6;
+}
+ 
+div.topic {
+    background-color: #efefef;
+}
+ 
+div.warning {
+    background-color: #F05C56;
+    border: 1px solid #9C4850;
+    color: #fff;
+}
+ 
+p.admonition-title {
+    display: inline;
+}
+ 
+p.admonition-title:after {
+    content: ":";
+}
+ 
+pre {
+    padding: 10px;
+    background-color: White;
+    color: #222;
+    line-height: 1.2em;
+    border: 1px solid #5e6a71;
+    font-size: 1.1em;
+    margin: 1.5em;
+    -webkit-box-shadow: 1px 1px 1px #e6e8e8;
+    -moz-box-shadow: 1px 1px 1px #e6e8e8;
+}
+ 
+tt {
+    background-color: #ecf0f3;
+    color: #222;
+    /* padding: 1px 2px; */
+    font-size: 15px;
+    font-family: monospace;
+}
+
+.viewcode-back {
+    font-family: Arial, sans-serif;
+}
+
+div.viewcode-block:target {
+    background-color: #f4debf;
+    border-top: 1px solid #ac9;
+    border-bottom: 1px solid #ac9;
+}
+
+table.docutils {
+    margin: 1.5em;
+}
+
+div.sidebar {
+    border: 1px solid #5E6A71;
+    background-color: #E6E8E8;
+}
+
+div.admonition.tip {
+    background-color: #80D2DC;
+    border: 1px solid #55AEBA;
+}
+
+div.admonition.important {
+    background-color: #F05C56;
+    border: 1px solid #9C4850;
+    color: #fff;
+}
+
+div.admonition.important a {
+    color: #E6E8E8;
+}
+
+div.tip tt.literal {
+    background-color: #55aeba;
+    color: #fff;
+}
+
+div.important tt.literal {
+    background-color: #9C4850;
+    color: #fff;
+}
+
+h2 .literal {
+    color: #fff;
+    background-color: #37424a;
+}
+
+dl.glossary dt {
+	font-size: 1.0em;
+	padding-top:20px;	
+
+}
+
+p.breathe-sectiondef-title {
+    font-size: 1.3em;
+    font-weight: bold;
+    border-bottom: thin solid #5E6A71;
+}
diff --git a/doc/_themes/ceph/theme.conf b/doc/_themes/ceph/theme.conf
new file mode 100644
index 0000000..1cc4004
--- /dev/null
+++ b/doc/_themes/ceph/theme.conf
@@ -0,0 +1,4 @@
+[theme]
+inherit = basic
+stylesheet = nature.css
+pygments_style = tango
diff --git a/doc/api/index.rst b/doc/api/index.rst
new file mode 100644
index 0000000..7e65aa7
--- /dev/null
+++ b/doc/api/index.rst
@@ -0,0 +1,47 @@
+===================
+ API Documentation
+===================
+
+
+Ceph Storage Cluster APIs
+=========================
+
+See `Ceph Storage Cluster APIs`_.
+
+.. _Ceph Storage Cluster APIs: ../rados/api/
+
+
+Ceph Filesystem APIs
+====================
+
+See `libcephfs (javadoc)`_.
+
+.. _libcephfs (javadoc): libcephfs-java
+
+
+Ceph Block Device APIs
+======================
+
+See `librbdpy`_.
+
+.. _librbdpy: ../rbd/librbdpy
+
+
+Calamari APIs
+=============
+
+See `Calamari API`_.
+
+.. _Calamari API: http://ceph.com/calamari/docs/calamari_rest/index.html
+
+
+Ceph Object Store APIs
+======================
+
+- See `S3-compatible API`_.
+- See `Swift-compatible API`_.
+- See `Admin Ops API`_.
+
+.. _S3-compatible API: ../radosgw/s3/
+.. _Swift-compatible API: ../radosgw/swift/
+.. _Admin Ops API: ../radosgw/adminops
diff --git a/doc/api/libcephfs-java.rst b/doc/api/libcephfs-java.rst
new file mode 100644
index 0000000..85b5c31
--- /dev/null
+++ b/doc/api/libcephfs-java.rst
@@ -0,0 +1,9 @@
+===================
+Libcephfs (JavaDoc)
+===================
+
+..
+    The admin/build-docs script runs Ant to build the JavaDoc files, and
+    copies them to api/libcephfs-java/javadoc/.
+
+View the auto-generated `JavaDoc pages for the CephFS Java bindings <javadoc/>`_.
diff --git a/doc/architecture.rst b/doc/architecture.rst
new file mode 100644
index 0000000..96b7789
--- /dev/null
+++ b/doc/architecture.rst
@@ -0,0 +1,1600 @@
+==============
+ Architecture
+==============
+
+:term:`Ceph` uniquely delivers **object, block, and file storage** in one
+unified system. Ceph is highly reliable, easy to manage, and free. The power of
+Ceph can transform your company's IT infrastructure and your ability to manage
+vast amounts of data. Ceph delivers extraordinary scalability–thousands of
+clients accessing petabytes to exabytes of data. A :term:`Ceph Node` leverages
+commodity hardware and intelligent daemons, and a :term:`Ceph Storage Cluster`
+accommodates large numbers of nodes, which communicate with each other to
+replicate and redistribute data dynamically.
+
+.. image:: images/stack.png
+
+
+The Ceph Storage Cluster
+========================
+
+Ceph provides an infinitely scalable :term:`Ceph Storage Cluster` based upon
+:abbr:`RADOS (Reliable Autonomic Distributed Object Store)`, which you can read
+about in `RADOS - A Scalable, Reliable Storage Service for Petabyte-scale
+Storage Clusters`_.
+
+A Ceph Storage Cluster consists of two types of daemons:
+
+- :term:`Ceph Monitor`
+- :term:`Ceph OSD Daemon`
+
+.. ditaa::  +---------------+ +---------------+
+            |      OSDs     | |    Monitors   |
+            +---------------+ +---------------+
+
+A Ceph Monitor maintains a master copy of the cluster map. A cluster of Ceph
+monitors ensures high availability should a monitor daemon fail. Storage cluster
+clients retrieve a copy of the cluster map from the Ceph Monitor.
+
+A Ceph OSD Daemon checks its own state and the state of other OSDs and reports 
+back to monitors.
+
+Storage cluster clients and each :term:`Ceph OSD Daemon` use the CRUSH algorithm
+to efficiently compute information about data location, instead of having to
+depend on a central lookup table. Ceph's high-level features include providing a
+native interface to the Ceph Storage Cluster via ``librados``, and a number of
+service interfaces built on top of ``librados``.
+
+
+
+Storing Data
+------------
+
+The Ceph Storage Cluster receives data from :term:`Ceph Clients`--whether it
+comes through a :term:`Ceph Block Device`, :term:`Ceph Object Storage`, the
+:term:`Ceph Filesystem` or a custom implementation you create using
+``librados``--and it stores the data as objects. Each object corresponds to a
+file in a filesystem, which is stored on an :term:`Object Storage Device`. Ceph
+OSD Daemons handle the read/write operations on the storage disks.
+
+.. ditaa:: /-----\       +-----+       +-----+
+           | obj |------>| {d} |------>| {s} |
+           \-----/       +-----+       +-----+
+   
+            Object         File         Disk
+
+Ceph OSD Daemons store all data as objects in a flat namespace (e.g., no
+hierarchy of directories). An object has an identifier, binary data, and
+metadata consisting of a set of name/value pairs. The semantics are completely
+up to :term:`Ceph Clients`. For example, CephFS uses metadata to store file
+attributes such as the file owner, created date, last modified date, and so
+forth.
+
+
+.. ditaa:: /------+------------------------------+----------------\
+           | ID   | Binary Data                  | Metadata       |
+           +------+------------------------------+----------------+
+           | 1234 | 0101010101010100110101010010 | name1 = value1 | 
+           |      | 0101100001010100110101010010 | name2 = value2 |
+           |      | 0101100001010100110101010010 | nameN = valueN |
+           \------+------------------------------+----------------/    
+
+.. note:: An object ID is unique across the entire cluster, not just the local
+   filesystem.
+
+
+.. index:: architecture; high availability, scalability
+
+Scalability and High Availability
+---------------------------------
+
+In traditional architectures, clients talk to a centralized component (e.g., a
+gateway, broker, API, facade, etc.), which acts as a single point of entry to a
+complex subsystem. This imposes a limit to both performance and scalability,
+while introducing a single point of failure (i.e., if the centralized component
+goes down, the whole system goes down, too).
+
+Ceph eliminates the centralized gateway to enable clients to interact with 
+Ceph OSD Daemons directly. Ceph OSD Daemons create object replicas on other
+Ceph Nodes to ensure data safety and high availability. Ceph also uses a cluster
+of monitors to ensure high availability. To eliminate centralization, Ceph 
+uses an algorithm called CRUSH.
+
+
+.. index:: CRUSH; architecture
+
+CRUSH Introduction
+~~~~~~~~~~~~~~~~~~
+
+Ceph Clients and Ceph OSD Daemons both use the :abbr:`CRUSH (Controlled
+Replication Under Scalable Hashing)` algorithm to efficiently compute
+information about object location, instead of having to depend on a
+central lookup table. CRUSH provides a better data management mechanism compared
+to older approaches, and enables massive scale by cleanly distributing the work
+to all the clients and OSD daemons in the cluster. CRUSH uses intelligent data
+replication to ensure resiliency, which is better suited to hyper-scale storage.
+The following sections provide additional details on how CRUSH works. For a
+detailed discussion of CRUSH, see `CRUSH - Controlled, Scalable, Decentralized
+Placement of Replicated Data`_.
+
+.. index:: architecture; cluster map
+
+Cluster Map
+~~~~~~~~~~~
+
+Ceph depends upon Ceph Clients and Ceph OSD Daemons having knowledge of the
+cluster topology, which is inclusive of 5 maps collectively referred to as the
+"Cluster Map":
+
+#. **The Monitor Map:** Contains the cluster ``fsid``, the position, name 
+   address and port of each monitor. It also indicates the current epoch, 
+   when the map was created, and the last time it changed. To view a monitor
+   map, execute ``ceph mon dump``.   
+   
+#. **The OSD Map:** Contains the cluster ``fsid``, when the map was created and
+   last modified, a list of pools, replica sizes, PG numbers, a list of OSDs
+   and their status (e.g., ``up``, ``in``). To view an OSD map, execute
+   ``ceph osd dump``. 
+   
+#. **The PG Map:** Contains the PG version, its time stamp, the last OSD
+   map epoch, the full ratios, and details on each placement group such as
+   the PG ID, the `Up Set`, the `Acting Set`, the state of the PG (e.g., 
+   ``active + clean``), and data usage statistics for each pool.
+
+#. **The CRUSH Map:** Contains a list of storage devices, the failure domain
+   hierarchy (e.g., device, host, rack, row, room, etc.), and rules for 
+   traversing the hierarchy when storing data. To view a CRUSH map, execute
+   ``ceph osd getcrushmap -o {filename}``; then, decompile it by executing
+   ``crushtool -d {comp-crushmap-filename} -o {decomp-crushmap-filename}``.
+   You can view the decompiled map in a text editor or with ``cat``. 
+
+#. **The MDS Map:** Contains the current MDS map epoch, when the map was 
+   created, and the last time it changed. It also contains the pool for 
+   storing metadata, a list of metadata servers, and which metadata servers
+   are ``up`` and ``in``. To view an MDS map, execute ``ceph mds dump``.
+
+Each map maintains an iterative history of its operating state changes. Ceph
+Monitors maintain a master copy of the cluster map including the cluster
+members, state, changes, and the overall health of the Ceph Storage Cluster.
+
+.. index:: high availability; monitor architecture
+
+High Availability Monitors
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Before Ceph Clients can read or write data, they must contact a Ceph Monitor
+to obtain the most recent copy of the cluster map. A Ceph Storage Cluster
+can operate with a single monitor; however, this introduces a single 
+point of failure (i.e., if the monitor goes down, Ceph Clients cannot
+read or write data).
+
+For added reliability and fault tolerance, Ceph supports a cluster of monitors.
+In a cluster of monitors, latency and other faults can cause one or more
+monitors to fall behind the current state of the cluster. For this reason, Ceph
+must have agreement among various monitor instances regarding the state of the
+cluster. Ceph always uses a majority of monitors (e.g., 1, 2:3, 3:5, 4:6, etc.)
+and the `Paxos`_ algorithm to establish a consensus among the monitors about the
+current state of the cluster.
+
+For details on configuring monitors, see the `Monitor Config Reference`_.
+
+.. index:: architecture; high availability authentication
+
+High Availability Authentication
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To identify users and protect against man-in-the-middle attacks, Ceph provides
+its ``cephx`` authentication system to authenticate users and daemons.
+
+.. note:: The ``cephx`` protocol does not address data encryption in transport 
+   (e.g., SSL/TLS) or encryption at rest.
+
+Cephx uses shared secret keys for authentication, meaning both the client and
+the monitor cluster have a copy of the client's secret key. The authentication
+protocol is such that both parties are able to prove to each other they have a
+copy of the key without actually revealing it. This provides mutual
+authentication, which means the cluster is sure the user possesses the secret
+key, and the user is sure that the cluster has a copy of the secret key.
+
+A key scalability feature of Ceph is to avoid a centralized interface to the
+Ceph object store, which means that Ceph clients must be able to interact with
+OSDs directly. To protect data, Ceph provides its ``cephx`` authentication
+system, which authenticates users operating Ceph clients. The ``cephx`` protocol
+operates in a manner with behavior similar to `Kerberos`_. 
+
+A user/actor invokes a Ceph client to contact a monitor. Unlike Kerberos, each
+monitor can authenticate users and distribute keys, so there is no single point
+of failure or bottleneck when using ``cephx``. The monitor returns an
+authentication data structure similar to a Kerberos ticket that contains a
+session key for use in obtaining Ceph services.  This session key is itself
+encrypted with the user's permanent  secret key, so that only the user can
+request services from the Ceph monitor(s). The client then uses the session key
+to request its desired services from the monitor, and the monitor provides the
+client with a ticket that will authenticate the client to the OSDs that actually
+handle data. Ceph monitors and OSDs share a secret, so the client can use the
+ticket provided by the monitor with any OSD or metadata server in the cluster.
+Like Kerberos, ``cephx`` tickets expire, so an attacker cannot use an expired
+ticket or session key obtained surreptitiously. This form of authentication will
+prevent attackers with access to the communications medium from either creating
+bogus messages under another user's identity or altering another user's
+legitimate messages, as long as the user's secret key is not divulged before it
+expires.
+
+To use ``cephx``, an administrator must set up users first. In the following
+diagram, the ``client.admin`` user invokes  ``ceph auth get-or-create-key`` from
+the command line to generate a username and secret key. Ceph's ``auth``
+subsystem generates the username and key, stores a copy with the monitor(s) and
+transmits the user's secret back to the ``client.admin`` user. This means that 
+the client and the monitor share a secret key.
+
+.. note:: The ``client.admin`` user must provide the user ID and 
+   secret key to the user in a secure manner. 
+
+.. ditaa:: +---------+     +---------+
+           | Client  |     | Monitor |
+           +---------+     +---------+
+                |  request to   |
+                | create a user |
+                |-------------->|----------+ create user
+                |               |          | and                 
+                |<--------------|<---------+ store key
+                | transmit key  |
+                |               |
+
+
+To authenticate with the monitor, the client passes in the user name to the
+monitor, and the monitor generates a session key and encrypts it with the secret
+key associated to the user name. Then, the monitor transmits the encrypted
+ticket back to the client. The client then decrypts the payload with the shared
+secret key to retrieve the session key. The session key identifies the user for
+the current session. The client then requests a ticket on behalf of the user
+signed by the session key. The monitor generates a ticket, encrypts it with the
+user's secret key and transmits it back to the client. The client decrypts the
+ticket and uses it to sign requests to OSDs and metadata servers throughout the
+cluster.
+
+.. ditaa:: +---------+     +---------+
+           | Client  |     | Monitor |
+           +---------+     +---------+
+                |  authenticate |
+                |-------------->|----------+ generate and
+                |               |          | encrypt                
+                |<--------------|<---------+ session key
+                | transmit      |
+                | encrypted     |
+                | session key   |
+                |               |             
+                |-----+ decrypt |
+                |     | session | 
+                |<----+ key     |              
+                |               |
+                |  req. ticket  |
+                |-------------->|----------+ generate and
+                |               |          | encrypt                
+                |<--------------|<---------+ ticket
+                | recv. ticket  |
+                |               |             
+                |-----+ decrypt |
+                |     | ticket  | 
+                |<----+         |              
+
+
+The ``cephx`` protocol authenticates ongoing communications between the client
+machine and the Ceph servers. Each message sent between a client and server,
+subsequent to the initial authentication, is signed using a ticket that the
+monitors, OSDs and metadata servers can verify with their shared secret.
+
+.. ditaa:: +---------+     +---------+     +-------+     +-------+
+           |  Client |     | Monitor |     |  MDS  |     |  OSD  |
+           +---------+     +---------+     +-------+     +-------+
+                |  request to   |              |             |
+                | create a user |              |             |               
+                |-------------->| mon and      |             |
+                |<--------------| client share |             |
+                |    receive    | a secret.    |             |
+                | shared secret |              |             |
+                |               |<------------>|             |
+                |               |<-------------+------------>|
+                |               | mon, mds,    |             |
+                | authenticate  | and osd      |             |  
+                |-------------->| share        |             |
+                |<--------------| a secret     |             |
+                |  session key  |              |             |
+                |               |              |             |
+                |  req. ticket  |              |             |
+                |-------------->|              |             |
+                |<--------------|              |             |
+                | recv. ticket  |              |             |
+                |               |              |             |
+                |   make request (CephFS only) |             |
+                |----------------------------->|             |
+                |<-----------------------------|             |
+                | receive response (CephFS only)             |
+                |                                            |
+                |                make request                |
+                |------------------------------------------->|  
+                |<-------------------------------------------|
+                               receive response
+
+The protection offered by this authentication is between the Ceph client and the
+Ceph server hosts. The authentication is not extended beyond the Ceph client. If
+the user accesses the Ceph client from a remote host, Ceph authentication is not
+applied to the connection between the user's host and the client host.
+
+
+For configuration details, see `Cephx Config Guide`_. For user management 
+details, see `User Management`_.
+
+
+.. index:: architecture; smart daemons and scalability
+
+Smart Daemons Enable Hyperscale
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In many clustered architectures, the primary purpose of cluster membership is 
+so that a centralized interface knows which nodes it can access. Then the
+centralized interface provides services to the client through a double
+dispatch--which is a **huge** bottleneck at the petabyte-to-exabyte scale.
+
+Ceph eliminates the bottleneck: Ceph's OSD Daemons AND Ceph Clients are cluster
+aware. Like Ceph clients, each Ceph OSD Daemon knows about other Ceph OSD
+Daemons in the cluster.  This enables Ceph OSD Daemons to interact directly with
+other Ceph OSD Daemons and Ceph monitors. Additionally, it enables Ceph Clients
+to interact directly with Ceph OSD Daemons.
+
+The ability of Ceph Clients, Ceph Monitors and Ceph OSD Daemons to interact with
+each other means that Ceph OSD Daemons can utilize the CPU and RAM of the Ceph
+nodes to easily perform tasks that would bog down a centralized server. The
+ability to leverage this computing power leads to several major benefits:
+
+#. **OSDs Service Clients Directly:** Since any network device has a limit to 
+   the number of concurrent connections it can support, a centralized system 
+   has a low physical limit at high scales. By enabling Ceph Clients to contact 
+   Ceph OSD Daemons directly, Ceph increases both performance and total system 
+   capacity simultaneously, while removing a single point of failure. Ceph 
+   Clients can maintain a session when they need to, and with a particular Ceph 
+   OSD Daemon instead of a centralized server.
+
+#. **OSD Membership and Status**: Ceph OSD Daemons join a cluster and report 
+   on their status. At the lowest level, the Ceph OSD Daemon status is ``up`` 
+   or ``down`` reflecting whether or not it is running and able to service 
+   Ceph Client requests. If a Ceph OSD Daemon is ``down`` and ``in`` the Ceph 
+   Storage Cluster, this status may indicate the failure of the Ceph OSD 
+   Daemon. If a Ceph OSD Daemon is not running (e.g., it crashes), the Ceph OSD 
+   Daemon cannot notify the Ceph Monitor that it is ``down``. The Ceph Monitor 
+   can ping a Ceph OSD Daemon periodically to ensure that it is running. 
+   However, Ceph also empowers Ceph OSD Daemons to determine if a neighboring 
+   OSD is ``down``, to update the cluster map and to report it to the Ceph 
+   monitor(s). This means that Ceph monitors can remain light weight processes. 
+   See `Monitoring OSDs`_ and `Heartbeats`_ for additional details.
+   
+#. **Data Scrubbing:** As part of maintaining data consistency and cleanliness, 
+   Ceph OSD Daemons can scrub objects within placement groups. That is, Ceph 
+   OSD Daemons can compare object metadata in one placement group with its 
+   replicas in placement groups stored on other OSDs. Scrubbing (usually 
+   performed daily) catches bugs or filesystem errors. Ceph OSD Daemons also 
+   perform deeper scrubbing by comparing data in objects bit-for-bit. Deep 
+   scrubbing (usually performed weekly) finds bad sectors on a drive that 
+   weren't apparent in a light scrub. See `Data Scrubbing`_ for details on 
+   configuring scrubbing.
+
+#. **Replication:** Like Ceph Clients, Ceph OSD Daemons use the CRUSH 
+   algorithm, but the Ceph OSD Daemon uses it to compute where replicas of 
+   objects should be stored (and for rebalancing). In a typical write scenario, 
+   a client uses the CRUSH algorithm to compute where to store an object, maps 
+   the object to a pool and placement group, then looks at the CRUSH map to 
+   identify the primary OSD for the placement group.
+   
+   The client writes the object to the identified placement group in the 
+   primary OSD. Then, the primary OSD with its own copy of the CRUSH map 
+   identifies the secondary and tertiary OSDs for replication purposes, and 
+   replicates the object to the appropriate placement groups in the secondary 
+   and tertiary OSDs (as many OSDs as additional replicas), and responds to the
+   client once it has confirmed the object was stored successfully.
+
+.. ditaa:: 
+             +----------+
+             |  Client  |
+             |          |
+             +----------+
+                 *  ^
+      Write (1)  |  |  Ack (6)
+                 |  |
+                 v  *
+            +-------------+
+            | Primary OSD |
+            |             |
+            +-------------+
+              *  ^   ^  *
+    Write (2) |  |   |  |  Write (3)
+       +------+  |   |  +------+
+       |  +------+   +------+  |
+       |  | Ack (4)  Ack (5)|  | 
+       v  *                 *  v
+ +---------------+   +---------------+
+ | Secondary OSD |   | Tertiary OSD  |
+ |               |   |               |
+ +---------------+   +---------------+
+
+With the ability to perform data replication, Ceph OSD Daemons relieve Ceph
+clients from that duty, while ensuring high data availability and data safety.
+
+
+Dynamic Cluster Management
+--------------------------
+
+In the `Scalability and High Availability`_ section, we explained how Ceph uses
+CRUSH, cluster awareness and intelligent daemons to scale and maintain high
+availability. Key to Ceph's design is the autonomous, self-healing, and
+intelligent Ceph OSD Daemon. Let's take a deeper look at how CRUSH works to
+enable modern cloud storage infrastructures to place data, rebalance the cluster
+and recover from faults dynamically.
+
+.. index:: architecture; pools
+
+About Pools
+~~~~~~~~~~~
+
+The Ceph storage system supports the notion of 'Pools', which are logical
+partitions for storing objects.
+
+Ceph Clients retrieve a `Cluster Map`_ from a Ceph Monitor, and write objects to
+pools. The pool's ``size`` or number of replicas, the CRUSH ruleset and the
+number of placement groups determine how Ceph will place the data.
+
+.. ditaa:: 
+            +--------+  Retrieves  +---------------+
+            | Client |------------>|  Cluster Map  |
+            +--------+             +---------------+
+                 |
+                 v      Writes
+              /-----\
+              | obj |
+              \-----/
+                 |      To
+                 v
+            +--------+           +---------------+
+            |  Pool  |---------->| CRUSH Ruleset |
+            +--------+  Selects  +---------------+
+                 
+
+Pools set at least the following parameters:
+
+- Ownership/Access to Objects
+- The Number of Placement Groups, and 
+- The CRUSH Ruleset to Use.
+
+See `Set Pool Values`_ for details.
+
+
+.. index: architecture; placement group mapping
+
+Mapping PGs to OSDs
+~~~~~~~~~~~~~~~~~~~
+
+Each pool has a number of placement groups. CRUSH maps PGs to OSDs dynamically.
+When a Ceph Client stores objects, CRUSH will map each object to a placement
+group.
+
+Mapping objects to placement groups creates a layer of indirection between the
+Ceph OSD Daemon and the Ceph Client. The Ceph Storage Cluster must be able to
+grow (or shrink) and rebalance where it stores objects dynamically. If the Ceph
+Client "knew" which Ceph OSD Daemon had which object, that would create a tight
+coupling between the Ceph Client and the Ceph OSD Daemon. Instead, the CRUSH
+algorithm maps each object to a placement group and then maps each placement
+group to one or more Ceph OSD Daemons. This layer of indirection allows Ceph to
+rebalance dynamically when new Ceph OSD Daemons and the underlying OSD devices
+come online. The following diagram depicts how CRUSH maps objects to placement
+groups, and placement groups to OSDs.
+
+.. ditaa:: 
+           /-----\  /-----\  /-----\  /-----\  /-----\
+           | obj |  | obj |  | obj |  | obj |  | obj |
+           \-----/  \-----/  \-----/  \-----/  \-----/
+              |        |        |        |        |
+              +--------+--------+        +---+----+
+              |                              |
+              v                              v
+   +-----------------------+      +-----------------------+
+   |  Placement Group #1   |      |  Placement Group #2   |
+   |                       |      |                       |
+   +-----------------------+      +-----------------------+
+               |                              |
+               |      +-----------------------+---+
+        +------+------+-------------+             |
+        |             |             |             |
+        v             v             v             v
+   /----------\  /----------\  /----------\  /----------\ 
+   |          |  |          |  |          |  |          |
+   |  OSD #1  |  |  OSD #2  |  |  OSD #3  |  |  OSD #4  |
+   |          |  |          |  |          |  |          |
+   \----------/  \----------/  \----------/  \----------/  
+
+With a copy of the cluster map and the CRUSH algorithm, the client can compute
+exactly which OSD to use when reading or writing a particular object.
+
+.. index:: architecture; calculating PG IDs
+
+Calculating PG IDs
+~~~~~~~~~~~~~~~~~~
+
+When a Ceph Client binds to a Ceph Monitor, it retrieves the latest copy of the
+`Cluster Map`_. With the cluster map, the client knows about all of the monitors,
+OSDs, and metadata servers in the cluster. **However, it doesn't know anything
+about object locations.** 
+
+.. epigraph:: 
+
+	Object locations get computed.
+
+
+The only input required by the client is the object ID and the pool.
+It's simple: Ceph stores data in named pools (e.g., "liverpool"). When a client
+wants to store a named object (e.g., "john," "paul," "george," "ringo", etc.)
+it calculates a placement group using the object name, a hash code, the
+number of PGs in the pool and the pool name. Ceph clients use the following
+steps to compute PG IDs.
+
+#. The client inputs the pool ID and the object ID. (e.g., pool = "liverpool" 
+   and object-id = "john")
+#. Ceph takes the object ID and hashes it.
+#. Ceph calculates the hash modulo the number of PGs. (e.g., ``58``) to get 
+   a PG ID.
+#. Ceph gets the pool ID given the pool name (e.g., "liverpool" = ``4``)
+#. Ceph prepends the pool ID to the PG ID (e.g., ``4.58``).
+
+Computing object locations is much faster than performing object location query
+over a chatty session. The :abbr:`CRUSH (Controlled Replication Under Scalable
+Hashing)` algorithm allows a client to compute where objects *should* be stored,
+and enables the client to contact the primary OSD to store or retrieve the
+objects.
+
+.. index:: architecture; PG Peering
+
+Peering and Sets
+~~~~~~~~~~~~~~~~
+
+In previous sections, we noted that Ceph OSD Daemons check each others
+heartbeats and report back to the Ceph Monitor. Another thing Ceph OSD daemons
+do is called 'peering', which is the process of bringing all of the OSDs that
+store a Placement Group (PG) into agreement about the state of all of the
+objects (and their metadata) in that PG. In fact, Ceph OSD Daemons `Report
+Peering Failure`_ to the Ceph Monitors. Peering issues  usually resolve
+themselves; however, if the problem persists, you may need to refer to the
+`Troubleshooting Peering Failure`_ section.
+
+.. Note:: Agreeing on the state does not mean that the PGs have the latest contents.
+
+The Ceph Storage Cluster was designed to store at least two copies of an object
+(i.e., ``size = 2``), which is the minimum requirement for data safety. For high
+availability, a Ceph Storage Cluster should store more than two copies of an object
+(e.g., ``size = 3`` and ``min size = 2``) so that it can continue to run in a 
+``degraded`` state while maintaining data safety.
+
+Referring back to the diagram in `Smart Daemons Enable Hyperscale`_, we do not 
+name the Ceph OSD Daemons specifically (e.g., ``osd.0``, ``osd.1``, etc.), but 
+rather refer to them as *Primary*, *Secondary*, and so forth. By convention, 
+the *Primary* is the first OSD in the *Acting Set*, and is responsible for 
+coordinating the peering process for each placement group where it acts as 
+the *Primary*, and is the **ONLY** OSD that that will accept client-initiated 
+writes to objects for a given placement group where it acts as the *Primary*.
+
+When a series of OSDs are responsible for a placement group, that series of
+OSDs, we refer to them as an *Acting Set*. An *Acting Set* may refer to the Ceph
+OSD Daemons that are currently responsible for the placement group, or the Ceph
+OSD Daemons that were responsible  for a particular placement group as of some
+epoch.
+
+The Ceph OSD daemons that are part of an *Acting Set* may not always be  ``up``.
+When an OSD in the *Acting Set* is ``up``, it is part of the  *Up Set*. The *Up
+Set* is an important distinction, because Ceph can remap PGs to other Ceph OSD
+Daemons when an OSD fails. 
+
+.. note:: In an *Acting Set* for a PG containing ``osd.25``, ``osd.32`` and 
+   ``osd.61``, the first OSD, ``osd.25``, is the *Primary*. If that OSD fails,
+   the Secondary, ``osd.32``, becomes the *Primary*, and ``osd.25`` will be 
+   removed from the *Up Set*.
+
+
+.. index:: architecture; Rebalancing
+
+Rebalancing
+~~~~~~~~~~~
+
+When you add a Ceph OSD Daemon to a Ceph Storage Cluster, the cluster map gets
+updated with the new OSD. Referring back to `Calculating PG IDs`_, this changes
+the cluster map. Consequently, it changes object placement, because it changes
+an input for the calculations. The following diagram depicts the rebalancing
+process (albeit rather crudely, since it is substantially less impactful with
+large clusters) where some, but not all of the PGs migrate from existing OSDs
+(OSD 1, and OSD 2) to the new OSD (OSD 3). Even when rebalancing, CRUSH is
+stable. Many of the placement groups remain in their original configuration,
+and each OSD gets some added capacity, so there are no load spikes on the 
+new OSD after rebalancing is complete.
+
+
+.. ditaa:: 
+           +--------+     +--------+
+   Before  |  OSD 1 |     |  OSD 2 |
+           +--------+     +--------+
+           |  PG #1 |     | PG #6  |
+           |  PG #2 |     | PG #7  |
+           |  PG #3 |     | PG #8  |
+           |  PG #4 |     | PG #9  |
+           |  PG #5 |     | PG #10 |
+           +--------+     +--------+
+
+           +--------+     +--------+     +--------+
+    After  |  OSD 1 |     |  OSD 2 |     |  OSD 3 |
+           +--------+     +--------+     +--------+
+           |  PG #1 |     | PG #7  |     |  PG #3 |
+           |  PG #2 |     | PG #8  |     |  PG #6 |
+           |  PG #4 |     | PG #10 |     |  PG #9 |
+           |  PG #5 |     |        |     |        |
+           |        |     |        |     |        |
+           +--------+     +--------+     +--------+
+
+
+.. index:: architecture; Data Scrubbing
+
+Data Consistency
+~~~~~~~~~~~~~~~~
+
+As part of maintaining data consistency and cleanliness, Ceph OSDs can also
+scrub objects within placement groups. That is, Ceph OSDs can compare object
+metadata in one placement group with its replicas in placement groups stored in
+other OSDs. Scrubbing (usually performed daily) catches OSD bugs or filesystem
+errors.  OSDs can also perform deeper scrubbing by comparing data in objects
+bit-for-bit.  Deep scrubbing (usually performed weekly) finds bad sectors on a
+disk that weren't apparent in a light scrub.
+
+See `Data Scrubbing`_ for details on configuring scrubbing.
+
+
+
+
+
+.. index:: erasure coding
+
+Erasure Coding
+--------------
+
+An erasure coded pool stores each object as ``K+M`` chunks. It is divided into
+``K`` data chunks and ``M`` coding chunks. The pool is configured to have a size
+of ``K+M`` so that each chunk is stored in an OSD in the acting set. The rank of
+the chunk is stored as an attribute of the object.
+
+For instance an erasure coded pool is created to use five OSDs (``K+M = 5``) and
+sustain the loss of two of them (``M = 2``).
+
+Reading and Writing Encoded Chunks
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When the object **NYAN** containing ``ABCDEFGHI`` is written to the pool, the erasure
+encoding function splits the content into three data chunks simply by dividing
+the content in three: the first contains ``ABC``, the second ``DEF`` and the
+last ``GHI``. The content will be padded if the content length is not a multiple
+of ``K``. The function also creates two coding chunks: the fourth with ``YXY``
+and the fifth with ``GQC``. Each chunk is stored in an OSD in the acting set.
+The chunks are stored in objects that have the same name (**NYAN**) but reside
+on different OSDs. The order in which the chunks were created must be preserved
+and is stored as an attribute of the object (``shard_t``), in addition to its
+name. Chunk 1 contains ``ABC`` and is stored on **OSD5** while chunk 4 contains
+``YXY`` and is stored on **OSD3**.
+
+
+.. ditaa::
+                            +-------------------+
+                       name |       NYAN        |
+                            +-------------------+
+                    content |     ABCDEFGHI     |
+                            +--------+----------+
+                                     |
+                                     |
+                                     v
+                              +------+------+
+              +---------------+ encode(3,2) +-----------+
+              |               +--+--+---+---+           |
+              |                  |  |   |               |
+              |          +-------+  |   +-----+         |
+              |          |          |         |         |
+           +--v---+   +--v---+   +--v---+  +--v---+  +--v---+
+     name  | NYAN |   | NYAN |   | NYAN |  | NYAN |  | NYAN |
+           +------+   +------+   +------+  +------+  +------+
+    shard  |  1   |   |  2   |   |  3   |  |  4   |  |  5   |
+           +------+   +------+   +------+  +------+  +------+
+  content  | ABC  |   | DEF  |   | GHI  |  | YXY  |  | QGC  |
+           +--+---+   +--+---+   +--+---+  +--+---+  +--+---+
+              |          |          |         |         |
+              |          |          v         |         |
+              |          |       +--+---+     |         |
+              |          |       | OSD1 |     |         |
+              |          |       +------+     |         |
+              |          |                    |         |
+              |          |       +------+     |         |
+              |          +------>| OSD2 |     |         |
+              |                  +------+     |         |
+              |                               |         |
+              |                  +------+     |         |
+              |                  | OSD3 |<----+         |
+              |                  +------+               |
+              |                                         |
+              |                  +------+               |
+              |                  | OSD4 |<--------------+
+              |                  +------+
+              |
+              |                  +------+
+              +----------------->| OSD5 |
+                                 +------+
+
+
+When the object **NYAN** is read from the erasure coded pool, the decoding
+function reads three chunks: chunk 1 containing ``ABC``, chunk 3 containing
+``GHI`` and chunk 4 containing ``YXY``. Then, it rebuilds the original content
+of the object ``ABCDEFGHI``. The decoding function is informed that the chunks 2
+and 5 are missing (they are called 'erasures'). The chunk 5 could not be read
+because the **OSD4** is out. The decoding function can be called as soon as
+three chunks are read: **OSD2** was the slowest and its chunk was not taken into
+account.
+
+.. ditaa::
+	                         +-------------------+
+	                    name |       NYAN        |
+	                         +-------------------+
+	                 content |     ABCDEFGHI     |
+	                         +---------+---------+
+	                                   ^
+	                                   |
+	                                   |
+	                           +-------+-------+
+	                           |  decode(3,2)  |
+	            +------------->+  erasures 2,5 +<-+
+	            |              |               |  |
+	            |              +-------+-------+  |
+	            |                      ^          |
+	            |                      |          | 
+	            |                      |          |
+	         +--+---+   +------+   +---+--+   +---+--+
+	   name  | NYAN |   | NYAN |   | NYAN |   | NYAN |
+	         +------+   +------+   +------+   +------+
+	  shard  |  1   |   |  2   |   |  3   |   |  4   |
+	         +------+   +------+   +------+   +------+
+	content  | ABC  |   | DEF  |   | GHI  |   | YXY  |
+	         +--+---+   +--+---+   +--+---+   +--+---+
+	            ^          .          ^          ^
+	            |    TOO   .          |          |
+	            |    SLOW  .       +--+---+      |
+	            |          ^       | OSD1 |      |
+	            |          |       +------+      |
+	            |          |                     |
+	            |          |       +------+      |
+	            |          +-------| OSD2 |      |
+	            |                  +------+      |
+	            |                                |
+	            |                  +------+      |
+	            |                  | OSD3 |------+
+	            |                  +------+
+	            |
+	            |                  +------+
+	            |                  | OSD4 | OUT
+	            |                  +------+
+	            |
+	            |                  +------+
+	            +------------------| OSD5 |
+	                               +------+
+
+
+Interrupted Full Writes
+~~~~~~~~~~~~~~~~~~~~~~~
+
+In an erasure coded pool, the primary OSD in the up set receives all write
+operations. It is responsible for encoding the payload into ``K+M`` chunks and
+sends them to the other OSDs. It is also responsible for maintaining an
+authoritative version of the placement group logs.
+
+In the following diagram, an erasure coded placement group has been created with
+``K = 2 + M = 1`` and is supported by three OSDs, two for ``K`` and one for
+``M``. The acting set of the placement group is made of **OSD 1**, **OSD 2** and
+**OSD 3**. An object has been encoded and stored in the OSDs : the chunk
+``D1v1`` (i.e. Data chunk number 1, version 1) is on **OSD 1**, ``D2v1`` on
+**OSD 2** and ``C1v1`` (i.e. Coding chunk number 1, version 1) on **OSD 3**. The
+placement group logs on each OSD are identical (i.e. ``1,1`` for epoch 1,
+version 1).
+
+
+.. ditaa::
+     Primary OSD
+    
+   +-------------+
+   |    OSD 1    |             +-------------+
+   |         log |  Write Full |             |
+   |  +----+     |<------------+ Ceph Client |
+   |  |D1v1| 1,1 |      v1     |             |
+   |  +----+     |             +-------------+
+   +------+------+
+          |
+          |
+          |          +-------------+
+          |          |    OSD 2    |
+          |          |         log |
+          +--------->+  +----+     |
+          |          |  |D2v1| 1,1 |
+          |          |  +----+     |
+          |          +-------------+
+          |
+          |          +-------------+
+          |          |    OSD 3    |
+          |          |         log |
+          +--------->|  +----+     |
+                     |  |C1v1| 1,1 |
+                     |  +----+     |
+                     +-------------+
+
+**OSD 1** is the primary and receives a **WRITE FULL** from a client, which
+means the payload is to replace the object entirely instead of overwriting a
+portion of it. Version 2 (v2) of the object is created to override version 1
+(v1). **OSD 1** encodes the payload into three chunks: ``D1v2`` (i.e. Data
+chunk number 1 version 2) will be on **OSD 1**, ``D2v2`` on **OSD 2** and
+``C1v2`` (i.e. Coding chunk number 1 version 2) on **OSD 3**. Each chunk is sent
+to the target OSD, including the primary OSD which is responsible for storing
+chunks in addition to handling write operations and maintaining an authoritative
+version of the placement group logs. When an OSD receives the message
+instructing it to write the chunk, it also creates a new entry in the placement
+group logs to reflect the change. For instance, as soon as **OSD 3** stores
+``C1v2``, it adds the entry ``1,2`` ( i.e. epoch 1, version 2 ) to its logs.
+Because the OSDs work asynchronously, some chunks may still be in flight ( such
+as ``D2v2`` ) while others are acknowledged and on disk ( such as ``C1v1`` and
+``D1v1``).
+
+.. ditaa::
+
+     Primary OSD
+    
+   +-------------+
+   |    OSD 1    |
+   |         log |
+   |  +----+     |             +-------------+
+   |  |D1v2| 1,2 |  Write Full |             |
+   |  +----+     +<------------+ Ceph Client |
+   |             |      v2     |             |
+   |  +----+     |             +-------------+
+   |  |D1v1| 1,1 |           
+   |  +----+     |           
+   +------+------+           
+          |                  
+          |                  
+          |           +------+------+
+          |           |    OSD 2    |
+          |  +------+ |         log |
+          +->| D2v2 | |  +----+     |
+          |  +------+ |  |D2v1| 1,1 |
+          |           |  +----+     |
+          |           +-------------+
+          |
+          |           +-------------+
+          |           |    OSD 3    |
+          |           |         log |
+          |           |  +----+     |
+          |           |  |C1v2| 1,2 |
+          +---------->+  +----+     |
+                      |             |
+                      |  +----+     |
+                      |  |C1v1| 1,1 |
+                      |  +----+     |
+                      +-------------+
+
+
+If all goes well, the chunks are acknowledged on each OSD in the acting set and
+the logs' ``last_complete`` pointer can move from ``1,1`` to ``1,2``.
+
+.. ditaa::
+
+     Primary OSD
+    
+   +-------------+
+   |    OSD 1    |
+   |         log |
+   |  +----+     |             +-------------+
+   |  |D1v2| 1,2 |  Write Full |             |
+   |  +----+     +<------------+ Ceph Client |
+   |             |      v2     |             |
+   |  +----+     |             +-------------+
+   |  |D1v1| 1,1 |           
+   |  +----+     |           
+   +------+------+           
+          |                  
+          |           +-------------+
+          |           |    OSD 2    |
+          |           |         log |
+          |           |  +----+     |
+          |           |  |D2v2| 1,2 |
+          +---------->+  +----+     |
+          |           |             |
+          |           |  +----+     |
+          |           |  |D2v1| 1,1 |
+          |           |  +----+     |
+          |           +-------------+
+          |                  
+          |           +-------------+
+          |           |    OSD 3    |
+          |           |         log |
+          |           |  +----+     |
+          |           |  |C1v2| 1,2 |
+          +---------->+  +----+     |
+                      |             |
+                      |  +----+     |
+                      |  |C1v1| 1,1 |
+                      |  +----+     |
+                      +-------------+
+
+
+Finally, the files used to store the chunks of the previous version of the
+object can be removed: ``D1v1`` on **OSD 1**, ``D2v1`` on **OSD 2** and ``C1v1``
+on **OSD 3**.
+
+.. ditaa::
+     Primary OSD
+    
+   +-------------+
+   |    OSD 1    |
+   |         log |
+   |  +----+     |
+   |  |D1v2| 1,2 |
+   |  +----+     |
+   +------+------+
+          |
+          |
+          |          +-------------+
+          |          |    OSD 2    |
+          |          |         log |
+          +--------->+  +----+     |
+          |          |  |D2v2| 1,2 |
+          |          |  +----+     |
+          |          +-------------+
+          |
+          |          +-------------+
+          |          |    OSD 3    |
+          |          |         log |
+          +--------->|  +----+     |
+                     |  |C1v2| 1,2 |
+                     |  +----+     |
+                     +-------------+
+
+
+But accidents happen. If **OSD 1** goes down while ``D2v2`` is still in flight,
+the object's version 2 is partially written: **OSD 3** has one chunk but that is
+not enough to recover. It lost two chunks: ``D1v2`` and ``D2v2`` and the
+erasure coding parameters ``K = 2``, ``M = 1`` require that at least two chunks are
+available to rebuild the third. **OSD 4** becomes the new primary and finds that
+the ``last_complete`` log entry (i.e., all objects before this entry were known
+to be available on all OSDs in the previous acting set ) is ``1,1`` and that
+will be the head of the new authoritative log.
+
+.. ditaa::
+   +-------------+
+   |    OSD 1    |
+   |   (down)    |
+   | c333        |
+   +------+------+
+          |                  
+          |           +-------------+
+          |           |    OSD 2    |
+          |           |         log |
+          |           |  +----+     |
+          +---------->+  |D2v1| 1,1 |
+          |           |  +----+     |
+          |           |             |
+          |           +-------------+
+          |                  
+          |           +-------------+
+          |           |    OSD 3    |
+          |           |         log |
+          |           |  +----+     |
+          |           |  |C1v2| 1,2 |
+          +---------->+  +----+     |
+                      |             |
+                      |  +----+     |
+                      |  |C1v1| 1,1 |
+                      |  +----+     |
+                      +-------------+
+     Primary OSD
+   +-------------+
+   |    OSD 4    |
+   |         log |
+   |             |
+   |         1,1 |
+   |             |
+   +------+------+
+          
+
+
+The log entry 1,2 found on **OSD 3** is divergent from the new authoritative log
+provided by **OSD 4**: it is discarded and the file containing the ``C1v2``
+chunk is removed. The ``D1v1`` chunk is rebuilt with the ``decode`` function of
+the erasure coding library during scrubbing and stored on the new primary 
+**OSD 4**.
+
+
+.. ditaa::
+     Primary OSD
+    
+   +-------------+
+   |    OSD 4    |
+   |         log |
+   |  +----+     |
+   |  |D1v1| 1,1 |
+   |  +----+     |
+   +------+------+
+          ^
+          |
+          |          +-------------+
+          |          |    OSD 2    |
+          |          |         log |
+          +----------+  +----+     |
+          |          |  |D2v1| 1,1 |
+          |          |  +----+     |
+          |          +-------------+
+          |
+          |          +-------------+
+          |          |    OSD 3    |
+          |          |         log |
+          +----------|  +----+     |
+                     |  |C1v1| 1,1 |
+                     |  +----+     |
+                     +-------------+
+
+   +-------------+
+   |    OSD 1    |
+   |   (down)    |
+   | c333        |
+   +-------------+
+
+See `Erasure Code Notes`_ for additional details.
+
+
+
+Cache Tiering
+-------------
+
+A cache tier provides Ceph Clients with better I/O performance for a subset of
+the data stored in a backing storage tier. Cache tiering involves creating a
+pool of relatively fast/expensive storage devices (e.g., solid state drives)
+configured to act as a cache tier, and a backing pool of either erasure-coded
+or relatively slower/cheaper devices configured to act as an economical storage
+tier. The Ceph objecter handles where to place the objects and the tiering
+agent determines when to flush objects from the cache to the backing storage
+tier. So the cache tier and the backing storage tier are completely transparent 
+to Ceph clients.
+
+
+.. ditaa:: 
+           +-------------+
+           | Ceph Client |
+           +------+------+
+                  ^
+     Tiering is   |  
+    Transparent   |              Faster I/O
+        to Ceph   |           +---------------+
+     Client Ops   |           |               |   
+                  |    +----->+   Cache Tier  |
+                  |    |      |               |
+                  |    |      +-----+---+-----+
+                  |    |            |   ^ 
+                  v    v            |   |   Active Data in Cache Tier
+           +------+----+--+         |   |
+           |   Objecter   |         |   |
+           +-----------+--+         |   |
+                       ^            |   |   Inactive Data in Storage Tier
+                       |            v   |
+                       |      +-----+---+-----+
+                       |      |               |
+                       +----->|  Storage Tier |
+                              |               |
+                              +---------------+
+                                 Slower I/O
+
+See `Cache Tiering`_ for additional details.
+
+
+.. index:: Extensibility, Ceph Classes
+
+Extending Ceph
+--------------
+
+You can extend Ceph by creating shared object classes called 'Ceph Classes'.
+Ceph loads ``.so`` classes stored in the ``osd class dir`` directory dynamically
+(i.e., ``$libdir/rados-classes`` by default). When you implement a class, you
+can create new object methods that have the ability to call the native methods
+in the Ceph Object Store, or other class methods you incorporate via libraries
+or create yourself.
+
+On writes, Ceph Classes can call native or class methods, perform any series of
+operations on the inbound data and generate a resulting write transaction  that
+Ceph will apply atomically.
+
+On reads, Ceph Classes can call native or class methods, perform any series of
+operations on the outbound data and return the data to the client.
+
+.. topic:: Ceph Class Example
+
+   A Ceph class for a content management system that presents pictures of a
+   particular size and aspect ratio could take an inbound bitmap image, crop it
+   to a particular aspect ratio, resize it and embed an invisible copyright or 
+   watermark to help protect the intellectual property; then, save the 
+   resulting bitmap image to the object store.
+
+See ``src/objclass/objclass.h``, ``src/fooclass.cc`` and ``src/barclass`` for 
+exemplary implementations.
+
+
+Summary
+-------
+
+Ceph Storage Clusters are dynamic--like a living organism. Whereas, many storage
+appliances do not fully utilize the CPU and RAM of a typical commodity server,
+Ceph does. From heartbeats, to  peering, to rebalancing the cluster or
+recovering from faults,  Ceph offloads work from clients (and from a centralized
+gateway which doesn't exist in the Ceph architecture) and uses the computing
+power of the OSDs to perform the work. When referring to `Hardware
+Recommendations`_ and the `Network Config Reference`_,  be cognizant of the
+foregoing concepts to understand how Ceph utilizes computing resources.
+
+.. index:: Ceph Protocol, librados
+
+Ceph Protocol
+=============
+
+Ceph Clients use the native protocol for interacting with the Ceph Storage
+Cluster. Ceph packages this functionality into the ``librados`` library so that
+you can create your own custom Ceph Clients. The following diagram depicts the
+basic architecture.
+
+.. ditaa::  
+            +---------------------------------+
+            |  Ceph Storage Cluster Protocol  |
+            |           (librados)            |
+            +---------------------------------+
+            +---------------+ +---------------+
+            |      OSDs     | |    Monitors   |
+            +---------------+ +---------------+
+
+
+Native Protocol and ``librados``
+--------------------------------
+
+Modern applications need a simple object storage interface with asynchronous
+communication capability. The Ceph Storage Cluster provides a simple object
+storage interface with asynchronous communication capability. The interface
+provides direct, parallel access to objects throughout the cluster.
+
+
+- Pool Operations
+- Snapshots and Copy-on-write Cloning
+- Read/Write Objects
+  - Create or Remove
+  - Entire Object or Byte Range
+  - Append or Truncate
+- Create/Set/Get/Remove XATTRs
+- Create/Set/Get/Remove Key/Value Pairs
+- Compound operations and dual-ack semantics
+- Object Classes
+
+
+.. index:: architecture; watch/notify
+
+Object Watch/Notify
+-------------------
+
+A client can register a persistent interest with an object and keep a session to
+the primary OSD open. The client can send a notification message and a payload to
+all watchers and receive notification when the watchers receive the
+notification. This enables a client to use any object as a
+synchronization/communication channel.
+
+
+.. ditaa:: +----------+     +----------+     +----------+     +---------------+
+           | Client 1 |     | Client 2 |     | Client 3 |     | OSD:Object ID |
+           +----------+     +----------+     +----------+     +---------------+
+                 |                |                |                  |
+                 |                |                |                  |
+                 |                |  Watch Object  |                  |               
+                 |--------------------------------------------------->|
+                 |                |                |                  |
+                 |<---------------------------------------------------|
+                 |                |   Ack/Commit   |                  |
+                 |                |                |                  |
+                 |                |  Watch Object  |                  |
+                 |                |---------------------------------->|
+                 |                |                |                  |
+                 |                |<----------------------------------|
+                 |                |   Ack/Commit   |                  |
+                 |                |                |   Watch Object   |
+                 |                |                |----------------->|
+                 |                |                |                  |
+                 |                |                |<-----------------|
+                 |                |                |    Ack/Commit    |
+                 |                |     Notify     |                  |               
+                 |--------------------------------------------------->|
+                 |                |                |                  |
+                 |<---------------------------------------------------|
+                 |                |     Notify     |                  |
+                 |                |                |                  |
+                 |                |<----------------------------------|
+                 |                |     Notify     |                  |
+                 |                |                |<-----------------|
+                 |                |                |      Notify      |
+                 |                |       Ack      |                  |               
+                 |----------------+---------------------------------->|
+                 |                |                |                  |
+                 |                |       Ack      |                  |
+                 |                +---------------------------------->|
+                 |                |                |                  |
+                 |                |                |        Ack       |
+                 |                |                |----------------->|
+                 |                |                |                  | 
+                 |<---------------+----------------+------------------|
+                 |                     Complete
+
+.. index:: architecture; Striping
+
+Data Striping
+-------------
+
+Storage devices have throughput limitations, which impact performance and
+scalability. So storage systems often support `striping`_--storing sequential
+pieces of information across multiple storage devices--to increase throughput
+and performance. The most common form of data striping comes from `RAID`_.
+The RAID type most similar to Ceph's striping is `RAID 0`_, or a 'striped
+volume'. Ceph's striping offers the throughput of RAID 0 striping, the
+reliability of n-way RAID mirroring and faster recovery.
+
+Ceph provides three types of clients: Ceph Block Device, Ceph Filesystem, and
+Ceph Object Storage. A Ceph Client converts its data from the representation 
+format it provides to its users (a block device image, RESTful objects, CephFS
+filesystem directories) into objects for storage in the Ceph Storage Cluster. 
+
+.. tip:: The objects Ceph stores in the Ceph Storage Cluster are not striped. 
+   Ceph Object Storage, Ceph Block Device, and the Ceph Filesystem stripe their 
+   data over multiple Ceph Storage Cluster objects. Ceph Clients that write 
+   directly to the Ceph Storage Cluster via ``librados`` must perform the
+   striping (and parallel I/O) for themselves to obtain these benefits.
+
+The simplest Ceph striping format involves a stripe count of 1 object. Ceph
+Clients write stripe units to a Ceph Storage Cluster object until the object is
+at its maximum capacity, and then create another object for additional stripes
+of data. The simplest form of striping may be sufficient for small block device
+images, S3 or Swift objects and CephFS files. However, this simple form doesn't
+take maximum advantage of Ceph's ability to distribute data across placement
+groups, and consequently doesn't improve performance very much. The following
+diagram depicts the simplest form of striping:
+
+.. ditaa::              
+                        +---------------+
+                        |  Client Data  |
+                        |     Format    |
+                        | cCCC          |
+                        +---------------+
+                                |
+                       +--------+-------+
+                       |                |
+                       v                v
+                 /-----------\    /-----------\
+                 | Begin cCCC|    | Begin cCCC|
+                 | Object  0 |    | Object  1 |
+                 +-----------+    +-----------+
+                 |  stripe   |    |  stripe   |
+                 |  unit 1   |    |  unit 5   |
+                 +-----------+    +-----------+
+                 |  stripe   |    |  stripe   |
+                 |  unit 2   |    |  unit 6   |
+                 +-----------+    +-----------+
+                 |  stripe   |    |  stripe   |
+                 |  unit 3   |    |  unit 7   |
+                 +-----------+    +-----------+
+                 |  stripe   |    |  stripe   |
+                 |  unit 4   |    |  unit 8   |
+                 +-----------+    +-----------+
+                 | End cCCC  |    | End cCCC  |
+                 | Object 0  |    | Object 1  |
+                 \-----------/    \-----------/
+   
+
+If you anticipate large images sizes, large S3 or Swift objects (e.g., video),
+or large CephFS directories, you may see considerable read/write performance
+improvements by striping client data over multiple objects within an object set.
+Significant write performance occurs when the client writes the stripe units to
+their corresponding objects in parallel. Since objects get mapped to different
+placement groups and further mapped to different OSDs, each write occurs in
+parallel at the maximum write speed. A write to a single disk would be limited
+by the head movement (e.g. 6ms per seek) and bandwidth of that one device (e.g.
+100MB/s).  By spreading that write over multiple objects (which map to different
+placement groups and OSDs) Ceph can reduce the number of seeks per drive and
+combine the throughput of multiple drives to achieve much faster write (or read)
+speeds.
+
+.. note:: Striping is independent of object replicas. Since CRUSH
+   replicates objects across OSDs, stripes get replicated automatically.
+
+In the following diagram, client data gets striped across an object set
+(``object set 1`` in the following diagram) consisting of 4 objects, where the
+first stripe unit is ``stripe unit 0`` in ``object 0``, and the fourth stripe
+unit is ``stripe unit 3`` in ``object 3``. After writing the fourth stripe, the
+client determines if the object set is full. If the object set is not full, the
+client begins writing a stripe to the first object again (``object 0`` in the
+following diagram). If the object set is full, the client creates a new object
+set (``object set 2`` in the following diagram), and begins writing to the first
+stripe (``stripe unit 16``) in the first object in the new object set (``object
+4`` in the diagram below).
+
+.. ditaa::                 
+                          +---------------+
+                          |  Client Data  |
+                          |     Format    |
+                          | cCCC          |
+                          +---------------+
+                                  |
+       +-----------------+--------+--------+-----------------+
+       |                 |                 |                 |     +--\
+       v                 v                 v                 v        |
+ /-----------\     /-----------\     /-----------\     /-----------\  |   
+ | Begin cCCC|     | Begin cCCC|     | Begin cCCC|     | Begin cCCC|  |
+ | Object 0  |     | Object  1 |     | Object  2 |     | Object  3 |  |
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |  |
+ |  unit 0   |     |  unit 1   |     |  unit 2   |     |  unit 3   |  |
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |  +-\ 
+ |  unit 4   |     |  unit 5   |     |  unit 6   |     |  unit 7   |    | Object
+ +-----------+     +-----------+     +-----------+     +-----------+    +- Set 
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |    |   1
+ |  unit 8   |     |  unit 9   |     |  unit 10  |     |  unit 11  |  +-/
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |  |
+ |  unit 12  |     |  unit 13  |     |  unit 14  |     |  unit 15  |  |
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ | End cCCC  |     | End cCCC  |     | End cCCC  |     | End cCCC  |  |
+ | Object 0  |     | Object 1  |     | Object 2  |     | Object 3  |  |  
+ \-----------/     \-----------/     \-----------/     \-----------/  |
+                                                                      |
+                                                                   +--/
+  
+                                                                   +--\
+                                                                      |
+ /-----------\     /-----------\     /-----------\     /-----------\  |   
+ | Begin cCCC|     | Begin cCCC|     | Begin cCCC|     | Begin cCCC|  |
+ | Object  4 |     | Object  5 |     | Object  6 |     | Object  7 |  |  
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |  |
+ |  unit 16  |     |  unit 17  |     |  unit 18  |     |  unit 19  |  |
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |  +-\ 
+ |  unit 20  |     |  unit 21  |     |  unit 22  |     |  unit 23  |    | Object
+ +-----------+     +-----------+     +-----------+     +-----------+    +- Set
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |    |   2 
+ |  unit 24  |     |  unit 25  |     |  unit 26  |     |  unit 27  |  +-/
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ |  stripe   |     |  stripe   |     |  stripe   |     |  stripe   |  |
+ |  unit 28  |     |  unit 29  |     |  unit 30  |     |  unit 31  |  |
+ +-----------+     +-----------+     +-----------+     +-----------+  |
+ | End cCCC  |     | End cCCC  |     | End cCCC  |     | End cCCC  |  |
+ | Object 4  |     | Object 5  |     | Object 6  |     | Object 7  |  |  
+ \-----------/     \-----------/     \-----------/     \-----------/  |
+                                                                      |
+                                                                   +--/
+
+Three important variables determine how Ceph stripes data: 
+
+- **Object Size:** Objects in the Ceph Storage Cluster have a maximum
+  configurable size (e.g., 2MB, 4MB, etc.). The object size should be large
+  enough to accommodate many stripe units, and should be a multiple of
+  the stripe unit.
+
+- **Stripe Width:** Stripes have a configurable unit size (e.g., 64kb).
+  The Ceph Client divides the data it will write to objects into equally 
+  sized stripe units, except for the last stripe unit. A stripe width, 
+  should be a fraction of the Object Size so that an object may contain 
+  many stripe units.
+
+- **Stripe Count:** The Ceph Client writes a sequence of stripe units
+  over a series of objects determined by the stripe count. The series 
+  of objects is called an object set. After the Ceph Client writes to 
+  the last object in the object set, it returns to the first object in
+  the object set.
+  
+.. important:: Test the performance of your striping configuration before
+   putting your cluster into production. You CANNOT change these striping
+   parameters after you stripe the data and write it to objects.
+
+Once the Ceph Client has striped data to stripe units and mapped the stripe
+units to objects, Ceph's CRUSH algorithm maps the objects to placement groups,
+and the placement groups to Ceph OSD Daemons before the objects are stored as 
+files on a storage disk.
+
+.. note:: Since a client writes to a single pool, all data striped into objects
+   get mapped to placement groups in the same pool. So they use the same CRUSH
+   map and the same access controls.
+
+
+.. index:: architecture; Ceph Clients
+
+Ceph Clients
+============
+
+Ceph Clients include a number of service interfaces. These include:
+
+- **Block Devices:** The :term:`Ceph Block Device` (a.k.a., RBD) service 
+  provides resizable, thin-provisioned block devices with snapshotting and
+  cloning. Ceph stripes a block device across the cluster for high
+  performance. Ceph supports both kernel objects (KO) and a QEMU hypervisor 
+  that uses ``librbd`` directly--avoiding the kernel object overhead for 
+  virtualized systems.
+
+- **Object Storage:** The :term:`Ceph Object Storage` (a.k.a., RGW) service 
+  provides RESTful APIs with interfaces that are compatible with Amazon S3
+  and OpenStack Swift. 
+  
+- **Filesystem**: The :term:`Ceph Filesystem` (CephFS) service provides 
+  a POSIX compliant filesystem usable with ``mount`` or as 
+  a filesytem in user space (FUSE).      
+
+Ceph can run additional instances of OSDs, MDSs, and monitors for scalability
+and high availability. The following diagram depicts the high-level
+architecture. 
+
+.. ditaa::
+            +--------------+  +----------------+  +-------------+
+            | Block Device |  | Object Storage |  |   Ceph FS   |
+            +--------------+  +----------------+  +-------------+            
+
+            +--------------+  +----------------+  +-------------+
+            |    librbd    |  |     librgw     |  |  libcephfs  |
+            +--------------+  +----------------+  +-------------+
+
+            +---------------------------------------------------+
+            |      Ceph Storage Cluster Protocol (librados)     |
+            +---------------------------------------------------+
+
+            +---------------+ +---------------+ +---------------+
+            |      OSDs     | |      MDSs     | |    Monitors   |
+            +---------------+ +---------------+ +---------------+
+
+
+.. index:: architecture; Ceph Object Storage
+
+Ceph Object Storage
+-------------------
+
+The Ceph Object Storage daemon, ``radosgw``, is a FastCGI service that provides
+a RESTful_ HTTP API to store objects and metadata. It layers on top of the Ceph
+Storage Cluster with its own data formats, and maintains its own user database,
+authentication, and access control. The RADOS Gateway uses a unified namespace,
+which means you can use either the OpenStack Swift-compatible API or the Amazon
+S3-compatible API. For example, you can write data using the S3-compatible API
+with one application and then read data using the Swift-compatible API with
+another application.
+
+.. topic:: S3/Swift Objects and Store Cluster Objects Compared
+
+   Ceph's Object Storage uses the term *object* to describe the data it stores.
+   S3 and Swift objects are not the same as the objects that Ceph writes to the 
+   Ceph Storage Cluster. Ceph Object Storage objects are mapped to Ceph Storage
+   Cluster objects. The S3 and Swift objects do not necessarily 
+   correspond in a 1:1 manner with an object stored in the storage cluster. It 
+   is possible for an S3 or Swift object to map to multiple Ceph objects.
+
+See `Ceph Object Storage`_ for details.
+
+
+.. index:: Ceph Block Device; block device; RBD; Rados Block Device
+
+Ceph Block Device
+-----------------
+
+A Ceph Block Device stripes a block device image over multiple objects in the
+Ceph Storage Cluster, where each object gets mapped to a placement group and
+distributed, and the placement groups are spread across separate ``ceph-osd``
+daemons throughout the cluster.
+
+.. important:: Striping allows RBD block devices to perform better than a single 
+   server could!
+
+Thin-provisioned snapshottable Ceph Block Devices are an attractive option for
+virtualization and cloud computing. In virtual machine scenarios, people
+typically deploy a Ceph Block Device with the ``rbd`` network storage driver in
+Qemu/KVM, where the host machine uses ``librbd`` to provide a block device
+service to the guest. Many cloud computing stacks use ``libvirt`` to integrate
+with hypervisors. You can use thin-provisioned Ceph Block Devices with Qemu and
+``libvirt`` to support OpenStack and CloudStack among other solutions.
+
+While we do not provide ``librbd`` support with other hypervisors at this time,
+you may also use Ceph Block Device kernel objects to provide a block device to a
+client. Other virtualization technologies such as Xen can access the Ceph Block
+Device kernel object(s). This is done with the  command-line tool ``rbd``.
+
+
+.. index:: Ceph FS; Ceph Filesystem; libcephfs; MDS; metadata server; ceph-mds
+
+Ceph Filesystem
+---------------
+
+The Ceph Filesystem (Ceph FS) provides a POSIX-compliant filesystem as a 
+service that is layered on top of the object-based Ceph Storage Cluster.
+Ceph FS files get mapped to objects that Ceph stores in the Ceph Storage
+Cluster. Ceph Clients mount a CephFS filesystem as a kernel object or as
+a Filesystem in User Space (FUSE).
+
+.. ditaa::
+            +-----------------------+  +------------------------+
+            | CephFS Kernel Object  |  |      CephFS FUSE       |
+            +-----------------------+  +------------------------+            
+
+            +---------------------------------------------------+
+            |            Ceph FS Library (libcephfs)            |
+            +---------------------------------------------------+
+
+            +---------------------------------------------------+
+            |      Ceph Storage Cluster Protocol (librados)     |
+            +---------------------------------------------------+
+
+            +---------------+ +---------------+ +---------------+
+            |      OSDs     | |      MDSs     | |    Monitors   |
+            +---------------+ +---------------+ +---------------+
+
+
+The Ceph Filesystem service includes the Ceph Metadata Server (MDS) deployed
+with the Ceph Storage cluster. The purpose of the MDS is to store all the
+filesystem metadata (directories, file ownership, access modes, etc) in
+high-availability Ceph Metadata Servers where the metadata resides in memory.
+The reason for the MDS (a daemon called ``ceph-mds``) is that simple filesystem
+operations like listing a directory or changing a directory (``ls``, ``cd``)
+would tax the Ceph OSD Daemons unnecessarily. So separating the metadata from
+the data means that the Ceph Filesystem can provide high performance services
+without taxing the Ceph Storage Cluster.
+
+Ceph FS separates the metadata from the data, storing the metadata in the MDS, 
+and storing the file data in one or more objects in the Ceph Storage Cluster.
+The Ceph filesystem aims for POSIX compatibility. ``ceph-mds`` can run as a
+single process, or it can be distributed out to multiple physical machines,
+either for high availability or for scalability. 
+
+- **High Availability**: The extra ``ceph-mds`` instances can be `standby`, 
+  ready to take over the duties of any failed ``ceph-mds`` that was
+  `active`. This is easy because all the data, including the journal, is
+  stored on RADOS. The transition is triggered automatically by ``ceph-mon``.
+
+- **Scalability**: Multiple ``ceph-mds`` instances can be `active`, and they
+  will split the directory tree into subtrees (and shards of a single
+  busy directory), effectively balancing the load amongst all `active`
+  servers.
+
+Combinations of `standby` and `active` etc are possible, for example
+running 3 `active` ``ceph-mds`` instances for scaling, and one `standby`
+instance for high availability.
+
+
+
+
+.. _RADOS - A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters: http://ceph.com/papers/weil-rados-pdsw07.pdf
+.. _Paxos: http://en.wikipedia.org/wiki/Paxos_(computer_science)
+.. _Monitor Config Reference: ../rados/configuration/mon-config-ref
+.. _Monitoring OSDs and PGs: ../rados/operations/monitoring-osd-pg
+.. _Heartbeats: ../rados/configuration/mon-osd-interaction
+.. _Monitoring OSDs: ../rados/operations/monitoring-osd-pg/#monitoring-osds
+.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: http://ceph.com/papers/weil-crush-sc06.pdf
+.. _Data Scrubbing: ../rados/configuration/osd-config-ref#scrubbing
+.. _Report Peering Failure: ../rados/configuration/mon-osd-interaction#osds-report-peering-failure
+.. _Troubleshooting Peering Failure: ../rados/troubleshooting/troubleshooting-pg#placement-group-down-peering-failure
+.. _Ceph Authentication and Authorization: ../rados/operations/auth-intro/
+.. _Hardware Recommendations: ../install/hardware-recommendations
+.. _Network Config Reference: ../rados/configuration/network-config-ref
+.. _Data Scrubbing: ../rados/configuration/osd-config-ref#scrubbing
+.. _striping: http://en.wikipedia.org/wiki/Data_striping
+.. _RAID: http://en.wikipedia.org/wiki/RAID 
+.. _RAID 0: http://en.wikipedia.org/wiki/RAID_0#RAID_0
+.. _Ceph Object Storage: ../radosgw/
+.. _RESTful: http://en.wikipedia.org/wiki/RESTful
+.. _Erasure Code Notes: https://github.com/ceph/ceph/blob/40059e12af88267d0da67d8fd8d9cd81244d8f93/doc/dev/osd_internals/erasure_coding/developer_notes.rst
+.. _Cache Tiering: ../rados/operations/cache-tiering
+.. _Set Pool Values: ../rados/operations/pools#set-pool-values
+.. _Kerberos: http://en.wikipedia.org/wiki/Kerberos_(protocol)
+.. _Cephx Config Guide: ../rados/configuration/auth-config-ref
+.. _User Management: ../rados/operations/user-management
diff --git a/doc/cephfs/administration.rst b/doc/cephfs/administration.rst
new file mode 100644
index 0000000..da95fe3
--- /dev/null
+++ b/doc/cephfs/administration.rst
@@ -0,0 +1,137 @@
+
+CephFS Administrative commands
+==============================
+
+Filesystems
+-----------
+
+These commands operate on the CephFS filesystems in your Ceph cluster.
+Note that by default only one filesystem is permitted: to enable
+creation of multiple filesystems use ``ceph fs flag set enable_multiple true``.
+
+::
+
+    fs new <filesystem name> <metadata pool name> <data pool name>
+
+::
+
+    fs ls
+
+::
+
+    fs rm <filesystem name> [--yes-i-really-mean-it]
+
+::
+
+    fs reset <filesystem name>
+
+::
+
+    fs get <filesystem name>
+
+::
+
+    fs set <filesystem name> <var> <val>
+
+::
+
+    fs add_data_pool <filesystem name> <pool name/id>
+
+::
+
+    fs rm_data_pool <filesystem name> <pool name/id>
+
+
+Daemons
+-------
+
+These commands act on specific mds daemons or ranks.  For convenience,
+they accept arguments that 
+
+::
+
+    mds fail <gid/name/role
+
+::
+
+    mds deactivate <role>
+
+::
+
+    tell mds.<daemon name>
+
+::
+
+    mds metadata <gid/name/role>
+
+::
+
+    mds repaired <role>
+
+
+
+Global settings
+---------------
+
+::
+
+    fs dump
+
+::
+
+    fs flag set <flag name> <flag val> [<confirmation string>]
+
+    flag name must be one of ['enable_multiple']
+
+    some flags require you to confirm your intentions with "--yes-i-really-mean-it"
+    or a similar string they will prompt you with. Consider these actions carefully
+    before proceeding; they are placed on especially dangerous activities.
+
+Advanced
+--------
+
+These commands are not required in normal operation, and exist
+for use in exceptional circumstances.  Incorrect use of these
+commands may cause serious problems, such as an inaccessible
+filesystem.
+
+::
+
+    mds compat rm_compat
+
+::
+
+    mds compat rm_incompat
+
+::
+
+    mds compat show
+
+::
+
+    mds getmap
+
+::
+
+    mds set_state
+
+::
+
+    mds rmfailed
+
+Legacy
+======
+
+::
+
+    mds stat
+    mds dump  # replaced by "fs get"
+    mds stop  # replaced by "mds deactivate"
+    mds set_max_mds # replaced by "fs set max_mds"
+    mds set # replaced by "fs set"
+    mds cluster_down  # replaced by "fs set cluster_down"
+    mds cluster_up  # replaced by "fs set cluster_down"
+    mds newfs # replaced by "fs new"
+    mds add_data_pool # replaced by "fs add_data_pool"
+    mds remove_data_pool #replaced by "fs remove_data_pool"
+
diff --git a/doc/cephfs/cephfs-journal-tool.rst b/doc/cephfs/cephfs-journal-tool.rst
new file mode 100644
index 0000000..0dd54fb
--- /dev/null
+++ b/doc/cephfs/cephfs-journal-tool.rst
@@ -0,0 +1,238 @@
+
+cephfs-journal-tool
+===================
+
+Purpose
+-------
+
+If a CephFS journal has become damaged, expert intervention may be required
+to restore the filesystem to a working state.
+
+The ``cephfs-journal-tool`` utility provides functionality to aid experts in
+examining, modifying, and extracting data from journals.
+
+.. warning::
+
+    This tool is **dangerous** because it directly modifies internal
+    data structures of the filesystem.  Make backups, be careful, and
+    seek expert advice.  If you are unsure, do not run this tool.
+
+Syntax
+------
+
+::
+
+    cephfs-journal-tool journal <inspect|import|export|reset>
+    cephfs-journal-tool header <get|set>
+    cephfs-journal-tool event <get|splice|apply> [filter] <list|json|summary>
+
+
+The tool operates in three modes: ``journal``, ``header`` and ``event``,
+meaning the whole journal, the header, and the events within the journal
+respectively.
+
+Journal mode
+------------
+
+This should be your starting point to assess the state of a journal.
+
+* ``inspect`` reports on the health of the journal.  This will identify any
+  missing objects or corruption in the stored journal.  Note that this does
+  not identify inconsistencies in the events themselves, just that events are
+  present and can be decoded.
+
+* ``import`` and ``export`` read and write binary dumps of the journal
+  in a sparse file format.  Pass the filename as the last argument.  The
+  export operation may not work reliably for journals which are damaged (missing
+  objects).
+
+* ``reset`` truncates a journal, discarding any information within it.
+
+
+Example: journal inspect
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    # cephfs-journal-tool journal inspect
+    Overall journal integrity: DAMAGED
+    Objects missing:
+      0x1
+    Corrupt regions:
+      0x400000-ffffffffffffffff
+
+Example: Journal import/export
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    # cephfs-journal-tool journal export myjournal.bin
+    journal is 4194304~80643
+    read 80643 bytes at offset 4194304
+    wrote 80643 bytes at offset 4194304 to myjournal.bin
+    NOTE: this is a _sparse_ file; you can
+        $ tar cSzf myjournal.bin.tgz myjournal.bin
+          to efficiently compress it while preserving sparseness.
+
+    # cephfs-journal-tool journal import myjournal.bin
+    undump myjournal.bin
+    start 4194304 len 80643
+    writing header 200.00000000
+     writing 4194304~80643
+    done.
+
+.. note::
+
+    It is wise to use the ``journal export <backup file>`` command to make a journal backup
+    before any further manipulation.
+
+Header mode
+-----------
+
+* ``get`` outputs the current content of the journal header
+
+* ``set`` modifies an attribute of the header.  Allowed attributes are
+  ``trimmed_pos``, ``expire_pos`` and ``write_pos``.
+
+Example: header get/set
+~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+    # cephfs-journal-tool header get
+    { "magic": "ceph fs volume v011",
+      "write_pos": 4274947,
+      "expire_pos": 4194304,
+      "trimmed_pos": 4194303,
+      "layout": { "stripe_unit": 4194304,
+          "stripe_count": 4194304,
+          "object_size": 4194304,
+          "cas_hash": 4194304,
+          "object_stripe_unit": 4194304,
+          "pg_pool": 4194304}}
+
+    # cephfs-journal-tool header set trimmed_pos 4194303
+    Updating trimmed_pos 0x400000 -> 0x3fffff
+    Successfully updated header.
+
+
+Event mode
+----------
+
+Event mode allows detailed examination and manipulation of the contents of the journal.  Event
+mode can operate on all events in the journal, or filters may be applied.
+
+The arguments following ``cephfs-journal-tool event`` consist of an action, optional filter
+parameters, and an output mode:
+
+::
+
+    cephfs-journal-tool event <action> [filter] <output>
+
+Actions:
+
+* ``get`` read the events from the log
+* ``splice`` erase events or regions in the journal
+* ``apply`` extract filesystem metadata from events and attempt to apply it to the metadata store.
+
+Filtering:
+
+* ``--range <int begin>..[int end]`` only include events within the range begin (inclusive) to end (exclusive)
+* ``--path <path substring>`` only include events referring to metadata containing the specified string
+* ``--inode <int>`` only include events referring to metadata containing the specified string
+* ``--type <type string>`` only include events of this type
+* ``--frag <ino>[.frag id]`` only include events referring to this directory fragment
+* ``--dname <string>`` only include events referring to this named dentry within a directory
+  fragment (may only be used in conjunction with ``--frag``
+* ``--client <int>`` only include events from this client session ID
+
+Filters may be combined on an AND basis (i.e. only the intersection of events from each filter).
+
+Output modes:
+
+* ``binary``: write each event as a binary file, within a folder whose name is controlled by ``--path``
+* ``json``: write all events to a single file, as a JSON serialized list of objects
+* ``summary``: write a human readable summary of the events read to standard out
+* ``list``: write a human readable terse listing of the type of each event, and
+  which file paths the event affects.
+
+
+Example: event mode
+~~~~~~~~~~~~~~~~~~~
+
+::
+
+    # cephfs-journal-tool event get json --path output.json
+    Wrote output to JSON file 'output.json'
+
+    # cephfs-journal-tool event get summary
+    Events by type:
+      NOOP: 2
+      OPEN: 2
+      SESSION: 2
+      SUBTREEMAP: 1
+      UPDATE: 43
+
+    # cephfs-journal-tool event get list
+    0x400000 SUBTREEMAP:  ()
+    0x400308 SESSION:  ()
+    0x4003de UPDATE:  (setattr)
+      /
+    0x40068b UPDATE:  (mkdir)
+      diralpha
+    0x400d1b UPDATE:  (mkdir)
+      diralpha/filealpha1
+    0x401666 UPDATE:  (unlink_local)
+      stray0/10000000001
+      diralpha/filealpha1
+    0x40228d UPDATE:  (unlink_local)
+      diralpha
+      stray0/10000000000
+    0x402bf9 UPDATE:  (scatter_writebehind)
+      stray0
+    0x403150 UPDATE:  (mkdir)
+      dirbravo
+    0x4037e0 UPDATE:  (openc)
+      dirbravo/.filebravo1.swp
+    0x404032 UPDATE:  (openc)
+      dirbravo/.filebravo1.swpx
+
+    # cephfs-journal-tool event get --path /filebravo1 list
+    0x40785a UPDATE:  (openc)
+      dirbravo/filebravo1
+    0x4103ee UPDATE:  (cap update)
+      dirbravo/filebravo1
+
+    # cephfs-journal-tool event splice --range 0x40f754..0x410bf1 summary
+    Events by type:
+      OPEN: 1
+      UPDATE: 2
+
+    # cephfs-journal-tool event apply --range 0x410bf1.. summary
+    Events by type:
+      NOOP: 1
+      SESSION: 1
+      UPDATE: 9
+
+    # cephfs-journal-tool event get --inode=1099511627776 list
+    0x40068b UPDATE:  (mkdir)
+      diralpha
+    0x400d1b UPDATE:  (mkdir)
+      diralpha/filealpha1
+    0x401666 UPDATE:  (unlink_local)
+      stray0/10000000001
+      diralpha/filealpha1
+    0x40228d UPDATE:  (unlink_local)
+      diralpha
+      stray0/10000000000
+
+    # cephfs-journal-tool event get --frag=1099511627776 --dname=filealpha1 list
+    0x400d1b UPDATE:  (mkdir)
+      diralpha/filealpha1
+    0x401666 UPDATE:  (unlink_local)
+      stray0/10000000001
+      diralpha/filealpha1
+
+    # cephfs-journal-tool event get binary --path bin_events
+    Wrote output to binary files in directory 'bin_events'
+
diff --git a/doc/cephfs/client-auth.rst b/doc/cephfs/client-auth.rst
new file mode 100644
index 0000000..dac40ed
--- /dev/null
+++ b/doc/cephfs/client-auth.rst
@@ -0,0 +1,107 @@
+================================
+CephFS Client Capabilities
+================================
+
+Use Ceph authentication capabilities to restrict your filesystem clients
+to the lowest possible level of authority needed.
+
+.. note::
+
+    Path restriction and layout modification restriction are new features
+    in the Jewel release of Ceph.
+
+Path restriction
+================
+
+By default, clients are not restricted in what paths they are allowed to mount.
+Further, when clients mount a subdirectory, e.g., /home/user, the MDS does not
+by default verify that subsequent operations
+are ‘locked’ within that directory.
+
+To restrict clients to only mount and work within a certain directory, use
+path-based MDS authentication capabilities.
+
+Syntax
+------
+
+To grant rw access to the specified directory only, we mention the specified
+directory while creating key for a client following the undermentioned syntax. ::
+
+./ceph auth get-or-create client.*client_name* mon 'allow r' mds 'allow r, allow rw path=/*specified_directory*' osd 'allow rw pool=data'
+
+for example, to restrict client ``foo`` to ``bar`` directory, we will use. ::
+
+./ceph auth get-or-create client.foo mon 'allow r' mds 'allow r, allow rw path=/bar' osd 'allow rw pool=data'
+
+
+To restrict a client to the specfied sub-directory only, we mention the specified
+directory while mounting following the undermentioned syntax. ::
+
+./ceph-fuse -n client.*client_name* *mount_path* -r *directory_to_be_mounted*
+
+for example, to restrict client ``foo`` to ``mnt/bar`` directory, we will use. ::
+
+./ceph-fuse -n client.foo mnt -r /bar
+
+Free space reporting
+--------------------
+
+By default, when a client is mounting a sub-directory, the used space (``df``)
+will be calculated from the quota on that sub-directory, rather than reporting
+the overall amount of space used on the cluster.
+
+If you would like the client to report the overall usage of the filesystem,
+and not just the quota usage on the sub-directory mounted, then set the
+following config option on the client:
+
+::
+
+    client quota df = false
+
+If quotas are not enabled, or no quota is set on the sub-directory mounted,
+then the overall usage of the filesystem will be reported irrespective of
+the value of this setting.
+
+OSD restriction
+===============
+
+To prevent clients from writing or reading data to pools other than
+those in use for CephFS, set an OSD authentication capability that
+restricts access to the CephFS data pool(s):
+
+::
+
+    client.0
+        key: AQAz7EVWygILFRAAdIcuJ12opU/JKyfFmxhuaw==
+        caps: [mds] allow rw
+        caps: [mon] allow r
+        caps: [osd] allow rw pool=data1, allow rw pool=data2
+
+You may also restrict clients from writing data by using 'r' instead of
+'rw' in OSD capabilities.  This does not affect the ability of the client
+to update filesystem metadata for these files, but it will prevent them
+from persistently writing data in a way that would be visible to other clients.
+
+Layout modification restriction
+===============================
+
+To prevent clients from modifying the data pool used for files or
+directories, use the 'p' modifier in MDS authentication capabilities.
+
+For example, in the following snippet client.0 can modify the pool used
+for files, but client.1 cannot.
+
+::
+
+    client.0
+        key: AQAz7EVWygILFRAAdIcuJ12opU/JKyfFmxhuaw==
+        caps: [mds] allow rwp
+        caps: [mon] allow r
+        caps: [osd] allow rw pool=data
+
+    client.1
+        key: AQAz7EVWygILFRAAdIcuJ12opU/JKyfFmxhuaw==
+        caps: [mds] allow rw
+        caps: [mon] allow r
+        caps: [osd] allow rw pool=data
+
diff --git a/doc/cephfs/createfs.rst b/doc/cephfs/createfs.rst
new file mode 100644
index 0000000..dffa568
--- /dev/null
+++ b/doc/cephfs/createfs.rst
@@ -0,0 +1,61 @@
+========================
+Create a Ceph filesystem
+========================
+
+.. tip::
+
+    The ``ceph fs new`` command was introduced in Ceph 0.84.  Prior to this release,
+    no manual steps are required to create a filesystem, and pools named ``data`` and
+    ``metadata`` exist by default.
+
+    The Ceph command line now includes commands for creating and removing filesystems,
+    but at present only one filesystem may exist at a time.
+
+A Ceph filesystem requires at least two RADOS pools, one for data and one for metadata.
+When configuring these pools, you might consider:
+
+- Using a higher replication level for the metadata pool, as any data
+  loss in this pool can render the whole filesystem inaccessible.
+- Using lower-latency storage such as SSDs for the metadata pool, as this
+  will directly affect the observed latency of filesystem operations
+  on clients.
+
+Refer to :doc:`/rados/operations/pools` to learn more about managing pools.  For
+example, to create two pools with default settings for use with a filesystem, you
+might run the following commands:
+
+.. code:: bash
+
+    $ ceph osd pool create cephfs_data <pg_num>
+    $ ceph osd pool create cephfs_metadata <pg_num>
+
+Once the pools are created, you may enable the filesystem using the ``fs new`` command:
+
+.. code:: bash
+
+    $ ceph fs new <fs_name> <metadata> <data>
+
+For example:
+
+.. code:: bash
+
+    $ ceph fs new cephfs cephfs_metadata cephfs_data
+    $ ceph fs ls
+    name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
+
+Once a filesystem has been created, your MDS(s) will be able to enter
+an *active* state.  For example, in a single MDS system:
+
+.. code:: bash
+
+    $ ceph mds stat
+    e5: 1/1/1 up {0=a=up:active}
+
+Once the filesystem is created and the MDS is active, you are ready to mount
+the filesystem:
+
+	- `Mount CephFS`_
+	- `Mount CephFS as FUSE`_
+
+.. _Mount CephFS: ../../cephfs/kernel
+.. _Mount CephFS as FUSE: ../../cephfs/fuse
diff --git a/doc/cephfs/disaster-recovery.rst b/doc/cephfs/disaster-recovery.rst
new file mode 100644
index 0000000..8d6748d
--- /dev/null
+++ b/doc/cephfs/disaster-recovery.rst
@@ -0,0 +1,162 @@
+
+Disaster recovery
+=================
+
+.. danger::
+
+    The notes in this section are aimed at experts, making a best effort
+    to recovery what they can from damaged filesystems.  These steps
+    have the potential to make things worse as well as better.  If you
+    are unsure, do not proceed.
+
+
+Journal export
+--------------
+
+Before attempting dangerous operations, make a copy of the journal like so:
+
+::
+
+    cephfs-journal-tool journal export backup.bin
+
+Note that this command may not always work if the journal is badly corrupted,
+in which case a RADOS-level copy should be made (http://tracker.ceph.com/issues/9902).
+
+
+Dentry recovery from journal
+----------------------------
+
+If a journal is damaged or for any reason an MDS is incapable of replaying it,
+attempt to recover what file metadata we can like so:
+
+::
+
+    cephfs-journal-tool event recover_dentries summary
+
+This command by default acts on MDS rank 0, pass --rank=<n> to operate on other ranks.
+
+This command will write any inodes/dentries recoverable from the journal
+into the backing store, if these inodes/dentries are higher-versioned
+than the previous contents of the backing store.  If any regions of the journal
+are missing/damaged, they will be skipped.
+
+Note that in addition to writing out dentries and inodes, this command will update
+the InoTables of each 'in' MDS rank, to indicate that any written inodes' numbers
+are now in use.  In simple cases, this will result in an entirely valid backing
+store state.
+
+.. warning::
+
+    The resulting state of the backing store is not guaranteed to be self-consistent,
+    and an online MDS scrub will be required afterwards.  The journal contents
+    will not be modified by this command, you should truncate the journal
+    separately after recovering what you can.
+
+Journal truncation
+------------------
+
+If the journal is corrupt or MDSs cannot replay it for any reason, you can
+truncate it like so:
+
+::
+
+    cephfs-journal-tool journal reset
+
+.. warning::
+
+    Resetting the journal *will* lose metadata unless you have extracted
+    it by other means such as ``recover_dentries``.  It is likely to leave
+    some orphaned objects in the data pool.  It may result in re-allocation
+    of already-written inodes, such that permissions rules could be violated.
+
+MDS table wipes
+---------------
+
+After the journal has been reset, it may no longer be consistent with respect
+to the contents of the MDS tables (InoTable, SessionMap, SnapServer).
+
+To reset the SessionMap (erase all sessions), use:
+
+::
+
+    cephfs-table-tool all reset session
+
+This command acts on the tables of all 'in' MDS ranks.  Replace 'all' with an MDS
+rank to operate on that rank only.
+
+The session table is the table most likely to need resetting, but if you know you
+also need to reset the other tables then replace 'session' with 'snap' or 'inode'.
+
+MDS map reset
+-------------
+
+Once the in-RADOS state of the filesystem (i.e. contents of the metadata pool)
+is somewhat recovered, it may be necessary to update the MDS map to reflect
+the contents of the metadata pool.  Use the following command to reset the MDS
+map to a single MDS:
+
+::
+
+    ceph fs reset <fs name> --yes-i-really-mean-it
+
+Once this is run, any in-RADOS state for MDS ranks other than 0 will be ignored:
+as a result it is possible for this to result in data loss.
+
+One might wonder what the difference is between 'fs reset' and 'fs remove; fs new'.  The
+key distinction is that doing a remove/new will leave rank 0 in 'creating' state, such
+that it would overwrite any existing root inode on disk and orphan any existing files.  In
+contrast, the 'reset' command will leave rank 0 in 'active' state such that the next MDS
+daemon to claim the rank will go ahead and use the existing in-RADOS metadata.
+
+Recovery from missing metadata objects
+--------------------------------------
+
+Depending on what objects are missing or corrupt, you may need to
+run various commands to regenerate default versions of the
+objects.
+
+::
+
+    # Session table
+    cephfs-table-tool 0 reset session
+    # SnapServer
+    cephfs-table-tool 0 reset snap
+    # InoTable
+    cephfs-table-tool 0 reset inode
+    # Journal
+    cephfs-journal-tool --rank=0 journal reset
+    # Root inodes ("/" and MDS directory)
+    cephfs-data-scan init
+
+Finally, you can regenerate metadata objects for missing files
+and directories based on the contents of a data pool.  This is
+a two-phase process.  First, scanning *all* objects to calculate
+size and mtime metadata for inodes.  Second, scanning the first
+object from every file to collect this metadata and inject
+it into the metadata pool.
+
+::
+
+    cephfs-data-scan scan_extents <data pool>
+    cephfs-data-scan scan_inodes <data pool>
+
+This command may take a very long time if there are many
+files or very large files in the data pool.  To accelerate
+the process, run multiple instances of the tool.  Decide on
+a number of workers, and pass each worker a number within
+the range 0-(N_workers - 1), like so:
+
+::
+
+    # Worker 0
+    cephfs-data-scan scan_extents <data pool> 0 1
+    # Worker 1
+    cephfs-data-scan scan_extents <data pool> 1 1
+
+    # Worker 0
+    cephfs-data-scan scan_inodes <data pool> 0 1
+    # Worker 1
+    cephfs-data-scan scan_inodes <data pool> 1 1
+
+It is important to ensure that all workers have completed the
+scan_extents phase before any workers enter the scan_inodes phase.
diff --git a/doc/cephfs/early-adopters.rst b/doc/cephfs/early-adopters.rst
new file mode 100644
index 0000000..1047479
--- /dev/null
+++ b/doc/cephfs/early-adopters.rst
@@ -0,0 +1,61 @@
+
+CephFS for early adopters
+=========================
+
+This pages provides guidance for early adoption of CephFS by users
+with an appetite for adventure.  While work is ongoing to build the
+scrubbing and disaster recovery tools needed to run CephFS in demanding
+production environments, it is already useful for community members to
+try CephFS and provide bug reports and feedback.
+
+Setup instructions
+==================
+
+Please see the instructions at :doc:`/cephfs/index`.
+
+Most stable configuration
+=========================
+
+For the best chance of a happy healthy filesystem, use a **single active MDS** 
+and **do not use snapshots**.  Both of these are the default:
+
+* Snapshots are disabled by default, unless they are enabled explicitly by
+  an administrator using the ``allow_new_snaps`` setting.
+* Ceph will use a single active MDS unless an administrator explicitly sets
+  ``max_mds`` to a value greater than 1.  Note that creating additional
+  MDS daemons (e.g. with ``ceph-deploy mds create``) is okay, as these will
+  by default simply become standbys.  It is also fairly safe to enable
+  standby-replay mode.
+
+Which client?
+=============
+
+The fuse client is the easiest way to get up to date code, while
+the kernel client will often give better performance.
+
+The clients do not always provide equivalent functionality, for example
+the fuse client supports client-enforced quotas while the kernel client
+does not.
+
+When encountering bugs or performance issues, it is often instructive to
+try using the other client, in order to find out whether the bug was
+client-specific or not (and then to let the developers know).
+
+Reporting issues
+================
+
+If you have identified a specific issue, please report it with as much
+information as possible.  Especially important information:
+
+* Ceph versions installed on client and server
+* Whether you are using the kernel or fuse client
+* If you are using the kernel client, what kernel version?
+* How many clients are in play, doing what kind of workload?
+* If a system is 'stuck', is that affecting all clients or just one?
+* Any ceph health messages
+* Any backtraces in the ceph logs from crashes
+
+If you are satisfied that you have found a bug, please file it on
+http://tracker.ceph.com.  For more general queries please write
+to the ceph-users mailing list.
+
diff --git a/doc/cephfs/eviction.rst b/doc/cephfs/eviction.rst
new file mode 100644
index 0000000..bd201ce
--- /dev/null
+++ b/doc/cephfs/eviction.rst
@@ -0,0 +1,119 @@
+
+Ceph filesystem client eviction
+===============================
+
+When a filesystem client is unresponsive or otherwise misbehaving, it
+may be necessary to forcibly terminate its access to the filesystem.  This
+process is called *eviction*.
+
+This process is somewhat thorough in order to protect against data inconsistency
+resulting from misbehaving clients.
+
+OSD blacklisting
+----------------
+
+First, prevent the client from performing any more data operations by *blacklisting*
+it at the RADOS level.  You may be familiar with this concept as *fencing* in other
+storage systems.
+
+Identify the client to evict from the MDS session list:
+
+::
+
+    # ceph daemon mds.a session ls
+    [
+        { "id": 4117,
+          "num_leases": 0,
+          "num_caps": 1,
+          "state": "open",
+          "replay_requests": 0,
+          "reconnecting": false,
+          "inst": "client.4117 172.16.79.251:0\/3271",
+          "client_metadata": { "entity_id": "admin",
+              "hostname": "fedoravm.localdomain",
+              "mount_point": "\/home\/user\/mnt"}}]
+
+In this case the 'fedoravm' client has address ``172.16.79.251:0/3271``, so we blacklist
+it as follows:
+
+::
+
+    # ceph osd blacklist add 172.16.79.251:0/3271
+    blacklisting 172.16.79.251:0/3271 until 2014-12-09 13:09:56.569368 (3600 sec)
+
+OSD epoch barrier
+-----------------
+
+While the evicted client is now marked as blacklisted in the central (mon) copy of the OSD
+map, it is now necessary to ensure that this OSD map update has propagated to all daemons
+involved in subsequent filesystem I/O.  To do this, use the ``osdmap barrier`` MDS admin
+socket command.
+
+First read the latest OSD epoch:
+
+::
+
+    # ceph osd dump
+    epoch 12
+    fsid fd61ca96-53ff-4311-826c-f36b176d69ea
+    created 2014-12-09 12:03:38.595844
+    modified 2014-12-09 12:09:56.619957
+    ...
+
+In this case it is 12.  Now request the MDS to barrier on this epoch:
+
+::
+
+    # ceph daemon mds.a osdmap barrier 12
+
+MDS session eviction
+--------------------
+
+Finally, it is safe to evict the client's MDS session, such that any capabilities it held
+may be issued to other clients.  The ID here is the ``id`` attribute from the ``session ls``
+output:
+
+::
+
+    # ceph daemon mds.a session evict 4117
+
+That's it!  The client has now been evicted, and any resources it had locked will
+now be available for other clients.
+
+Background: OSD epoch barrier
+-----------------------------
+
+The purpose of the barrier is to ensure that when we hand out any
+capabilities which might allow touching the same RADOS objects, the
+clients we hand out the capabilities to must have a sufficiently recent
+OSD map to not race with cancelled operations (from ENOSPC) or
+blacklisted clients (from evictions)
+
+More specifically, the cases where we set an epoch barrier are:
+
+ * Client eviction (where the client is blacklisted and other clients
+   must wait for a post-blacklist epoch to touch the same objects)
+ * OSD map full flag handling in the client (where the client may
+   cancel some OSD ops from a pre-full epoch, so other clients must
+   wait until the full epoch or later before touching the same objects).
+ * MDS startup, because we don't persist the barrier epoch, so must
+   assume that latest OSD map is always required after a restart.
+
+Note that this is a global value for simplicity: we could maintain this on
+a per-inode basis.  We don't, because:
+
+ * It would be more complicated
+ * It would use an extra 4 bytes of memory for every inode
+ * It would not be much more efficient as almost always everyone has the latest
+   OSD map anyway, in most cases everyone will breeze through this barrier
+   rather than waiting.
+ * We only do this barrier in very rare cases, so any benefit from per-inode
+   granularity would only very rarely be seen.
+
+The epoch barrier is transmitted along with all capability messages, and
+instructs the receiver of the message to avoid sending any more RADOS
+operations to OSDs until it has seen this OSD epoch.  This mainly applies
+to clients (doing their data writes directly to files), but also applies
+to the MDS because things like file size probing and file deletion are
+done directly from the MDS.
+
diff --git a/doc/cephfs/experimental-features.rst b/doc/cephfs/experimental-features.rst
new file mode 100644
index 0000000..4c76b4a
--- /dev/null
+++ b/doc/cephfs/experimental-features.rst
@@ -0,0 +1,81 @@
+
+Experimental Features
+=====================
+
+CephFS includes a number of experimental features which are not fully stabilized
+or qualified for users to turn on in real deployments. We generally do our best
+to clearly demarcate these and fence them off so they can't be used by mistake.
+
+Some of these features are closer to being done than others, though. We describe
+each of them with an approximation of how risky they are and briefly describe
+what is required to enable them. Note that doing so will *irrevocably* flag maps
+in the monitor as having once enabled this flag to improve debugging and
+support processes.
+
+
+Directory Fragmentation
+-----------------------
+CephFS directories are generally stored within a single RADOS object. But this has
+certain negative results once they become large enough. The filesystem is capable
+of "fragmenting" these directories into multiple objects. There are no known bugs
+with doing so but it is not sufficiently tested to support at this time.
+
+Directory fragmentation has always been off by default and required setting
+```mds bal frag = true`` in the MDS' config file. It has been further protected
+by requiring the user to set the "allow_dirfrags" flag for Jewel.
+
+Inline data
+-----------
+By default, all CephFS file data is stored in RADOS objects. The inline data
+feature enables small files (generally <2KB) to be stored in the inode
+and served out of the MDS. This may improve small-file performance but increases
+load on the MDS. It is not sufficiently tested to support at this time, although
+failures within it are unlikely to make non-inlined data inaccessible
+
+Inline data has always been off by default and requires setting
+the "inline_data" flag.
+
+Multi-MDS filesystem clusters
+-----------------------------
+CephFS has been designed from the ground up to support fragmenting the metadata
+hierarchy across multiple active metadata servers, to allow horizontal scaling
+to arbitrary throughput requirements. Unfortunately, doing so requires a lot
+more working code than having a single MDS which is authoritative over the
+entire filesystem namespace.
+
+Multiple active MDSes are generally stable under trivial workloads, but often
+break in the presence of any failure, and do not have enough testing to offer
+any stability guarantees. If a filesystem with multiple active MDSes does
+experience failure, it will require (generally extensive) manual intervention.
+There are serious known bugs.
+
+Multi-MDS filesystems have always required explicitly increasing the "max_mds"
+value and have been further protected with the "allow_multimds" flag for Jewel.
+
+Snapshots
+---------
+Like multiple active MDSes, CephFS is designed from the ground up to support
+snapshotting of arbitrary directories. There are no known bugs at the time of
+writing, but there is insufficient testing to provide stability guarantees and
+every expansion of testing has generally revealed new issues. If you do enable
+snapshots and experience failure, manual intervention will be needed.
+
+Snapshotting was blocked off with the "allow_new_snaps" flag prior to Firefly.
+
+Multiple filesystems within a Ceph cluster
+------------------------------------------
+Code was merged prior to the Jewel release which enables administrators
+to create multiple independent CephFS filesystems within a single Ceph cluster.
+These independent filesystems have their own set of active MDSes, cluster maps,
+and data. But the feature required extensive changes to data structures which
+are not yet fully qualified, and has security implications which are not all
+apparent nor resolved.
+
+There are no known bugs, but any failures which do result from having multiple
+active filesystems in your cluster will require manual intervention and, so far,
+will not have been experienced by anybody else -- knowledgeable help will be
+extremely limited. You also probably do not have the security or isolation
+guarantees you want or think you have upon doing so.
+
+Multiple filesystems were available starting in the Jewel release candidates
+but were protected behind the "enable_multiple" flag before the final release.
diff --git a/doc/cephfs/file-layouts.rst b/doc/cephfs/file-layouts.rst
new file mode 100644
index 0000000..c09d8f5
--- /dev/null
+++ b/doc/cephfs/file-layouts.rst
@@ -0,0 +1,176 @@
+
+File layouts
+============
+
+The layout of a file controls how its contents are mapped to Ceph RADOS objects.  You can
+read and write a file's layout using *virtual extended attributes* or xattrs.
+
+The name of the layout xattrs depends on whether a file is a regular file or a directory.  Regular
+files' layout xattrs are called ``ceph.file.layout``, whereas directories' layout xattrs are called
+``ceph.dir.layout``.  Where subsequent examples refer to ``ceph.file.layout``, substitute ``dir`` as appropriate
+when dealing with directories.
+
+.. tip::
+
+    Your linux distribution may not ship with commands for manipulating xattrs by default,
+    the required package is usually called ``attr``.
+
+Layout fields
+-------------
+
+pool
+    String, giving ID or name.  Which RADOS pool a file's data objects will be stored in.
+
+stripe_unit
+    Integer in bytes.  The size (in bytes) of a block of data used in the RAID 0 distribution of a file. All stripe units for a file have equal size. The last stripe unit is typically incomplete–i.e. it represents the data at the end of the file as well as unused “space” beyond it up to the end of the fixed stripe unit size.
+
+stripe_count
+    Integer.  The number of consecutive stripe units that constitute a RAID 0 “stripe” of file data.
+
+object_size
+    Integer in bytes.  File data is chunked into RADOS objects of this size.
+
+Reading layouts with ``getfattr``
+---------------------------------
+
+Read the layout information as a single string:
+
+.. code-block:: bash
+
+    $ touch file
+    $ getfattr -n ceph.file.layout file
+    # file: file
+    ceph.file.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 pool=cephfs_data"
+
+Read individual layout fields:
+
+.. code-block:: bash
+
+    $ getfattr -n ceph.file.layout.pool file
+    # file: file
+    ceph.file.layout.pool="cephfs_data"
+    $ getfattr -n ceph.file.layout.stripe_unit file
+    # file: file
+    ceph.file.layout.stripe_unit="4194304"
+    $ getfattr -n ceph.file.layout.stripe_count file
+    # file: file
+    ceph.file.layout.stripe_count="1"
+    $ getfattr -n ceph.file.layout.object_size file
+    # file: file
+    ceph.file.layout.object_size="4194304"    
+
+.. note::
+
+    When reading layouts, the pool will usually be indicated by name.  However, in 
+    rare cases when pools have only just been created, the ID may be output instead.
+
+Directories do not have an explicit layout until it is customized.  Attempts to read
+the layout will fail if it has never been modified: this indicates that layout of the
+next ancestor directory with an explicit layout will be used.
+
+.. code-block:: bash
+
+    $ mkdir dir
+    $ getfattr -n ceph.dir.layout dir
+    dir: ceph.dir.layout: No such attribute
+    $ setfattr -n ceph.dir.layout.stripe_count -v 2 dir
+    $ getfattr -n ceph.dir.layout dir
+    # file: dir
+    ceph.dir.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 pool=cephfs_data"
+
+
+Writing layouts with ``setfattr``
+---------------------------------
+
+Layout fields are modified using ``setfattr``:
+
+.. code-block:: bash
+
+    $ ceph osd lspools
+    0 rbd,1 cephfs_data,2 cephfs_metadata,
+
+    $ setfattr -n ceph.file.layout.stripe_unit -v 1048576 file2
+    $ setfattr -n ceph.file.layout.stripe_count -v 8 file2
+    $ setfattr -n ceph.file.layout.object_size -v 10485760 file2
+    $ setfattr -n ceph.file.layout.pool -v 1 file2  # Setting pool by ID
+    $ setfattr -n ceph.file.layout.pool -v cephfs_data file2  # Setting pool by name
+
+.. note::
+
+    When the layout fields of a file are modified using ``setfattr``, this file must be empty, otherwise an error will occur.
+
+.. code-block:: bash
+
+    # touch an empty file
+    $ touch file1
+    # modify layout field successfully
+    $ setfattr -n ceph.file.layout.stripe_count -v 3 file1
+
+    # write something to file1
+    $ echo "hello world" > file1
+    $ setfattr -n ceph.file.layout.stripe_count -v 4 file1
+    setfattr: file1: Directory not empty
+    
+Inheritance of layouts
+----------------------
+
+Files inherit the layout of their parent directory at creation time.  However, subsequent
+changes to the parent directory's layout do not affect children.
+
+.. code-block:: bash
+
+    $ getfattr -n ceph.dir.layout dir
+    # file: dir
+    ceph.dir.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 pool=cephfs_data"
+
+    # Demonstrate file1 inheriting its parent's layout
+    $ touch dir/file1
+    $ getfattr -n ceph.file.layout dir/file1
+    # file: dir/file1
+    ceph.file.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 pool=cephfs_data"
+
+    # Now update the layout of the directory before creating a second file
+    $ setfattr -n ceph.dir.layout.stripe_count -v 4 dir
+    $ touch dir/file2
+
+    # Demonstrate that file1's layout is unchanged
+    $ getfattr -n ceph.file.layout dir/file1
+    # file: dir/file1
+    ceph.file.layout="stripe_unit=4194304 stripe_count=2 object_size=4194304 pool=cephfs_data"
+
+    # ...while file2 has the parent directory's new layout
+    $ getfattr -n ceph.file.layout dir/file2
+    # file: dir/file2
+    ceph.file.layout="stripe_unit=4194304 stripe_count=4 object_size=4194304 pool=cephfs_data"
+
+
+Files created as descendents of the directory also inherit the layout, if the intermediate
+directories do not have layouts set:
+
+.. code-block:: bash
+
+    $ getfattr -n ceph.dir.layout dir
+    # file: dir
+    ceph.dir.layout="stripe_unit=4194304 stripe_count=4 object_size=4194304 pool=cephfs_data"
+    $ mkdir dir/childdir
+    $ getfattr -n ceph.dir.layout dir/childdir
+    dir/childdir: ceph.dir.layout: No such attribute
+    $ touch dir/childdir/grandchild
+    $ getfattr -n ceph.file.layout dir/childdir/grandchild
+    # file: dir/childdir/grandchild
+    ceph.file.layout="stripe_unit=4194304 stripe_count=4 object_size=4194304 pool=cephfs_data"
+
+    
+Adding a data pool to the MDS
+---------------------------------
+
+Before you can use a pool with CephFS you have to add it to the Metadata Servers.
+
+.. code-block:: bash
+
+    $ ceph mds add_data_pool cephfs_data_ssd
+    # Pool should now show up
+    $ ceph fs ls
+    .... data pools: [cephfs_data cephfs_data_ssd ]
+
+Make sure that your cephx keys allows the client to access this new pool.
diff --git a/doc/cephfs/fstab.rst b/doc/cephfs/fstab.rst
new file mode 100644
index 0000000..b16654c
--- /dev/null
+++ b/doc/cephfs/fstab.rst
@@ -0,0 +1,47 @@
+==========================================
+ Mount Ceph FS in your File Systems Table
+==========================================
+
+If you mount Ceph FS in your file systems table, the Ceph file system will mount 
+automatically on startup. 
+
+Kernel Driver
+=============
+
+To mount Ceph FS in your file systems table as a kernel driver, add the
+following to ``/etc/fstab``::
+
+	{ipaddress}:{port}:/ {mount}/{mountpoint} {filesystem-name}	[name=username,secret=secretkey|secretfile=/path/to/secretfile],[{mount.options}]
+
+For example:: 
+
+	10.10.10.10:6789:/     /mnt/ceph    ceph    name=admin,secretfile=/etc/ceph/secret.key,noatime    0       2
+	
+.. important:: The ``name`` and ``secret`` or ``secretfile`` options are 
+   mandatory when you have Ceph authentication running. 
+ 
+See `Authentication`_ for details. 
+   
+   
+FUSE
+====
+
+To mount Ceph FS in your file systems table as a filesystem in user space, add the
+following to ``/etc/fstab``::
+
+	#DEVICE                                  PATH         TYPE      OPTIONS
+	id={user-ID}[,conf={path/to/conf.conf}] /mount/path  fuse.ceph defaults 0 0
+
+For example::
+
+	id=admin  /mnt/ceph  fuse.ceph defaults 0 0 
+	id=myuser,conf=/etc/ceph/cluster.conf  /mnt/ceph2  fuse.ceph defaults 0 0 
+
+The ``DEVICE`` field is a comma-delimited list of options to pass to the command line.
+Ensure you use the ID (e.g., ``admin``, not ``client.admin``). You can pass any valid 
+``ceph-fuse`` option to the command line this way.
+
+See `Authentication`_ for details. 
+
+
+.. _Authentication: ../../rados/operations/authentication/
diff --git a/doc/cephfs/full.rst b/doc/cephfs/full.rst
new file mode 100644
index 0000000..a58b94c
--- /dev/null
+++ b/doc/cephfs/full.rst
@@ -0,0 +1,60 @@
+
+Handling a full Ceph filesystem
+===============================
+
+When a RADOS cluster reaches its ``mon_osd_full_ratio`` (default
+95%) capacity, it is marked with the OSD full flag.  This flag causes
+most normal RADOS clients to pause all operations until it is resolved
+(for example by adding more capacity to the cluster).
+
+The filesystem has some special handling of the full flag, explained below.
+
+Hammer and later
+----------------
+
+Since the hammer release, a full filesystem will lead to ENOSPC
+results from:
+
+ * Data writes on the client
+ * Metadata operations other than deletes and truncates
+
+Because the full condition may not be encountered until
+data is flushed to disk (sometime after a ``write`` call has already
+returned 0), the ENOSPC error may not be seen until the application
+calls ``fsync`` or ``fclose`` (or equivalent) on the file handle.
+
+Calling ``fsync`` is guaranteed to reliably indicate whether the data
+made it to disk, and will return an error if it doesn't.  ``fclose`` will
+only return an error if buffered data happened to be flushed since
+the last write -- a successful ``fclose`` does not guarantee that the
+data made it to disk, and in a full-space situation, buffered data
+may be discarded after an ``fclose`` if no space is available to persist it.
+
+.. warning::
+    If an application appears to be misbehaving on a full filesystem,
+    check that it is performing ``fsync()`` calls as necessary to ensure
+    data is on disk before proceeding.
+
+Data writes may be cancelled by the client if they are in flight at the
+time the OSD full flag is sent.  Clients update the ``osd_epoch_barrier``
+when releasing capabilities on files affected by cancelled operations, in
+order to ensure that these cancelled operations do not interfere with
+subsequent access to the data objects by the MDS or other clients.  For
+more on the epoch barrier mechanism, see :doc:`eviction`.
+
+Legacy (pre-hammer) behavior
+----------------------------
+
+In versions of Ceph earlier than hammer, the MDS would ignore
+the full status of the RADOS cluster, and any data writes from
+clients would stall until the cluster ceased to be full.
+
+There are two dangerous conditions to watch for with this behaviour:
+
+* If a client had pending writes to a file, then it was not possible
+  for the client to release the file to the MDS for deletion: this could
+  lead to difficulty clearing space on a full filesystem
+* If clients continued to create a large number of empty files, the
+  resulting metadata writes from the MDS could lead to total exhaustion
+  of space on the OSDs such that no further deletions could be performed.
+
diff --git a/doc/cephfs/fuse.rst b/doc/cephfs/fuse.rst
new file mode 100644
index 0000000..cd6d74e
--- /dev/null
+++ b/doc/cephfs/fuse.rst
@@ -0,0 +1,36 @@
+=========================
+ Mount Ceph FS as a FUSE
+=========================
+
+For Ceph version 0.55 and later, ``cephx`` authentication is on by default.
+Before mounting a Ceph File System in User Space (FUSE), ensure that the client
+host has a copy of the Ceph configuration file and a keyring with CAPS for the
+Ceph metadata server.
+
+#. From your client host, copy the Ceph configuration file from the monitor host 
+   to the ``/etc/ceph`` directory. :: 
+
+	sudo mkdir -p /etc/ceph
+	sudo scp {user}@{server-machine}:/etc/ceph/ceph.conf /etc/ceph/ceph.conf
+
+#. From your client host, copy the Ceph keyring from the monitor host to 
+   to the ``/etc/ceph`` directory. :: 
+
+	sudo scp {user}@{server-machine}:/etc/ceph/ceph.keyring /etc/ceph/ceph.keyring
+
+#. Ensure that the Ceph configuration file and the keyring have appropriate 
+   permissions set on your client machine  (e.g., ``chmod 644``).
+
+For additional details on ``cephx`` configuration, see 
+`CEPHX Config Reference`_.
+
+To mount the Ceph file system as a FUSE, you may use the ``ceph-fuse`` command.
+For example::
+
+	sudo mkdir /home/usernname/cephfs
+	sudo ceph-fuse -m 192.168.0.1:6789 /home/username/cephfs
+
+See `ceph-fuse`_ for additional details.
+
+.. _ceph-fuse: ../../man/8/ceph-fuse/
+.. _CEPHX Config Reference: ../../rados/configuration/auth-config-ref
\ No newline at end of file
diff --git a/doc/cephfs/hadoop.rst b/doc/cephfs/hadoop.rst
new file mode 100644
index 0000000..fc3f300
--- /dev/null
+++ b/doc/cephfs/hadoop.rst
@@ -0,0 +1,202 @@
+========================
+Using Hadoop with CephFS
+========================
+
+The Ceph file system can be used as a drop-in replacement for the Hadoop File
+System (HDFS). This page describes the installation and configuration process
+of using Ceph with Hadoop.
+
+Dependencies
+============
+
+* CephFS Java Interface
+* Hadoop CephFS Plugin
+
+.. important:: Currently requires Hadoop 1.1.X stable series
+
+Installation
+============
+
+There are three requirements for using CephFS with Hadoop. First, a running
+Ceph installation is required. The details of setting up a Ceph cluster and
+the file system are beyond the scope of this document. Please refer to the
+Ceph documentation for installing Ceph.
+
+The remaining two requirements are a Hadoop installation, and the Ceph file
+system Java packages, including the Java CephFS Hadoop plugin. The high-level
+steps are two add the dependencies to the Hadoop installation ``CLASSPATH``,
+and configure Hadoop to use the Ceph file system.
+
+CephFS Java Packages
+--------------------
+
+* CephFS Hadoop plugin (`hadoop-cephfs.jar <http://ceph.com/download/hadoop-cephfs.jar>`_)
+
+Adding these dependencies to a Hadoop installation will depend on your
+particular deployment. In general the dependencies must be present on each
+node in the system that will be part of the Hadoop cluster, and must be in the
+``CLASSPATH`` searched for by Hadoop. Typically approaches are to place the
+additional ``jar`` files into the ``hadoop/lib`` directory, or to edit the
+``HADOOP_CLASSPATH`` variable in ``hadoop-env.sh``.
+
+The native Ceph file system client must be installed on each participating
+node in the Hadoop cluster.
+
+Hadoop Configuration
+====================
+
+This section describes the Hadoop configuration options used to control Ceph.
+These options are intended to be set in the Hadoop configuration file
+`conf/core-site.xml`.
+
++---------------------+--------------------------+----------------------------+
+|Property             |Value                     |Notes                       |
+|                     |                          |                            |
++=====================+==========================+============================+
+|fs.default.name      |Ceph URI                  |ceph://[monaddr:port]/      |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.conf.file       |Local path to ceph.conf   |/etc/ceph/ceph.conf         |
+|                     |                          |                            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.conf.options    |Comma separated list of   |opt1=val1,opt2=val2         |
+|                     |Ceph configuration        |                            |
+|                     |key/value pairs           |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.root.dir        |Mount root directory      |Default value: /            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.mon.address     |Monitor address           |host:port                   |
+|                     |                          |                            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.auth.id         |Ceph user id              |Example: admin              |
+|                     |                          |                            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.auth.keyfile    |Ceph key file             |                            |
+|                     |                          |                            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.auth.keyring    |Ceph keyring file         |                            |
+|                     |                          |                            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.object.size     |Default file object size  |Default value (64MB):       |
+|                     |in bytes                  |67108864                    |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.data.pools      |List of Ceph data pools   |Default value: default Ceph |
+|                     |for storing file.         |pool.                       |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+|ceph.localize.reads  |Allow reading from file   |Default value: true         |
+|                     |replica objects           |                            |
+|                     |                          |                            |
+|                     |                          |                            |
++---------------------+--------------------------+----------------------------+
+
+Support For Per-file Custom Replication
+---------------------------------------
+
+The Hadoop file system interface allows users to specify a custom replication
+factor (e.g. 3 copies of each block) when creating a file. However, object
+replication factors in the Ceph file system are controlled on a per-pool
+basis, and by default a Ceph file system will contain only a single
+pre-configured pool. Thus, in order to support per-file replication with
+Hadoop over Ceph, additional storage pools with non-default replications
+factors must be created, and Hadoop must be configured to choose from these
+additional pools.
+
+Additional data pools can be specified using the ``ceph.data.pools``
+configuration option. The value of the option is a comma separated list of
+pool names. The default Ceph pool will be used automatically if this
+configuration option is omitted or the value is empty. For example, the
+following configuration setting will consider the pools ``pool1``, ``pool2``, and
+``pool5`` when selecting a target pool to store a file. ::
+
+	<property>
+	  <name>ceph.data.pools</name>
+	  <value>pool1,pool2,pool5</value>
+	</property>
+
+Hadoop will not create pools automatically. In order to create a new pool with
+a specific replication factor use the ``ceph osd pool create`` command, and then
+set the ``size`` property on the pool using the ``ceph osd pool set`` command. For
+more information on creating and configuring pools see the `RADOS Pool
+documentation`_.
+
+.. _RADOS Pool documentation: ../../rados/operations/pools
+
+Once a pool has been created and configured the metadata service must be told
+that the new pool may be used to store file data. A pool is be made available
+for storing file system data using the ``ceph mds add_data_pool`` command.
+
+First, create the pool. In this example we create the ``hadoop1`` pool with
+replication factor 1. ::
+
+    ceph osd pool create hadoop1 100
+    ceph osd pool set hadoop1 size 1
+
+Next, determine the pool id. This can be done by examining the output of the
+``ceph osd dump`` command. For example, we can look for the newly created
+``hadoop1`` pool. ::
+
+    ceph osd dump | grep hadoop1
+
+The output should resemble::
+
+    pool 3 'hadoop1' rep size 1 min_size 1 crush_ruleset 0...
+
+where ``3`` is the pool id. Next we will use the pool id reference to register
+the pool as a data pool for storing file system data. ::
+
+    ceph mds add_data_pool 3
+
+The final step is to configure Hadoop to consider this data pool when
+selecting the target pool for new files. ::
+
+	<property>
+		<name>ceph.data.pools</name>
+		<value>hadoop1</value>
+	</property>
+
+Pool Selection Rules
+~~~~~~~~~~~~~~~~~~~~
+
+The following rules describe how Hadoop chooses a pool given a desired
+replication factor and the set of pools specified using the
+``ceph.data.pools`` configuration option.
+
+1. When no custom pools are specified the default Ceph data pool is used.
+2. A custom pool with the same replication factor as the default Ceph data
+   pool will override the default.
+3. A pool with a replication factor that matches the desired replication will
+   be chosen if it exists.
+4. Otherwise, a pool with at least the desired replication factor will be
+   chosen, or the maximum possible.
+
+Debugging Pool Selection
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Hadoop will produce log file entry when it cannot determine the replication
+factor of a pool (e.g. it is not configured as a data pool). The log message
+will appear as follows::
+
+    Error looking up replication of pool: <pool name>
+
+Hadoop will also produce a log entry when it wasn't able to select an exact
+match for replication. This log entry will appear as follows::
+
+    selectDataPool path=<path> pool:repl=<name>:<value> wanted=<value>
diff --git a/doc/cephfs/index.rst b/doc/cephfs/index.rst
new file mode 100644
index 0000000..b128296
--- /dev/null
+++ b/doc/cephfs/index.rst
@@ -0,0 +1,101 @@
+=================
+ Ceph Filesystem
+=================
+
+The :term:`Ceph Filesystem` (Ceph FS) is a POSIX-compliant filesystem that uses
+a Ceph Storage Cluster to store its data. The Ceph filesystem uses the same Ceph
+Storage Cluster system as Ceph Block Devices, Ceph Object Storage with its S3
+and Swift APIs, or native bindings (librados).
+
+.. important:: CephFS currently lacks a robust 'fsck' check and
+               repair function.  Please use caution when storing
+               important data as the disaster recovery tools are
+               still under development.  For more information about
+               using CephFS today, see :doc:`/cephfs/early-adopters`
+
+.. ditaa::
+            +-----------------------+  +------------------------+
+            |                       |  |      CephFS FUSE       |
+            |                       |  +------------------------+
+            |                       |
+            |                       |  +------------------------+
+            |  CephFS Kernel Object |  |     CephFS Library     |
+            |                       |  +------------------------+
+            |                       |
+            |                       |  +------------------------+
+            |                       |  |        librados        |
+            +-----------------------+  +------------------------+
+
+            +---------------+ +---------------+ +---------------+
+            |      OSDs     | |      MDSs     | |    Monitors   |
+            +---------------+ +---------------+ +---------------+
+
+
+Using the Ceph Filesystem requires at least one :term:`Ceph Metadata Server` in
+your Ceph Storage Cluster.
+
+
+
+.. raw:: html
+
+	<style type="text/css">div.body h3{margin:5px 0px 0px 0px;}</style>
+	<table cellpadding="10"><colgroup><col width="33%"><col width="33%"><col width="33%"></colgroup><tbody valign="top"><tr><td><h3>Step 1: Metadata Server</h3>
+
+To run the Ceph Filesystem, you must have a running Ceph Storage Cluster with at
+least one :term:`Ceph Metadata Server` running.
+
+
+.. toctree:: 
+	:maxdepth: 1
+
+	Add/Remove MDS <../../rados/deployment/ceph-deploy-mds>
+	MDS failover and standby configuration <standby>
+	MDS Configuration Settings <mds-config-ref>
+	Journaler Configuration <journaler>
+	Manpage ceph-mds <../../man/8/ceph-mds>
+
+.. raw:: html 
+
+	</td><td><h3>Step 2: Mount CephFS</h3>
+
+Once you have a healthy Ceph Storage Cluster with at least
+one Ceph Metadata Server, you may create and mount your Ceph Filesystem.
+Ensure that you client has network connectivity and the proper
+authentication keyring.
+
+.. toctree:: 
+	:maxdepth: 1
+
+	Create CephFS <createfs>
+	Mount CephFS <kernel>
+	Mount CephFS as FUSE <fuse>
+	Mount CephFS in fstab <fstab>
+	Manpage cephfs <../../man/8/cephfs>
+	Manpage ceph-fuse <../../man/8/ceph-fuse>
+	Manpage mount.ceph <../../man/8/mount.ceph>
+
+
+.. raw:: html 
+
+	</td><td><h3>Additional Details</h3>
+
+.. toctree:: 
+	:maxdepth: 1
+
+    Administrative commands <administration>
+	POSIX compatibility <posix>
+        CephFS Quotas <quota>
+	Using Ceph with Hadoop <hadoop>
+	libcephfs <../../api/libcephfs-java/>
+	cephfs-journal-tool <cephfs-journal-tool>
+	File layouts <file-layouts>
+	Client eviction <eviction>
+	Handling full filesystems <full>
+	Troubleshooting <troubleshooting>
+	Disaster recovery <disaster-recovery>
+	Client authentication <client-auth>
+	Upgrading old filesystems <upgrading>
+
+.. raw:: html
+
+	</td></tr></tbody></table>
diff --git a/doc/cephfs/journaler.rst b/doc/cephfs/journaler.rst
new file mode 100644
index 0000000..eeedea7
--- /dev/null
+++ b/doc/cephfs/journaler.rst
@@ -0,0 +1,49 @@
+===========
+ Journaler
+===========
+
+``journaler allow split entries``
+
+:Description: Allow an entry to span a stripe boundary
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``journaler write head interval``
+
+:Description: How frequently to update the journal head object
+:Type: Integer
+:Required: No
+:Default: ``15``
+
+
+``journaler prefetch periods``
+
+:Description: How many stripe periods to read-ahead on journal replay
+:Type: Integer
+:Required: No
+:Default: ``10``
+
+
+``journal prezero periods``
+
+:Description: How mnay stripe periods to zero ahead of write position
+:Type: Integer
+:Required: No
+:Default: ``10``
+
+``journaler batch interval``
+
+:Description: Maximum additional latency in seconds we incur artificially. 
+:Type: Double
+:Required: No
+:Default: ``.001``
+
+
+``journaler batch max``
+
+:Description: Maximum bytes we'll delay flushing. 
+:Type: 64-bit Unsigned Integer 
+:Required: No
+:Default: ``0``
diff --git a/doc/cephfs/kernel.rst b/doc/cephfs/kernel.rst
new file mode 100644
index 0000000..0bf891a
--- /dev/null
+++ b/doc/cephfs/kernel.rst
@@ -0,0 +1,34 @@
+======================================
+ Mount Ceph FS with the Kernel Driver
+======================================
+
+To mount the Ceph file system you may use the ``mount`` command if you know the
+monitor host IP address(es), or use the ``mount.ceph`` utility to resolve the 
+monitor host name(s) into IP address(es) for you. For example:: 
+
+	sudo mkdir /mnt/mycephfs
+	sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs
+
+To mount the Ceph file system with ``cephx`` authentication enabled, you must
+specify a user name and a secret. ::
+
+	sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secret=AQATSKdNGBnwLhAAnNDKnH65FmVKpXZJVasUeQ==
+
+The foregoing usage leaves the secret in the Bash history. A more secure
+approach reads the secret from a file. For example::
+
+	sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secretfile=/etc/ceph/admin.secret
+	
+See `Authentication`_ for details on cephx.
+
+To unmount the Ceph file system, you may use the ``umount`` command. For example:: 
+
+	sudo umount /mnt/mycephfs
+
+.. tip:: Ensure that you are not within the file system directories before
+   executing this command.
+
+See `mount.ceph`_ for details.
+
+.. _mount.ceph: ../../man/8/mount.ceph/
+.. _Authentication: ../../rados/operations/authentication/
\ No newline at end of file
diff --git a/doc/cephfs/mds-config-ref.rst b/doc/cephfs/mds-config-ref.rst
new file mode 100644
index 0000000..60f1745
--- /dev/null
+++ b/doc/cephfs/mds-config-ref.rst
@@ -0,0 +1,610 @@
+======================
+ MDS Config Reference
+======================
+
+``mon force standby active`` 
+
+:Description: If ``true`` monitors force standby-replay to be active. Set
+              under ``[mon]`` or ``[global]``.
+
+:Type: Boolean
+:Default: ``true`` 
+
+
+``mds max file size``
+
+:Description: The maximum allowed file size to set when creating a 
+              new file system.
+
+:Type:  64-bit Integer Unsigned
+:Default:  ``1ULL << 40``
+
+
+``mds cache size``
+
+:Description: The number of inodes to cache.
+:Type:  32-bit Integer
+:Default: ``100000``
+
+
+``mds cache mid``
+
+:Description: The insertion point for new items in the cache LRU 
+              (from the top).
+
+:Type:  Float
+:Default: ``0.7``
+
+
+``mds dir commit ratio``
+
+:Description: The fraction of directory that is dirty before Ceph commits using 
+              a full update (instead of partial update).
+
+:Type:  Float
+:Default: ``0.5``
+
+
+``mds dir max commit size``
+
+:Description: The maximum size of a directory update before Ceph breaks it into 
+              smaller transactions) (MB).
+              
+:Type:  32-bit Integer
+:Default: ``90``
+
+
+``mds decay halflife``
+
+:Description: The half-life of MDS cache temperature.
+:Type:  Float
+:Default: ``5``
+
+``mds beacon interval``
+
+:Description: The frequency (in seconds) of beacon messages sent 
+              to the monitor.
+
+:Type:  Float
+:Default: ``4``
+
+
+``mds beacon grace``
+
+:Description: The interval without beacons before Ceph declares an MDS laggy 
+              (and possibly replace it).
+              
+:Type:  Float
+:Default: ``15``
+
+
+``mds blacklist interval``
+
+:Description: The blacklist duration for failed MDSs in the OSD map.
+:Type:  Float
+:Default: ``24.0*60.0``
+
+
+``mds session timeout``
+
+:Description: The interval (in seconds) of client inactivity before Ceph 
+              times out capabilities and leases.
+              
+:Type:  Float
+:Default: ``60``
+
+
+``mds session autoclose``
+
+:Description: The interval (in seconds) before Ceph closes 
+              a laggy client's session.
+              
+:Type:  Float
+:Default: ``300``
+
+
+``mds reconnect timeout``
+
+:Description: The interval (in seconds) to wait for clients to reconnect 
+              during MDS restart.
+
+:Type:  Float
+:Default: ``45``
+
+
+``mds tick interval``
+
+:Description: How frequently the MDS performs internal periodic tasks.
+:Type:  Float
+:Default: ``5``
+
+
+``mds dirstat min interval``
+
+:Description: The minimum interval (in seconds) to try to avoid propagating 
+              recursive stats up the tree.
+              
+:Type:  Float
+:Default: ``1``
+
+``mds scatter nudge interval``
+
+:Description: How quickly dirstat changes propagate up.
+:Type:  Float
+:Default: ``5``
+
+
+``mds client prealloc inos``
+
+:Description: The number of inode numbers to preallocate per client session.
+:Type:  32-bit Integer
+:Default: ``1000``
+
+
+``mds early reply``
+
+:Description: Determines whether the MDS should allow clients to see request 
+              results before they commit to the journal.
+
+:Type:  Boolean
+:Default: ``true``
+
+
+``mds use tmap``
+
+:Description: Use trivialmap for directory updates.
+:Type:  Boolean
+:Default: ``true``
+
+
+``mds default dir hash``
+
+:Description: The function to use for hashing files across directory fragments.
+:Type:  32-bit Integer
+:Default: ``2`` (i.e., rjenkins)
+
+
+``mds log``
+
+:Description: Set to ``true`` if the MDS should journal metadata updates 
+              (disabled for benchmarking only).
+              
+:Type:  Boolean
+:Default: ``true``
+
+
+``mds log skip corrupt events``
+
+:Description: Determines whether the MDS should try to skip corrupt journal 
+              events during journal replay.
+              
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds log max events``
+
+:Description: The maximum events in the journal before we initiate trimming.
+              Set to ``-1`` to disable limits.
+              
+:Type:  32-bit Integer
+:Default: ``-1``
+
+
+``mds log max segments``
+
+:Description: The maximum number of segments (objects) in the journal before 
+              we initiate trimming. Set to ``-1`` to disable limits.
+
+:Type:  32-bit Integer
+:Default: ``30``
+
+
+``mds log max expiring``
+
+:Description: The maximum number of segments to expire in parallels
+:Type:  32-bit Integer
+:Default: ``20``
+
+
+``mds log eopen size``
+
+:Description: The maximum number of inodes in an EOpen event.
+:Type:  32-bit Integer
+:Default: ``100``
+
+
+``mds bal sample interval``
+
+:Description: Determines how frequently to sample directory temperature 
+              (for fragmentation decisions).
+              
+:Type:  Float
+:Default: ``3``
+
+
+``mds bal replicate threshold``
+
+:Description: The maximum temperature before Ceph attempts to replicate 
+              metadata to other nodes.
+              
+:Type:  Float
+:Default: ``8000``
+
+
+``mds bal unreplicate threshold``
+
+:Description: The minimum temperature before Ceph stops replicating 
+              metadata to other nodes.
+              
+:Type:  Float
+:Default: ``0``
+
+
+``mds bal frag``
+
+:Description: Determines whether the MDS will fragment directories.
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds bal split size``
+
+:Description: The maximum directory size before the MDS will split a directory 
+              fragment into smaller bits.
+              
+:Type:  32-bit Integer
+:Default: ``10000``
+
+
+``mds bal split rd``
+
+:Description: The maximum directory read temperature before Ceph splits 
+              a directory fragment.
+              
+:Type:  Float
+:Default: ``25000``
+
+
+``mds bal split wr``
+
+:Description: The maximum directory write temperature before Ceph splits 
+              a directory fragment.
+              
+:Type:  Float
+:Default: ``10000``
+
+
+``mds bal split bits``
+
+:Description: The number of bits by which to split a directory fragment.
+:Type:  32-bit Integer
+:Default: ``3``
+
+
+``mds bal merge size``
+
+:Description: The minimum directory size before Ceph tries to merge 
+              adjacent directory fragments.
+              
+:Type:  32-bit Integer
+:Default: ``50``
+
+
+``mds bal merge rd``
+
+:Description: The minimum read temperature before Ceph merges 
+              adjacent directory fragments.
+
+:Type:  Float
+:Default: ``1000``
+
+
+``mds bal merge wr``
+
+:Description: The minimum write temperature before Ceph merges 
+              adjacent directory fragments.
+              
+:Type:  Float
+:Default: ``1000``
+
+
+``mds bal interval``
+
+:Description: The frequency (in seconds) of workload exchanges between MDSs.
+:Type:  32-bit Integer
+:Default: ``10``
+
+
+``mds bal fragment interval``
+
+:Description: The frequency (in seconds) of adjusting directory fragmentation.
+:Type:  32-bit Integer
+:Default: ``5``
+
+
+``mds bal idle threshold``
+
+:Description: The minimum temperature before Ceph migrates a subtree 
+              back to its parent.
+              
+:Type:  Float
+:Default: ``0``
+
+
+``mds bal max``
+
+:Description: The number of iterations to run balancer before Ceph stops. 
+              (used for testing purposes only)
+
+:Type:  32-bit Integer
+:Default: ``-1``
+
+
+``mds bal max until``
+
+:Description: The number of seconds to run balancer before Ceph stops. 
+              (used for testing purposes only)
+
+:Type:  32-bit Integer
+:Default: ``-1``
+
+
+``mds bal mode``
+
+:Description: The method for calculating MDS load. 
+
+              - ``1`` = Hybrid.
+              - ``2`` = Request rate and latency. 
+              - ``3`` = CPU load.
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds bal min rebalance``
+
+:Description: The minimum subtree temperature before Ceph migrates.
+:Type:  Float
+:Default: ``0.1``
+
+
+``mds bal min start``
+
+:Description: The minimum subtree temperature before Ceph searches a subtree.
+:Type:  Float
+:Default: ``0.2``
+
+
+``mds bal need min``
+
+:Description: The minimum fraction of target subtree size to accept.
+:Type:  Float
+:Default: ``0.8``
+
+
+``mds bal need max``
+
+:Description: The maximum fraction of target subtree size to accept.
+:Type:  Float
+:Default: ``1.2``
+
+
+``mds bal midchunk``
+
+:Description: Ceph will migrate any subtree that is larger than this fraction 
+              of the target subtree size.
+              
+:Type:  Float
+:Default: ``0.3``
+
+
+``mds bal minchunk``
+
+:Description: Ceph will ignore any subtree that is smaller than this fraction 
+              of the target subtree size.
+              
+:Type:  Float
+:Default: ``0.001``
+
+
+``mds bal target removal min``
+
+:Description: The minimum number of balancer iterations before Ceph removes
+              an old MDS target from the MDS map.
+              
+:Type:  32-bit Integer
+:Default: ``5``
+
+
+``mds bal target removal max``
+
+:Description: The maximum number of balancer iteration before Ceph removes 
+              an old MDS target from the MDS map.
+              
+:Type:  32-bit Integer
+:Default: ``10``
+
+
+``mds replay interval``
+
+:Description: The journal poll interval when in standby-replay mode.
+              ("hot standby")
+              
+:Type:  Float
+:Default: ``1``
+
+
+``mds shutdown check``
+
+:Description: The interval for polling the cache during MDS shutdown.
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds thrash exports``
+
+:Description: Ceph will randomly export subtrees between nodes (testing only).
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds thrash fragments``
+
+:Description: Ceph will randomly fragment or merge directories.
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds dump cache on map``
+
+:Description: Ceph will dump the MDS cache contents to a file on each MDSMap.
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds dump cache after rejoin``
+
+:Description: Ceph will dump MDS cache contents to a file after 
+              rejoining the cache (during recovery).
+              
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds verify scatter``
+
+:Description: Ceph will assert that various scatter/gather invariants 
+              are ``true`` (developers only).
+              
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds debug scatterstat``
+
+:Description: Ceph will assert that various recursive stat invariants 
+              are ``true`` (for developers only).
+              
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds debug frag``
+
+:Description: Ceph will verify directory fragmentation invariants 
+              when convenient (developers only).
+              
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds debug auth pins``
+
+:Description: The debug auth pin invariants (for developers only).
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds debug subtrees``
+
+:Description: The debug subtree invariants (for developers only).
+:Type:  Boolean
+:Default:  ``false``
+
+
+``mds kill mdstable at``
+
+:Description: Ceph will inject MDS failure in MDSTable code 
+              (for developers only).
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds kill export at``
+
+:Description: Ceph will inject MDS failure in the subtree export code 
+              (for developers only).
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds kill import at``
+
+:Description: Ceph will inject MDS failure in the subtree import code 
+              (for developers only).
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds kill link at``
+
+:Description: Ceph will inject MDS failure in hard link code 
+              (for developers only).
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds kill rename at``
+
+:Description: Ceph will inject MDS failure in the rename code 
+              (for developers only).
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds wipe sessions``
+
+:Description: Ceph will delete all client sessions on startup 
+              (for testing only).
+              
+:Type:  Boolean
+:Default: ``0``
+
+
+``mds wipe ino prealloc``
+
+:Description: Ceph will delete ino preallocation metadata on startup 
+              (for testing only).
+              
+:Type:  Boolean
+:Default: ``0``
+
+
+``mds skip ino``
+
+:Description: The number of inode numbers to skip on startup 
+              (for testing only).
+              
+:Type:  32-bit Integer
+:Default: ``0``
+
+
+``mds standby for name``
+
+:Description: An MDS daemon will standby for another MDS daemon of the name 
+              specified in this setting.
+
+:Type:  String
+:Default: N/A
+
+
+``mds standby for rank``
+
+:Description: An MDS daemon will standby for an MDS daemon of this rank. 
+:Type:  32-bit Integer
+:Default: ``-1``
+
+
+``mds standby replay``
+
+:Description: Determines whether a ``ceph-mds`` daemon should poll and replay 
+              the log of an active MDS (hot standby).
+              
+:Type:  Boolean
+:Default:  ``false``
diff --git a/doc/cephfs/posix.rst b/doc/cephfs/posix.rst
new file mode 100644
index 0000000..6a62cb2
--- /dev/null
+++ b/doc/cephfs/posix.rst
@@ -0,0 +1,49 @@
+========================
+ Differences from POSIX
+========================
+
+CephFS aims to adhere to POSIX semantics wherever possible.  For
+example, in contrast to many other common network file systems like
+NFS, CephFS maintains strong cache coherency across clients.  The goal
+is for processes communicating via the file system to behave the same
+when they are on different hosts as when they are on the same host.
+
+However, there are a few places where CephFS diverges from strict
+POSIX semantics for various reasons:
+
+- If a client is writing to a file and fails, its writes are not
+  necessarily atomic. That is, the client may call write(2) on a file
+  opened with O_SYNC with an 8 MB buffer and then crash and the write
+  may be only partially applied.  (Almost all file systems, even local
+  file systems, have this behavior.)
+- In shared simultaneous writer situations, a write that crosses
+  object boundaries is not necessarily atomic. This means that you
+  could have writer A write "aa|aa" and writer B write "bb|bb"
+  simultaneously (where | is the object boundary), and end up with
+  "aa|bb" rather than the proper "aa|aa" or "bb|bb".
+- POSIX includes the telldir(2) and seekdir(2) system calls that allow
+  you to obtain the current directory offset and seek back to it.
+  Because CephFS may refragment directories at any time, it is
+  difficult to return a stable integer offset for a directory.  As
+  such, a seekdir to a non-zero offset may often work but is not
+  guaranteed to do so.  A seekdir to offset 0 will always work (and is
+  equivalent to rewinddir(2)).
+- Sparse files propagate incorrectly to the stat(2) st_blocks field.
+  Because CephFS does not explicitly track which parts of a file are
+  allocated/written, the st_blocks field is always populated by the
+  file size divided by the block size.  This will cause tools like
+  du(1) to overestimate consumed space.  (The recursive size field,
+  maintained by CephFS, also includes file "holes" in its count.)
+- When a file is mapped into memory via mmap(2) on multiple hosts,
+  writes are not coherently propagated to other clients' caches.  That
+  is, if a page is cached on host A, and then updated on host B, host
+  A's page is not coherently invalidated.  (Shared writable mmap
+  appears to be quite rare--we have yet to here any complaints about this
+  behavior, and implementing cache coherency properly is complex.)
+- CephFS clients present a hidden ``.snap`` directory that is used to
+  access, create, delete, and rename snapshots.  Although the virtual
+  directory is excluded from readdir(2), any process that tries to
+  create a file or directory with the same name will get an error
+  code.  The name of this hidden directory can be changed at mount
+  time with ``-o snapdirname=.somethingelse`` (Linux) or the config
+  option ``client_snapdir`` (libcephfs, ceph-fuse).
diff --git a/doc/cephfs/quota.rst b/doc/cephfs/quota.rst
new file mode 100644
index 0000000..13198e3
--- /dev/null
+++ b/doc/cephfs/quota.rst
@@ -0,0 +1,70 @@
+CephFS Quotas
+=============
+
+CephFS allows quotas to be set on any directory in the system.  The
+quota can restrict the number of *bytes* or the number of *files*
+stored beneath that point in the directory hierarchy.
+
+Limitations
+-----------
+
+#. *Quotas are cooperative and non-adversarial.* CephFS quotas rely on
+   the cooperation of the client who is mounting the file system to
+   stop writers when a limit is reached.  A modified or adversarial
+   client cannot be prevented from writing as much data as it needs.
+   Quotas should not be relied on to prevent filling the system in
+   environments where the clients are fully untrusted.
+
+#. *Quotas are imprecise.* Processes that are writing to the file
+   system will be stopped a short time after the quota limit is
+   reached.  They will inevitably be allowed to write some amount of
+   data over the configured limit.  How far over the quota they are
+   able to go depends primarily on the amount of time, not the amount
+   of data.  Generally speaking writers will be stopped within 10s of
+   seconds of crossing the configured limit.
+
+#. *Quotas are not yet implemented in the kernel client.* Quotas are
+   supported by the userspace client (libcephfs, ceph-fuse) but are
+   not yet implemented in the Linux kernel client.
+
+#. *Quotas must be configured carefully when used with path-based
+   mount restrictions.* The client needs to have access to the
+   directory inode on which quotas are configured in order to enforce
+   them.  If the client has restricted access to a specific path
+   (e.g., ``/home/user``) based on the MDS capability, and a quota is
+   configured on an ancestor directory they do not have access to
+   (e.g., ``/home``), the client will not enforce it.  When using
+   path-based access restrictions be sure to configure the quota on
+   the directory the client is restricted too (e.g., ``/home/user``)
+   or something nested beneath it.
+
+Configuration
+-------------
+
+Like most other things in CephFS, quotas are configured using virtual
+extended attributes:
+
+ * ``ceph.quota.max_files`` -- file limit
+ * ``ceph.quota.max_bytes`` -- byte limit
+
+If the attributes appear on a directory inode that means a quota is
+configured there.  If they are not present then no quota is set on
+that directory (although one may still be configured on a parent directory).
+
+To set a quota::
+
+  setfattr -n ceph.quota.max_bytes -v 100000000 /some/dir     # 100 MB
+  setfattr -n ceph.quota.max_files -v 10000 /some/dir         # 10,000 files
+
+To view quota settings::
+
+  getfattr -n ceph.quota.max_bytes /some/dir
+  getfattr -n ceph.quota.max_files /some/dir
+
+Note that if the value of the extended attribute is ``0`` that means
+the quota is not set.
+
+To remove a quota::
+
+  setfattr -n ceph.quota.max_bytes -v 0 /some/dir
+  setfattr -n ceph.quota.max_files -v 0 /some/dir
diff --git a/doc/cephfs/standby.rst b/doc/cephfs/standby.rst
new file mode 100644
index 0000000..c93699c
--- /dev/null
+++ b/doc/cephfs/standby.rst
@@ -0,0 +1,208 @@
+
+Terminology
+-----------
+
+A Ceph cluster may have zero or more CephFS *filesystems*.  CephFS
+filesystems have a human readable name (set in ``fs new``)
+and an integer ID.  The ID is called the filesystem cluster ID,
+or *FSCID*.
+
+Each CephFS filesystem has a number of *ranks*, one by default,
+which start at zero.  A rank may be thought of as a metadata shard.
+
+Each CephFS ceph-mds process (a *daemon*) initially starts up
+without a rank.  It may be assigned one by the monitor cluster.
+A daemon may only hold one rank at a time.  Daemons only give up
+a rank when the ceph-mds process stops.
+
+If a rank is not associated with a daemon, the rank is
+considered *failed*.  Once a rank is assigned to a daemon,
+the rank is considered *up*.
+
+Each CephFS filesystem has a *max_mds* setting, which controls
+how many ranks will be created.  The actual number of ranks
+in the filesystem will only be increased if a spare daemon is
+available to take on the new rank.
+
+An daemon has a *name* that is set statically by the administrator
+when the daemon is first configured.  Typical configurations
+use the hostname where the daemon runs as the daemon name.
+
+Each time a daemon starts up, it is also assigned a *GID*, which
+is unique to this particular process lifetime of the daemon.  The
+GID is an integer.
+
+Referring to MDS daemons
+------------------------
+
+Most of the administrative commands that refer to an MDS daemon
+accept a flexible argument format that may contain a rank, a GID
+or a name.
+
+Where a rank is used, this may optionally be qualified with
+a leading filesystem name or ID.  If a daemon is a standby (i.e.
+it is not currently assigned a rank), then it may only be
+referred to by GID or name.
+
+For example, if we had an MDS daemon which was called 'myhost',
+had GID 5446, and was assigned rank 0 in the filesystem 'myfs'
+which had FSCID 3, then any of the following would be suitable
+forms of the 'fail' command:
+
+::
+
+    ceph mds fail 5446     # GID
+    ceph mds fail myhost   # Daemon name
+    ceph mds fail 0        # Unqualified rank
+    ceph mds fail 3:0      # FSCID and rank
+    ceph mds fail myfs:0   # Filesystem name and rank
+
+Managing failover
+-----------------
+
+If an MDS daemon stops communicating with the monitor, the monitor will
+wait ``mds_beacon_grace`` seconds (default 15 seconds) before marking
+the daemon as *laggy*.
+
+Configuring standby daemons
+---------------------------
+
+There are four configuration settings that control how a daemon
+will behave while in standby:
+
+::
+
+    mds_standby_for_name
+    mds_standby_for_rank
+    mds_standby_for_fscid
+    mds_standby_replay
+
+These may be set in the ceph.conf on the host where the MDS daemon
+runs (as opposed to on the monitor).  The daemon loads these settings
+when it starts, and sends them to the monitor.
+
+By default, if none of these settings are used, all MDS daemons
+which do not hold a rank will be used as standbys for any rank.
+
+The settings which associate a standby daemon with a particular
+name or rank do not guarantee that the daemon will *only* be used
+for that rank.  They mean that when several standbys are available,
+the associated standby daemon will be used.  If a rank is failed,
+and a standby is available, it will be used even if it is associated
+with a different rank or named daemon.
+
+mds_standby_replay
+~~~~~~~~~~~~~~~~~~
+
+If this is set to true, then the standby daemon will continuously read
+the metadata journal an up rank.  This will give it
+a warm metadata cache, and speed up the process of failing over
+if the daemon serving the rank fails.
+
+An up rank may only have one standby replay daemon assigned to it,
+f two daemons are both set to be standby replay then one of them
+will arbitrarily win, and the other will become a normal non-replay
+standby.
+
+Once a daemon has entered the standby replay state, it will only be
+used as a standby for the rank that it is following.  If another rank
+fails, this standby replay daemon will not be used as a replacement,
+even if no other standbys are available.
+
+mds_standby_for_name
+~~~~~~~~~~~~~~~~~~~~
+
+Set this to make the standby daemon only take over a failed rank
+if the last daemon to hold it matches this name.
+
+mds_standby_for_rank
+~~~~~~~~~~~~~~~~~~~~
+
+Set this to make the standby daemon only take over the specified
+rank.  If another rank fails, this daemon will not be used to
+replace it.
+
+Use in conjunction with ``mds_standby_for_fscid`` to be specific
+about which filesystem's rank you are targeting, if you have
+multiple filesystems.
+
+mds_standby_for_fscid
+~~~~~~~~~~~~~~~~~~~~~
+
+If ``mds_standby_for_rank`` is set, this is simply a qualifier to
+say which filesystem's rank is referred to.
+
+If ``mds_standby_for_rank`` is not set, then setting FSCID will
+cause this daemon to target any rank in the specified FSCID.  Use
+this if you have a daemon that you want to use for any rank, but
+only within a particular filesystem.
+
+mon_force_standby_active
+------------------------
+
+This setting is used on monitor hosts.  It defaults to true.
+
+If it is false, then daemons configured with standby_replay=true
+will **only** become active if the rank/name that they have
+been configured to follow fails.  On the other hand, if this
+setting is true, then a daemon configured with standby_replay=true
+may be assigned some other rank.
+
+Examples
+--------
+
+These are example ceph.conf snippets.  In practice you can either
+copy a ceph.conf with all daemons' configuration to all your servers,
+or you can have a different file on each server that contains just
+that server's daemons' configuration.
+
+Simple pair
+~~~~~~~~~~~
+
+Two MDS daemons 'a' and 'b' acting as a pair, where whichever one is not
+currently assigned a rank will be the standby replay follower
+of the other.
+
+::
+
+    [mds.a]
+    mds standby replay = true
+    mds standby for rank = 0
+
+    [mds.b]
+    mds standby replay = true
+    mds standby for rank = 0
+
+Floating standby
+~~~~~~~~~~~~~~~~
+
+Three MDS daemons 'a', 'b' and 'c', in a filesystem that has
+``max_mds`` set to 2.
+
+::
+    
+    # No explicit configuration required: whichever daemon is
+    # not assigned a rank will go into 'standby' and take over
+    # for whichever other daemon fails.
+
+Two MDS clusters
+~~~~~~~~~~~~~~~~
+
+With two filesystems, I have four MDS daemons, and I want two
+to act as a pair for one filesystem and two to act as a pair
+for the other filesystem.
+
+::
+
+    [mds.a]
+    mds standby for fscid = 1
+
+    [mds.b]
+    mds standby for fscid = 1
+
+    [mds.c]
+    mds standby for fscid = 2
+
+    [mds.d]
+    mds standby for fscid = 2
+
diff --git a/doc/cephfs/troubleshooting.rst b/doc/cephfs/troubleshooting.rst
new file mode 100644
index 0000000..554698c
--- /dev/null
+++ b/doc/cephfs/troubleshooting.rst
@@ -0,0 +1,28 @@
+=================
+ Troubleshooting
+=================
+
+
+Mount 5 Error
+=============
+
+A mount 5 error typically occurs if a MDS server is laggy or if it crashed.
+Ensure at least one MDS is up and running, and the cluster is ``active +
+healthy``. 
+
+
+Mount 12 Error
+==============
+
+A mount 12 error with ``cannot allocate memory`` usually occurs if you  have a
+version mismatch between the :term:`Ceph Client` version and the :term:`Ceph
+Storage Cluster` version. Check the versions using:: 
+
+	ceph -v
+	
+If the Ceph Client is behind the Ceph cluster, try to upgrade it:: 
+
+	sudo apt-get update && sudo apt-get install ceph-common 
+
+You may need to uninstall, autoclean and autoremove ``ceph-common`` 
+and then reinstall it so that you have the latest version.
\ No newline at end of file
diff --git a/doc/cephfs/upgrading.rst b/doc/cephfs/upgrading.rst
new file mode 100644
index 0000000..7ee3f09
--- /dev/null
+++ b/doc/cephfs/upgrading.rst
@@ -0,0 +1,34 @@
+
+Upgrading pre-Firefly filesystems past Jewel
+============================================
+
+.. tip::
+
+    This advice only applies to users with filesystems
+    created using versions of Ceph older than *Firefly* (0.80).
+    Users creating new filesystems may disregard this advice.
+
+Pre-firefly versions of Ceph used a now-deprecated format
+for storing CephFS directory objects, called TMAPs.  Support
+for reading these in RADOS will be removed after the Jewel
+release of Ceph, so for upgrading CephFS users it is important
+to ensure that any old directory objects have been converted.
+
+After installing Jewel on all your MDS and OSD servers, and restarting
+the services, run the following command:
+
+::
+    
+    cephfs-data-scan tmap_upgrade <metadata pool name>
+
+This only needs to be run once, and it is not necessary to
+stop any other services while it runs.  The command may take some
+time to execute, as it iterates overall objects in your metadata
+pool.  It is safe to continue using your filesystem as normal while
+it executes.  If the command aborts for any reason, it is safe
+to simply run it again.
+
+If you are upgrading a pre-Firefly CephFS filesystem to a newer Ceph version
+than Jewel, you must first upgrade to Jewel and run the ``tmap_upgrade``
+command before completing your upgrade to the latest version.
+
diff --git a/doc/changelog/v0.48.1argonaut.txt b/doc/changelog/v0.48.1argonaut.txt
new file mode 100644
index 0000000..cdd557f
--- /dev/null
+++ b/doc/changelog/v0.48.1argonaut.txt
@@ -0,0 +1,1286 @@
+commit a7ad701b9bd479f20429f19e6fea7373ca6bba7c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Aug 13 14:58:51 2012 -0700
+
+    v0.48.1argonaut
+
+commit d4849f2f8a8c213c266658467bc5f22763010bc2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 1 13:22:38 2012 -0700
+
+    rgw: fix usage trim call encoding
+    
+    Fixes: #2841.
+    Usage trim operation was encoding the wrong op structure (usage read).
+    Since the structures somewhat overlapped it somewhat worked, but user
+    info wasn't encoded.
+    
+    Backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 515952d07107d442889754ec3bd6a344fad25d58
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 8 15:21:53 2012 -0700
+
+    cls_rgw: fix rgw_cls_usage_log_trim_op encode/decode
+    
+    It was not encoding user, adding that and reset version
+    compatibility.
+    This changes affects command interface, makes use of
+    radosgw-admin usage trim incompatible. Use of old
+    radosgw-admin usage trim should be avoided, as it may
+    remove more data than requested. In any case, upgraded
+    server code will not handle old client's trim requests.
+    
+    backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 2e77130d5c80220be1612b5499d422de620d2d0b
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Jul 31 16:17:22 2012 -0700
+
+    rgw: expand date format support
+    
+    Relaxing the date format parsing function to allow UTC
+    instead of GMT.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 14fa77d9277b5ef5d0c6683504b368773b39ccc4
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Aug 2 11:13:05 2012 -0700
+
+    rgw: complete multipart upload can handle chunked encoding
+    
+    Fixes: #2878
+    We now allow complete multipart upload to use chunked encoding
+    when sending request data. With chunked encoding the HTTP_LENGTH
+    header is not required.
+    
+    Backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit a06f7783fbcc02e775fc36f30e422fe0f9e0ec2d
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 1 11:19:32 2012 -0700
+
+    rgw_xml: xml_handle_data() appends data string
+    
+    Fixes: #2879.
+    xml_handle_data() appends data to the object instead of just
+    replacing it. Parsed data can arrive in pieces, specifically
+    when data is escaped.
+    
+    Backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit a8b224b9c4877a559ce420a2e04f19f68c8c5680
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 1 13:09:41 2012 -0700
+
+    rgw: ETag is unquoted in multipart upload complete
+    
+    Fixes #2877.
+    Removing quotes from ETag before comparing it to what we
+    have when completing a multipart upload.
+    
+    Backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 22259c6efda9a5d55221fd036c757bf123796753
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 8 15:24:57 2012 -0700
+
+    MonMap: return error on failure in build_initial
+    
+    If mon_host fails to parse, return an error instead of success.
+    This avoids failing later on an assert monmap.size() > 0 in the
+    monmap in MonClient.
+    
+    Fixes: #2913
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 49b2c7b5a79b8fb4a3941eca2cb0dbaf22f658b7
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 8 15:10:27 2012 -0700
+
+    addr_parsing: report correct error message
+    
+    getaddrinfo uses its return code to report failures.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 7084f29544f431b7c6a3286356f2448ae0333eda
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Aug 8 14:01:53 2012 -0700
+
+    mkcephfs: use default osd_data, _journal values
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 96b1a496cdfda34a5efdb6686becf0d2e7e3a1c0
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Aug 8 14:01:35 2012 -0700
+
+    mkcephfs: use new default keyring locations
+    
+    The ceph-conf command only parses the conf; it does not apply default
+    config values.  This breaks mkcephfs if values are not specified in the
+    config.
+    
+    Let ceph-osd create its own key, fix copying, and fix creation/copying for
+    the mds.
+    
+    Fixes: #2845
+    Reported-by: Florian Haas <florian at hastexo.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 4bd466d6ed49c7192df4a5bf0d63bda5d7d7dd9a
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 31 14:01:57 2012 -0700
+
+    osd: peering: detect when log source osd goes down
+    
+    The Peering state has a generic check based on the prior set osds that
+    will restart peering if one of them goes down (or one of the interesting
+    down ones comes up).  The GetLog state, however, can pull the log from
+    a peer that is not in the prior set if it got a notify from them (e.g., an
+    osd in an old interval that was down when the prior set was calculated).
+    If that osd goes down, we don't detect it and will block forward.
+    
+    Fix by adding a simple check in GetLog for the newest_update_osd going
+    down.
+    
+    (BTW GetMissing does not suffer from this problem because
+    peer_missing_requested is a subset of the prior set, so the Peering check
+    is sufficient.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit 87defa88a0c6d6aafaa65437a6e4ddd92418f834
+Author: Sylvain Munaut <tnt at 246tNt.com>
+Date:   Tue Jul 31 11:55:56 2012 -0700
+
+    rbd: fix off-by-one error in key name
+    
+    Fixes: #2846
+    Signed-off-by: Sylvain Munaut <tnt at 246tNt.com>
+
+commit 37d5b46269c8a4227e5df61a88579d94f7b56772
+Author: Sylvain Munaut <tnt at 246tNt.com>
+Date:   Tue Jul 31 11:54:29 2012 -0700
+
+    secret: return error on empty secret
+    
+    Signed-off-by: Sylvain Munaut <tnt at 246tNt.com>
+
+commit 7b9d37c662313929b52011ddae47cc8abab99095
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jul 28 10:05:47 2012 -0700
+
+    osd: set STRAY on pg load when non-primary
+    
+    The STRAY bit indicates that we should annouce ourselves to the primary,
+    but it is only set in start_peering_interval().  We also need to set it
+    initially, so that a PG that is loaded but whose role does not change
+    (e.g., the stray replica stays a stray) will notify the primary.
+    
+    Observed:
+     - osd starts up
+     - mapping does not change, STRAY not set
+     - does not announce to primary
+     - primary does not re-check must_have_unfound, objects appear unfound
+    
+    Fix this by initializing STRAY when pg is loaded or created whenever we
+    are not the primary.
+    
+    Fixes: #2866
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 96feca450c5505a06868bc012fe998a03371b77f
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 27 16:03:26 2012 -0700
+
+    osd: peering: make Incomplete a Peering substate
+    
+    This allows us to still catch changes in the prior set that would affect
+    our conclusions (that we are incomplete) and, when they happen, restart
+    peering.
+    
+    Consider:
+     - calc prior set, osd A is down
+     - query everyone else, no good info
+     - set down, go to Incomplete (previously WaitActingChange) state.
+     - osd A comes back up (we do nothing)
+     - osd A sends notify message with good info (we ignore)
+    
+    By making this a Peering substate, we catch the Peering AdvMap reaction,
+    which will notice a prior set down osd is now up and move to Reset.
+    
+    Fixes: #2860
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit a71e442fe620fa3a22ad9302413d8344a3a1a969
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 27 15:39:40 2012 -0700
+
+    osd: peering: move to Incomplete when.. incomplete
+    
+    PG::choose_acting() may return false and *not* request an acting set change
+    if it can't find any suitable peers with enough info to recover.  In that
+    case, we should move to Incomplete, not WaitActingChange, just like we do
+    a bit lower in GetLog() if we have non-contiguous logs.  The state name is
+    more accurate, and this is also needed to fix bug #2860.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 623026d9bc8ea4c845eb3b06d79e0ca9bef50deb
+Merge: 87b6e80 9db7809
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 27 14:00:52 2012 -0700
+
+    Merge remote-tracking branch 'gh/stable' into stable-next
+
+commit 9db78090451e609e3520ac3e57a5f53da03f9ee2
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 26 16:35:00 2012 -0700
+
+    osd: fixing sharing of past_intervals on backfill restart
+    
+    We need to share past_intervals whenever we instantiate the PG on a peer.
+    In the PG activation case, this is based on whether our peer_info[] value
+    for that peer is dne().  However, the backfill code was updating the
+    peer info (history) in the block preceeding the dne() check, which meant
+    we never shared past_intervals in this case and the peer would have to
+    chew through a potentially large number of maps if the PG has not been
+    clean recently.
+    
+    Fix by checking dne() prior to the backfill block.  We still need to fill
+    in the message later because it isn't yet instantiated.
+    
+    Fixes: #2849
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 87b6e8045a3a1ff6439d2684e960ad0dc8988b33
+Merge: 81d72e5 7dfdf4f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 26 15:04:12 2012 -0700
+
+    Merge remote-tracking branch 'gh/wip-rbd-bid' into stable-next
+
+commit 81d72e5d7ba4713eb7c290878d901e21c0709028
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 23 10:47:10 2012 -0700
+
+    mon: make 'ceph osd rm ...' wipe out all state bits, not just EXISTS
+    
+    This ensures that when a new osd reclaims that id it behaves as if it were
+    really new.
+    
+    Backport: argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit ad9c37f2c029f6eb372efb711b234014397057e9
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 9 20:54:19 2012 -0700
+
+    test_stress_watch: just one librados instance
+    
+    This was creating a new cluster connection/session per iteration, and
+    along with it a few service threads and sockets and so forth.
+    
+    Unfortunately, librados leaks like a sieve, starting with CephContext
+    and ceph::crypto::init().  See #845 and #2067.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit c60afe1842a48dd75944822c0872fce6a7229f5a
+Merge: 8833050 35b1326
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 26 15:03:50 2012 -0700
+
+    Merge commit '35b13266923f8095650f45562d66372e618c8824' into stable-next
+    
+    First batch of msgr fixes.
+
+commit 88330505cc772a5528e9405d515aa2b945b0819e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 9 15:53:31 2012 -0700
+
+    ReplicatedPG: fix replay op ordering
+    
+    After a client reconnect, the client replays outstanding ops.  The
+    OSD then immediately responds with success if the op has already
+    committed (version < ReplicatedPG::get_first_in_progress).
+    Otherwise, we stick it in waiting_for_ondisk to be replied to when
+    eval_repop concludes that waitfor_disk is empty.
+    
+    Fixes #2508
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    
+    Conflicts:
+    
+    	src/osd/ReplicatedPG.cc
+
+commit 682609a9343d0488788b1c6b03bc437b7905e4d6
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 18 12:55:35 2012 -0700
+
+    objecter: always resend linger registrations
+    
+    If a linger op (watch) is sent to the OSD and updates the object, and then
+    the client loses the reply, it will resend the request.  The OSD will see
+    that it is a dup, however, and not set up the in-memory session state for
+    the watch.  This in turn will break the watch (i.e., notifies won't
+    get delivered).
+    
+    Instead, always resend linger registration ops, so that we always have a
+    unique reqid and do the correct session registeration for each session.
+    
+     * track the tid of the registation op for each LingerOp
+     * mark registrations ops as should_resend=false; cancel as needed
+     * when we send a new registration op, cancel the old one to ensure we
+       ignore the reply.  This is needed becuase we resend linger ops on any
+       pg change, not just a primary change.
+     * drop the first_send arg to send_linger(), as we can now infer that
+       from register_tid == 0.
+    
+    The bug was easily reproduced with ms inject socket failures = 500 and the
+    test_stress_watch utility.
+    
+    Fixes: #2796
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 4d7d3e276967d555fed8a689976047f72c96c2db
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 9 13:22:42 2012 -0700
+
+    osd: guard class call decoding
+    
+    Backport: argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 7fbbe4652ffb2826978aa1f1cacce4456d2ef1fc
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 5 18:08:58 2012 -0700
+
+    librados: take lock when signaling notify cond
+    
+    When we are signaling the cond to indicate that a notify is complete,
+    take the appropriate lock.  This removes the possibility of a race
+    that loses our signal.  (That would be very difficult given that there
+    are network round trips involved, but this makes the lock/cond usage
+    "correct.")
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 6ed01df412b4f4745c8f427a94446987c88b6bef
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 22 07:46:11 2012 -0700
+
+    workqueue: kick -> wake or _wake, depending on locking
+    
+    Break kick() into wake() and _wake() methods, depending on whether the
+    lock is already held.  (The rename ensures that we audit/fix all
+    callers.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    
+    Conflicts:
+    
+    	src/common/WorkQueue.h
+    	src/osd/OSD.cc
+
+commit d2d40dc3059d91450925534f361f2c03eec9ef88
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 4 15:11:21 2012 -0700
+
+    client: fix locking for SafeCond users
+    
+    Need to wait on flock, not client_lock.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit c963a21a8620779d97d6cbb51572551bdbb50d0b
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 26 15:01:05 2012 -0700
+
+    filestore: check for EIO in read path
+    
+    Check for EIO in read methods and helpers.  Try to do checks in low-level
+    methods (e.g., lfn_*()) to avoid duplication in higher-level methods.
+    
+    The transaction apply function already checks for EIO on writes, and will
+    generate a nicer error message, so we can largely ignore the write path,
+    as long as errors get passed up correctly.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 6bd89aeb1bf3b1cbb663107ae6bcda8a84dd8601
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 26 09:07:46 2012 -0700
+
+    filestore: add 'filestore fail eio' option, default true
+    
+    By default we will assert/fail/crash on EIO from the underlying fs.  We
+    already do this in the write path, but not the read path, or in various
+    internal infrastructure.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit e9b5a289838f17f75efbf9d1640b949e7485d530
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 24 13:53:03 2012 -0700
+
+    config: fix 'config set' admin socket command
+    
+    Fixes: #2832
+    Backport: argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 1a6cd9659abcdad0169fe802ed47967467c448b3
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 25 16:35:09 2012 -0700
+
+    osd: break potentially large transaction into pieces
+    
+    We do a similar trick elsewhere.  Control this via a tunable.  Eventually
+    we'll control the others (in a non-stable branch).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 15e1622959f5a46f7a98502cdbaebfda2247a35b
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 25 14:53:34 2012 -0700
+
+    osd: only commit past intervals at end of parallel build
+    
+    We don't check for gaps in the past intervals, so we should only commit
+    this when we are completely done.  Otherwise a partial run and rsetart will
+    leave the gap in place, which may confuse the peering code that relies on
+    this information.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 16302acefd8def98fc4597366d6ba2845e17fcb6
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 25 10:57:35 2012 -0700
+
+    osd: generate past intervals in parallel on boot
+    
+    Even though we aggressively share past_intervals with notifies etc, it is
+    still possible for an osd to get buried behind a pile of old maps and need
+    to generate these if it has been out of the cluster for a while.  This has
+    happened to us in the past but, sadly, we did not merge the work then.
+    On the bright side, this implementation is much much much cleaner than the
+    old one because of the pg_interval_t helper we've since switched to.
+    
+    On bootup, we look at the intervals each pg needs and calclate the union,
+    and then iterate over that map range.  The inner bit of the loop is
+    functionally identical to PG::build_past_intervals(), keeping the per-pg
+    state in the pistate struct.
+    
+    Backport: argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit fca65ff52a5f7d49bcac83b3b2232963a879e446
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 25 10:58:07 2012 -0700
+
+    osd: move calculation of past_interval range into helper
+    
+    PG::generate_past_intervals() first calculates the range over which it
+    needs to generate past intervals.  Do this in a helper function.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 5979351ef3d3d03bced9286f79cbc22524c4a8de
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 25 10:58:28 2012 -0700
+
+    osd: fix map epoch boot condition
+    
+    We only want to join the cluster if we can catch up to the latest
+    osdmap with a small number of maps, in this case a single map message.
+    
+    Backport: argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 8c7186d02627f8255273009269d50955172efb52
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 24 20:18:01 2012 -0700
+
+    mon: ignore pgtemp messages from down osds
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b17f54671f350fd4247f895f7666d46860736728
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 24 20:16:04 2012 -0700
+
+    mon: ignore osd_alive messages from down osds
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 7dfdf4f8de16155edd434534e161e06ba7c79d7d
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Jul 23 14:05:53 2012 -0700
+
+    librbd: replace assign_bid with client id and random number
+    
+    The assign_bid method has issues with replay because it is a write
+    that also returns data. This means that the replayed operation would
+    return success, but no data, and cause a create to fail. Instead, let
+    the client set the bid based on its global id and a random number.
+    
+    This only affects the creation of new images, since the bid is put
+    into an opaque string as part of the object prefix.
+    
+    Keep the server side assign_bid around in case there are old clients
+    still using it.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit dc2d67112163bee8b111f75ae3e3ca42884b09b4
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Jul 9 14:11:23 2012 -0700
+
+    librados: add new constructor to form a Rados object from IoCtx
+    
+    This creates a separate reference to an existing connection, for
+    use when a client holding IoCtx needs to consult another (say,
+    for rbd cloning)
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit c99671201de9d9cdf03bbf0f4e28e8afb70c280c
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 18 19:49:58 2012 -0700
+
+    add CRUSH_TUNABLES feature bit
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 0b579546cfddec35095b2aec753028d8e63f3533
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Jul 18 10:24:58 2012 -0700
+
+    ObjectCacher: fix cache_bytes_hit accounting
+    
+    Misses are not hits!
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 2869039b79027e530c2863ebe990662685e4bbe6
+Author: Pascal de Bruijn | Unilogic Networks B.V <pascal at unilogicnetworks.net>
+Date:   Wed Jul 11 15:23:16 2012 +0200
+
+    Robustify ceph-rbdnamer and adapt udev rules
+    
+    Below is a patch which makes the ceph-rbdnamer script more robust and
+    fixes a problem with the rbd udev rules.
+    
+    On our setup we encountered a symlink which was linked to the wrong rbd:
+    
+      /dev/rbd/mypool/myrbd -> /dev/rbd1
+    
+    While that link should have gone to /dev/rbd3 (on which a
+    partition /dev/rbd3p1 was present).
+    
+    Now the old udev rule passes %n to the ceph-rbdnamer script, the problem
+    with %n is that %n results in a value of 3 (for rbd3), but in a value of
+    1 (for rbd3p1), so it seems it can't be depended upon for rbdnaming.
+    
+    In the patch below the ceph-rbdnamer script is made more robust and it
+    now it can be called in various ways:
+    
+      /usr/bin/ceph-rbdnamer /dev/rbd3
+      /usr/bin/ceph-rbdnamer /dev/rbd3p1
+      /usr/bin/ceph-rbdnamer rbd3
+      /usr/bin/ceph-rbdnamer rbd3p1
+      /usr/bin/ceph-rbdnamer 3
+    
+    Even with all these different styles of calling the modified script, it
+    should now return the same rbdname. This change "has" to be combined
+    with calling it from udev with %k though.
+    
+    With that fixed, we hit the second problem. We ended up with:
+    
+      /dev/rbd/mypool/myrbd -> /dev/rbd3p1
+    
+    So the rbdname was symlinked to the partition on the rbd instead of the
+    rbd itself. So what probably went wrong is udev discovering the disk and
+    running ceph-rbdnamer which resolved it to myrbd so the following
+    symlink was created:
+    
+      /dev/rbd/mypool/myrbd -> /dev/rbd3
+    
+    However partitions would be discovered next and ceph-rbdnamer would be
+    run with rbd3p1 (%k) as parameter, resulting in the name myrbd too, with
+    the previous correct symlink being overwritten with a faulty one:
+    
+      /dev/rbd/mypool/myrbd -> /dev/rbd3p1
+    
+    The solution to the problem is in differentiating between disks and
+    partitions in udev and handling them slightly differently. So with the
+    patch below partitions now get their own symlinks in the following style
+    (which is fairly consistent with other udev rules):
+    
+      /dev/rbd/mypool/myrbd-part1 -> /dev/rbd3p1
+    
+    Please let me know any feedback you have on this patch or the approach
+    used.
+    
+    Regards,
+    Pascal de Bruijn
+    Unilogic B.V.
+    
+    Signed-off-by: Pascal de Bruijn <pascal at unilogicnetworks.net>
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 426384f6beccabf9e9b9601efcb8147904ec97c2
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 16 16:02:14 2012 -0700
+
+    log: apply log_level to stderr/syslog logic
+    
+    In non-crash situations, we want to make sure the message is both below the
+    syslog/stderr threshold and also below the normal log threshold.  Otherwise
+    we get anything we gather on those channels, even when the log level is
+    low.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 8dafcc5c1906095cb7d15d648a7c1d7524df3768
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 16 15:40:53 2012 -0700
+
+    log: fix event gather condition
+    
+    We should gather an event if it is below the log or gather threshold.
+    
+    Previously we were only gathering if we were going to print it, which makes
+    the dump no more useful than what was already logged.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit ec5cd6def9817039704b6cc010f2797a700d8500
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 16 13:11:24 2012 -0700
+
+    PG::RecoveryState::Stray::react(LogEvt&): reset last_pg_scrub
+    
+    We need to reset the last_pg_scrub data in the osd since we
+    are replacing the info.
+    
+    Probably fixes #2453
+    
+    In cases like 2453, we hit the following backtrace:
+    
+         0> 2012-05-19 17:24:09.113684 7fe66be3d700 -1 osd/OSD.h: In function 'void OSD::unreg_last_pg_scrub(pg_t, utime_t)' thread 7fe66be3d700 time 2012-05-19 17:24:09.095719
+    osd/OSD.h: 840: FAILED assert(last_scrub_pg.count(p))
+    
+     ceph version 0.46-313-g4277d4d (commit:4277d4d3378dde4264e2b8d211371569219c6e4b)
+     1: (OSD::unreg_last_pg_scrub(pg_t, utime_t)+0x149) [0x641f49]
+     2: (PG::proc_primary_info(ObjectStore::Transaction&, pg_info_t const&)+0x5e) [0x63383e]
+     3: (PG::RecoveryState::ReplicaActive::react(PG::RecoveryState::MInfoRec const&)+0x4a) [0x633eda]
+     4: (boost::statechart::detail::reaction_result boost::statechart::simple_state<PG::RecoveryState::ReplicaActive, PG::RecoveryState::Started, boost::mpl::list<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, (boost::statechart::history_mode)0>::local_react_impl_non_empty::local_react_impl<boost::mpl::list3<boost::statechart::custom_re [...]
+     5: (boost::statechart::simple_state<PG::RecoveryState::ReplicaActive, PG::RecoveryState::Started, boost::mpl::list<mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, (boost::statechart::history_mode)0>::react_impl(boost::statechart::event_base const&, void const*)+0x81) [0x646791]
+     6: (boost::statechart::state_machine<PG::RecoveryState::RecoveryMachine, PG::RecoveryState::Initial, std::allocator<void>, boost::statechart::null_exception_translator>::send_event(boost::statechart::event_base const&)+0x5b) [0x63dfcb]
+     7: (boost::statechart::state_machine<PG::RecoveryState::RecoveryMachine, PG::RecoveryState::Initial, std::allocator<void>, boost::statechart::null_exception_translator>::process_event(boost::statechart::event_base const&)+0x11) [0x63e0f1]
+     8: (PG::RecoveryState::handle_info(int, pg_info_t&, PG::RecoveryCtx*)+0x177) [0x616987]
+     9: (OSD::handle_pg_info(std::tr1::shared_ptr<OpRequest>)+0x665) [0x5d3d15]
+     10: (OSD::dispatch_op(std::tr1::shared_ptr<OpRequest>)+0x2a0) [0x5d7370]
+     11: (OSD::_dispatch(Message*)+0x191) [0x5dd4a1]
+     12: (OSD::ms_dispatch(Message*)+0x153) [0x5ddda3]
+     13: (SimpleMessenger::dispatch_entry()+0x863) [0x77fbc3]
+     14: (SimpleMessenger::DispatchThread::entry()+0xd) [0x746c5d]
+     15: (()+0x7efc) [0x7fe679b1fefc]
+     16: (clone()+0x6d) [0x7fe67815089d]
+     NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.
+    
+    Because we don't clear the scrub state before reseting info,
+    the last_scrub_stamp state in the info.history structure
+    changes without updating the osd state resulting in the
+    above assert failure.
+    
+    Backport: stable
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 248cfaddd0403c7bae8e1533a3d2e27d1a335b9b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 9 17:57:03 2012 -0700
+
+    ReplicatedPG: don't warn if backfill peer stats don't match
+    
+    pinfo.stats might be wrong if we did log-based recovery on the
+    backfilled portion in addition to continuing backfill.
+    
+    bug #2750
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit bcb1073f9171253adc37b67ee8d302932ba1667b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 15 20:30:34 2012 -0700
+
+    mon/MonitorStore: always O_TRUNC when writing states
+    
+    It is possible for a .new file to already exist, potentially with a
+    larger size.  This would happen if:
+    
+     - we were proposing a different value
+     - we crashed (or were stopped) before it got renamed into place
+     - after restarting, a different value was proposed and accepted.
+    
+    This isn't so unlikely for the log state machine, where we're
+    aggregating random messages.  O_TRUNC ensure we avoid getting the tail
+    end of some previous junk.
+    
+    I observed #2593 and found that a logm state value had a larger size on
+    one mon (after slurping) than the others, pointing to put_bl_sn_map().
+    
+    While we are at it, O_TRUNC put_int() too; the same type of bug is
+    possible there, too.
+    
+    Fixes: #2593
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 41a570778a51fe9a36a5b67a177d173889e58363
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jul 14 14:31:34 2012 -0700
+
+    osd: based misdirected op role calc on acting set
+    
+    We want to look at the acting set here, nothing else.  This was causing us
+    to erroneously queue ops for later (wasting memory) and to erroneously
+    print out a 'misdrected op' message in the cluster log (confusion and
+    incorrect [but ignored] -ENXIO reply).
+    
+    Fixes: #2022
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b3d077c61e977e8ebb91288aa2294fb21c197fe7
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Jul 13 09:42:20 2012 -0700
+
+    qa: download tests from specified branch
+    
+    These python tests aren't installed, so they need to be downloaded
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit e855cb247b5a9eda6845637e2da5b6358f69c2ed
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Jun 25 09:47:37 2012 -0700
+
+    rgw: don't override subuser perm mask if perm not specified
+    
+    Bug #2650. We were overriding subuser perm mask whenever subuser
+    was modified, even if perm mask was not passed.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit d6c766ea425d87a2f2405c08dcec66f000a4e1a0
+Author: James Page <james.page at ubuntu.com>
+Date:   Wed Jul 11 11:34:21 2012 -0700
+
+    debian: fix ceph-fs-common-dbg depends
+    
+    Signed-off-by: James Page <james.page at ubuntu.com>
+
+commit 95e8d87bc3fb12580e4058401674b93e19df6e02
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 11 11:52:24 2012 -0700
+
+    rados tool: remove -t param option for target pool
+    
+    Bug #2772. This fixes an issue that was introduced when we
+    added the 'rados cp' command. The -t param was already used
+    for rados bench. With this change the only way to specify
+    a target pool is using --target-pool.
+    Though this problem is post argonaut, the 'rados cp' command
+    has been backported, so we need this fix there too.
+    
+    Backport: argonaut
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 5b10778399d5bee602e57035df7d40092a649c06
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 11 09:19:00 2012 -0700
+
+    Makefile: don't install crush headers
+    
+    This is leftover from when we built a libcrush.so.  We can re-add when we
+    start doing that again.
+    
+    Reported-by: Laszlo Boszormenyi <gcs at debian.hu>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 35b13266923f8095650f45562d66372e618c8824
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 10 13:18:27 2012 -0700
+
+    msgr: take over existing Connection on Pipe replacement
+    
+    If a new pipe/socket is taking over an existing session, it should also
+    take over the Connection* associated with the existing session.  Because
+    we cannot clear existing->connection_state, we just take another reference.
+    
+    Clean up the comments a bit while we're here.
+    
+    This affects MDS<->client sessions when reconnecting after a socket fault.
+    It probably also affects intra-cluster (osd/osd, mds/mds, mon/mon)
+    sessions as well, but I did not confirm that.
+    
+    Backport: argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b387077b1d019ee52b28bc3bc5305bfb53dfd892
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 8 20:33:12 2012 -0700
+
+    debian: include librados-config in librados-dev
+    
+    Reported-by: Laszlo Boszormenyi <gcs at debian.hu>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 03c2dc244af11b711e2514fd5f32b9bfa34183f6
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 13:04:28 2012 -0700
+
+    lockdep: increase max locks
+    
+    Hit this limit with the rados api tests.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b554d112c107efe78ec64f85b5fe588f1e7137ce
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 12:07:28 2012 -0700
+
+    config: add unlocked version of get_my_sections; use it internally
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 01da287b8fdc07262be252f1a7c115734d3cc328
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 08:20:06 2012 -0700
+
+    config: fix lock recursion in get_val_from_conf_file()
+    
+    Introduce a private, already-locked version.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit c73c64a0f722477a5b0db93da2e26e313a5f52ba
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 08:15:08 2012 -0700
+
+    config: fix recursive lock in parse_config_files()
+    
+    The _impl() helper is only called from parse_config_files(); don't retake
+    the lock.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 6646e891ff0bd31c935d1ce0870367b1e086ddfd
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 18:51:02 2012 -0700
+
+    rgw: initialize fields of RGWObjEnt
+    
+    This fixes various valgrind warnings triggered by the s3test
+    test_object_create_unreadable.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b33553aae63f70ccba8e3d377ad3068c6144c99a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Jul 6 13:14:53 2012 -0700
+
+    rgw: handle response-* params
+    
+    Handle response-* params that set response header field values.
+    Fixes #2734, #2735.
+    Backport: argonaut
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 74f687501a8a02ef248a76f061fbc4d862a9abc4
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 4 13:59:04 2012 -0700
+
+    osd: add missing formatter close_section() to scrub status
+    
+    Also add braces to make the open/close matchups easier to see.  Broken
+    by f36617392710f9b3538bfd59d45fd72265993d57.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 020b29961303b12224524ddf78c0c6763a61242e
+Author: Mike Ryan <mike.ryan at inktank.com>
+Date:   Wed Jun 27 14:14:30 2012 -0700
+
+    pg: report scrub status
+    
+    Signed-off-by: Mike Ryan <mike.ryan at inktank.com>
+
+commit db6d83b3ed51c07b361b27d2e5ce3227a51e2c60
+Author: Mike Ryan <mike.ryan at inktank.com>
+Date:   Wed Jun 27 13:30:45 2012 -0700
+
+    pg: track who we are waiting for maps from
+    
+    Signed-off-by: Mike Ryan <mike.ryan at inktank.com>
+
+commit e1d4855fa18b1cda85923ad9debd95768260d4eb
+Author: Mike Ryan <mike.ryan at inktank.com>
+Date:   Tue Jun 26 16:25:27 2012 -0700
+
+    pg: reduce scrub write lock window
+    
+    Wait for all replicas to construct the base scrub map before finalizing
+    the scrub and locking out writes.
+    
+    Signed-off-by: Mike Ryan <mike.ryan at inktank.com>
+
+commit 27409aa1612c1512bf393de22b62bbfe79b104c1
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 5 15:52:51 2012 -0700
+
+    rgw: don't store bucket info indexed by bucket_id
+    
+    Issue #2701. This info wasn't really used anywhere and we weren't
+    removing it. It was also sharing the same pool namespace as the
+    info indexed by bucket name, which is bad.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 9814374a2b40e15c13eb03ce6b8e642b0f7f93e4
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 5 14:59:22 2012 -0700
+
+    test_rados_tool.sh: test copy pool
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit d75100667a539baf47c79d752b787ed5dcb51d7a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 5 13:42:23 2012 -0700
+
+    rados tool: copy object in chunks
+    
+    Instead of reading the entire object and then writing it,
+    we read it in chunks.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 16ea64fbdebb7a74e69e80a18d98f35d68b8d9a1
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Jun 29 14:43:00 2012 -0700
+
+    rados tool: copy entire pool
+    
+    A new rados tool command that copies an entire pool
+    into another existing pool.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 960c2124804520e81086df97905a299c8dd4e08c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Jun 29 14:09:08 2012 -0700
+
+    rados tool: copy object
+    
+    New rados command: rados cp <src-obj> [dest-obj]
+    
+    Requires specifying source pool. Target pool and locator can be specified.
+    The new command preserves object xattrs and omap data.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 23d31d3e2aa7f2b474a7b8e9d40deb245d8be9de
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 6 08:47:44 2012 -0700
+
+    ceph.spec.in: add ceph-disk-{activate,prepare}
+    
+    Reported-by: Jimmy Tang <jtang at tchpc.tcd.ie>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit ea11c7f9d8fd9795e127cfd7e8a1f28d4f5472e9
+Author: Wido den Hollander <wido at widodh.nl>
+Date:   Thu Jul 5 15:29:54 2012 +0200
+
+    Allow URL-safe base64 cephx keys to be decoded.
+    
+    In these cases + and / are replaced by - and _ to prevent problems when using
+    the base64 strings in URLs.
+    
+    Signed-off-by: Wido den Hollander <wido at widodh.nl>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit f67fe4e368b5f250f0adfb183476f5f294e8a529
+Author: Wido den Hollander <wido at widodh.nl>
+Date:   Wed Jul 4 15:46:04 2012 +0200
+
+    librados: Bump the version to 0.48
+    
+    Signed-off-by: Wido den Hollander <wido at widodh.nl>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 35b9ec881aecf84b3a49ec0395d7208de36dc67d
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Jun 26 17:28:51 2012 -0700
+
+    rgw-admin: use correct modifier with strptime
+    
+    Bug #2658: used %I (12h) instead of %H (24h)
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit da251fe88503d32b86113ee0618db7c446d34853
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 21 15:40:27 2012 -0700
+
+    rgw: send both swift x-storage-token and x-auth-token
+    
+    older clients need x-storage-token, newer x-auth-token
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 4c19ecb9a34e77e71d523a0a97e17f747bd5767d
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 21 15:17:19 2012 -0700
+
+    rgw: radosgw-admin date params now also accept time
+    
+    The date format now is "YYYY-MM-DD[ hh:mm:ss]". Got rid of
+    the --time param for the old ops log stuff.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    
+    Conflicts:
+    
+    	src/test/cli/radosgw-admin/help.t
+
+commit 6958aeb898fc683159483bfbb798f069a9b5330a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 21 13:14:47 2012 -0700
+
+    rgw-admin: fix usage help
+    
+    s/show/trim
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 83c043f803ab2ed74fa9a84ae9237dd7df2a0c57
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 14:07:16 2012 -0700
+
+    radosgw-admin: fix clit test
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 5674158163e9c1d50985796931240b237676b74d
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 11:32:57 2012 -0700
+
+    ceph: fix cli help test
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 151bf0eef59acae2d1fcf3f0feb8b6aa963dc2f6
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jul 3 11:23:16 2012 -0700
+
+    ReplicatedPG: remove faulty scrub assert in sub_op_modify_applied
+    
+    This assert assumed that all ops submitted before MOSDRepScrub was
+    submitted were processed by the time that MOSDRepScrub was
+    processed.  In fact, MOSDRepScrub's scrub_to may refer to a
+    last_update yet to be seen by the replica.
+    
+    Bug #2693
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 32833e88a1ad793fa4be86101ce9c22b6f677c06
+Author: Kyle Bader <kyle.bader at dreamhost.com>
+Date:   Tue Jul 3 11:20:38 2012 -0700
+
+    ceph: better usage
+    
+    Signed-off-by: Kyle Bader <kyle.bader at dreamhost.com>
+
+commit 67455c21879c9c117f6402259b5e2da84524e169
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 09:20:35 2012 -0700
+
+    debian: strip new ceph-mds package
+    
+    Reported-by: Amon Ott <a.ott at m-privacy.de>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b53cdb97d15f9276a9b26bec9f29034149f93358
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 3 06:46:10 2012 -0700
+
+    config: remove bad argparse_flag argument in parse_option()
+    
+    This is wrong, and thankfully valgrind picks it up.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit f7d4e39740fd2afe82ac40c711bd3fe7a282e816
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 1 17:23:28 2012 -0700
+
+    msgr: restart_queue when replacing existing pipe and taking over the queue
+    
+    The queue may have been previously stopped (by discard_queue()), and needs
+    to be restarted.
+    
+    Fixes consistent failures from the mon_recovery.py integration tests.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 5dfd2a512d309f7f641bcf7c43277f08cf650b01
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 1 15:37:31 2012 -0700
+
+    msgr: choose incoming connection if ours is STANDBY
+    
+    If the connect_seq matches, but our existing connection is in STANDBY, take
+    the incoming one.  Otherwise, the other end will wait indefinitely for us
+    to connect but we won't.
+    
+    Alternatively, we could "win" the race and trigger a connection by sending
+    a keepalive (or similar), but that is more work; we may as well accept the
+    incoming connection we have now.
+    
+    This removes STANDBY from the acceptable WAIT case states.  It also keeps
+    responsibility squarely on the shoulders of the peer with something to
+    deliver.
+    
+    Without this patch, a 3-osd vstart cluster with
+    'ms inject socket failures = 100' and rados bench write -b 4096 would start
+    generating slow request warnings after a few minutes due to the osds
+    failing to connect to each other.  With the patch, I complete a 10 minute
+    run without problems.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b7007a159f6d941fa8313a24af5810ce295b36ca
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 28 17:50:47 2012 -0700
+
+    msgr: preserve incoming message queue when replacing pipes
+    
+    If we replace an existing pipe with a new one, move the incoming queue
+    of messages that have not yet been dispatched over to the new Pipe so that
+    they are not lost.  This prevents messages from being lost.
+    
+    Alternatively, we could set in_seq = existing->in_seq - existing->in_qlen,
+    but that would make the other end resend those messages, which is a waste
+    of bandwidth.
+    
+    Very easy to reproduce the original bug with 'ms inject socket failures'.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 1f3a722e150f9f27fe7919e9579b5a88dcd15639
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 28 17:45:24 2012 -0700
+
+    msgr: move dispatch_entry into DispatchQueue class
+    
+    A bit cleaner.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 03445290dad5b1213dd138cacf46e379400201c9
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 28 17:38:34 2012 -0700
+
+    msgr: move incoming queue to separate class
+    
+    This extricates the incoming queue and its funky relationship with
+    DispatchQueue from Pipe and moves it into IncomingQueue.  There is now a
+    single IncomingQueue attached to each Pipe.  DispatchQueue is now no
+    longer tied to Pipe.
+    
+    This modularizes the code a bit better (tho that is still a work in
+    progress) and (more importantly) will make it possible to move the
+    incoming messages from one pipe to another in accept().
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 0dbc54169512da776c16161ec3b8fa0b3f08e248
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 27 17:06:40 2012 -0700
+
+    msgr: make D_CONNECT constant non-zero, fix ms_handle_connect() callback
+    
+    A while ago we inadvertantly broke ms_handle_connect() callbacks because
+    of a check for m being non-zero in the dispatch_entry() thread.  Adjust the
+    enums so that they get delivered again.
+    
+    This fixes hangs when, for example, the ceph tool sends a command, gets a
+    connection reset, and doesn't get the connect callback to resend after
+    reconnecting to a new monitor.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 2429556a51e8f60b0d9bdee71ef7b34b367f2f38
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 26 17:10:40 2012 -0700
+
+    msgr: fix pipe replacement assert
+    
+    We may replace an existing pipe in the STANDBY state if the previous
+    attempt failed during accept() (see previous patches).
+    
+    This might fix #1378.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 204bc594be1a6046d1b362693d086b49294c2a27
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 26 17:07:31 2012 -0700
+
+    msgr: do not try to reconnect con with CLOSED pipe
+    
+    If we have a con with a closed pipe, drop the message.  For lossless
+    sessions, the state will be STANDBY if we should reconnect.  For lossy
+    sessions, we will end up with CLOSED and we *should* drop the message.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit e6ad6d25a58b8e34a220d090d01e26293c2437b4
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 26 17:06:41 2012 -0700
+
+    msgr: move to STANDBY if we replace during accept and then fail
+    
+    If we replace an existing pipe during accept() and then fail, move to
+    STANDBY so that our connection state (connect_seq, etc.) is preserved.
+    Otherwise, we will throw out that information and falsely trigger a
+    RESETSESSION on the next connection attempt.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
diff --git a/doc/changelog/v0.48.2argonaut.txt b/doc/changelog/v0.48.2argonaut.txt
new file mode 100644
index 0000000..2884e60
--- /dev/null
+++ b/doc/changelog/v0.48.2argonaut.txt
@@ -0,0 +1,476 @@
+commit 3e02b2fad88c2a95d9c0c86878f10d1beb780bfe
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Sep 11 13:04:50 2012 -0700
+
+    v0.48.2argonaut
+
+commit 343e607980c923324de241d2cf8396d7c4857dd8
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Sep 18 13:45:27 2012 -0700
+
+    cls_rgw: if stats drop below zero, set them to zero
+    
+    This complements fix for #3127. This is only a band aid
+    solution for argonaut, the real solution fixes the original
+    issue that made this possible.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 92be908c7f22c0ccf2092024fd54096362032394
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 12 16:41:17 2012 -0700
+
+    cls_rgw: change scoping of suggested changes vars
+    
+    Fixes: #3127
+    Bad variable scoping made it so that specific variables
+    weren't initialized between suggested changes iterations.
+    This specifically affected a case where in a specific
+    change we had an updated followed by a remove, and the
+    remove was on a non-existent key (e.g., was already
+    removed earlier). We ended up re-substracting the
+    object stats, as the entry wasn't reset between
+    the iterations (and we didn't read it because the
+    key didn't exist).
+    
+    backport:argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit d3a8497b44296484fa18ac10e776c93701365a8b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Sep 4 11:29:21 2012 -0700
+
+    objecter: fix osdmap wait
+    
+    When we get a pool_op_reply, we find out which osdmap we need to wait for.
+    The wait_for_new_map() code was feeding that epoch into
+    maybe_request_map(), which was feeding it to the monitor with the subscribe
+    request.  However, that epoch is the *start* epoch, not what we want.  Fix
+    this code to always subscribe to what we have (+1), and ensure we keep
+    asking for more until we catch up to what we know we should eventually
+    get.
+    
+    Bug: #3075
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e09b26555c6132ffce08b565780a39e4177cbc1c)
+
+commit de026f31f7f31c2b79c41910b83570f052f354d5
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Aug 27 07:38:34 2012 -0700
+
+    objecter: send queued requests when we get first osdmap
+    
+    If we get our first osdmap and already have requests queued, send them.
+    
+    Backported from 8d1efd1b829ae50eab7f7f4c07da04e03fce7c45.
+    
+    Fixes: #3050
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 379aa80ac3a313025e433cefd239ddbeec45f9e7
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 21 21:12:33 2012 -0700
+
+    objecter: use ordered map<> for tracking tids to preserve order on resend
+    
+    We are using a hash_map<> to map tids to Op*'s.  In handle_osd_map(),
+    we will recalc_op_target() on each Op in a random (hash) order.  These
+    will get put in a temp map<tid,Op*> to ensure they are resent in the
+    correct order, but their order on the session->ops list will be random.
+    
+    Then later, if we reset an OSD connection, we will resend everything for
+    that session in ops order, which is be incorrect.
+    
+    Fix this by explicitly reordering the requests to resend in
+    kick_requests(), much like we do in handle_osd_map().  This lets us
+    continue to use a hash_map<>, which is faster for reasonable numbers of
+    requests.  A simpler but slower fix would be to just use map<> instead.
+    
+    This is one of many bugs contributing to #2947.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 1113a6c56739a56871f01fa13da881dab36a32c4)
+
+commit 54788d0da40608fb8ccf8f16039536729881d542
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Aug 20 15:02:57 2012 -0700
+
+    rbd: force all exiting paths through main()/return
+    
+    This properly destroys objects.  In the process, remove usage_exit();
+    also kill error-handling in set_conf_param (never relevant for rbd.cc,
+    and if you call it with both pointers NULL, well...)
+    Also switch to EXIT_FAILURE for consistency.
+    
+    Backported from fed8aea662bf919f35a5a72e4e2a2a685af2b2ed.
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Fixes: #2948
+
+commit a179ccee8848fe9bc8d622cba13fab1a99f6eb63
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Sep 18 09:37:44 2012 -0700
+
+    rbd: only open the destination pool for import
+    
+    Otherwise importing into another pool when the default pool, rbd,
+    doesn't exist results in an error trying to open the rbd pool.
+    
+    Reported-by: Sébastien Han <han.sebastien at gmail.com>
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 16aca749989b006f4d5d2190ed1e8480c1bf0282
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Mon Sep 17 08:55:14 2012 -0700
+
+    ceph-disk-activate, upstart: Use "initctl emit" to start OSDs.
+    
+    This avoids an error if the daemon was running already, and is
+    already being done with the other services.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 34d8eec9e23edec174a96d16bf42a0b8df118183
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Sep 14 17:13:57 2012 -0700
+
+    rbd: make --pool/--image args easier to understand for import
+    
+    There's no need to set the default pool in set_pool_image_name - this
+    is done later, in a way that doesn't ignore --pool if --dest-pool
+    is not specified.
+    
+    This means --pool and --image can be used with import, just like
+    the rest of the commands. Without this change, --dest and --dest-pool
+    had to be used, and --pool would be silently ignored for rbd import.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit f390ee68233e9c6db1202aa95665adf27ba4399a
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Sep 13 14:06:04 2012 -0700
+
+    ceph-create-keys: Create a bootstrap-osd key too.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 9348ea0de953a4fd2eed239437d14c366c8e2cdd
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Sep 13 11:34:03 2012 -0700
+
+    ceph-create-keys: Refactor to share wait_for_quorum call.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit c9d4c58b9d71e6d84b644376684bcb72eae7e11c
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Sep 12 11:38:07 2012 -0700
+
+    objecter: fix skipped map handling
+    
+    If we skip a map, we want to translate NO_ACTION to NEED_RESEND, but leave
+    POOL_DNE alone.
+    
+    Backported from 2a3b7961c021b19a035f8a6cc4fc3cc90f88f367.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit d8dff93a2497bd578116eb20ed65a0595acdf341
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Jul 30 15:19:29 2012 -0700
+
+    librbd, cls_rbd: close snapshot creation race with old format
+    
+    If two clients created a snapshot at the same time, the one with the
+    higher snapshot id might be created first, so the lower snapshot id
+    would be added to the snapshot context and the snaphot seq would be
+    set to the lower one.
+    
+    Instead of allowing this to happen, return -ESTALE if the snapshot id
+    is lower than the currently stored snapshot sequence number. On the
+    client side, get a new id and retry if this error is encountered.
+    
+    Backport: argonaut
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 771ca71c0357bd8149677795ac934ab09945a3a3
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Sep 11 16:31:57 2012 -0700
+
+    upstart: Give everything a stop on stanza.
+    
+    These are all tasks, and expected to exit somewhat quickly,
+    but e.g. ceph-create-keys has a loop where it waits for mon
+    to reach quorum, so it might still be in that loop when the
+    machine is shut down.
+
+commit 9f967e3ac255b0037b598061f5cbb4050db79472
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Sep 11 16:28:41 2012 -0700
+
+    upstart: Start mds,mon,radosgw after a reboot.
+    
+    They had no "start on" stanzas, so they didn't get started earlier.
+
+commit ce1e7d1b0291759950abf02f5bae064994d2ec34
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Sep 11 15:31:06 2012 -0700
+
+    upstart: Add ceph-create-keys.conf to package.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 0ff22ba0508d43cd78aeae6736f2db002cc8de8e
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Sep 11 14:50:53 2012 -0700
+
+    obsync: if OrdinaryCallingFormat fails, try SubdomainCallingFormat
+    
+    This blindly tries the Subdomain calling format if the ordinary method
+    fails.  In particular, this works around buckets that present a
+    PermanentRedirect message.
+    
+    See bug #3128.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Matthew Wodrich <matthew.wodrich at dreamhost.com>
+
+commit 0e58d95134dd95f33b9b1a3b1286a0719ad20707
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 17 16:04:20 2012 -0700
+
+    librbd: add test for discard of nonexistent objects
+    
+    This verifies librbd properly handles ENOENT during discard.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 97d8a734ce937ce2a683c7c36f5b72395c6456c2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Sep 10 13:19:53 2012 -0700
+
+    librbd: ignore -ENOENT during discard
+    
+    This is a backport of a3ad98a3eef062e9ed51dd2d1e58c593e12c9703
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 61d705e2d67f83c81aa7c6362ec6703e014ecb87
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Aug 15 18:42:56 2012 -0700
+
+    objectcacher: fix bh leak on discard
+    
+    Fixes: #2950
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 787a78e8b1d8e5d92ee447b970ec8b79baa46f0b
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Aug 30 10:16:52 2012 -0400
+
+    upstart, ceph-create-keys: Make client.admin key generation automatic.
+    
+    This should help simplify Chef etc deployments. Now (when using the
+    Upstart jobs), when a ceph-mon is started, ceph-create-admin-key is
+    triggered. If /etc/ceph/$cluster.client.admin.keyring already exists,
+    it does nothing; otherwise, it waits for ceph-mon to reach quorum, and
+    then does a "ceph auth get-or-create" to create the key, and writes it
+    atomically to disk.
+    
+    The equivalent code can be removed from the Chef cookbook once this is
+    in.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 66aecb1e410a59f3e0ed89a30212b8dc546a3d4a
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Aug 30 10:21:29 2012 -0400
+
+    config: Add a per-name default keyring to front of keyring search path.
+    
+    This lets us have e.g. /etc/ceph/ceph.client.admin.keyring that is
+    owned by root:admin and mode u=rw,g=r,o= without making every non-root
+    run of the command line tools complain and fail.
+    
+    This is what the Chef cookbook has been doing for a while already.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 6e34b8c109322690151b42efb745bc96a210dda4
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Aug 30 10:11:09 2012 -0400
+
+    upstart: Make instance jobs export their cluster and id variables.
+    
+    This allows other jobs listening to Upstart "started ceph-mon" events
+    to see what instance started.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 27372dc4e99c17a7a2d5ad6646e5ae54392d5955
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Jul 12 10:47:29 2012 -0700
+
+    upstart: Make ceph-osd always set the crush location.
+    
+    This used to be conditional on config having osd_crush_location set,
+    but with that, minimal configuration left the OSD completely out of
+    the crush map, and prevented the OSD from starting properly.
+    
+    Note: Ceph does not currently let this mechanism automatically move
+    hosts to another location in the CRUSH hierarchy. This means if you
+    let this run with defaults, setting osd_crush_location later will not
+    take effect. Set up your config file (or Chef environment) fully
+    before starting the OSDs the first time.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 471105a966f873aef2361b1ed48d088c490fe1aa
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Jul 3 15:24:26 2012 -0700
+
+    ceph-disk-prepare: Partition and format OSD data disks automatically.
+    
+    Uses gdisk, as it seems to be the only tool that can automate GPT uuid
+    changes. Needs to run as root.
+    
+    Adds Recommends: gdisk to ceph.deb.
+    
+    Closes: #2547
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 24fe265c594308d5679e845fcfe8b0fe6a7be612
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Jul 3 09:22:28 2012 -0700
+
+    ceph-disk-prepare: Take fsid from config file.
+    
+    Closes: #2546.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 1f06b490b4187055a5bfabc20746c87dfa075e0d
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Mon Jun 25 15:14:33 2012 -0700
+
+    upstart: fix regex
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+
+commit 657ca118a7658617b9117311d9ee1cbe00103c06
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Aug 28 16:17:21 2012 -0700
+
+    rgw: clear usage map before reading usage
+    
+    Fixes: #3057
+    Since we read usage in chunks we need to clear the
+    usage map before reading the next chunk, otherwise
+    we're going to aggregate the old data as well.
+    
+    Backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit c49284c98de1df1a889e0c88e6b1157133f5e0a6
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Aug 23 11:48:50 2012 -0700
+
+    Don't package crush header files.
+
+commit b6fb3e37a68d48434a81ee4356cde48cad187e94
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Aug 17 17:34:23 2012 -0700
+
+    rgw: dump content_range using 64 bit formatters
+    
+    Fixes: #2961
+    Also make sure that size is 64 bit.
+    
+    backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 08d975146cbe6796799266f03361240a62acb297
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 21 10:58:38 2012 -0700
+
+    Revert "rgw: dump content_range using 64 bit formatters"
+    
+    This reverts commit faf9fa5744b459abc2eda829a48a4e07b9c97a08.
+
+commit faf9fa5744b459abc2eda829a48a4e07b9c97a08
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Aug 17 17:34:23 2012 -0700
+
+    rgw: dump content_range using 64 bit formatters
+    
+    Fixes: #2961
+    Also make sure that size is 64 bit.
+    
+    backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 47b24c0562bcb44964a0b8f6c4847bb0f05924e0
+Author: Matthew Wodrich <matthew.wodrich at dreamhost.com>
+Date:   Tue Jul 31 19:13:03 2012 -0700
+
+    obsync: add missing package specifier to format_exc
+    
+    Fixes: #2873
+    Signed-off-by: Matthew Wodrich <matthew.wodrich at dreamhost.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+
+commit a14214dc9b7c15581a0664dbe259389867f88e72
+Author: Danny Kukawka <danny.kukawka at bisect.de>
+Date:   Thu Aug 16 12:56:58 2012 +0200
+
+    fix keyring generation for mds and osd
+    
+        [ The following text is in the "UTF-8" character set. ]
+        [ Your display is set for the "ANSI_X3.4-1968" character set.  ]
+        [ Some characters may be displayed incorrectly. ]
+    
+    Fix config keys for OSD/MDS data dirs. As in documentation and other
+    places of the scripts the keys are 'osd data'/'mds data' and not
+    'osd_data'
+    
+    In case if MDS: if 'mds data' doesn't exist, create it.
+    
+    Signed-off-by: Danny Kukawka <danny.kukawka at bisect.de>
+
+commit d1a31ce1ca2a5e1c53146c6e9063a123a1fe8cdb
+Author: Danny Kukawka <danny.kukawka at bisect.de>
+Date:   Thu Aug 16 12:56:32 2012 +0200
+
+    fix ceph osd create help
+    
+        [ The following text is in the "UTF-8" character set. ]
+        [ Your display is set for the "ANSI_X3.4-1968" character set.  ]
+        [ Some characters may be displayed incorrectly. ]
+    
+    Change ceph osd create <osd-id> to ceph osd create <uuid>, since this
+    is what the command is really doing.
+    
+    Signed-off-by: Danny Kukawka <danny.kukawka at bisect.de>
+
+commit dc2a232bd37b7202c3d6e94396b3d85cec5225cd
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 9 17:24:19 2012 -0700
+
+    mon: simplify logmonitor check_subs; less noise
+    
+     * simple helper to translate name to id
+     * verify sub type is valid in caller
+     * assert sub type is valid in method
+     * simplify iterator usage
+    
+    Among other things, this gets rid of this noise in the logs:
+    
+    2012-07-10 20:51:42.617152 7facb23f1700  1 mon.a at 1(peon).log v310 check_sub sub monmap not log type
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
diff --git a/doc/changelog/v0.48.3argonaut.txt b/doc/changelog/v0.48.3argonaut.txt
new file mode 100644
index 0000000..22f0dc9
--- /dev/null
+++ b/doc/changelog/v0.48.3argonaut.txt
@@ -0,0 +1,895 @@
+commit 920f82e805efec2cae05b79c155c07df0f3ed5dd
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Mon Jan 7 21:08:08 2013 -0800
+
+    v0.48.3argonaut
+
+commit 213e3559dd260a2e19324f2a671c808261249f96
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 6 20:43:21 2013 -0800
+
+    osd: fix race in do_recovery()
+    
+    Verify that the PG is still RECOVERING or BACKFILL when we take the pg
+    lock in the recovery thread.  This prevents a crash from an invalid
+    state machine event when the recovery queue races with a PG state change
+    (e.g., due to peering).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit e410d1a066b906cad3103a5bbfa5b4509be9ac37
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 4 21:19:45 2013 -0800
+
+    ReplicatedPG: requeue waiting_for_ondisk in apply_and_flush_repops
+    
+    Fixes: #3722
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit cd5f2bfdbb7fbf9237bef482845644cc41fa66de
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Nov 15 16:20:33 2012 -0800
+
+    ObjectCacher: fix off-by-one error in split
+    
+    This error left a completion that should have been attached
+    to the right BufferHead on the left BufferHead, which would
+    result in the completion never being called unless the buffers
+    were merged before it's original read completed. This would cause
+    a hang in any higher level waiting for a read to complete.
+    
+    The existing loop went backwards (using a forward iterator),
+    but stopped when the iterator reached the beginning of the map,
+    or when a waiter belonged to the left BufferHead.
+    
+    If the first list of waiters should have been moved to the right
+    BufferHead, it was skipped because at that point the iterator
+    was at the beginning of the map, which was the main condition
+    of the loop.
+    
+    Restructure the waiters-moving loop to go forward in the map instead,
+    so it's harder to make an off-by-one error.
+    
+    Possibly-fixes: #3286
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 2e862f4d183d8b57b43b0777737886f18f68bf00)
+
+commit 802c486fd0913e9fe58ae7ff72df135f99712358
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 4 11:07:48 2013 -0800
+
+    config: change default log_max_recent to 10,000
+    
+    Commit c34e38bcdc0460219d19b21ca7a0554adf7f7f84 meant to do this but got
+    the wrong number of zeros.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 39a734fbf34ccd121f17023bcec814e61c8bdaab
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jan 3 17:15:07 2013 -0800
+
+    os/FileStore: fix non-btrfs op_seq commit order
+    
+    The op_seq file is the starting point for journal replay.  For stable btrfs
+    commit mode, which is using a snapshot as a reference, we should write this
+    file before we take the snap.  We normally ignore current/ contents anyway.
+    
+    On non-btrfs file systems, however, we should only write this file *after*
+    we do a full sync, and we should then fsync(2) it before we continue
+    (and potentially trim anything from the journal).
+    
+    This fixes a serious bug that could cause data loss and corruption after
+    a power loss event.  For a 'kill -9' or crash, however, there was little
+    risk, since the writes were still captured by the host's cache.
+    
+    Fixes: #3721
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 28d59d374b28629a230d36b93e60a8474c902aa5)
+
+commit 49416619d733572368e5d2ba7f2b34150c754b23
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 13:07:18 2012 -0800
+
+    log: broadcast cond signals
+    
+    We were using a single cond, and only signalling one waiter.  That means
+    that if the flusher and several logging threads are waiting, and we hit
+    a limit, we the logger could signal another logger instead of the flusher,
+    and we could deadlock.
+    
+    Similarly, if the flusher empties the queue, it might signal only a single
+    logger, and that logger could re-signal the flusher, and the other logger
+    could wait forever.
+    
+    Intead, break the single cond into two: one for loggers, and one for the
+    flusher.  Always signal the (one) flusher, and always broadcast to all
+    loggers.
+    
+    Backport: bobtail, argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 813787af3dbb99e42f481af670c4bb0e254e4432)
+
+commit f8bb4814d0fd7e08c9b6cdcde02940bf1b42cadd
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 2 13:58:44 2013 -0800
+
+    log: fix locking typo/stupid for dump_recent()
+    
+    We weren't locking m_flush_mutex properly, which in turn was leading to
+    racing threads calling dump_recent() and garbling the crash dump output.
+    
+    Backport: bobtail, argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 43cba617aa0247d714632bddf31b9271ef3a1b50)
+
+commit 9483a032f750572586f146c696ec6501d3df0383
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Dec 27 16:06:24 2012 -0800
+
+    init-ceph: fix status version check across machines
+    
+    The local state isn't propagated into the backtick shell, resulting in
+    'unknown' for all remote daemons.  Avoid backticks altogether.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6c7b667badc5e7608b69c533a119a2afc062e257)
+
+commit 8fef9360fe949fbf4ee6e468c36cc1c84b369b6e
+Author: Travis Rhoden <trhoden at gmail.com>
+Date:   Mon Aug 20 13:29:11 2012 -0700
+
+    init-ceph: use SSH in "service ceph status -a" to get version
+    
+    When running "service ceph status -a", a version number was never
+    returned for remote hosts, only for the local.  This was because
+    the command to query the version number didn't use the do_cmd
+    function, which is responsible for running the command over SSH
+    when needed.
+    
+    Modify the ceph init.d script to use do_cmd for querying the
+    Ceph version.
+    
+    Signed-off-by: Travis Rhoden <trhoden at gmail.com>
+    (cherry picked from commit 60fdb6fda6233b01dae4ed8a34427d5960840b84)
+
+commit c34e38bcdc0460219d19b21ca7a0554adf7f7f84
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Nov 28 13:00:36 2012 -0800
+
+    log: 10,000 recent log entries
+    
+    This is what we were (wrongly) doing before, so there are no memory
+    utilization surprises.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 78286b1403a5e0f14f95fe6b92f2fdb163e909f1)
+
+commit 4daede79f578cccd340210752f912e685b1ff03d
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Nov 28 12:59:43 2012 -0800
+
+    log: fix log_max_recent config
+    
+    <facepalm>
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4de7748b72d4f90eb1197a70015c199c15203354)
+
+commit fdae0552a0b8b1a634775609b473aff9221904f3
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Dec 20 13:48:06 2012 -0800
+
+    log: fix flush/signal race
+    
+    We need to signal the cond in the same interval where we hold the lock
+    *and* modify the queue.  Otherwise, we can have a race like:
+    
+     queue has 1 item, max is 1.
+     A: enter submit_entry, signal cond, wait on condition
+     B: enter submit_entry, signal cond, wait on condition
+     C: flush wakes up, flushes 1 previous item
+     A: retakes lock, enqueues something, exits
+     B: retakes lock, condition fails, waits
+      -> C is never woken up as there are 2 items waiting
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 50914e7a429acddb981bc3344f51a793280704e6)
+
+commit bdcf6647dec05617d3da46ad00459498ede94f1d
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri Dec 21 17:12:07 2012 -0800
+
+    .gitignore:  Add ar-lib to ignore list
+
+commit 51a900cfd7cc009f03fdb80be028015fc34547d2
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri Dec 21 16:55:27 2012 -0800
+
+    autogen.sh:  Create m4 directory for leveldb
+    
+    Signed-off-by: Gary Lowell <gary.lowell at inktank.com>
+
+commit 74473bb667df0ee0bb1adc6c43242733b80aa10d
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri Dec 21 16:17:33 2012 -0800
+
+    leveldb:  Update submodule
+    
+    Signed-off-by: Gary Lowell <gary.lowell at inktank.com>
+
+commit bc4f74c7b9ec4e6bbcf4ab4ab68a82a69b8eaca5
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Thu Dec 20 16:49:32 2012 -0800
+
+    ceph.spec.in:  Fedora builds debuginfo by default.
+    
+    Signed-off-by: Gary Lowell <gary.lowell at inktank.com>
+
+commit 3ed2d59e98494a0da29f4bb8537471237a6f8e93
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Dec 19 17:07:18 2012 -0800
+
+    rgw: fix error handling with swift
+    
+    Fixes: #3649
+    verify_swift_token returns a bool and not an int.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit dfd310368267df848f2b65cc536b4ffcb039d353
+Author: Sam Lang <sam.lang at inktank.com>
+Date:   Mon Sep 24 09:55:25 2012 -0700
+
+    client: Fix for #3184 cfuse segv with no keyring
+    
+    Fixes bug #3184 where the ceph-fuse client segfaults if authx is
+    enabled but no keyring file is present.  This was due to the
+    client->init() return value not getting checked.
+    
+    Signed-off-by: Sam Lang <sam.lang at inktank.com>
+    (cherry picked from commit 47983df4cbd31f299eef896b4612d3837bd7c7bd)
+
+commit acebcce91448421c34a72850a380fcd1aabe9f41
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Oct 9 21:25:54 2012 +0100
+
+    mon: Monitor: resolve keyring option to a file before loading keyring
+    
+    Otherwise our keyring default location, or any other similarly formatted
+    location, will be taken as the actual location for the keyring and fail.
+    
+    Reported-by: tziOm (at) #ceph
+    Fixes: 3276
+    Backport: argonaut
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 7ef0df25e001bfae303feb3ae36514608767b1f2)
+
+commit 7ab00a796d2233c3804f52fbba16c2f3ed0c297b
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Wed Dec 5 19:39:11 2012 -0800
+
+    .gitignore:  Add m4 macro directories to ignore list
+
+commit b781ac00e16fd802b6e055dd9d453271db6efa39
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Nov 8 12:43:24 2012 -0800
+
+    build:  Add RPM release string generated from git describe.
+    
+    Fix for bug 3451.  Use the commit count and sha1 from git describe to
+    construct a release string for rpm packages.
+    
+    Conflicts:
+    
+    	configure.ac
+
+commit f60c9b6600a85b840a02e145bac77326d60fd03f
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Fri Nov 9 13:28:13 2012 -0800
+
+    ceph.spec.in:  Build debuginfo subpackage.
+    
+    This is a partial fix for bug 3471.  Enable building of debuginfo package.
+    Some distributions enable this automatically by installing additional rpm
+    macros, on others it needs to be explicity added to the spec file.
+
+commit 7fbf9476cb44ce256f4bb2366f46fa20cb570eda
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Dec 3 14:32:28 2012 -0800
+
+    rgw: fix swift auth concurrency issue
+    
+    Fixes: #3565
+    Originally ops were using static structures, but that
+    has since changed. Switching swift auth handler to do
+    the same.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 0639cd9c479d69b077175f0385eb569ebb839349
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Nov 29 13:39:22 2012 -0800
+
+    rgw: fix rgw_tools get_obj()
+    
+    The original implementation broke whenever data exceeded
+    the chunk size. Also don't keep cache for objects that
+    exceed the chunk size as cache is not designed for
+    it. Increased chunk size to 512k.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 84983387a220a29540aca64af774bbe7bc6b5ee6
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Nov 29 12:47:59 2012 -0800
+
+    rgw: fix PUT acls
+    
+    This fixes a regression introduced at
+    17e4c0df44781f5ff1d74f3800722452b6a0fc58. The original
+    patch fixed error leak, however it also removed the
+    operation's send_response() call.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 6c1e2b663227cadff4255db3321976882df6b261
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Nov 19 17:10:11 2012 -0800
+
+    rgw: fix xml parser leak
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit f86522cdfcd81b2d28c581ac8b8de6226bc8d1a4)
+
+commit 17e4c0df44781f5ff1d74f3800722452b6a0fc58
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Nov 19 16:52:38 2012 -0800
+
+    rgw: fix memory leaks
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 98a04d76ebffa61c3ba4b033cdd57ac57b2f29f3)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
+    	src/rgw/rgw_op.h
+
+commit cd18b9f43cce68ac3d8f109e82a5b603f9caad9b
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Nov 7 13:21:15 2012 -0800
+
+    rgw: don't convert object mtime to UTC
+    
+    Fixes: #3452
+    When we read object info, don't try to convert mtime to
+    UTC, it's already in UTC.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit ddb40dec6e8d930fd63a71ef1c98279d6472e3e4
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Nov 14 11:30:34 2012 -0800
+
+    rgw: relax date format check
+    
+    Don't try to parse beyond the GMT or UTC. Some clients use
+    special date formatting. If we end up misparsing the date
+    it'll fail in the authorization, so don't need to be too
+    restrictive.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit e35e7e2bcb749e3ee00f1f93bc6b17bde8329414
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 30 14:17:56 2012 -0700
+
+    ceph-disk-activate: avoid duplicating mounts if already activated
+    
+    If the given device is already mounted at the target location, do not
+    mount --move it again and create a bunch of dup entries in the /etc/mtab
+    and kernel mount table.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c435d314caeb5424c1f4482ad02f8a085317ad5b)
+
+commit 0c9bbb3b4b4dbe6f0a12960785e35af9c748701a
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Oct 25 21:21:18 2012 -0700
+
+    ceph-disk-prepare: poke kernel into refreshing partition tables
+    
+    Prod the kernel to refresh the partition table after we create one.  The
+    partprobe program is packaged with parted, which we already use, so this
+    introduces no new dependency.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 402e1f5319a52c309eca936081fddede1f107268)
+
+commit b4004806ec387915ba4e039b9bc1c563273ef08f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Oct 25 21:20:21 2012 -0700
+
+    ceph-disk-prepare: fix journal partition creation
+    
+    The end value needs to have + to indicate it is relative to wherever the
+    start is.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2e32a0ee2d9e2a3bf5b138f50efc5fba8d5b8660)
+
+commit efac1bb19f1ca3851c7b51d96cb4e82d8d142a45
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Oct 25 18:14:47 2012 -0700
+
+    ceph-disk-prepare: assume parted failure means no partition table
+    
+    If the disk has no valid label we get an error like
+    
+      Error: /dev/sdi: unrecognised disk label
+    
+    Assume any error we get is that and go with an id label of 1.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8921fc7c7bc28fb98334c06f1f0c10af58085085)
+
+commit 39b9da403541617fb088aa4ae03925850aa2de65
+Merge: 83ab366 8c115d3
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Nov 12 11:24:00 2012 -0800
+
+    Merge remote-tracking branch 'gh/wip-mds-stable' into stable
+
+commit 8c115d3e81543a4c723bae217ba5b9d2c0e988f7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Nov 9 05:28:12 2012 -0800
+
+    mds: re-try_set_loner() after doing evals in eval(CInode*, int mask)
+    
+    Consider a case where current loner is A and wanted loner is B.
+    At the top of the function we try to set the loner, but that may fail
+    because we haven't processed the gathered caps yet for the previous
+    loner.  In the body we do that and potentially drop the old loner, but we
+    do not try_set_loner() again on the desired loner.
+    
+    Try after our drop.  If it succeeds, loop through the eval's one more time
+    so that we can issue caps approriately.
+    
+    This fixes a hang induced by a simple loop like:
+    
+     while true ; do echo asdf >> mnt.a/foo ; tail mnt.b/foo ; done &
+     while true ; do ls mnt.a mnt.b ; done
+    
+    (The second loop may not be necessary.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 1a23bd6981e2a308be4a905021453a6d5feac9e3
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jul 13 14:23:27 2012 -0700
+
+    CompatSet: users pass bit indices rather than masks
+    
+    CompatSet users number the Feature objects rather than
+    providing masks.  Thus, we should do
+    
+    mask |= (1 << f.id) rather than mask |= f.id.
+    
+    In order to detect old, broken encodings, the lowest
+    bit will be set in memory but not set in the encoding.
+    We can reconstruct the correct mask from the names map.
+    
+    This bug can cause an incompat bit to not be detected
+    since 1|2 == 1|2|3.
+    
+    fixes: #2748
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 83ab36655f397b7d781a611b4d82679c8484710f
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Wed Nov 7 12:41:10 2012 -0800
+
+    ceph.spec.in:  Remove ceph version requirement from ceph-fuse package.
+    
+    The ceph-fuse rpm package now only requires ceph as a pre-req, not a specific
+    version.
+
+commit 578b5764d5b26d190c295da88c1be5f0c77682a7
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Oct 24 13:15:46 2012 -0700
+
+    rgw: fix multipart overwrite
+    
+    Fixes: #3400
+    Removed a few lines of code that prematurely created the head
+    part of the final object (before creating the manifest).
+    
+    backport:argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 96888ddf154231daa6c7138bb2b97674771cc610
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Nov 5 23:27:13 2012 -0800
+
+    mds: move to from loner -> mix if *anyone* wants rd|wr
+    
+    We were either going to MIX or SYNC depending on whether non-loners wanted
+    to read/write, but it may be that the loner wants to if our logic for
+    choosing loner vs not longer is based on anything other that just rd|wr
+    wanted.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b940d7750d14285fc85ce63b0f0444b58ad3ad93
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Nov 5 23:26:09 2012 -0800
+
+    mds: base loner decision on wanted RD|WR|EXCL, not CACHE|BUFFER
+    
+    Observed instance where one client wanted the Fc cap and prevented the
+    loner from getting RD|WR caps.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 7a82a3214a38cbc7b5750adba23b760a4f51643a
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 30 09:00:11 2012 -0700
+
+    osd: make pool_snap_info_t encoding backward compatible
+    
+    Way back in fc869dee1e8a1c90c93cb7e678563772fb1c51fb (v0.42) when we redid
+    the osd type encoding we forgot to make this conditionally encode the old
+    format for old clients.  In particular, this means that kernel clients
+    will fail to decode the osdmap if there is a rados pool with a pool-level
+    snapshot defined.
+    
+    Fixes: #3290
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    
+    Conflicts:
+    
+    	src/test/encoding/types.h
+
+commit 8d7ca76182fdc04aaf8b698afbbd2d9b22e07fdc
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Fri Sep 7 13:49:27 2012 +0800
+
+    osd/OSD.cc: Fix typo in OSD::heartbeat_check()
+    
+    The check 'p->second.last_tx > cutoff' should always be false
+    since last_tx is periodically updated by OSD::heartbeat()
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit fc2b3ced4f7ed8d6e065c159fbeb8670fcdaca2a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Oct 22 16:52:11 2012 -0700
+
+    rgw: dump an error message if FCGX_Accept fails
+    
+    Adding missing debug info.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit d9b51b3b7011f4551fe27e33301b26cd23a72378
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Oct 22 15:38:30 2012 -0700
+
+    workqueue: make debug output include active threads
+    
+    Include active thread count in threadpool debug output.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 852e27d3e19239a696fa693e2a30c3226d27a611
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Oct 22 13:16:59 2012 -0700
+
+    rgw: don't continue processing of GET request on error
+    
+    Fixes #3381
+    We continued processing requests long after the client
+    has died. This fix appliese to both s3 and swift.
+    
+    backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 5f2b9b451da5a96fdbf9cf292648feb40dc13d28
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Oct 19 08:46:19 2012 -0700
+
+    osd: be quiet about watches
+    
+    Useless log noise.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit ea42eb1f7866fed0e843257ce05e34503fd0129c
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Oct 17 17:44:12 2012 -0700
+
+    addr_parsing: make , and ; and ' ' all delimiters
+    
+    Instead of just ,.  Currently "foo.com, bar.com" will fail because of the
+    space after the comma.  This patches fixes that, and makes all delim
+    chars interchangeable.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit b0164d9902c834c95187f6b277f58a30d26cc4d3
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Fri Oct 5 10:57:42 2012 -0700
+
+    ceph-disk-prepare, debian/control: Support external journals.
+    
+    Previously, ceph-disk-* would only let you use a journal that was a
+    file inside the OSD data directory. With this, you can do:
+    
+      ceph-disk-prepare /dev/sdb /dev/sdb
+    
+    to put the journal as a second partition on the same disk as the OSD
+    data (might save some file system overhead), or, more interestingly:
+    
+      ceph-disk-prepare /dev/sdb /dev/sdc
+    
+    which makes it create a new partition on /dev/sdc to use as the
+    journal. Size of the partition is decided by $osd_journal_size.
+    /dev/sdc must be a GPT-format disk. Multiple OSDs may share the same
+    journal disk (using separate partitions); this way, a single fast SSD
+    can serve as journal for multiple spinning disks.
+    
+    The second use case currently requires parted, so a Recommends: for
+    parted has been added to Debian packaging.
+    
+    Closes: #3078
+    Closes: #3079
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 5a3076fd51706e32bc55b734099037520299003b
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Oct 15 09:43:47 2012 -0700
+
+    rgw: don't add port to url if already has one
+    
+    Fixes: #3296
+    Specifically, is host name string already has ':', then
+    don't try to append theport (swift auth).
+    
+    backport: argonaut
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit d76b71caa99a39035ea6ed9db6ca0994975d38af
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Oct 15 16:37:05 2012 -0700
+
+    admin_socket: fix '0' protocol version
+    
+    Broken by 895e24d198ced83ab7fed3725f12f75e3bc97b0b.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 714254cb0522b194118eb854f90d4c3971e8c6b3
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Oct 8 17:14:22 2012 -0700
+
+    mon: drop command replies on paxos reset
+    
+    If paxos resets, do not send the reply for the commit we were waiting for;
+    let the command be reprocessed and re-proposed.
+    
+    Among other things, this could lead to nondeterministic results for
+    'ceph osd create <uuid>'.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit d9e981f4209da9a0e000d434e28686a133b25f11
+Merge: 5d84b4a 13b448b
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Oct 8 21:02:51 2012 -0700
+
+    Merge remote-tracking branch 'gh/for-stable-fstypes-and-ext-journal' into stable
+
+commit 5d84b4a22b2ff975679711719f336a312a6edff3
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Aug 2 13:02:04 2012 -0700
+
+    ceph-authtool: Fix usage, it's --print-key not --print.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 13b448b8ce959f31d07cd1827614c445c410aa62
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Fri Oct 5 09:22:34 2012 -0700
+
+    upstart: OSD journal can be a symlink; if it's dangling, don't start.
+    
+    This lets a $osd_data/journal symlink point to
+    /dev/disk/by-partuuid/UUID and the osd will not attempt to start until
+    that disk is available.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit d9dfa2d17859ca07d735b8e35c5dc00a25995153
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Oct 5 09:10:31 2012 -0700
+
+    osd: Make --get-journal-fsid not really start the osd.
+    
+    This way, it won't need -i ID and it won't access the osd_data_dir.
+    That makes it useful for locating the right osd to use with an
+    external journal partition.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit f65daf3f24830a28e85ebe7c6fce2642f5fc6dd8
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Fri Oct 5 09:08:56 2012 -0700
+
+    osd: Make --get-journal-fsid not attempt aio or direct_io.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 86546d7dec6cd5080162d1f3d7de2c579736dd65
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Thu Oct 4 16:03:40 2012 -0700
+
+    ceph-disk-prepare: Use the OSD uuid as the partition GUID.
+    
+    This will make locating the right data partition for a given journal
+    partition a lot easier.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit fa3aa41ead0be5a27695e3c208c5af00af90bc53
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Wed Oct 3 12:38:38 2012 -0700
+
+    debian/control, ceph-disk-prepare: Depend on xfsprogs, use xfs by default.
+    
+    Ext4 as a default is a bad choice, as we don't perform enough QA with
+    it. To use XFS as the default for ceph-disk-prepare, we need to depend
+    on xfsprogs.
+    
+    btrfs-tools is already recommended, so no change there. If you set
+    osd_fs_type=btrfs, and don't have the package installed, you'll just
+    get an error message.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 4c3997dc8bbd3985a7b86d8c54b71fbe15af1591
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Wed Oct 3 10:13:17 2012 -0700
+
+    ceph-disk-{prepare,activate}: Default mkfs arguments and mount options.
+    
+    The values for the settings were copied from teuthology task "ceph".
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit a6229b901785ef0a88d1b1886b5b5ae339ac7fcb
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Wed Oct 3 08:47:20 2012 -0700
+
+    ceph-disk-prepare: Avoid triggering activate before prepare is done.
+    
+    Earlier testing never saw this, but now a mount of a disk triggers a
+    udev blockdev-added event, causing ceph-disk-activate to run even
+    before ceph-disk-prepare has had a chance to write the files and
+    unmount the disk.
+    
+    Avoid this by using a temporary partition type uuid ("ceph 2 be"), and
+    only setting it to the permanent ("ceph osd"). The hotplug event won't
+    match the type uuid, and thus won't trigger ceph-disk-activate.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 03cec77e2b0b4536349880de6890ad9537da0783
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Oct 2 17:06:11 2012 -0700
+
+    ceph-disk-activate: Add a comment about user_xattr being default now.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit 4aa13c6d228b9256870e02a57496f00a75e17349
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Oct 2 16:53:35 2012 -0700
+
+    ceph-disk-activate: Use mount options from ceph.conf
+    
+    Always uses default cluster name ("ceph") for now, see
+    http://tracker.newdream.net/issues/3253
+    
+    Closes: #2548
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit b684ab1d1727b23f75f232123f1da947df2e5e63
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Oct 2 16:43:08 2012 -0700
+
+    ceph-disk-activate: Refactor to extract detect_fstype call.
+    
+    This allows us to use the fstype for a config lookup.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit ce5e1f8dfaa8675b0a1e9fa22ebf91be9652aa01
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Oct 2 16:37:07 2012 -0700
+
+    ceph-disk-activate: Unmount on errors (if it did the mount).
+    
+    This cleans up the error handling to not leave disks mounted
+    in /var/lib/ceph/tmp/mnt.* when something fails, e.g. when
+    the ceph command line tool can't talk to mons.
+    
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit da86e4e43676ceaf0b39635954489c297de88025
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Oct 2 16:23:55 2012 -0700
+
+    ceph-disk-prepare: Allow setting mkfs arguments and mount options in ceph.conf
+    
+    Tested with meaningless but easy-to-verify values:
+    
+      [global]
+      osd_fs_type = xfs
+      osd_fs_mkfs_arguments_xfs = -i size=512
+      osd_fs_mount_options_xfs = noikeep
+    
+    ceph-disk-activate does not respect the mount options yet.
+    
+    Closes: #2549
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit cf2e3b15cea99cc100169e7a67103676d8990aee
+Author: Tommi Virtanen <tv at inktank.com>
+Date:   Tue Oct 2 16:04:15 2012 -0700
+
+    ceph-disk-prepare: Allow specifying fs type to use.
+    
+    Either use ceph.conf variable osd_fs_type or command line option
+    --fs-type=
+    
+    Default is still ext4, as currently nothing guarantees xfsprogs
+    or btrfs-tools are installed.
+    
+    Currently both btrfs and xfs seems to trigger a disk hotplug event at
+    mount time, thus triggering a useless and unwanted ceph-disk-activate
+    run. This will be worked around in a later commit.
+    
+    Currently mkfs and mount options cannot be configured.
+    
+    Bug: #2549
+    Signed-off-by: Tommi Virtanen <tv at inktank.com>
+
+commit f031046c4d600ce0a0c2c9ad5856dc100b0901fb
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 26 15:43:56 2012 -0700
+
+    rgw: copy_object should not override ETAG implicitly
+    
+    When copying an object with new attrs, we still need to
+    maintain the ETAG.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 2fddfb0a95288d39cee2e82376297ce43296743b
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Sep 24 18:10:24 2012 -0700
+
+    rgw: url_decode should allocate extra byte for dest
+    
+    Was missing extra byte for null termination
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
diff --git a/doc/changelog/v0.56.1.txt b/doc/changelog/v0.56.1.txt
new file mode 100644
index 0000000..e2cfe9b
--- /dev/null
+++ b/doc/changelog/v0.56.1.txt
@@ -0,0 +1,316 @@
+commit e4a541624df62ef353e754391cbbb707f54b16f7
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Mon Jan 7 13:33:30 2013 -0800
+
+    v0.56.1
+
+commit 9aecacda7fbf07f12b210f87cf3dbb53021b068d
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 6 08:38:27 2013 -0800
+
+    msg/Pipe: prepare Message data for wire under pipe_lock
+    
+    We cannot trust the Message bufferlists or other structures to be
+    stable without pipe_lock, as another Pipe may claim and modify the sent
+    list items while we are writing to the socket.
+    
+    Related to #3678.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d16ad9263d7b1d3c096f56c56e9631fae8509651)
+
+commit 299dbad490df5e98c04f17fa8e486a718f3c121f
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 6 08:33:01 2013 -0800
+
+    msgr: update Message envelope in encode, not write_message
+    
+    Fill out the Message header, footer, and calculate CRCs during
+    encoding, not write_message().  This removes most modifications from
+    Pipe::write_message().
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 40706afc66f485b2bd40b2b4b1cd5377244f8758)
+
+commit 35d2f58305eab6c9b57a92269598b9729e2d8681
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 6 08:25:40 2013 -0800
+
+    msg/Pipe: encode message inside pipe_lock
+    
+    This modifies bufferlists in the Message struct, and it is possible
+    for multiple instances of the Pipe to get references on the Message;
+    make sure they don't modify those bufferlists concurrently.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4cfc4903c6fb130b6ac9105baf1f66fbda797f14)
+
+commit 9b23f195df43589d062da95a11abc07c79f3109b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 5 10:39:08 2013 -0800
+
+    msg/Pipe: associate sending msgs to con inside lock
+    
+    Associate a sending message with the connection inside the pipe_lock.
+    This way if a racing thread tries to steal these messages it will
+    be sure to reset the con point *after* we do such that it the con
+    pointer is valid in encode_payload() (and later).
+    
+    This may be part of #3678.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a058f16113efa8f32eb5503d5443aa139754d479)
+
+commit 6229b5a06f449a470d3211ea94c1c5faf7100876
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 5 09:29:50 2013 -0800
+
+    msg/Pipe: fix msg leak in requeue_sent()
+    
+    The sent list owns a reference to each message.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2a1eb466d3f8e25ec8906b3ca6118a14c4e269d2)
+
+commit 6a00ce0dc24626fdfa210ddec6334bde3c8a20db
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 7 12:58:39 2013 -0800
+
+    osdc/Objecter: fix linger_ops iterator invalidation on pool deletion
+    
+    The call to check_linger_pool_dne() may unregister the linger request,
+    invalidating the iterator.  To avoid this, increment the iterator at
+    the top of the loop.
+    
+    This mirror the fix in 4bf9078286d58c2cd4e85cb8b31411220a377092 for
+    regular non-linger ops.
+    
+    Fixes: #3734
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 62586884afd56f2148205bdadc5a67037a750a9b)
+
+commit a10950f91e6ba9c1620d8fd00a84fc59f983fcee
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 5 20:53:49 2013 -0800
+
+    os/FileJournal: include limits.h
+    
+    Needed for IOV_MAX.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ce49968938ca3636f48fe543111aa219f36914d8)
+
+commit cd194ef3c7082993cae0892a97494f2a917ce2a7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 4 17:43:41 2013 -0800
+
+    osd: special case CALL op to not have RD bit effects
+    
+    In commit 20496b8d2b2c3779a771695c6f778abbdb66d92a we treat a CALL as
+    different from a normal "read", but we did not adjust the behavior
+    determined by the RD bit in the op.  We tried to fix that in
+    91e941aef9f55425cc12204146f26d79c444cfae, but changing the op code breaks
+    compatibility, so that was reverted.
+    
+    Instead, special-case CALL in the helper--the only point in the code that
+    actually checks for the RD bit.  (And fix one lingering user to use that
+    helper appropriately.)
+    
+    Fixes: #3731
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 988a52173522e9a410ba975a4e8b7c25c7801123)
+
+commit 921e06decebccc913c0e4f61916d00e62e7e1635
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 4 20:46:48 2013 -0800
+
+    Revert "OSD: remove RD flag from CALL ops"
+    
+    This reverts commit 91e941aef9f55425cc12204146f26d79c444cfae.
+    
+    We cannot change this op code without breaking compatibility
+    with old code (client and server).  We'll have to special case
+    this op code instead.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit d3abd0fe0bb402ff403259d4b1a718a56331fc39)
+
+commit 7513e9719a532dc538d838f68e47c83cc51fef82
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 4 12:43:52 2013 -0800
+
+    ReplicatedPG: remove old-head optization from push_to_replica
+    
+    This optimization allowed the primary to push a clone as a single push in the
+    case that the head object on the replica is old and happens to be at the same
+    version as the clone.  In general, using head in clone_subsets is tricky since
+    we might be writing to head during the push.  calc_clone_subsets does not
+    consider head (probably for this reason).  Handling the clone from head case
+    properly would require blocking writes on head in the interim which is probably
+    a bad trade off anyway.
+    
+    Because the old-head optimization only comes into play if the replica's state
+    happens to fall on the last write to head prior to the snap that caused the
+    clone in question, it's not worth the complexity.
+    
+    Fixes: #3698
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e89b6ade63cdad315ab754789de24008cfe42b37)
+
+commit c63c66463a567e8095711e7c853ac8feb065c5c5
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jan 3 17:15:07 2013 -0800
+
+    os/FileStore: fix non-btrfs op_seq commit order
+    
+    The op_seq file is the starting point for journal replay.  For stable btrfs
+    commit mode, which is using a snapshot as a reference, we should write this
+    file before we take the snap.  We normally ignore current/ contents anyway.
+    
+    On non-btrfs file systems, however, we should only write this file *after*
+    we do a full sync, and we should then fsync(2) it before we continue
+    (and potentially trim anything from the journal).
+    
+    This fixes a serious bug that could cause data loss and corruption after
+    a power loss event.  For a 'kill -9' or crash, however, there was little
+    risk, since the writes were still captured by the host's cache.
+    
+    Fixes: #3721
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 28d59d374b28629a230d36b93e60a8474c902aa5)
+
+commit b8f061dcdb808a6fc5ec01535b37560147b537de
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 3 09:59:45 2013 -0800
+
+    OSD: for old osds, dispatch peering messages immediately
+    
+    Normally, we batch up peering messages until the end of
+    process_peering_events to allow us to combine many notifies, etc
+    to the same osd into the same message.  However, old osds assume
+    that the actiavtion message (log or info) will be _dispatched
+    before the first sub_op_modify of the interval.  Thus, for those
+    peers, we need to send the peering messages before we drop the
+    pg lock, lest we issue a client repop from another thread before
+    activation message is sent.
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4ae4dce5c5bb547c1ff54d07c8b70d287490cae9)
+
+commit 67968d115daf51762dce65af46b9b843eda592b5
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 2 22:38:53 2013 -0800
+
+    osd: move common active vs booting code into consume_map
+    
+    Push osdmaps to PGs in separate method from activate_map() (whose name
+    is becoming less and less accurate).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a32d6c5dca081dcd8266f4ab51581ed6b2755685)
+
+commit 34266e6bde9f36b1c46144d2341b13605eaa9abe
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 2 22:20:06 2013 -0800
+
+    osd: let pgs process map advances before booting
+    
+    The OSD deliberate consumes and processes most OSDMaps from while it
+    was down before it marks itself up, as this is can be slow.  The new
+    threading code does this asynchronously in peering_wq, though, and
+    does not let it drain before booting the OSD.  The OSD can get into
+    a situation where it marks itself up but is not responsive or useful
+    because of the backlog, and only makes the situation works by
+    generating more osdmaps as result.
+    
+    Fix this by calling activate_map() even when booting, and when booting
+    draining the peering_wq on each call.  This is harmless since we are
+    not yet processing actual ops; we only need to be async when active.
+    
+    Fixes: #3714
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0bfad8ef2040a0dd4a0dc1d3abf3ab5b2019d179)
+
+commit 4034f6c817d1efce5fb9eb8cc0a9327f9f7d7910
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 13:07:18 2012 -0800
+
+    log: broadcast cond signals
+    
+    We were using a single cond, and only signalling one waiter.  That means
+    that if the flusher and several logging threads are waiting, and we hit
+    a limit, we the logger could signal another logger instead of the flusher,
+    and we could deadlock.
+    
+    Similarly, if the flusher empties the queue, it might signal only a single
+    logger, and that logger could re-signal the flusher, and the other logger
+    could wait forever.
+    
+    Intead, break the single cond into two: one for loggers, and one for the
+    flusher.  Always signal the (one) flusher, and always broadcast to all
+    loggers.
+    
+    Backport: bobtail, argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 813787af3dbb99e42f481af670c4bb0e254e4432)
+
+commit 2141454eee3a1727706d48f8efef92f8a2b98278
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 2 13:58:44 2013 -0800
+
+    log: fix locking typo/stupid for dump_recent()
+    
+    We weren't locking m_flush_mutex properly, which in turn was leading to
+    racing threads calling dump_recent() and garbling the crash dump output.
+    
+    Backport: bobtail, argonaut
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 43cba617aa0247d714632bddf31b9271ef3a1b50)
+
+commit 936560137516a1fd5e55b52ccab59c408ac2c245
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 16:48:22 2012 -0800
+
+    test_filejournal: optionally specify journal filename as an argument
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 483c6f76adf960017614a8641c4dcdbd7902ce33)
+
+commit be0473bbb1feb8705be4fa8f827704694303a930
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 16:48:05 2012 -0800
+
+    test_filejournal: test journaling bl with >IOV_MAX segments
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c461e7fc1e34fdddd8ff8833693d067451df906b)
+
+commit de61932793c5791c770855e470e3b5b9ebb53dba
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 16:47:28 2012 -0800
+
+    os/FileJournal: limit size of aio submission
+    
+    Limit size of each aio submission to IOV_MAX-1 (to be safe).  Take care to
+    only mark the last aio with the seq to signal completion.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dda7b651895ab392db08e98bf621768fd77540f0)
+
+commit ded454c669171d4038b087cfdad52a57da222c1f
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 15:44:51 2012 -0800
+
+    os/FileJournal: logger is optional
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 076b418c7f03c5c62f811fdc566e4e2b776389b7)
diff --git a/doc/changelog/v0.56.2.txt b/doc/changelog/v0.56.2.txt
new file mode 100644
index 0000000..cd8e402
--- /dev/null
+++ b/doc/changelog/v0.56.2.txt
@@ -0,0 +1,1294 @@
+commit 586538e22afba85c59beda49789ec42024e7a061
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Tue Jan 29 23:54:47 2013 -0800
+
+    v0.56.2
+
+commit bcb8dfad9cbb4c6af7ae7f9584e36449a03cd1b6
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Jan 29 23:05:49 2013 -0800
+
+    cls_rbd, cls_rgw: use PRI*64 when printing/logging 64-bit values
+
+    caused segfaults in 32-bit build
+
+    Fixes: #3961
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e253830abac76af03c63239302691f7fac1af381)
+
+commit 5a7c5088cc8f57f75eb594a21bf5fb6661e50978
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Jan 29 15:18:53 2013 -0800
+
+    init-ceph: make ulimit -n be part of daemon command
+
+    ulimit -n from 'max open files' was being set only on the machine
+    running /etc/init.d/ceph.  It needs to be added to the commands to
+    start the daemons, and run both locally and remotely.
+
+    Verified by examining /proc/<pid>/limits on local and remote hosts
+
+    Fixes: #3900
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Loïc Dachary <loic at dachary.org>
+    Reviewed-by: Gary Lowell <gary.lowell at inktank.com>
+    (cherry picked from commit 84a024b647c0ac2ee5a91bacdd4b8c966e44175c)
+
+commit 95677fc599b9bf37ab4c2037b3675fd68f92ebcf
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Sat Jan 12 01:06:36 2013 +0000
+
+    mon: OSDMonitor: only share osdmap with up OSDs
+
+    Try to share the map with a randomly picked OSD; if the picked monitor is
+    not 'up', then try to find the nearest 'up' OSD in the map by doing a
+    backward and a forward linear search on the map -- this would be O(n) in
+    the worst case scenario, as we only do a single iteration starting on the
+    picked position, incrementing and decrementing two different iterators
+    until we find an appropriate OSD or we exhaust the map.
+
+    Fixes: #3629
+    Backport: bobtail
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3610e72e4f9117af712f34a2e12c5e9537a5746f)
+
+commit e4d76cb8594c0ec901f89c2f2e8cc53e00eb2a06
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Sun Jan 27 21:57:31 2013 +0100
+
+    utime: fix narrowing conversion compiler warning in sleep()
+
+    Fix compiler warning:
+    ./include/utime.h: In member function 'void utime_t::sleep()':
+    ./include/utime.h:139:50: warning: narrowing conversion of
+     '((utime_t*)this)->utime_t::tv.utime_t::<anonymous struct>::tv_sec' from
+     '__u32 {aka unsigned int}' to '__time_t {aka long int}' inside { } is
+     ill-formed in C++11 [-Wnarrowing]
+    ./include/utime.h:139:50: warning: narrowing conversion of
+     '((utime_t*)this)->utime_t::tv.utime_t::<anonymous struct>::tv_nsec' from
+     '__u32 {aka unsigned int}' to 'long int' inside { } is
+     ill-formed in C++11 [-Wnarrowing]
+
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 014fc6d6c1c68e2e3ad0117d08c4e46e4030d49e)
+
+commit a8964107ddf02ac4a6707a997e1b634c1084a3b9
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Jan 28 17:13:23 2013 -0800
+
+    rgw: fix crash when missing content-type in POST object
+
+    Fixes: #3941
+    This fixes a crash when handling S3 POST request and content type
+    is not provided.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit f41010c44b3a4489525d25cd35084a168dc5f537)
+
+commit 11e1f3acf0953e9ac38322c0423144eaabd7bb61
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 11 15:00:02 2013 -0800
+
+    ReplicatedPG: make_snap_collection when moving snap link in snap_trimmer
+
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 88956e3186798058a1170803f8abfc0f3cf77a07)
+
+commit c9201d0e9de5f4766a2d9f4715eb7c69691964de
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 11 16:43:14 2013 -0800
+
+    ReplicatedPG: correctly handle new snap collections on replica
+
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9e44fca13bf1ba39dbcad29111b29f46c49d59f7)
+
+commit 2efdfb41c1bc9128b76416630ee00a75de90c020
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Sun Jan 27 18:08:15 2013 +0000
+
+    mon: Elector: reset the acked leader when the election finishes and we lost
+
+    Failure to do so will mean that we will always ack the same leader during
+    an election started by another monitor.  This had been working so far
+    because we were still acking the existing leader if he was supposed to
+    still be the leader; or we were acking a new potentially leader; or we
+    would eventually fall behind on an election and start a new election
+    ourselves, thus resetting the previously acked leader.  While this wasn't
+    something that mattered much until now, the timechecks code stumbled into
+    this tiny issue and was failing hard at completing a round because there
+    wouldn't be a reset before the election started -- timechecks are bound
+    to election epochs.
+
+    Fixes: #3854
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit c54781618569680898e77e151dd7364f22ac4aa1)
+
+commit a16c6f3dc278e19e66776ffde45de3ff0db46a6c
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Dec 26 14:24:22 2012 -0800
+
+    rbd: fix bench-write infinite loop
+
+    I/O was continously submitted as long as there were few enough ops in
+    flight. If the number of 'threads' was high, or caching was turned on,
+    there would never be that many ops in flight, so the loop would continue
+    indefinitely. Instead, submit at most io_threads ops per offset.
+
+    Fixes: #3413
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit d81ac8418f9e6bbc9adcc69b2e7cb98dd4db6abb)
+
+commit 76f93751d3603e3fb5c4b9e14bfdac406d8d1a58
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Fri Jan 4 18:00:24 2013 -0800
+
+    rbd: Don't call ProgressContext's finish() if there's an error.
+
+    do_copy was different from the others; call pc.fail() on error and
+    do not call pc.finish().
+
+    Fixes: #3729
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 0978dc4963fe441fb67afecb074bc7b01798d59d)
+
+commit 10053b14623f9c19727cb4d2d3a6b62945bef5c1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Jan 2 14:15:24 2013 -0800
+
+    librbd: establish watch before reading header
+
+    This eliminates a window in which a race could occur when we have an
+    image open but no watch established. The previous fix (using
+    assert_version) did not work well with resend operations.
+
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit c4370ff03f8ab655a009cfd9ba3a0827d8c58b11)
+
+commit f666c617f6a5f8d94ce81461942c9f94a0775fb2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Jan 2 12:32:33 2013 -0800
+
+    Revert "librbd: ensure header is up to date after initial read"
+
+    Using assert version for linger ops doesn't work with retries,
+    since the version will change after the first send.
+    This reverts commit e1776809031c6dad441cfb2b9fac9612720b9083.
+
+    Conflicts:
+
+	qa/workunits/rbd/watch_correct_version.sh
+    (cherry picked from commit e0858fa89903cf4055889c405f17515504e917a0)
+
+commit 575a58666adbca83d15468899272e8c369e903e1
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 23 22:16:49 2013 -0800
+
+    os/FileStore: only adjust up op queue for btrfs
+
+    We only need to adjust up the op queue limits during commit for btrfs,
+    because the snapshot initiation (async create) is currently
+    high-latency and the op queue is quiesced during that period.
+
+    This lets us revert 44dca5c, which disabled the extra allowance because
+    it is generally bad for non-btrfs writeahead mode.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 38871e27eca5a34de78db23aa3663f6cb045d461)
+
+commit c9eb1b0a99b0e55f7d7343176dad17d1a53589a1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jan 24 10:52:46 2013 -0800
+
+    common/HeartbeatMap: fix uninitialized variable
+
+    Introduced by me in 132045ce085e8584a3e177af552ee7a5205b13d8.  Thank you,
+    valgrind!
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 00cfe1d3af286ffab7660933415684f18449720c)
+
+commit e6bceeedb0b77d23416560bd951326587470aacb
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 25 11:31:29 2013 -0800
+
+    sharedptr_registry: remove extaneous Mutex::Locker declaration
+
+    For some reason, the lookup() retry loop (for when happened to
+    race with a removal and grab an invalid WeakPtr) locked
+    the lock again.  This causes the #3836 crash since the lock
+    is already locked.  It's rare since it requires a lookup between
+    invalidation of the WeakPtr and removal of the WeakPtr entry.
+
+    Fixes: #3836
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 037900dc7a051ce2293a4ef9d0e71911b29ec159)
+
+commit 60888cafdc53d6b381cd634170646c12669e1754
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 24 12:02:09 2013 -0800
+
+    FileStore: ping TPHandle after each operation in _do_transactions
+
+    Each completed operation in the transaction proves thread
+    liveness, a stuck thread should still trigger the timeouts.
+
+    Fixes: #3928
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0c1cc687b6a40d3c6a26671f0652e1b51c3fd1af)
+
+commit 6b8a673f88cbaca2891834dd5d2137a0e076fd1e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 24 11:07:37 2013 -0800
+
+    OSD: use TPHandle in peering_wq
+
+    Implement _process overload with TPHandle argument and use
+    that to ping the hb map between pgs and between map epochs
+    when advancing a pg.  The thread will still timeout if
+    genuinely stuck at any point.
+
+    Fixes: 3905
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit e0511f4f4773766d04e845af2d079f82f3177cb6)
+
+commit aa6d20aac22d4c14ff059dbc28e06b7a5e5d6de1
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 24 11:04:04 2013 -0800
+
+    WorkQueue: add TPHandle to allow _process to ping the hb map
+
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 4f653d23999b24fc8c65a59f14905db6630be5b5)
+
+commit e66a75052a340b15693f08b05f7f9f5d975b0978
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 23 12:49:04 2013 -0800
+
+    ReplicatedPG: handle omap > max_recovery_chunk
+
+    span_of fails if len == 0.
+
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 8a97eef1f7004988449bd7ace4c69d5796495139)
+
+commit 44f0407a6b259e87803539ec9e942043de0cf35d
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 23 12:18:31 2013 -0800
+
+    ReplicatedPG: correctly handle omap key larger than max chunk
+
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit c3dec3e30a85ecad0090c75a38f28cb83e36232e)
+
+commit 50fd6ac9f147a4418d64dfe08843402e7cfb4910
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 23 12:15:10 2013 -0800
+
+    ReplicatedPG: start scanning omap at omap_recovered_to
+
+    Previously, we started scanning omap after omap_recovered_to.
+    This is a problem since the break in the loop implies that
+    omap_recovered_to is the first key not recovered.
+
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 09c71f2f5ee9929ac4574f4c35fb8c0211aad097)
+
+commit 4b32eecba2e2bd8e8ea17e1888e6971d31e71439
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 23 11:50:13 2013 -0800
+
+    ReplicatedPG: don't finish_recovery_op until the transaction completes
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 62a4b96831c1726043699db86a664dc6a0af8637)
+
+commit da34c77b93e3f880c01329711ab8eca7776b1830
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 23 11:35:47 2013 -0800
+
+    ReplicatedPG: ack push only after transaction has completed
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 20278c4f77b890d5b2b95d2ccbeb4fbe106667ac)
+
+commit f9381c74931b80294e5df60f6d2e69c946b8fe88
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 23 11:13:28 2013 -0800
+
+    ObjectStore: add queue_transactions with oncomplete
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 4d6ba06309b80fb21de7bb5d12d5482e71de5f16)
+
+commit e2560554f0568c30c786632723c5ce0c86043359
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 22 21:18:45 2013 -0800
+
+    common/HeartbeatMap: inject unhealthy heartbeat for N seconds
+
+    This lets us test code that is triggered by an unhealthy heartbeat in a
+    generic way.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 132045ce085e8584a3e177af552ee7a5205b13d8)
+
+commit cbe8b5bca40fd63a382b1a903087e7c34b314985
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 22 18:08:22 2013 -0800
+
+    os/FileStore: add stall injection into filestore op queue
+
+    Allow admin to artificially induce a stall in the op queue.  Forces the
+    thread(s) to sleep for N seconds.  We pause for 1 second increments and
+    recheck the value so that a previously stalled thread can be unwedged by
+    reinjecting a lower value (or 0).  To stall indefinitely, just injust
+    very large number.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 657df852e9c89bfacdbce25ea014f7830d61e6aa)
+
+commit beb6ca44cd0e7fc405360e6da974252cb76e7039
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 22 18:03:10 2013 -0800
+
+    osd: do not join cluster if not healthy
+
+    If our internal heartbeats are failing, do not send a boot message and try
+    to join the cluster.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a4e78652cdd1698e8dd72dda51599348d013e5e0)
+
+commit 1ecdfca3a3b4985ebd182a5f399c7b15af258663
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 22 18:01:07 2013 -0800
+
+    osd: hold lock while calling start_boot on startup
+
+    This probably doesn't strictly matter because start_boot doesn't need the
+    lock (currently) and few other threads should be running, but it is
+    better to be consistent.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c406476c0309792c43df512dddb2fe0f19835e71)
+
+commit e120bf20b3c7213fbde20907e158792dd36c8e54
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 22 17:56:32 2013 -0800
+
+    osd: do not reply to ping if internal heartbeat is not healthy
+
+    If we find that our internal threads are stalled, do not reply to ping
+    requests.  If we do this long enough, peers will mark us down.  If we are
+    only transiently unhealthy, we will reply to the next ping and they will
+    be satisfied.  If we are unhealthy and marked down, and eventually recover,
+    we will mark ourselves back up.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ad6b231127a6bfcbed600a7493ca3b66c68484d2)
+
+commit 5f396e2b9360401dfe4dc2afa6acc37df8580c80
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 22 17:53:40 2013 -0800
+
+    osd: reduce op thread heartbeat default 30 -> 15 seconds
+
+    If the thread stalls for 15 seconds, let our internal heartbeat fail.
+    This will let us internally respond more quickly to a stalled or failing
+    disk.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 61eafffc3242357d9add48be9308222085536898)
+
+commit fca288b718ef4582d65ff4b9d1fc87ba53d7fd8d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 21:02:01 2013 -0800
+
+    osd: improve sub_op flag points
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 73a969366c8bbd105579611320c43e2334907fef)
+
+commit f13ddc8a2df401c37f6dc792eb93fc0cc45705e2
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 20:55:20 2013 -0800
+
+    osd: refactor ReplicatedPG::do_sub_op
+
+    PULL is the only case where we don't wait for active.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 23c02bce90c9725ccaf4295de3177e8146157723)
+
+commit d5e00f963f177745f0e0684d5977460b7ab59fbd
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 16:36:36 2013 -0800
+
+    osd: make last state for slow requests more informative
+
+    Report on the last event string, and pass in important context for the
+    op event list, including:
+
+     - which peers were sent sub ops and we are waiting for
+     - which pg queue we are delayed by
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a1137eb3e168c2d00f93789e4d565c1584790df0)
+
+commit ab3a110cbe16b548bb96225656b64507aa67e78f
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 15:59:07 2013 -0800
+
+    osd: dump op priority queue state via admin socket
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 24d0d7eb0165c8b8f923f2d8896b156bfb5e0e60)
+
+commit 43a65d04d8a13621a856baec85fb741971c13cb0
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 15:50:33 2013 -0800
+
+    osd: simplify asok to single callback
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 33efe32151e04beaafd9435d7f86dc2eb046214d)
+
+commit d040798637da03e3df937181de156714fc62a550
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 15:58:57 2013 -0800
+
+    common/PrioritizedQueue: dump state to Formatter
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 514af15e95604bd241d2a98a97b938889c6876db)
+
+commit 691fd505ad606bd8befd2b19113ee51a17a0a543
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 15:29:28 2013 -0800
+
+    common/PrioritizedQueue: add min cost, max tokens per bucket
+
+    Two problems.
+
+    First, we need to cap the tokens per bucket.  Otherwise, a stream of
+    items at one priority over time will indefinitely inflate the tokens
+    available at another priority.  The cap should represent how "bursty"
+    we allow a given bucket to be.  Start with 4MB for now.
+
+    Second, set a floor on the item cost.  Otherwise, we can have an
+    infinite queue of 0 cost items that start over queues.  More
+    realistically, we need to balance the overhead of processing small items
+    with the cost of large items.  I.e., a 4 KB item is not 1/1000th as
+    expensive as a 4MB item.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6e3363b20e590cd9df89f2caebe71867b94cc291)
+
+commit a2b03fe08044b5c121ea6b4c2f9d19e73e4c83d1
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 14:52:54 2013 -0800
+
+    common/PrioritizedQueue: buckets -> tokens
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c549a0cf6fae78c8418a3b4b0702fd8a1e4ce482)
+
+commit 612d75cdee0daf9dfca97831c249e1ac3fbd59fc
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 14:31:00 2013 -0800
+
+    note puller's max chunk in pull requests
+
+    this lets us calculate a cost value
+    (cherry picked from commit 128fcfcac7d3fb66ca2c799df521591a98b82e05)
+
+commit 2224e413fba11795693025fa8f11c3f1fba4bbaa
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 14:14:25 2013 -0800
+
+    osd: add OpRequest flag point when commit is sent
+
+    With writeahead journaling in particular, we can get requests that
+    stay in the queue for a long time even after the commit is sent to the
+    client while we are waiting for the transaction to apply to the fs.
+    Instead of showing up as 'waiting for subops', make it clear that the
+    client has gotten its reply and it is local state that is slow.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b685f727d4c37a26cb78bd4a04cce041428ceb52)
+
+commit 5b5ca5926258e4f0b5041fb2c15b1c2f904c4adb
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 13:57:59 2013 -0800
+
+    osd: set PULL subop cost to size of requested data
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a1bf8220e545f29b83d965f07b1abfbea06238b3)
+
+commit 10651e4f500d7b55d8c689a10a61d2239b3ecd26
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 13:57:38 2013 -0800
+
+    osd: use Message::get_cost() function for queueing
+
+    The data payload is a decent proxy for cost in most cases, but not all.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e8e0da1a577e24cd4aad71fb94d8b244e2ac7300)
+
+commit 9735c6b163f4d226d8de6508d5c1534d18f1c300
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 13:25:21 2013 -0800
+
+    osd: debug msg prio, cost, latency
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bec96a234c160bebd9fd295df5b431dc70a2cfb3)
+
+commit c48279da7ad98013ce97eab89c17fe9fae1ba866
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 21:05:00 2013 -0800
+
+    filestore: filestore_queue_max_ops 500 -> 50
+
+    Having a deep queue limits the effectiveness of the priority queues
+    above by adding additional latency.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 40654d6d53436c210b2f80911217b044f4d7643a)
+
+commit f47b2e8b607cc0d56a42ec7b1465ce6b8c0ca68c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 20:00:26 2013 -0800
+
+    osd: target transaction size 300 -> 30
+
+    Small transactions make pg removal nicer to the op queue.  It also slows
+    down PG deletion a bit, which may exacerbate the PG resurrection case
+    until #3884 is addressed.
+
+    At least on user reported this fixed an osd that kept failing due to
+    an internal heartbeat failure.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1233e8617098766c95100aa9a6a07db1a688e290)
+
+commit 4947f0efadf9ef209d02fd17f5f86b9a7d6523ef
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 21 19:55:26 2013 -0800
+
+    os/FileStore: allow filestore_queue_max_{ops,bytes} to be adjusted at runtime
+
+    The 'committing' ones too.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cfe4b8519363f92f84f724a812aa41257402865f)
+
+commit ad6e6c91f61c092bfc9f88b788ccbee6438fd40b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 22:06:27 2013 -0800
+
+    osd: make osd_max_backfills dynamically adjustable
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 101955a6b8bfdf91f4229f4ecb5d5b3da096e160)
+
+commit 939b1855245bc9cb31f5762027f2ed3f2317eb55
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 18:28:35 2013 -0800
+
+    osd: make OSD a config observer
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9230c863b3dc2bdda12c23202682a84c48f070a1)
+
+    Conflicts:
+
+	src/osd/OSD.cc
+
+commit b0f27a8f81feb401407bed784bf5d4d799998ee0
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Jan 8 11:21:22 2013 -0800
+
+    librbd: Allow get_lock_info to fail
+
+    If the lock class isn't present, EOPNOTSUPP is returned for lock calls
+    on newer OSDs, but sadly EIO on older; we need to treat both as
+    acceptable failures for RBD images.  rados lock list will still fail.
+
+    Fixes #3744.
+
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4483285c9fb16f09986e2e48b855cd3db869e33c)
+
+commit 022a5254b4fac3f76220abdde2a2e81de33cb8dc
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 4 13:00:56 2013 -0800
+
+    osd: drop newlines from event descriptions
+
+    These produce extra newlines in the log.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 9a1f574283804faa6dbba9165a40558e1a6a1f13)
+
+commit ebc93a878c8b0697004a619d6aa957a80b8b7e35
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 18 14:35:51 2013 -0800
+
+    OSD: do deep_scrub for repair
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 0cb760f31b0cb26f022fe8b9341e41cd5351afac)
+
+commit 32527fa3eb48a7d7d5d67c39bfa05087dbc0e41b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jan 14 12:52:04 2013 -0800
+
+    ReplicatedPG: ignore snap link info in scrub if nlinks==0
+
+    links==0 implies that the replica did not sent snap link information.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 70c3512037596a42ba6eb5eb7f96238843095db9)
+
+commit 13e42265db150b19511a5a618c7a95ad801290c8
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 11 12:25:22 2013 -0800
+
+    osd/PG: fix osd id in error message on snap collection errors
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 381e25870f26fad144ecc2fb99710498e3a7a1d4)
+
+commit e3b6191fc45c7d2c27ec75c867be822a6da17e9a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 9 22:34:12 2013 -0800
+
+    osd/ReplicatedPG: validate ino when scrubbing snap collections
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 665577a88b98390b9db0f9991836d10ebdd8f4cf)
+
+commit 353b7341caff86f936a429669de52e6949a89c2b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 9 16:41:40 2013 -0800
+
+    ReplicatedPG: compare nlinks to snapcolls
+
+    nlinks gives us the number of hardlinks to the object.
+    nlinks should be 1 + snapcolls.size().  This will allow
+    us to detect links which remain in an erroneous snap
+    collection.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit e65ea70ea64025fbb0709ee8596bb2878be0bbdc)
+
+commit 33d5cfc8c080a270d65275f8e010a6468c77381a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 10 15:35:10 2013 -0800
+
+    ReplicatedPG/PG: check snap collections during _scan_list
+
+    During _scan_list check the snapcollections corresponding to the
+    object_info attr on the object.  Report inconsistencies during
+    scrub_finalize.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 57352351bb86e0ae9f64f9ba0d460c532d882de6)
+
+commit bea783bd722d862a5018477a637c843fe4b18a58
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 9 11:53:52 2013 -0800
+
+    osd_types: add nlink and snapcolls fields to ScrubMap::object
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit b85687475fa2ec74e5429d92ee64eda2051a256c)
+
+commit 0c48407bf46b39b2264a7be14e9d3caa2c1e5875
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 3 20:16:50 2013 -0800
+
+    PG: move auth replica selection to helper in scrub
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 39bc65492af1bf1da481a8ea0a70fe7d0b4b17a3)
+
+commit c3433ce60ec3683217d8b4cd2b6e75fb749af2c6
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 14 18:23:52 2013 -0800
+
+    mon: note scrub errors in health summary
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8e33a8b9e1fef757bbd901d55893e9b84ce6f3fc)
+
+commit 90c6edd0155b327c48a5b178d848d9e5839bd928
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 14 18:31:06 2013 -0800
+
+    osd: fix rescrub after repair
+
+    We were rescrubbing if INCONSISTENT is set, but that is now persistent.
+    Add a new scrub_after_recovery flag that is reset on each peering interval
+    and set that when repair encounters errors.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a586966a3cfb10b5ffec0e9140053a7e4ff105d2)
+
+commit 0696cf57283e6e9a3500c56ca5fc9f981475ca26
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 14 18:22:02 2013 -0800
+
+    osd: note must_scrub* flags in PG operator<<
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d56af797f996ac92bf4e0886d416fd358a2aa08e)
+
+commit 1541ffe4bec6cce607c505271ff074fd0a292d30
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 14 18:21:46 2013 -0800
+
+    osd: based INCONSISTENT pg state on persistent scrub errors
+
+    This makes the state persistent across PG peering and OSD restarts.
+
+    This has the side-effect that, on recovery, we rescrub any PGs marked
+    inconsistent.  This is new behavior!
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2baf1253eed630a7c4ae4cb43aab6475efd82425)
+
+commit 609101255c81d977072b2ab741ac47167d9b1b16
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 14 18:20:29 2013 -0800
+
+    osd: fix scrub scheduling for 0.0
+
+    The initial value for pair<utime_t,pg_t> can match pg 0.0, preventing it
+    from being manually scrubbed.  Fix!
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 26a63df97b2a12fd1a7c1e3cc9ccd34ca2ef9834)
+
+commit 0961a3a85c286a31ec2e8bba23217bbd3974572c
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 23:03:01 2013 -0800
+
+    osd: note last_clean_scrub_stamp, last_scrub_errors
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 389bed5d338cf32ab14c9fc2abbc7bcc386b8a28)
+
+commit 8d823045538bf4c51506e349b5c6705fd76450f8
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 22:59:39 2013 -0800
+
+    osd: add num_scrub_errors to object_stat_t
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2475066c3247774a2ad048a2e32968e47da1b0f5)
+
+commit 3a1cd6e07b4e2a4714de159f69afd689495e2927
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 22:43:35 2013 -0800
+
+    osd: add last_clean_scrub_stamp to pg_stat_t, pg_history_t
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d738328488de831bf090f23e3fa6d25f6fa819df)
+
+commit 7e5a899bdcf6c08a5f6f5c98cd2fff7fa2dacaca
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 22:56:14 2013 -0800
+
+    osd: fix object_stat_sum_t dump signedness
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6f6a41937f1bd05260a8d70b4c4a58ecadb34a2f)
+
+commit e252a313d465006d3fe4db97939ad307ebe91c71
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 22:04:58 2013 -0800
+
+    osd: change scrub min/max thresholds
+
+    The previous 'osd scrub min interval' was mostly meaningless and useless.
+    Meanwhile, the 'osd scrub max interval' would only trigger a scrub if the
+    load was sufficiently low; if it was high, the PG might *never* scrub.
+
+    Instead, make the 'min' what the max used to be.  If it has been more than
+    this many seconds, and the load is low, scrub.  And add an additional
+    condition that if it has been more than the max threshold, scrub the PG
+    no matter what--regardless of the load.
+
+    Note that this does not change the default scrub interval for less-loaded
+    clusters, but it *does* change the meaning of existing config options.
+
+    Fixes: #3786
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 299548024acbf8123a4e488424c06e16365fba5a)
+
+    Conflicts:
+
+	PendingReleaseNotes
+
+commit 33aa64eee34f4759f6000130de4d1306de49d087
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 20:27:59 2013 -0800
+
+    osd/PG: remove useless osd_scrub_min_interval check
+
+    This was already a no-op: we don't call PG::scrub_sched() unless it has
+    been osd_scrub_max_interval seconds since we last scrubbed.  Unless we
+    explicitly requested in, in which case we don't want this check anyway.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 16d67c798b6f752a6e03084bafe861396b86baae)
+
+commit fdd0c1ec3519376980a205b94e65187833634e2e
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 13 20:25:39 2013 -0800
+
+    osd: move scrub schedule random backoff to seperate helper
+
+    Separate this from the load check, which will soon vary dependon on the
+    PG.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a148120776d0930b265411332a60e93abfbf0423)
+
+commit 9ffbe268f785e1a74c0d893735117edb7a3ef377
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 12 09:18:38 2013 -0800
+
+    osd/PG: trigger scrub via scrub schedule, must_ flags
+
+    When a scrub is requested, flag it and move it to the front of the
+    scrub schedule instead of immediately queuing it.  This avoids
+    bypassing the scrub reservation framework, which can lead to a heavier
+    impact on performance.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 62ee6e099a8e4873287b54f9bba303ea9523d040)
+
+commit cffb1b22d5df7300ec411d2b620bf3c4a08351cd
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 12 09:15:16 2013 -0800
+
+    osd/PG: introduce flags to indicate explicitly requested scrubs
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1441095d6babfacd781929e8a54ed2f8a4444467)
+
+commit 438e3dfc88bfdc8eb36b5b5f7b728b2610476724
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 12 09:14:01 2013 -0800
+
+    osd/PG: move scrub schedule registration into a helper
+
+    Simplifies callers, and will let us easily modify the decision of when
+    to schedule the PG for scrub.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 796907e2159371f84a16cbd35f6caa8ac868acf6)
+
+commit acb47e4d7dc9682937984661a9d754131d806630
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 12:14:48 2013 -0800
+
+    os/FileStore: only flush inline if write is sufficiently large
+
+    Honor filestore_flush_min in the inline flush case.
+
+    Backport: bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 49726dcf973c38c7313ab78743b45ccc879671ea)
+
+commit 15a1ced859629c361da127799b05620bee84c9a8
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 12:14:40 2013 -0800
+
+    os/FileStore: fix compile when sync_file_range is missing;
+
+    If sync_file_range is not present, we always close inline, and flush
+    via fdatasync(2).
+
+    Fixes compile on ancient platforms like RHEL5.8.
+
+    Backport: bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 8ddb55d34c72e6df1023cf427cbd41f3f98da402)
+
+commit 9dddb9d855e6d5fd804b54bff1f726c1d2fb566c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 15:23:22 2013 -0800
+
+    osd: set pg removal transactions based on configurable
+
+    Use the osd_target_transaction_size knob, and gracefully tolerate bogus
+    values (e.g., <= 0).
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5e00af406b89c9817e9a429f92a05ca9c29b19c3)
+
+commit c30d231e40a17c3fb08d1db5e01133466170e90c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 15:30:06 2013 -0800
+
+    osd: make pg removal thread more friendly
+
+    For a large PG these are saturating the filestore and journal queues.  Do
+    them synchronously to make them more friendly.  They don't need to be fast.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4712e984d3f62cdf51ea67da8197eed18a5983dd)
+
+commit b2bc4b95fefaeb0cfc31ce0bc95b77062d0777c7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 15:27:24 2013 -0800
+
+    os: move apply_transactions() sync wrapper into ObjectStore
+
+    This has nothing to do with the backend implementation.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bc994045ad67fb70c7a0457b8cd29273dd5d1654)
+
+commit 6d161b57979246ddea4e6309e0e489ab729eec4b
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 15:28:24 2013 -0800
+
+    os: add apply_transaction() variant that takes a sequencer
+
+    Also, move the convenience wrappers into the interface and funnel through
+    a single implementation.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f6c69c3f1ac35546b90315fff625993ba5cd8c07)
+
+commit c5fe0965572c074a2a33660719ce3222d18c1464
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 20 16:11:10 2013 -0800
+
+    osd: calculate initial PG mapping from PG's osdmap
+
+    The initial values of up/acting need to be based on the PG's osdmap, not
+    the OSD's latest.  This can cause various confusion in
+    pg_interval_t::check_new_interval() when calling OSDMap methods due to the
+    up/acting OSDs not existing yet (for example).
+
+    Fixes: #3879
+    Reported-by: Jens Kristian S?gaard <jens at mermaidconsulting.dk>
+    Tested-by: Jens Kristian S?gaard <jens at mermaidconsulting.dk>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 17160843d0c523359d8fa934418ff2c1f7bffb25)
+
+commit 6008b1d8e4587d5a3aea60684b1d871401496942
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jan 17 15:01:35 2013 -0800
+
+    osdmap: make replica separate in default crush map configurable
+
+    Add 'osd crush chooseleaf type' option to control what the default
+    CRUSH rule separates replicas across.  Default to 1 (host), and set it
+    to 0 in vstart.sh.
+
+    Fixes: #3785
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit c236a51a8040508ee893e4c64b206e40f9459a62)
+
+commit 5fb77bf1d1b241b4f9c1fe9e57288bbc84d8d97d
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 16 14:09:53 2013 -0800
+
+    ceph: adjust crush tunables via 'ceph osd crush tunables <profile>'
+
+    Make it easy to adjust crush tunables.  Create profiles:
+
+     legacy: the legacy values
+     argonaut: the argonaut defaults, and what is supported.. legacy! (*(
+     bobtail: best that bobtail supports
+     optimal: the current optimal values
+     default: the current default values
+
+    * In actuality, argonaut supports some of the tunables, but it doesn't
+      say so via the feature bits.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 19ee23111585f15a39ee2907fa79e2db2bf523f0)
+
+commit 8c0d702e6f2ba0ed0fe31c06c7a028260ae08e42
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Dec 28 17:20:43 2012 -0800
+
+    msg/Pipe: use state_closed atomic_t for _lookup_pipe
+
+    We shouldn't look at Pipe::state in SimpleMessenger::_lookup_pipe() without
+    holding pipe_lock.  Instead, use an atomic that we set to non-zero only
+    when transitioning to the terminal STATE_CLOSED state.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 82f8bcddb5fa09913eb477ee26c71d6b4bb8d97c)
+
+commit 8e0359c3e586c0edcce769c8ed1a03444a521165
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Dec 23 13:43:15 2012 -0800
+
+    msgr: inject delays at inconvenient times
+
+    Exercise some rare races by injecting delays before taking locks
+    via the 'ms inject internal delays' option.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a5d692a7b9b4bec2c27993ca37aa3fec4065292b)
+
+commit 34e2d4024700f633c2c586265efb61537342db18
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Dec 23 09:22:18 2012 -0800
+
+    msgr: fix race on Pipe removal from hash
+
+    When a pipe is faulting and shutting down, we have to drop pipe_lock to
+    take msgr lock and then remove the entry.  The Pipe in this case will
+    have STATE_CLOSED.  Handle this case in all places we do a lookup on
+    the rank_pipe hash so that we effectively ignore entries that are
+    CLOSED.
+
+    This fixes a race introduced by the previous commit where we won't use
+    the CLOSED pipe and try to register a new one, but the old one is still
+    registered.
+
+    See bug #3675.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e99b4a307b4427945a4eb5ec50e65d6239af4337)
+
+commit ae1882e7efc91b770ac0ac8682ee6c5792a63a93
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Dec 23 09:19:05 2012 -0800
+
+    msgr: don't queue message on closed pipe
+
+    If we have a con that refs a pipe but it is closed, don't use it.  If
+    the ref is still there, it is only because we are racing with fault()
+    and it is about to (or just was) be detached.  Either way,
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6339c5d43974f4b495f15d199e01a141e74235f5)
+
+commit 373f1671b6cb64dba5a9172967b27177515be1fd
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Dec 22 21:24:52 2012 -0800
+
+    msgr: atomically queue first message with connect_rank
+
+    Atomically queue the first message on the new pipe, without dropping
+    and retaking pipe_lock.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7bf0b0854d1f2706a3a2302bcbf92dd5c8c888ef)
+
+commit 82f22b38c5dc0b636574679ba1fee1b36a3c0478
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jan 10 11:06:02 2013 -0800
+
+    config_opts.h: default osd_recovery_delay_start to 0
+
+    This setting was intended to prevent recovery from overwhelming peering traffic
+    by delaying the recovery_wq until osd_recovery_delay_start seconds after pgs
+    stop being added to it.  This should be less necessary now that recovery
+    messages are sent with strictly lower priority then peering messages.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Gregory Farnum <greg at inktank.com>
+    (cherry picked from commit 44625d4460f61effe2d63d8280752f10f159e7b4)
+
+commit 81e8bb55e28384048fd82116a791a65ca52ef999
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 16 21:19:18 2013 -0800
+
+    osdmaptool: more fix cli test
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b0162fab3d927544885f2b9609b9ab3dc4aaff74)
+
+commit 2b5b2657579abdf5b1228f4c5c5ac8cec3706726
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 16 21:10:26 2013 -0800
+
+    osdmaptool: fix cli test
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5bd8765c918174aea606069124e43c480c809943)
+
+commit f739d1238a8a67598c037b6e2ed5d539a2d79996
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 16 14:21:47 2013 -0800
+
+    osdmaptool: allow user to specify pool for test-map-object
+
+    Fixes: #3820
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Gregory Farnum <greg at inktank.com>
+    (cherry picked from commit 85eb8e382a26dfc53df36ae1a473185608b282aa)
+
+commit 00759ee08f5dc62cbe4f237399f298472f6d8f4a
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed Jan 16 12:41:16 2013 -0800
+
+    rados.cc: fix rmomapkey usage: val not needed
+
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    Reviewed-by: Samuel Just <samuel.just at inktank.com>
+    (cherry picked from commit 625c3cb9b536a0cff7249b8181b7a4f09b1b4f4f)
+
+commit 06b3270f679be496df41810dacf863128b0cfcaa
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jan 15 21:27:23 2013 -0800
+
+    librados.hpp: fix omap_get_vals and omap_get_keys comments
+
+    We list keys greater than start_after.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 3f0ad497b3c4a5e9bef61ecbae5558ae72d4ce8b)
+
+commit 75072965201380aa55a8e15f9db4ccaf4d34d954
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jan 15 21:26:22 2013 -0800
+
+    rados.cc: use omap_get_vals_by_keys in getomapval
+
+    Fixes: #3811
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit cb5e2be418924cf8b2c6a6d265a7a0327f08d00a)
+
+commit a3c2980fccfe95b7d094a7c93945437c3911b858
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jan 15 21:24:50 2013 -0800
+
+    rados.cc: fix listomapvals usage: key,val are not needed
+
+    Fixes: #3812
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 44c45e520cc2e60c6c803bb245edb9330bff37e4)
+
+commit 20b27a1ce71c379a3b2a29d282dc0689a3a0df46
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jan 16 15:01:47 2013 -0800
+
+    rgw: copy object should not copy source acls
+
+    Fixes: #3802
+    Backport: argonaut, bobtail
+
+    When using the S3 api and x-amz-metadata-directive is
+    set to COPY we used to copy complete metadata of source
+    object. However, this shouldn't include the source ACLs.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 37dbf7d9df93dd0e92019be31eaa1a19dd9569c7)
+
+commit 3293b31b44c9adad2b5e37da9d5342a6e4b72ade
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 11 11:02:15 2013 -0800
+
+    OSD: only trim up to the oldest map still in use by a pg
+
+    map_cache.cached_lb() provides us with a lower bound across
+    all pgs for in-use osdmaps.  We cannot trim past this since
+    those maps are still in use.
+
+    backport: bobtail
+    Fixes: #3770
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 66eb93b83648b4561b77ee6aab5b484e6dba4771)
+
+commit 898a4b19ecc6fffc33feb198f37182ec0a6e77e9
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 14 08:15:02 2013 -0800
+
+    Revert "osdmap: spread replicas across hosts with default crush map"
+
+    This reverts commit 503917f0049d297218b1247dc0793980c39195b3.
+
+    This breaks vstart and teuthology configs.  A better fix is coming.
+
+commit 55b7dd3248f35929ea097525798e8667fafbf161
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Jan 10 18:54:12 2013 +0000
+
+    mon: OSDMonitor: don't output to stdout in plain text if json is specified
+
+    Fixes: #3748
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 410906e04936c935903526f26fb7db16c412a711)
+
+commit 015a454a0c046cb678991cc4f4d53fb58c41dbe4
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 11 17:23:22 2013 -0800
+
+    osdmap: spread replicas across hosts with default crush map
+
+    This is more often the case than not, and we don't have a good way to
+    magically know what size of cluster the user will be creating.  Better to
+    err on the side of doing the right thing for more people.
+
+    Fixes: #3785
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 7ea5d84fa3d0ed3db61eea7eb9fa8dbee53244b6)
+
+commit d882d053927c319274be38a247f2beabb4e06b64
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jan 9 19:17:23 2013 -0800
+
+    ReplicatedPG: fix snapdir trimming
+
+    The previous logic was both complicated and not correct.  Consequently,
+    we have been tending to drop snapcollection links in some cases.  This
+    has resulted in clones incorrectly not being trimmed.  This patch
+    replaces the logic with something less efficient but hopefully a bit
+    clearer.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0f42c37359d976d1fe90f2d3b877b9b0268adc0b)
diff --git a/doc/changelog/v0.56.3.txt b/doc/changelog/v0.56.3.txt
new file mode 100644
index 0000000..c87675a
--- /dev/null
+++ b/doc/changelog/v0.56.3.txt
@@ -0,0 +1,562 @@
+commit 6eb7e15a4783b122e9b0c85ea9ba064145958aa5
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed Feb 13 10:10:20 2013 -0800
+
+    v0.56.3
+
+commit f5eb845a0f7a2c28d3a88a37479bcb34f882f40c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Feb 8 13:14:49 2013 -0800
+
+    rgw: change json formatting for swift list container
+    
+    Fixes: #4048
+    There is some difference in the way swift formats the
+    xml output and the json output for list container. In
+    xml the entity is named 'name' and in json it is named
+    'subdir'.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 3e4d79fe42dfc3ca70dc4d5d2aff5223f62eb34b)
+
+commit f21543f0d88f7bacb69cef3712b0ce087f386e93
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 11 17:08:55 2013 -0800
+
+    librbd: unprotect any non-unprotected snapshot
+    
+    Include snapshots in the UNPROTECTING state as well, which can occur
+    after an unprotect is interrupted.
+    
+    Fixes: #4100
+    Backport: bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit fe283813b44a7c45def6768ea0788a3a0635957e)
+
+commit 65969f8fbef02ee39f6c2365fffbcd3f633f4b37
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 8 21:36:13 2013 -0800
+
+    java: make CephMountTest use user.* xattr names
+    
+    Changes to the xattr code in Ceph require
+    a few tweaks to existing test cases.
+    Specifically, there is now a ceph.file.layout
+    xattr by default and user defined xattrs
+    are prepended with "user."
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joe Buck <jbbuck at gmail.com>
+    Reviewed-by: Noah Watkins <noahwatkins at gmail.com>
+
+commit 14fddc3ce85d3695aad9d3597f8f50dba5960a86
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 8 09:59:25 2013 -0800
+
+    mon: fix typo in C_Stats
+    
+    Broken by previous commit.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3cf3710be0b4cccc8de152a97be50d983c35116d)
+
+commit 0453140d187016a61950a8836da57f54d2c34602
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 7 23:13:11 2013 -0800
+
+    mon: retry PGStats message on EAGAIN
+    
+    If we get EAGAIN from a paxos restart/election/whatever, we should
+    restart the message instead of just blindly acking it.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit 4837063d447afb45554f55bb6fde1c97559acd4b)
+
+commit e68fcec78286363935cf731015108b9ea36b50a6
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 7 22:06:14 2013 -0800
+
+    mon: handle -EAGAIN in completion contexts
+    
+    We can get ECANCELED, EAGAIN, or success out of the completion contexts,
+    but in the EAGAIN case (meaning there was an election) we were sending
+    a success to the client.  This resulted in client hangs and all-around
+    confusion when the monitor cluster was thrashing.
+    
+    Backport: bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit 17827769f1fe6d7c4838253fcec3b3a4ad288f41)
+
+commit 20ec490555728251444833520a40b20dc8015216
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 14:11:09 2013 -0800
+
+    osd: only share maps on hb connection of OSD_HBMSGS feature is set
+    
+    Back in 1bc419a7affb056540ba8f9b332b6ff9380b37af we started sharing maps
+    with dead osds via the heartbeat connection, but old code will crash on an
+    unexpected message.  Only do this if the OSD_HBMSGS feature is present.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 302b26ff70ee5539da3dcb2e5614e2b7e83b9dcd)
+
+commit cbf63b633e7a59456f503af487fd4ad2607bbd76
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 14:10:51 2013 -0800
+
+    osd: tolerate unexpected messages on the heartbeat interface
+    
+    We should note but not crash on unexpected messages.  Announce this awesome
+    new "capability" via a feature bit.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit afda30aeaae0a65f83c6886658354ad2b57c4c43)
+    
+    Conflicts:
+    
+    	src/include/ceph_features.h
+
+commit 102a519632f1b7a0fede9a3fbd4a5c1df0e732a5
+Merge: 2c6afa0 2ebf4d0
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 13:39:52 2013 -0800
+
+    Merge remote-tracking branch 'gh/wip-bobtail-osd-msgr' into bobtail
+
+commit 2c6afa058e8b1738c1400392320482945834de86
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 30 11:32:23 2013 -0800
+
+    test_libcephfs: fix xattr test
+    
+    Ignore the ceph.*.layout xattrs.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b0d4dd21c7be86eb47728a4702a3c67ca44424ac)
+
+commit f11beb954976f66bfae75e847937f84958ebeaf3
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 7 22:51:29 2013 -0800
+
+    radosgw-admin: fix cli test
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1b05b0edbac09d1d7cf0da2e536829df05e48573)
+
+commit ec1085e534eb39d999775bebdcdb997f893a04ae
+Merge: 66d7758 62ed62f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 7 23:25:30 2013 -0800
+
+    Merge remote-tracking branch 'gh/wip-bobtail-vxattrs' into bobtail
+
+commit 66d775858004d1d4e8a138b8d33a3799e03ce26e
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 4 09:14:39 2013 -0800
+
+    mon: enforce reweight be between 0..1
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit 4e29c95d6f61daa838888840cef0cceedc0fcfdd)
+
+commit 8bab3a1c3d0d2f619ddf885bb9050ad9a1c43517
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Feb 7 10:38:00 2013 -0800
+
+    PG: dirty_info on handle_activate_map
+    
+    We need to make sure the pg epoch is persisted during
+    activate_map.
+    
+    Backport: bobtail
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit dbce1d0dc919e221523bd44e1d0834711da1577d)
+
+commit dffa386bc13370c0ef56acf740b5200b2054980f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 7 10:21:49 2013 -0800
+
+    osd: flush peering queue (consume maps) prior to boot
+    
+    If the osd itself is behind on many maps during boot, it will get more and
+    (as part of that) flush the peering wq to ensure the pgs consume them.
+    However, it is possible for OSD to have latest/recnet maps, but pgs to be
+    behind, and to jump directly to boot and join.  The OSD is then laggy and
+    unresponsive because the peering wq is way behind.
+    
+    To avoid this, call consume_map() (kick the peering wq) at the end of
+    init and flush it to ensure we are *internally* all caught up before we
+    consider joining the cluster.
+    
+    I'm pretty sure this is the root cause of #3905 and possibly #3995.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit af95d934b039d65d3667fc022e2ecaebba107b01)
+
+commit 47c9f46aac4afac37fb6ec72f0482e61f5e0d798
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Feb 6 17:10:00 2013 -0800
+
+    rgw: a tool to fix clobbered bucket info in user's bucket list
+    
+    This fixes bad entries in user's bucket list that may have occured
+    due to issue #4039. Syntax:
+    
+     $ radosgw-admin user check --uid=<uid> [--fix]
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 9cb6c33f0e2281b66cc690a28e08459f2e62ca13)
+    
+    Conflicts:
+    	src/rgw/rgw_admin.cc
+
+commit 6c8d63819fde1b6854f8fc03351465b420ff1bdc
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Feb 6 16:43:48 2013 -0800
+
+    rgw: bucket recreation should not clobber bucket info
+    
+    Fixes: #4039
+    User's list of buckets is getting modified even if bucket already
+    exists. This fix removes the newly created directory object, and
+    makes sure that user info's data points at the correct bucket.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 9d006ec40ced9d97b590ee07ca9171f0c9bec6e9)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
+    	src/rgw/rgw_rados.cc
+
+commit cc167914ac9603f87083c63f2cbc8dac9441329f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Feb 5 14:50:54 2013 -0800
+
+    rgw: a tool to fix buckets with leaked multipart references
+    
+    Checks specified bucket for the #4011 symptoms, optionally fix
+    the issue.
+    
+    sytax:
+      radosgw-admin bucket check --bucket=<bucket> [--fix]
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 2d8faf8e5f15e833e6b556b0f3c4ac92e4a4151e)
+    
+    Conflicts:
+    	src/rgw/rgw_admin.cc
+    	src/rgw/rgw_rados.h
+
+commit 4d6964fc7ddd23806e225c95bcb90ef93e4d23a1
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Feb 5 13:54:11 2013 -0800
+
+    rgw: radosgw-admin object unlink
+    
+    Add a radosgw-admin option to remove object from bucket index
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 16235a7acb9543d60470170bb2a09956364626cd)
+    
+    Conflicts:
+    	src/rgw/rgw_admin.cc
+    	src/rgw/rgw_rados.h
+    	src/test/cli/radosgw-admin/help.t
+
+commit 2ebf4d065af3dc2e581a25b921071af3efb57f8a
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 09:30:00 2013 -0800
+
+    osd: kill unused addr-based send_map()
+    
+    Not used, old API, bad.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e359a862199c8a94cb238f7271ba1b0edcc0863c)
+
+commit bac5b144b27f32da306161ae7018ccc337704121
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 09:29:37 2013 -0800
+
+    osd: share incoming maps via Connection*, not addrs
+    
+    Kill a set of parallel methods that are using the old addr/inst-based
+    msgr APIs, and instead use Connection handles.  This is much safer and gets
+    us closer to killing the old msgr API.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5e2fab54a4fdf2f59e2b635cbddef8a5909acb7c)
+
+commit 9ca3a165ded62313ba153d7bab89dadf3f73999f
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 09:27:00 2013 -0800
+
+    osd: pass new maps to dead osds via existing Connection
+    
+    Previously we were sending these maps to dead osds via their old addrs
+    using a new outgoing connection and setting the flags so that the msgr
+    would clean up.  That mechanism is possibly buggy and fragile, and we can
+    avoid it entirely if we just reuse the existing heartbeat Connection.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1bc419a7affb056540ba8f9b332b6ff9380b37af)
+
+commit 4cb28b6ed5a702fdac99b8ec71233ef7f877a7a2
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 09:25:28 2013 -0800
+
+    osd: requeue osdmaps on heartbeat connections for cluster connection
+    
+    If we receive an OSDMap on the cluster connection, requeue it for the
+    cluster messenger, and process it there where we normally do.  This avoids
+    any concerns about locking and ordering rules.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 76705ace2e9767939aa9acf5d9257c800f838854)
+
+commit e4f7ff8c288eac8a8b57382f11a4b6f93682315a
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 09:23:23 2013 -0800
+
+    msgr: add get_loopback_connection() method
+    
+    Return the Connection* for ourselves, so we can queue messages for
+    ourselves.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a7059eb3f3922cf08c1e5bb5958acc2d45952482)
+
+commit 62ed62f5e2fb068cee38612d7974526aa1b3c759
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 11:33:04 2013 -0800
+
+    qa: add layout_vxattrs.sh test script
+    
+    Test virtual xattrs for file and directory layouts.
+    
+    TODO: create a data pool, add it to the fs, and make sure we can use it.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 61fbe27a52d12ecd98ddeb5fc0965c4f8ee7841a)
+
+commit d386622c3961a3b57eea42fdb82611cd2e904f4d
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 10:11:18 2013 -0800
+
+    mds: allow dir layout/policy to be removed via removexattr on ceph.dir.layout
+    
+    This lets a user remove a policy that was previously set on a dir.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit db31a1f9f27416e4d531fda716e32d42a275e84f)
+
+commit 6af5da7ae2c4ef95c16c6460770b6244d1aa1a6e
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 10:09:39 2013 -0800
+
+    mds: handle ceph.*.layout.* setxattr
+    
+    Allow individual fields of file or dir layouts to be set via setxattr.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ebebf72f0993d028e795c78a986e1aee542ca5e0)
+
+commit c0af056eb9bdb62cfd8a6f9054a3a3c78c8e7447
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 4 22:03:32 2013 -0800
+
+    mdsmap: backported is_data_pool()
+    
+    This roughly corresponds to mainline commit 99d9e1d.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 0407af4641ea19697f8feb0f48a92cde8dd4fbe4
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 10:04:05 2013 -0800
+
+    mds: fix client view of dir layout when layout is removed
+    
+    We weren't handling the case where the projected node has NULL for the
+    layout properly.  Fixes the client's view when we remove the dir layout.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 09f28541e374ffac198e4d48082b064aae93cb2c)
+
+commit 8ce834d3f50b00fdd59cd237f3fb5fef1d57e1dd
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 10:04:39 2013 -0800
+
+    client: note presence of dir layout in inode operator<<
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 84751489ca208964e617516e04556722008ddf67)
+
+commit 99824b93cec93daaa0d536f031eb3b6180f94e3b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 19 09:05:59 2013 -0800
+
+    client: list only aggregate xattr, but allow setting subfield xattrs
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ba32ea9454d36072ec5ea3e6483dc3daf9199903)
+
+commit 809cff488ea1ffa299edd678ba6260993771bde3
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 22:26:00 2013 -0800
+
+    client: implement ceph.file.* and ceph.dir.* vxattrs
+    
+    Display ceph.file.* vxattrs on any regular file, and ceph.dir.* vxattrs
+    on any directory that has a policy set.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3f82912a891536dd7e930f98e28d9a8c18fab756)
+
+commit 13babca354d9fbe255de8bae9608a0c158bf6c40
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 17:21:37 2013 -0800
+
+    client: move xattr namespace enforcement into internal method
+    
+    This captures libcephfs users now too.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit febb96509559084357bfaabf7e4d28e494c274aa)
+
+commit 65ab51740175254ba3ee050f0fd97332dffe2eb7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 18 17:20:22 2013 -0800
+
+    client: allow ceph.* xattrs
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ad7ebad70bf810fde45067f78f316f130a243b9c)
+
+commit 6f3c1cd2cc07d951dfc23e523b9c6400b7c77c72
+Author: caleb miles <caselim at gmail.com>
+Date:   Mon Jan 14 12:16:12 2013 -0500
+
+    rgw_rest: Make fallback uri configurable.
+    
+    Some HTTP servers, notabily lighttp, do not set SCRIPT_URI, make the fallback
+    string configurable.
+    
+    Signed-off-by: caleb miles <caleb.miles at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b3a2e7e955547a863d29566aab62bcc480e27a65)
+    
+    Conflicts:
+    	src/rgw/rgw_rest.cc
+
+commit f57d1b4c8cc4d08c6147423d7881be55ed2e88d9
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Feb 1 10:56:11 2013 -0800
+
+    rgw: fix setting of NULL to string
+    
+    Fixes: #3777
+    s->env->get() returns char * and not string and can return NULL.
+    Also, remove some old unused code.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 9019fbbe8f84f530b6a8700dfe99dfeb03e0ed3d)
+
+commit 55687240b2de20185524de07e67f42c3b1ae6592
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jan 11 10:44:04 2013 -0800
+
+    OSD: check for empty command in do_command
+    
+    Fixes: #3878
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 8cf79f252a1bcea5713065390180a36f31d66dfd)
+
+commit c3468f76a5e68a6426f03e508d8ecf26950fca2a
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Jan 30 18:52:24 2013 +0100
+
+    PGMap: fix -Wsign-compare warning
+    
+    Fix -Wsign-compare compiler warning:
+    
+    mon/PGMap.cc: In member function 'void PGMap::apply_incremental
+     (CephContext*, const PGMap::Incremental&)':
+    mon/PGMap.cc:247:30: warning: comparison between signed and
+     unsigned integer expressions [-Wsign-compare]
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b571f8ee2d22a3894120204bc5f119ff37e1de53)
+
+commit 5a6b9af90f00d08ef97b34ee0b5abc7b0b63e72b
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jan 28 19:46:33 2013 -0800
+
+    mon: smooth pg stat rates over last N pgmaps
+    
+    This smooths the recovery and throughput stats over the last N pgmaps,
+    defaulting to 2.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a7d15afb529615db56bae038b18b66e60d827a96)
+
+commit 7fd7a5eed19d5ab508d5fe11ff8734bc2bc8c565
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 19:51:40 2013 -0800
+
+    mon/PGMap: report IO rates
+    
+    This does not appear to be very accurate; probably the stat values we're
+    displaying are not being calculated correctly.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3f6837e022176ec4b530219043cf12e009d1ed6e)
+
+commit 7f149cf6730280f0e633d9f5ef3f0f95c5a5e430
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 19:51:14 2013 -0800
+
+    mon/PGMap: report recovery rates
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 208b02a748d97378f312beaa5110d8630c853ced)
+
+commit 8d2d396c6d02bff72aca53920e9ac93fe91428d3
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 19:50:45 2013 -0800
+
+    mon/PGMap: include timestamp
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 76e9fe5f06411eb0e96753dcd708dd6e43ab2c02)
+
+commit 8ab77bd4b510149f4df6b3134de0ef59272cec71
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 19:49:16 2013 -0800
+
+    osd: track recovery ops in stats
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a2495f658c6d17f56ea0a2ab1043299a59a7115b)
+
+commit 8fd8534b4b808292a4b7c6b9f2f866c431cf9645
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 19:06:52 2013 -0800
+
+    osd_types: add recovery counts to object_sum_stats_t
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4aea19ee60fbe1106bdd71de2d172aa2941e8aab)
diff --git a/doc/changelog/v0.56.4.txt b/doc/changelog/v0.56.4.txt
new file mode 100644
index 0000000..f48fd83
--- /dev/null
+++ b/doc/changelog/v0.56.4.txt
@@ -0,0 +1,1126 @@
+commit 63b0f854d1cef490624de5d6cf9039735c7de5ca
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Mon Mar 25 11:02:31 2013 -0700
+
+    v0.56.4
+
+commit 90ab120a3c08f30654207c9c67fb0a4ff1476aff
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Mar 25 09:50:33 2013 -0700
+
+    rgw: bucket index ops on system buckets shouldn't do anything
+    
+    Fixes: #4508
+    Backport: bobtail
+    On certain bucket index operations we didn't check whether
+    the bucket was a system bucket, which caused the operations
+    to fail. This triggered an error message on bucket removal
+    operations.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 70e0ee8ba955322832f0c366537ddf7a0288761e)
+
+commit b8657fa08d0fe176c71a60c1654c53c3156a9c53
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 25 15:02:50 2013 -0800
+
+    systest: restrict list error acceptance
+    
+    Only ignore errors after the midway point if the midway_sem_post is
+    defined.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 5b24a68b6e7d57bac688021b822fb2f73494c3e9)
+
+commit 5af3d64f62b30cbaac13ccc7c23fc884ee1b7ae3
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 25 14:55:34 2013 -0800
+
+    systest: fix race with pool deletion
+    
+    The second test have pool deletion and object listing wait on the same
+    semaphore to connect and start. This led to errors sometimes when the
+    pool was deleted before it could be opened by the listing process. Add
+    another semaphore so the pool deletion happens only after the listing
+    has begun.
+    
+    Fixes: #4147
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit b0271e390564119e998e18189282252d54f75eb6)
+
+commit 3569489b541ac0643520d20b08c788c26dfaff7f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Mar 19 14:26:16 2013 -0700
+
+    os/FileJournal: fix aio self-throttling deadlock
+    
+    This block of code tries to limit the number of aios in flight by waiting
+    for the amount of data to be written to grow relative to a function of the
+    number of aios.  Strictly speaking, the condition we are waiting for is a
+    function of both aio_num and the write queue, but we are only woken by
+    changes in aio_num, and were (in rare cases) waiting when aio_num == 0 and
+    there was no possibility of being woken.
+    
+    Fix this by verifying that aio_num > 0, and restructuring the loop to
+    recheck that condition on each wakeup.
+    
+    Fixes: #4079
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit e5940da9a534821d0d8f872c13f9ac26fb05a0f5)
+
+commit 664ffa7d2178e486b00fa0706067f19b1bb9ab82
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 22 13:25:49 2013 -0700
+
+    common/MemoryModel: remove logging to /tmp/memlog
+    
+    This was a hack for dev purposes ages ago; remove it.  The predictable
+    filename is a security issue.
+    
+    CVE-2013-1882
+    
+    Reported-by: Michael Scherer <misc at zarb.org>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit c524e2e01da41ab5b6362c117939ea1efbd98095)
+
+commit 901fa435bb4be29b72cec39e5ff77570d13cbc6c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 22 13:25:43 2013 -0700
+
+    init-ceph: clean up temp ceph.conf filename on exit
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 6a7ad2eac1db6abca3d7edb23ca9b80751400a23)
+
+commit 951f7e562afb4ae91b8d037ef793a96779461e96
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 22 13:25:33 2013 -0700
+
+    init-ceph: push temp conf file to a unique location on remote host
+    
+    The predictable file name is a security problem.
+    
+    CVE-2013-1882
+    
+    Reported-by: Michael Scherer <misc at zarb.org>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 051734522fea92878dd8139f28ec4e6b01371ede)
+
+commit dd670afccfd3ae58c03ea3b4c213dd8db22f618e
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 22 13:25:23 2013 -0700
+
+    mkcephfs: make remote temp directory name unique
+    
+    The predictable file name is a security problem.
+    
+    CVE-2013-1882
+    
+    Reported-by: Michael Scherer <misc at zarb.org>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit f463ef78d77b11b5ad78b31e9a3a88d0a6e62bca)
+
+commit 1cd51eb63a91fa0aa395c41572cfee4d53fbc7f5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Mar 22 13:51:14 2013 -0700
+
+    PG::GetMissing: need to check need_up_thru in MLogRec handler
+    
+    Backport: bobtail
+    Fixes: #4534
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4fe4deafbe1758a6b3570048aca57485bd562440)
+
+commit d866814285667c7f9cd9205dca6cf95f3634c5fc
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Mar 22 13:48:49 2013 -0700
+
+    PG,osd_types: improve check_new_interval debugging
+    
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d611eba9caf45f2d977c627b123462a073f523a4)
+
+commit fc3406f395103737e5784611e2b38fd1c4f26369
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Mar 5 16:06:20 2013 -0800
+
+    FileStore: fix reversed collection_empty return value
+    
+    Backport: bobtail
+    Fixes: #4380
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 7a434d10da0f77e1b329de0b06b6645cd73cc81b)
+    
+    Conflicts:
+    	src/os/FileStore.cc
+
+commit 9f7c6ad395653b1039ea957cfaa7689699f510e7
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Feb 11 12:52:07 2013 -0800
+
+    FileStore: set replay guard on create_collection
+    
+    This should prevent sequences like:
+    
+    rmcoll a
+    mkcoll a
+    touch a foo
+    <crash>
+    
+    from causing trouble by preventing the rmcoll
+    and mkcoll from being replayed.
+    
+    Fixes: 4064
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 411770c45734c9827745ddc4018d86c14f2858a6)
+
+commit 9932c9f0a0503f1902549a3c39e5d51488fff3ef
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Feb 11 12:24:14 2013 -0800
+
+    FileStore: _split_collection should not create the collection
+    
+    This will simplify adding a replay guard to create_collection.
+    
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit b184ff581a08c9e6ce5b858f06ccbe9d0e2a170b)
+
+commit 7e7ea8266ee45d96863e1edc5a567dcc2977680c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 22 15:15:27 2013 -0800
+
+    client: use 4MB f_bsize and f_frsize for statfs
+    
+    Old stat(1) reports:
+    
+      Block size: 1048576    Fundamental block size: 1048576
+    
+    and the df(1) arithmetic works out.  New stat(1) reports:
+    
+      Block size: 1048576    Fundamental block size: 4096
+    
+    which is what we are shoving into statvfs, but we have the b_size and
+    fr_size arithmetic swapped.  However, doing the *correct* reporting would
+    then break the old stat by making both sizes appear to be 4KB (or
+    whatever).
+    
+    Sidestep the issue by making *both* values 4MB.. which is both large enough
+    to report large FS sizes, and also the default stripe size and thus a
+    "reasonable" value to report for a block size.
+    
+    Perhaps in the future, when we no longer care about old userland, we can
+    report the page size for f_bsize, which is probably the "most correct"
+    thing to do.
+    
+    Fixes: #3794.  See also #3793.
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 7c94083643891c9d66a117352f312b268bdb1135)
+
+commit 66dca7730006dffbce12e6b27016ea5469b7691b
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 18 17:39:46 2013 -0800
+
+    os/FileStore: check replay guard on src for collection rename
+    
+    This avoids a problematic sequence like:
+    
+         - rename A/ -> B/
+         - remove B/1...100
+         - destroy B/
+         - create A/
+         - write A/101...
+         <crash>
+         - replay A/ -> B/
+         - remove B/1...100  (fails but tolerated)
+         - destroy B/        (fails with ENOTEMPTY)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 5fc83c8d9887d2a916af11436ccc94fcbfe59b7a)
+
+commit ea570591b0d9dda102bece0f4cc7d263c3e2a3b0
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Feb 22 14:12:28 2013 -0800
+
+    PG::proc_replica_log: oinfo.last_complete must be *before* first entry in omissing
+    
+    Fixes: #4189
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 2dae6a68ee85a20220ee940dbe33a2144d43457b)
+
+commit aa38d87c6237ccfb8b3b03bc7c28dcadb927237b
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 21 17:55:21 2013 -0800
+
+    osd/PG: fix typo, missing -> omissing
+    
+    From ce7ffc34408bf32c66dc07e6f42d54b7ec489d41.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dc181224abf6fb8fc583730ae3d90acdf0b80f39)
+
+commit ac914834ba4fb0e4770f63c60713be7a48aa3fa1
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Feb 21 15:31:36 2013 -0800
+
+    PG::proc_replica_log: adjust oinfo.last_complete based on omissing
+    
+    Otherwise, search_for_missing may neglect to check the missing
+    set for some objects assuming that if the need version is
+    prior to last_complete, the replica must have it.
+    
+    Fixes: #4994
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit ce7ffc34408bf32c66dc07e6f42d54b7ec489d41)
+
+commit 7f39704b0903fb11e3f1e102599bf0c540f93623
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 9 00:05:33 2013 -0800
+
+    osd: fix load_pgs collection handling
+    
+    On a _TEMP pg, is_pg() would succeed, which meant we weren't actually
+    hitting the cleanup checks.  Instead, restructure this loop as positive
+    checks and handle each type of collection we understand.
+    
+    This fixes _TEMP cleanup.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit b19b6dced85617d594c15631571202aab2f94ae8)
+
+commit 0a09be99f3e9d2b68a052ff63ea858a7c8e5626c
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 9 00:04:29 2013 -0800
+
+    osd: fix load_pgs handling of pg dirs without a head
+    
+    If there is a pgid that passes coll_t::is_pg() but there is no head, we
+    will populate the pgs map but then fail later when we try to do
+    read_state.  This is a side-effect of 55f8579.
+    
+    Take explicit note of _head collections we see, and then warn when we
+    find stray snap collections.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 1f80a0b576c0af1931f743ad988b6293cbf2d6d9)
+
+commit 2dc25dfd47de8d3602bdb3699c82b8b118b0fb28
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Feb 7 13:34:47 2013 -0800
+
+    OSD::load_pgs: first scan colls before initing PGs
+    
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 073f58ede2e473af91f76d01679631c169274af7)
+
+commit 2fd8db29ccf56fd5473826f20e351edfe200419d
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue Jan 8 19:24:13 2013 -0800
+
+    osd: Add digest of omap for deep-scrub
+    
+    Add ScrubMap encode/decode v4 message with omap digest
+    Compute digest of header and key/value.  Use bufferlist
+    to reflect structure and compute as we go, clearing
+    bufferlist to reduce memory usage.
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 509a93e89f04d7e9393090563cf7be8e0ea53891)
+
+commit ee59f517ccc195e591e0b1b6ddf6d1d054c4e2fd
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Mar 15 15:13:46 2013 -0700
+
+    OSD: split temp collection as well
+    
+    Otherwise, when we eventually remove the temp collection, there might be
+    objects in the temp collection which were independently pulled into the child
+    pg collection.  Thus, removing the old stale parent link from its temp
+    collection also blasts the omap entries and snap mappings for the real child
+    object.
+    
+    Backport: bobtail
+    Fixes: #4452
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f8d66e87a5c155b027cc6249006b83b4ac9b6c9b)
+
+commit 7ec68e2d45b431a3a77458939622e6ea1e396d0e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Mar 14 19:59:36 2013 -0700
+
+    PG: ignore non MISSING pg query in ReplicaActive
+    
+    1) Replica sends notify
+    2) Prior to processing notify, primary queues query to replica
+    3) Primary processes notify and activates sending MOSDPGLog
+    to replica.
+    4) Primary does do_notifies at end of process_peering_events
+    and sends to Query.
+    5) Replica sees MOSDPGLog and activates
+    6) Replica sees Query and asserts.
+    
+    In the above case, the Replica should simply ignore the old
+    Query.
+    
+    Fixes: #4050
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8222cbc8f35c359a35f8381ad90ff0eed5615dac)
+
+commit b279b148b38c755d2dcca6524d7b8a95daf123a0
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Mar 13 16:04:23 2013 -0700
+
+    FileJournal: queue_pos \in [get_top(), header.max_size)
+    
+    If queue_pos == header.max_size when we create the entry
+    header magic, the entry will be rejected at get_top() on
+    replay.
+    
+    Fixes: #4436
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit de8edb732e3a5ce4471670e43cfe6357ae6a2758)
+
+commit 56e0a129b0d9ad463f4300999ed2c15173cbe603
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Mar 14 18:52:02 2013 -0700
+
+    OSD: expand_pg_num after pg removes
+    
+    Otherwise:
+    1) expand_pg_num removes a splitting pg entry
+    2) peering thread grabs pg lock and starts split
+    3) OSD::consume_map grabs pg lock and starts removal
+    
+    At step 2), we run afoul of the assert(is_splitting)
+    check in split_pgs.  This way, the would be splitting
+    pg is marked as removed prior to the splitting state
+    being updated.
+    
+    Backport: bobtail
+    Fixes: #4449
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f1b031b3cf195cf6df3d3c47c7d606fba63ed4c4)
+
+commit d6e678a62950ccc16d010a76500705e176ba9c73
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 11 06:23:54 2013 -0800
+
+    osd: update snap collections for sub_op_modify log records conditionaly
+    
+    The only remaining caller is sub_op_modify().  If we do have a non-empty
+    op transaction, we want to do this update, regardless of what we think
+    last_backfill is (our notion may be not completely in sync with the
+    primary).  In particular, our last_backfill may be the same object but
+    a different snapid, but the primary disagrees and is pushing an op
+    transaction through.
+    
+    Instead, update the collections if we have a non-empty transaction.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 31e911b63d326bdd06981ec4029ad71b7479ed70)
+
+commit 51c2c4d7ccb25617967689d7e531eb145ee7011d
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Feb 10 17:02:45 2013 -0800
+
+    osd: include snaps in pg_log_entry_t::dump()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 715d8717a0e8a08fbe97a3e7d3ffd33aa9529d90)
+
+commit f0bf68ff500f7337103aef2a9d6d10c3597e410f
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Feb 10 16:59:48 2013 -0800
+
+    osd: unconditionally encode snaps buffer
+    
+    Previously we would only encode the updated snaps vector for CLONE ops.
+    This doesn't work for MODIFY ops generated by the snap trimmer, which
+    may also adjust the clone collections.  It is also possible that other
+    operations may need to populate this field in the future (e.g.,
+    LOST_REVERT may, although it currently does not).
+    
+    Fixes: #4071, and possibly #4051.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 54b6dd924fea3af982f3d729150b6449f318daf2)
+
+commit aa74fabd90b776e9938f3d59ea5ed04bd4027dbb
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Feb 10 10:57:12 2013 -0800
+
+    osd: improve debug output on snap collections
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 8b05492ca5f1479589bb19c1ce058b0d0988b74f)
+
+commit a30903c6adaa023587d3147179d6038ad37ca520
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Mar 7 12:53:51 2013 -0800
+
+    PG: check_recovery_sources must happen even if not active
+    
+    missing_loc/missing_loc_sources also must be cleaned up
+    if a peer goes down during peering:
+    
+    1) pg is in GetInfo, acting is [3,1]
+    2) we find object A on osd [0] in GetInfo
+    3) 0 goes down, no new peering interval since it is neither up nor
+    acting, but peer_missing[0] is removed.
+    4) pg goes active and try to pull A from 0 since missing_loc did not get
+    cleaned up.
+    
+    Backport: bobtail
+    Fixes: #4371
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit de22b186c497ce151217aecf17a8d35cdbf549bb)
+
+commit 19f6df28337307ce6d8617524f88f222c0ffcab3
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Mar 5 15:49:26 2013 -0800
+
+    HashIndex: _collection_list_partial must tolerate NULL next
+    
+    Backport: bobtail
+    Fixes: #4379
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit ce4432adc67dc2fc06dd21ea08e59d179496bcc6)
+
+commit 1b5c1564bad3574db257cb17d48190958d870f51
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Mar 5 14:35:39 2013 -0800
+
+    OSD: lock not needed in ~DeletingState()
+    
+    No further refs to the object can remain at this point.
+    Furthermore, the callbacks might lock mutexes of their
+    own.
+    
+    Backport: bobtail
+    Fixes: #4378
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit e4bf1bcab159d7c5b720f5da01877c0f67c16d16)
+
+commit 50d2d4a77f339d489703c1125dc5c1159d08ca8a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Mar 10 12:50:01 2013 -0700
+
+    ReplicatedPG: don't leak reservation on removal
+    
+    Fixes: 4431
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 32bf131e0141faf407b5ff993f75f97516b27c12)
+    
+    Conflicts:
+    
+    	src/osd/ReplicatedPG.cc
+
+commit c6b7c4be3fc44d065c29ea76b744b39272c2ba05
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Mar 12 12:56:01 2013 -0700
+
+    rgw: set up curl with CURL_NOSIGNAL
+    
+    Fixes: #4425
+    Backport: bobtail
+    Apparently, libcurl needs that in order to be thread safe. Side
+    effect is that if libcurl is not compiled with c-ares support,
+    domain name lookups are not going to time out.
+    Issue affected keystone.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 88725316ddcfa02ff110e659f7a8131dc1ea2cfc)
+
+commit 8c16a376a9cbfd6812824fb71e2cc9935e14e667
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 8 08:56:44 2013 -0800
+
+    osd: mark down connections from old peers
+    
+    Close out any connection with an old peer.  This avoids a race like:
+    
+    - peer marked down
+    - we get map, mark down the con
+    - they reconnect and try to send us some stuff
+    - we share our map to tell them they are old and dead, but leave the con
+      open
+    ...
+    - peer marks itself up a few times, eventually reuses the same port
+    - sends messages on their fresh con
+    - we discard because of our old con
+    
+    This could cause a tight reconnect loop, but it is better than wrong
+    behavior.
+    
+    Other possible fixes:
+     - make addr nonce truly unique (augment pid in nonce)
+     - make a smarter 'disposable' msgr state (bleh)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 881e9d850c6762290f8be24da9e74b9dc112f1c9)
+
+commit 1affc8b6e8cb82510aed524f90a6165c6edf7513
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 8 08:53:40 2013 -0800
+
+    osd/PG: rename require_same_or_newer_map -> is_same_or_newer_map
+    
+    This avoids confusion with the OSD method of the same name, and better
+    matches what the function tests (and does not do).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ba7e815a18cad110525f228db1b3fe39e011409e)
+    
+    Conflicts:
+    
+    	src/osd/ReplicatedPG.cc
+
+commit 7ca55d36c4007be5880102fa1ed314d3d66e9d87
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 11 16:25:16 2013 -0700
+
+    log: drop default 'log max recent' from 100k -> 10k
+    
+    Use less memory.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c021c5ccf0c063cccd7314964420405cea6406de)
+
+commit 33ac786ddc14d0904f4835cbf684a51f4815d45b
+Author: Jan Harkes <jaharkes at cs.cmu.edu>
+Date:   Fri Mar 8 12:45:57 2013 -0500
+
+    Fix radosgw actually reloading after rotating logs.
+    
+    The --signal argument to Debian's start-stop-daemon doesn't
+    make it send a signal, but defines which signal should be send
+    when --stop is specified.
+    
+    Signed-off-by: Jan Harkes <jaharkes at cs.cmu.edu>
+    (cherry picked from commit 44f1cc5bc42f9bb6d5a386037408d2de17dc5413)
+
+commit 6838b8db9a3d4ceaf121a261e2ded4af9bfeaeb9
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 6 17:42:03 2013 -0800
+
+    common: reduce default in-memory logs for non-daemons
+    
+    The default of 100000 can result in hundreds of MBs of extra memory
+    used. This was most obvious when using librbd with caching enabled,
+    since there was a dout(0) accidentally left in the ObjectCacher.
+    
+    refs: #4352
+    backport: bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 7c208d2f8e3f28f4055a4ae51eceae892dcef1dc)
+
+commit f80f64cf024bd7519d5a1fb2a5698db97a003ce8
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 22 17:01:53 2013 -0800
+
+    osd: allow (some) log trim when degraded, but not during recovery
+    
+    We allow some trim during degraded, although we keep more entries around to
+    improve our chances of a restarting OSD of doing log-based recovery.
+    
+    Still disallow during recovery...
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 6d89b34e5608c71b49ef33ab58340e90bd8da6e4)
+
+commit e502a65da1779564059e74c09ab87aca1d901bd2
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 25 15:33:35 2013 -0800
+
+    osd: restructure calc_trim
+    
+    No functional change, except that we log more debug, yay!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 86df164d04f6e31a0f20bbb94dbce0599c0e8b3d)
+
+commit 3a3123033d7d9e1574be3fb18c807eeb0f4678eb
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 22 16:48:02 2013 -0800
+
+    osd: allow pg log trim during (non-classic) scrub
+    
+    Chunky (and deep) scrub do not care about PG log trimming.  Classic scrub
+    still does.
+    
+    Deep scrub can take a long time, so not trimming the log during that period
+    may eat lots of RAM; avoid that!
+    
+    Might fix: #4179
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0ba8db6b664205348d5499937759916eac0997bf)
+
+commit cde0f224dac21b2e17e06d396ac52e18034a4262
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 28 12:46:00 2013 -0800
+
+    msgr: drop messages on cons with CLOSED Pipes
+    
+    Back in commit 6339c5d43974f4b495f15d199e01a141e74235f5, we tried to make
+    this deal with a race between a faulting pipe and new messages being
+    queued.  The sequence is
+    
+    - fault starts on pipe
+    - fault drops pipe_lock to unregister the pipe
+    - user (objecter) queues new message on the con
+    - submit_message reopens a Pipe (due to this bug)
+    - the message managed to make it out over the wire
+    - fault finishes faulting, calls ms_reset
+    - user (objecter) closes the con
+    - user (objecter) resends everything
+    
+    It appears as though the previous patch *meant* to drop *m on the floor in
+    this case, which is what this patch does.  And that fixes the crash I am
+    hitting; see #4271.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 0f42eddef5da6c1babe9ed51ceaa3212a42c2ec4)
+
+commit 2fa2546c90e7a6eab9a3de7ab4e4271f8b25bad6
+Author: Concubidated <tyler.brekke at inktank.com>
+Date:   Fri Mar 8 13:44:39 2013 -0800
+
+    Fix output of 'ceph osd tree --format=json'
+    
+    Signed-off-by: Tyler Brekke <tyler.brekke at inktank.com>
+    (cherry picked from commit 9bcba944c6586ad5f007c0a30e69c6b5a886510b)
+
+commit b70e2c270b9eb3fce673b7e51b527ebf88214f14
+Author: Sam Lang <sam.lang at inktank.com>
+Date:   Tue Feb 12 11:32:29 2013 -0600
+
+    deb:  Add ceph-coverage to ceph-test deb package
+    
+    Teuthology uses the ceph-coverage script extensively
+    and expects it to be installed by the ceph task.  Add
+    the script to the ceph-test debian package so that it
+    gets installed for that use case.
+    
+    Signed-off-by: Sam Lang <sam.lang at inktank.com>
+    (cherry picked from commit 376cca2d4d4f548ce6b00b4fc2928d2e6d41038f)
+
+commit ca9aac785eb9e2d1ee955792d2f4d1d911727fb3
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Feb 22 15:04:37 2013 -0800
+
+    rgw: set attrs on various list bucket xml results (swift)
+    
+    Fixes: #4247
+    The list buckets operation was missing some attrs on the different
+    xml result entities. This fixes it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 4384e59ad046afc9ec53a2d2f1fff6a86e645505)
+
+commit e39660c901756d5e722308e72a9d8ee4893f70f7
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Feb 22 15:02:02 2013 -0800
+
+    formatter: add the ability to dump attrs in xml entities
+    
+    xml entities may have attrs assigned to them. Add the ability
+    to set them. A usage example:
+    
+    formatter->open_array_section_with_attrs("container",
+         FormatterAttrs("name", "foo", NULL));
+    
+    This will generate the following xml entity:
+    <container name="foo">
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 7cb6ee28073824591d8132a87ea09a11c44efd66)
+    
+    Conflicts:
+    	src/common/Formatter.cc
+
+commit 0304b85e5c12c30459b94ec5d332dfaa04d20d5b
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Mar 6 19:32:21 2013 -0800
+
+    rgw: don't iterate through all objects when in namespace
+    
+    Fixes: #4363
+    Backport: argonaut, bobtail
+    When listing objects in namespace don't iterate through all the
+    objects, only go though the ones that starts with the namespace
+    prefix
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 6669e73fa50e3908ec825ee030c31a6dbede6ac0)
+
+commit d0dafaa77f96fa91785df0796806ea07fd93f319
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Feb 28 12:13:45 2013 -0800
+
+    ObjectCacher: fix debug log level in split
+    
+    Level 0 should never be used for this kind of debugging.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit cb3ee33532fb60665f39f6ccb1d69d67279fd5e1)
+
+commit ff014ed26bfa4fbf40acffec4eb4805b95a9982c
+Author: Dan Mick <dmick at danceorelse.org>
+Date:   Thu Jan 24 13:38:25 2013 -0800
+
+    rados: remove unused "check_stdio" parameter
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit bb860e49a7faeaf552538a9492ef0ba738c99760)
+
+commit e89884da9f76b713372a79b772ba3cc2f3b03048
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 23 21:31:11 2013 -0800
+
+    rados: obey op_size for 'get'
+    
+    Otherwise we try to read the whole object in one go, which doesn't bode
+    well for large objects (either non-optimal or simply broken).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 234becd3447a679a919af458440bc31c8bd6b84f)
+
+commit ee943c8bcf36f1e2218d8e25edfa38ec5fe4bec2
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Feb 27 16:58:45 2013 -0800
+
+    FileJournal::wrap_read_bl: adjust pos before returning
+    
+    Otherwise, we may feed an offset past the end of the journal to
+    check_header in read_entry and incorrectly determine that the entry is
+    corrupt.
+    
+    Fixes: 4296
+    Backport: bobtail
+    Backport: argonaut
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 5d54ab154ca790688a6a1a2ad5f869c17a23980a)
+
+commit 8c6f52215240f48b5e4d5bb99a5f2f451e7ce70a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jan 16 13:14:00 2013 -0800
+
+    osd: leave osd_lock locked in shutdown()
+    
+    No callers expect the lock to be dropped.
+    
+    Fixes: #3816
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 98a763123240803741ac9f67846b8f405f1b005b)
+
+commit a324d999804b4648f245ee36b3bd611b3d139d5d
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 26 14:07:12 2013 -0800
+
+    msg: fix entity_addr_t::is_same_host() for IPv6
+    
+    We weren't checking the memcmp return value properly!  Aie...
+    
+    Backport: bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c8dd2b67b39a8c70e48441ecd1a5cc3c6200ae97)
+
+commit 79d68ae8581141c3fb4cfafd76d5111ff009b762
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Feb 17 22:35:50 2013 -0800
+
+    osd: requeue pg waiters at the front of the finished queue
+    
+    We could have a sequence like:
+    
+    - op1
+    - notify
+    - op2
+    
+    in the finished queue.  Op1 gets put on waiting_for_pg, the notify
+    creates the pg and requeues op1 (and the end), op2 is handled, and
+    finally op1 is handled.  That breaks ordering; see #2947.
+    
+    Instead, when we wake up a pg, queue the waiting messages at the front
+    of the dispatch queue.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 56c5a07708d52de1699585c9560cff8b4e993d0a)
+
+commit 79c4e7e91becc497843d96251776bdc176706aa0
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Feb 17 20:49:52 2013 -0800
+
+    osd: pull requeued requests off one at a time
+    
+    Pull items off the finished queue on at a time.  In certain cases, an
+    event may result in new items betting added to the finished queue that
+    will be put at the *front* instead of the back.  See latest incarnation
+    of #2947.
+    
+    Note that this is a significant changed in behavior in that we can
+    theoretically starve if an event keeps resulting in new events getting
+    generated.  Beware!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit f1841e4189fce70ef5722d508289e516faa9af6a)
+
+commit 3a6ce5d0355beaa56199465e94666cae40bd8da1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jan 17 22:00:42 2013 -0800
+
+    mds: open mydir after replay
+    
+    In certain cases, we may replay the journal and not end up with the
+    dirfrag for mydir open.  This is fine--we just need to open it up and
+    fetch it below.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e51299fbce6bdc3d6ec736e949ba8643afc965ec)
+
+commit 36ed407e0f939a9bca57c3ffc0ee5608d50ab7ed
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu Feb 21 09:21:01 2013 -0800
+
+    mds: use inode_t::layout for dir layout policy
+    
+    Remove the default_file_layout struct, which was just a ceph_file_layout,
+    and store it in the inode_t.  Rip out all the annoying code that put this
+    on the heap.
+    
+    To aid in this usage, add a clear_layout() function to inode_t.
+    
+    Signed-off-by: Sage Weil <sage.weil at dreamhost.com>
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit b4fd196cae5ab76aeb8f82f0581d0a6a2133a3ed
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jan 20 21:53:37 2013 -0800
+
+    mds: parse ceph.*.layout vxattr key/value content
+    
+    Use qi to parse a strictly formatted set of key/value pairs.  Be picky
+    about whitespace.  Any subset of recognized keys is allowed.  Parse the
+    same set of keys as the ceph.*.layout.* vxattrs.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5551aa5b3b5c2e9e7006476b9cd8cc181d2c9a04)
+
+commit 5f92adca26b509aed5655e85ad53174fa7b574b9
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Feb 18 09:10:43 2013 -0800
+
+    rgw: fix multipart uploads listing
+    
+    Fixes: #4177
+    Backport: bobtail
+    Listing multipart uploads had a typo, and was requiring the
+    wrong resource (uploadId instead of uploads).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit db99fb4417b87301a69cb37b00c35c838b77197e)
+
+commit a44df9343594099fecb3897df393249d3d1992e2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Feb 15 10:22:54 2013 -0800
+
+    rgw: don't copy object when it's copied into itself
+    
+    Fixes: #4150
+    Backport: bobtail
+    
+    When object copied into itself, object will not be fully copied: tail
+    reference count stays the same, head part is rewritten.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 34f885be536d0ac89c10fd29b1518751d2ffc547)
+
+commit 91d6be8353259ca30dc87062422e9ae334c3c344
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Feb 19 10:49:33 2013 -0800
+
+    PG: remove weirdness log for last_complete < log.tail
+    
+    In the case of a divergent object prior to log.tail,
+    last_complete may end up before log.tail.
+    
+    Backport: bobtail
+    Fixes #4174
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dbadb3e2921297882c5836c67ca32bb8ecdc75db)
+    
+    Conflicts:
+    
+    	src/osd/PG.cc
+
+commit 7889c5412deaab1e7ba53d66814d0f25659229c1
+Author: James Page <james.page at ubuntu.com>
+Date:   Mon Feb 18 16:24:54 2013 +0000
+
+    Strip any trailing whitespace from rbd showmapped
+    
+    More recent versions of ceph append a bit of whitespace to the line
+    after the name of the /dev/rbdX device; this causes the monitor check
+    to fail as it can't find the device name due to the whitespace.
+    
+    This fix excludes any characters after the /dev/rbdN match.
+    (cherry picked from commit ad84ea07cac5096de38b51b8fc452c99f016b8d8)
+
+commit 42fba772c3c0e2396124a9d6ec39297dd9af4cc9
+Merge: 290a352 ad6655e
+Author: Sage Weil <sage at newdream.net>
+Date:   Sun Feb 17 21:52:55 2013 -0800
+
+    Merge pull request #64 from dalgaaf/wip-bobtail-memleaks
+    
+    cherry-pick some memleak fixes from master to bobtail
+
+commit ad6655e976916d3b62e0c91fd469eeb49fe7da3e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Feb 8 17:17:59 2013 +0100
+
+    rgw/rgw_rest.cc: fix 4K memory leak
+    
+    Fix 4K memory leak in case RGWClientIO::read() fails in
+    read_all_chunked_input().
+    
+    Error from cppcheck was:
+    Checking src/rgw/rgw_rest.cc...
+    [src/rgw/rgw_rest.cc:688]: (error) Memory leak: data
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 89df090e04ef9fc5aae29122df106b0347786fab)
+
+commit 3de692753c28ddbeb3c86b51466be16e94c9c458
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Feb 8 17:14:19 2013 +0100
+
+    SyntheticClient.cc: fix some memory leaks in the error handling
+    
+    Fix some memory leaks in case of error handling due to failed
+    client->open() calls.
+    
+    Error from cppcheck was:
+    [src/client/SyntheticClient.cc:1980]: (error) Memory leak: buf
+    [src/client/SyntheticClient.cc:2040]: (error) Memory leak: buf
+    [src/client/SyntheticClient.cc:2090]: (error) Memory leak: buf
+    (cherry picked from commit f0ba80756d1c3c313014ad7be18191981fb545be)
+
+commit f19d228c6a49222659c769099aaa4e755b80331d
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Feb 8 16:57:20 2013 +0100
+
+    rgw/rgw_xml.cc: fix realloc memory leak in error case
+    
+    Fix error from cppcheck:
+    
+    [src/rgw/rgw_xml.cc:212]: (error) Common realloc mistake: 'buf'
+      nulled but not freed upon failure
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit d48cc789ea075ba2745754035640ada4131b2119)
+
+commit b0c6be95b03d9f3dd2badcdcff359ae7bc9684f4
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Feb 8 16:54:33 2013 +0100
+
+    os/FileStore.cc: fix realloc memory leak in error case
+    
+    Fix error from cppcheck:
+    
+    [src/os/FileStore.cc:512]: (error) Common realloc mistake: 'fiemap'
+      nulled but not freed upon failure
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit c92a0f552587a232f66620170660d6b2ab6fb3a5)
+
+commit f3e5cedbc11005701ac0a8e70909a6372cd2fe6f
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Feb 8 16:49:36 2013 +0100
+
+    common/fiemap.cc: fix realloc memory leak
+    
+    Fix error from cppcheck:
+    
+    [src/common/fiemap.cc:73]: (error) Common realloc mistake: 'fiemap'
+      nulled but not freed upon failure
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit f26f1470e7af36fa1eb8dc59c8a7c62c3c3a22ba)
+
+commit 290a352c3f9e241deac562e980ac8c6a74033ba6
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 14 11:37:57 2013 -0800
+
+    osd/OSDCap: add unit test for parsing pools/objects with _ and -
+    
+    Hunting #4122, where a user saw
+    
+    2013-02-13 19:39:25.467916 7f766fdb4700 10 osd.0 10  session 0x2c8cc60 client.libvirt has caps osdcap[grant(object_prefix rbd^@children  class-read),grant(pool libvirt^@pool^@test rwx)] 'allow class-read object_prefix rbd_children, allow pool libvirt-pool-test rwx'
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2ce28ef1d7f95e71e1043912dfa269ea3b0d1599)
+    (cherry picked from commit a6534bc8a0247418d5263b765772d5266f99229c)
+
+commit f47916353547c77a65c7b70e609a9096f09c6d28
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 14 15:39:43 2013 -0800
+
+    osd/OSDCap: tweak unquoted_word parsing in osd caps
+    
+    Newer versions of spirit (1.49.0-3.1ubuntu1.1 in quantal, in particular)
+    dislike the construct with alnum and replace the - and _ with '\0' in the
+    resulting string.
+    
+    Fixes: #4122
+    Backport: bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 6c504d96c1e4fbb67578fba0666ca453b939c218)
diff --git a/doc/changelog/v0.56.5.txt b/doc/changelog/v0.56.5.txt
new file mode 100644
index 0000000..0e9ce5e
--- /dev/null
+++ b/doc/changelog/v0.56.5.txt
@@ -0,0 +1,1972 @@
+commit df884bb7b59e5796c996ab806f5ec8b8322e292f
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Thu May 2 18:08:06 2013 -0700
+
+    v0.56.5
+
+commit b38cbabb2a38e4476de1135c33c25c673d62cd67
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Apr 4 18:23:40 2013 +0200
+
+    ceph.spec.in: fix udev rules.d files handling
+    
+    Move 50-rbd.rules into the ceph base package since the related
+    ceph-rbdnamer binary is part of this package. Use correct install
+    pattern.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+
+commit d0678a062a1baf738ce96114114d99495be19478
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Apr 29 17:01:55 2013 -0700
+
+    debian: only start/stop upstart jobs if upstart is present
+    
+    This avoids errors on non-upstart distros (like wheezy).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 030bf8aaa15837f898e453161eeaf1d52fc5779d)
+    
+    Conflicts:
+    	debian/ceph-mds.postinst
+
+commit 209ce34a420cc5cdbe7219393f2f150ac28f612c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 11 17:09:37 2013 -0700
+
+    debian: stop ceph-mds before uninstalling ceph-mds
+    
+    Fixes: #4384
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9eb0d91b867ab980135d7c6ff6347d69d0a8a794)
+
+commit 0c91becfa6cc5f05c5b2eaa89299dbf1aa202344
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Apr 25 15:53:51 2013 -0700
+
+    Makefile.am: Add -lpthread to fix build on newer ld in Raring Ringtail
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 98f532e8000af281fa03b24da9ad2fda81755270)
+    
+    Conflicts:
+    	src/Makefile.am
+
+commit 15e6544f0892e8472f436149d15fc30257496c0b
+Merge: fdc0534 418cff5
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 1 12:57:43 2013 -0700
+
+    Merge remote-tracking branch 'gh/bobtail-deploy' into bobtail-next
+
+commit fdc05346177a60f064fe351ca81c6078cd065179
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Apr 25 11:13:33 2013 -0700
+
+    init-ceph: use remote config when starting daemons on remote nodes (-a)
+    
+    If you use -a to start a remote daemon, assume the remote config is present
+    instead of pushing the local config.  This makes more sense and simplifies
+    things.
+    
+    Note that this means that -a in concert with -c foo means that foo must
+    also be present on the remote node in the same path.  That, however, is a
+    use case that I don't particularly care about right now.  :)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit cd7e52cc76878eed0f084f7b9a6cf7c792b716c6)
+
+commit 55c87e821b6acc1cd46056ca27c6e7f7030466e7
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Apr 24 12:20:17 2013 -0700
+
+    PG: call check_recovery_sources in remove_down_peer_info
+    
+    If we transition out of peering due to affected
+    prior set, we won't trigger start_peering_interval
+    and check_recovery_sources won't get called.  This
+    will leave an entry in missing_loc_sources without
+    a matching missing set.  We always want to
+    check_recovery_sources with remove_down_peer_info.
+    
+    Fixes: 4805
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 81a6165c13c533e9c1c6684ab7beac09d52ca6b5)
+
+commit a28c2f55bfc768a502fbc8ec35265e7f1a53e044
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Apr 25 14:08:57 2013 -0700
+
+    PG: clear want_acting when we leave Primary
+    
+    This is somewhat annoying actually.  Intuitively we want to
+    clear_primary_state when we leave primary, but when we restart
+    peering due to a change in prior set status, we can't afford
+    to forget most of our peering state.  want_acting, on the
+    other hand, should never persist across peering attempts.
+    In fact, in the future, want_acting should be pulled into
+    the Primary state structure.
+    
+    Fixes: #3904
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit a5cade1fe7338602fb2bbfa867433d825f337c87)
+
+commit 849ed5982d4547dd651313919fb090944f568214
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Apr 30 18:12:10 2013 -0700
+
+    mon: communicate the quorum_features properly when declaring victory.
+    
+    Fixes #4747.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fe68afe9d10bc5d49a05a8bafa644d57783447cf)
+
+commit ea9c76b8f457d44e63551d47b6dd30bd16a56468
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Apr 30 11:01:54 2013 -0700
+
+    elector: trigger a mon reset whenever we bump the epoch
+    
+    We need to call reset during every election cycle; luckily we
+    can call it more than once. bump_epoch is (by definition!) only called
+    once per cycle, and it's called at the beginning, so we put it there.
+    
+    Fixes #4858.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6ae9bbb5d03cb5695a4ebb7a3c20f729de1bd67a)
+    
+    Conflicts:
+    
+    	src/mon/Elector.cc
+
+commit 418cff585bf6fc292d260a464369d82f7cdb3b79
+Author: Alexandre Marangone <alexandre.marangone at inktank.com>
+Date:   Fri Apr 19 15:09:28 2013 -0700
+
+    Fix journal partition creation
+    
+    With OSD sharing data and journal, the previous code created the
+    journal partiton from the end of the device. A uint32_t is
+    used in sgdisk to get the last sector, with large HD, uint32_t
+    is too small.
+    The journal partition will be created backwards from the
+    a sector in the midlle of the disk leaving space before
+    and after it. The data partition will use whichever of
+    these spaces is greater. The remaining will not be used.
+    
+    This patch creates the journal partition from the start as a workaround.
+    
+    Signed-off-by: Alexandre Marangone <alexandre.marangone at inktank.com>
+    (cherry picked from commit 56619ab91732bd2eacbef388311954f4e0230a30)
+
+commit 1a6b87ea48c3bcd3904d888a2ad1e5774aa2de8e
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Apr 26 15:37:21 2013 -0700
+
+    ceph.spec.in: put ceph-disk-* et al in correct sbindir
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 86337936059d6b17c887e82f79167324eafa083c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Apr 26 15:29:12 2013 -0700
+
+    debian: fix ceph.install
+    
+    This got out of sync somewhere in cherry-picking all of these patches.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 0b42b1edb306a9763bcd02bd962bd284f6b7b3a3
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Apr 4 15:54:31 2013 +0200
+
+    Makefile.am: install ceph-* python scripts to /usr/bin directly
+    
+    Install ceph-* scripts directly to $(prefix)$(sbindir) (which
+    normaly would be /usr/sbin) instead of moving it around after
+    installation in SPEC file or debian files.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 4d16f38f48e276497190c8bc03abc55c40e18eed)
+
+commit c71fb8d5b39667fc2c9f7e898ced53059d3f1eec
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Tue Apr 2 12:11:10 2013 -0700
+
+    ceph-disk:  CalledProcessError has no output keyword on 2.6
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+    (cherry picked from commit a793853850ee135de14b9237f7023cadcdb8575c)
+
+commit 1b86b1c7618b1ab93e25e1abf79bbe0a992c8526
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Apr 2 17:54:53 2013 +0200
+
+    ceph-disk: fix some (local) variable names
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit c4eb7e6ddd593cd45ab8343da01355be7382723e)
+
+commit ee452ebe6ff37087714c085dacd1ca2bcf66bd49
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Apr 2 17:36:37 2013 +0200
+
+    ceph-disk: fix naming of local variable in is_mounted()
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 3dd8b461219e64bb0f7a210dba5a9ab7c644f014)
+
+commit 0e47d312dcec2deb26a960e6097708d8742d85cb
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Apr 2 17:33:08 2013 +0200
+
+    ceph-disk: merge twice defined function is_mounted(dev)
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit eaf31bf9f90ba9709a57a6870dbafa21142dae2c)
+
+commit 7326ea6397160607d78914444f7f0598a6ba346f
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Apr 2 17:26:12 2013 +0200
+
+    ceph-disk: define exception type
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 4c6d6442a89adc5b56e99cb4d2ed572f2ad192c9)
+
+commit 14a348dc8ea9c012b6843825fd7beb5896a6d92e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Apr 2 17:17:38 2013 +0200
+
+    ceph-disk: fix Redefining name 'uuid' from outer scope
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 058eb923c5b7dab611901fdd1724ce2a7c180827)
+
+commit 9419dca69292146ea1fd216a1ad08b2e07bdc1a0
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Apr 2 17:14:23 2013 +0200
+
+    ceph-disk: add missing space after comma
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 0080d1df7c7950e051840a543fc4bdabe6cc53e5)
+
+commit 7406981aa5515a3be8af0b9a0abef83a40c432b2
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 29 17:30:28 2013 -0700
+
+    ceph-disk list: say 'unknown cluster $UUID' when cluster is unknown
+    
+    This makes it clearer that an old osd is in fact old.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e9b3f2e6e93426d631d4f8101fb431a523b0d88a)
+
+commit 0182973b66d449552d17248e27cd12c470137ea9
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 29 13:59:04 2013 -0700
+
+    ceph-disk: handle missing journal_uuid field gracefully
+    
+    Only lower if we know it's not None.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 562e1716bd4b5372716e502a5e4dd872d381bfb7)
+
+commit 24d729c591430349b033992f87141e596dcd6bff
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 28 20:49:24 2013 -0700
+
+    ceph-disk: implement 'list'
+    
+    This is based on Sandon's initial patch, but much-modified.
+    
+    Mounts ceph data volumes temporarily to see what is inside.  Attempts to
+    associated journals with osds.
+    
+    Resolves: #3120
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 6a65b9131c444041d16b880c6a7f332776063a78)
+
+commit bf3f8702c580c6b9647878837355688a2a4f954c
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 18:44:32 2013 -0700
+
+    ceph-disk: reimplement list_all_partitions
+    
+    Use /dev/disk/by-id to list disks and their partitions.  This is more
+    accurate and correct than the previous (as-yet unused) implementation.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d3e49047ff405573aa41f45864cf315be23f5c50)
+
+commit 9da81e4e798b8e5593f3a7eda6dfa8586307121f
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 18:43:59 2013 -0700
+
+    ceph-disk: reimplement is_partition
+    
+    Previously we were assuming any device that ended in a digit was a
+    partition, but this is not at all correct (e.g., /dev/sr0, /dev/rbd1).
+    Instead, look in /dev/disk/by-id and see if there is a symlink that ends in
+    -partNN that links to our device.
+    
+    There is probably still a better way...
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 20d594a889d62110ad03b761d8703f79f8eea6ad)
+
+commit 0c8efc0664f068a1952fe54b8034d005cf3f9ce8
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 12:45:29 2013 -0700
+
+    ceph-disk: conditionally remove mount path
+    
+    umount removes it on success; only remove it here if it is still there.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4362934a94c5a6f7521f06aa1255e111094e1d88)
+
+commit 153994cdcf9bc4a9719849d951bec5f4983340b5
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Mar 26 17:04:14 2013 -0700
+
+    ceph-disk: ignore udevadm settle return code
+    
+    If we time out, just continue and let the next step fail.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2ae297ccb812c00204ec0c4dc614821c506062b9)
+
+commit d714049d530dc9611cf5f2fcb9b272c355dbe9f1
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Mon Mar 25 17:45:32 2013 +0100
+
+    ceph-disk: rename some local variabels in list_*partitions
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b7d7e6894c550a7afa8dfb5bfa2bc54b5d331178)
+
+commit ecb34b81b843adaf9455503eb3ecc69ea94652a3
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Mon Mar 25 16:24:00 2013 +0100
+
+    ceph-disk: fix naming of a local variable in find_cluster_by_uuid
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 0b5fcfffe6d2f69bd4318cc93ef73195d948b9c5)
+
+commit 63eb85072f6a61552725bd04dfb261e5cd52a60a
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Mon Mar 25 16:18:17 2013 +0100
+
+    ceph-disk: rename some constants to upper case variable names
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 8a999ded088e688fd3f4a7c27127b7c06f0b2f66)
+
+commit d26a03422a37f16d609de12f8973f3c32ffedae0
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Mon Mar 25 16:15:29 2013 +0100
+
+    ceph-disk: add some more docstrings
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 86e55f5448c4b5b46b74d2d89b01d1e64b1ea826)
+
+commit bd8bb984806a1dbc3514c3a2a8980a03cfb2bc23
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Mon Mar 25 14:36:41 2013 +0100
+
+    ceph-disk: print subprocess.CalledProcessError on error
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 543327b1f2a9efe8083bb196433c4bcf83883269)
+
+commit 970348fc46a7e100731ffdc63d20f343dcb1b787
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Mon Mar 25 13:55:56 2013 +0100
+
+    ceph-disk: fix indention
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 2d26bcc07162a5176cdbc1748b829e3f39653697)
+
+commit 0113e5335e1552294bbf075cfff85c204b164e95
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Tue Mar 26 11:31:16 2013 -0700
+
+    ceph-disk:  udevadm settle before partprobe
+    
+    After changing the partition table, allow the udev event to be
+    processed before calling partprobe.  This helps prevent partprobe
+    from getting a resource busy error on some platforms.
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+    (cherry picked from commit 9eda8e5d5abf0743a2ad484806cfb2018243515f)
+
+commit 02d48351f73330917185d8980f8ad123b99138b5
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 22 10:09:55 2013 -0700
+
+    ceph-disk: re-add python 2.7 dependency comment
+    
+    FIXME!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6d63752c8fde91cdab306d1ca689690b269fe977)
+
+commit e92baf5081a43ff3290eb934612a11fbed946469
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 14:36:58 2013 +0100
+
+    ceph-disk: cast output of subprocess.Popen() to str()
+    
+    Cast output of subprocess.Popen() to str() to be able to use
+    str.split() and str.splitlines() without warnings from pylint.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 87691dc46edfba11c370592dbb533772190be4b2)
+
+commit 1ffc89af1954643426708987a09291463bd7525b
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 14:02:28 2013 +0100
+
+    ceph-disk: fix adjust_symlink() replace 'journal' with 'target'
+    
+    Replace 'journal' variable with 'target' since journal doesn't
+    exist in this function.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 3575feb7d2e5f4e35c5df193a1f8c9f08f88fcf4)
+
+commit 690ab6b3e284e9beed74b3e77612e804464e467d
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 14:01:02 2013 +0100
+
+    ceph-disk: fix adjust_symlink() replace 'canonical' with 'path'
+    
+    Replace 'canonical' variable with 'path' since canonical doesn't
+    exist in this function.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit a27cb85b21610b4a9f8eb24f8f6cd04902349728)
+
+commit 329f279cd108c837e434ee3aae6c8ad502ba802f
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 13:56:23 2013 +0100
+
+    ceph-disk: there is no os.path.lstat use os.lstat
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 6d3247b5c02c39a66666a5833106dbc23044e436)
+
+commit ffe024b8b5024cdac256bacb9df433b69385cc0a
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 13:30:21 2013 +0100
+
+    ceph-disk: remove unused variable key from prepare_journal_dev()
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 97b4f8d66bef2328fa53f9e508eb38f8b8d49632)
+
+commit 9464284f3ac9737345c595847e165db48adc0a70
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 13:27:27 2013 +0100
+
+    ceph-disk: fix except to catch OSError
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 9daf6cfce2d57509d896eae28bb97146a682a306)
+
+commit 01152115f7bf4a307296c9126174ce09bb0ce22d
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 13:15:36 2013 +0100
+
+    ceph-disk: add missing space after >> operator
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 0ada43f79d2b1f9f84367e558c6d1a3e90e5c9b2)
+
+commit b9f86d96f5dd6ca18eb39882caf69e76369b5e0b
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 12:33:09 2013 +0100
+
+    fix: Redefining name 'uuid' from outer scope (line 14)
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit d3c60dc8cad1db1d5df1c740bc805aaf9ba606ba)
+
+commit 6fa6cd85b55935739e16b8ba537f7848dbb0218f
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 12:17:45 2013 +0100
+
+    ceph-disk: remove unused variables from list_partitions()
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 6a8120d4b0c4cfa851d473532eb2366534f8653d)
+
+commit 0b4e85fe23e8aa24e8aef8548df2b508bda24752
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 20 12:10:22 2013 +0100
+
+    ceph-disk: fix /dev/dm-[0-9] handling list_all_partitions()
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 3af7a1ac5bf24bf832d7180002281d6b5853e85a)
+
+commit 3ec61f85f6a8a8af8a2b921f94e77a77be77a1d7
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Mar 19 22:07:36 2013 +0100
+
+    ceph-disk: rename local variable shadowing builtin
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 9bcf5b64f45ab6c4bdedf820ed111319b2dbd778)
+
+commit bd1036dd83fa2ee4807047fb9c2b414ccc9375eb
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Mar 19 22:05:23 2013 +0100
+
+    ceph-disk: remove twice defined identical function unmount
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 4adf088107586be7b356d1e963570cdab232809e)
+
+commit 8dd8cbac6f88fcb9d2c6838b9f961c70cccb9288
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Mar 19 22:02:49 2013 +0100
+
+    ceph-disk: remove twice defined function mount
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit ea26ea0d81a23aa76076ad5441c3b1aadfba3b44)
+
+commit 0da87db1c0e4b44b69c19b718d89e7a621979009
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Mar 19 21:58:22 2013 +0100
+
+    ceph-disk: remove double defined function get_conf
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit c57daa3c6e03e8974e133d3a2d9bc3d6f06f4faf)
+
+commit 9c46dfb2512d3b55345faed1bebb9204ba07d030
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Mar 19 21:51:54 2013 +0100
+
+    ceph-disk: rename local variable shadowing builtin
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 57dde5c8b18ff4ccd53a30bb94119c0ffceb52b7)
+
+commit b807d8ba0a0c23c7dab6893bc5297e07c0fd902f
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 18 14:55:24 2013 -0700
+
+    ceph-disk: install and package
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c2602d749023b24ac22d8cfce6e04889078f14d8)
+    
+    Conflicts:
+    
+    	debian/ceph.install
+
+commit 8901e02db05837b12d5e1d0ec6f14f909cc03315
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 15 16:50:05 2013 -0700
+
+    ceph-disk: simplify command dispatch
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f287c6f90af0dfdd41358846b069aa3c54b600b3)
+
+commit 3cbc0d0c92ad19d5022c94d9d1ac00aff4eb9b2d
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 15 16:40:32 2013 -0700
+
+    ceph-disk: consolidate exceptions
+    
+    Use a single exception type, and catch it at the top level.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a019753bd3897ee0f5d9c3563c653c5457d5e67d)
+
+commit b4176bafa2b0721664332a1bb8b73da54151f685
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 15 16:36:45 2013 -0700
+
+    ceph-disk: consolidate ceph-disk-* into a single binary
+    
+     ceph-disk prepare ...
+     ceph-disk activate ...
+     ceph-disk ...
+    
+    This let's us share code (we were already duplicating a bunch of stuff!)
+    and to add new commands easily.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 20e4ba5cebb7b4989d1745932f7a412c28504ee1)
+
+commit 455cb32543df8036a605dc7b6c194e58b10bc4ec
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 18 21:13:34 2013 -0700
+
+    ceph-disk-prepare: 'mkfs -t' instead of 'mkfs --type='
+    
+    Older mkfs (el6) doesn't like --type=.
+    
+    Fixes: #4495
+    Reported-by: Alexandre Maragone <alexandre.maragone at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d47759429a6e2fdd392265e90b67046302c97644)
+
+commit 19a2cf58504a3305ac9afe3d6642cf68e1b0f6c1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 14 21:05:07 2013 -0700
+
+    ceph-disk-activate: identify cluster .conf by fsid
+    
+    Determine what cluster the disk belongs to by checking the fsid defined
+    in /etc/ceph/*.conf.  Previously we hard-coded 'ceph'.
+    
+    Note that this has the nice side-effect that if we have a disk with a
+    bad/different fsid, we now fail to activate it.  Previously, we would
+    mount and start ceph-osd, but the daemon would fail to authenticate
+    because it was part of the wrong cluster.
+    
+    Fixes: #3253
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 80af5fb887f30792c342ac16da9ed95d7e89e491)
+
+commit 568485bea8ae9f0f36571de259c7254fa4227b15
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 14 16:18:26 2013 -0700
+
+    ceph-disk-activate: abort if target position is already mounted
+    
+    If the target position is already a mount point, fail to move our mount
+    over to it.  This usually indicates that a different osd.N from a
+    different cluster instances is in that position.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7370b5564606474f11b9ac5afb7cc60e0ac36ed1)
+
+commit a6ecf9288af248656bc712c1a4de910ff107a9a2
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 14 12:05:52 2013 -0700
+
+    Revert "ceph-disk-activate: rely on default/configured keyring path"
+    
+    This reverts commit 936b8f20af1d390976097c427b6e92da4b39b218.
+    
+    This is necessary because we mount the osd in a temporary location.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b6102c0945a0d68b7c5ff7f2254a1a994788ca0f)
+
+commit 7c1edc0c927a27c07b6f1611c2cf9c48f2dc95f6
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 14 12:04:44 2013 -0700
+
+    Revert "ceph-disk-activate: don't override default or configured osd journal path"
+    
+    This reverts commit 813e9fe2b4291a1c1922ef78f031daa9b78fe53b.
+    
+    We run --mkfs with the osd disk mounted in a temporary location, so it is
+    necessary to explicitly pass in these paths.
+    
+    If we want to support journals in a different location, we need to make
+    ceph-disk-prepare update the journal symlink accordingly.. not control it via
+    the config option.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3e628eee770508e750f64ea50179bbce52e7b8e0)
+
+commit 739b013cfa4b84d36750b80ce44579498e7ea4f4
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 11 21:15:11 2013 -0700
+
+    ceph-disk-activate: rely on default/configured keyring path
+    
+    No reason to override the default or configured value here.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 936b8f20af1d390976097c427b6e92da4b39b218)
+
+commit 897413f90c0e802c6824c0ee8d06bdae33979293
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 11 21:14:53 2013 -0700
+
+    ceph-disk-activate: don't override default or configured osd journal path
+    
+    There is no reason not to rely on the default or obey any configured
+    value here.
+    
+    Fixes: #4031
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 813e9fe2b4291a1c1922ef78f031daa9b78fe53b)
+
+commit 35eac085182e569b17c287c86e1415880909be22
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Mar 5 13:08:26 2013 -0800
+
+    ceph-disk-prepare: move in-use checks to the top, before zap
+    
+    Move the in-use checks to the very top, before we (say) zap!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 32407c994f309cd788bf13fe9af27e17a422309a)
+
+commit 5ad4120a4825d6615778a005cff990afccf30691
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 4 20:57:52 2013 -0800
+
+    ceph-disk-prepare: verify device is not in use by device-mapper
+    
+    Be nice and tell the user which devices/mappings are consuming the device,
+    too.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a6196de9e2f3ca9d67691f79d44e9a9f669443e9)
+
+commit e4a520029196cc76f1ec45695554ca6330bf14aa
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 4 16:38:57 2013 -0800
+
+    ceph-disk-prepare: verify device is not mounted before using
+    
+    Make sure the data and/or journal device(s) are not in use (mounted)
+    before using them.  Make room for additional "in-use" checks in the future.
+    
+    Closes: #3256
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3bd0ac0ab011c4cdf0121f0d9732938d085fb8bf)
+
+commit d05b439142a24d28f35c6a09a8ab7c9eed503cd5
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 4 16:29:57 2013 -0800
+
+    ceph-disk-prepare: clean up stupid check for a digit
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f03f62697f170d42b4b62c53d2860ff2f24a2d73)
+
+commit ea07b0e1047a4ac1b4dde88c795709190bd048be
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 4 16:08:15 2013 -0800
+
+    ceph-disk-prepare: use os.path.realpath()
+    
+    My janky symlink resolution is broken in various ways.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 59505546e52a175435881b431bd349d532ae627e)
+
+commit 8f7e3e7dbbb9cab869366927c1687c38c012a1ef
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Feb 28 14:16:26 2013 +0100
+
+    ceph.spec.in: add new Requires from ceph-disk-prepare
+    
+    Added new Requires from ceph-disk-prepare: cryptsetup, gptfdisk,
+    parted and util-linux.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 5c3f5c5b69a9edc99138d4f1ddb016689303dc28)
+    
+    Conflicts:
+    
+    	ceph.spec.in
+
+commit 3441acf3749dbd99f1e00e5306e8180647085d2a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 27 13:31:12 2013 -0800
+
+    debian: require cryptsetup-bin
+    
+    This is needed for ceph-disk-prepare's dmcrypt support.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cfcaceac44d6b7b7c55e81d0bfb05f4893f3b1d0)
+    
+    Conflicts:
+    
+    	debian/control
+
+commit abdac6fddd25bc71f59c1097246cfa32b33b0f5f
+Author: Alexandre Marangone <alexandre.marangone at inktank.com>
+Date:   Mon Apr 15 15:57:00 2013 -0700
+
+    Fix: use absolute path with udev
+    
+    Avoids the following: udevd[61613]: failed to execute '/lib/udev/bash'
+    'bash -c 'while [ ! -e /dev/mapper/....
+    
+    Signed-off-by: Alexandre Marangone <alexandre.marangone at inktank.com>
+    (cherry picked from commit 785b25f53dc7f8035eeba2aae8a196e3b102d930)
+
+commit d1775daf68d9aa887116a357cbcaf7c44e091cce
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 16 20:55:03 2013 -0800
+
+    ceph-disk-prepare: -f for mkfs.xfs only
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fecc3c3abf1176f4c7938e161559ea2db59f1cff)
+
+commit 405e0ea1c692b1d62f948734e07c4f919b90d4e0
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 16 16:49:50 2013 -0800
+
+    debian: fix start of ceph-all
+    
+    Tolerate failure, and do ceph-all, not ceph-osd-all.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit aff0bb6fdc8ca358f7ac1e941bb9cfecbefb4bb6)
+
+commit 632be442261cabd56da0dc897b8a47a8e5493dce
+Author: Alexandre Marangone <alexandre.marangone at inktank.com>
+Date:   Fri Feb 15 12:24:01 2013 -0800
+
+    ceph-disk-prepare: always force mkfs.xfs
+    
+    Signed-off-by: Alexandre Marangone <alexandre.marangone at inktank.com>
+    (cherry picked from commit d950d83250db3a179c4b629fd32cd7bc8149997e)
+
+commit 28d1193836edee622763e308aad69c7bfe7a4971
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 13 18:22:45 2013 -0800
+
+    udev: trigger on dmcrypted osd partitions
+    
+    Automatically map encrypted journal partitions.
+    
+    For encrypted OSD partitions, map them, wait for the mapped device to
+    appear, and then ceph-disk-activate.
+    
+    This is much simpler than doing the work in ceph-disk-activate.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e090a92a20f4161f473d16bc966f7d6aacac75ee)
+
+commit 5c5021b43ab70a08d791020262f76879dc77effb
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 21:35:56 2013 -0800
+
+    ceph-disk-prepare: add initial support for dm-crypt
+    
+    Keep keys in /etc/ceph/dmcrypt-keys.
+    
+    Identify partition instances by the partition UUID.  Identify encrypted
+    partitions by a parallel set of type UUIDs.
+    
+    Signed-off-by: Alexandre Marangone <alexandre.maragone at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c6ac0ddf91915ba2aeae46d21367f017e18e82cd)
+
+commit d7084037d7a2395acfe8181f94963c1337c0f95b
+Author: Alexandre Marangone <alexandre.marangone at inktank.com>
+Date:   Fri Feb 15 12:22:33 2013 -0800
+
+    ceph-disk-activate: pull mount options from ceph.conf
+    
+    Signed-off-by: Alexandre Marangone <alexandre.marangone at inktank.com>
+    (cherry picked from commit e7040f55f01db3de7d5cebfc79de50c8b6ad5d45)
+
+commit 34fba357ca8b662c7b943d426ed37875c173003f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 14 17:05:32 2013 -0800
+
+    ceph-disk-activate: use full paths for everything
+    
+    We are run from udev, which doesn't get a decent PATH.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b1c0fccba42dd184a2891ee873c0d6d8f8c79d14)
+
+commit caad18745cd8553a012d9e7f92e59d5b4450dcf2
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 14 17:04:55 2013 -0800
+
+    ceph-disk-prepare: do partprobe after setting final partition type
+    
+    This is necessary to kick udev into processing the updated partition and
+    running its rules.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 95835de9f80712eb26652ac6b66ba9c5eeb093d6)
+
+commit e1624e4626b4e67909f3bb83920c99ad323ed083
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 13 21:47:30 2013 -0800
+
+    debian: start/stop ceph-all event on install/uninstall
+    
+    This helps us avoid the confusing situation with upstart where an individual
+    daemon job is running (like ceph-osd id=2) but the container jobs ceph-osd-all
+    and ceph-all are not.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b7b9af5c0d531dcee7ce9b10043a29b0a1b31f47)
+
+commit 656305f65eb33d68b95f4d29f37b031cf6cf889a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 13 21:37:08 2013 -0800
+
+    ceph-disk-activate: catch daemon start errors
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 690ae05309db118fb3fe390a48df33355fd068a0)
+
+commit 8b771bf929c4a9ab3fd4eb6f40b9222a463fd1a4
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 13 17:30:19 2013 -0800
+
+    udev: trigger ceph-disk-activate directly from udev
+    
+    There is no need to depend on upstart for this.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5bd85ee5aa31bfd1f4f0e434f08c2a19414358ef)
+    
+    Conflicts:
+    
+    	ceph.spec.in
+
+commit ffb0613efaa9cf919992640322785eedf95ca25f
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 13 16:02:10 2013 -0800
+
+    ceph-disk-activate: auto detect init system
+    
+    Look for an option 'init' in ceph.conf.  Otherwise, check if we're ubuntu.
+    If so, use upstart.  Otherwise, use sysvinit.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d1904b2a848af3c02d2065ac2a42abe0e2699d0f)
+
+commit 74b562703c422890c67b2a88d7b18242f64949dc
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Feb 13 15:49:42 2013 -0800
+
+    ceph-disk-activate: specify full path for blkid, initctl, service
+    
+    /sbin apparently isn't in the path when udev runs us.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f06b45e66315310abb0720e021da377186455048)
+
+commit 9ea32e5f066bee75923212d8009fb37a365ef32e
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 19:18:23 2013 -0800
+
+    upstart: ceph-hotplug -> ceph-osd-activate
+    
+    This is a more meaningful name.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e011ad128e7f302cb6955d9a7171ac0ec8890ddf)
+
+commit 494533a55010a59a52f6dcbe64f76e677a7dfe8e
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 19:14:22 2013 -0800
+
+    upstart/ceph-hotplug: tell activate to start via upstart
+    
+    This will mark the OSD data dir as upstart-managed.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 792e45c63dd7a9622fddd6e15ee4c075f995ea56)
+
+commit 5e0892fd8cbc2571d94cffc0b64daaa4ec6c38f8
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 19:08:22 2013 -0800
+
+    ceph-disk-prepare: refactor to support DIR, DISK, or PARTITION for data or journal
+    
+    Lots of code reorganization collapsed into a single commit here.
+    
+    - detect whether the user gave us a directory, disk, or partition, and Do The
+    Right Thing
+    - allow them to force that the input was of type X, for the careful/paranoid.
+    - make --zap-disk an option -- no longer the default
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b2ff6e8c9d96dee2c063b126de7030a5c2ae0d02)
+
+commit aa428017e4aad9872a54cd87036ef2bb528aac7b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 20:33:16 2013 -0800
+
+    ceph-disk-activate: detect whether PATH is mount or dir
+    
+    remove in-the-way symlinks in /var/lib/ceph/osd
+    
+    This is simpler.  Just detect what the path is and Do The Right Thing.
+    
+    Closes #3341 (which wanted to make --mount the default)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 191d5f7535f8d96d493e1b35b43a421c67c168ea)
+
+commit e6d5aa053dbaaf07c94e35406c23f4ca009fe2da
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 20:32:47 2013 -0800
+
+    ceph-disk-activate: add --mark-init INITSYSTEM option
+    
+    Do not assume we will manage via upstart; let that be passed down via the
+    command line.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fd4a921085a861e4aa428376219bb39055731f2b)
+
+commit fa23919eae363291b4807afe3fadd34f94e9ddcb
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 14:44:26 2013 -0800
+
+    ceph-disk-activate: factor mounting out of activate
+    
+    The activate stuff is generic for any OSD, regardless of whether we want
+    to mount it or not.  Pull that part out.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 07655288281c9c6f691f87352dc26b7c11ae07e8)
+
+commit 181ebdee0addfe3d13c13342def94ecf9415d6d5
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 18:17:55 2013 -0800
+
+    debian: put ceph-mds upstart conf in ceph-mds package
+    
+    Fixes: #3157
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 23ad3a46a0099e263f43e0f0c1df1d21cfe58b3f)
+
+commit 919b0aedf7286e85e6ddc23f99f80f29e1d35db6
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 17:02:52 2013 -0800
+
+    debian: include /var/lib/ceph/bootstrap-mds in package
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e80675a0f333c04452d4822fd0eb3c6e92eda3df)
+
+commit f97f49b1e7ca8555c945b93fbc8241f5fa620dd8
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 12 16:26:14 2013 -0800
+
+    ceph-create-keys: create mds bootstrap key
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 809143f16c70483ba5bb429dea812d31b67f2b49)
+
+commit f43c339d67b78e6afc3737d26cea4bc05dcea900
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 26 14:45:43 2013 -0800
+
+    upstart/ceph-hotplug: drop -- in ceph-disk-activate args
+    
+    We would like to transition to
+    
+     ceph-disk-activate --mount DEV
+    
+    and away from a generic multi-definition PATH argument.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4698b6a1035dee8509ce2d4dab7b34a16b78f7cd)
+
+commit 39df4c81f2166b7e9ac89c591b268b60de4042e6
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 22:53:23 2013 -0800
+
+    init-ceph: iterate/locate local sysvinit-tagged directories
+    
+    Search /var/lib/ceph/$type/ceph-$id and start/stop those daemons if
+    present and tagged with the sysvinit file.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c8f528a4070dd3aa0b25c435c6234032aee39b21)
+
+commit 05efb7ab5b289472a1af05d6aa100a7385be304e
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 25 22:52:03 2013 -0800
+
+    init-ceph: consider sysvinit-tagged dirs as local
+    
+    If there is a 'sysvinit' file in the daemon directory in the default
+    location (/var/lib/ceph/$type/ceph-$id), consider it sysvinit-managed.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b8aa4769a62e0d88174678cbefd89d9ee2baceea)
+
+commit 8c4c53abf84d30ff4a605225a22575f56d946971
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 11 17:39:03 2013 -0800
+
+    ceph-disk-prepare: align mkfs, mount config options with mkcephfs
+    
+    'osd mkfs ...', not 'osd fs mkfs ...'.  Sigh.  Support both.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit af2372ca4a702da70275edd1b1357fcff51e6ae2)
+
+commit a8e7e9df61a7229d9e2b4b4dedc68b5c1bf15c38
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Apr 23 10:00:38 2013 -0700
+
+    init-ceph: fix (and simplify) pushing ceph.conf to remote unique name
+    
+    The old code would only do the push once per remote node (due to the
+    list in $pushed_to) but would reset $unique on each attempt.  This would
+    break if a remote host was processed twice.
+    
+    Fix by just skipping the $pushed_to optimization entirely.
+    
+    Fixes: #4794
+    Reported-by: Andreas Friedrich <andreas.friedrich at ts.fujitsu.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ccbc4dbc6edf09626459ca52a53a72682f541e86)
+
+commit 9374baccb8a71e1fe5ea2e614feac93e865dd027
+Merge: b6b4ebe aa37726
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Apr 23 12:04:45 2013 -0700
+
+    Merge pull request #238 from ceph/wip-bobtail-rbd-backports-req-order
+    
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+
+commit aa37726b8d43d08b495d55dc2aef93854e9539c5
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Apr 23 09:18:30 2013 -0700
+
+    rbd: only set STRIPINGV2 feature when needed
+    
+    Only set the STRIPINGV2 feature if the striping parameters are non-default.
+    Specifically, fix the case where the passed-in size and count are == 0.
+    
+    Fixes: #4710
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5926ffa576e9477324ca00eaec731a224195e7db)
+    
+    Conflicts:
+    
+    	src/rbd.cc
+
+commit 0e2266dba912cde2c4a86ba7055c8bec3a5bc1a5
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Apr 10 14:16:56 2013 -0700
+
+    LibrbdWriteback:  complete writes strictly in order
+    
+    RADOS returns writes to the same object in the same order. The
+    ObjectCacher relies on this assumption to make sure previous writes
+    are complete and maintain consistency. Reads, however, may be
+    reordered with respect to each other. When writing to an rbd clone,
+    reads to the parent must be performed when the object does not exist
+    in the child yet. These reads may be reordered, resulting in the
+    original writes being reordered. This breaks the assmuptions of the
+    ObjectCacher, causing an assert to fail.
+    
+    To fix this, keep a per-object queue of outstanding writes to an
+    object in the LibrbdWriteback handler, and finish them in the order in
+    which they were sent.
+    
+    Fixes: #4531
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 06d05e5ed7e09fa873cc05021d16f21317a1f8ef)
+
+commit 7a11c2505a8b74babee90cca945c2a068a656ec1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Apr 10 12:22:02 2013 -0700
+
+    LibrbdWriteback: removed unused and undefined method
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 909dfb7d183f54f7583a70c05550bec07856d4e4)
+
+commit 884438febaf12dc380d4a1a3c3c8d3cbefd32399
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Apr 10 12:06:36 2013 -0700
+
+    LibrbdWriteback: use a tid_t for tids
+    
+    An int could be much smaller, leading to overflow and bad behavior.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 9d19961539b2d50d0c9edee1e3d5ac6912a37f24)
+
+commit 124f81cc5fa5a3ac9e7777ad49dd42d864fd7f68
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Apr 10 12:03:04 2013 -0700
+
+    WritebackHandler: make read return nothing
+    
+    The tid returned by reads is ignored, and would make tracking writes
+    internally more difficult by using the same id-space as them. Make read
+    void and update all implementations.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 870f9cd421ca7b0094f9f89e13b1898a8302c494)
+
+commit 13ba07a0f3af479861c0e83e3e6441fef1bc8a99
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Apr 1 14:51:46 2013 -0700
+
+    ObjectCacher: deduplicate final part of flush_set()
+    
+    Both versions of flush_set() did the same thing. Move it into a
+    helper called from both.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f5b81d8d167d1aa7f82a5776bbb1f319063ab809)
+
+commit 7bc8df1f3e3b60b59672a082eba374729a6866b8
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Apr 10 11:35:46 2013 -0700
+
+    test_stress_watch: remove bogus asserts
+    
+    There's no reason to check the duration of a watch. The notify will
+    timeout after 30s on the OSD, but there's no guarantee the client will
+    see that in any bounded time. This test is really meant as a stress
+    test of the OSDs anyway, not of the clients, so just remove asserts
+    about operation duration.
+    
+    Fixes: #4591
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sam Just <sam.just at inktank.com>
+    (cherry picked from commit 4b656730ffff21132f358c2b9a63504dfbf0998d)
+
+commit 4a1c27c0e6e2e70be2b58e01872e321352c8e484
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Apr 1 11:09:52 2013 -0700
+
+    librados: don't use lockdep for AioCompletionImpl
+    
+    This is a quick workaround for the next branch. A more complete fix
+    will be done for the master branch. This does not affect correctness,
+    just what qa runs with lockdep enabled do.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit 267ce0d90b8f3afaaddfdc0556c9bafbf4628426)
+
+commit d36c5b5bd30a9d7e60403a09cedaea28bdc29e99
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 29 12:46:27 2013 -0700
+
+    librados: move snapc creation to caller for aio_operate
+    
+    The common case already has a snapshot context, so avoid duplicating
+    it (copying a potentially large vector) in IoCtxImpl::aio_operate().
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 4c4d5591bdb048cd9ffa25b529c6127356e7f9a7)
+
+commit 31a45e8e23ebf9815ce5a4e0c89ddbf384702aad
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Mar 21 16:04:10 2013 -0700
+
+    librbd: add an async flush
+    
+    At this point it's a simple wrapper around the ObjectCacher or
+    librados.
+    
+    This is needed for QEMU so that its main thread can continue while a
+    flush is occurring. Since this will be backported, don't update the
+    librbd version yet, just add a #define that QEMU and others can use to
+    detect the presence of aio_flush().
+    
+    Refs: #3737
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 302b93c478b3f4bc2c82bfb08329e3c98389dd97)
+
+commit f2e490cb5b1f322e637d787e788733ac4b2496f4
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 27 15:42:10 2013 -0700
+
+    librbd: use the same IoCtx for each request
+    
+    Before we were duplicating the IoCtx for each new request since they
+    could have a different snapshot context or read from a different
+    snapshot id. Since librados now supports setting these explicitly
+    for a given request, do that instead.
+    
+    Since librados tracks outstanding requests on a per-IoCtx basis, this
+    also fixes a bug that causes flush() without caching to ignore
+    all the outstanding requests, since they were to separate,
+    duplicate IoCtxs.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 860493e7ff0d87d02069b243fc1c8326ce0721f9)
+
+commit cbb37fb5470f22949a4dbb747f428943cce4aca7
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 27 15:37:27 2013 -0700
+
+    librbd: add an is_complete() method to AioCompletions
+    
+    Mainly this is useful for testing, like flushing and checking that
+    all pending writes are complete after the flush finishes.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 2ae32068dee22a0ca0698e230ead98f2eeeff3e6)
+
+commit f9bcffa2482220202e68d6bac70216d44ee5046b
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 27 15:32:29 2013 -0700
+
+    librados: add versions of a couple functions taking explicit snap args
+    
+    Usually the snapid to read from or the snapcontext to send with a write
+    are determined implicitly by the IoCtx the operations are done on.
+    
+    This makes it difficult to have multiple ops in flight to the same
+    IoCtx using different snapcontexts or reading from different snapshots,
+    particularly when more than one operation may be needed past the initial
+    scheduling.
+    
+    Add versions of aio_read, aio_sparse_read, and aio_operate
+    that don't depend on the snap id or snapcontext stored in the IoCtx,
+    but get them from the caller. Specifying this information for each
+    operation can be a more useful interface in general, but for now just
+    add it for the methods used by librbd.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f06debef6c293750539501ec4e6103e5ae078392)
+
+commit fb95b800a4cc431a8bd98692fffbfc150f6f8d67
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 27 14:48:31 2013 -0700
+
+    librados: add async flush interface
+    
+    Sometimes you don't want flush to block, and can't modify
+    already scheduled aio_writes. This will be useful for a
+    librbd async flush interface.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 7cc0940f89070dadab5b9102b1e78362f762f402)
+    
+    Conflicts:
+    
+    	src/include/rados/librados.h
+    	src/include/rados/librados.hpp
+
+commit 3a61d17b6729b73d0bf2df106f54dafb603af646
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Mar 28 10:34:37 2013 -0700
+
+    ObjectCacher: remove unneeded var from flush_set()
+    
+    The gather will only have subs if there is something to flush. Remove
+    the safe variable, which indicates the same thing, and convert the
+    conditionals that used it to an else branch. Movinig gather.activate()
+    inside the has_subs() check has no effect since activate() does
+    nothing when there are no subs.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 553aaac8a19e2359acf6d9d2e1bb4ef0bdba7801)
+
+commit ee7bf281005cce671e467ca9b9eff0ba7eb9899e
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 22 12:17:43 2013 -0700
+
+    ObjectCacher: remove NULL checks in flush_set()
+    
+    Callers will always pass a callback, so assert this and remove the
+    checks for it being NULL.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 41568b904de6d155e5ee87c68e9c31cbb69508e5)
+
+commit d86f9b1dd370563170ab875c6a7de511f05acbf7
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 22 12:13:36 2013 -0700
+
+    ObjectCacher: always complete flush_set() callback
+    
+    This removes the last remnants of
+    b5e9995f59d363ba00d9cac413d9b754ee44e370. If there's nothing to flush,
+    immediately call the callback instead of deleting it. Callers were
+    assuming they were responsible for completing the callback whenever
+    flush_set() returned true, and always called complete(0) in this
+    case. Simplify the interface and just do this in flush_set(), so that
+    it always calls the callback.
+    
+    Since C_GatherBuilder deletes its finisher if there are no subs,
+    only set its finisher when subs are present. This way we can still
+    call ->complete() for the callback.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 92db06c05dc2cad8ed31648cb08866781aee2855)
+    
+    Conflicts:
+    
+    	src/client/Client.cc
+
+commit 00dfb3f06fb6c2581a3f71126adcde0126e5e207
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Jan 29 14:22:15 2013 -0800
+
+    ObjectCacher: fix flush_set when no flushing is needed
+    
+    C_GatherBuilder takes ownership of the Context we pass it. Deleting it
+    in flush_set after constructing the C_GatherBuilder results in a
+    double delete.
+    
+    Fixes: #3946
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sam Lang <sam.lang at inktank.com>
+    (cherry picked from commit 3bc21143552b35698c9916c67494336de8964d2a)
+
+commit 0f2e5d36e4dcd073174715c310fa22a835ca1259
+Author: Sam Lang <sam.lang at inktank.com>
+Date:   Fri Jan 18 14:59:12 2013 -0600
+
+    objectcacher: Remove commit_set, use flush_set
+    
+    commit_set() and flush_set() are identical in functionality,
+    so use flush_set everywhere and remove commit_set from
+    the code.
+    
+    Also fixes a bug in flush_set where the finisher context was
+    getting freed twice if no objects needed to be flushed.
+    
+    Signed-off-by: Sam Lang <sam.lang at inktank.com>
+    (cherry picked from commit 72147fd3a1da8ecbcb31ddf6b66a158d71933909)
+
+commit 3b0c565dceb41dcaf53965321ef420641bcb699b
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 13 09:42:43 2013 -0700
+
+    librbd: make aio_writes to the cache always non-blocking by default
+    
+    When the ObjectCacher's writex blocks, it affects the thread requesting
+    the aio, which can cause starvation for other I/O when used by QEMU.
+    
+    Preserve the old behavior via a config option in case this has any
+    bad side-effects, like too much memory usage under heavy write loads.
+    
+    Fixes: #4091
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 03ac01fa6a94fa7a66ede057e9267e0a562c3cdb)
+
+commit e237dfc742bba76664861a8868c502946fe53548
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 13 09:37:21 2013 -0700
+
+    ObjectCacher: optionally make writex always non-blocking
+    
+    Add a callback argument to writex, and a finisher to run the
+    callbacks. Move the check for dirty+tx > max_dirty into a helper that
+    can be called from a wrapper around the callbacks from writex, or from
+    the current place in _wait_for_write().
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit c21250406eced8e5c467f492a2148c57978634f4)
+
+commit 7bc1596b90d2d5853659cb3ffbe9653b633345f4
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 27 17:30:42 2013 -0700
+
+    librbd: flush cache when set_snap() is called
+    
+    If there are writes pending, they should be sent while the image
+    is still writeable. If the image becomes read-only, flushing the
+    cache will just mark everything dirty again due to -EROFS.
+    
+    Fixes: #4525
+    Backport: bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 613b7085bb48cde1e464b7a97c00b8751e0e917f)
+
+commit 9facdcac7bb8ab92f1ab486eaabee681e6b6519d
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 15 17:28:13 2013 -0700
+
+    librbd: optionally wait for a flush before enabling writeback
+    
+    Older guests may not send flushes properly (i.e. never), so if this is
+    enabled, rbd_cache=true is safe for them transparently.
+    
+    Disable by default, since it will unnecessarily slow down newer guest
+    boot, and prevent writeback caching for things that don't need to send
+    flushes, like the command line tool.
+    
+    Refs: #3817
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1597b3e3a1d776b56e05c57d7c3de396f4f2b5b2)
+
+commit 1c44b66fb371a5864860c067bb5f59374f43005d
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 8 18:57:24 2013 -0800
+
+    librbd: invalidate cache when flattening
+    
+    The cache stores which objects don't exist. Flatten bypasses the cache
+    when doing its copyups, so when it is done the -ENOENT from the cache
+    is treated as zeroes instead of 'need to read from parent'.
+    
+    Clients that have the image open need to forgot about the cached
+    non-existent objects as well. Do this during ictx_refresh, while the
+    parent_lock is held exclusively so no new reads from the parent can
+    happen until the updated parent metadata is visible, so no new reads
+    from the parent will occur.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 46e8fc00b2dc8eb17d8777b6ef5ad1cfcc389cea)
+
+commit d9ca1b00a4dacb4715a69a276a644d645d0d5bc1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 8 17:53:31 2013 -0800
+
+    ObjectCacher: add a method to clear -ENOENT caching
+    
+    Clear the exists and complete flags for any objects that have exists
+    set to false, and force any in-flight reads to retry if they get
+    -ENOENT instead of generating zeros.
+    
+    This is useful for getting the cache into a consistent state for rbd
+    after an image has been flattened, since many objects which previously
+    did not exist and went up to the parent to retrieve data may now exist
+    in the child.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f2a23dc0b092c5ac081893e8f28c6d4bcabd0c2e)
+
+commit 1e51be05b7909a676ae499ca84e4cce94bb50da4
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Mar 8 17:49:27 2013 -0800
+
+    ObjectCacher: keep track of outstanding reads on an object
+    
+    Reads always use C_ReadFinish as a callback (and they are the only
+    user of this callback). Keep an xlist of these for each object, so
+    they can remove themselves as they finish. To prevent racing requests
+    and with discard removing objects from the cache, clear the xlist in
+    the object destructor, so if the Object is still valid the set_item
+    will still be on the list.
+    
+    Make the ObjectCacher constructor take an Object* instead of the pool
+    and object id, which are derived from the Object* anyway.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f6f876fe51e40570596c25ac84ba3689f72776c2)
+
+commit f2bcf241257500f5784b216b7a377ddec4669531
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 25 16:09:26 2013 -0800
+
+    test_rbd: move flatten tests back into TestClone
+    
+    They need the same setup, and it's easy enough to run specific
+    subtests. Making them a separate subclass accidentally duplicated
+    tests from TestClone.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 9c693d7e8312026f6d8d9586381b026ada35d808)
+
+commit cd989681823a2b8521c789f5d4fea5525ac53911
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Feb 26 13:20:08 2013 -0800
+
+    librbd: fix rollback size
+    
+    The duplicate calls to get_image_size() and get_snap_size() replaced
+    by 5806226cf0743bb44eaf7bc815897c6846d43233 uncovered this. The first
+    call was using the currently set snap_id instead of the snapshot being
+    rolled back to.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit d6c126e2131fefab6df676f2b9d0addf78f7a488)
+
+commit 796066b7a8324b12a660d9b80b927e643db7529e
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 25 12:05:16 2013 -0800
+
+    Merge branch 'wip-4249' into wip-4249-master
+    
+    Make snap_rollback() only take a read lock on snap_lock, since
+    it does not modify snapshot-related fields.
+    Conflicts:
+    	src/librbd/internal.cc
+    (cherry picked from commit db5fc2270f91aae220fc3c97b0c62e92e263527b)
+
+commit 34e9030e50fe15a320cbfbc9854c86deb3a9c57c
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Feb 21 11:26:45 2013 -0800
+
+    librbd: make sure racing flattens don't crash
+    
+    The only way for a parent to disappear is a racing flatten completing,
+    or possibly in the future the image being forcibly removed. In either
+    case, continuing to flatten makes no sense, so stop early.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit a1ae8562877d1b902918e866a1699214090c40bd)
+
+commit 6e6636d50840e97022c8e4a1072f42fee15050a9
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Feb 21 11:17:18 2013 -0800
+
+    librbd: use rwlocks instead of mutexes for several fields
+    
+    Image metadata like snapshots, size, and parent is frequently read,
+    but rarely updated. During flatten, we were depending on the parent
+    lock to prevent the parent ImageCtx from disappearing out from under
+    us while we read from it. The copy-up path also needed the parent lock
+    to be able to read from the parent image, which lead to a deadlock.
+    
+    Convert parent_lock, snap_lock, and md_lock to RWLocks, and change
+    their use to read instead of exclusive locks where appropriate. The
+    main place exclusive locks are needed is in ictx_refresh, so this is
+    pretty simple. This fixes the deadlock, since parent_lock is only
+    needed for read access in both flatten and the copy-up operation.
+    
+    cache_lock and refresh_lock are only really used for exclusive access,
+    so leave them as regular mutexes.
+    
+    One downside to this is that there's no way to assert is_locked()
+    for RWLocks, so we'll have to be very careful about changing code
+    in the future.
+    
+    Fixes: #3665
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 995ff0e3eaa560b242da8c019a2e11e735e854f7)
+
+commit 9b292199ef63822462c67cb6cf1cca6a53cf9fd7
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Feb 21 11:15:41 2013 -0800
+
+    common: add lockers for RWLocks
+    
+    This makes them easier to use, especially instead of existing mutexes.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e0f8e5a80d6d22bd4dee79a4996ea7265d11b0c1)
+
+commit d8ac6cbf883fce0f39d661a879ff2462479d5494
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Feb 21 23:22:59 2013 -0800
+
+    objecter: initialize linger op snapid
+    
+    Since they are write ops now, it must be CEPH_NOSNAP or the OSD
+    returns EINVAL.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 15bb9ba9fbb4185708399ed6deee070d888ef6d2)
+
+commit 9ea4dac1db46c20cd83c5af5d29d9ce7a5768380
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 21 15:44:19 2013 -0800
+
+    objecter: separate out linger_read() and linger_mutate()
+    
+    A watch is a mutation, while a notify is a read.  The mutations need to
+    pass in a proper snap context to be fully correct.
+    
+    Also, make the WRITE flag implicit so the caller doesn't need to pass it
+    in.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6c08c7c1c6d354d090eb16df279d4b63ca7a355a)
+
+commit d9636faabfdb2c0a876f0afa092a2ab925cf8983
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 21 15:31:08 2013 -0800
+
+    osd: make watch OSDOp print sanely
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit de4fa95f03b99a55b5713911c364d7e2a4588679)
+
+commit 959bfe9097a2cfa48e2ab21f11bd32c1349807aa
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 21 13:28:47 2013 -0800
+
+    osdc/Objecter: unwatch is a mutation, not a read
+    
+    This was causing librados to unblock after the ACK on unwatch, which meant
+    that librbd users raced and tried to delete the image before the unwatch
+    change was committed..and got EBUSY.  See #3958.
+    
+    The watch operation has a similar problem.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fea77682a6cf9c7571573bc9791c03373d1d976d)
+    
+    Conflicts:
+    
+    	src/librados/IoCtxImpl.cc
+
+commit b6b4ebed559db8bf74da4f482201948b5abc9225
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 21 11:15:58 2013 -0800
+
+    osd: an interval can't go readwrite if its acting is empty
+    
+    Let's not forget that min_size can be zero.
+    
+    Fixes: #4159
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4277265d99647c9fe950ba627e5d86234cfd70a9)
+
+commit 055d746c3bca0d7067b71ed1ff6d1c1cce42b5ed
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 19 08:29:53 2013 -0800
+
+    mon: restrict pool size to 1..10
+    
+    See: #4159
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 30b8d653751acb4bc4be5ca611f154e19afe910a)
+
+commit c073bd25610ba556f3b30e6c583d1d74a10f09e2
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Apr 19 13:05:43 2013 -0700
+
+    init-ceph: do not stop start on first failure
+    
+    When starting we often loop over many daemon instances.  Currently we stop
+    on the first error and do not try to start other daemons.
+    
+    Instead, try them all, but return a failure if anything did not start.
+    
+    Fixes: #2545
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Gary Lowell <gary.lowell at inktank.com>
+    (cherry picked from commit d395aa521e8a4b295ed2b08dd7cfb7d9f995fcf7)
+    
+    Conflicts:
+    
+    	src/init-ceph.in
+
+commit daa6ed2bfe790f83f986f51d0917d6268d3e9d78
+Merge: 1d0bf61 9fe57e2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Apr 11 13:00:27 2013 -0700
+
+    Merge pull request #210 from dalgaaf/wip-da-bobtail-pybind
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 9fe57e2bea89243a0080e667f90b7d4fb15ed883
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Apr 5 15:55:34 2013 +0200
+
+    rados.py: fix create_pool()
+    
+    Call rados_pool_create_with_all() only if auid and crush_rule
+    are set properly. In case only crush_rule is set call
+    rados_pool_create_with_crush_rule() on librados, not the other
+    way around.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 94a1f25e7230a700f06a2699c9c2b99ec1bf7144)
+
+commit 1d0bf61da98bec7318f44b95a49298e13b792b70
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Apr 8 13:52:32 2013 -0700
+
+    mon: Use _daemon version of argparse functions
+    
+    Allow argparse functions to fail if no argument given by using
+    special versions that avoid the default CLI behavior of "cerr/exit"
+    
+    Fixes: #4678
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit be801f6c506d9fbfb6c06afe94663abdb0037be5)
+    
+    Conflicts:
+    	src/mon/Monitor.cc
+
+commit 3769250acf42a751ee8dfa95207a4ffafd25574a
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Apr 8 13:49:22 2013 -0700
+
+    ceph_argparse: add _daemon versions of argparse calls
+    
+    mon needs to call argparse for a couple of -- options, and the
+    argparse_witharg routines were attempting to cerr/exit on missing
+    arguments.  This is appropriate for the CLI usage, but not the daemon
+    usage.  Add a 'cli' flag that can be set false for the daemon usage
+    (and cause the parsing routine to return false instead of exit).
+    
+    The daemon's parsing code due for a rewrite soon.
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit c76bbc2e6df16d283cac3613628a44937e38bed8)
+
+commit 1f3b4917cc5c4d796a96637912d2ae5ce2877861
+Author: Alexandre Oliva <oliva at gnu.org>
+Date:   Wed Feb 6 15:27:13 2013 -0200
+
+    silence logrotate some more
+    
+    I was getting email with logrotate error output from “which invoke-rc.d”
+    on systems without an invoke-rc.d.  This patch silences it.
+    
+    Silence stderr from which when running logrotate
+    
+    From: Alexandre Oliva <oliva at gnu.org>
+    
+    Signed-off-by: Alexandre Oliva <oliva at gnu.org>
+    (cherry picked from commit d02340d90c9d30d44c962bea7171db3fe3bfba8e)
+
+commit e6eace2334d04fc9292c96a843304d1748b5bbe7
+Merge: 8cb13a1 1507443
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Mar 29 12:14:22 2013 -0700
+
+    Merge remote-tracking branch 'upstream/bobtail-4556' into bobtail
+    
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit 8cb13a195c592fd2f17889e77d717c1864f97dca
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Feb 14 14:03:56 2013 -0800
+
+    OSD: always activate_map in advance_pgs, only send messages if up
+    
+    We should always handle_activate_map() after handle_advance_map() in
+    order to kick the pg into a valid peering state for processing requests
+    prior to dropping the lock.
+    
+    Additionally, we would prefer to avoid sending irrelevant messages
+    during boot, so only send if we are up according to the current service
+    osdmap.
+    
+    Fixes: #4572
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4dfcad44431855ba7d68a1ccb41dc3cb5db6bb50)
+
+commit d89ab0ea6fa8d0961cad82f6a81eccbd3bbd3f55
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Mar 28 14:09:17 2013 -0700
+
+    PG: update PGPool::name in PGPool::update
+    
+    Fixes: #4471
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f804892d725cfa25c242bdc577b12ee81dcc0dcc)
+
+commit 750626108616761512271d5a4f10dee82a54e460
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Mar 26 15:10:37 2013 -0700
+
+    ReplicatedPG: send entire stats on OP_BACKFILL_FINISH
+    
+    Otherwise, we update the stat.stat structure, but not the
+    stat.invalid_stats part.  This will result in a recently
+    split primary propogating the invalid stats but not the
+    invalid marker.  Sending the whole pg_stat_t structure
+    also mirrors MOSDSubOp.
+    
+    Fixes: #4557
+    Backport: bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 76b296f01fd0d337c8fc9f79013883e62146f0c6)
+
+commit 1507443271fda933032ef0877aff1890d4fd5b63
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 13:19:03 2013 -0700
+
+    osd: disallow classes with flags==0
+    
+    They must be RD, WR, or something....
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 89c69016e1dddb9f3ca40fd699e4a995ef1e3eee)
+
+commit 6b6e0cef99e66b46ade35ab262f071982049bc22
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 12:59:41 2013 -0700
+
+    osd: EINVAL when rmw_flags is 0
+    
+    A broken client (e.g., v0.56) can send a request that ends up with an
+    rmw_flags of 0.  Treat this as invalid and return EINVAL.
+    
+    Fixes: #4556
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f2dda43c9ed4fda9cfa87362514985ee79e0ae15)
+
+commit 4bdd37495cedb1cf30a5311548492fe3f5db6e92
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 13:08:38 2013 -0700
+
+    osd: fix detection of non-existent class method
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 50b831e3641c21cd5b145271688189e199f432d1)
+
+commit f28800f8b65e90a3b96429f07197236e6c9bf1a2
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 27 13:12:38 2013 -0700
+
+    osd: tolerate rmw_flags==0
+    
+    We will let OSD return a proper error instead of asserting.
+    
+    This is effectively a backport of c313423cfda55a2231e000cd5ff20729310867f8.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 94321ccdff81d5d6cea1acdb54344c3d930a49eb
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Feb 21 17:39:19 2013 -0800
+
+    test_librbd_fsx: fix image closing
+    
+    Always close the image we opened in check_clone(), and check the
+    return code of the rbd_close() called before cloning.
+    
+    Refs: #3958
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 94ae72546507799667197fd941633bb1fd2520c2)
+
+commit 7fbc1ab69267e6be96665b0d4e277dc4a07f9220
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 13 17:05:42 2013 -0700
+
+    rbd: remove fiemap use from import
+    
+    On some kernels and filesystems fiemap can be racy and provide
+    incorrect data even after an fsync. Later we can use SEEK_HOLE and
+    SEEK_DATA, but for now just detect zero runs like we do with stdin.
+    
+    Basically this adapts import from stdin to work in the case of a file
+    or block device, and gets rid of other cruft in the import that used
+    fiemap.
+    
+    Fixes: #4388
+    Backport: bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 3091283895e8ffa3e4bda13399318a6e720d498f)
diff --git a/doc/changelog/v0.56.6.txt b/doc/changelog/v0.56.6.txt
new file mode 100644
index 0000000..17818d2
--- /dev/null
+++ b/doc/changelog/v0.56.6.txt
@@ -0,0 +1,40 @@
+commit 95a0bda7f007a33b0dc7adf4b330778fa1e5d70c
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri May 3 12:53:00 2013 -0700
+
+    v0.56.6
+
+commit 6dbdcf5a210febb5e0dd585e0e599ac807642210
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri May 3 12:45:24 2013 -0700
+
+    ceph.spec.in:  Fix platform dependecies
+
+    Picked up an incorrect dependency merging the rbd udev rules update.
+
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 05af17e697eb95b2a807d9c05cde39106c5ecee9
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Apr 22 12:48:56 2013 -0700
+
+    rgw: don't send tail to gc if copying object to itself
+
+    Fixes: #4776
+    Backport: bobtail
+    Need to make sure that when copying an object into itself we don't
+    send the tail to the garbage collection.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit de5d1da810732ee48f41e8be18257053d862301b)
+
+commit f0eb20a7b0f7c8afadc21cc063f1f289b5092bab
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 3 12:24:21 2013 -0700
+
+    ceph_common.sh: re-sync get_name_list with master
+
+    We backported various items but didn't catch all the changes!  :(
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
diff --git a/doc/changelog/v0.56.7.txt b/doc/changelog/v0.56.7.txt
new file mode 100644
index 0000000..b01c0de
--- /dev/null
+++ b/doc/changelog/v0.56.7.txt
@@ -0,0 +1,454 @@
+commit 14f23ab86b0058a8651895b3dc972a29459f3a33
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Tue Aug 27 10:44:32 2013 -0700
+
+    v0.56.7
+
+commit 8551be345c86837e0893fdf6c9c5b0af523f50f8
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 21 14:28:49 2013 -0700
+
+    objecter: resend unfinished lingers when osdmap is no longer paused
+
+    Plain Ops that haven't finished yet need to be resent if the osdmap
+    transitions from full or paused to unpaused.  If these Ops are
+    triggered by LingerOps, they will be cancelled instead (since
+    should_resend = false), but the LingerOps that triggered them will not
+    be resent.
+
+    Fix this by checking the registered flag for all linger ops, and
+    resending any of them that aren't paused anymore.
+
+    Fixes: #6070
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit 38a0ca66a79af4b541e6322467ae3a8a4483cc72)
+
+commit 1670a73b56e0b407b65334d8f03d3ebb9558ac8b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 13 12:52:41 2013 -0700
+
+    librados: fix async aio completion wakeup
+
+    For aio flush, we register a wait on the most recent write.  The write
+    completion code, however, was *only* waking the waiter if they were waiting
+    on that write, without regard to previous writes (completed or not).
+    For example, we might have 6 and 7 outstanding and wait on 7.  If they
+    finish in order all is well, but if 7 finishes first we do the flush
+    completion early.  Similarly, if we
+
+     - start 6
+     - start 7
+     - finish 7
+     - flush; wait on 7
+     - finish 6
+
+    we can hang forever.
+
+    Fix by doing any completions that are prior to the oldest pending write in
+    the aio write completion handler.
+
+    Refs: #5919
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Tested-by: Oliver Francke <Oliver.Francke at filoo.de>
+    (cherry picked from commit 16ed0b9af8bc08c7dabead1c1a7c1a22b1fb02fb)
+
+commit 6cf05375abea26d2645e3301c9082c64ddf31a55
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Aug 12 19:17:09 2013 -0700
+
+    librados: fix locking for AioCompletionImpl refcounting
+
+    Add an already-locked helper so that C_Aio{Safe,Complete} can
+    increment the reference count when their caller holds the
+    lock. C_AioCompleteAndSafe's caller is not holding the lock, so call
+    regular get() to ensure no racing updates can occur.
+
+    This eliminates all direct manipulations of AioCompletionImpl->ref,
+    and makes the necessary locking clear.
+
+    The only place C_AioCompleteAndSafe is used is in handling
+    aio_flush_async(). This could cause a missing completion.
+
+    Refs: #5919
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Tested-by: Oliver Francke <Oliver.Francke at filoo.de>
+    (cherry picked from commit 7a52e2ff5025754f3040eff3fc52d4893cafc389)
+
+commit 6a37a62b6f794026b82b88630519ec2cde4f20d6
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 12 10:05:44 2013 -0700
+
+    rgw: fix multi delete
+
+    Fixes: #5931
+    Backport: bobtail, cuttlefish
+
+    Fix a bad check, where we compare the wrong field. Instead of
+    comparing the ret code to 0, we compare the string value to 0
+    which generates implicit casting, hence the crash.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f9f1c48ad799da2b4be0077bf9d61ae116da33d7)
+
+    Conflicts:
+	src/rgw/rgw_rest_s3.cc
+
+commit 586c68f544c95f9e379df7e4d2705a3090baca49
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 21:21:09 2013 -0700
+
+    ceph-fuse: create finisher threads after fork()
+
+    The ObjectCacher and MonClient classes both instantiate Finisher
+    threads.  We need to make sure they are created *after* the fork(2)
+    or else the process will fail to join() them on shutdown, and the
+    threads will not exist while fuse is doing useful work.
+
+    Put CephFuse on the heap and move all this initalization into the child
+    block, and make sure errors are passed back to the parent.
+
+    Fix-proposed-by: Alexandre Marangone <alexandre.maragone at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit c1198d680587928b390bb82c87442384331afd40
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 21 16:22:08 2013 -0700
+
+    debian: update postinst, prerm hooks
+
+    This syncs up the hooks with the latest master versions.  In particular,
+    do not blindly stop/restart daemons on package upgrade!
+
+    Fixes: #5414
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit de8900dcd079207852b6ce0b51473037be9ae956
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 18 21:33:09 2013 -0700
+
+    os/FileStore: use fdatasync(2) instead of sync_file_range(2)
+
+    This fixes data corruption on XFS.  Backported from
+    ffade3c85dfffa13a16edd9630a52d99eb8a413d.
+
+    Fixes: #4976
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit cbbad5b5d917fe74d6cbc50a259f9dbaeda54ca8
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 20:06:59 2013 -0700
+
+    chmod +x iogen.sh
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit fcd65139135d907098a47427d8503ac6d6042f81
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Jun 14 14:53:54 2013 -0700
+
+    rgw: escape prefix correctly when listing objects
+
+    Fixes: #5362
+    When listing objects prefix needs to be escaped correctly (the
+    same as with the marker). Otherwise listing objects with prefix
+    that starts with underscore doesn't work.
+    Backport: bobtail, cuttlefish
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit a8f9d57a15ad7a69d53aa8fc6090fd1b394b616a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Sun Mar 31 00:02:15 2013 -0700
+
+    rgw: translate object marker to raw format
+
+    Fixes: #4600
+    Object marker should be treated as an object, so that name is formatted
+    correctly when getting the raw oid.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b083dece36a050ec15ac41a275aeef0ece1ac009)
+
+commit e1d41901cde97a77fc1fda2d7f6e78a7cea61c5c
+Author: tamil <tamil.muthamizhan at inktank.com>
+Date:   Thu Jun 13 13:50:56 2013 -0700
+
+    adding iogen.sh
+
+    Signed-off-by: tamil <tamil.muthamizhan at inktank.com>
+
+commit 32b2f11366418f9a0cc0659be22cf15fbafbe3b1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 6 16:35:54 2013 -0700
+
+    osd: do not include logbl in scrub map
+
+    This is a potentially use object/file, usually prefixed by a zeroed region
+    on disk, that is not used by scrub at all.  It dates back to
+    f51348dc8bdd5071b7baaf3f0e4d2e0496618f08 (2008) and the original version of
+    scrub.
+
+    This *might* fix #4179.  It is not a leak per se, but I observed 1GB
+    scrub messages going over the write.  Maybe the allocations are causing
+    fragmentation, or the sub_op queues are growing.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0b036ecddbfd82e651666326d6f16b3c000ade18)
+
+commit 5047a4ff16f556ec25b6624fe8f1a07e3ec5f864
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 6 21:53:00 2013 -0700
+
+    rgw: handle deep uri resources
+
+    In case of deep uri resources (ones created beyond a single level
+    of hierarchy, e.g. auth/v1.0) we want to create a new empty
+    handlers for the path if no handlers exists. E.g., for
+    auth/v1.0 we need to have a handler for 'auth', otherwise
+    the default S3 handler will be used, which we don't want.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit ad3934e335399f7844e45fcfd17f7802800d2cb3)
+
+commit 3ea45533c18174cb49af52024dae27533971fa01
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 6 21:47:21 2013 -0700
+
+    rgw: fix get_resource_mgr() to correctly identify resource
+
+    Fixes: #5262
+    The original test was not comparing the correct string, ended up
+    with the effect of just checking the substring of the uri to match
+    the resource.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 8d55b87f95d59dbfcfd0799c4601ca37ebb025f5)
+
+commit 4ee638cc3b1d74e678a3f78b3a57baf57a5d407c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Apr 15 16:33:48 2013 -0700
+
+    PG: don't write out pg map epoch every handle_activate_map
+
+    We don't actually need to write out the pg map epoch on every
+    activate_map as long as:
+    a) the osd does not trim past the oldest pg map persisted
+    b) the pg does update the persisted map epoch from time
+    to time.
+
+    To that end, we now keep a reference to the last map persisted.
+    The OSD already does not trim past the oldest live OSDMapRef.
+    Second, handle_activate_map will trim if the difference between
+    the current map and the last_persisted_map is large enough.
+
+    Fixes: #4731
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 8c6a912ae46c4d3aeb7c1000d221f67e158ec5c8
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu May 30 12:58:11 2013 -0700
+
+    rgw: only append prefetched data if reading from head
+
+    Fixes: #5209
+    Backport: bobtail, cuttlefish
+    If the head object wrongfully contains data, but according to the
+    manifest we don't read from the head, we shouldn't copy the prefetched
+    data. Also fix the length calculation for that data.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit c5fc52ae0fc851444226abd54a202af227d7cf17)
+
+commit f42e84ee3148dcc59a05c8a12ce39996eb854e26
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu May 30 09:34:21 2013 -0700
+
+    rgw: don't copy object idtag when copying object
+
+    Fixes: #5204
+    When copying object we ended up also copying the original
+    object idtag which overrode the newly generated one. When
+    refcount put is called with the wrong idtag the count
+    does't go down.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit b1312f94edc016e604f1d05ccfe2c788677f51d1)
+
+commit d86b9a852b57553448709c2b978ac3a8637cd63f
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 16:50:04 2013 -0700
+
+    osd: initialize new_state field when we use it
+
+    If we use operator[] on a new int field its value is undefined; avoid
+    reading it or using |= et al until we initialize it.
+
+    Fixes: #4967
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 50ac8917f175d1b107c18ecb025af1a7b103d634)
+
+commit fca54bfbb35f0c200fac52963cd2d1780467f59a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 28 11:10:05 2013 -0700
+
+    HashIndex: sync top directory during start_split,merge,col_split
+
+    Otherwise, the links might be ordered after the in progress
+    operation tag write.  We need the in progress operation tag to
+    correctly recover from an interrupted merge, split, or col_split.
+
+    Fixes: #5180
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5bca9c38ef5187c7a97916970a7fa73b342755ac)
+
+commit ac6c77830ad9182c7345f10943ea4f537c1629b0
+Merge: 3984b98 0b50d07
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 19:29:06 2013 -0700
+
+    Merge remote-tracking branch 'upstream/wip_scrub_tphandle_bobtail' into bobtail
+
+    Fixes: #5159
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 0b50d073fab11f64682e20fec7bb71d4e931bd3c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 17:40:44 2013 -0700
+
+    PG: ping tphandle during omap loop as well
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 5979a26d521918d74fc3b62b75c9fb6afe109933
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 15:24:39 2013 -0700
+
+    PG: reset timeout in _scan_list for each object, read chunk
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit bde6b58baf5e78550980ee5076bbc2d72a52c0fc
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 15:23:05 2013 -0700
+
+    OSD,PG: pass tphandle down to _scan_list
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 3984b98804bf18711a7a4fc3940143ab599ad5b5
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed May 22 21:34:52 2013 -0700
+
+    rgw: iterate usage entries from correct entry
+
+    Fixes: #5152
+    When iterating through usage entries, and when user id was
+    provided, we started at the user's first entry and not from
+    the entry indexed by the request start time.
+    This commit fixes the issue.
+
+    Backport: bobtail
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 8b3a04dec8be13559716667d4b16cde9e9543feb)
+
+commit 3d7f8f840fb9fd975089af32c85093eeb1eac338
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 22 12:45:27 2013 -0700
+
+    mon: be a bit more verbose about osd mark down events
+
+    Put these in the cluster log; they are interesting.
+
+    This is a backport of 87767fb1fb9a52d11b11f0b641cebbd9998f089e.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit f21a7f7bf3db61bd533e777297bff1346112a0db
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 3 12:57:00 2013 -0700
+
+    rgw: protect ops log socket formatter
+
+    Fixes: #4905
+    Ops log (through the unix domain socket) uses a formatter, which wasn't
+    protected.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit d48f1edb07a4d8727ac956f70e663c1b4e33e1dd)
+
+commit 49c04c623466df45003ed2a18445c354c424a078
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu May 16 15:28:40 2013 -0700
+
+    librbd: make image creation defaults configurable
+
+    Programs using older versions of the image creation functions can't
+    set newer parameters like image format and fancier striping.
+
+    Setting these options lets them use all the new functionality without
+    being patched and recompiled to use e.g. rbd_create3().
+    This is particularly useful for things like qemu-img, which does not
+    know how to create format 2 images yet.
+
+    Refs: #5067
+    backport: cuttlefish, bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit aacc9adc4e9ca90bbe73ac153cc754a3a5b2c0a1)
+
+commit 4d7058fe2254f335969f05bef649b1a27d470aa4
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu May 16 15:21:24 2013 -0700
+
+    rbd.py: fix stripe_unit() and stripe_count()
+
+    These matched older versions of the functions, but would segfault
+    using the current versions.
+
+    backport: cuttlefish, bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 53ee6f965e8f06c7256848210ad3c4f89d0cb5a0)
+
+commit 82a16c32a37dc46e3019cedc2a5407ae34f806e2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu May 16 15:19:46 2013 -0700
+
+    cls_rbd: make sure stripe_unit is not larger than object size
+
+    Test a few other cases too.
+
+    backport: cuttlefish, bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 810306a2a76eec1c232fd28ec9c351e827fa3031)
+
+commit e0de00897468a434e94790a86fc812b77a59614c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 10 22:14:05 2013 -0700
+
+    mon: fix validatation of mds ids in mon commands
+
+    Fixes: #4996
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5c305d63043762027323052b4bb3ae3063665c6f)
+
+    Conflicts:
+
+	src/mon/MDSMonitor.cc
diff --git a/doc/changelog/v0.61.1.txt b/doc/changelog/v0.61.1.txt
new file mode 100644
index 0000000..4dbbe97
--- /dev/null
+++ b/doc/changelog/v0.61.1.txt
@@ -0,0 +1,139 @@
+commit 56c4847ba82a92023700e2d4920b59cdaf23428d
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed May 8 17:23:47 2013 -0700
+
+    v0.61.1
+
+commit 3b94f03ec58abe3d7a6d0359ff9b4d75826f3777
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 2 14:13:07 2013 -0700
+
+    mon: dump MonitorDBStore transactions to file
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 797089ef082b99910eebfd9454c03d1f027c93bb)
+
+commit 9143d6d0d0ebaaee81622587dc21a3d562b05c9c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 6 14:21:28 2013 -0700
+
+    osd: optionally enable leveldb logging
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0b4c5c1a3349670d11cc3c4fb3c4b3c1a80b2502)
+
+commit 8f456e89ec38f37ae4b444f5cabccd9fc0e415b8
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 6 14:13:50 2013 -0700
+
+    mon: allow leveldb logging
+    
+    'mon leveldb log = filename'
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c1d5f815546b731e10bfcb81cbcd48b7d432e9c4)
+
+commit 306ebc6a9164feab084123f91a0fe928125f4b74
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Wed May 8 16:33:05 2013 -0700
+
+    debian/control:  squeeze requres cryptsetup package
+    
+    Squeeze requires the cryptsetup package which has been renamed
+    cryptsetup-bin in later versions.  Allow either package to
+    satisfy the dependency.
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+    (cherry picked from commit 83bbae415de16f708ca1cb24861ddbb0bd514a7f)
+
+commit e0c0a5c1a711263d234b70b454aca07c23e98243
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed May 8 12:18:49 2013 -0700
+
+    osd: don't assert if get_omap_iterator() returns NULL
+    
+    Fixes: #4949
+    This can happen if the object does not exist and it's
+    a write operation. Just return -ENOENT.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 36ec6f9bce63641f4fc2e4ab04d03d3ec1638ea0)
+
+commit 82b9299512537b8d921caa044107472adacbdabe
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 8 14:54:33 2013 -0700
+
+    ceph-create-keys: gracefully handle no data from admin socket
+    
+    Old ceph-mon (prior to 393c9372f82ef37fc6497dd46fc453507a463d42) would
+    return an empty string and success if the command was not registered yet.
+    Gracefully handle that case by retrying.
+    
+    If we still fail to parse, exit entirely with EINVAL.
+    
+    Fixes: #4952
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at intank.com>
+    (cherry picked from commit e2528ae42c455c522154c9f68b5032a3362fca8e)
+
+commit ee3da880fbc0488467c30b1d0b635e3c50e23cc3
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 8 14:35:54 2013 -0700
+
+    init-ceph: fix osd_data location when checking df utilization
+    
+    Do not assume default osd data location.
+    
+    Fixes: #4951
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Gary Lowelll <gary.lowell at inktank.com>
+    (cherry picked from commit f2a54cc9c98a9f31aef049c74ea932b2d9000d3c)
+
+commit 4848fac24224879bcdc4fcf202d6ab689d8d990f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 7 16:41:22 2013 -0700
+
+    OSD: handle stray snap collections from upgrade bug
+    
+    Previously, we failed to clear snap_collections, which causes split to
+    spawn a bunch of snap collections.  In load_pgs, we now clear any such
+    snap collections and then snap_collections field on the PG itself.
+    
+    Related: #4927
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8e89db89cb36a217fd97cbc1f24fd643b62400dc)
+
+commit dc6b9e6b2e8c1b41e982430795ff41a65a5813dc
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 7 16:35:57 2013 -0700
+
+    PG: clear snap_collections on upgrade
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 252d71a81ef4536830a74897c84a7015ae6ec9fe)
+
+commit b514941ba5f49b6465082e4906b7f4022631bfb3
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 7 16:34:57 2013 -0700
+
+    OSD: snap collections can be ignored on split
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 438d9aa152e546b2008ec355b481df71aa1c51a5)
+
+commit 30ffca77df006a244044604074779af538721f14
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 8 11:05:29 2013 -0700
+
+    ceph: return error code when failing to get result from admin socket
+    
+    Make sure we return a non-zero result code when we fail to read something
+    from the admin socket.
+    
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 393c9372f82ef37fc6497dd46fc453507a463d42)
diff --git a/doc/changelog/v0.61.2.txt b/doc/changelog/v0.61.2.txt
new file mode 100644
index 0000000..b57c7e6
--- /dev/null
+++ b/doc/changelog/v0.61.2.txt
@@ -0,0 +1,27 @@
+commit fea782543a844bb277ae94d3391788b76c5bee60
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Mon May 13 11:58:35 2013 -0700
+
+    v0.61.2
+
+commit 8464c06412b72673ca9d01d35e8f68451e1982b3
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Mon May 13 15:36:59 2013 +0100
+
+    mon: Monitor: tolerate GV duplicates during conversion
+    
+    Fixes: #4974
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit ba05b16ee2b6e25141f2ab88265a1cf92dcd493c)
+
+commit 703bc2fd8aec512fb2b58d5ef263e37647c1f047
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Fri May 10 20:09:34 2013 -0700
+
+    config_opts: default mon_debug_dump_transactions to 'false'
+    
+    otherwise, it chews mon log space at an alarming rate.
+    
+    Fixes: #5024
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
diff --git a/doc/changelog/v0.61.3.txt b/doc/changelog/v0.61.3.txt
new file mode 100644
index 0000000..ea02eb3
--- /dev/null
+++ b/doc/changelog/v0.61.3.txt
@@ -0,0 +1,831 @@
+commit 92b1e398576d55df8e5888dd1a9545ed3fd99532
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed Jun 5 11:10:05 2013 -0700
+
+    v0.61.3
+
+commit 7d549cb82ab8ebcf1cc104fc557d601b486c7635
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 4 10:42:13 2013 -0700
+
+    os/LevelDBStore: only remove logger if non-null
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ce67c58db7d3e259ef5a8222ef2ebb1febbf7362)
+    Fixes: #5255
+
+commit 8544ea751884617616addc17b4467b9a86bd9d8a
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Jun 3 15:57:23 2013 -0700
+
+    test_librbd: use correct type for varargs snap test
+
+    uint64_t is passed in, but int was extracted. This fails on 32-bit builds.
+
+    Fixes: #5220
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 17029b270dee386e12e5f42c2494a5feffd49b08)
+
+commit b226e117b5a72c3b04b74aec50a9198601f3730b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 18:07:34 2013 -0700
+
+    os/LevelDBStore: fix merge loop
+
+    We were double-incrementing p, both in the for statement and in the
+    body.  While we are here, drop the unnecessary else's.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit eb6d5fcf994d2a25304827d7384eee58f40939af)
+
+commit d017afb5b075a1958cb19213dd95e41d54065e45
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 17:27:10 2013 -0700
+
+    msgr: add get_messenger() to Connection
+
+    This was part of commit 27381c0c6259ac89f5f9c592b4bfb585937a1cfc.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit ffb87918fa7b829a5199eec08804dc540a819bf2
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 17:09:19 2013 -0700
+
+    mon: start lease timer from peon_init()
+
+    In the scenario:
+
+     - leader wins, peons lose
+     - leader sees it is too far behind on paxos and bootstraps
+     - leader tries to sync with someone, waits for a quorum of the others
+     - peons sit around forever waiting
+
+    The problem is that they never time out because paxos never issues a lease,
+    which is the normal timeout that lets them detect a leader failure.
+
+    Avoid this by starting the lease timeout as soon as we lose the election.
+    The timeout callback just does a bootstrap and does not rely on any other
+    state.
+
+    I see one possible danger here: there may be some "normal" cases where the
+    leader takes a long time to issue its first lease that we currently
+    tolerate, but won't with this new check in place.  I hope that raising
+    the lease interval/timeout or reducing the allowed paxos drift will make
+    that a non-issue.  If it is problematic, we will need a separate explicit
+    "i am alive" from the leader while it is getting ready to issue the lease
+    to prevent a live-lock.
+
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit f1ccb2d808453ad7ef619c2faa41a8f6e0077bd9)
+
+commit 38f8d850d35500e3d8751cd14c5cdaaff682c7d7
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 22:52:21 2013 -0700
+
+    mon: discard messages from disconnected clients
+
+    If the client is not connected, discard the message.  They will
+    reconnect and resend anyway, so there is no point in processing it
+    twice (now and later).
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit fb3cd0c2a8f27a1c8d601a478fd896cc0b609011)
+
+commit 36d948981685114d2fe807f480c19aade7497194
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 22 08:13:21 2013 -0700
+
+    msgr: add Messenger reference to Connection
+
+    This allows us to get the messenger associated with a connection.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 92a558bf0e5fee6d5250e1085427bff22fe4bbe4)
+
+commit 61135964419ecf5165366724d064b623b517fb4e
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 15:59:49 2013 -0700
+
+    mon/Paxos: adjust trimming defaults up; rename options
+
+    - trim more at a time (by an order of magnitude)
+    - rename fields to paxos_trim_{min,max}; only trim when there are min items
+      that are trimmable, and trim at most max items at a time.
+    - adjust the paxos_service_trim_{min,max} values up by a factor of 2.
+
+    Since we are compacting every time we trim, adjusting these up mean less
+    frequent compactions and less overall work for the monitor.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 6b8e74f0646a7e0d31db24eb29f3663fafed4ecc)
+
+commit 2dc402815f71204cfe592cfb3d6758486d84166d
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 8 16:42:24 2013 -0700
+
+    common/Preforker: fix warnings
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a284c9ece85f11d020d492120be66a9f4c997416)
+
+commit 48ee9283de288c101d3387cc48df6eb8ea889fb7
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 15:53:35 2013 -0700
+
+    fix test users of LevelDBStore
+
+    Need to pass in cct.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 446e0770c77de5d72858dcf7a95c5b19f642cf98)
+
+commit 3372235d307172b404a48e4c4d24702a96116d00
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 21:43:50 2013 -0700
+
+    mon: destroy MonitorDBStore before g_ceph_context
+
+    Put it on the heap so that we can destroy it before the g_ceph_context
+    cct that it references.  This fixes a crash like
+
+    *** Caught signal (Segmentation fault) **
+    in thread 4034a80
+    ceph version 0.63-204-gcf9aa7a (cf9aa7a0037e56eada8b3c1bb59d59d0bfe7bba5)
+    1: ceph-mon() [0x59932a]
+    2: (()+0xfcb0) [0x4e41cb0]
+    3: (Mutex::Lock(bool)+0x1b) [0x6235bb]
+    4: (PerfCountersCollection::remove(PerfCounters*)+0x27) [0x6a0877]
+    5: (LevelDBStore::~LevelDBStore()+0x1b) [0x582b2b]
+    6: (LevelDBStore::~LevelDBStore()+0x9) [0x582da9]
+    7: (main()+0x1386) [0x48db16]
+    8: (__libc_start_main()+0xed) [0x658076d]
+    9: ceph-mon() [0x4909ad]
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit df2d06db6f3f7e858bdadcc8cd2b0ade432df413)
+
+commit d284eaf9ce7d2022ba62562236d5fa41c26c1eb3
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 11:07:06 2013 -0700
+
+    mon: fix leak of health_monitor and config_key_service
+
+    Switch to using regular pointers here.  The lifecycle of these services is
+    very simple such that refcounting is overkill.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c888d1d3f1b77e62d1a8796992e918d12a009b9d)
+
+commit cc88cdfe8de02da675f9051e95b70da11f7fbe9e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 17:54:17 2013 -0700
+
+    mon: return instead of exit(3) via preforker
+
+    This lets us run all the locally-scoped dtors so that leak checking will
+    work.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3c5706163b72245768958155d767abf561e6d96d)
+
+commit 85d629a5f8e1deef9a562d9a7b371707d90c5ba1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 14:57:42 2013 -0700
+
+    os/LevelDBStore: add perfcounters
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7802292e0a49be607d7ba139b44d5ea1f98e07e6)
+
+commit 0109fa8ae70671c2d8ca19bcc95662d5f41cac66
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 14:36:41 2013 -0700
+
+    mon: make compaction bounds overlap
+
+    When we trim items N to M, compact over range (N-1) to M so that the
+    items in the queue will share bounds and get merged.  There is no harm in
+    compacting over a larger range here when the lower bound is a key that
+    doesn't exist anyway.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a47ca583980523ee0108774b466718b303bd3f46)
+
+commit 83b1edac07dd74b91ba2cdfe8b63236d7930c9b1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 14:26:42 2013 -0700
+
+    os/LevelDBStore: merge adjacent ranges in compactionqueue
+
+    If we get behind and multiple adjacent ranges end up in the queue, merge
+    them so that we fire off compaction on larger ranges.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f628dd0e4a5ace079568773edfab29d9f764d4f0)
+
+commit d14665e550d9b2dfc47684b73427042b0744127f
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 08:40:32 2013 -0700
+
+    mon: compact trimmed range, not entire prefix
+
+    This will reduce the work that leveldb is asked to do by only triggering
+    compaction of the keys that were just trimmed.
+
+    We ma want to further reduce the work by compacting less frequently, but
+    this is at least a step in that direction.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6da4b20ca53fc8161485c8a99a6b333e23ace30e)
+
+commit dcd9b793fb0b05976b55be029315114d6f1df0e5
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 08:35:44 2013 -0700
+
+    mon/MonitorDBStore: allow compaction of ranges
+
+    Allow a transaction to describe the compaction of a range of keys.  Do this
+    in a backward compatible say, such that older code will interpret the
+    compaction of a prefix + range as compaction of the entire prefix.  This
+    allows us to avoid introducing any new feature bits.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ab09f1e5c1305a64482ebbb5a6156a0bb12a63a4)
+
+    Conflicts:
+
+	src/mon/MonitorDBStore.h
+
+commit 6543da740a12c6ad085b807c9038d5b7b5aeaba6
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 08:34:13 2013 -0700
+
+    os/LevelDBStore: allow compaction of key ranges
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e20c9a3f79ccfeb816ed634ca25de29fc5975ea8)
+
+commit 87dcba2dd12a673fdc63ad64fb23e6e9f841d74f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 28 16:35:55 2013 -0700
+
+    os/LevelDBStore: do compact_prefix() work asynchronously
+
+    We generally do not want to block while compacting a range of leveldb.
+    Push the blocking+waiting off to a separate thread.  (leveldb will do what
+    it can to avoid blocking internally; no reason for us to wait explicitly.)
+
+    This addresses part of #5176.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4af917d4478ec07734a69447420280880d775fa2)
+
+commit bac5720b2a583e799c6961c733c4a9132a002440
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat May 11 17:36:13 2013 -0700
+
+    qa: rsync test: exclude /usr/local
+
+    Some plana have non-world-readable crap in /usr/local/samba.  Avoid
+    /usr/local entirely for that and any similar landmines.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 82211f2197241c4f3d3135fd5d7f0aa776eaeeb6)
+
+commit 9f1afe1a8e7906bdc54158a4813f011933f6a78f
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 21:16:54 2013 -0700
+
+    mon: fix uninitialized fields in MMonHealth
+
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d7e2ab1451e284cd4273cca47eec75e1d323f113)
+
+commit d5b67d49c87b4fe6a90cdd0bf4fac4f9d9377e81
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 31 13:44:39 2013 -0700
+
+    PGLog: only add entry to caller_ops in add() if reqid_is_indexed()
+
+    Fixes: #5216
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit a5f6d8967fbbe87f34b23cfcceea84317b647f62
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Apr 15 16:33:48 2013 -0700
+
+    PG: don't write out pg map epoch every handle_activate_map
+
+    We don't actually need to write out the pg map epoch on every
+    activate_map as long as:
+    a) the osd does not trim past the oldest pg map persisted
+    b) the pg does update the persisted map epoch from time
+    to time.
+
+    To that end, we now keep a reference to the last map persisted.
+    The OSD already does not trim past the oldest live OSDMapRef.
+    Second, handle_activate_map will trim if the difference between
+    the current map and the last_persisted_map is large enough.
+
+    Fixes: #4731
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 2c5a9f0e178843e7ed514708bab137def840ab89)
+
+    Conflicts:
+
+	src/common/config_opts.h
+	src/osd/PG.cc
+	- last_persisted_osdmap_ref gets set in the non-static
+	  PG::write_info
+
+commit 9aaff1492a00e137f84af9b03e3a4608cea4b520
+Author: Alexandre Marangone <alexandre.marangone at inktank.com>
+Date:   Fri May 31 12:33:11 2013 -0700
+
+    upstart: handle upper case in cluster name and id
+
+    Signed-off-by: Alexandre Marangone <alexandre.marangone at inktank.com>
+    (cherry picked from commit 851619ab6645967e5d7659d9b0eea63d5c402b15)
+
+commit f87a19d34f9a03493eaca654dd176992676c5812
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 21 15:22:56 2013 -0700
+
+    OSDMonitor: skip new pools in update_pools_status() and get_pools_health()
+
+    New pools won't be full.  mon->pgmon()->pg_map.pg_pool_sum[poolid] will
+    implicitly create an entry for poolid causing register_new_pgs() to assume that
+    the newly created pgs in the new pool are in fact a result of a split
+    preventing MOSDPGCreate messages from being sent out.
+
+    Fixes: #4813
+    Backport: cuttlefish
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0289c445be0269157fa46bbf187c92639a13db46)
+
+commit 34733bdc3b9da13195dfac8a25f98c6de64070d7
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu May 30 12:58:11 2013 -0700
+
+    rgw: only append prefetched data if reading from head
+
+    Fixes: #5209
+    Backport: bobtail, cuttlefish
+    If the head object wrongfully contains data, but according to the
+    manifest we don't read from the head, we shouldn't copy the prefetched
+    data. Also fix the length calculation for that data.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit c5fc52ae0fc851444226abd54a202af227d7cf17)
+
+commit 3d91301e5d788f9f9f52ba4067006f39a89e1531
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu May 30 09:34:21 2013 -0700
+
+    rgw: don't copy object idtag when copying object
+
+    Fixes: #5204
+    When copying object we ended up also copying the original
+    object idtag which overrode the newly generated one. When
+    refcount put is called with the wrong idtag the count
+    does't go down.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit b1312f94edc016e604f1d05ccfe2c788677f51d1)
+
+commit 131dca7d10d5b0b7dca5c5cbe9b0b54938805015
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 30 08:53:22 2013 -0700
+
+    debian: sync up postinst and prerm with latest
+
+    - do not use invoke-rc.d for upstart
+    - do not stop daemons on upgrade
+    - misc other cleanups
+
+    This corresponds to the state of master as of cf9aa7a.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 8b7ca687ded06fe0b67d98e81fa1dabbed440853
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu May 30 18:17:28 2013 +0100
+
+    mon: Monitor: backup monmap using all ceph features instead of quorum's
+
+    When a monitor is freshly created and for some reason its initial sync is
+    aborted, it will end up with an incorrect backup monmap.  This monmap is
+    incorrect in the sense that it will not contain the monitor's names as
+    it will expect on the next run.
+
+    This results from us being using the quorum features to encode the monmap
+    when backing it up, instead of CEPH_FEATURES_ALL.
+
+    Fixes: #5203
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 626de387e617db457d6d431c16327c275b0e8a34)
+
+commit 02ef6e918e4fe0368b02fbc700a4d921ae298dc3
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 09:49:11 2013 -0700
+
+    osd: do not assume head obc object exists when getting snapdir
+
+    For a list-snaps operation on the snapdir, do not assume that the obc for the
+    head means the object exists.  This fixes a race between a head deletion and
+    a list-snaps that wrongly returns ENOENT, triggered by the DiffItersateStress
+    test when thrashing OSDs.
+
+    Fixes: #5183
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 29e4e7e316fe3f3028e6930bb5987cfe3a5e59ab)
+
+commit 85ad65e294f2b3d4bd1cfef6ae613e31d1cea635
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 29 16:50:04 2013 -0700
+
+    osd: initialize new_state field when we use it
+
+    If we use operator[] on a new int field its value is undefined; avoid
+    reading it or using |= et al until we initialize it.
+
+    Fixes: #4967
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 50ac8917f175d1b107c18ecb025af1a7b103d634)
+
+commit 65236a4a2541799a0d946df7f3048d4404678f64
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 28 11:10:05 2013 -0700
+
+    HashIndex: sync top directory during start_split,merge,col_split
+
+    Otherwise, the links might be ordered after the in progress
+    operation tag write.  We need the in progress operation tag to
+    correctly recover from an interrupted merge, split, or col_split.
+
+    Fixes: #5180
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5bca9c38ef5187c7a97916970a7fa73b342755ac)
+
+commit 0e127dc4ef16d19d56a3603ca90fa6b076d905b0
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed May 22 13:59:08 2013 +0100
+
+    mon: Paxos: get rid of the 'prepare_bootstrap()' mechanism
+
+    We don't need it after all.  If we are in the middle of some proposal,
+    then we guarantee that said proposal is likely to be retried.  If we
+    haven't yet proposed, then it's forever more likely that a client will
+    eventually retry the message that triggered this proposal.
+
+    Basically, this mechanism attempted at fixing a non-problem, and was in
+    fact triggering some unforeseen issues that would have required increasing
+    the code complexity for no good reason.
+
+    Fixes: #5102
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit e15d29094503f279d444eda246fc45c09f5535c9)
+
+commit f29206bdd950d1e916a1422b4826caaf4a8cef3a
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed May 22 13:51:13 2013 +0100
+
+    mon: Paxos: finish queued proposals instead of clearing the list
+
+    By finishing these Contexts, we make sure the Contexts they enclose (to be
+    called once the proposal goes through) will behave as their were initially
+    planned:  for instance, a C_Command() may retry the command if a -EAGAIN
+    is passed to 'finish_contexts', while a C_Trimmed() will simply set
+    'going_to_trim' to false.
+
+    This aims at fixing at least a bug in which Paxos will stop trimming if an
+    election is triggered while a trim is queued but not yet finished.  Such
+    happens because it is the C_Trimmed() context that is responsible for
+    resetting 'going_to_trim' back to false.  By clearing all the contexts on
+    the proposal list instead of finishing them, we stay forever unable to
+    trim Paxos again as 'going_to_trim' will stay True till the end of time as
+    we know it.
+
+    Fixes: #4895
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 586e8c2075f721456fbd40f738dab8ccfa657aa8)
+
+commit b73d7c6b7e83fe8ce29e7150f25a4cca7647cccd
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri May 17 18:23:36 2013 +0100
+
+    mon: Paxos: finish_proposal() when we're finished recovering
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 2ff23fe784245f3b86bc98e0434b21a5318e0a7b)
+
+commit 79eb61c4eadd9d94b3b8087d85b7210f4ab71d54
+Merge: a460e53 8682248
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 20:09:29 2013 -0700
+
+    Merge branch 'wip_scrub_tphandle' into cuttlefish
+
+    Fixes: #5159
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 86822485e518d61d7b2c02a6ff25eb2c4b4bc307
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 17:40:44 2013 -0700
+
+    PG: ping tphandle during omap loop as well
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit d62716dd4ceb29032759bf84e864d214fe38a17c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 15:24:39 2013 -0700
+
+    PG: reset timeout in _scan_list for each object, read chunk
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit b8a25e08a638c31b9cfc2c1bf6d9bad40e921a9f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 23 15:23:05 2013 -0700
+
+    OSD,PG: pass tphandle down to _scan_list
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit a460e53ecac03e9c8f54c402a790e6d8cf75b38c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed May 22 21:34:52 2013 -0700
+
+    rgw: iterate usage entries from correct entry
+
+    Fixes: #5152
+    When iterating through usage entries, and when user id was
+    provided, we started at the user's first entry and not from
+    the entry indexed by the request start time.
+    This commit fixes the issue.
+
+    Backport: bobtail
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 8b3a04dec8be13559716667d4b16cde9e9543feb)
+
+commit 48e1b11bcbdbdf8661cb560c8563f91738034287
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 16 20:37:05 2013 -0700
+
+    sysvinit: fix enumeration of local daemons when specifying type only
+
+    - prepend $local to the $allconf list at the top
+    - remove $local special case for all case
+    - fix the type prefix checks to explicitly check for prefixes
+
+    Fugly bash, but works!
+
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit c80c6a032c8112eab4f80a01ea18e1fa2c7aa6ed)
+
+commit 6e5f0db75a2bf591bd1fc0a5c2a93051f83ebc5d
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 22 09:47:29 2013 -0700
+
+    sysvinit: fix osd weight calculation on remote hosts
+
+    We need to do df on the remote host, not locally.
+
+    Simlarly, the ceph command uses the osd key, which exists remotely; run it there.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d81d0ea5c442699570bd93a90bea0d97a288a1e9)
+
+commit 674e75bc0783cd9befe9c20e36fbc2cfdac62e5a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 22 09:47:03 2013 -0700
+
+    sysvinit: use known hostname $host instead of (incorrectly) recalculating
+
+    We would need to do hostname -s on the remote node, not the local one.
+    But we already have $host; use it!
+
+    Reported-by: Xiaoxi Chen <xiaoxi.chen at intel.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit caa15a34cb5d918c0c8b052cd012ec8a12fca150)
+
+commit f4cd61d339419738355a26d7f4fce04eac9dedee
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 20 12:41:30 2013 -0700
+
+    mon: be a bit more verbose about osd mark down events
+
+    Put these in the cluster log; they are interesting.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 87767fb1fb9a52d11b11f0b641cebbd9998f089e)
+
+commit e04b1894ed7f3a6e95007e58dae5b35357e5c507
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon May 13 14:23:00 2013 -0700
+
+    PG: subset_last_update must be at least log.tail
+
+    Fixes: 5020
+    Backport: bobtail, cuttlefish
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 72bf5f4813c273210b5ced7f7793bc1bf813690c)
+
+commit 3a02e00d1d3b904b312db283faedf4dff37b0f6f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 14 16:35:48 2013 -0700
+
+    FileJournal: adjust write_pos prior to unlocking write_lock
+
+    In committed_thru, we use write_pos to reset the header.start value in cases
+    where seq is past the end of our journalq.  It is therefore important that the
+    journalq be updated atomically with write_pos (that is, under the write_lock).
+
+    The call to align_bl() is moved into do_write in order to ensure that write_pos
+    is adjusted correctly prior to write_bl().
+
+    Also, we adjust pos at the end of write_bl() such that pos \in [get_top(),
+    header.max_size) after write_bl().
+
+    Fixes: #5020
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit eaf3abf3f9a7b13b81736aa558c9084a8f07fdbe)
+
+commit 8a030eb0e1b61121f7b1e2b7a551bb213d1c428b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 21 14:36:11 2013 -0700
+
+    mon: implement --extract-monmap <filename>
+
+    This will make for a simpler process for
+      http://ceph.com/docs/master/rados/operations/add-or-rm-mons/#removing-monitors-from-an-unhealthy-cluster
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c0268e27497a4d8228ef54da9d4ca12f3ac1f1bf)
+
+commit 4ad13c945fd29a2d183f7ea6c6ac8a51d24dabe1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu May 16 15:28:40 2013 -0700
+
+    librbd: make image creation defaults configurable
+
+    Programs using older versions of the image creation functions can't
+    set newer parameters like image format and fancier striping.
+
+    Setting these options lets them use all the new functionality without
+    being patched and recompiled to use e.g. rbd_create3().
+    This is particularly useful for things like qemu-img, which does not
+    know how to create format 2 images yet.
+
+    Refs: #5067
+    backport: cuttlefish, bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit aacc9adc4e9ca90bbe73ac153cc754a3a5b2c0a1)
+
+commit 684444f88f2a7cf28f2e685c18f0771730a1d48f
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu May 16 15:21:24 2013 -0700
+
+    rbd.py: fix stripe_unit() and stripe_count()
+
+    These matched older versions of the functions, but would segfault
+    using the current versions.
+
+    backport: cuttlefish, bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 53ee6f965e8f06c7256848210ad3c4f89d0cb5a0)
+
+commit 9c7faf957fffb2721ccb915b68ca90ffb0d04a9f
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu May 16 15:19:46 2013 -0700
+
+    cls_rbd: make sure stripe_unit is not larger than object size
+
+    Test a few other cases too.
+
+    backport: cuttlefish, bobtail
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 810306a2a76eec1c232fd28ec9c351e827fa3031)
+
+commit 4071d7a79585ee2768d0a63819d99405a083369f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 3 12:57:00 2013 -0700
+
+    rgw: protect ops log socket formatter
+
+    Fixes: #4905
+    Ops log (through the unix domain socket) uses a formatter, which wasn't
+    protected.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit d48f1edb07a4d8727ac956f70e663c1b4e33e1dd)
+
+commit 57a6a54db4020debd826a493cccca4695934f693
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 15 23:02:10 2013 -0700
+
+    Makefle: force char to be signed
+
+    On an armv7l build, we see errors like
+
+     warning: rgw/rgw_common.cc:626:16: comparison is always false due to limited range of data type [-Wtype-limits]
+
+    from code
+
+          char c1 = hex_to_num(*src++);
+    ...
+          if (c1 < 0)
+
+    Force char to be signed (regardless of any weird architecture's default)
+    to avoid risk of this leading to misbehavior.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 769a16d6674122f3b537f03e17514ad974bf2a2f)
+
+commit 85fb422a084785176af3b694882964841e02195d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 20 13:34:27 2013 -0700
+
+    debian: stop sysvinit on ceph.prerm
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2f193fb931ed09d921e6fa5a985ab87aa4874589)
+
+commit eac3cd2d8334db7c70cbba433610136ff76e447f
+Author: Mike Kelly <pioto at pioto.org>
+Date:   Thu May 16 12:29:50 2013 -0400
+
+    ceph df: fix si units for 'global' stats
+
+    si_t expects bytes, but it was being given kilobytes.
+
+    Signed-off-by: Mike Kelly <pioto at pioto.org>
+    (cherry picked from commit 0c2b738d8d07994fee4c73dd076ac9364a64bdb2)
+
+commit 7bc7c9d4bc6f5bbadbb5e6f9844a0e1f66373c90
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 16 18:40:29 2013 -0700
+
+    udev: install disk/by-partuuid rules
+
+    Wheezy's udev (175-7.2) has broken rules for the /dev/disk/by-partuuid/
+    symlinks that ceph-disk relies on.  Install parallel rules that work.  On
+    new udev, this is harmless; old older udev, this will make life better.
+
+    Fixes: #4865
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d8d7113c35b59902902d487738888567e3a6b933)
+
+commit c2acecbdab93177227a80a114ecc4ce71dbdbe49
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 16 13:17:45 2013 -0700
+
+    debian: make radosgw require matching version of librados2
+
+    ...indirectly via ceph-common.  We get bad behavior when they diverge, I
+    think because of libcommon.la being linked both statically and dynamically.
+
+    Fixes: #4997
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Gary Lowell <gary.lowell at inktank.com>
+    (cherry picked from commit 604c83ff18f9a40c4f44bc8483ef22ff41efc8ad)
+
+commit 4c0d3eb72c045c39e8b38fd5abf9ddfbb2219f9c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 10 22:14:05 2013 -0700
+
+    mon: fix validatation of mds ids in mon commands
+
+    Fixes: #4996
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5c305d63043762027323052b4bb3ae3063665c6f)
diff --git a/doc/changelog/v0.61.4.txt b/doc/changelog/v0.61.4.txt
new file mode 100644
index 0000000..0964274
--- /dev/null
+++ b/doc/changelog/v0.61.4.txt
@@ -0,0 +1,823 @@
+commit 1669132fcfc27d0c0b5e5bb93ade59d147e23404
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed Jun 19 13:51:38 2013 -0700
+
+    v0.61.4
+
+commit b76540f6e2db7a08dee86f84358d56c4ea0b3293
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 22 14:29:37 2013 -0700
+
+    messages/MOSDMarkMeDown: fix uninit field
+    
+    Fixes valgrind warning:
+    ==14803== Use of uninitialised value of size 8
+    ==14803==    at 0x12E7614: sctp_crc32c_sb8_64_bit (sctp_crc32.c:567)
+    ==14803==    by 0x12E76F8: update_crc32 (sctp_crc32.c:609)
+    ==14803==    by 0x12E7720: ceph_crc32c_le (sctp_crc32.c:733)
+    ==14803==    by 0x105085F: ceph::buffer::list::crc32c(unsigned int) (buffer.h:427)
+    ==14803==    by 0x115D7B2: Message::calc_front_crc() (Message.h:441)
+    ==14803==    by 0x1159BB0: Message::encode(unsigned long, bool) (Message.cc:170)
+    ==14803==    by 0x1323934: Pipe::writer() (Pipe.cc:1524)
+    ==14803==    by 0x13293D9: Pipe::Writer::entry() (Pipe.h:59)
+    ==14803==    by 0x120A398: Thread::_entry_func(void*) (Thread.cc:41)
+    ==14803==    by 0x503BE99: start_thread (pthread_create.c:308)
+    ==14803==    by 0x6C6E4BC: clone (clone.S:112)
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit eb91f41042fa31df2bef9140affa6eac726f6187)
+
+commit 2434ecca6f8e1f2af62c74cb1b7df277f4a076f7
+Merge: f8973bd 3f32ded
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 19 10:56:51 2013 -0700
+
+    Merge remote-tracking branch 'gh/wip-4976-cuttlefish' into cuttlefish
+    
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit f8973bda801dbb2412c4cd83869c0203930f38e9
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 20:32:15 2013 -0700
+
+    common/Preforker: fix warning
+    
+    common/Preforker.h: In member function ‘int Preforker::signal_exit(int)’:
+    warning: common/Preforker.h:82:45: ignoring return value of ‘ssize_t safe_write(int, const void*, size_t)’, declared with attribute warn_unused_result [-Wunused-result]
+    
+    This is harder than it should be to fix.  :(
+      http://stackoverflow.com/questions/3614691/casting-to-void-doesnt-remove-warn-unused-result-error
+    
+    Whatever, I guess we can do something useful with this return value.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit ce7b5ea7d5c30be32e4448ab0e7e6bb6147af548)
+
+commit 6427985b746b7c29f5337d87b60aab9008a8bc6e
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 19 02:50:45 2013 +0100
+
+    mon: Monitor: make sure we backup a monmap during sync start
+    
+    First of all, we must find a monmap to backup.  The newest version.
+    
+    Secondly, we must make sure we back it up before clearing the store.
+    
+    Finally, we must make sure that we don't remove said backup while
+    clearing the store; otherwise, we would be out of a backup monmap if the
+    sync happened to fail (and if the monitor happened to be killed before a
+    new sync had finished).
+    
+    This patch makes sure these conditions are met.
+    
+    Fixes: #5256 (partially)
+    Backport: cuttlefish
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5e6dc4ea21b452e34599678792cd36ce1ba3edb3)
+
+commit f8f83e78218ee5b8602cfe6758caf2ecd3e06602
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 19 02:36:44 2013 +0100
+
+    mon: Monitor: obtain latest monmap on sync store init
+    
+    Always use the highest version amongst all the typically available
+    monmaps: whatever we have in memory, whatever we have under the
+    MonmapMonitor's store, and whatever we have backed up from a previous
+    sync.  This ensures we always use the newest version we came across
+    with.
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6284fdce794b73adcc757fee910e975b6b4bd054)
+
+commit 41e1a6beeef69136fe6ec3f31d07ea8c33d64cba
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 19 02:21:58 2013 +0100
+
+    mon: Monitor: don't remove 'mon_sync' when clearing the store during abort
+    
+    Otherwise, we will end up losing the monmap we backed up when we started
+    the sync, and the monitor may be unable to start if it is killed or
+    crashes in-between the sync abort and finishing a new sync.
+    
+    Fixes: #5256 (partially)
+    Backport: cuttlefish
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit af5a9861d7c6b4527b0d2312d0efa792910bafd9)
+
+commit 3f32ded41818ad3c607339d723c095f166e36f7e
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 18 21:31:23 2013 -0700
+
+    os/FileStore: drop posix_fadvise(...DONTNEED)
+    
+    On XFS this call is problematic because it directly calls the filemap
+    writeback without vectoring through xfs.  This can break the delicate
+    ordering of writeback and range zeroing; see #4976 and this thread
+    
+          http://oss.sgi.com/archives/xfs/2013-06/msg00066.html
+    
+    Drop this behavior for now to avoid subtle data corruption.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit ffade3c85dfffa13a16edd9630a52d99eb8a413d
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 18 21:24:16 2013 -0700
+
+    os/FileStore: use fdatasync(2) instead of sync_file_range(2)
+    
+    The use of sync_file_range(2) on XFS screws up XFS' delicate ordering
+    of writeback and range zeroing; see #4976 and this thread:
+    
+      http://oss.sgi.com/archives/xfs/2013-06/msg00066.html
+    
+    Instead, replace all sync_file_range(2) calls with fdatasync(2), which
+    *does* do ordered writeback and should not leak unzeroed blocks.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 3383ba6326aeff6500df4792fcef65740dd6b3ea
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 12 21:47:09 2013 -0700
+
+    config: fix run_dir typo
+    
+    From 654299108bfb11e7dce45f54946d1505f71d2de8.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e9689ac6f5f50b077a6ac874f811d204ef996c96)
+
+commit 41e1416c3585507db75f10ed69f65a5a80370827
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 18 14:51:08 2013 -0700
+
+    ceph.spec: create /var/run on package install
+    
+    The %ghost %dir ... line will make this get cleaned up but won't install
+    it.
+    
+    Reported-by: Derek Yarnell <derek at umiacs.umd.edu>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Gary Lowell <gary.lowell at inktank.com>
+    (cherry picked from commit 64ee0148a5b7324c7df7de2d5f869b880529d452)
+
+commit 2df3619169d2e83617fc3005b68de395e982b39a
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 7 17:03:41 2013 -0700
+
+    global: create /var/run/ceph on daemon startup
+    
+    This handles cases where the daemon is started without the benefit of
+    sysvinit or upstart (as with teuthology or ceph-fuse).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 654299108bfb11e7dce45f54946d1505f71d2de8)
+
+commit eace9987c19f4da5cc89ca84abec5e54035b4887
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jun 5 11:10:34 2013 -0700
+
+    PG: don't dirty log unconditionally in activate()
+    
+    merge_log and friends all take care of dirtying the log
+    as necessary.
+    
+    Fixes: #5238
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 5deece1d034749bf72b7bd04e4e9c5d97e5ad6ce)
+
+commit fda618e96690b2693c7a8dd523ece7c1c5a90b67
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Jun 14 17:11:43 2013 +0100
+
+    mon: OSDMonitor: don't ignore apply_incremental()'s return on UfP [1]
+    
+    apply_incremental() may return -EINVAL.  Don't ignore it.
+    
+    [1] UfP = Update from Paxos
+    
+    Fixes: #5343
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit e3c33f4315cbf8718f61eb79e15dd6d44fc908b7)
+
+commit c14dd154584eef97075e4a260719b6cbe686d4c7
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 16:38:26 2013 -0700
+
+    client: handle reset during initial mds session open
+    
+    If we get a reset during our attempt to open an MDS session, close out the
+    Connection* and retry to open the session, moving the waiters over.
+    
+    Fixes: #5379
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit df8a3e5591948dfd94de2e06640cfe54d2de4322)
+
+commit aa8834831dbfcdebb96841686e3707e552c349f6
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 15:43:40 2013 -0700
+
+    ceph-disk: add some notes on wth we are up to
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8c6b24e9039079e897108f28d6af58cbc703a15a)
+
+commit 261964adc5a7efe7c0efac2d527bc10a95498e45
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 16:29:10 2013 -0700
+
+    ceph-disk: clear TERM to avoid libreadline hijinx
+    
+    The weird output from libreadline users is related to the TERM variable.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e538829f16ce19d57d63229921afa01cc687eb86)
+
+commit e36fb3267cdbe0ec5bb01f8a012485de1bbf1652
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 09:49:46 2013 -0700
+
+    ceph-disk-udev: set up by-partuuid, -typeuuid symlinks on ancient udev
+    
+    Make the ancient-udev/blkid workaround script for RHEL/CentOS create the
+    symlinks for us too.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d7f7d613512fe39ec883e11d201793c75ee05db1)
+
+commit c3936ebb159b419115bfdc5dc7a23f5807cff9fa
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jun 15 20:06:33 2013 -0700
+
+    ceph-disk: do not stop activate-all on first failure
+    
+    Keep going even if we hit one activation error.  This avoids failing to
+    start some disks when only one of them won't start (e.g., because it
+    doesn't belong to the current cluster).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c9074375bfbe1e3757b9c423a5ff60e8013afbce)
+
+commit 3cb783c31541cebe928b97cf27eb326bb4b54f9b
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 16:30:24 2013 -0700
+
+    ceph.spec: include partuuid rules in package
+    
+    Commit f3234c147e083f2904178994bc85de3d082e2836 missed this.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 253069e04707c5bf46869f4ff5a47ea6bb0fde3e)
+
+commit 2d771b57082545e139086f3c5c9f79ba47101a14
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 15:01:14 2013 -0700
+
+    ceph.spec: install/uninstall init script
+    
+    This was commented out almost years ago in commit 9baf5ef4 but it is not
+    clear to me that it was correct to do so.  In any case, we are not
+    installing the rc.d links for ceph, which means it does not start up after
+    a reboot.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cc9b83a80262d014cc37f0c974963cf7402a577a)
+
+commit dfe421e44cfa13178950258509a0cf71e308daa1
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 13:39:03 2013 -0700
+
+    sysvinit, upstart: ceph-disk activate-all on start
+    
+    On 'service ceph start' or 'service ceph start osd' or start ceph-osd-all
+    we should activate any osd GPT partitions.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 13680976ef6899cb33109f6f841e99d4d37bb168)
+
+commit ef47cf9c9dd7f4a1f549c14f984cd052fc95bb64
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 13:34:40 2013 -0700
+
+    ceph-disk: add 'activate-all'
+    
+    Scan /dev/disk/by-parttypeuuid for ceph OSDs and activate them all.  This
+    is useful when the event didn't trigger on the initial udev event for
+    some reason.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5c7a23687a1a21bec5cca7b302ac4ba47c78e041)
+
+commit 65ec1d87f96694ab08c99a7104329065c7c5ebae
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 13:23:52 2013 -0700
+
+    udev: /dev/disk/by-parttypeuuid/$type-$uuid
+    
+    We need this to help trigger OSD activations.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d512dc9eddef3299167d4bf44e2018b3b6031a22)
+
+commit 4a739b13f420acf4f0af21b4cf133ac08c97ee18
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Jun 14 14:53:54 2013 -0700
+
+    rgw: escape prefix correctly when listing objects
+    
+    Fixes: #5362
+    When listing objects prefix needs to be escaped correctly (the
+    same as with the marker). Otherwise listing objects with prefix
+    that starts with underscore doesn't work.
+    Backport: bobtail, cuttlefish
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit d582ee2438a3bd307324c5f44491f26fd6a56704)
+
+commit 6edba9e9ad1c115a462aeab858063fe3939a40e4
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 10 17:28:22 2013 -0700
+
+    messages/MMonSync: initialize crc in ctor
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cd1c289b96a874ff99a83a44955d05efc9f2765a)
+
+commit 2ad85576850bcb61c3ac8fee38609f9cd51bfac2
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jun 15 08:48:37 2013 -0700
+
+    client: fix ancient typo in caps revocation path
+    
+    If we have dropped all references to a revoked capability, send the ack
+    to the MDS.  This typo has been there since v0.7 (early 2009)!
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit b7143c2f84daafbe2c27d5b2a2d5dc40c3a68d15)
+
+commit d3d88983bceaf508f2585cc6bf8fc304a0943ffe
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 5 08:42:25 2013 -0700
+
+    messages/MMonHealth: remove unused flag field
+    
+    This was initialized in (one of) the ctor(s), but not encoded/decoded,
+    and not used.  Remove it.  This makes valgrind a happy.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 08bb8d510b5abd64f5b9f8db150bfc8bccaf9ce8)
+
+commit 646d9ccc575bf91cf73fbfaf91ab4d04ed2b5981
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 5 08:34:20 2013 -0700
+
+    messages/MMonProbe: fix uninitialized variables
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4974b29e251d433101b69955091e22393172bcd8)
+
+commit 08304a7c46da7517319b7db0b64d1c4f54771472
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jun 15 08:14:40 2013 -0700
+
+    common/Preforker: fix broken recursion on exit(3)
+    
+    If we exit via preforker, call exit(3) and not recursively back into
+    Preforker::exit(r).  Otherwise you get a hang with the child blocked
+    at:
+    
+    Thread 1 (Thread 0x7fa08962e7c0 (LWP 5419)):
+    #0  0x000000309860e0cd in write () from /lib64/libpthread.so.0
+    #1  0x00000000005cc906 in Preforker::exit(int) ()
+    #2  0x00000000005c8dfb in main ()
+    
+    and the parent at
+    
+    #0  0x000000309860eba7 in waitpid () from /lib64/libpthread.so.0
+    #1  0x00000000005cc87a in Preforker::parent_wait() ()
+    #2  0x00000000005c75ae in main ()
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7e7ff7532d343c473178799e37f4b83cf29c4eee)
+
+commit f202d332dc86844caa9076c7866cc009d87f76b6
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Jun 13 16:38:26 2013 -0700
+
+    rules:  Don't disable tcmalloc on ARM (and other non-intel)
+    
+    Fixes #5342
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit cbca9232618e85bd15b8677c9306042caad876a6
+Author: Guilhem Lettron <guilhem+github at lettron.fr>
+Date:   Mon May 27 12:41:53 2013 +0200
+
+    Remove mon socket in post-stop
+    
+    If ceph-mon segfault, socket file isn't removed.
+    
+    By adding a remove in post-stop, upstart clean run directory properly.
+    
+    Signed-off-by: Guilhem Lettron <guilhem at lettron.fr>
+    (cherry picked from commit 554b41b171eab997038e83928c462027246c24f4)
+
+commit 3f8b3cf1d4042ae6bb64a840ff19f859e6ce6dc2
+Author: James Page <james.page at ubuntu.com>
+Date:   Mon May 20 10:26:06 2013 +0100
+
+    Remove stop on from upstart tasks
+    
+    Upstart tasks don't have to concept of 'stop on' as they
+    are not long running.
+    (cherry picked from commit 17f6fccabc262b9a6d59455c524b550e77cd0fe3)
+
+commit 0b9b8368aec049bfdd4cf72b481f3a4aa8cb031e
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jun 12 22:22:42 2013 -0700
+
+    ceph-disk: extra dash in error message
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit f86b4e7a4831c684033363ddd335d2f3fb9a189a)
+
+commit ecddd1e0062ae58e8cc75e125cc683fc04b8befe
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri May 24 12:41:11 2013 +0200
+
+    ceph-disk: cast output of _check_output()
+    
+    Cast output of _check_output() to str() to be able to use
+    str.split().
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 16ecae153d260407085aaafbad1c1c51f4486c9a)
+
+commit 43855e3788cc90900f1b3424c4e4e2c28e8f351e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri May 24 12:46:15 2013 +0200
+
+    ceph-disk: remove unnecessary semicolons
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 9785478a2aae7bf5234fbfe443603ba22b5a50d2)
+
+commit 53927f94f3dcf7c57b73b66159d924557d92506e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri May 24 12:33:16 2013 +0200
+
+    ceph-disk: fix undefined variable
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 9429ff90a06368fc98d146e065a7b9d1b68e9822)
+
+commit f1beeb267d6e19754a9f2f483b5849a6b900f3ce
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri May 24 12:29:07 2013 +0200
+
+    ceph-disk: add missing spaces around operator
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit c127745cc021c8b244d721fa940319158ef9e9d4)
+
+commit fe23ae0042629f493792eadb88a30514c29fc1a0
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 22:02:03 2013 -0700
+
+    udev: drop useless --mount argument to ceph-disk
+    
+    It doesn't mean anything anymore; drop it.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bcfd2f31a50d27038bc02e645795f0ec99dd3b32)
+
+commit d99e0a8908d4feccc0a73952ee31586c83174589
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 22:01:34 2013 -0700
+
+    ceph-disk-udev: activate-journal
+    
+    Trigger 'ceph-disk activate-journal' from the alt udev rules.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b139152039bfc0d190f855910d44347c9e79b22a)
+
+commit dfbd20104e01ce22c7e501f748b2bf13382ee7f6
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 21:56:23 2013 -0700
+
+    ceph-disk: do not use mount --move (or --bind)
+    
+    The kernel does not let you mount --move when the parent mount is
+    shared (see, e.g., https://bugzilla.redhat.com/show_bug.cgi?id=917008
+    for another person this also confused).  We can't use --bind either
+    since that (on RHEL at least) screws up /etc/mtab so that the final
+    result looks like
+    
+     /var/lib/ceph/tmp/mnt.HNHoXU /var/lib/ceph/osd/ceph-0 none rw,bind 0 0
+    
+    Instead, mount the original dev in the final location and then umount
+    from the old location.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e5ffe0d2484eb6cbcefcaeb5d52020b1130871a5)
+
+commit 98a990d796e71c62fa64c13230a18a4a40aedcdf
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 21:22:53 2013 -0700
+
+    ceph.spec: include by-partuuid udev workaround rules
+    
+    These are need for old or buggy udev.  Having them for new and unbroken
+    udev is harmless.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f3234c147e083f2904178994bc85de3d082e2836)
+
+commit 1504e23f177fff00a794c0db76db8a8c72bc8eb7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 12:10:49 2013 -0700
+
+    ceph-disk: work around buggy rhel/centos parted
+    
+    parted on RHEL/Centos prefixes the *machine readable output* with
+    
+     1b 5b 3f 31 30 33 34 68
+    
+    Note that the same thing happens when you 'import readline' in python.
+    
+    Work around it!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 82ff72f827b9bd7f91d30a09d35e42b25d2a7344)
+
+commit 0b9482bd631aada9e2ca730b6cddd51d7954fb11
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 15:54:58 2013 -0700
+
+    ceph-disk: implement 'activate-journal'
+    
+    Activate an osd via its journal device.  udev populates its symlinks and
+    triggers events in an order that is not related to whether the device is
+    an osd data partition or a journal.  That means that triggering
+    'ceph-disk activate' can happen before the journal (or journal symlink)
+    is present and then fail.
+    
+    Similarly, it may be that they are on different disks that are hotplugged
+    with the journal second.
+    
+    This can be wired up to the journal partition type to ensure that osds are
+    started when the journal appears second.
+    
+    Include the udev rules to trigger this.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a2a78e8d16db0a71b13fc15457abc5fe0091c84c)
+
+commit 062b9296c98a03f4f291615dce010aebc55aaa32
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 11 18:35:01 2013 -0700
+
+    ceph-disk: call partprobe outside of the prepare lock; drop udevadm settle
+    
+    After we change the final partition type, sgdisk may or may not trigger a
+    udev event, depending on how well udev is behaving (it varies between
+    distros, it seems).  The old code would often settle and wait for udev to
+    activate the device, and then partprobe would uselessly fail because it
+    was already mounted.
+    
+    Call partprobe only at the very end, after prepare is done.  This ensures
+    that if partprobe calls udevadm settle (which is sometimes does) we do not
+    get stuck.
+    
+    Drop the udevadm settle.  I'm not sure what this accomplishes; take it out,
+    at least until we determine we need it.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8b3b59e01432090f7ae774e971862316203ade68)
+
+commit 9f9dc8b85a81529deb6865ec5f1cebb45f04ddc4
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 11:03:37 2013 -0700
+
+    ceph-disk: add 'zap' command
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 10ba60cd088c15d4b4ea0b86ad681aa57f1051b6)
+
+commit 4fab29c1c5e4dec79f089e9803adf0e855e5ec4f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 21 12:52:03 2013 -0700
+
+    ceph-disk: fix stat errors with new suppress code
+    
+    Broken by 225fefe5e7c997b365f481b6c4f66312ea28ed61.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bcc8bfdb672654c6a6b48a2aa08267a894debc32)
+
+commit 01ba391b079a494272a071b76f8dee89b5f5c44d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 13 12:35:32 2013 -0700
+
+    ceph-disk: add '[un]suppress-activate <dev>' command
+    
+    It is often useful to prepare but not activate a device, for example when
+    preparing a bunch of spare disks.  This marks a device as 'do not
+    activate' so that it can be prepared without activating.
+    
+    Fixes: #3255
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 225fefe5e7c997b365f481b6c4f66312ea28ed61)
+
+commit 41a15a63349abc5f3e1c0b8de8fcc543e2567035
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 14 11:21:25 2013 -0700
+
+    upstart: start ceph-all on runlevel [2345]
+    
+    Starting when only one network interface has started breaks machines with
+    multiple nics in very problematic ways.
+    
+    There may be an earlier trigger that we can use for cases where other
+    services on the local machine depend on ceph, but for now this is better
+    than the existing behavior.
+    
+    See #5248
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7e08ed1bf154f5556b3c4e49f937c1575bf992b8)
+
+commit 60e4bb0acb41febb75c866646c7102e9a25782f7
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jun 8 17:38:07 2013 -0700
+
+    client: set issue_seq (not seq) in cap release
+    
+    We regularly have been observing a stall where the MDS is blocked waiting
+    for a cap revocation (Ls, in our case) and never gets a reply.  We finally
+    tracked down the sequence:
+    
+     - mds issues cap seq 1 to client
+     - mds does revocation (seq 2)
+     - client replies
+     - much time goes by
+     - client trims inode from cache, sends release with seq == 2
+     - mds ignores release because its issue_seq is 1
+     - mds later tries to revoke other caps
+     - client discards message because it doesn't have the inode in cache
+    
+    The problem is simply that we are using seq instead of issue_seq in the
+    cap release message.  Note that the other release call site in
+    encode_inode_release() is correct.  That one is much more commonly
+    triggered by short tests, as compared to this case where the inode needs to
+    get pushed out of the client cache.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 9b012e234a924efd718826ab6a53b9aeb7cd6649)
+
+commit ae522291d2a9b994a65fed5e63e9fec74eece5be
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 22 15:03:50 2013 -0700
+
+    osd: skip mark-me-down message if osd is not up
+    
+    Fixes crash when the OSD has not successfully booted and gets a
+    SIGINT or SIGTERM.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c2e262fc9493b4bb22c2b7b4990aa1ee7846940e)
+
+commit 48f8d6e3ffe9fc5bb71b362e3059ffb2da69926b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 21:21:51 2013 -0700
+
+    ceph-fuse: create finisher threads after fork()
+    
+    The ObjectCacher and MonClient classes both instantiate Finisher
+    threads.  We need to make sure they are created *after* the fork(2)
+    or else the process will fail to join() them on shutdown, and the
+    threads will not exist while fuse is doing useful work.
+    
+    Put CephFuse on the heap and move all this initalization into the child
+    block, and make sure errors are passed back to the parent.
+    
+    Fix-proposed-by: Alexandre Marangone <alexandre.maragone at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4fa5f99a40792341d247e51488c37301da3c4e4f)
+
+commit 7012d192e6a31d91e57bc9f5b00af6c541ceb3e0
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 6 16:35:54 2013 -0700
+
+    osd: do not include logbl in scrub map
+    
+    This is a potentially use object/file, usually prefixed by a zeroed region
+    on disk, that is not used by scrub at all.  It dates back to
+    f51348dc8bdd5071b7baaf3f0e4d2e0496618f08 (2008) and the original version of
+    scrub.
+    
+    This *might* fix #4179.  It is not a leak per se, but I observed 1GB
+    scrub messages going over the write.  Maybe the allocations are causing
+    fragmentation, or the sub_op queues are growing.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0b036ecddbfd82e651666326d6f16b3c000ade18)
+
+commit c75760e39d8df5b1971343e9f9186fd67e154af6
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 6 21:53:00 2013 -0700
+
+    rgw: handle deep uri resources
+    
+    In case of deep uri resources (ones created beyond a single level
+    of hierarchy, e.g. auth/v1.0) we want to create a new empty
+    handlers for the path if no handlers exists. E.g., for
+    auth/v1.0 we need to have a handler for 'auth', otherwise
+    the default S3 handler will be used, which we don't want.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit ad3934e335399f7844e45fcfd17f7802800d2cb3)
+
+commit bd12e81e48014024171c55f5984c9183c8e363cb
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 6 21:47:21 2013 -0700
+
+    rgw: fix get_resource_mgr() to correctly identify resource
+    
+    Fixes: #5262
+    The original test was not comparing the correct string, ended up
+    with the effect of just checking the substring of the uri to match
+    the resource.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 8d55b87f95d59dbfcfd0799c4601ca37ebb025f5)
+
+commit b1d436e752c9c20e7dbff91b769cb2ba47383571
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jun 6 11:22:38 2013 -0700
+
+    rgw: add 'cors' to the list of sub-resources
+    
+    Fixes: #5261
+    Backport: cuttlefish
+    Add 'cors' to the list of sub-resources, otherwise auth signing
+    is wrong.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 9a0a9c205b8c24ca9c1e05b0cf9875768e867a9e)
+
+commit 4bf75015ae7539a9dbabbbfc0c784dbd58aa6004
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 21:23:45 2013 -0700
+
+    mon: fix preforker exit behavior behavior
+    
+    In 3c5706163b72245768958155d767abf561e6d96d we made exit() not actually
+    exit so that the leak checking would behave for a non-forking case.
+    That is only needed for the normal exit case; every other case expects
+    exit() to actually terminate and not continue execution.
+    
+    Instead, make a signal_exit() method that signals the parent (if any)
+    and then lets you return.  exit() goes back to it's usual behavior,
+    fixing the many other calls in main().
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 92d085f7fd6224ffe5b7651c1f83b093f964b5cd)
+
+commit d398a1850d5895ad409f5229f0dc06651c3d4d75
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Jun 4 13:23:36 2013 -0700
+
+    rados.py: correct some C types
+    
+    trunc was getting size_t instead of uint64_t, leading to bad results
+    in 32-bit environments. Explicitly cast to the desired type
+    everywhere, so it's clear the correct type is being used.
+    
+    Fixes: #5233
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 6dd7d469000144b499af84bda9b735710bb5cec3)
diff --git a/doc/changelog/v0.61.5.txt b/doc/changelog/v0.61.5.txt
new file mode 100644
index 0000000..9d99f91
--- /dev/null
+++ b/doc/changelog/v0.61.5.txt
@@ -0,0 +1,1199 @@
+commit 8ee10dc4bb73bdd918873f29c70eedc3c7ef1979
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed Jul 17 16:39:08 2013 -0700
+
+    v0.61.5
+
+commit 39bffac6b6c898882d03de392f7f2218933d942b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 16 13:14:50 2013 -0700
+
+    ceph-disk: rely on /dev/disk/by-partuuid instead of special-casing journal symlinks
+    
+    This was necessary when ceph-disk-udev didn't create the by-partuuid (and
+    other) symlinks for us, but now it is fragile and error-prone.  (It also
+    appears to be broken on a certain customer RHEL VM.)  See
+    d7f7d613512fe39ec883e11d201793c75ee05db1.
+    
+    Instead, just use the by-partuuid symlinks that we spent all that ugly
+    effort generating.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 64379e701b3ed862c05f156539506d3382f77aa8)
+
+commit 363d54288254b5e2311cd28fce5988d68cfd5773
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 16 16:49:48 2013 +0100
+
+    mon: Monitor: StoreConverter: clearer debug message on 'needs_conversion()'
+    
+    The previous debug message outputted the function's name, as often our
+    functions do.  This was however a source of bewilderment, as users would
+    see those in logs and think their stores would need conversion.  Changing
+    this message is trivial enough and it will make ceph users happier log
+    readers.
+    
+    Backport: cuttlefish
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ad1392f68170b391d11df0ce5523c2d1fb57f60e)
+
+commit 0ea89760def73f76d8100889eca3c25b0a6eb772
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 16 16:45:39 2013 +0100
+
+    mon: Monitor: do not reopen MonitorDBStore during conversion
+    
+    We already open the store on ceph_mon.cc, before we start the conversion.
+    Given we are unable to reproduce this every time a conversion is triggered,
+    we are led to believe that this causes a race in leveldb that will lead
+    to 'store.db/LOCK' being locked upon the open this patch removes.
+    
+    Regardless, reopening the db here is pointless as we already did it when
+    we reach Monitor::StoreConverter::convert().
+    
+    Fixes: #5640
+    Backport: cuttlefish
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 036e6739a4e873863bae3d7d00f310c015dfcdb3)
+
+commit 595c09df9134fb0d62144fe1594914c90e567dca
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 14 15:54:29 2013 -0700
+
+    messages/MClientReconnect: clear data when encoding
+    
+    The MClientReconnect puts everything in the data payload portion of
+    the message and nothing in the front portion.  That means that if the
+    message is resent (socket failure or something), the messenger thinks it
+    hasn't been encoded yet (front empty) and reencodes, which means
+    everything gets added (again) to the data portion.
+    
+    Decoding keep decoding until it runs out of data, so the second copy
+    means we decode garbage snap realms, leading to the crash in bug
+    
+    Clearing data each time around resolves the problem, although it does
+    mean we do the encoding work multiple times.  We could alternatively
+    (or also) stick some data in the front portion of the payload
+    (ignored), but that changes the wire protocol and I would rather not
+    do that.
+    
+    Fixes: #4565
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 314cf046b0b787ca69665e8751eab6fe7adb4037)
+
+commit 8c178e0d39d8d4a4820eb061f79d74f95e60199f
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 15 10:05:37 2013 -0700
+
+    mon: once sync full is chosen, make sure we don't change our mind
+    
+    It is possible for a sequence like:
+    
+     - probe
+     - first probe reply has paxos trim that indicates a full sync is
+       needed
+     - start sync
+     - clear store
+     - something happens that makes us abort and bootstrap (e.g., the
+       provider mon restarts
+     - probe
+     - first probe reply has older paxos trim bound and we call an election
+     - on election completion, we crash because we have no data.
+    
+    Non-determinism of the probe decision aside, we need to ensure that
+    the info we share during probe (fc, lc) is accurate, and that once we
+    clear the store we know we *must* do a full sync.
+    
+    This is a backport of aa60f940ec1994a61624345586dc70d261688456.
+    
+    Fixes: #5621
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 6af0ed9bc4cc955f8c30ad9dc6e9095599f323d0
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 9 14:12:15 2013 -0700
+
+    mon: do not scrub if scrub is in progress
+    
+    This prevents an assert from unexpected scrub results from the previous
+    scrub on the leader.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 00ae543b3e32f89d906a0e934792cc5309f57696)
+
+commit 5642155ba5ca9b384a7af058a6538ac00c2a592d
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 10 10:06:20 2013 -0700
+
+    messages/MPGStats: do not set paxos version to osdmap epoch
+    
+    The PaxosServiceMessage version field is meant for client-coordinated
+    ordering of messages when switching between monitors (and is rarely
+    used).  Do not fill it with the osdmap epoch lest it be compared to a
+    pgmap version, which may cause the mon to (near) indefinitely put it on
+    a wait queue until the pgmap version catches up.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit b36338be43f43b6dd4ee87c97f2eaa23b467c386)
+
+commit 06c65988bb0b1d1ec626fe31e9d806a1c4e24b28
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 11 18:43:24 2013 -0700
+
+    osd/OSDmap: fix OSDMap::Incremental::dump() for new pool names
+    
+    The name is always present when pools are created, but not when they are
+    modified.  Also, a name may be present with a new_pools entry if the pool
+    is just renamed.  Separate it out completely in the dump.
+    
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3e4a29111e89588385e63f8d92ce3d67739dd679)
+
+commit 658240710baaf9c661b8fbf856322907a0d394ee
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 10:49:28 2013 -0700
+
+    mon/PaxosService: prevent reads until initial service commit is done
+    
+    Do not process reads (or, by PaxosService::dispatch() implication, writes)
+    until we have committed the initial service state.  This avoids things like
+    EPERM due to missing keys when we race with mon creation, triggered by
+    teuthology tests doing their health check after startup.
+    
+    Fixes: #5515
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit d08b6d6df7dba06dad73bdec2c945f24afc02717)
+
+commit 5c3ff33771e227b3fb5cc354323846fe8db4ecc1
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 28 12:21:58 2013 -0700
+
+    client: send all request put's through put_request()
+    
+    Make sure all MetaRequest reference put's go through the same path that
+    releases inode references, including all of the error paths.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 87217e1e3cb2785b79d0dec49bd3f23a827551f5)
+
+commit 1df78ad73df581bc7537688ae28bda820b089a13
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 28 11:50:11 2013 -0700
+
+    client: fix remaining Inode::put() caller, and make method psuedo-private
+    
+    Not sure I can make this actually private and make Client::put_inode() a
+    friend method (making all of Client a friend would defeat the purpose).
+    This works well enough, though!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9af3b86b25574e4d2cdfd43e61028cffa19bdeb1)
+
+commit fea024cc3dd2c6fd9ff322d1cd15e0d75c92eca5
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 27 21:39:35 2013 -0700
+
+    client: use put_inode on MetaRequest inode refs
+    
+    When we drop the request inode refs, we need to use put_inode() to ensure
+    they get cleaned up properly (removed from inode_map, caps released, etc.).
+    Do this explicitly here (as we do with all other inode put() paths that
+    matter).
+    
+    Fixes: #5381
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 81bee6487fb1ce9e090b030d61bda128a3cf4982)
+
+commit 62ae39ec8f208cb8f89e43ba844b9a20b4315c61
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 15:57:48 2013 -0700
+
+    mon: be smarter about calculating last_epoch_clean lower bound
+    
+    We need to take PGs whose mapping has not changed in a long time into
+    account.  For them, the pg state will indicate it was clean at the time of
+    the report, in which case we can use that as a lower-bound on their actual
+    latest epoch clean.  If they are not currently clean (at report time), use
+    the last_epoch_clean value.
+    
+    Fixes: #5519
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cc0006deee3153e06ddd220bf8a40358ba830135)
+
+commit da725852190245d2f91b7b21e72baee70e4342bd
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 13:27:58 2013 -0700
+
+    osd: report pg stats to mon at least every N (=500) epochs
+    
+    The mon needs a moderately accurate last_epoch_clean value in order to trim
+    old osdmaps.  To prevent a PG that hasn't peered or received IO in forever
+    from preventing this, send pg stats at some minimum frequency.  This will
+    increase the pg stat report workload for the mon over an idle pool, but
+    should be no worse that a cluster that is getting actual IO and sees these
+    updates from normal stat updates.
+    
+    This makes the reported update a bit more aggressive/useful in that the epoch
+    is the last map epoch processed by this PG and not just one that is >= the
+    currenting interval.  Note that the semantics of this field are pretty useless
+    at this point.
+    
+    See #5519
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit da81228cc73c95737f26c630e5c3eccf6ae1aaec)
+
+commit 757af91b2af0da6bbfeeb53551fa1ef4ef9118ea
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 10 11:32:34 2013 -0700
+
+    osd: fix warning
+    
+    From 653e04a79430317e275dd77a46c2b17c788b860b
+    
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bc291d3fc3fc1cac838565cbe0f25f71d855a6e3)
+
+commit 65af2538329472d2fd078bb961863c40cdabda12
+Merge: e537699 804314b
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 12 15:21:20 2013 -0700
+
+    Merge remote-tracking branch 'gh/wip-mon-sync-2' into cuttlefish
+    
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit e537699b33f84c14f027b56372fbcb0a99bbe88d
+Author: Sandon Van Ness <sandon at inktank.com>
+Date:   Wed Jul 10 14:55:52 2013 -0700
+
+    Get device-by-path by looking for it instead of assuming 3rd entry.
+    
+    On some systems (virtual machines so far) the device-by-path entry
+    from udevadm is not always in the same spot so instead actually
+    look for the right output instead of blindy assuming that its a
+    specific field in the output.
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    Reviewed-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 804314b8bfa5ec75cc9653e2928874c457395c92
+Merge: 6ad9fe1 78f2266
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 10 11:40:37 2013 -0700
+
+    Merge remote-tracking branch 'gh/cuttlefish' into wip-mon-sync-2
+
+commit 78f226634bd80f6678b1f74ccf785bc52fcd6b62
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 10 11:02:08 2013 -0700
+
+    osd: limit number of inc osdmaps send to peers, clients
+    
+    We should not send an unbounded number of inc maps to our peers or clients.
+    In particular, if a peer is not contacted for a while, we may think they
+    have a very old map (say, 10000 epochs ago) and send thousands of inc maps
+    when the distribution shifts and we need to peer.
+    
+    Note that if we do not send enough maps, the peers will make do by
+    requesting the map from somewhere else (currently the mon).  Regardless
+    of the source, however, we must limit the amount that we speculatively
+    share as it usually is not needed.
+    
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 653e04a79430317e275dd77a46c2b17c788b860b)
+
+commit 54ee2dc80ed032c286546da51442340ec9991cdf
+Author: Christophe Courtaut <christophe.courtaut at gmail.com>
+Date:   Mon Jul 1 14:57:17 2013 +0200
+
+    rgw: Fix return value for swift user not found
+    
+    http://tracker.ceph.com/issues/1779 fixes #1779
+    
+    Adjust the return value from rgw_get_user_info_by_swift call
+    in RGW_SWIFT_Auth_Get::execute() to have the correct
+    return code in response.
+    (cherry picked from commit 4089001de1f22d6acd0b9f09996b71c716235551)
+
+commit 47852c263831707fff1570317a7446b0700c5962
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 9 21:55:51 2013 -0700
+
+    mon/OSDMonitor: make 'osd crush rm ...' slightly more idempotent
+    
+    This is a manual backport of 18a624fd8b90d9959de51f07622cf0839e6bd9aa.
+    Do not return immediately if we are looking at uncommitted state.t
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit bfc26c656d183fbcc90a352391e47f9f51c96052
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 17:46:40 2013 -0700
+
+    mon/OSDMonitor: fix base case for loading full osdmap
+    
+    Right after cluster creation, first_committed is 1 and latest stashed in 0,
+    but we don't have the initial full map yet.  Thereafter, we do (because we
+    write it with trim).  Fixes afd6c7d8247075003e5be439ad59976c3d123218.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 43fa7aabf1f7e5deb844c1f52d451bab9e7d1006)
+
+commit 7fb3804fb860dcd0340dd3f7c39eec4315f8e4b6
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 15:04:59 2013 -0700
+
+    mon: fix osdmap stash, trim to retain complete history of full maps
+    
+    The current interaction between sync and stashing full osdmaps only on
+    active mons means that a sync can result in an incomplete osdmap_full
+    history:
+    
+     - mon.c starts a full sync
+     - during sync, active osdmap service should_stash_full() is true and
+       includes a full in the txn
+     - mon.c sync finishes
+     - mon.c update_from_paxos gets "latest" stashed that it got from the
+       paxos txn
+     - mon.c does *not* walk to previous inc maps to complete it's collection
+       of full maps.
+    
+    To fix this, we disable the periodic/random stash of full maps by the
+    osdmap service.
+    
+    This introduces a new problem: we must have at least one full map (the first
+    one) in order for a mon that just synced to build it's full collection.
+    Extend the encode_trim() process to allow the osdmap service to include
+    the oldest full map with the trim txn.  This is more complex than just
+    writing the full maps in the txn, but cheaper--we only write the full
+    map at trim time.
+    
+    This *might* be related to previous bugs where the full osdmap was
+    missing, or case where leveldb keys seemed to 'disappear'.
+    
+    Fixes: #5512
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit afd6c7d8247075003e5be439ad59976c3d123218)
+
+commit 24f90b832c695ef13021db66a178c18369ac356d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 15:07:57 2013 -0700
+
+    mon: implement simple 'scrub' command
+    
+    Compare all keys within the sync'ed prefixes across members of the quorum
+    and compare the key counts and CRC for inconsistencies.
+    
+    Currently this is a one-shot inefficient hammer.  We'll want to make this
+    work in chunks before it is usable in production environments.
+    
+    Protect with a feature bit to avoid sending MMonScrub to mons who can't
+    decode it.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit a9906641a1dce150203b72682da05651e4d68ff5)
+    
+    Conflicts:
+    
+    	src/mon/MonCommands.h
+    	src/mon/Monitor.cc
+
+commit 926f723c12428a034545c6c4ff6641e1d5e05d24
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jul 3 11:18:33 2013 -0700
+
+    Elector.h: features are 64 bit
+    
+    Fixes: #5497
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit 3564e304e3f50642e4d9ff25e529d5fc60629093)
+
+commit c2b38291e706c9d1d4d337cee3a944f34bf66525
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jul 3 11:18:19 2013 -0700
+
+    ceph_features.h: declare all features as ULL
+    
+    Otherwise, the first 32 get |'d together as ints.  Then, the result
+    ((int)-1) is sign extended to ((long long int)-1) before being |'d
+    with the 1LL entries.  This results in ~((uint64_t)0).
+    
+    Fixes: #5497
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit 4255b5c2fb54ae40c53284b3ab700fdfc7e61748)
+
+commit 95ef961d8537fc369efd0634262ffb8f288d6e9e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jul 2 21:09:36 2013 -0700
+
+    Pipe: use uint64_t not unsigned when setting features
+    
+    Fixes: #5497
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit bc3e2f09f8860555d8b3b49b2eea164b4118d817)
+
+commit 09d258b70a28e5cea555b9d7e215fe41d6b84577
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 11:24:48 2013 -0700
+
+    client: remove O_LAZY
+    
+    The once-upon-a-time unique O_LAZY value I chose forever ago is now
+    O_NOATIME, which means that some clients are choosing relaxed
+    consistency without meaning to.
+    
+    It is highly unlikely that a real O_LAZY will ever exist, and we can
+    select it in the ceph case with the ioctl or libcephfs call, so drop
+    any support for doing this via open(2) flags.
+    
+    Update doc/lazy_posix.txt file re: lazy io.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 94afedf02d07ad4678222aa66289a74b87768810)
+
+commit c3b684932bad31fc853ad556d16e1e4a9926486e
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 8 12:55:20 2013 -0700
+
+    osd/osd_types: fix pg_stat_t::dump for last_epoch_clean
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 69a55445439fce0dd6a3d32ff4bf436da42f1b11)
+
+commit a02f2510fcc800b9f2cf2a06401a7b97d5985409
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 5 16:03:49 2013 -0700
+
+    mon: remove bad assert about monmap version
+    
+    It is possible to start a sync when our newest monmap is 0.  Usually we see
+    e0 from probe, but that isn't always published as part of the very first
+    paxos transaction due to the way PaxosService::_active generates it's
+    first initial commit.
+    
+    In any case, having e0 here is harmless.
+    
+    Fixes: #5509
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 85a1d6cc5d3852c94d1287b566656c5b5024fa13)
+
+commit 6ad9fe17a674ba65bbeb4052cb1ac47f3113e7bf
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 4 19:33:06 2013 -0700
+
+    mon/Paxos: fix sync restart
+    
+    If we have a sync going, and an election intervenes, the client will
+    try to continue by sending a new start_chunks request.  In order to
+    ensure that we get all of the paxos commits from our original starting
+    point (and thus properly update the keys from which they started),
+    only pay attention if they *also* send their current last_committed
+    version.  Otherwise, start them at the beginning.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit c5812b1c893305a7d20f9eaec2695c8b1691f0c9
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 4 14:57:06 2013 -0700
+
+    mon: uninline _trim_enable and Paxos::trim_{enable,disable} so we can debug them
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 6fbcbd7fddf35a5be4b38e536871903bff4f9bf1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 4 14:55:34 2013 -0700
+
+    mon/Paxos: increase paxos max join drift
+    
+    A value of 10 is too aggressive for large, long-running syncs. 100 is
+    about 2 minutes of activity at most, which should be a more forgiving
+    buffer.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit f3a51fa30e5ce1656853b40d831409f195f6e4ca
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 4 14:21:04 2013 -0700
+
+    mon/Paxos: configure minimum paxos txns separately
+    
+    We were using paxos_max_join_drift to control the minimum number of
+    paxos transactions to keep around.  Instead, make this explicit, and
+    separate from the join drift.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 1156721f22f5f337241eef3d0276ca74fe6352d1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 4 17:09:07 2013 -0700
+
+    mon: include any new paxos commits in each sync CHUNK message
+    
+    We already take note of the paxos version when we begin the sync.  As
+    sync progresses and there are new paxos commits/txns, include those
+    and update last_committed, so that when sync completes we will have
+    a full view of everything that happened during sync.
+    
+    Note that this does not introduce any compatibility change.  This change
+    *only* affects the provider.  The key difference is that at the end
+    of the sync, the provide will set version to the latest version, and
+    not the version from the start of the sync (as was done previously).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 40672219a081f0dc2dd536977290ef05cfc9f097
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 4 12:17:28 2013 -0700
+
+    mon/MonitorDBStore: expose get_chunk_tx()
+    
+    Allow users get the transaction unencoded.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit db2bb270e93ed44f9252d65d1d4c9b36875d0ea5
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 3 17:15:56 2013 -0700
+
+    mon: enable leveldb cache by default
+    
+    256 is not as large as the upstream 512 MB, but will help signficiantly and
+    be less disruptive for existing cuttlefish clusters.
+    
+    Sort-of backport of e93730b7ffa48b53c8da2f439a60cb6805facf5a.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 123f676e3ae8154ca94cb076c4c4ec5389d2a643
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 3 16:56:06 2013 -0700
+
+    mon/Paxos: make 'paxos trim disabled max versions' much much larger
+    
+    108000 is about 3 hours if paxos is going full-bore (1 proposal/second).
+    That ought to be pretty safe.  Otherwise, we start trimming to soon and a
+    slow sync will just have to restart when it finishes.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 71ebfe7e1abe4795b46cf00dfe1b03d1893368b0)
+    
+    Conflicts:
+    
+    	src/common/config_opts.h
+
+commit 03393c0df9f54e4f1db60e1058ca5a7cd89f44e6
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 26 06:01:40 2013 -0700
+
+    mon: do not reopen MonitorDBStore during startup
+    
+    level doesn't seem to like this when it races with an internal compaction
+    attempt (see below).  Instead, let the store get opened by the ceph_mon
+    caller, and pull a bit of the logic into the caller to make the flow a
+    little easier to follow.
+    
+        -2> 2013-06-25 17:49:25.184490 7f4d439f8780 10 needs_conversion
+        -1> 2013-06-25 17:49:25.184495 7f4d4065c700  5 asok(0x13b1460) entry start
+         0> 2013-06-25 17:49:25.316908 7f4d3fe5b700 -1 *** Caught signal (Segmentation fault) **
+     in thread 7f4d3fe5b700
+    
+     ceph version 0.64-667-g089cba8 (089cba8fc0e8ae8aef9a3111cba7342ecd0f8314)
+     1: ceph-mon() [0x649f0a]
+     2: (()+0xfcb0) [0x7f4d435dccb0]
+     3: (leveldb::Table::BlockReader(void*, leveldb::ReadOptions const&, leveldb::Slice const&)+0x154) [0x806e54]
+     4: ceph-mon() [0x808840]
+     5: ceph-mon() [0x808b39]
+     6: ceph-mon() [0x806540]
+     7: (leveldb::DBImpl::DoCompactionWork(leveldb::DBImpl::CompactionState*)+0xdd) [0x7f363d]
+     8: (leveldb::DBImpl::BackgroundCompaction()+0x2c0) [0x7f4210]
+     9: (leveldb::DBImpl::BackgroundCall()+0x68) [0x7f4cc8]
+     10: ceph-mon() [0x80b3af]
+     11: (()+0x7e9a) [0x7f4d435d4e9a]
+     12: (clone()+0x6d) [0x7f4d4196bccd]
+     NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ea1f316e5de21487ae034a1aa929068ba23ac525)
+
+commit 0143acc49bc5834836afc2c5a9d8f67030bec85f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 2 14:43:17 2013 -0700
+
+    sysvinit, upstart: handle symlinks to dirs in /var/lib/ceph/*
+    
+    Match a symlink to a dir, not just dirs.  This fixes the osd case of e.g.,
+    creating an osd in /data/osd$id in which ceph-disk makes a symlink from
+    /var/lib/ceph/osd/ceph-$id.
+    
+    Fix proposed by Matt Thompson <matt.thompson at mandiant.com>; extended to
+    include the upstart users too.
+    
+    Fixes: #5490
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 87c98e92d1375c8bc76196bbbf06f677bef95e64)
+
+commit 7e878bcc8c1b51538f3c05f854a9dac74c09b116
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 1 17:33:11 2013 -0700
+
+    rgw: add RGWFormatter_Plain allocation to sidestep cranky strlen()
+    
+    Valgrind complains about an invalid read when we don't pad the allocation,
+    and because it is inlined we can't whitelist it for valgrind.  Workaround
+    the warning by just padding our allocations a bit.
+    
+    Fixes: #5346
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 49ff63b1750789070a8c6fef830c9526ae0f6d9f)
+
+commit ca61402855966210ba1598239eaf454eaad0f5f2
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Wed May 15 11:24:36 2013 +0800
+
+    mds: warn on unconnected snap realms
+    
+    When there are more than one active MDS, restarting MDS triggers
+    assertion "reconnected_snaprealms.empty()" quite often. If there
+    is no snapshot in the FS, the items left in reconnected_snaprealms
+    should be other MDS' mdsdir. I think it's harmless.
+    
+    If there are snapshots in the FS, the assertion probably can catch
+    real bugs. But at present, snapshot feature is broken, fixing it is
+    non-trivial. So replace the assertion with a warning.
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit 26effc0e583b0a3dade6ec81ef26dec1c94ac8b2)
+
+commit e11f258831e14dc3755e09c0fd4f9bfdf79022a7
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 26 06:53:08 2013 -0700
+
+    mon/PGMonitor: use post_paxos_update, not init, to refresh from osdmap
+    
+    We do two things here:
+     - make init an one-time unconditional init method, which is what the
+       health service expects/needs.
+     - switch PGMonitor::init to be post_paxos_update() which is called after
+       the other services update, which is what PGMonitor really needs.
+    
+    This is a new version of the fix originally in commit
+    a2fe0137946541e7b3b537698e1865fbce974ca6 (and those around it).  That is,
+    this re-fixes a problem where osds do not see pg creates from their
+    subscribe due to map_pg_creates() not getting called.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e635c47851d185eda557e36bdc4bf3775f7b87a2)
+    
+    Conflicts:
+    	src/mon/PGMonitor.cc
+    	src/mon/PGMonitor.h
+
+commit 4d07fb014178da3c88edeb8765e1aaacb8cb8ffa
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 26 06:52:01 2013 -0700
+
+    mon/PaxosService: add post_paxos_update() hook
+    
+    Some services need to update internal state based on other service's
+    state, and thus need to be run after everyone has pulled their info out of
+    paxos.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 131686980f0a930d5de7cbce8234fead5bd438b6)
+
+commit 90f5c448abeb127ae5a5528a79bd7bdbc74cb497
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu Jun 27 14:58:14 2013 -0700
+
+    ceph-disk: s/else if/elif/
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Joao Luis <joao.luis at inktank.com>
+    (cherry picked from commit bd8255a750de08c1b8ee5e9c9a0a1b9b16171462)
+    (cherry picked from commit 9e604ee6943fdb131978afbec51321050faddfc6)
+
+commit 5c4bb463dca5aa61ea5f02f7592d5a3cc82cf6f4
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jun 26 11:28:57 2013 -0700
+
+    rgw: fix radosgw-admin buckets list
+    
+    Fixes: #5455
+    Backport: cuttlefish
+    This commit fixes a regression, where radosgw-admin buckets list
+    operation wasn't returning any data.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e1f9fe58d2860fcbb18c92d3eb3946236b49a6ce)
+
+commit b2fb48762f32279e73feb83b220339fea31275e9
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 19 17:27:49 2013 -0700
+
+    ceph-disk: use unix lock instead of lockfile class
+    
+    The lockfile class relies on file system trickery to get safe mutual
+    exclusion.  However, the unix syscalls do this for us.  More
+    importantly, the unix locks go away when the owning process dies, which
+    is behavior that we want here.
+    
+    Fixes: #5387
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 2a4953b697a3464862fd3913336edfd7eede2487)
+
+commit 26e7a6fffde4abcb685f34247e8491c05ee2a68d
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 26 18:27:49 2013 -0700
+
+    ceph-disk: do not mount over an osd directly in /var/lib/ceph/osd/$cluster-$id
+    
+    If we see a 'ready' file in the target OSD dir, do not mount our device
+    on top of it.
+    
+    Among other things, this prevents ceph-disk activate on stray disks from
+    stepping on teuthology osds.
+    
+    Fixes: #5445
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8a17f33b14d858235dfeaa42be1f4842dcfd66d2)
+
+commit ccb3dd5ad5533ca4e9b656b4e3df31025a5f2017
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Tue Apr 2 15:46:51 2013 +0800
+
+    mds: fix underwater dentry cleanup
+    
+    If the underwater dentry is a remove link, we shouldn't mark the
+    inode clean
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit 81d073fecb58e2294df12b71351321e6d2e69652)
+
+commit 3020c5ea07a91475a7261dc2b810f5b61a1ae1f2
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 24 18:51:07 2013 -0700
+
+    mon/Elector: cancel election timer if we bootstrap
+    
+    If we short-circuit and bootstrap, cancel our timer.  Otherwise it will
+    go off some time later when we are in who knows what state.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 9ae0ec83dabe37ac15e5165559debdfef7a5f91d)
+
+commit 305f0c50a5f0ffabc73e10bdf4590217d5d5d211
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 24 18:12:11 2013 -0700
+
+    mon: cancel probe timeout on reset
+    
+    If we are probing and get (say) an election timeout that calls reset(),
+    cancel the timer.  Otherwise, we assert later with a splat like
+    
+    2013-06-24 01:09:33.675882 7fb9627e7700  4 mon.b at 0(leader) e1 probe_timeout 0x307a520
+    2013-06-24 01:09:33.676956 7fb9627e7700 -1 mon/Monitor.cc: In function 'void Monitor::probe_timeout(int)' thread 7fb9627e7700 time 2013-06-24 01:09:43.675904
+    mon/Monitor.cc: 1888: FAILED assert(is_probing() || is_synchronizing())
+    
+     ceph version 0.64-613-g134d08a (134d08a9654f66634b893d493e4a92f38acc63cf)
+     1: (Monitor::probe_timeout(int)+0x161) [0x56f5c1]
+     2: (Context::complete(int)+0xa) [0x574a2a]
+     3: (SafeTimer::timer_thread()+0x425) [0x7059a5]
+     4: (SafeTimerThread::entry()+0xd) [0x7065dd]
+     5: (()+0x7e9a) [0x7fb966f62e9a]
+     6: (clone()+0x6d) [0x7fb9652f9ccd]
+     NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.
+    
+    Fixes: #5438
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 03d3be3eaa96a8e72754c36abd6f355c68d52d59)
+
+commit a8f601d543168f4cdbddf674479d8de4b8dfc732
+Author: Alexandre Maragone <alexandre.marangone at inktank.com>
+Date:   Tue Jun 18 16:18:01 2013 -0700
+
+    ceph-disk: make list_partition behave with unusual device names
+    
+    When you get device names like sdaa you do not want to mistakenly conclude that
+    sdaa is a partition of sda.  Use /sys/block/$device/$partition existence
+    instead.
+    
+    Fixes: #5211
+    Backport: cuttlefish
+    Signed-off-by: Alexandre Maragone <alexandre.maragone at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8c0daafe003935881c5192e0b6b59b949269e5ae)
+
+commit 1c890f5cdfc596588e54fffeb016b4a5e9e2124c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 20:28:24 2013 -0700
+
+    client: fix warning
+    
+    client/Client.cc: In member function 'virtual void Client::ms_handle_remote_reset(Connection*)':
+    warning: client/Client.cc:7892:9: enumeration value 'STATE_NEW' not handled in switch [-Wswitch]
+    warning: client/Client.cc:7892:9: enumeration value 'STATE_OPEN' not handled in switch [-Wswitch]
+    warning: client/Client.cc:7892:9: enumeration value 'STATE_CLOSED' not handled in switch [-Wswitch]
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 8bd936f077530dfeb2e699164e4492b1c0973088)
+
+commit c3b97591fd8206825bcfe65bdb24fbc75a2a9b42
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 24 17:58:48 2013 -0700
+
+    mon/AuthMonitor: ensure initial rotating keys get encoded when create_initial called 2x
+    
+    The create_initial() method may get called multiple times; make sure it
+    will unconditionally generate new/initial rotating keys.  Move the block
+    up so that we can easily assert as much.
+    
+    Broken by commit cd98eb0c651d9ee62e19c2cc92eadae9bed678cd.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 521fdc2a4e65559b3da83283e6ca607b6e55406f)
+
+commit 0cc826c385edb2e327505696491d3ff1c3bfe8fd
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 24 17:42:04 2013 -0700
+
+    init-radosgw.sysv: remove -x debug mode
+    
+    Fixes: #5443
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 31d6062076fdbcd2691c07a23b381b26abc59f65)
+
+commit 4d57c12faceb7f591f10776c6850d98da55c667b
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 24 12:52:44 2013 -0700
+
+    common/pick_addresses: behave even after internal_safe_to_start_threads
+    
+    ceph-mon recently started using Preforker to working around forking issues.
+    As a result, internal_safe_to_start_threads got set sooner and calls to
+    pick_addresses() which try to set string config values now fail because
+    there are no config observers for them.
+    
+    Work around this by observing the change while we adjust the value.  We
+    assume pick_addresses() callers are smart enough to realize that their
+    result will be reflected by cct->_conf and not magically handled elsewhere.
+    
+    Fixes: #5195, #5205
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit eb86eebe1ba42f04b46f7c3e3419b83eb6fe7f9a)
+
+commit e1ac7c6c3ca673d08710829aa5a3c03735710486
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 20 15:39:23 2013 -0700
+
+    mon/PaxosService: allow paxos service writes while paxos is updating
+    
+    In commit f985de28f86675e974ac7842a49922a35fe24c6c I mistakenly made
+    is_writeable() false while paxos was updating due to a misread of
+    Paxos::propose_new_value() (I didn't see that it would queue).
+    This is problematic because it narrows the window during which each service
+    is writeable for no reason.
+    
+    Allow service to be writeable both when paxos is active and updating.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 11169693d086e67dcf168ce65ef6e13eebd1a1ab)
+
+commit 02b0b4a9acb439b2ee5deadc8b02492006492931
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 7 11:41:21 2013 -0700
+
+    mon/PaxosService: not active during paxos UPDATING_PREVIOUS
+    
+    Treat this as an extension of the recovery process, e.g.
+    
+     RECOVERING -> ACTIVE
+    or
+     RECOVERING -> UPDATING_PREVIOUS -> ACTIVE
+    
+    and we are not active until we get to "the end" in both cases.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 392a8e21f8571b410c85be2129ef62dd6fc52b54)
+
+commit c6d5dc4d47838c8c8f4d059b7d018dea3f9c4425
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 7 11:40:22 2013 -0700
+
+    mon: simplify states
+    
+    - make states mutually exclusive (an enum)
+    - rename locked -> updating_previous
+    - set state prior to begin() to simplify things a bit
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ee34a219605d1943740fdae0d84cfb9020302dd6)
+
+commit c43b1f4dff254df96144b0b4d569cc72421a8fff
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 7 11:14:58 2013 -0700
+
+    mon/Paxos: not readable when LOCKED
+    
+    If we are re-proposing a previously accepted value from a previous quorum,
+    we should not consider it readable, because it is possible it was exposed
+    to clients as committed (2/3 accepted) but not recored to be committed, and
+    we do not want to expose old state as readable when new state was
+    previously readable.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ec2ea86ed55e00265c2cc5ad0c94460b4c92865c)
+
+commit 10d41200622d76dbf276602828584e7153cb22b5
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 7 11:07:38 2013 -0700
+
+    mon/Paxos: cleanup: drop unused PREPARING state bit
+    
+    This is never set when we block, and nobody looks at it.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7b7ea8e30e20704caad9a841332ecb2e39819a41)
+
+commit 9d7c40e3f4ea2dd969aa0264ea8a6ad74f3e678a
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 6 15:20:05 2013 -0700
+
+    mon/PaxosService: simplify is_writeable
+    
+    Recast this in terms of paxos check + our conditions, and make it
+    match wait_for_writeable().
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f985de28f86675e974ac7842a49922a35fe24c6c)
+
+commit 35745cba8985c5f3238e3c28fd28b194fae043d9
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 4 17:03:15 2013 -0700
+
+    mon/PaxosService: simplify readable check
+    
+    Recast this in terms of the paxos check and our additional conditions,
+    which match wait_for_readable().
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3aa61a0beb540e48bf61ceded766d6ff52c95eb2)
+
+commit 57c89291a48c319907fb3029746d9f5a4bd9dd61
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 16:45:08 2013 -0700
+
+    mon: simplify Monitor::init_paxos()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e832e76a4af04b091c806ad412bcfd0326d75a2d)
+
+commit fd1769cb2d61e8f2c7921a78760e8f12b28258fb
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 16:39:37 2013 -0700
+
+    mon/Paxos: go active *after* refreshing
+    
+    The update_from_paxos() methods occasionally like to trigger new activity.
+    As long as they check is_readable() and is_writeable(), they will defer
+    until we go active and that activity will happen in the normal callbacks.
+    
+    This fixes the problem where we active but is_writeable() is still false,
+    triggered by PGMonitor::check_osd_map().
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e68b1bd36ed285e38a558899f83cf224d3aa60ed)
+
+commit cf75478d027dfd377424988745230d096dae79ac
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 15:32:06 2013 -0700
+
+    mon: safely signal bootstrap from MonmapMonitor::update_from_paxos()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dc83430124a5fd37573202a4cc0986c3c03739ef)
+
+commit 6ac58cd9c1f9c80c5f3cbe97e19cfcd8427db46d
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 16:57:11 2013 -0700
+
+    mon/Paxos: do paxos refresh in finish_proposal; and refactor
+    
+    Do the paxos refresh inside finish_proposal, ordered *after* the leader
+    assertion so that MonmapMonitor::update_from_paxos() calling bootstrap()
+    does not kill us.
+    
+    Also, remove unnecessary finish_queued_proposal() and move the logic inline
+    where the bad leader assertion is obvious.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a42d7582f816b45f5d19c393fd45447555e78fdd)
+
+commit 054e96d96533b1c4078402e43184f13b97329905
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Sun Jun 2 16:15:02 2013 -0700
+
+    mon/PaxosService: cache {first,last}_committed
+    
+    Refresh the in-memory values when we are told the on-disk paxos state
+    may have changed.
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 2fccb300bdf6ffd44db3462eb05115da11322ed4)
+
+commit 265212a7384399bf85e15e6978bc7543824c0e92
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 31 14:30:48 2013 -0700
+
+    mon: no need to refresh from _active
+    
+    The refresh is done explicitly by the monitor, independent of the more
+    fragile PaxosService callbacks.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d941363d6e4249e97b64faff0e573f75e918ac0c)
+
+commit 1d8662504299babec22c714662cefbb86a0acb8b
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 16:10:57 2013 -0700
+
+    mon: remove unnecessary update_from_paxos calls
+    
+    The refresh() will do this when the state changes; no need to
+    opportunistically call this method all of the time.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 03014a4ecc06cde420fad0c6c2a0177ebd7b839d)
+
+commit 34acc5a3161b6bcda2b9f7ce18d89a8618fff1c5
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 2 16:14:01 2013 -0700
+
+    mon: explicitly refresh_from_paxos() when leveldb state changes
+    
+    Instead of opportunistically calling each service's update_from_paxos(),
+    instead explicitly refresh all in-memory state whenever we know the
+    paxos state may have changed.  This is simpler and less fragile.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cc339c07312006e65854207523f50542d00ecf87)
+
+commit 4474a0cc6c009a566ecf46efadb39d80343a7c68
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 23 09:25:55 2013 -0700
+
+    mon/AuthMonitor: make initial auth include rotating keys
+    
+    This closes a very narrow race during mon creation where there are no
+    service keys.
+    
+    Fixes: #5427
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cd98eb0c651d9ee62e19c2cc92eadae9bed678cd)
+
+commit d572cf6f77418f217a5a8e37f1124dc566e24d0b
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 21 11:53:29 2013 -0700
+
+    mds: fix iterator invalidation for backtrace removal
+    
+    - Don't increment before we dereference!
+    - We need to update the iterator before we delete the item.
+    
+    This code is changed in master, so this fix is for cuttlefish only.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 50957772c3582290331f69ba4a985b1cdf86834d
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 9 09:44:20 2013 -0700
+
+    osd: init test_ops_hook
+    
+    CID 1019628 (#1 of 1): Uninitialized pointer field (UNINIT_CTOR)
+    2. uninit_member: Non-static class member "test_ops_hook" is not initialized in this constructor nor in any functions that it calls.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e30a03210c3efb768b1653df5ae58917ef26e579)
+
+commit 17d2745f095e7bb640dece611d7824d370ea3b81
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 9 09:45:51 2013 -0700
+
+    osd: initialize OSDService::next_notif_id
+    
+    CID 1019627 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)
+    2. uninit_member: Non-static class member "next_notif_id" is not initialized in this constructor nor in any functions that it calls.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 499edd8bfc355c2d590f5fa1ef197d1ea5680351)
+
+commit ffdb7236a994aa20b5f75860b9c81dac0f131f9a
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 20 09:46:42 2013 -0700
+
+    mon: more fix dout use in sync_requester_abort()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d60534b8f59798feaeeaa17adba2a417d7777cbf)
+
+commit 38ddae04bb974a93f1718c509363f1afbe6b612d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 10 11:48:25 2013 -0700
+
+    mon: fix raw use of *_dout in sync_requester_abort()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8a4ed58e39b287fd8667c62b45848487515bdc80)
diff --git a/doc/changelog/v0.61.6.txt b/doc/changelog/v0.61.6.txt
new file mode 100644
index 0000000..3a1e5bd
--- /dev/null
+++ b/doc/changelog/v0.61.6.txt
@@ -0,0 +1,75 @@
+commit 59ddece17e36fef69ecf40e239aeffad33c9db35
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Tue Jul 23 13:52:19 2013 -0700
+
+    v0.61.6
+
+commit 38c3271d3fc415919f0856398bd94eb87a0776b5
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 23 13:32:12 2013 -0700
+
+    mon/OSDMonitor: fix base case for 7fb3804fb workaround
+    
+    After cluster creation, we have no full map stored and first_committed ==
+    1.  In that case, there is no need for a full map, since we can get there
+    from OSDMap() and the incrementals.
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao at inktank.com>
+    (cherry picked from commit e807770784175b05130bba938113fdbf874f152e)
+
+commit f94956cb1a56ff62e01b7ae218a93c4004470ae5
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 23 17:25:13 2013 +0100
+
+    mon: OSDMonitor: work around a full version bug introduced in 7fb3804fb
+    
+    In 7fb3804fb860dcd0340dd3f7c39eec4315f8e4b6 we moved the full version
+    stashing logic to the encode_trim_extra() function.  However, we forgot
+    to update the osdmap's 'latest_full' key that should always point to
+    the latest osdmap full version.  This eventually degenerated in a missing
+    full version after a trim.  This patch works around this bug by looking
+    for the latest available full osdmap version in the store and updating
+    'latest_full' to its proper value.
+    
+    Related-to: #5704
+    Backport: cuttlefish
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 97462a3213e5e15812c79afc0f54d697b6c498b1)
+
+commit 10e1de45dc8ace793ecf921f884f90c9daa99c48
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 23 16:36:52 2013 +0100
+
+    mon: OSDMonitor: update the osdmap's latest_full with the new full version
+    
+    We used to do this on encode_full(), but since [1] we no longer rely on
+    PaxosService to manage the full maps for us.  And we forgot to write down
+    the latest_full version to the store, leaving it in a truly outdated state.
+    
+    [1] - 7fb3804fb860dcd0340dd3f7c39eec4315f8e4b6
+    
+    Fixes: #5704
+    Backport: cuttlefish
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a815547ed3e5ffdbbb96c8c0c1b8d6dd8c62bfba)
+
+commit a0cb40b45c4f2f921a63c2d7bb5a28572381d793
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 18 14:35:19 2013 -0700
+
+    mon: decline to scrub when paxos is not active
+    
+    In f1ce8d7c955a2443111bf7d9e16b4c563d445712 we close a race between scrub
+    and paxos commit completion on the leader.  The fix is nontrivial to
+    backport and probably not worthwhile; just avoid scrubbing at that time
+    for now.
+    
+    Note that the actual fix for this is in commit
+    f1ce8d7c955a2443111bf7d9e16b4c563d445712.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
diff --git a/doc/changelog/v0.61.7.txt b/doc/changelog/v0.61.7.txt
new file mode 100644
index 0000000..5836c6a
--- /dev/null
+++ b/doc/changelog/v0.61.7.txt
@@ -0,0 +1,220 @@
+commit 8f010aff684e820ecc837c25ac77c7a05d7191ff
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed Jul 24 20:44:12 2013 -0700
+
+    v0.61.7
+
+commit 24a56a9637afd8c64b71d264359c78a25d52be02
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 24 14:46:24 2013 -0700
+
+    ceph-disk: use new get_dev_path helper for list
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    Tested-by: Olivier Bonvalet <ob.ceph at daevel.fr>
+    (cherry picked from commit fd1fd664d6102a2a96b27e8ca9933b54ac626ecb)
+
+commit 1f8e4b15eeb132fd7f389318009b19f8f13adbf5
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 11 12:59:56 2013 -0700
+
+    ceph-disk: use /sys/block to determine partition device names
+    
+    Not all devices are basename + number; some have intervening character(s),
+    like /dev/cciss/c0d1p2.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2ea8fac441141d64ee0d26c5dd2b441f9782d840)
+
+commit 0a08c8226cb3e461301beade9bab2e264d1b960e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 3 11:01:58 2013 -0700
+
+    ceph-disk: reimplement is_partition() using /sys/block
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5b031e100b40f597752b4917cdbeebb366eb98d7)
+
+commit 056000346db09ea7274a22e57cf4b86a7ea4090e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 3 11:01:39 2013 -0700
+
+    ceph-disk: use get_dev_name() helper throughout
+    
+    This is more robust than the broken split trick.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3359aaedde838c98d1155611e157fd2da9e8b9f5)
+
+commit f3ee3e690c42769229a6cd9ae8dec43f2aa22ecd
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 3 10:55:36 2013 -0700
+
+    ceph-disk: refactor list_[all_]partitions
+    
+    Make these methods work in terms of device *names*, not paths, and fix up
+    the only direct list_partitions() caller to do the same.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 35d3f2d84808efda3d2ac868afe03e6959d51c03)
+
+commit be12811b4cb98ff1c2c691c67af7ad3586c436ff
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 3 10:52:29 2013 -0700
+
+    ceph-disk: add get_dev_name, path helpers
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e0401591e352ea9653e3276d66aebeb41801eeb3)
+
+commit f46dbc462f623e9ab6c00394abb4d890e5d90890
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 18 16:21:48 2013 -0700
+
+    ceph-disk: handle /dev/foo/bar devices throughout
+    
+    Assume the last component is the unique device name, even if it appears
+    under a subdir of /dev.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cb97338b1186939deecb78e9d949c38c3ef59026)
+
+commit f799dac7bdf7cf0824a177131473cf59ef3c5205
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 20:54:15 2013 -0700
+
+    ceph-disk: make is_held() smarter about full disks
+    
+    Handle the case where the device is a full disk.  Make the partition
+    check a bit more robust (don't make assumptions about naming aside from
+    the device being a prefix of the partition).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e082f1247fb6ddfb36c4223cbfdf500d6b45c978)
+
+commit 27f31895664fa7f10c1617d486f2a6ece0f97091
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 24 11:55:42 2013 -0700
+
+    mon/OSDMonitor: search for latest full osdmap if record version is missing
+    
+    In 97462a3213e5e15812c79afc0f54d697b6c498b1 we tried to search for a
+    recent full osdmap but were looking at the wrong key.  If full_0 was
+    present we could record that the latest full map was last_committed even
+    though it wasn't present.  This is fixed in 76cd7ac1c, but we need to
+    compensate for when get_version_latest_full() gives us a back version
+    number by repeating the search.
+    
+    Fixes: #5737
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit c2131d4047156aa2964581c9dbd93846382a07e7)
+
+commit 5b0967f03efb1be210b52f24f095f023fe1bc539
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Mon Jun 17 14:43:36 2013 +0100
+
+    test: test_store_tool: global init before using LevelDBStore
+    
+    Fixes a segfault
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a7a7d3fc8a2ba4a30ef136a32f2903d157b3e19a)
+
+commit 115468c73f121653eec2efc030d5ba998d834e43
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jul 24 12:00:28 2013 +0100
+
+    mon: OSDMonitor: fix a bug introduced on 97462a32
+    
+    Fixes: #5737
+    Backport: cuttlefish
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 76cd7ac1c2094b34ad36bea89b2246fa90eb2f6d)
+
+commit 938a639e2cb6abd22c2c588e619c1aae32c6521f
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 21 08:48:18 2013 -0700
+
+    mon/Paxos: fix pn for uncommitted value during collect/last phase
+    
+    During the collect/last exchange, peers share any uncommitted values
+    with the leader.  They are supposed to also share the pn under which
+    that value was accepted, but were instead using the just-accepted pn
+    value.  This effectively meant that we *always* took the uncommitted
+    value; if there were multiples, which one we accepted depended on what
+    order the LAST messages arrived, not which pn the values were generated
+    under.
+    
+    The specific failure sequence I observed:
+    
+     - collect
+      - learned uncommitted value for 262 from myself
+      - send collect with pn 901
+     - got last with pn 901 (incorrect) for 200 (old) from peer
+      - discard our own value, remember the other
+     - finish collect phase
+      - ignore old uncommitted value
+    
+    Fix this by storing a pending_v and pending_pn value whenever we accept
+    a value.  Use this to send an appropriate pn value in the LAST reply
+    so that the leader can make it's decision about which uncommitted value
+    to accept based on accurate information.  Also use it when we learn
+    the uncommitted value from ourselves.
+    
+    We could probably be more clever about storing less information here,
+    for example by omitting pending_v and clearing pending_pn at the
+    appropriate point, but that would be more fragile.  Similarly, we could
+    store a pn for *every* commit if we wanted to lay some groundwork for
+    having multiple uncommitted proposals in flight, but I don't want to
+    speculate about what is necessary or sufficient for a correct solution
+    there.
+    
+    Fixes: #5698
+    Backport: cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 20baf662112dd5f560bc3a2d2114b469444c3de8)
+
+commit 18596340f020be1f21bdc9bcc752ae1da4a93a46
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 21 08:12:46 2013 -0700
+
+    mon/Paxos: debug ignored uncommitted values
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 19b29788966eb80ed847630090a16a3d1b810969)
+
+commit f598245f1355d7791162c03d90bdd97b013e56f3
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 21 08:11:22 2013 -0700
+
+    mon/Paxos: only learn uncommitted value if it is in the future
+    
+    If an older peer sends an uncommitted value, make sure we only take it
+    if it is in the future, and at least as new as any current uncommitted
+    value.
+    
+    (Prior to the previous patch, peers could send values from long-past
+    rounds.  The pn values are also bogus.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b3253a453c057914753846c77499f98d3845c58e)
+
+commit 732286a28cd8a643593d490a7a84a590d372f78d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 22 14:13:23 2013 -0700
+
+    mon/Paxos: only share uncommitted value if it is next
+    
+    We may have an uncommitted value from our perspective (it is our lc + 1)
+    when the collector has a much larger lc (because we have been out for
+    the last few rounds).  Only share an uncommitted value if it is in fact
+    the next value.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b26b7f6e5e02ac6beb66e3e34e177e6448cf91cf)
diff --git a/doc/changelog/v0.61.8.txt b/doc/changelog/v0.61.8.txt
new file mode 100644
index 0000000..ef01d45
--- /dev/null
+++ b/doc/changelog/v0.61.8.txt
@@ -0,0 +1,810 @@
+commit d783e33b672ec324eb48d588f956da0c51ff5dac
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Sun Aug 18 23:54:49 2013 -0700
+
+    v0.61.8
+
+commit 21a6e2479133a3debb9ab9057ff9fae70c9eede9
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Aug 8 15:12:46 2013 -0700
+
+    RadosClient: shutdown monclient after dropping lock
+
+    Otherwise, the monclient shutdown may deadlock waiting
+    on a context trying to take the RadosClient lock.
+
+    Fixes: #5897
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0aacd10e2557c55021b5be72ddf39b9cea916be4)
+
+commit 64bef4ae4bab28b0b82a1481381b0c68a22fe1a4
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Aug 17 09:05:32 2013 -0700
+
+    mon/OSDMonitor: make 'osd pool mksnap ...' not expose uncommitted state
+
+    [This is a backport of d1501938f5d07c067d908501fc5cfe3c857d7281]
+
+    We were returning success without waiting if the pending pool state had
+    the snap.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+
+commit 411871f6bcc9a4b81140c2e98d13dc123860f6f7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 16 10:52:02 2013 -0700
+
+    mon/OSDMonitor: make 'osd pool rmsnap ...' not racy/crashy
+
+    NOTE: This is a manual backport of d90683fdeda15b726dcf0a7cab7006c31e99f14.
+    Due to all kinds of collateral changes in the mon the original patch
+    doesn't cleanly apply.
+
+    Ensure that the snap does in fact exist before we try to remove it.  This
+    avoids a crash where a we get two dup rmsnap requests (due to thrashing, or
+    a reconnect, or something), the committed (p) value does have the snap, but
+    the uncommitted (pp) does not.  This fails the old test such that we try
+    to remove it from pp again, and assert.
+
+    Restructure the flow so that it is easier to distinguish the committed
+    short return from the uncommitted return (which must still wait for the
+    commit).
+
+             0> 2013-07-16 14:21:27.189060 7fdf301e9700 -1 osd/osd_types.cc: In function 'void pg_pool_t::remove_snap(snapid_t)' thread 7fdf301e9700 time 2013-07-16 14:21:27.187095
+        osd/osd_types.cc: 662: FAILED assert(snaps.count(s))
+
+         ceph version 0.66-602-gcd39d8a (cd39d8a6727d81b889869e98f5869e4227b50720)
+         1: (pg_pool_t::remove_snap(snapid_t)+0x6d) [0x7ad6dd]
+         2: (OSDMonitor::prepare_command(MMonCommand*)+0x6407) [0x5c1517]
+         3: (OSDMonitor::prepare_update(PaxosServiceMessage*)+0x1fb) [0x5c41ab]
+         4: (PaxosService::dispatch(PaxosServiceMessage*)+0x937) [0x598c87]
+         5: (Monitor::handle_command(MMonCommand*)+0xe56) [0x56ec36]
+         6: (Monitor::_ms_dispatch(Message*)+0xd1d) [0x5719ad]
+         7: (Monitor::handle_forward(MForward*)+0x821) [0x572831]
+         8: (Monitor::_ms_dispatch(Message*)+0xe44) [0x571ad4]
+         9: (Monitor::ms_dispatch(Message*)+0x32) [0x588c52]
+         10: (DispatchQueue::entry()+0x549) [0x7cf1d9]
+         11: (DispatchQueue::DispatchThread::entry()+0xd) [0x7060fd]
+         12: (()+0x7e9a) [0x7fdf35165e9a]
+         13: (clone()+0x6d) [0x7fdf334fcccd]
+         NOTE: a copy of the executable, or `objdump -rdS <executable>` is needed to interpret this.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+
+commit 50698d1862065c8d74338fd08c7e5af66e222490
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 13 12:52:41 2013 -0700
+
+    librados: fix async aio completion wakeup
+
+    For aio flush, we register a wait on the most recent write.  The write
+    completion code, however, was *only* waking the waiter if they were waiting
+    on that write, without regard to previous writes (completed or not).
+    For example, we might have 6 and 7 outstanding and wait on 7.  If they
+    finish in order all is well, but if 7 finishes first we do the flush
+    completion early.  Similarly, if we
+
+     - start 6
+     - start 7
+     - finish 7
+     - flush; wait on 7
+     - finish 6
+
+    we can hang forever.
+
+    Fix by doing any completions that are prior to the oldest pending write in
+    the aio write completion handler.
+
+    Refs: #5919
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Tested-by: Oliver Francke <Oliver.Francke at filoo.de>
+    (cherry picked from commit 16ed0b9af8bc08c7dabead1c1a7c1a22b1fb02fb)
+
+commit ef731dfc84a71d3c3262f5cff9a9d33a60255485
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Aug 12 19:17:09 2013 -0700
+
+    librados: fix locking for AioCompletionImpl refcounting
+
+    Add an already-locked helper so that C_Aio{Safe,Complete} can
+    increment the reference count when their caller holds the
+    lock. C_AioCompleteAndSafe's caller is not holding the lock, so call
+    regular get() to ensure no racing updates can occur.
+
+    This eliminates all direct manipulations of AioCompletionImpl->ref,
+    and makes the necessary locking clear.
+
+    The only place C_AioCompleteAndSafe is used is in handling
+    aio_flush_async(). This could cause a missing completion.
+
+    Refs: #5919
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Tested-by: Oliver Francke <Oliver.Francke at filoo.de>
+    (cherry picked from commit 7a52e2ff5025754f3040eff3fc52d4893cafc389)
+
+commit 32631685199f2e47c2ba0ed27d16eff80fa6917d
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 12 14:27:04 2013 -0700
+
+    mon/Paxos: bootstrap peon too if monmap updates
+
+    If we get a monmap update, the leader bootstraps.  Peons should do the
+    same.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit efe5b67bb700ef6218d9579abf43cc9ecf25ef52)
+
+commit 1ea6b56170fc9e223e7c30635db02fa2ad8f4b4e
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 25 13:16:45 2013 -0700
+
+    osd: fix race when queuing recovery ops
+
+    Previously we would sample how many ops to start under the lock, drop it,
+    and start that many.  This is racy because multiple threads can jump in
+    and we start too many ops.  Instead, claim as many slots as we can and
+    release them back later if we do not end up using them.
+
+    Take care to re-wake the work-queue since we are releasing more resources
+    for wq use.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 01d3e094823d716be0b39e15323c2506c6f0cc3b)
+
+commit 4433f9ad8b338b6a55e205602434b307287bfaa3
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 24 16:37:29 2013 -0700
+
+    osd: tolerate racing threads starting recovery ops
+
+    We sample the (max - active) recovery ops to know how many to start, but
+    do not hold the lock over the full duration, such that it is possible to
+    start too many ops.  This isn't problematic except that our condition
+    checks for being == max but not beyond it, and we will continue to start
+    recovery ops when we shouldn't.  Fix this by adjusting the conditional
+    to be <=.
+
+    Reported-by: Stefan Priebe <s.priebe at profihost.ag>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 3791a1e55828ba541f9d3e8e3df0da8e79c375f9)
+
+commit 0964d53ef3e8e386e0a1635d2240aefad7b8e2c1
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 18:02:32 2013 -0700
+
+    ceph-disk: fix mount options passed to move_mount
+
+    Commit 6cbe0f021f62b3ebd5f68fcc01a12fde6f08cff5 added a mount_options but
+    in certain cases it may be blank.  Fill in with the defaults, just as we
+    do in mount().
+
+    Backport: cuttlefish
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cb50b5a7f1ab2d4e7fdad623a0e7769000755a70)
+
+commit d6be5ed2601b8cf45570afe7ca75ce5aba3f8b4f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 12 10:05:44 2013 -0700
+
+    rgw: fix multi delete
+
+    Fixes: #5931
+    Backport: bobtail, cuttlefish
+
+    Fix a bad check, where we compare the wrong field. Instead of
+    comparing the ret code to 0, we compare the string value to 0
+    which generates implicit casting, hence the crash.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit f9f1c48ad799da2b4be0077bf9d61ae116da33d7)
+
+    Conflicts:
+	src/rgw/rgw_rest_s3.cc
+
+commit ecaa46a13837305b9382ab319d43890729c54f1e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Jul 23 21:56:09 2013 +0200
+
+    ceph.spec.in: obsolete ceph-libs only on the affected distro
+
+    The ceph-libs package existed only on Redhat based distro,
+    there was e.g. never such a package on SUSE. Therefore: make
+    sure the 'Obsoletes' is only set on these affected distros.
+
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+
+commit 81aa68c309a6d4eaecc54f8d735efde8843fed8c
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Wed Jul 3 11:28:28 2013 -0700
+
+    ceph.spec.in:  Obsolete ceph-libs
+
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 2a34df68bb02d14f6a25bd13dff600a4d629ad05
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Aug 9 14:48:15 2013 -0700
+
+    common: pick_addresses: fix bug with observer class that triggered #5205
+
+    The Observer class we defined to observe conf changes and thus avoid
+    triggering #5205 (as fixed by eb86eebe1ba42f04b46f7c3e3419b83eb6fe7f9a),
+    was returning always the same const static array, which would lead us to
+    always populate the observer's list with an observer for 'public_addr'.
+
+    This would of course become a problem when trying to obtain the observer
+    for 'cluster_add' during md_config_t::set_val() -- thus triggering the
+    same assert as initially reported on #5205.
+
+    Backport: cuttlefish
+    Fixes: #5205
+
+    Signed-off-by: Joao Eduardo Luis <jecluis at gmail.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7ed6de9dd7aed59f3c5dd93e012cf080bcc36d8a)
+
+commit 1243c9749ed27850c5d041023780efcdf7b31a68
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Thu Aug 8 16:09:26 2013 -0700
+
+    make sure we are using the mount options
+
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit 34831d0989d4bcec4920068b6ee09ab6b3234c91)
+
+commit a9a370be2d8155b696ebe2866febb0571da5740f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Aug 2 11:58:52 2013 -0700
+
+    PG: set !flushed in Reset()
+
+    Otherwise, we might serve a pull before we start_flush in the
+    ReplicaActive constructor.
+
+    Fixes: #5799
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9e7d6d547e0e8a6db6ba611882afa9bf74ea0195)
+
+commit 65bfa4941f983c988837cd010f731966ff53fd19
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 26 14:02:07 2013 -0700
+
+    osd: make open classes on start optional
+
+    This is cuttlefish; default to the old behavior!
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6f996223fb34650771772b88355046746f238cf2)
+
+commit e8253ae5451b1c8e3d7d50199b8db7b2d4c66486
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 26 13:58:46 2013 -0700
+
+    osd: load all classes on startup
+
+    This avoid creating a wide window between when ceph-osd is started and
+    when a request arrives needing a class and it is loaded.  In particular,
+    upgrading the packages in that window may cause linkage errors (if the
+    class API has changed, for example).
+
+    Fixes: #5752
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit c24e652d8c5e693498814ebe38c6adbec079ea36)
+
+    Conflicts:
+	src/osd/ClassHandler.cc
+
+commit 7a1d6d3e727fd8b6947c658e171bf7ec31cd7966
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 28 15:42:08 2013 -0700
+
+    ceph_test_rados: print version banner on startup
+
+    It is helpful when looking at qa run logs to see what version of the
+    tester is running.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 12c1f1157c7b9513a3d9f716a8ec62fce00d28f5)
+
+commit 86769f05ccc54bfec403bb9ea9a3a951bbcea301
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 13 22:08:36 2013 -0700
+
+    ceph_test_rados: add --pool <name> arg
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bcfbd0a3ffae6947464d930f636c8b35d1331e9d)
+
+commit b70a9abc5e3ae01204256f414bd7e69d083ed7c6
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 26 14:07:02 2013 -0700
+
+    upstart: stop ceph-create-keys when the monitor stops
+
+    This avoids lingering ceph-create-keys tasks.
+
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a90a2b42db8de134b8ea5d81cab7825fb9ec50b4)
+
+commit 5af48dc7c7e3a0d7f7bc22af58831d58d165e657
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jul 26 13:42:27 2013 -0700
+
+    FileStore: fix fd leak in _check_global_replay_guard
+
+    Bug introduced in f3f92fe21061e21c8b259df5ef283a61782a44db.
+
+    Fixes: #5766
+    Backport: cuttlefish
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c562b72e703f671127d0ea2173f6a6907c825cd1)
+
+commit 17aa2d6d16c77028bae1d2a77903cdfd81efa096
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 25 11:10:53 2013 -0700
+
+    mon/Paxos: share uncommitted value when leader is/was behind
+
+    If the leader has and older lc than we do, and we are sharing states to
+    bring them up to date, we still want to also share our uncommitted value.
+    This particular case was broken by b26b7f6e, which was only contemplating
+    the case where the leader was ahead of us or at the same point as us, but
+    not the case where the leader was behind.  Note that the call to
+    share_state() a few lines up will bring them fully up to date, so
+    after they receive and store_state() for this message they will be at the
+    same lc as we are.
+
+    Fixes: #5750
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 05b6c7e8645081f405c616735238ae89602d3cc6)
+
+commit 09a664e25391dbad9a479bae33904d28231f429d
+Merge: 8f010af b0535fc
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 25 15:21:31 2013 -0700
+
+    Merge remote-tracking branch 'gh/cuttlefish-next' into cuttlefish
+
+commit b0535fcf854c5042d6b5ff481aabca08026d8f7f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jul 23 18:04:40 2013 -0700
+
+    HashIndex: reset attr upon split or merge completion
+
+    A replay of an in progress merge or split might make
+    our counts unreliable.
+
+    Fixes: #5723
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0dc3efdd885377a07987d868af5bb7a38245c90b)
+
+commit 8f73302b4e637ca8b85d68ea7503279faecb57d8
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jul 23 17:34:25 2013 -0700
+
+    test/filestore/store_test: add test for 5723
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 37a4c4af54879512429bb114285bcb4c7c3488d5)
+
+    Conflicts:
+	src/os/LFNIndex.cc
+	src/test/filestore/store_test.cc
+
+commit 6a7b9e5f0c1d2344209c69ab9992f94221a16468
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jul 23 13:51:26 2013 -0700
+
+    FileStore::_collection_rename: fix global replay guard
+
+    If the replay is being replayed, we might have already
+    performed the rename, skip it.  Also, we must set the
+    collection replay guard only after we have done the
+    rename.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 870c474c5348831fcb13797d164f49682918fb30)
+
+commit 7d98651775265896c22bacfc4afcfccbb0128470
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 22 13:46:10 2013 -0700
+
+    PGLog::rewind_divergent_log: unindex only works from tail, index() instead
+
+    Fixes: #5714
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6957dbc75cc2577652b542aa3eae69f03060cb63)
+
+    The original patch covered the same code in PGLog.cc.
+
+    Conflicts:
+
+	src/osd/PGLog.cc
+	src/osd/PG.cc
+
+commit 611a06ae6c9cba468db206dfc82ec883c7a394af
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 18 09:55:43 2013 -0700
+
+    msg/Pipe: do not hold pipe_lock for verify_authorizer()
+
+    We shouldn't hold the pipe_lock while doing the ms_verify_authorizer
+    upcalls.
+
+    Fix by unlocking a bit earlier, and verifying our state is still correct
+    in the failure path.
+
+    This regression was introduced by ecab4bb9513385bd765cca23e4e2fadb7ac4bac2.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 723d691f7a1f53888618dfc311868d1988f61f56)
+
+    Conflicts:
+
+	src/msg/Pipe.cc
+
+commit 45bda482fa8a23f4b80d115e29d6f04cb5e226d6
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 16 14:17:05 2013 -0700
+
+    msg/Pipe: a bit of additional debug output
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 16568d9e1fb8ac0c06ebaa1e1dc1d6a432a5e4d4)
+
+commit 806eab59ad1a32aedb662c51de3b4a1d61fcbb62
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 16 13:13:46 2013 -0700
+
+    msg/Pipe: hold pipe_lock during important parts of accept()
+
+    Previously we did not bother with locking for accept() because we were
+    not visible to any other threads.  However, we need to close accepting
+    Pipes from mark_down_all(), which means we need to handle interference.
+
+    Fix up the locking so that we hold pipe_lock when looking at Pipe state
+    and verify that we are still in the ACCEPTING state any time we retake
+    the lock.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ecab4bb9513385bd765cca23e4e2fadb7ac4bac2)
+
+commit ce6a0b74459996f91a0511a4a7147179bcd47876
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Jul 17 15:23:12 2013 -0700
+
+    msgr: fix a typo/goto-cross from dd4addef2d
+
+    We didn't build or review carefully enough!
+
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1a84411209b13084b3edb87897d5d678937e3299)
+
+commit 1ed51ad535612d5c444a3cc35a331f5e6a68ce30
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 15 17:16:23 2013 -0700
+
+    msgr: close accepting_pipes from mark_down_all()
+
+    We need to catch these pipes too, particularly when doing a rebind(),
+    to avoid them leaking through.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 687fe888b32ac9d41595348dfc82111c8dbf2fcb)
+
+commit 2f696f17a413015a3038d5aa76d18fe94f503f03
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 15 17:14:25 2013 -0700
+
+    msgr: maintain list of accepting pipes
+
+    New pipes exist in a sort of limbo before we know who the peer is and
+    add them to rank_pipe.  Keep a list of them in accepting_pipes for that
+    period.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dd4addef2d5b457cc9a58782fe42af6b13c68b81)
+
+commit 540a6f49d402c1990f0e0fe9f8897dd664e79501
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 16 16:25:28 2013 -0700
+
+    msgr: adjust nonce on rebind()
+
+    We can have a situation where:
+
+     - we have a pipe to a peer
+     - pipe goes to standby (on peer)
+     - we rebind to a new port
+     - ....
+     - we rebind again to the same old port
+     - we connect to peer
+
+    and get reattached to the ancient pipe from two instances back.  Avoid that
+    by picking a new nonce each time we rebind.
+
+    Add 1,000,000 each time so that the port is still legible in the printed
+    output.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 994e2bf224ab7b7d5b832485ee14de05354d2ddf)
+
+    Conflicts:
+
+	src/msg/Accepter.cc
+
+commit f938a5bf604885ffba65a9b86e19258ca254e58c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 15 17:10:23 2013 -0700
+
+    msgr: mark_down_all() after, not before, rebind
+
+    If we are shutting down all old connections and binding to new ports,
+    we want to avoid a sequence like:
+
+     - close all prevoius connections
+     - new connection comes in on old port
+     - rebind to new ports
+     -> connection from old port leaks through
+
+    As a first step, close all connections after we shut down the old
+    accepter and before we start the new one.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 07a0860a1899c7353bb506e33de72fdd22b857dd)
+
+    Conflicts:
+
+	src/msg/SimpleMessenger.cc
+
+commit 07b9ebf4212d53606ce332ff927a2ff68ed26978
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 16 13:01:18 2013 -0700
+
+    msg/Pipe: unlock msgr->lock earlier in accept()
+
+    Small cleanup.  Nothing needs msgr->lock for the previously larger
+    window.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ad548e72fd94b4a16717abd3b3f1d1be4a3476cf)
+
+commit ae85a0a101d624363fe761c06ecd52d3d38ba4a2
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 16 10:09:02 2013 -0700
+
+    msg/Pipe: avoid creating empty out_q entry
+
+    We need to maintain the invariant that all sub queues in out_q are never
+    empty.  Fix discard_requeued_up_to() to avoid creating an entry unless we
+    know it is already present.
+
+    This bug leads to an incorrect reconnect attempt when
+
+     - we accept a pipe (lossless peer)
+     - they send some stuff, maybe
+     - fault
+     - we initiate reconnect, even tho we have nothing queued
+
+    In particular, we shouldn't reconnect because we aren't checking for
+    resets, and the fact that our out_seq is 0 while the peer's might be
+    something else entirely will trigger asserts later.
+
+    This fixes at least one source of #5626, and possibly #5517.
+
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9f1c27261811733f40acf759a72958c3689c8516)
+
+commit 21e27262edc6f5f090ea8915517ee867e30b9066
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 15 14:47:05 2013 -0700
+
+    msg/Pipe: assert lock is held in various helpers
+
+    These all require that we hold pipe_lock.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 579d858aabbe5df88543d096ef4dbddcfc023cca)
+
+commit 25f4786ac41869b3f135bd072000634765bb8919
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 14 08:55:52 2013 -0700
+
+    msg/Pipe: be a bit more explicit about encoding outgoing messages
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4282971d47b90484e681ff1a71ae29569dbd1d32)
+
+commit 48105a32605aa59b6970eb89fce4ecc4201e8d04
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 12 16:21:24 2013 -0700
+
+    msg/Pipe: fix RECONNECT_SEQ behavior
+
+    Calling handle_ack() here has no effect because we have already
+    spliced sent messages back into our out queue.  Instead, pull them out
+    of there and discard.  Add a few assertions along the way.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 495ee108dbb39d63e44cd3d4938a6ec7d11b12e3)
+
+commit 1eab069017ce6b71e4bc2bb9679dbe31b50ae938
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 13:32:38 2013 -0700
+
+    msgr: reaper: make sure pipe has been cleared (under pipe_lock)
+
+    All paths to pipe shutdown should have cleared the con->pipe reference
+    already.  Assert as much.
+
+    Also, do it under pipe_lock!
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9586305a2317c7d6bbf31c9cf5b67dc93ccab50d)
+
+commit db06a5092bc45d0479fe492a5d592713a7c53494
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 14:14:02 2013 -0700
+
+    msg/Pipe: goto fail_unlocked on early failures in accept()
+
+    Instead of duplicating an incomplete cleanup sequence (that does not
+    clear_pipe()), goto fail_unlocked and do the cleanup in a generic way.
+    s/rc/r/ while we are here.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ec612a5bda119cea52bbac9b2a49ecf1e83b08e5)
+
+commit 8612e50fd70bfceebd6c291e6cab10d9dfd39e8c
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 13:32:07 2013 -0700
+
+    msgr: clear con->pipe inside pipe_lock on mark_down
+
+    We need to do this under protection of the pipe_lock.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit afafb87e8402242d3897069f4b94ba46ffe0c413)
+
+commit 8aafe131acadc22cb069f3d98bba6922ab09c749
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 17 12:47:11 2013 -0700
+
+    msgr: clear_pipe inside pipe_lock on mark_down_all
+
+    Observed a segfault in rebind -> mark_down_all -> clear_pipe -> put that
+    may have been due to a racing thread clearing the connection_state pointer.
+    Do the clear_pipe() call under the protection of pipe_lock, as we do in
+    all other contexts.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5fc1dabfb3b2cbffdee3214d24d7769d6e440e45)
+
+    Conflicts:
+
+	src/msg/SimpleMessenger.cc
+
+commit 2f7979d1262e9d4899be76963a1620db46b334e8
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jul 18 19:26:02 2013 -0700
+
+    ReplicatedPG: track temp collection contents, clear during on_change
+
+    We also assert in on_flushed() that the temp collection is actually
+    empty.
+
+    Fixes: #5670
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 47516d9c4b7f023f3a16e166749fa7b1c7b3b24c)
+
+    Conflicts:
+
+	src/osd/ReplicatedPG.cc
+
+commit c7e2945a42541f966017180684dd969389eef3ac
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jul 18 19:25:14 2013 -0700
+
+    PG, ReplicatedPG: pass a transaction down to ReplicatedPG::on_change
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9f56a7b8bfcb63cb4fbbc0c9b8ff01de9e518c57)
+
+commit 7ffc65fc4d7d842954cf791c016fd2711f644a9c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jul 17 15:04:10 2013 -0700
+
+    PG: start flush on primary only after we process the master log
+
+    Once we start serving reads, stray objects must have already
+    been removed.  Therefore, we have to flush all operations
+    up to the transaction writing out the authoritative log.
+    On replicas, we flush in Stray() if we will not eventually
+    be activated and in ReplicaActive if we are in the acting
+    set.  This way a replica won't serve a replica read until
+    the store is consistent.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b41f1ba48563d1d3fd17c2f62d10103b5d63f305)
+
+commit 850da0890da5df7e670df9268afe420d0c906c38
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Jul 17 12:51:19 2013 -0700
+
+    ReplicatedPG: replace clean_up_local with a debug check
+
+    Stray objects should have been cleaned up in the merge_log
+    transactions.  Only on the primary have those operations
+    necessarily been flushed at activate().
+
+    Fixes: 5084
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 278c7b59228f614addf830cb0afff4988c9bc8cb)
+
+commit 95b1b5da439f1b7e2fb1886aaeec2d61532183f0
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jul 18 10:12:17 2013 -0700
+
+    FileStore: add global replay guard for split, collection_rename
+
+    In the event of a split or collection rename, we need to ensure that
+    we don't replay any operations on objects within those collections
+    prior to that point.  Thus, we mark a global replay guard on the
+    collection after doing a syncfs and make sure to check that in
+    _check_replay_guard() for all object operations.
+
+    Fixes: #5154
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f3f92fe21061e21c8b259df5ef283a61782a44db)
+
+    Conflicts:
+
+	src/os/FileStore.cc
+
+commit d92a43d8ff0123b234e47a94c2ce73fcaae7f625
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 15 13:44:20 2013 -0700
+
+    OSD: add config option for peering_wq batch size
+
+    Large peering_wq batch sizes may excessively delay
+    peering messages resulting in unreasonably long
+    peering.  This may speed up peering.
+
+    Backport: cuttlefish
+    Related: #5084
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 39e5a2a406b77fa82e9a78c267b679d49927e3c3)
diff --git a/doc/changelog/v0.61.9.txt b/doc/changelog/v0.61.9.txt
new file mode 100644
index 0000000..fe2a7e7
--- /dev/null
+++ b/doc/changelog/v0.61.9.txt
@@ -0,0 +1,571 @@
+commit 7440dcd135750839fa0f00263f80722ff6f51e90
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Wed Oct 16 18:57:51 2013 +0000
+
+    v0.61.9
+
+commit fcf5f117a9111c2d88b8fa5d00c975a8e377df7e
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Oct 15 10:20:48 2013 -0700
+
+    rgw: fix authenticated users acl group check
+    
+    Fixes: #6553
+    Backport: bobtail, cuttlefish, dumpling
+    Authenticated users group acl bit was not working correctly. Check to
+    test whether user is anonymous was wrong.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit bebbd6cb7b71697b34b8f27652cabdc40c97a33b)
+
+commit 991ed515480114c476cd3c4d761f256d1708fb39
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Oct 15 10:55:07 2013 -0700
+
+    rgw: change default log level
+    
+    Fixes: #6554
+    Backport: cuttlefish, dumpling
+    Default log level was just too high, bring it down a bit.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8d7dbf85472cfca9268d81ecf057ea078cf345b3)
+
+commit ebb9b0cb7e4ab60fdbbc410ecfb35e51cf11434d
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jul 6 09:21:47 2013 -0700
+
+    mds: do not allow GLAZYIO in mix->sync state
+    
+    GLAZYIO is not allowed in SYNC, so we cannot allow it in the preceding
+    gather state.
+    
+    I verified the other GLAZYIO rules look ok.  We should make a validater
+    to confirm that no gather state includes caps that its target state
+    does not... or at least assert as much in eval_gather().
+    
+    Backport: cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b88938e5a646fbf175a7135e872bcb2d1afafbb8)
+
+commit 33da08f683d40f33061cefa0cf145f3ff21ea089
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Thu Sep 12 10:36:39 2013 +0800
+
+    osdc/ObjectCacher: finish contexts after dropping object reference
+    
+    The context to finish can be class C_Client_PutInode, which may drop
+    inode's last reference. So we should first drop object's reference,
+    then finish contexts.
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit b66ac77fa7aa3ff37804918c4308a348f239af09)
+
+commit 346b43d80f728e6b389208ccd8054d96b76b093c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 7 22:04:09 2013 -0700
+
+    mds: fix filelock eval_gather
+    
+    Broken by a08d62045657713bf0a5372bf14136082ec3b17e
+    
+    Reported-by: Yan, Zheng <yan.zheng at intel.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e8300d0afb5154d4d13536abdcf47bd5cc8ce810)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit ffdc7fce132b3b98463b4222d2c51ccef6b94d82
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 6 21:38:56 2013 -0700
+
+    mds: do not double-queue file recovery in eval_gather
+    
+    This fixes a specific case of double-queuing seen in #4832:
+    
+     - client goes stale, inode marked NEEDSRECOVER
+     - eval does sync, queued, -> RECOVERING
+     - client resumes
+     - client goes stale (again), inode marked NEEDSRECOVER
+     - eval_gather queues *again*
+    
+    Note that a cursory look at the recovery code makes me think this needs
+    a much more serious overhaul.  In particular, I don't think we should
+    be triggering recovery when transitioning *from* a stable state, but
+    explicitly when we are flagged, or when gathering.  We should probably
+    also hold a wrlock over the recovery period and remove the force_wrlock
+    kludge from the final size check.  Opened ticket #5268.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a08d62045657713bf0a5372bf14136082ec3b17e)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 60033c31381d36cbbc6c873d7055cbe735f5deb2
+Author: Sandon Van Ness <sandon at inktank.com>
+Date:   Tue Oct 8 11:58:57 2013 -0700
+
+    Go back to $PWD in fsstress.sh if compiling from source.
+    
+    Although fsstress was being called with a static path the directory
+    it was writing to was in the current directory so doing a cd to the
+    source directory that is made in /tmp and then removing it later
+    caused it to be unable to write the files in a non-existent dir.
+    
+    This change gets the current path first and cd's back into it after
+    it is done compiling fsstress.
+    
+    Issue #6479.
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    Reviewed-by: Alfredo Deza <alfredo.deza at inktank.com>
+
+commit eb06f3738851d27914704821897ed80104c4c29c
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Tue Aug 27 09:53:12 2013 -0700
+
+    ceph.spec.in:  radosgw package doesn't require mod_fcgi
+    
+    Fixes #5702
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 5a426a1f1f34d3f5a510009cc3f3b219d3cbc74b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 1 15:53:42 2013 -0700
+
+    crush: invalidate rmap on create (and thus decode)
+    
+    If we have an existing CrushWrapper object and decode from a bufferlist,
+    reset build_rmaps so that they get rebuilt.
+    
+    Remove the build_rmaps() all in decode that was useless on a redecode
+    (because have_rmaps == true in that case and it did nothing).
+    
+    Fixes: #6442
+    Backport: dumpling, maybe cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 9b7a2ae329b6a511064dd3d6e549ba61f52cfd21)
+
+commit 6f342872cdd211e24deb19f5e00380494514c437
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Sep 24 19:04:23 2013 +0200
+
+    osd: change warn_interval_multiplier to uint32_t
+    
+    to prevent overflow in OpTracker::check_ops_in_flight when
+    multiplying warn_interval_multiplier *= 2
+    
+    Backport: cuttlefish, dumpling
+    
+    http://tracker.ceph.com/issues/6370 fixes #6370
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 1bce1f009bffd3e28025a08775fec189907a81db)
+
+commit be2907ef85a31c2be8be7446fe71f5d2e1410ec0
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 11 22:30:12 2013 -0700
+
+    rgw: don't call list::size() in ObjectCache
+    
+    Fixes: #6286
+    Use an external counter instead of calling list::size()
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 31e3a51e933429d286104fe077e98ea883437ad6)
+
+commit bbfbb097e2f9efbf4f7ec997c70befa20c79d27c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Sep 10 12:18:55 2013 -0700
+
+    rgw: drain pending requests before completing write
+    
+    Fixes: #6268
+    When doing aio write of objects (either regular or multipart parts) we
+    need to drain pending aio requests. Otherwise if gateway goes down then
+    object might end up corrupted.
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit b16f812362ccb1d9bdd4900d155e248d695ef0d7
+Merge: 97a97c3 5f16ea6
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Sep 7 13:32:40 2013 -0700
+
+    Merge pull request #573 from dalgaaf/fix/da-cuttlefish-fixes-and-cherry-picks
+    
+    Cherry-pick some smaller changes from master to cuttlefish
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 5f16ea62cee4fad9be6e44f3562da31908303ae5
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Sat Sep 7 20:32:40 2013 +0200
+
+    tools/ceph.cc: add missig 'ceph osd lspools' command to help
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+
+commit 59f02ecf0b91a2248d8b7b75dc27b517f04ac292
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Sat Sep 7 11:30:15 2013 +0200
+
+    init-radosgw*: fix status return value if radosgw isn't running
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b5137baf651eaaa9f67e3864509e437f9d5c3d5a)
+
+commit c25770c39ae006ab4ad14a5d75bf7a2dffe0279e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Jun 6 15:34:54 2013 +0200
+
+    init-radosgw*: add all sections to usage output
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit a0c5095be3640e98d5541920c19387bf3764a350)
+
+commit 1a8347e0d1cafc38259adc1f1a6154fa0d48f1d2
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Jun 6 15:33:23 2013 +0200
+
+    init-radosgw*: add status
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 385457f8d871238a896229d0c2cbb25646969f6a)
+
+commit b1c2aa2c4a8c0266a01903eab5539e7929ea0431
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Jun 6 15:21:30 2013 +0200
+
+    fix init-radosgw* to use the same indentation
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b4d4e92ed2deae435a24b36d086c1a73e5997855)
+
+commit 794ed1faec7ced23b5b46d114f5320d718c9e9fb
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Sun Jul 28 23:25:58 2013 +0200
+
+    ceph_authtool.cc: update help/usage text
+    
+    Added implemented but not listed commands to the help/usage text:
+    * -g  shortcut for --gen-key
+    * -a  shortcut for --add-key
+    * -u/--set-uid to set auid
+    * --gen-print-key
+    * --import-keyring
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 9a9a0ef3f9f39909eaeb95eb99db4711a2425af5)
+
+commit 97a97c3c554f689dd3f987e63eaa2b9c5ec1dd0a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 26 19:46:43 2013 -0700
+
+    rgw: check object name after rebuilding it in S3 POST
+    
+    Fixes: #6088
+    Backport: bobtail, cuttlefish, dumpling
+    
+    When posting an object it is possible to provide a key
+    name that refers to the original filename, however we
+    need to verify that in the end we don't end up with an
+    empty object name.
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit c8ec532fadc0df36e4b265fe20a2ff3e35319744)
+
+commit 7a0bd5bc2c6e5464f70b19154834448ac1e4c369
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Aug 22 13:29:32 2013 -0700
+
+    ceph.spec.in:  remove trailing paren in previous commit
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit f1507d23707e7929f7a55fe2ea9418dcc715d8b2
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Aug 22 11:07:16 2013 -0700
+
+    ceph.spec.in:  Don't invoke debug_package macro on centos.
+    
+    If the redhat-rpm-config package is installed, the debuginfo rpms will
+    be built by default.   The build will fail when the package installed
+    and the specfile also invokes the macro.
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 65a10862feec199d14f17627d0c42fa7c85766fa
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 28 08:59:21 2013 -0700
+
+    osd: get initial full map after a map gap
+    
+    If there is a gap in our map history, get the full range of maps that
+    the mon has.  Make sure the first one is a full map.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit a6cd9fea50a4bd7048a222617a2bfe0680f7a969)
+
+commit aceef04f7fd56935e691c7deb05f25ace653bb76
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jul 28 08:55:38 2013 -0700
+
+    osd: fix off-by-one in map gap logic
+    
+    If we have map 250, and monitor's first is 251, but sends 260, we can
+    request the intervening range.
+    
+    Fixes: #5784
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit e24b50225c841a650d9303041bbe811e04bdd668)
+
+commit cdbfd66249cdf91c02a88af5df5a6517688a78df
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 22 16:00:07 2013 -0700
+
+    OSD: tolerate holes in stored maps
+    
+    We may have holes in stored maps during init_splits_between
+    and advance_pg.  In either case, we should simply skip the
+    missing maps.
+    
+    Fixes: #5677
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6951d2345a5d837c3b14103bd4d8f5ee4407c937)
+    
+    Conflicts:
+    
+    	src/osd/OSD.cc
+
+commit 234d68c68028fcf9c2665cb9f45b9b76556241ba
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 20 22:39:09 2013 -0700
+
+    ceph-disk: partprobe after creating journal partition
+    
+    At least one user reports that a partprobe is needed after creating the
+    journal partition.  It is not clear why sgdisk is not doing it, but this
+    fixes ceph-disk for them, and should be harmless for other users.
+    
+    Fixes: #5599
+    Tested-by: lurbs in #ceph
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2af59d5e81c5e3e3d7cfc50d9330d7364659c5eb)
+
+commit cf2f31ac23b6eb43a81a1c8157907b9cae4d58a7
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 21:48:06 2013 -0700
+
+    osdc/ObjectCacher: do not merge rx buffers
+    
+    We do not try to merge rx buffers currently.  Make that explicit and
+    documented in the code that it is not supported.  (Otherwise the
+    last_read_tid values will get lost and read results won't get applied
+    to the cache properly.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1c50c446152ab0e571ae5508edb4ad7c7614c310)
+
+commit 02da55757a9fb53df4746db5dd14724e77da95b6
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 21:47:18 2013 -0700
+
+    osdc/ObjectCacher: match reads with their original rx buffers
+    
+    Consider a sequence like:
+    
+     1- start read on 100~200
+           100~200 state rx
+     2- truncate to 200
+           100~100 state rx
+     3- start read on 200~200
+           100~100 state rx
+           200~200 state rx
+     4- get 100~200 read result
+    
+    Currently this makes us crash on
+    
+    osdc/ObjectCacher.cc: 738: FAILED assert(bh->length() <= start+(loff_t)length-opos)
+    
+    when processing the second 200~200 bufferhead (it is too big).  The
+    larger issue, though, is that we should not be looking at this data at
+    all; it has been truncated away.
+    
+    Fix this by marking each rx buffer with the read request that is sent to
+    fill it, and only fill it from that read request.  Then the first reply
+    will fill the first 100~100 extend but not touch the other extent; the
+    second read will do that.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b59f930ae147767eb4c9ff18c3821f6936a83227)
+
+commit 43e7ad989dcb4deb18b32ec31f76c8755354d2a6
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 22 15:54:48 2013 -0700
+
+    mon/Paxos: fix another uncommitted value corner case
+    
+    It is possible that we begin the paxos recovery with an uncommitted
+    value for, say, commit 100.  During last/collect we discover 100 has been
+    committed already.  But also, another node provides an uncommitted value
+    for 101 with the same pn.  Currently, we refuse to learn it, because the
+    pn is not strictly > than our current uncommitted pn... even though it is
+    the next last_committed+1 value that we need.
+    
+    There are two possible fixes here:
+    
+     - make this a >= as we can accept newer values from the same pn.
+     - discard our uncommitted value metadata when we commit the value.
+    
+    Let's do both!
+    
+    Fixes: #6090
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fe5010380a3a18ca85f39403e8032de1dddbe905)
+
+commit 2de1515289f49f2e388448506f4788db56d0e25a
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 23 11:45:35 2013 -0700
+
+    os: make readdir_r buffers larger
+    
+    PATH_MAX isn't quite big enough.
+    
+    Backport: dumpling, cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 99a2ff7da99f8cf70976f05d4fe7aa28dd7afae5)
+
+commit af9818c486484c7617c07f26beaded8a3bc88043
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 23 11:45:08 2013 -0700
+
+    os: fix readdir_r buffer size
+    
+    The buffer needs to be big or else we're walk all over the stack.
+    
+    Backport: dumpling, cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2df66d9fa214e90eb5141df4d5755b57e8ba9413)
+    
+    Conflicts:
+    
+    	src/os/BtrfsFileStoreBackend.cc
+
+commit cce1d1f9cd8b034deee29d8566780763beb0155f
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Fri Aug 23 08:56:07 2013 -0400
+
+    ceph-disk: specify the filetype when mounting
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f040020fb2a7801ebbed23439159755ff8a3edbd)
+
+commit c25e7da57d704d4a8db59a2e97fb687968520c69
+Author: Sandon Van Ness <sandon at inktank.com>
+Date:   Thu Aug 22 19:44:40 2013 -0700
+
+    QA: Compile fsstress if missing on machine.
+    
+    Some distro's have a lack of ltp-kernel packages and all we need is
+    fstress. This just modified the shell script to download/compile
+    fstress from source and copy it to the right location if it doesn't
+    currently exist where it is expected. It is a very small/quick
+    compile and currently only SLES and debian do not have it already.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+
+commit c807f27c391d336a7223fcfdd3daad9bb374a3dc
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Aug 5 12:52:44 2013 -0700
+
+    mds: fix locking, use-after-free/race in handle_accept
+    
+    We need to hold mds_lock here.
+    
+    Normally the con also holds a reference, but an ill-timed connection reset
+    could drop it.
+    
+    Fixes: #5883
+    Backport: dumpling, cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a0929955cb84fb8cfdeb551d6863e4955b8e2a71)
+
+commit bd71192eaa6f884e879b1711e5937b1e3609d86d
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 22 10:14:59 2013 -0700
+
+    .gitignore: ignore test-driver
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit edf2c3449ec96d91d3d7ad01c50f7a79b7b2f7cc)
+    
+    Conflicts:
+    
+    	.gitignore
+
+commit bc997ebea3263c2bc7df83661ae3a966470ba35e
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:42:49 2013 -0700
+
+    fuse: fix warning when compiled against old fuse versions
+    
+    client/fuse_ll.cc: In function 'void invalidate_cb(void*, vinodeno_t, int64_t, int64_t)':
+    warning: client/fuse_ll.cc:540: unused variable 'fino'
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9833e9dabe010e538cb98c51d79b6df58ce28f9e)
+
+commit 9cb2c2eb3627b52c3413b39b45e7fb7e0e9a074c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:40:34 2013 -0700
+
+    json_spirit: remove unused typedef
+    
+    In file included from json_spirit/json_spirit_writer.cpp:7:0:
+    json_spirit/json_spirit_writer_template.h: In function 'String_type json_spirit::non_printable_to_string(unsigned int)':
+    json_spirit/json_spirit_writer_template.h:37:50: warning: typedef 'Char_type' locally defined but not used [-Wunused-local-typedefs]
+             typedef typename String_type::value_type Char_type;
+    
+    (Also, ha ha, this file uses \r\n.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6abae35a3952e5b513895267711fea63ff3bad09)
+
+commit d774559f118d26cd15ecf1a49468ce1a3d260efc
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:31:41 2013 -0700
+
+    gtest: add build-aux/test-driver to .gitignore
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c9cdd19d1cd88b84e8a867f5ab85cb51fdc6f8e4)
+
+commit 1a2d9edde0311b51d3d68b87c20dea3061b2395b
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 21 14:28:49 2013 -0700
+
+    objecter: resend unfinished lingers when osdmap is no longer paused
+    
+    Plain Ops that haven't finished yet need to be resent if the osdmap
+    transitions from full or paused to unpaused.  If these Ops are
+    triggered by LingerOps, they will be cancelled instead (since
+    should_resend = false), but the LingerOps that triggered them will not
+    be resent.
+    
+    Fix this by checking the registered flag for all linger ops, and
+    resending any of them that aren't paused anymore.
+    
+    Fixes: #6070
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit 38a0ca66a79af4b541e6322467ae3a8a4483cc72)
diff --git a/doc/changelog/v0.67.1.txt b/doc/changelog/v0.67.1.txt
new file mode 100644
index 0000000..9b9405f
--- /dev/null
+++ b/doc/changelog/v0.67.1.txt
@@ -0,0 +1,142 @@
+commit e23b817ad0cf1ea19c0a7b7c9999b30bed37d533
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri Aug 16 19:39:41 2013 -0700
+
+    v0.67.1
+
+commit 1aa01910957e967e87e46b86f1e67844148703e3
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Aug 15 17:10:56 2013 -0700
+
+    ceph.in: --admin-daemon was not returning EINVAL on bad command
+    
+    Fix by restructuring code to hoist common code and have only one
+    place where admin_socket is actually called.
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 266460e97ec9ef9711e9eaa4bd954f3188d8da69)
+
+commit d290a91525c3ebc6941dae2bb55f0bfbf120cb60
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 14:37:07 2013 -0700
+
+    mon: use str_join instead of std::copy
+    
+    The std::copy method leaves a trailing separator.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 35565ee64e41d7fddc7849c6006692c78227132c)
+
+commit b99921746ef2e1e15777c748a15e929c72888db1
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 14:36:57 2013 -0700
+
+    config: fix stringification of config values
+    
+    The std::copy construct leaves a trailing separator character, which breaks
+    parsing for booleans (among other things) and probably mangles everything
+    else too.
+    
+    Backport: dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit fc23cfe3fe567b30413d8af0c614a32fec238939)
+
+commit d212bba6bd0d7d234097122988e4d973064b5645
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 14:36:49 2013 -0700
+
+    common: add str_join helper
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit ce3a0944d9b47f7b178fe7775c9d105305b238e0)
+
+commit a99fef9189086f5dd6ddacaecf967619dc5fe407
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 14 15:50:59 2013 -0700
+
+    rados.py: fix Rados() unicode checking
+    
+    Check new parameters and check that rados_id is not None again to
+    catch the empty string.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit 4422f21a6586467a63ce6841552d0f60aa849cf1)
+
+commit dd0df583e2661444287a36acc240a8ac0ec381e8
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 14 15:28:19 2013 -0700
+
+    rados.py: fix Rados() backwards compatibility
+    
+    Previously it had no name parameter, so the default will be used by
+    old clients. However, if an old client set rados_id, a new check that
+    both rados_id and name are set would result in an error. Fix this by
+    only applying the default names after the check, and add tests of this
+    behavior.
+    
+    This was introduced in 783b7ec847c7f987ac1814c9c41c91921cac4eba,
+    so it does not affect cuttlefish.
+    
+    Fixes: #5970
+    Reported-by: Michael Morgan <mmorgan at dca.net>
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit 34da9cbc33205623cf64aee1989f53dfb2c5bddd)
+
+commit b9d1bf51610159a88ad257f29a81691e6b178e17
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 13 12:52:41 2013 -0700
+
+    librados: fix async aio completion wakeup
+    
+    For aio flush, we register a wait on the most recent write.  The write
+    completion code, however, was *only* waking the waiter if they were waiting
+    on that write, without regard to previous writes (completed or not).
+    For example, we might have 6 and 7 outstanding and wait on 7.  If they
+    finish in order all is well, but if 7 finishes first we do the flush
+    completion early.  Similarly, if we
+    
+     - start 6
+     - start 7
+     - finish 7
+     - flush; wait on 7
+     - finish 6
+    
+    we can hang forever.
+    
+    Fix by doing any completions that are prior to the oldest pending write in
+    the aio write completion handler.
+    
+    Refs: #5919
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Tested-by: Oliver Francke <Oliver.Francke at filoo.de>
+    (cherry picked from commit 16ed0b9af8bc08c7dabead1c1a7c1a22b1fb02fb)
+
+commit 29ae033b435581a64fc92a26106b4ea1c3dfc0b1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Aug 12 19:17:09 2013 -0700
+
+    librados: fix locking for AioCompletionImpl refcounting
+    
+    Add an already-locked helper so that C_Aio{Safe,Complete} can
+    increment the reference count when their caller holds the
+    lock. C_AioCompleteAndSafe's caller is not holding the lock, so call
+    regular get() to ensure no racing updates can occur.
+    
+    This eliminates all direct manipulations of AioCompletionImpl->ref,
+    and makes the necessary locking clear.
+    
+    The only place C_AioCompleteAndSafe is used is in handling
+    aio_flush_async(). This could cause a missing completion.
+    
+    Refs: #5919
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Tested-by: Oliver Francke <Oliver.Francke at filoo.de>
+    (cherry picked from commit 7a52e2ff5025754f3040eff3fc52d4893cafc389)
diff --git a/doc/changelog/v0.67.10.txt b/doc/changelog/v0.67.10.txt
new file mode 100644
index 0000000..165c8e0
--- /dev/null
+++ b/doc/changelog/v0.67.10.txt
@@ -0,0 +1,669 @@
+commit 9d446bd416c52cd785ccf048ca67737ceafcdd7f (tag: refs/tags/v0.67.10)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon Aug 11 05:30:10 2014 -0700
+
+    0.67.10
+
+commit a86e497a343b24425a1237e65ec2776398d07a95
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Mon Jul 14 14:27:17 2014 +0800
+
+    Add rbdcache max dirty object option
+    
+    Librbd will calculate max dirty object according to rbd_cache_max_size, it
+    doesn't suitable for every case. If user set image order 24, the calculating
+    result is too small for reality. It will increase the overhead of trim call
+    which is called each read/write op.
+    
+    Now we make it as option for tunning, by default this value is calculated.
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 3c7229a2fea98b30627878c86b1410c8eef2b5d7)
+
+commit d02381316ba96746a00b2b6f8c5c665179fe7a79
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Jun 4 23:22:18 2014 +0200
+
+    librbd/internal.cc: check earlier for null pointer
+    
+    Fix potential null ponter deref, move check for 'order != NULL'
+    to the beginning of the function to prevent a) deref in ldout() call
+    and b) to leave function as early as possible if check fails.
+    
+    [src/librbd/internal.cc:843] -> [src/librbd/internal.cc:865]: (warning)
+     Possible null pointer dereference: order - otherwise it is redundant
+     to check it against null.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 3ee3e66a9520a5fcafa7d8c632586642f7bdbd29)
+
+commit dda98b9afb5d74c8c5f101b792daca9ca344fe87
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Apr 24 14:47:24 2014 -0700
+
+    librbd: add an interface to invalidate cached data
+    
+    This is useful for qemu to guarantee live migration with caching is
+    safe, by invalidating the cache on the destination before starting it.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 5d340d26dd70192eb0e4f3f240e3433fb9a24154)
+
+commit d93579514db74eed61580a6166c2787304a8a9fb
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Apr 24 14:43:35 2014 -0700
+
+    librbd: check return code and error out if invalidate_cache fails
+    
+    This will only happen when shrinking or rolling back an image is done
+    while other I/O is in flight to the same ImageCtx. This is unsafe, so
+    return an error before performing the resize or rollback.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e08b8b66c77be3a3d7f79d91c20b1619571149ee)
+
+commit 617914209694f67150264358da888c1ca9ff42e1
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Wed May 21 18:12:22 2014 +0800
+
+    Avoid extra check for clean object
+    
+    We needn't to check clean object via buffer state, skip the clean object.
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit f51e33bd9c5a8e1cfc7065b30785696dc45918bc)
+
+commit d474443b12b978dbe267e63cd8e34e8c835e4f6c
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Fri Mar 28 18:10:43 2014 -0700
+
+    rbd.cc: yes, cover formatted output as well.  sigh.
+    
+    Fixes: #7577
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit bd6e35c1b171e46cc3e026c59b076b73440a8502)
+
+commit 051d1b4e56b37b2293b54d8cdb58a974684c8464
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Mar 25 17:09:48 2014 -0700
+
+    rbd.cc: tolerate lack of NUL-termination on block_name_prefix
+    
+    Fixes: #7577
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fd76fec589be13a4a6362ef388929d3e3d1d21f6)
+
+commit 61e2219dd07ebb856a61f54e8cd992dc1e16f5d9
+Author: Ilya Dryomov <ilya.dryomov at inktank.com>
+Date:   Wed Jan 29 16:12:01 2014 +0200
+
+    rbd: don't forget to call close_image() if remove_child() fails
+    
+    close_image() among other things unregisters a watcher that's been
+    registered by open_image().  Even though it'll timeout in 30 or so
+    seconds, it's not nice now that we check for watchers before starting
+    the removal process.
+    
+    Signed-off-by: Ilya Dryomov <ilya.dryomov at inktank.com>
+    (cherry picked from commit 4ebc32f37a4860bdc676491bf8b042c18fd619cf)
+
+commit 2c6c23cee7ff2a8f56f3986051d43824b7bd3526
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Aug 9 13:23:06 2014 -0700
+
+    os/FileStore: dump open fds before asserting
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 4e8de1792731cf30f2744ab0659d036adc0565a3)
+
+commit 3663233a63df3a1fb1584d9800e1c6a8feac2fe0
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Feb 18 16:43:48 2014 -0800
+
+    rgw: return error if accessing object in non-existent bucket
+    
+    Fixes: #7064
+    Instead of trying to access the object, which is impossible as we don't
+    even have a proper bucket info. Up until now we ended up creating an
+    empty pool and eventually returning ENOENT, this fix catches the issue
+    earlier in the process.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 3ed68eb9fac9b3d0bf9111867d609f9ea08fb202)
+
+commit 0a1cea58641c4584b85165755145d8d0288f4f22
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 6 17:04:02 2014 -0700
+
+    os/FileStore: force any new xattr into omap on E2BIG
+    
+    If we have a huge xattr (or many little ones), the _fgetattrs() for the
+    inline_set will fail with E2BIG.  The conditions later where we decide
+    whether to clean up the old xattr will then also fail.  Will *will* put
+    the xattr in omap, but the non-omap version isn't cleaned up.
+    
+    Fix this by setting a flag if we get E2BIG that the inline_set is known
+    to be incomplete.  In that case, take the conservative step of assuming
+    the xattr might be present and chain_fremovexattr().  Ignore any error
+    because it might not be there.
+    
+    This is clearly harmless in the general case because it won't be there.  If
+    it is, we will hopefully remove enough xattrs that the E2BIG condition
+    will go away (usually by removing some really big chained xattr).
+    
+    See bug #7779.
+    
+    This is a backport of 26750fcfe8d766874513e57981565adde2e6d8c7.
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 64d5c406995bedbb6a4bc9c851f5d25fe94749ee
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 23 14:58:54 2014 -0700
+
+    rgw: calc md5 and compare if user provided appropriate header
+    
+    Fixes: #8436
+    Backport: firefly
+    
+    This was broken in ddc2e1a8e39a5c6b9b224c3eebd1c0e762ca5782. The fix
+    resurrects and old check that was dropped.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9c56c86bdac6bcb8e76c3f04e7d393e4eaadd721)
+
+commit ebecd80d3a082ac87e7cd6a63cbd00259c5a8baf
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Apr 21 15:07:12 2014 -0700
+
+    rgw: calculate user manifest
+    
+    Fixes: #8169
+    Backport: firefly
+    We didn't calculate the user manifest's object etag at all. The etag
+    needs to be the md5 of the contantenation of all the parts' etags.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit ddc2e1a8e39a5c6b9b224c3eebd1c0e762ca5782)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
+
+commit 1f3f2982224f68109cce8b5564d99977b22c8f60
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Jul 29 15:25:47 2014 -0700
+
+    rgw: fix crash in swift CORS preflight request
+    
+    Fixes: #8586
+    
+    This fixes error handling, in accordance with commit 6af5a537 that fixed
+    the same issue for the S3 case.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 18ea2a869791b4894f93fdafde140285f2e4fb65)
+
+commit 6e4921500aeb256da0fa20da6ee47fb7d4e171f6
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jul 30 11:53:16 2014 -0700
+
+    cls_rgw: fix object name of objects removed on object creation
+    
+    Fixes: #8972
+    Backport: firefly, dumpling
+    
+    Reported-by: Patrycja Szabłowska <szablowska.patrycja at gmail.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 0f8929a68aed9bc3e50cf15765143a9c55826cd2)
+
+commit 4aa2b87385e94be0147401918c332d526029e481
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 2 10:38:43 2014 -0700
+
+    qa/workunits/rest/test.py: make osd create test idempotent
+    
+    Avoid possibility that we create multiple OSDs do to retries by passing in
+    the optional uuid arg.  (A stray osd id will make the osd tell tests a
+    few lines down fail.)
+    
+    Fixes: #8728
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bb3e1c92b6682ed39968dc5085b69c117f43cbb0)
+
+commit 935e75a850b3363536cc09b68f45f2a497da4bb4
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Apr 10 15:14:19 2014 +0100
+
+    mon: Monitor: suicide on start if mon has been removed from monmap
+    
+    If the monitor has been marked as having been part of an existing quorum
+    and is no longer in the monmap, then it is safe to assume the monitor
+    was removed from the monmap.  In that event, do not allow the monitor
+    to start, as it will try to find its way into the quorum again (and
+    someone clearly stated they don't really want them there), unless
+    'mon force quorum join' is specified.
+    
+    Fixes: 6789
+    Backport: dumpling, emperor
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 86b85947a2148c2e73886c1a7edd09093966ada0)
+    
+    Conflicts:
+    	src/common/config_opts.h
+
+commit 4aca6c0d7540c2bf5fb54df2d70c4649a9b94100
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 16 16:05:58 2014 -0700
+
+    utf8: export encode_utf8() and decode_utf8()
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 49fc68cf8c3122c878ea9503c9c74d7046bc9c6f)
+
+commit ffa1f5200061c48de6315b5e7bd335ab5f718a6f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jul 18 14:52:48 2014 -0700
+
+    rgw: dump prefix unconditionally
+    
+    As part of issue #8858, and to be more in line with S3, dump the Prefix
+    field when listing bucket even if bucket is empty.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d7209c11251d42227608bc54cc69232ef62ffe80)
+    
+    Conflicts:
+    	src/rgw/rgw_rest_s3.cc
+
+commit 6df17a92283da9933bf5a3fca1278b728c79b8ee
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 17 15:48:26 2014 -0700
+
+    rgw: list extra objects to set truncation flag correctly
+    
+    Otherwise we end up returning wrong truncated value, and no data on the
+    next iteration.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit dc417e477d4ad262885c6b5f5987cf06d63b159d)
+
+commit 77c20879d02c9793241da508b5ad59f8b927e9f7
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 17 11:45:44 2014 -0700
+
+    rgw: account common prefixes for MaxKeys in bucket listing
+    
+    To be more in line with the S3 api. Beforehand we didn't account the
+    common prefixes towards the MaxKeys (a single common prefix counts as a
+    single key). Also need to adjust the marker now if it is pointing at a
+    common prefix.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 82d2d612e700f94a0bb2d9fb7555abf327be379b)
+
+commit 7068d8595ff462323dedd9b56bce28a76405585a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 17 11:24:51 2014 -0700
+
+    rgw: add NextMarker param for bucket listing
+    
+    Partially fixes #8858.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 924686f0b6593deffcd1d4e80ab06b1e7af00dcb)
+
+commit 9604425b86f5839a109faa1f396b0d114e9b9391
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 16 15:21:09 2014 -0700
+
+    rgw: improve delmited listing of bucket
+    
+    If found a prefix, calculate a string greater than that so that next
+    request we can skip to that. This is still not the most efficient way to
+    do it. It'll be better to push it down to the objclass, but that'll
+    require a much bigger change.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit e6cf618c257f26f97f60a4c1df1d23a14496cab0)
+
+commit b287c677ba1a5573e66c8a287f6a1f420c3ba46f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 16 12:23:31 2014 -0700
+
+    rgw: don't try to wait for pending if list is empty
+    
+    Fixes: #8846
+    Backport: firefly, dumpling
+    
+    This was broken at ea68b9372319fd0bab40856db26528d36359102e. We ended
+    up calling wait_pending_front() when pending list was empty.
+    This commit also moves the need_to_wait check to a different place,
+    where we actually throttle (and not just drain completed IOs).
+    
+    Reported-by: Sylvain Munaut <s.munaut at whatever-company.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit f9f2417d7db01ecf2425039539997901615816a9)
+
+commit 4b13caf5be33d4644811d387d1350f2f11ac5409
+Author: Warren Usui <warren.usui at inktank.com>
+Date:   Thu Apr 24 12:55:26 2014 -0700
+
+    Use new git mirror for qemu-iotests
+    
+    Fixes: 8191
+    Signed-off-by: Warren Usui <warren.usui at inktank.com>
+    (cherry picked from commit ddf37d903f826f3e153d8009c716780453b68b05)
+
+commit 3f251024bf056f5a8c22f29333b3a81589431424
+Author: Warren Usui <warren.usui at inktank.com>
+Date:   Wed Apr 23 13:20:14 2014 -0700
+
+    Support latest qemu iotest code
+    
+    Modified qemu-iotests workunit script to check for versions
+    that use the latest qemu (currently only Trusty).  Limit the
+    tests to those that are applicable to rbd.
+    
+    Fixes: 7882
+    Signed-off-by: Warren Usui <warren.usui at inktank.com>
+    (cherry picked from commit 606e725eb5204e76e602d26ffd113e40af2ee812)
+
+commit d06137841f9911ce4dc0d9ab9be73a131ede879d
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Mar 31 14:53:31 2014 -0700
+
+    librbd: skip zeroes when copying an image
+    
+    This is the simple coarse-grained solution, but it works well in
+    common cases like a small base image resized with a bunch of empty
+    space at the end. Finer-grained sparseness can be copied by using rbd
+    {export,import}-diff.
+    
+    Fixes: #6257
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 824da2029613a6f4b380b6b2f16a0bd0903f7e3c)
+
+commit 8649cbbc96a4de9de169b0203f35e0ac6c36a2ef
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Jul 1 15:19:21 2014 -0700
+
+    Revert "qa/workunits/suites/fsx.sh: don't use zero range"
+    
+    This reverts commit 583e6e3ef7f28bf34fe038e8a2391f9325a69adf.
+    
+    We're using a different fsx source, which doesn't support the
+    same options as our git-based one does.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+
+commit 583e6e3ef7f28bf34fe038e8a2391f9325a69adf
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 30 07:05:04 2014 -0700
+
+    qa/workunits/suites/fsx.sh: don't use zero range
+    
+    Zero range is not supported by cephfs.
+    
+    Fixes: #8542
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2dec8a810060f65d022c06e82090b4aa5ccec0cb)
+
+commit 49c0b46153f96a94407ef2487b2bd9525dfaa1e6
+Merge: 3c63601 4ca12b4
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Jun 30 19:19:24 2014 +0200
+
+    Merge pull request #2014 from ceph/wip-scrub-dumpling
+    
+    osd: scrub priority updates for dumpling
+    
+    Reviewed-by: Loic Dachary <loic at dachary.org>
+
+commit 3c63601888c5c825f33ffc6797474eb8dc6935a4
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Jun 16 11:48:24 2014 -0700
+
+    rgw: allocate enough space for bucket instance id
+    
+    Fixes: #8608
+    Backport: dumpling, firefly
+    Bucket instance id is a concatenation of zone name, rados instance id,
+    and a running counter. We need to allocate enough space to account zone
+    name length.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit d2e86a66ca55685e04ffbfaa58452af59f381277)
+
+commit 15360a900c8746c28006d6f5c8b093685ddac796
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 08:52:51 2014 -0700
+
+    ceph-disk: partprobe before settle when preparing dev
+    
+    Two users have reported this fixes a problem with using --dmcrypt.
+    
+    Fixes: #6966
+    Tested-by: Eric Eastman <eric0e at aol.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0f196265f049d432e399197a3af3f90d2e916275)
+
+commit ef736f530405a2c4f9a9a1b4cc98d1160524e1ab
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 17 13:33:14 2014 -0700
+
+    osd: fix filestore perf stats update
+    
+    Update the struct we are about to send, not the (unlocked!) one we will
+    send the next time around.
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4afffb4a10a0bbf7f2018ef3ed6b167c7921e46b)
+
+commit 4ca12b40206f64d32369a78ce443a0dbf5d2b757
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:02:09 2014 -0700
+
+    common/WorkQueue: allow io priority to be set for wq
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5e4b3b1f1cb870f39fc7cfb3adeae93e078d9057)
+    
+    Conflicts:
+    	src/common/WorkQueue.cc
+
+commit c9b3067f9b78a65e0b9c2ce2488d8906eb73c869
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:01:42 2014 -0700
+
+    common/Thread: allow io priority to be set for a Thread
+    
+    Ideally, set this before starting the thread.  If you set it after, we
+    could potentially race with create() itself.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 01533183e7455b713640e001962339907fb6f980)
+
+commit 0796057f1c13c467dd3eadca036e3034da20e500
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:01:09 2014 -0700
+
+    common/io_priority: wrap ioprio_set() and gettid()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 705713564bebd84ad31cc91698311cf2fbd51a48)
+    
+    Conflicts:
+    	src/common/Makefile.am
+
+commit c46fe8e9ec54d4decd1f70256a8ab05c9b183f8a
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 17 10:47:24 2014 -0700
+
+    osd: introduce simple sleep during scrub
+    
+    This option is similar to osd_snap_trim_sleep: simply inject an optional
+    sleep in the thread that is doing scrub work.  This is a very kludgey and
+    coarse knob for limiting the impact of scrub on the cluster, but can help
+    until we have a more robust and elegant solution.
+    
+    Only sleep if we are in the NEW_CHUNK state to avoid delaying processing of
+    an in-progress chunk.  In this state nothing is blocked on anything.
+    Conveniently, chunky_scrub() requeues itself for each new chunk.
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c4e8451cc5b4ec5ed07e09c08fb13221e31a7ac6)
+
+commit 3cf01a0e56c5599731e25898c1d9f2d2b3d6a9ba
+Merge: 8fd2fc1 c340085
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 09:27:03 2014 -0700
+
+    Merge pull request #1963 from dachary/wip-8599-ruleset-dumpling
+    
+    mon: pool set <pool> crush_ruleset must not use rule_exists (dumpling)
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit c34008532362c3afadff6287bc8746c141a221a3
+Author: John Spray <john.spray at inktank.com>
+Date:   Tue May 20 16:50:18 2014 +0100
+
+    mon: pool set <pool> crush_ruleset must not use rule_exists
+    
+    Implement CrushWrapper::ruleset_exists that iterates over the existing
+    rulesets to find the one matching the ruleset argument.
+    
+    ceph osd pool set <pool> crush_ruleset must not use
+    CrushWrapper::rule_exists, which checks for a *rule* existing, whereas
+    the value being set is a *ruleset*. (cherry picked from commit
+    fb504baed98d57dca8ec141bcc3fd021f99d82b0)
+    
+    A test via ceph osd pool set data crush_ruleset verifies the ruleset
+    argument is accepted.
+    
+    http://tracker.ceph.com/issues/8599 fixes: #8599
+    
+    Backport: firefly, emperor, dumpling
+    Signed-off-by: John Spray <john.spray at inktank.com>
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit d02d46e25080d5f7bb8ddd4874d9019a078b816b)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc
+
+commit 8fd2fc1aec4ba08c086a7db2208dbdebfcb4e92e
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 3 07:03:01 2014 -0800
+
+    osd: 'status' admin socket command
+    
+    Basic stuff, like what state is the OSD in, and what osdmap epoch are
+    we on.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 09099c9e4c7d2aa31eb8a0b7c18e43272fae7ce2)
+
+commit 323492451c2d29b90c30a4e133dc8ca9780035a5
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 8 20:18:49 2014 -0700
+
+    init-ceph: continue after failure doing osd data mount
+    
+    If we are starting many daemons and hit an error, we normally note it and
+    move on.  Do the same when doing the pre-mount step.
+    
+    Fixes: #8554
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6a7e20147cc39ed4689809ca7d674d3d408f2a17)
+
+commit 558249c519225d5e6d0784da20fe12d8f5d71cd2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue May 6 11:06:29 2014 -0700
+
+    rgw: cut short object read if a chunk returns error
+    
+    Fixes: #8289
+    Backport: firefly, dumpling
+    When reading an object, if we hit an error when trying to read one of
+    the rados objects then we should just stop. Otherwise we're just going
+    to continue reading the rest of the object, and since it can't be sent
+    back to the client (as we have a hole in the middle), we end up
+    accumulating everything in memory.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 03b0d1cfb7bd30a77fedcf75eb06476b21b14e95)
+
+commit a948ce2f9ccf67d5ccc690b5c326af19b6e6da4d
+Merge: 95a464a 7ad2fbf
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 8 21:12:32 2014 -0700
+
+    Merge pull request #1931 from ceph/wip-7068-dumpling
+    
+    Wip 7068 dumpling
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 95a464a443e3a249889151807065736fff44ea3a
+Merge: a79a787 94e6c08
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Jun 6 08:45:58 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-8269-dumpling' into dumpling
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit a79a787b924ef7e04efb7f3c13b9559e06bebfd8
+Author: John Wilkins <john.wilkins at inktank.com>
+Date:   Thu Jun 5 11:41:41 2014 -0700
+
+    doc: Added requiretty comment to preflight checklist.
+    
+    Signed-off-by: John Wilkins <john.wilkins at inktank.com>
+
+commit 5c5eb21fd1a12666e1ce79718c8166eb7bdd6748
+Author: John Wilkins <john.wilkins at inktank.com>
+Date:   Thu Jun 5 11:34:46 2014 -0700
+
+    doc: Added Disable requiretty to quick start.
+    
+    Signed-off-by: John Wilkins <john.wilkins at inktank.com>
+
+commit 7ad2fbf3bd3208f47aa2a76d3fd16479e2c845ab
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Oct 2 18:00:04 2013 -0700
+
+    ReplicatedPG: lock snapdir obc during write
+    
+    Otherwise, we won't block properly in prep_push_backfill_object.
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit b87bc2311aa4da065477f402a869e2edc1558e2f)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.h
+
+commit 94e6c0858fb07c0edb8fc4d08e02542d22823ed2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 2 17:06:05 2014 -0700
+
+    rgw: don't allow multiple writers to same multiobject part
+    
+    Fixes: #8269
+    
+    A client might need to retry a multipart part write. The original thread
+    might race with the new one, trying to clean up after it, clobbering the
+    part's data.
+    The fix is to detect whether an original part already existed, and if so
+    use a different part name for it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
diff --git a/doc/changelog/v0.67.11.txt b/doc/changelog/v0.67.11.txt
new file mode 100644
index 0000000..6e581ec
--- /dev/null
+++ b/doc/changelog/v0.67.11.txt
@@ -0,0 +1,215 @@
+commit bc8b67bef6309a32361be76cd11fb56b057ea9d2 (tag: refs/tags/v0.67.11, refs/remotes/gh/dumpling)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Wed Sep 24 06:25:55 2014 -0700
+
+    0.67.11
+
+commit 0e90b04d9452999d7d91305c80585782d492c91b (refs/remotes/gh/dumpling-jni)
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed May 21 21:41:23 2014 -0700
+
+    cephfs-java: build against older jni headers
+    
+    Older versions of the JNI interface expected non-const parameters
+    to their memory move functions. It's unpleasant, but won't actually
+    change the memory in question, to do a cast_const in order to satisfy
+    those older headers. (And even if it *did* modify the memory, that
+    would be okay given our single user.)
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 4d4b77e5b6b923507ec4a0ad9d5c7018e4542a3c)
+
+commit 3f020443c8d92e61d8593049147a79a6696c9c93
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Jul 24 15:29:40 2014 -0700
+
+    librbd: fix crash using clone of flattened image
+    
+    The crash occurs due to ImageCtx->parent->parent being uninitialized,
+    since the inital open_parent() -> open_image(parent) ->
+    ictx_refresh(parent) occurs before ImageCtx->parent->snap_id is set,
+    so refresh_parent() is not called to open an ImageCtx for the parent
+    of the parent. This leaves the ImageCtx->parent->parent NULL, but the
+    rest of ImageCtx->parent updated to point at the correct parent snapshot.
+    
+    Setting the parent->snap_id earlier has some unintended side effects
+    currently, so for now just call refresh_parent() during
+    open_parent(). This is the easily backportable version of the
+    fix. Further patches can clean up this whole initialization process.
+    
+    Fixes: #8845
+    Backport: firefly, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 2545e80d274b23b6715f4d8b1f4c6b96182996fb)
+
+commit d3e880af5f3ae71d13159514c33c6b41fc648d54
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 10 08:00:50 2014 -0700
+
+    test/cli-integration/rbd: fix trailing space
+    
+    Newer versions of json.tool remove the trailing ' ' after the comma.  Add
+    it back in with sed so that the .t works on both old and new versions, and
+    so that we don't have to remove the trailing spaces from all of the test
+    cases.
+    
+    Fixes: #8920
+    
+    Backports commit 605064dc685aa25cc7d58ec18b6449a3ce476d01
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 5336398618f49d10e497392ab942d43062ed772d
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Aug 16 12:42:33 2014 -0700
+
+    os/FileStore: fix mount/remount force_sync race
+    
+    Consider:
+    
+     - mount
+     - sync_entry is doing some work
+     - umount
+       - set force_sync = true
+       - set done = true
+     - sync_entry exits (due to done)
+       - ..but does not set force_sync = false
+     - mount
+     - journal replay starts
+     - sync_entry sees force_sync and does a commit while op_seq == 0
+     ...crash...
+    
+    Fixes: #9144
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit dd11042f969b94f7a461d02e1475794031c79f61)
+    
+    Conflicts:
+    	src/os/FileStore.cc
+
+commit f7498c47ed90db71e50a3d4ff9ce13626e863719
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 8 13:44:57 2014 -0700
+
+    osdc/Objecter: revoke rx_buffer on op_cancel
+    
+    If we cancel a read, revoke the rx buffers to avoid a use-after-free and/or
+    other undefined badness by using user buffers that may no longer be
+    present.
+    
+    Fixes: #9362
+    Backport: firefly, dumpling
+    Reported-by: Matthias Kiefer <matthias.kiefer at 1und1.de>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2305b2897acba38384358c33ca3bbfcae6f1c74e)
+    
+    (adjusted for op->con instead of s->con)
+
+commit 4dbb5010bd73ea8c7f9ed85e90e645ba1e85ea0a
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 8 06:58:45 2014 -0700
+
+    mon/Paxos: don't spam log with is_readable at dout level 1
+    
+    Backport: firefly, dumpling
+    Reported-by: Aanchal Agrawal <Aanchal.Agrawal at sandisk.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 62ca27d0b119b597ebad40dde64c4d86599e466d)
+
+commit 5315cf0a47e0a21e514df0d85be170dbca7ffc92
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Thu Sep 4 13:58:14 2014 -0400
+
+    doc: add note on soft JS dependency for navigating docs
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 657be818375bea2d8b5998ea1e5505eedc2f294d)
+
+commit 707076e3a9294169c3042afeb11b71b84727094b
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Sep 3 21:21:45 2014 -0400
+
+    doc: fix missing bracket
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 69638dfaeb0dcd96dac4b5f5c00ed08042432487)
+
+commit 2ebdcfd5490462d77e32ffe3ef162f70183d53ab
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Sep 3 20:47:54 2014 -0400
+
+    doc: attempt to get the ayni JS into all head tags
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 35663fa55ac1579a3b0c8b67028a3a8dfea87b48)
+
+commit c7948afa8232117c8a6e13b17774045a5e1bea6d
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 17 20:54:28 2014 -0700
+
+    qa/workunits/rbd/qemu-iotests: touch common.env
+    
+    This seems to be necessary on trusty.
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 055be68cf8e1b84287ab3631a02e89a9f3ae6cca)
+
+commit aaeebceb2189336f5f957f2a797d0448c2754b15
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 13:32:29 2014 -0700
+
+    mon: fix divide by zero when pg_num adjusted and no osds
+    
+    Fixes: #9052
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    
+    Manual backport of 239401db7b51541a57c59a261b89e0f05347c32d
+
+commit e7c5fb58d85ed0d1be359e616137666c5e207c38
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 07:05:34 2014 -0700
+
+    common/LogClient: fix sending dup log items
+    
+    We need to skip even the most recently sent item in order to get to the
+    ones we haven't sent yet.
+    
+    Fixes: #9080
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 057c6808be5bc61c3f1ac2b956c1522f18411245)
+
+commit cbc9218edc122337fd6d9dbbdca18670e20c6169
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Aug 11 16:41:26 2014 -0700
+
+    librbd: fix error path cleanup for opening an image
+    
+    If the image doesn't exist and caching is enabled, the ObjectCacher
+    was not being shutdown, and the ImageCtx was leaked. The IoCtx could
+    later be closed while the ObjectCacher was still running, resulting in
+    a segfault. Simply use the usual cleanup path in open_image(), which
+    works fine here.
+    
+    Fixes: #8912
+    Backport: dumpling, firefly
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 3dfa72d5b9a1f54934dc8289592556d30430959d)
+
+commit b5dafe1c0f7ecf7c3a25d0be5dfddcbe3d07e69e
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:02:58 2014 -0700
+
+    osd: allow io priority to be set for the disk_tp
+    
+    The disk_tp covers scrubbing, pg deletion, and snap trimming
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 84b3003119eeb8acfb3faacf357e6c6a452950e3)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+    
+    (cherry picked from commit 987ad133415aa988061c95259f9412b05ce8ac7e)
diff --git a/doc/changelog/v0.67.2.txt b/doc/changelog/v0.67.2.txt
new file mode 100644
index 0000000..e5d0f3d
--- /dev/null
+++ b/doc/changelog/v0.67.2.txt
@@ -0,0 +1,207 @@
+commit eb4380dd036a0b644c6283869911d615ed729ac8
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Thu Aug 22 19:10:55 2013 -0700
+
+    v0.67.2
+
+commit 242e43dae5b7c935b8f92c09e8dfe4704ba13787
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:49:57 2013 -0700
+
+    .gitignore: ignore test-driver
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit edf2c3449ec96d91d3d7ad01c50f7a79b7b2f7cc)
+
+commit 88aef702fb77c0a176caf37646a11ef480621412
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:42:49 2013 -0700
+
+    fuse: fix warning when compiled against old fuse versions
+    
+    client/fuse_ll.cc: In function 'void invalidate_cb(void*, vinodeno_t, int64_t, int64_t)':
+    warning: client/fuse_ll.cc:540: unused variable 'fino'
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9833e9dabe010e538cb98c51d79b6df58ce28f9e)
+
+commit 48e104c9486f7a532455df108dbc225c00796097
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:40:34 2013 -0700
+
+    json_spirit: remove unused typedef
+    
+    In file included from json_spirit/json_spirit_writer.cpp:7:0:
+    json_spirit/json_spirit_writer_template.h: In function 'String_type json_spirit::non_printable_to_string(unsigned int)':
+    json_spirit/json_spirit_writer_template.h:37:50: warning: typedef 'Char_type' locally defined but not used [-Wunused-local-typedefs]
+             typedef typename String_type::value_type Char_type;
+    
+    (Also, ha ha, this file uses \r\n.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6abae35a3952e5b513895267711fea63ff3bad09)
+
+commit ae42619ca710d737bf4d8c63f39d1102326c903c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 9 12:31:41 2013 -0700
+
+    gtest: add build-aux/test-driver to .gitignore
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c9cdd19d1cd88b84e8a867f5ab85cb51fdc6f8e4)
+
+commit 2c122be08db2f233d66214eb804734ae45646084
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Aug 21 14:28:49 2013 -0700
+
+    objecter: resend unfinished lingers when osdmap is no longer paused
+    
+    Plain Ops that haven't finished yet need to be resent if the osdmap
+    transitions from full or paused to unpaused.  If these Ops are
+    triggered by LingerOps, they will be cancelled instead (since
+    should_resend = false), but the LingerOps that triggered them will not
+    be resent.
+    
+    Fix this by checking the registered flag for all linger ops, and
+    resending any of them that aren't paused anymore.
+    
+    Fixes: #6070
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    (cherry picked from commit 38a0ca66a79af4b541e6322467ae3a8a4483cc72)
+
+commit f6fe74ff51f679e7245b02462822d9ef1e15d28c
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 20 11:23:46 2013 -0700
+
+    pybind: fix Rados.conf_parse_env test
+    
+    This happens after we connect, which means we get ENOSYS always.
+    Instead, parse_env inside the normal setup method, which had the added
+    benefit of being able to debug these tests.
+    
+    Backport: dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6ef1970340c57d6e02f947348fb38882b51d131c)
+
+commit 47c89497b7f69cbf1557cd05b89837c388e2ba2f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 13 13:14:59 2013 -0700
+
+    librados: fix MWatchNotify leak
+    
+    Do not leak the message if the watcher is not registered.  Also, simplify
+    this block.
+    
+    Fixes (part of): #5949
+    Backport: dumpling, cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 6f5d8036f3e70c5e30edf7e36fb8ff9a56197f60)
+
+commit b3a9a8c4e5edff5431d8da71033047eced6bf985
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Aug 19 17:23:44 2013 -0700
+
+    PG: remove old log when we upgrade log version
+    
+    Otherwise the log_oid will be non-empty and the next
+    boot will cause us to try to upgrade again.
+    
+    Fixes: #6057
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1f851cb2489a95526de932ec6734ebf413e43490)
+
+commit c6005ccbaa482c62d7a6cbb387bdcf17f0e308d5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Aug 19 00:02:24 2013 -0700
+
+    PGLog: add a config to disable PGLog::check()
+    
+    This is a debug check which may be causing excessive
+    cpu usage.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 00080d785f6695b800f71317a3048a21064e61cb)
+
+commit 96d719eeecceaa06078a29c2f868e50e6bc9ab31
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Aug 19 12:48:50 2013 -0700
+
+    ceph: parse CEPH_ARGS environment variable
+    
+    Fixes: #6052
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 67a95b9880c9bc6e858150352318d68d64ed74ad)
+
+commit d348cf5d135d099fe0490c1519196cd83a04831e
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Aug 19 12:48:40 2013 -0700
+
+    rados pybind: add conf_parse_env()
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit eef7cacdb19313907a9367187b742db5382ee584)
+
+commit 290bcd8a718887eb0e28aa2d97bceeee79068ea9
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Aug 13 13:16:07 2013 -0700
+
+    rgw: drain requests before exiting
+    
+    Fixes: #5953
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3cbf6a7b031c2ce8072733c5c0b7ceb53fdcb090)
+
+commit 863df08a43dff99797453040eb1ef6071b0432f9
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 13 11:16:17 2013 -0700
+
+    rgw: do not leak handler in get_handler() error path
+    
+    If we fail to initialize, delete the handler.
+    
+    Fixes (part of): #5949
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 810c52de36719c3ee6cf2bdf59d5cde8840bbe55)
+
+commit 9ac003f793b6cc72059110aac44014ddf2372bee
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 26 23:20:54 2013 -0700
+
+    rgw: fix leak of RGWDataChangesLog::renew_thread
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 25948319c4d256c4aeb0137eb88947e54d14cc79)
+
+commit 89cd9dc403e97b4bd08920fbb5d6e2b8b9b7dac2
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 26 23:17:10 2013 -0700
+
+    rgw: free resolver on shutdown
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a31356338b8ae55df59d829d9080ffad70b97d10)
+
+commit 5b26ca7fa5beb87cbbe6bbb26d70789ff2aa7661
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 26 23:22:20 2013 -0700
+
+    rgw: fix up signal handling
+    
+    OMG libfcgi is annoying with shutdown and signals.  You need to close
+    the fd *and* resend a signal to ensure that you kick the accept loop
+    hard enough to make it shut down.
+    
+    Document this, and switch to the async signal handlers.  Put them
+    tightly around the runtime loop as we do with other daemons.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 59b13cebee600dad2551d2c7dc3482b05eaf8b22)
diff --git a/doc/changelog/v0.67.3.txt b/doc/changelog/v0.67.3.txt
new file mode 100644
index 0000000..d6b1f2b
--- /dev/null
+++ b/doc/changelog/v0.67.3.txt
@@ -0,0 +1,700 @@
+commit 408cd61584c72c0d97b774b3d8f95c6b1b06341a
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Mon Sep 9 12:50:11 2013 -0700
+
+    v0.67.3
+
+commit 17a7342b3b935c06610c58ab92a9a1d086923d32
+Merge: b4252bf 10433bb
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Sep 7 13:34:45 2013 -0700
+
+    Merge pull request #574 from dalgaaf/fix/da-dumpling-cherry-picks
+    
+    init-radosgw*: fix status return value if radosgw isn't running
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 10433bbe72dbf8eae8fae836e557a043610eb54e
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Sat Sep 7 11:30:15 2013 +0200
+
+    init-radosgw*: fix status return value if radosgw isn't running
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b5137baf651eaaa9f67e3864509e437f9d5c3d5a)
+
+commit b4252bff79150a95e9d075dd0b5e146ba9bf2ee5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Aug 22 11:19:37 2013 -0700
+
+    FileStore: add config option to disable the wbthrottle
+    
+    Backport: dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3528100a53724e7ae20766344e467bf762a34163)
+
+commit 699324e0910e5e07a1ac68df8cf1108e5671ec15
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Aug 22 11:19:52 2013 -0700
+
+    WBThrottle: use fdatasync instead of fsync
+    
+    Backport: dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d571825080f0bff1ed3666e95e19b78a738ecfe8)
+
+commit 074717b4b49ae1a55bc867e5c34d43c51edc84a5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Aug 29 15:08:58 2013 -0700
+
+    PGLog: initialize writeout_from in PGLog constructor
+    
+    Fixes: 6151
+    Backport: dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Introduced: f808c205c503f7d32518c91619f249466f84c4cf
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 42d65b0a7057696f4b8094f7c686d467c075a64d)
+
+commit c22d980cf42e580818dc9f526327518c0ddf8ff5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 27 08:49:14 2013 -0700
+
+    PGLog: maintain writeout_from and trimmed
+    
+    This way, we can avoid omap_rmkeyrange in the common append
+    and trim cases.
+    
+    Fixes: #6040
+    Backport: Dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit f808c205c503f7d32518c91619f249466f84c4cf)
+
+commit 53c7ab4db00ec7034f5aa555231f9ee167f43201
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 27 07:27:26 2013 -0700
+
+    PGLog: don't maintain log_keys_debug if the config is disabled
+    
+    Fixes: #6040
+    Backport: Dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 1c0d75db1075a58d893d30494a5d7280cb308899)
+
+commit 40dc489351383c2e35b91c3d4e76b633309716df
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Aug 26 23:19:45 2013 -0700
+
+    PGLog: move the log size check after the early return
+    
+    There really are stl implementations (like the one on my ubuntu 12.04
+    machine) which have a list::size() which is linear in the size of the
+    list.  That assert, therefore, is quite expensive!
+    
+    Fixes: #6040
+    Backport: Dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit fe68b15a3d82349f8941f5b9f70fcbb5d4bc7f97)
+
+commit 4261eb5ec105b9c27605360910602dc367fd79f5
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 13 17:16:08 2013 -0700
+
+    rbd.cc: relicense as LGPL2
+    
+    All past authors for rbd.cc have consented to relicensing from GPL to
+    LGPL2 via email:
+    
+    ---
+    
+    Date: Sat, 27 Jul 2013 01:59:36 +0200
+    From: Sylvain Munaut <s.munaut at whatever-company.com>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I hereby consent to the relicensing of any contribution I made to the
+    aforementioned rbd.cc file from GPL to LGPL2.1.
+    
+    (I hope that'll be impressive enough, I did my best :p)
+    
+    btw, tnt at 246tNt.com and s.munaut at whatever-company.com are both me.
+    
+    Cheers,
+    
+        Sylvain
+    
+    ---
+    
+    Date: Fri, 26 Jul 2013 17:00:48 -0700
+    From: Yehuda Sadeh <yehuda at inktank.com>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I consent.
+    
+    ---
+    
+    Date: Fri, 26 Jul 2013 17:02:24 -0700
+    From: Josh Durgin <josh.durgin at inktank.com>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I consent.
+    
+    ---
+    
+    Date: Fri, 26 Jul 2013 18:17:46 -0700
+    From: Stanislav Sedov <stas at freebsd.org>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I consent.
+    
+    Thanks for taking care of it!
+    
+    ---
+    
+    Date: Fri, 26 Jul 2013 18:24:15 -0700
+    From: Colin McCabe <cmccabe at alumni.cmu.edu>
+    
+    I consent.
+    
+    cheers,
+    Colin
+    
+    ---
+    
+    Date: Sat, 27 Jul 2013 07:08:12 +0200
+    From: Christian Brunner <christian at brunner-muc.de>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I consent
+    
+    Christian
+    
+    ---
+    
+    Date: Sat, 27 Jul 2013 12:17:34 +0300
+    From: Stratos Psomadakis <psomas at grnet.gr>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    Hi,
+    
+    I consent with the GPL -> LGL2.1 re-licensing.
+    
+    Thanks
+    Stratos
+    
+    ---
+    
+    Date: Sat, 27 Jul 2013 16:13:13 +0200
+    From: Wido den Hollander <wido at 42on.com>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I consent!
+    
+    You have my permission to re-license the code I wrote for rbd.cc to LGPL2.1
+    
+    ---
+    
+    Date: Sun, 11 Aug 2013 10:40:32 +0200
+    From: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    Subject: Re: btw
+    
+    Hi Sage,
+    
+    I agree to switch the license of ceph_argparse.py and rbd.cc from GPL2
+    to LGPL2.
+    
+    Regards
+    
+    Danny Al-Gaaf
+    
+    ---
+    
+    Date: Tue, 13 Aug 2013 17:15:24 -0700
+    From: Dan Mick <dan.mick at inktank.com>
+    Subject: Re: Ceph rbd.cc GPL -> LGPL2 license change
+    
+    I consent to relicense any contributed code that I wrote under LGPL2.1 license.
+    
+    ---
+    
+    ...and I consent too.  Drop the exception from COPYING and debian/copyright
+    files.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2206f55761c675b31078dea4e7dd66f2666d7d03)
+
+commit 211c5f13131e28b095a1f3b72426128f1db22218
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Aug 23 15:39:20 2013 -0700
+
+    rgw: flush pending data when completing multipart part upload
+    
+    Fixes: #6111
+    Backport: dumpling
+    When completing the part upload we need to flush any data that we
+    aggregated and didn't flush yet. With earlier code didn't have to deal
+    with it as for multipart upload we didn't have any pending data.
+    What we do now is we call the regular atomic data completion
+    function that takes care of it.
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 9a551296e0811f2b65972377b25bb28dbb42f575)
+
+commit 1a9651010aab51c9be2edeccd80e9bd11f5177ce
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 26 19:46:43 2013 -0700
+
+    rgw: check object name after rebuilding it in S3 POST
+    
+    Fixes: #6088
+    Backport: bobtail, cuttlefish, dumpling
+    
+    When posting an object it is possible to provide a key
+    name that refers to the original filename, however we
+    need to verify that in the end we don't end up with an
+    empty object name.
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit c8ec532fadc0df36e4b265fe20a2ff3e35319744)
+
+commit 1bd74a020b93f154b2d4129d512f6334387de7c7
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 22 17:46:45 2013 -0700
+
+    mon/MonClient: release pending outgoing messages on shutdown
+    
+    This fixes a small memory leak when we have messages queued for the mon
+    when we shut down.  It is harmless except for the valgrind leak check
+    noise that obscures real leaks.
+    
+    Backport: dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 309569a6d0b7df263654b7f3f15b910a72f2918d)
+
+commit 24f2669783e2eb9d9af5ecbe106efed93366ba63
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Aug 29 13:06:33 2013 -0700
+
+    rgw: change watch init ordering, don't distribute if can't
+    
+    Backport: dumpling
+    
+    Moving back the watch initialization after the zone init,
+    as the zone info holds the control pool name. Since zone
+    init might need to create a new system object (that needs
+    to distribute cache), don't try to distribute cache if
+    watch is not yet initialized.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 1d1f7f18dfbdc46fdb09a96ef973475cd29feef5)
+
+commit a708c8ab52e5b1476405a1f817c23b8845fbaab3
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 30 09:41:29 2013 -0700
+
+    ceph-post-file: use mktemp instead of tempfile
+    
+    tempfile is a debian thing, apparently; mktemp is present everywhere.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e60d4e09e9f11e3c34a05cd122341e06c7c889bb)
+
+commit 625f13ee0d6cca48d61dfd65e00517d092552d1c
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Aug 28 09:50:11 2013 -0700
+
+    mon: discover mon addrs, names during election state too
+    
+    Currently we only detect new mon addrs and names during the probing phase.
+    For non-trivial clusters, this means we can get into a sticky spot when
+    we discover enough peers to form an quorum, but not all of them, and the
+    undiscovered ones are enough to break the mon ranks and prevent an
+    election.
+    
+    One way to work around this is to continue addr and name discovery during
+    the election.  We should also consider making the ranks less sensitive to
+    the undefined addrs; that is a separate change.
+    
+    Fixes: #4924
+    Backport: dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Tested-by: Bernhard Glomm <bernhard.glomm at ecologic.eu>
+    (cherry picked from commit c24028570015cacf1d9e154ffad80bec06a61e7c)
+
+commit 83cfd4386c1fd0fa41aea345704e27f82b524ece
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Aug 22 17:30:24 2013 -0700
+
+    ceph_rest_api.py: create own default for log_file
+    
+    common/config thinks the default log_file for non-daemons should be "".
+    Override that so that the default is
+        /var/log/ceph/{cluster}-{name}.{pid}.log
+    since ceph-rest-api is more of a daemon than a client.
+    
+    Fixes: #6099
+    Backport: dumpling
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 2031f391c3df68e0d9e381a1ef3fe58d8939f0a8)
+
+commit 8a1da62d9564a32f7b8963fe298e1ac3ad0ea3d9
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 16 17:59:11 2013 -0700
+
+    ceph-post-file: single command to upload a file to cephdrop
+    
+    Use sftp to upload to a directory that only this user and ceph devs can
+    access.
+    
+    Distribute an ssh key to connect to the account.  This will let us revoke
+    the key in the future if we feel the need.  Also distribute a known_hosts
+    file so that users have some confidence that they are connecting to the
+    real ceph drop account and not some third party.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit d08e05e463f1f7106a1f719d81b849435790a3b9)
+
+commit 3f8663477b585dcb528fdd7047c50d9a52d24b95
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Aug 22 13:29:32 2013 -0700
+
+    ceph.spec.in:  remove trailing paren in previous commit
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 23fb908cb3ac969c874ac12755d20ed2f636e1b9
+Author: Gary Lowell <glowell at inktank.com>
+Date:   Thu Aug 22 11:07:16 2013 -0700
+
+    ceph.spec.in:  Don't invoke debug_package macro on centos.
+    
+    If the redhat-rpm-config package is installed, the debuginfo rpms will
+    be built by default.   The build will fail when the package installed
+    and the specfile also invokes the macro.
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 11f5853d8178ab60ab948d373c1a1f67324ce3bd
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Aug 24 14:04:09 2013 -0700
+
+    osd: install admin socket commands after signals
+    
+    This lets us tell by the presence of the admin socket commands whether
+    a signal will make us shut down cleanly.  See #5924.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit c5b5ce120a8ce9116be52874dbbcc39adec48b5c)
+
+commit 39adc0195e6016ce36828885515be1bffbc10ae1
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 20 22:39:09 2013 -0700
+
+    ceph-disk: partprobe after creating journal partition
+    
+    At least one user reports that a partprobe is needed after creating the
+    journal partition.  It is not clear why sgdisk is not doing it, but this
+    fixes ceph-disk for them, and should be harmless for other users.
+    
+    Fixes: #5599
+    Tested-by: lurbs in #ceph
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2af59d5e81c5e3e3d7cfc50d9330d7364659c5eb)
+    (cherry picked from commit 3e42df221315679605d68b2875aab6c7eb6b3cc4)
+
+commit 6a4fe7b9b068ae990d6404921a46631fe9ebcd31
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 20 11:27:23 2013 -0700
+
+    mon/Paxos: always refresh after any store_state
+    
+    If we store any new state, we need to refresh the services, even if we
+    are still in the midst of Paxos recovery.  This is because the
+    subscription path will share any committed state even when paxos is
+    still recovering.  This prevents a race like:
+    
+     - we have maps 10..20
+     - we drop out of quorum
+     - we are elected leader, paxos recovery starts
+     - we get one LAST with committed states that trim maps 10..15
+     - we get a subscribe for map 10..20
+       - we crash because 10 is no longer on disk because the PaxosService
+         is out of sync with the on-disk state.
+    
+    Fixes: #6045
+    Backport: dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 981eda9f7787c83dc457f061452685f499e7dd27)
+
+commit 13d396e46ed9200e4b9f21db2f0a8efbc5998d82
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 20 11:27:09 2013 -0700
+
+    mon/Paxos: return whether store_state stored anything
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 7e0848d8f88f156a05eef47a9f730b772b64fbf2)
+
+commit f248383bacff76203fa94716cfdf6cf766da24a7
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 20 11:26:57 2013 -0700
+
+    mon/Paxos: cleanup: use do_refresh from handle_commit
+    
+    This avoid duplicated code by using the helper created exactly for this
+    purpose.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit b9dee2285d9fe8533fa98c940d5af7b0b81f3d33)
+
+commit 02608a12d4e7592784148a62a47d568efc24079d
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 21:48:06 2013 -0700
+
+    osdc/ObjectCacher: do not merge rx buffers
+    
+    We do not try to merge rx buffers currently.  Make that explicit and
+    documented in the code that it is not supported.  (Otherwise the
+    last_read_tid values will get lost and read results won't get applied
+    to the cache properly.)
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1c50c446152ab0e571ae5508edb4ad7c7614c310)
+
+commit 0e2bfe71965eeef29b47e8032637ea820a7ce49c
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 15 21:47:18 2013 -0700
+
+    osdc/ObjectCacher: match reads with their original rx buffers
+    
+    Consider a sequence like:
+    
+     1- start read on 100~200
+           100~200 state rx
+     2- truncate to 200
+           100~100 state rx
+     3- start read on 200~200
+           100~100 state rx
+           200~200 state rx
+     4- get 100~200 read result
+    
+    Currently this makes us crash on
+    
+    osdc/ObjectCacher.cc: 738: FAILED assert(bh->length() <= start+(loff_t)length-opos)
+    
+    when processing the second 200~200 bufferhead (it is too big).  The
+    larger issue, though, is that we should not be looking at this data at
+    all; it has been truncated away.
+    
+    Fix this by marking each rx buffer with the read request that is sent to
+    fill it, and only fill it from that read request.  Then the first reply
+    will fill the first 100~100 extend but not touch the other extent; the
+    second read will do that.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit b59f930ae147767eb4c9ff18c3821f6936a83227)
+
+commit 6b51c960715971a0351e8203d4896cb0c4138a3f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Aug 22 15:54:48 2013 -0700
+
+    mon/Paxos: fix another uncommitted value corner case
+    
+    It is possible that we begin the paxos recovery with an uncommitted
+    value for, say, commit 100.  During last/collect we discover 100 has been
+    committed already.  But also, another node provides an uncommitted value
+    for 101 with the same pn.  Currently, we refuse to learn it, because the
+    pn is not strictly > than our current uncommitted pn... even though it is
+    the next last_committed+1 value that we need.
+    
+    There are two possible fixes here:
+    
+     - make this a >= as we can accept newer values from the same pn.
+     - discard our uncommitted value metadata when we commit the value.
+    
+    Let's do both!
+    
+    Fixes: #6090
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit fe5010380a3a18ca85f39403e8032de1dddbe905)
+
+commit b3a280d5af9d06783d2698bd434940de94ab0fda
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 23 11:45:35 2013 -0700
+
+    os: make readdir_r buffers larger
+    
+    PATH_MAX isn't quite big enough.
+    
+    Backport: dumpling, cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 99a2ff7da99f8cf70976f05d4fe7aa28dd7afae5)
+
+commit 989a664ef0d1c716cab967f249112f595cf98c43
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 23 11:45:08 2013 -0700
+
+    os: fix readdir_r buffer size
+    
+    The buffer needs to be big or else we're walk all over the stack.
+    
+    Backport: dumpling, cuttlefish, bobtail
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2df66d9fa214e90eb5141df4d5755b57e8ba9413)
+    
+    Conflicts:
+    
+    	src/os/BtrfsFileStoreBackend.cc
+
+commit a4cca31c82bf0e84272e01eb1b3188dfdb5b5615
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Aug 22 10:53:12 2013 -0700
+
+    rgw: fix crash when creating new zone on init
+    
+    Moving the watch/notify init before the zone init,
+    as we might need to send a notification.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 3d55534268de7124d29bd365ea65da8d2f63e501)
+
+commit 4cf6996803ef66f2b6083f73593259d45e2740a3
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 19 08:40:16 2013 -0700
+
+    rgw: change cache / watch-notify init sequence
+    
+    Fixes: #6046
+    We were initializing the watch-notify (through the cache
+    init) before reading the zone info which was much too
+    early, as we didn't have the control pool name yet. Now
+    simplifying init/cleanup a bit, cache doesn't call watch/notify
+    init and cleanup directly, but rather states its need
+    through a virtual callback.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d26ba3ab0374e77847c742dd00cb3bc9301214c2)
+
+commit aea6de532b0b843c3a8bb76d10bab8476f0d7c09
+Author: Alexandre Oliva <oliva at gnu.org>
+Date:   Thu Aug 22 03:40:22 2013 -0300
+
+    enable mds rejoin with active inodes' old parent xattrs
+    
+    When the parent xattrs of active inodes that the mds attempts to open
+    during rejoin lack pool info (struct_v < 5), this field will be filled
+    in with -1, causing the mds to retry fetching a backtrace with a pool
+    number that matches the expected value, which fails and causes the
+    err==-ENOENT branch to be taken and retry pool 1, which succeeds, but
+    with pool -1, and so keeps on bouncing between the two retry cases
+    forever.
+    
+    This patch arranges for the mds to go along with pool -1 instead of
+    insisting that it be refetched, enabling it to complete recovery
+    instead of eating cpu, network bandwidth and metadata osd's resources
+    like there's no tomorrow, in what AFAICT is an infinite and very busy
+    loop.
+    
+    This is not a new problem: I've had it even before upgrading from
+    Cuttlefish to Dumpling, I'd just never managed to track it down, and
+    force-unmounting the filesystem and then restarting the mds was an
+    easier (if inconvenient) work-around, particularly because it always
+    hit when the filesystem was under active, heavy-ish use (or there
+    wouldn't be much reason for caps recovery ;-)
+    
+    There are two issues not addressed in this patch, however.  One is
+    that nothing seems to proactively update the parent xattr when it is
+    found to be outdated, so it remains out of date forever.  Not even
+    renaming top-level directories causes the xattrs to be recursively
+    rewritten.  AFAICT that's a bug.
+    
+    The other is that inodes that don't have a parent xattr (created by
+    even older versions of ceph) are reported as non-existing in the mds
+    rejoin message, because the absence of the parent xattr is signaled as
+    a missing inode (?failed to reconnect caps for missing inodes?).  I
+    suppose this may cause more serious recovery problems.
+    
+    I suppose a global pass over the filesystem tree updating parent
+    xattrs that are out-of-date would be desirable, if we find any parent
+    xattrs still lacking current information; it might make sense to
+    activate it as a background thread from the backtrace decoding
+    function, when it finds a parent xattr that's too out-of-date, or as a
+    separate client (ceph-fsck?).
+    
+    Backport: dumpling, cuttlefish
+    Signed-off-by: Alexandre Oliva <oliva at gnu.org>
+    Reviewed-by: Zheng, Yan <zheng.z.yan at intel.com>
+    (cherry picked from commit 617dc36d477fd83b2d45034fe6311413aa1866df)
+
+commit 0738bdf92f5e5eb93add152a4135310ac7ea1c91
+Author: David Disseldorp <ddiss at suse.de>
+Date:   Mon Jul 29 17:05:44 2013 +0200
+
+    mds: remove waiting lock before merging with neighbours
+    
+    CephFS currently deadlocks under CTDB's ping_pong POSIX locking test
+    when run concurrently on multiple nodes.
+    The deadlock is caused by failed removal of a waiting_locks entry when
+    the waiting lock is merged with an existing lock, e.g:
+    
+    Initial MDS state (two clients, same file):
+    held_locks -- start: 0, length: 1, client: 4116, pid: 7899, type: 2
+    	      start: 2, length: 1, client: 4110, pid: 40767, type: 2
+    waiting_locks -- start: 1, length: 1, client: 4116, pid: 7899, type: 2
+    
+    Waiting lock entry 4116 at 1:1 fires:
+    handle_client_file_setlock: start: 1, length: 1,
+    			    client: 4116, pid: 7899, type: 2
+    
+    MDS state after lock is obtained:
+    held_locks -- start: 0, length: 2, client: 4116, pid: 7899, type: 2
+    	      start: 2, length: 1, client: 4110, pid: 40767, type: 2
+    waiting_locks -- start: 1, length: 1, client: 4116, pid: 7899, type: 2
+    
+    Note that the waiting 4116 at 1:1 lock entry is merged with the existing
+    4116 at 0:1 held lock to become a 4116 at 0:2 held lock. However, the now
+    handled 4116 at 1:1 waiting_locks entry remains.
+    
+    When handling a lock request, the MDS calls adjust_locks() to merge
+    the new lock with available neighbours. If the new lock is merged,
+    then the waiting_locks entry is not located in the subsequent
+    remove_waiting() call because adjust_locks changed the new lock to
+    include the old locks.
+    This fix ensures that the waiting_locks entry is removed prior to
+    modification during merge.
+    
+    Signed-off-by: David Disseldorp <ddiss at suse.de>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 476e4902907dfadb3709ba820453299ececf990b)
+
+commit a0ac88272511d670b5c3756dda2d02c93c2e9776
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Aug 20 11:10:42 2013 -0700
+
+    mon/PGMap: OSD byte counts 4x too large (conversion to bytes overzealous)
+    
+    Fixes: #6049
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit eca53bbf583027397f0d5e050a76498585ecb059)
+
+commit 87b19c33ce29e2ca4fc49a2adeb12d3f14ca90a9
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Fri Aug 23 08:56:07 2013 -0400
+
+    ceph-disk: specify the filetype when mounting
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f040020fb2a7801ebbed23439159755ff8a3edbd)
diff --git a/doc/changelog/v0.67.4.txt b/doc/changelog/v0.67.4.txt
new file mode 100644
index 0000000..73b997e
--- /dev/null
+++ b/doc/changelog/v0.67.4.txt
@@ -0,0 +1,550 @@
+commit ad85b8bfafea6232d64cb7ba76a8b6e8252fa0c7
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Thu Oct 3 22:41:31 2013 +0000
+
+    v0.67.4
+
+commit 5cd66d3b4bca92b402c95ab256fbc3f0329c446f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Sep 20 14:04:47 2013 -0700
+
+    rgw: fix keystone token expiration test
+    
+    Fixes: #6360
+    The test was inverted, need expiration to be greater than
+    current time in order for token to be valid.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit e0203c61a3f45fdd6d3d3ece26fef6152bdc036d
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed Sep 11 16:55:06 2013 -0700
+
+    osd/OSD.cc: Use MIN() so that we don't exceed osd_recovery_max_active
+    
+    Caused by 944f3b73531af791c90f0f061280160003545c63
+    
+    Fixes: #6291
+    
+    Backport: dumpling
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 139a714e13aa3c7f42091270b55dde8a17b3c4b8)
+    
+    Conflicts:
+    
+    	src/osd/OSD.cc
+
+commit c376708358cedb5561fbb43e9b9e622df3ea7a58
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Sep 25 22:08:24 2013 +0100
+
+    mon: OSDMonitor: do not write full_latest during trim
+    
+    On commit 81983bab we patched OSDMonitor::update_from_paxos() such that we
+    write the latest full map version to 'full_latest' each time the latest
+    full map was built from the incremental versions.
+    
+    This change however clashed with OSDMonitor::encode_trim_extra(), which
+    also wrote to 'full_latest' on each trim, writing instead the version of
+    the *oldest* full map.  This duality of behaviors could lead the store
+    to an inconsistent state across the monitors (although there's no sign of
+    it actually imposing any issues besides rebuilding already existing full
+    maps on some monitors).
+    
+    We now stop OSDMonitor::encode_trim_extra() from writing to 'full_latest'.
+    This function will still write out the oldest full map it has in the store,
+    but it will no longer write to full_latest, instead leaving it up to
+    OSDMonitor::update_from_paxos() to figure it out -- and it already does.
+    
+    Fixes: #6378
+    
+    Backport: dumpling
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bd0f29a2c28cca496ec830eac932477ebf3182ba)
+
+commit de40d0b3e35ab0124cd3c4ebfcaa435ab8abfab9
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 1 15:53:42 2013 -0700
+
+    crush: invalidate rmap on create (and thus decode)
+    
+    If we have an existing CrushWrapper object and decode from a bufferlist,
+    reset build_rmaps so that they get rebuilt.
+    
+    Remove the build_rmaps() all in decode that was useless on a redecode
+    (because have_rmaps == true in that case and it did nothing).
+    
+    Fixes: #6442
+    Backport: dumpling, maybe cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 9b7a2ae329b6a511064dd3d6e549ba61f52cfd21)
+
+commit 32f5233288c47d95b87c0a9cab5f9c2ffcf15417
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Sep 30 14:58:11 2013 -0700
+
+    Invoke python with /usr/bin/env python instead of directly
+    
+    Fixes: #6311
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit b9000b314b9166845ff302d4a827a996775d9a14)
+
+commit 66aeca5a9079be398403bbff67bd5bf68c6fb111
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Sep 25 10:10:21 2013 -0700
+
+    qa/workunits/mon/crush_ops.sh: fix test
+    
+    Fix root.
+    
+    Fixes: #6392
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c8cae87e9e08468cc86145e0fd60c05d12826239)
+
+commit beb366302a125dd422c4f092b12eb541cb3bc788
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Sep 23 09:04:34 2013 -0700
+
+    Revert "ceph: parse CEPH_ARGS environment variable"
+    
+    This reverts commit 67a95b9880c9bc6e858150352318d68d64ed74ad.
+    
+    We now put CEPH_ARGS in the actual args we parse in python, which are passed
+    to rados piecemeal later.  This lets you put things like --id ... in there
+    that need to be parsed before librados is initialized.
+    (cherry picked from commit 97f462be4829f0167ed3d65e6694dfc16f1f3243)
+
+commit b475ff9576f145d31c053213c699e13df76d2bcb
+Author: Benoît Knecht <benoit.knecht at fsfe.org>
+Date:   Mon Sep 23 15:58:42 2013 +0200
+
+    Add CEPH_ARGS at the end of sys.argv
+    
+    This allows, for instance, to pass a different client name to ceph by
+    exporting CEPH_ARGS="--id client_id".
+    
+    Signed-off-by: Benoît Knecht <benoit.knecht at fsfe.org>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 30abe3244c86cbbe1f5b005850c29c9c0eafcad4)
+
+commit 94548b4b67cca37366c7d8719209a6d2e7956811
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Sep 24 15:26:03 2013 -0700
+
+    mon/OSDMonitor: fix 'ceph osd crush reweight ...'
+    
+    The adjust method returns a count of adjusted items.
+    
+    Add a test.
+    
+    Fixes: #6382
+    Backport: dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 3de32562b55c6ece3a6ed783c36f8b9f21460339)
+
+commit 00ff7f5c20e13869d0694379739ba4e61d44b97c
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Sep 10 00:20:41 2013 +0100
+
+    qa: workunits: mon: crush_ops: test 'ceph osd crush move'
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 3bc618b7b46496c5110edde0da9cae5d3e68e0e1)
+
+commit 0ff5b4a96833681e92cc41f019a569134474f4cf
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Sep 24 19:04:23 2013 +0200
+
+    osd: change warn_interval_multiplier to uint32_t
+    
+    to prevent overflow in OpTracker::check_ops_in_flight when
+    multiplying warn_interval_multiplier *= 2
+    
+    Backport: cuttlefish, dumpling
+    
+    http://tracker.ceph.com/issues/6370 fixes #6370
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 1bce1f009bffd3e28025a08775fec189907a81db)
+
+commit fb15040b6cec6221baa550ddfffade823f784c4a
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon Sep 9 13:01:12 2013 -0700
+
+    crushtool: do not dump core with non-unique bucket IDs
+    
+    Return -EEXIST on duplicate ID
+    BUG FIX: crush_add_bucket() mixes error returns and IDs
+      Add optional argument to return generated ID
+    
+    Fixes: #6246
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8c76f3a0f9cf100ea2c941dc2b61c470aa5033d7)
+
+commit 410db3f30c6eb54b807908c1f251ad4026e7d446
+Author: Joao Eduardo Luis <jecluis at gmail.com>
+Date:   Fri Sep 20 17:06:30 2013 +0100
+
+    qa: workunits: cephtool: check if 'heap' commands are parseable
+    
+    Signed-off-by: Joao Eduardo Luis <jecluis at gmail.com>
+    (cherry picked from commit b1eeaddd5f214c1b0883b44fc8cae07c649be7c4)
+
+commit 062060a38bb26ff260cc51accc534413d726de49
+Author: Joao Eduardo Luis <jecluis at gmail.com>
+Date:   Fri Sep 20 17:50:27 2013 +0100
+
+    osd: OSD: add 'heap' command to known osd commands array
+    
+    Must have been forgotten during the cli rework.
+    
+    Backport: dumpling
+    
+    Signed-off-by: Joao Eduardo Luis <jecluis at gmail.com>
+    (cherry picked from commit 296f2d0db31e9f5a59a3a62a1e95b6c440430fa3)
+
+commit 3f32f57b98e0224a1d30b2a81d7d260be0f53800
+Author: Joao Eduardo Luis <jecluis at gmail.com>
+Date:   Fri Sep 20 16:43:27 2013 +0100
+
+    mds: MDS: pass only heap profiler commands instead of the whole cmd vector
+    
+    The heap profiler doesn't care, nor should it, what our command name is.
+    It only cares about the commands it handles.
+    
+    Backport: dumpling
+    
+    Signed-off-by: Joao Eduardo Luis <jecluis at gmail.com>
+    (cherry picked from commit 238fe272c6bdb62d4e57fd8555c0136de99c8129)
+
+commit 46dcc46617d8f35ab8433540b22343ddcbcc3716
+Author: Joao Eduardo Luis <jecluis at gmail.com>
+Date:   Fri Sep 20 16:41:14 2013 +0100
+
+    perfglue/heap_profiler.cc: expect args as first element on cmd vector
+    
+    We used to pass 'heap' as the first element of the cmd vector when
+    handling commands.  We haven't been doing so for a while now, so we
+    needed to fix this.
+    
+    Not expecting 'heap' also makes sense, considering that what we need to
+    know when we reach this function is what command we should handle, and
+    we should not care what the caller calls us when handling his business.
+    
+    Fixes: #6361
+    Backport: dumpling
+    
+    Signed-off-by: Joao Eduardo Luis <jecluis at gmail.com>
+    (cherry picked from commit c98b910d49bd2b46ceafdc430044a31524c29f5b)
+
+commit 9dc5f15fbae22244ad1f62925e17c9d81e856e55
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Sep 16 14:35:25 2013 -0700
+
+    rgw: destroy get_obj handle in copy_obj()
+    
+    Fixes: #6176
+    Backport: dumpling
+    We take different code paths in copy_obj, make sure we close the handle
+    when we exit the function. Move the call to finish_get_obj() out of
+    copy_obj_data() as we don't create the handle there, so that should
+    makes code less confusing and less prone to errors.
+    Also, note that RGWRados::get_obj() also calls finish_get_obj(). For
+    everything to work in concert we need to pass a pointer to the handle
+    and not the handle itself. Therefore we needed to also change the call
+    to copy_obj_data().
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 9e98620e4325d15c88440a890b267131613e1aa1)
+
+commit 471233e98a9f64ad513a4a196b7661b80534cb00
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Mon Sep 9 23:14:11 2013 +0100
+
+    mon: MonCommands: expect a CephString as 1st arg for 'osd crush move'
+    
+    Fixes: #6230
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 7d3799fde19138f957f26ec6be10a8a0000fc1f0)
+
+commit 2908225092bd2aa1b8afcb7848c1cdac5bd9e638
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Sep 23 16:23:33 2013 -0700
+
+    osd: revert 'osd max xattr size' limit
+    
+    Set it to 0 (unlimited) for now.
+    
+    Backport: dumpling
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit abb88d70643c3a76435b7a9d5b04ff29f7502361)
+
+commit b3d3b3747c1eef695138dac828e5fcb435309c7b
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Sep 11 16:24:32 2013 -0700
+
+    mds: be more careful about decoding LogEvents
+    
+    We need to wrap the full decode section or we can abort the process
+    if there's an issue (which we may want to just skip by).
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 73289b34b0be5b6612e38944794d59b5e789f841)
+
+commit 06c58132199ed22413b509dfa751321ccdb24225
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Sep 17 17:58:20 2013 +0100
+
+    mon: OSDMonitor: multiple rebuilt full maps per transaction
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 0d20cae0be701c5b6151a26ee5e4fe24d89aa20a)
+
+commit 65bbcaf4b68790dae4506c1f5db237077e1ff0ae
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Sun Sep 15 21:03:50 2013 +0100
+
+    mon: OSDMonitor: update latest_full while rebuilding full maps
+    
+    Not doing so will make the monitor rebuild the osdmap full versions, even
+    though they may have been rebuilt before, every time the monitor starts.
+    
+    This mostly happens when the cluster is left in an unhealthy state for
+    a long period of time and incremental versions build up.  Even though we
+    build the full maps on update_from_paxos(), not updating 'full_latest'
+    leads to the situation initially described.
+    
+    Fixes: #6322
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 81983bab3630520d6c7ee9b7e4a747bc17b8c5c3)
+
+commit 9b9edb04581cca15e67c567332529f5b3f426743
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Sun Sep 15 21:00:55 2013 +0100
+
+    mon: OSDMonitor: smaller transactions when rebuilding full versions
+    
+    Otherwise, for considerably sized rebuilds, the monitor will not only
+    consume vast amounts of memory, but it will also have troubles committing
+    the transaction.  Anyway, it's also a good idea to adjust transactions to
+    the granularity we want, and to be fair we care that each rebuilt full map
+    gets to disk, even if subsequent full maps don't (those can be rebuilt
+    later).
+    
+    Fixes: #6323
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 4ac1570c5cdcd6556dc291cc6d7878fd92d343ae)
+
+commit 298811f7a15541b9ec1015c416ad2aa075be5691
+Author: Joao Eduardo Luis <jecluis at gmail.com>
+Date:   Wed Aug 28 15:51:01 2013 +0100
+
+    mon: OSDMonitor: check if pool is on unmanaged snaps mode on mk/rmsnap
+    
+    Backport: dumpling
+    Fixes: #6047
+    
+    Signed-off-by: Joao Eduardo Luis <jecluis at gmail.com>
+    (cherry picked from commit fab79543c54c2e446d3f76520d7906645c6b0075)
+
+commit a992664435db9dde3745eb7f354cce3fc5400a47
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Sep 12 14:32:17 2013 -0700
+
+    lru_map: don't use list::size()
+    
+    replace list::size() with map::size(), which should have
+    a constant time complexity.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 7c1d2ded8fa8061bf3f14932800998b963745dd1)
+
+commit 788546ea71c994ff35323747294ed9c177fe7020
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Sep 12 14:30:19 2013 -0700
+
+    common/lru_map: rename tokens to entries
+    
+    This code was originally used in a token cache, now
+    as a generic infrastructure rename token fields.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 532e41a9985a16b35a6e49cdcba38af0ad166fa8)
+
+commit babeb00c42af760b3e7575166479e95365cfcc0a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 18 10:37:21 2013 -0700
+
+    rgw: use bufferlist::append() instead of bufferlist::push_back()
+    
+    push_back() expects char *, whereas append can append a single char.
+    Appending a NULL char to push_back is cast as a NULL pointer which is
+    bad.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 08fe028bad13096d482454a2f303158727c363ff)
+
+commit daf85c45dd4d158bc7c33a2fb784857bc7db35cd
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 11 13:46:31 2013 -0700
+
+    rgw: NULL terminate buffer before parsing it
+    
+    Fixes: #6175
+    Backport: dumpling
+    We get a buffer off the remote gateway which might
+    not be NULL terminated. The JSON parser needs the
+    buffer to be NULL terminated even though we provide
+    a buffer length as it calls strlen().
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit e7f7483192cddca1159aba439ce62b1e78669d51)
+
+commit c73040a5518971813b9ebaae1624c5bacef315d0
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 11 22:30:12 2013 -0700
+
+    rgw: don't call list::size() in ObjectCache
+    
+    Fixes: #6286
+    Use an external counter instead of calling list::size()
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 31e3a51e933429d286104fe077e98ea883437ad6)
+
+commit a855aba9d18936e9a060119e041518790cd4b831
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Sep 10 12:18:55 2013 -0700
+
+    rgw: drain pending requests before completing write
+    
+    Fixes: #6268
+    When doing aio write of objects (either regular or multipart parts) we
+    need to drain pending aio requests. Otherwise if gateway goes down then
+    object might end up corrupted.
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 626669afaa333d73707553a85f5c874e99e9cbd8)
+
+commit 670db7e80ddc9c26c43a4f66907a5996ce207c4d
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Sep 6 22:33:38 2013 -0700
+
+    rgw: fix get cors, delete cors
+    
+    Remove a couple of variables that overrode class member. Not
+    really clear how it was working before, might have been a bad
+    merge / rebase.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 13872785aeeddbe1b8dd97e49fd6a2d879514f8d)
+
+commit a304016fa01b02efd500135c00b9bf3407a9999c
+Merge: 408cd61 ac0a30f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Sep 11 09:47:10 2013 -0700
+
+    Merge branch 'wip-6078-dumpling' into dumpling
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit ac0a30feb8c64a3b80d9c519a7b561213403afab
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 28 21:25:20 2013 -0700
+
+    rgw: fix certain return status cases in CORS
+    
+    Change return values in certain cases, reorder
+    checks, etc.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 13b28cc3f1eb8ef42875b630c485ee0105cd244a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 28 21:24:36 2013 -0700
+
+    rgw: add COPY method to be handled by CORS
+    
+    Was missing this http method.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit d45c87ea738807487e72c0719b0d3d459cbe19e9
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Aug 27 19:38:45 2013 -0700
+
+    rgw: fix CORS rule check
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 986fa92a7a1d88111ba28457160adfcfdaabc5d2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Aug 27 19:38:18 2013 -0700
+
+    rgw: don't handle CORS if rule not found (is NULL)
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 71873aba6553492d3ad71596cefd7c841030a277
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Aug 22 13:38:55 2013 -0700
+
+    rgw: tie CORS header response to all relevant operations
+    
+    Have the CORS responses on all relevant operations. Also add headers
+    on failure cases.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 94e7b594d85dbd26e58d823b41f418032e9f163f
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Aug 22 10:00:53 2013 -0700
+
+    rgw: add a generic CORS response handling
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit c3385d8a102faf5379559bb98cf89637ceda1579
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 21 17:22:46 2013 -0700
+
+    rgw: OPTIONS request doesn't need to read object info
+    
+    This is a bucket-only operation, so we shouldn't look at the
+    object. Object may not exist and we might respond with Not
+    Exists response which is not what we want.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit a5fdd44e5d8ce4b8d82273d83e27aea19e63aa7c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Aug 21 14:43:28 2013 -0700
+
+    rgw: remove use of s->bucket_cors
+    
+    Some old code still tried to use s->bucket_cors, which was
+    abandoned in a cleanup work.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
diff --git a/doc/changelog/v0.67.5.txt b/doc/changelog/v0.67.5.txt
new file mode 100644
index 0000000..2767fb8
--- /dev/null
+++ b/doc/changelog/v0.67.5.txt
@@ -0,0 +1,711 @@
+commit a60ac9194718083a4b6a225fc17cad6096c69bd1
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Thu Dec 19 20:53:10 2013 +0000
+
+    v0.67.5
+
+commit 8745ba63533ba77b2ec9d40780cad822a577089c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Dec 18 13:11:01 2013 -0800
+
+    rgw: fix use-after-free when releasing completion handle
+    
+    Backport: emperor, dumpling
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c8890ab2d46fe8e12200a0d2f9eab31c461fb871)
+
+commit 7587ee52161d74a41bf89dc741e8ece9c964fb67
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Dec 18 13:10:21 2013 -0800
+
+    rgw: don't return data within the librados cb
+    
+    Fixes: #7030
+    The callback is running within a single Finisher thread, thus we
+    shouldn't block there. Append read data to a list and flush it within
+    the iterate context.
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit d6a4f6adfaa75c3140d07d6df7be03586cc16183)
+
+commit 9bd1ebe960aae69f6528a33809a58c13481f8df3
+Author: Christophe Courtaut <christophe.courtaut at gmail.com>
+Date:   Mon Jul 22 15:15:38 2013 +0200
+
+    rgw: Allow wildcard in supported keystone roles.
+    
+    http://tracker.ceph.com/issues/4365 fixes #4365
+    
+    Signed-off-by: Christophe Courtaut <christophe.courtaut at gmail.com>
+    (cherry picked from commit 60195581273aee259e8c83d0b471af859d928342)
+
+commit e52b9b76844f935daf2dc060905f869248bba60b
+Author: Roald J. van Loon <roaldvanloon at gmail.com>
+Date:   Fri Aug 9 13:31:10 2013 +0200
+
+    Validate S3 tokens against Keystone
+    
+    - Added config option to allow S3 to use Keystone auth
+    - Implemented JSONDecoder for KeystoneToken
+    - RGW_Auth_S3::authorize now uses rgw_store_user_info on keystone auth
+    - Minor fix in get_canon_resource; dout is now after the assignment
+    
+    Reviewed-by: Yehuda Sadeh<yehuda at inktank.com>
+    Signed-off-by: Roald J. van Loon <roaldvanloon at gmail.com>
+    (cherry picked from commit a200e184b15a03a4ca382e94caf01efb41cb9db7)
+    
+    Conflicts:
+    	src/rgw/rgw_swift.h
+
+commit 5df2f35ee5797ffe85e8398b1ecf75f2eefb5031
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Oct 21 18:02:32 2013 -0700
+
+    rgw: init src_bucket_name, src_object in the S3 handler
+    
+    Be consistent and initialize these fields also in the S3 case.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit ccaab2abf9e49ce3e50c15df793a3a3ca6b29bb8)
+
+commit 0edee8e9c9b140a280dc782b491c330c7f86edfc
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Oct 21 14:45:59 2013 -0700
+
+    rgw: get rid of req_state.bucket_name
+    
+    No need for this field, as we already have req_state.bucket_name_str.
+    This saves us some memory allocation / freeing through every request
+    processing.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit db7eb771226beaa2372ef5860ce742cb3457cd89)
+    
+    Conflicts:
+    	src/rgw/rgw_rest_s3.cc
+
+commit 0eae05f31e4a03e923d51521ecd0078657eda9ba
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Oct 21 14:17:12 2013 -0700
+
+    rgw: turn swift COPY into PUT
+    
+    Fixes: #6606
+    The swift COPY operation is unique in a sense that it's a write
+    operation that has its destination not set by the URI target, but by a
+    different HTTP header. This is problematic as there are some hidden
+    assumptions in the code that the specified bucket/object in the URI is
+    the operation target. E.g., certain initialization functions, quota,
+    etc. Instead of creating a specialized code everywhere for this case
+    just turn it into a regular copy operation, that is, a PUT with
+    a specified copy source.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit cbf8f9a51737e7d89fb0ec0832b50fd47c35b08d)
+
+commit 455f28a78ee22b6a535831ff70a330fa1379567c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 13 20:32:14 2013 -0700
+
+    OSDMonitor: add 'osd perf' command to dump recent osd perf information
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 94c3f29a32cbf169d896015da6765febd3c724e0)
+
+commit ec086df1beccda6d5a6c12c727c84c2555b0b2cd
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 13 17:36:57 2013 -0700
+
+    ObjectStore: add ObjectStore::get_cur_stats and impl in FileStore
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit ebde89d5602536b4bc651737e4280fdfb6634c32)
+
+commit 5bf7e7be1fa39ec39726635581e98a0e3a1df20f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 13 17:21:39 2013 -0700
+
+    osd_types: add osd_perf_stat_t type
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 95f3353a6ab3a4dd2bf28eaca7122487942e913e)
+
+commit b37c5d208778ee52292757e96265d59d75f19654
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Dec 3 11:22:56 2013 -0800
+
+    rgw: do not use UNPRIVILEGED_DAEMON option
+    
+    This is sort of a backport for 4f403c26dc0048ad63e20d20369fa86bfb31c50e
+    in that we get the same behavior change, but only for rgw.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit a447fb7d04fbad84f9ecb57726396bb6ca29d8f6
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Dec 3 21:51:26 2013 -0800
+
+    osd/OSDMonitor: accept 'osd pool set ...' value as string
+    
+    Newer monitors take this as a CephString.  Accept that so that if we are
+    mid-upgrade and get a forwarded message using the alternate schema from
+    a future mon we will handle it properly.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 9875c8b1992c59cc0c40901a44573676cdff2669
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Nov 25 13:43:43 2013 -0800
+
+    init, upstart: prevent daemons being started by both
+    
+    There can be only one init system starting a daemon. If there is a
+    host entry in ceph.conf for a daemon, sysvinit would try to start it
+    even if the daemon's directory did not include a sysvinit file. This
+    preserves backwards compatibility with older installs using sysvinit,
+    but if an upstart file is present in the daemon's directory, upstart
+    will try to start them, regardless of host entries in ceph.conf.
+    
+    If there's an upstart file in a daemon's directory and a host entry
+    for that daemon in ceph.conf, both sysvinit and upstart would attempt
+    to manage it.
+    
+    Fix this by only starting daemons if the marker file for the other
+    init system is not present. This maintains backwards compatibility
+    with older installs using neither sysvinit or upstart marker files,
+    and does not break any valid configurations. The only configuration
+    that would break is one with both sysvinit and upstart files present
+    for the same daemon.
+    
+    Backport: emperor, dumpling
+    Reported-by: Tim Spriggs <tims at uahirise.org>
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 5e34beb61b3f5a1ed4afd8ee2fe976de40f95ace)
+
+commit bd08d332f5d23b6097a7e8344a6183896b2303a9
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Nov 3 21:02:36 2013 -0800
+
+    OSD: allow project_pg_history to handle a missing map
+    
+    If we get a peering message for an old map we don't have, we
+    can throwit out: the sending OSD will learn about the newer
+    maps and update itself accordingly, and we don't have the
+    information to know if the message is valid. This situation
+    can only happen if the sender was down for a long enough time
+    to create a map gap and its PGs have not yet advanced from
+    their boot-up maps to the current ones, so we can rely on it
+    
+    Fixes: #6712
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit cd0d612e1abdf5c87082eeeccd4ca09dd14fd737)
+
+commit 8cd33e3a8ebf7c2aa796ec9f92d6b554c39ff705
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 19 16:56:27 2013 -0700
+
+    rgw: bucket meta remove don't overwrite entry point first
+    
+    Fixes: #6056
+    
+    When removing a bucket metadata entry we first unlink the bucket
+    and then we remove the bucket entrypoint object. Originally
+    when unlinking the bucket we first overwrote the bucket entrypoint
+    entry marking it as 'unlinked'. However, this is not really needed
+    as we're just about to remove it. The original version triggered
+    a bug, as we needed to propagate the new header version first (which
+    we didn't do, so the subsequent bucket removal failed).
+    
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 0373d749cea7d9b532069ba8ebca2f005b2c9f59)
+
+commit a24f1326adcdda1d387e0f4e3c18dda5ec4aa055
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Nov 22 07:04:01 2013 -0800
+
+    rgw: lower some debug message
+    
+    Fixes: #6084
+    Backport: dumpling, emperor
+    
+    Reported-by: Ron Allred <rallred at itrefined.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b35fc1bc2ec8c8376ec173eb1c3e538e02c1694e)
+
+commit 9e2d0d311437c1ffdd43fc8c961c60aacfea339c
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Nov 18 14:39:12 2013 -0800
+
+    osd: fix bench block size
+    
+    The command was declared to take 'size' in dumpling, but was trying to
+    read 'bsize' instead, so it always used the default of 4MiB. Change
+    the bench command to read 'size', so it matches what existing clients
+    are sending.
+    
+    Fixes: #6795
+    Backport: emperor, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 40a76ef0d09f8ecbea13712410d9d34f25b91935)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit 35c91cac9a2b414ba3d52ea06cf6f71a0a1d4ba3
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed Sep 25 09:19:16 2013 -0700
+
+    os, osd, tools: Add backportable compatibility checking for sharded objects
+    
+    OSD
+      New CEPH_OSD_FEATURE_INCOMPAT_SHARDS
+    FileStore
+      NEW CEPH_FS_FEATURE_INCOMPAT_SHARDS
+      Add FSSuperblock with feature CompatSet in it
+      Store sharded_objects state using CompatSet
+      Add set_allow_sharded_objects() and get_allow_sharded_objects() to FileStore/ObjectStore
+      Add read_superblock()/write_superblock() internal filestore functions
+    ceph_filestore_dump
+      Add OSDsuperblock to export format
+      Use CompatSet from OSD code itself in filestore-dump tool
+      Always check compatibility of OSD features with on-disk features
+      On import verify compatibility of on-disk features with export data
+      Bump super_ver due to export format change
+    
+    Backport: dumpling, cuttlefish
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit c6b83180f9f769de27ca7890f5f8ec507ee743ca)
+    
+    Conflicts:
+    
+    	src/os/FileStore.cc
+    	src/os/FileStore.h
+    	src/osd/OSD.cc
+    
+    Excluded from cherry-pick:
+      Didn't add set_allow_sharded_objects() and get_allow_sharded_objects() to FileStore/ObjectStore
+      Didn't add code to check for incomplete transition to sharded objects in ceph-filestore-dump
+
+commit 372f62717c56d9ab883ae2942e13d6d8d37c2925
+Author: Ray Lv <xiangyulv at gmail.com>
+Date:   Tue Oct 29 19:34:51 2013 +0800
+
+    rgw: Wrap hex_to_num table into class HexTable
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Signed-off-by: Ray Lv <xiangyulv at gmail.com>
+    (cherry picked from commit 588ed60a8ec1d8db5e096fd8f7b762f2afcf7dd3)
+
+commit 6917b02530103b8c86ed75592da33144b0dea168
+Merge: 7ef210a f1fa811
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Nov 5 12:27:42 2013 -0800
+
+    Merge pull request #805 from ceph/wip-rgw-replica-log-dumpling
+    
+    backport a bunch of rgw stuff to dumpling
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit f1fa8116d441924d44c99624829f3daa090c821c
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Nov 1 16:12:52 2013 -0700
+
+    rgw: don't turn 404 into 400 for the replicalog api
+    
+    404 is not actually a problem to clients like radosgw-agent, but 400
+    implies something about the request was incorrect.
+    
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 306ec7142d699c26ce874b11dc02ccdb3cf296c7)
+
+commit 739e7861f6d5fde5c4a2b59170377b6147fecfa3
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Sep 3 13:27:21 2013 -0700
+
+    rgw: when failing read from client, return correct error
+    
+    Fixes: #6214
+    When getting a failed read from client when putting an object
+    we returned the wrong value (always 0), which in the chunked-
+    upload case ended up in assuming that the write was done
+    successfully.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0499948aad64c6c66668b43963403fb0cb1a2737)
+
+commit 465087e64ab2bd85d7f5e183565e3619b3aa76fc
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Sep 30 14:15:19 2013 -0700
+
+    rgw: fix leak in RGWMetadataManager::remove()
+    
+    Backport: dumpling
+    Fixes: #6445
+    handler->get() returns a newly allocated obj, need to delete it when
+    done.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 8dd7ea3fadc06b5ebb330af41d686d3da155fb5d)
+
+commit a4dc2694db6a7e45109f111dcdfd077da67b6030
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Aug 26 11:16:08 2013 -0700
+
+    rgw: quiet down warning message
+    
+    Fixes: #6123
+    We don't want to know about failing to read region map info
+    if it's not found, only if failed on some other error. In
+    any case it's just a warning.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 055e31359ac977943f014270cc56a1b7786abee3)
+
+commit 7f57d9dda74a1feb2da85be3c77d61c6f81ec1b2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Sep 13 14:43:54 2013 -0700
+
+    rgw: try to create log pool if doesn't exist
+    
+    When using replica log, if the log pool doesn't exist all operations are
+    going to fail. Try to create it if doesn't exist.
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 4216eac0f59af60f60d4ce909b9ace87a7b64ccc)
+
+commit 4fb233cf702957e782083d760877afa48d4f6965
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Oct 11 16:56:46 2013 -0700
+
+    formatter: dump_bool dumps unquoted strings
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit ad409f8a6d230e9b1199226a333bb54159c2c910)
+
+commit de7ede925acc47a5aee84b9fe82b9cf0368aa1b2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Sep 27 13:15:35 2013 -0700
+
+    Formatter: add dump_bool()
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 28949d5d43beba7cef37cb2f83e3399d978061a6)
+
+commit c5991f26febd86878aeb78baab33c071660fdee6
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 24 08:42:48 2013 -0700
+
+    rgw: escape bucket and object names in StreamReadRequests
+    
+    This fixes copy operations for objects that contain unsafe characters,
+    like a newline, which would return a 403 otherwise, since the GET to
+    the source rgw would be unable to verify the signature on a partially
+    valid bucket name.
+    
+    Fixes: #6604
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit ec45b3b88c485140781b23d2c4f582f2cc26ea43)
+
+commit 672679d26110dd93393bc18a681ae41175e4a299
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 24 08:37:25 2013 -0700
+
+    rgw: move url escaping to a common place
+    
+    This is useful outside of the s3 interface. Rename url_escape()
+    url_encode() for consistency with the exsting common url_decode()
+    function. This is in preparation for the next commit, which needs
+    to escape url-unsafe characters in another place.
+    
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit dd308cd481b368f90a64220847b91fc233d92a59)
+
+commit 91997fca6ec6c06beecd63c3e2ae521319fca7c2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 24 08:34:24 2013 -0700
+
+    rgw: update metadata log list to match data log list
+    
+    Send the last marker whether the log is truncated in the same format
+    as data log list, so clients don't have more needless complexity
+    handling the difference.  Keep bucket index logs the same, since they
+    contain the marker already, and are not used in exactly the same way
+    metadata and data logs are.
+    
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e0e8fb1b2b4a308b2a9317e10c6fd53ad48dbfaf)
+
+commit 8916648521e2362a54eed0f5ebe078a269e4d703
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 24 08:26:19 2013 -0700
+
+    rgw: include marker and truncated flag in data log list api
+    
+    Consumers of this api need to know their position in the log. It's
+    readily available when fetching the log, so return it.  Without the
+    marker in this call, a client could not easily or efficiently figure
+    out its position in the log, since it would require getting the global
+    last marker in the log, and then reading all the log entries.
+    
+    This would be slow for large logs, and would be subject to races that
+    would cause potentially very expensive duplicate work.
+    
+    Returning this atomically while fetching the log entries simplifies
+    all of this.
+    
+    Fixes: #6615
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit c275912509255f8bb4c854e181318b45ab0f8564)
+
+commit a49c064b7a1b4083818b6f950d7e0aade71c6afe
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 24 08:18:19 2013 -0700
+
+    cls_log: always return final marker from log_list
+    
+    There's no reason to restrict returning the marker to the case where
+    less than the whole log is returned, since there's already a truncated
+    flag to tell the client what happened.
+    
+    Giving the client the last marker makes it easy to consume when the
+    log entries do not contain their own marker. If the last marker is not
+    returned, the client cannot get the last marker without racing with
+    updates to the log.
+    
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e74776f4176470122485a79a4c07e9c12c9fc036)
+
+commit 90101aea6818c2f43bf31243d912ec9143f68882
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 10 15:50:39 2013 -0700
+
+    rgw: skip read_policy checks for system_users
+    
+    A system user should still be able to examine suspended buckets, and
+    get -ENOENT instead of -EACCESS for a deleted object.
+    
+    Fixes: #6616
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit ea816c1c2fd47eab647d6fab96c9ca4bfeecd5bb)
+
+commit 7ef210adbd4645bd45e5387c9b03a122a7ca82df
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 29 08:39:27 2013 -0700
+
+    common/crc32c: fix #ifdef to be x86_64 specific
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 29f4eebf63bcba9ea86b9a2e4d093b782b5fbf1e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Sep 24 08:05:38 2013 +0200
+
+    rgw: fix rgw test to reflect usage change
+    
+    otherwise src/test/cli/radosgw-admin/help.t fails when running make
+    check when run after a configure --with-radosgw
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit e50343e4423e20130035c860ba47a0edea876f7c)
+
+commit 0106569a88a92aa94fbc5efc6a0a142ad0de325d
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Oct 24 17:25:16 2013 -0700
+
+    rbd.py: increase parent name size limit
+    
+    64 characters isn't all that long. 4096 ought to be enough for anyone.
+    
+    Fixes: #6072
+    Backport: dumpling, cuttlefish
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 3c0042cde5a12de0f554a16b227ab437c6254ddd)
+
+commit 352d8c966c323a008362130eb979ae5dfa47494f
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Sep 23 14:10:36 2013 -0700
+
+    common/config: include --cluster in default usage message
+    
+    Clean it up a bit too.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 157754b3a0191c5ff534a84adbeed88025615898)
+
+commit 299ddd31b29e332dc5e76bc4f871e4769698665d
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Thu Oct 10 10:35:48 2013 +0800
+
+    mds: fix infinite loop of MDCache::populate_mydir().
+    
+    make MDCache::populate_mydir() only fetch bare-bone stray dirs.
+    After all stray dirs are populated, call MDCache::scan_stray_dir(),
+    it fetches incomplete stray dirs.
+    
+    Fixes: #4405
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 007f06ec174d4ee5cfb578c8b3f1c96b2bb0c238)
+    
+    Conflicts:
+    
+    	src/mds/MDCache.h
+    
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 7d99940467019bda74da83f3f1ebc2da46bd6967
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Oct 15 10:20:48 2013 -0700
+
+    rgw: fix authenticated users acl group check
+    
+    Fixes: #6553
+    Backport: bobtail, cuttlefish, dumpling
+    Authenticated users group acl bit was not working correctly. Check to
+    test whether user is anonymous was wrong.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit bebbd6cb7b71697b34b8f27652cabdc40c97a33b)
+
+commit e5736de834027a281d29afcf6743347a8db97d26
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Oct 15 10:55:07 2013 -0700
+
+    rgw: change default log level
+    
+    Fixes: #6554
+    Backport: cuttlefish, dumpling
+    Default log level was just too high, bring it down a bit.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 8d7dbf85472cfca9268d81ecf057ea078cf345b3)
+
+commit e6e9ee7145bcfc1774af738af607a653fe8dfe46
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Oct 4 13:00:26 2013 -0700
+
+    rgw: swift update obj metadata also add generic attrs
+    
+    Fixes: #6462
+    We were missing the generic attributes when we updated the object
+    metadata (operation that only exists in the swift api).
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit f2645e1c6d7383a0ace3b239f4304e353249c4bb)
+
+commit cd1c3c9e00e90b19e83c1f11a48e516a7de93665
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Wed Oct 2 11:43:12 2013 +0800
+
+    mds: return -EAGAIN if standby replay falls behind
+    
+    standby replay may fall behind and get -ENOENT when reading the
+    journal. return -EAGAIN in this case, it makes the MDS respawn itself.
+    
+    fixes: #5458
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d2cb2bf6bac83ac6db9df6cb876317d30e7493cc)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit bd073eeac28d8cba969e5746c5e6adcb95820fdf
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Thu Sep 12 09:50:51 2013 +0800
+
+    mon/MDSMonitor: don't reset incarnation when creating newfs
+    
+    Fixes: #6279
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit 40613b700b87b495d67793101ae05d6ba58b2a9a)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 3a3724b782c53c92c45624ad02df9f0de77f1545
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Thu Sep 12 10:36:39 2013 +0800
+
+    osdc/ObjectCacher: finish contexts after dropping object reference
+    
+    The context to finish can be class C_Client_PutInode, which may drop
+    inode's last reference. So we should first drop object's reference,
+    then finish contexts.
+    
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit b66ac77fa7aa3ff37804918c4308a348f239af09)
+
+commit 102f63993cacf3b3404256e62a3096c5836f2282
+Author: Sandon Van Ness <sandon at inktank.com>
+Date:   Tue Oct 8 12:08:08 2013 -0700
+
+    Go back to $PWD in fsstress.sh if compiling from source.
+    
+    Although fsstress was being called with a static path the directory
+    it was writing to was in the current directory so doing a cd to the
+    source directory that is made in /tmp and then removing it later
+    caused it to be unable to write the files in a non-existent dir.
+    
+    This change gets the current path first and cd's back into it after
+    it is done compiling fsstress.
+    
+    Issue #6479.
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    Reviewed-by: Alfredo Deza <alfredo.deza at inktank.com>
+
+commit 62db186a19f902b0a23d14034552c83db8de7ece
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Tue Aug 27 09:53:12 2013 -0700
+
+    ceph.spec.in:  radosgw package doesn't require mod_fcgi
+    
+    Fixes #5702
+    
+    Signed-off-by: Gary Lowell  <gary.lowell at inktank.com>
+
+commit 42fc9b49a7bbc242096946b381aafd435ebdd530
+Merge: ad85b8b 67ac3cf
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri Oct 4 19:51:32 2013 +0000
+
+    Merge branch 'dumpling' of jenkins:ceph/ceph into dumpling
+
+commit 67ac3cffa1066030ad840937958bd534e8b26272
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Oct 3 21:47:26 2013 -0700
+
+    ceph_test_rados: do not let rollback race with snap delete
+    
+    Note that the OSD behaves in a weird way when you rollback to a non-
+    existent snap, so the test probably isn't the only party at fault here.
+    
+    Fixes (test half of): #6254
+    Backport: dumpling, cuttlefish
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 55d279b98553ba4542219b126fc7159b20b18b1f)
+    
+    Conflicts:
+    
+    	src/test/osd/RadosModel.h
+    	src/test/osd/TestRados.cc
diff --git a/doc/changelog/v0.67.6.txt b/doc/changelog/v0.67.6.txt
new file mode 100644
index 0000000..510893a
--- /dev/null
+++ b/doc/changelog/v0.67.6.txt
@@ -0,0 +1,1258 @@
+commit c71f8a60cf49fb3d4efb5ea75b2366cd7f167497 (tag: refs/tags/v0.67.6)
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Thu Feb 13 20:20:42 2014 +0000
+
+    release build 67.6
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+
+commit 1c42a6e34bb8e318e001384270cda003add946a7
+Merge: 3e473d4 c5e12f9
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Feb 13 06:55:37 2014 -0800
+
+    Merge pull request #1232 from ceph/dumpling-7334
+    
+    backport ceph-disk improvements to dumpling
+    
+    http://pulpito.ceph.com/ubuntu-2014-02-12_16:52:33-ceph-deploy-dumpling-7334-testing-basic-plana/
+
+commit 3e473d4237697872498094b41fed19b414f8d3c4
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Fri Sep 27 16:23:09 2013 -0700
+
+    common,os: Remove filestore_xattr_use_omap option
+    
+    Now we operate just like when this was set to true
+    
+    Fixes: #6143
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit dc0dfb9e01d593afdd430ca776cf4da2c2240a20)
+
+commit c5e12f94efc07f0ff174c0f19494ee2e06d88dfa
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Wed Feb 12 16:43:59 2014 -0500
+
+    add support for absence of PATH
+    
+    Note that this commit is actually bisecting the changes from
+    Loic Dachary that touch ceph-disk only (ad515bf). As that changeset
+    also touches other files it causes conflicts that are not resolvable
+    for backporting it to dumpling.
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+
+commit c531d75f7e86cee619e44c247298b50c37b81539
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Sep 9 22:27:23 2013 -0700
+
+    ceph-disk: make initial journal files 0 bytes
+    
+    The ceph-osd will resize journal files up and properly fallocate() them
+    so that the blocks are preallocated and (hopefully) contiguous.  We
+    don't need to do it here too, and getting fallocate() to work from
+    python is a pain in the butt.
+    
+    Fixes: #5981
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a786ad773cd33880075f1deb3691528d1afd03ec)
+
+commit 836ead3e42491597c192c63d3171021c5daecbc0
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Mon Feb 10 15:07:55 2014 -0500
+
+    alert the user about error messages from partx
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit 9bcc42a3e6b08521694b5c0228b2c6ed7b3d312e)
+
+commit cff3547c60dc6d164f9a95eaa2706633e32756d0
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Fri Feb 7 11:55:01 2014 -0500
+
+    use partx for red hat or centos instead of partprobe
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit 42900ff9da9f5adcac239a84ebf4d2e407c29699)
+
+commit 5ebd7c4520a9805f985cab1a0ba9311e19efa041
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Jan 28 17:26:58 2014 -0800
+
+    ceph-disk: run the right executables from udev
+    
+    When run by the udev rules, PATH is not defined. Thus,
+    ceph-disk-activate relies on its which() function to locate the
+    correct executable.  The which() function used os.defpath if none was
+    set, and this worked for anything using it.
+    
+    ad6b4b4b08b6ef7ae8086f2be3a9ef521adaa88c added a new default value to
+    PATH, so only /usr/bin was checked by callers that did not use
+    which(). This resulted in the mount command not being found when
+    ceph-disk-activate was run by udev, and thus osds failing to start
+    after being prepared by ceph-deploy.
+    
+    Make ceph-disk consistently use the existing helpers (command() and
+    command_check_call()) that use which(), so lack of PATH does not
+    matter. Simplify _check_output() to use command(),
+    another wrapper around subprocess.Popen.
+    
+    Fixes: #7258
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit d7b0c7faafd37e4ae8a1680edfa60c22b419cbd8)
+
+commit 4a7c4e0a81753dfb811396e7bfa1df72135ee12b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 3 16:06:55 2014 +0100
+
+    ceph-disk: implement --sysconfdir as /etc/ceph
+    
+    Replace hardcoded /etc/ceph with the SYSCONFDIR global variable and
+    implement the --sysconfdir option to override the default value.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit a71025d33621257b6fd6632516cfed2849ff1637)
+
+commit c8b9798a69bd1655a7131c7bce8a14c2c74aba0c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 3 16:03:09 2014 +0100
+
+    ceph-disk: implement --statedir as /var/lib/ceph
+    
+    Replace hardcoded /var/lib/ceph with the STATEDIR global variable and
+    implement the --statedir option to override the default value.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit ca713f48ae7a1fece2869f1a1c97d23ab33fb441)
+
+commit 79564874be35d4414092fbb80df3214d7f282b1c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jan 1 22:05:03 2014 +0100
+
+    ceph-disk: add copyright notice
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 51ee3c04777aaf6b9609dde9bc318b5c66c70787)
+
+commit c4b66bbdf09a8bb85ed14fbb643f40f87345463b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jan 1 22:11:30 2014 +0100
+
+    ceph-disk: create the data directory if it does not exist
+    
+    Instead of failing if the OSD data directory does not exist, create
+    it. Only do so if the data directory is not enforced to be a device via
+    the use of the --data-dev flag. The directory is not recursively created.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 306b099ab093bfac466d68fe1cb87367bc01e577)
+
+commit c473c65d4b6235fe20a97bd1d4741c12f86858e8
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Dec 31 00:03:42 2013 +0100
+
+    ceph-disk: run ceph-osd when --mark-init=none
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 0fcc081858fae4febbb6a613a93cfbbcedd5a320)
+
+commit 6ea59a3a0c38c9629036442aff652489eecce51a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 23:57:39 2013 +0100
+
+    ceph-disk: implement --mark-init=none
+    
+    It is meant to be used when preparing and activating a directory that is
+    not to be used with init. No file is created to identify the init
+    system, no symbolic link is made to the directory in /var/lib/ceph
+    and the init scripts are not called.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit e773b68f4c89ac56b425c710d7dcdc3d74a92926)
+
+commit 3aae5b764c5698c665a708a3f6f2243dfee1a28d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jan 1 22:07:57 2014 +0100
+
+    ceph-disk: fsid is a known configuration option
+    
+    Use get_conf_with_default instead of get_conf because fsid is a known
+    ceph configuration option. It allows overriding via CEPH_ARGS which is
+    convenient for testing. Only options that are not found in config_opts.h
+    are fetch via get_conf.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit b65eb377f5e93ea85644e4c0939365fd7ac36072)
+
+commit a33ad6d150206232806ee466f301e41f15c631e9
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jan 1 22:06:29 2014 +0100
+
+    ceph-disk: use CalledProcessError.returncode
+    
+    CalledProcessError has no errno data member
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 97f516a1ddfb2d014e1f7e762c4155e4b9bcb90b)
+
+commit 6ae96d3ce757b05daeb7c1437778149b07248d47
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jan 1 22:13:15 2014 +0100
+
+    ceph-disk: display the command output on OSD creation failure
+    
+    The string form of a CalledProcessError instance does not include the
+    output datamember. Add it to the Error exception for debug purposes.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit d09af0fa50f322c9e59765f3badd497f5ca184d4)
+
+commit deefb3a05788b308631812c652e9eccaeb999d7f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 23:07:27 2013 +0100
+
+    ceph-disk: which() uses PATH first
+    
+    Instead of relying on a hardcoded set of if paths. Although this has the
+    potential of changing the location of the binary being used by ceph-disk
+    on an existing installation, it is currently only used for sgdisk. It
+    could be disruptive for someone using a modified version of sgdisk but
+    the odds of this happening are very low.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 2b935bbf60bafb6dd488c0eb30f156fce1b9d197)
+
+commit 06bbea187293ac52aefbcf4e98c162bb3286341d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 22:48:46 2013 +0100
+
+    ceph-disk: add --prepend-to-path to control execution
+    
+    /usr/bin is hardcoded in front of some ceph programs which makes it
+    impossible to control where they are located via the PATH.
+    
+    The hardcoded path cannot be removed altogether because it will most
+    likely lead to unexpected and difficult to diagnose problems for
+    existing installations where the PATH finds the program elsewhere.
+    
+    The --prepend-to-path flag is added and defaults to /usr/bin : it prepends
+    to the PATH environment variable. The hardcoded path is removed
+    and the PATH will be used: since /usr/bin is searched first, the
+    legacy behavior will not change.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit ad6b4b4b08b6ef7ae8086f2be3a9ef521adaa88c)
+
+commit ccf182241dc04c79e2377b6ba2f060dbfe6dddae
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 17:15:29 2013 +0100
+
+    ceph-disk: make exception handling terse in main_activate_journal
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 908348b8047e8577ecf9133f2683f91423694416)
+
+commit d60e952f3c00d0e551b04c0d6486b11d9761be35
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 17:13:47 2013 +0100
+
+    ceph-disk: do not hide main_activate() exceptions
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 55ca7bb2da73f1be1293710a635cfea42abd7682)
+
+commit 827edb93e3971fc7549fe831894776c6bf163346
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 17:11:30 2013 +0100
+
+    ceph-disk: fix activate() indent
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 324804a81c37ff89f2488e2ba106033c0e6e119e)
+
+commit 27988cf9ffedf3289099e51f1e7c3f5b8d79d667
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 17:09:35 2013 +0100
+
+    ceph-disk: remove noop try:
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit de0050596b5f56863c3486c1cd5e7ffea62e3d00)
+
+commit 75bdb5430d9403bed8bd2ccd6a9c5a30d63a189e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 16:57:36 2013 +0100
+
+    ceph-disk: fix Error() messages formatting
+    
+    Mainly using % instead of ,
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit b82ccfbfa786cd5436b48ec38276c5a48028ce1d)
+
+commit 5df1eaa55bc7ebe68473831d06cf9819fa39baa6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Dec 30 12:26:20 2013 +0100
+
+    ceph-disk: prepare --data-dir must not override files
+    
+    ceph-disk does nothing when given a device that is already prepared. If
+    given a directory that already contains a successfully prepared OSD, it
+    will however override it.
+    
+    Instead of overriding the files in the osd data directory, return
+    immediately if the magic file exists. Make it so the magic file is
+    created last to accurately reflect the success of the OSD preparation.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 7dfe550ce18623cde4ae43a2416e31ef81381ab9)
+
+commit 2e8496a6e0b74ff351bc2a4f138ddc665d8c30ca
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Dec 15 15:34:17 2013 +0100
+
+    ceph-disk: zap needs at least one device
+    
+    If given no argument, ceph-disk zap should display the usage instead of
+    silently doing nothing. Silence can be confused with "I zapped all the
+    disks".
+    
+    http://tracker.ceph.com/issues/6981 fixes #6981
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 07888ef3fd4440332c8287d0faa9f23a32cf141c)
+
+commit 0fe2ac47a82d3caa9dca2a9009b68a14b577e35c
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Fri Dec 13 12:06:25 2013 -0500
+
+    use the new get_command helper in check_call
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit 897dfc113fe3b86f3dda53172933bfd4f8089869)
+
+commit 8fc9f1b791248f08a311d619addc4465cac298f9
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Thu Dec 12 11:16:38 2013 -0500
+
+    use the absolute path for executables if found
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit a9334a1c8c6681305e76b361377864d0dd1e3d34)
+
+commit a2de2f718c9e341c0b6ec2ebffdf03d0f9da0fbd
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Thu Dec 12 10:26:05 2013 -0500
+
+    remove trailing semicolon
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit 43561f791607f5fd6f03d5421e1f30a29fb4194e)
+
+commit 2cd22b5d39760ac4b5baad0b05c676b833ae9213
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Wed Dec 11 15:41:45 2013 -0500
+
+    replace sgdisk subprocess calls with a helper
+    
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit e19e38012bc4579054f63865e682c8c3a7829c7b)
+
+commit e8cc27cc8eb981c71b8cafb58964317687ca5787
+Author: Jonathan Davies <jonathan.davies at canonical.com>
+Date:   Tue Dec 3 21:26:43 2013 +0000
+
+    Call --mbrtogpt on journal run of sgdisk should the drive require a GPT table.
+    
+    Signed-off-by: Jonathan Davies <jonathan.davies at canonical.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 35011e0b01d65e4c001876882d597451f2028345)
+
+commit 3942a93fae3331b2d08f93181eb2c9cf90b50440
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Nov 21 13:21:22 2013 +0100
+
+    ceph-disk: blacklist /dev/fd0
+    
+    blkid -s TYPE /dev/fd0 has been verified to hang forever on a
+    H8DMR-82 supermicro motherboard running
+    
+    3.8.0-33-generic #48~precise1-Ubuntu SMP Thu Oct 24 16:28:06 UTC 2013
+    x86_64
+    
+    It is unlikely that ceph will ever be used on floppy disks, they
+    can be blacklisted.
+    
+    http://tracker.ceph.com/issues/6827 fixes: #6827
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 65701978715237ff5a4c68573c0696fd9d438e4f)
+
+commit ccc6b0c5e6d47eefef5cf1fa17bf69c47c9459c4
+Author: git-harry <git-harry at live.co.uk>
+Date:   Thu Oct 3 10:32:50 2013 +0100
+
+    Make fsid comparison case-insensitive
+    
+    get_fsid and find_cluster_by_uuid are modified so ceph-disk activate and
+    ceph-disk activate-all will work if the fsid uses uppercase characters.
+    
+    Signed-off-by: Harry Harrington <git-harry at live.co.uk>
+    (cherry picked from commit 22f8325dbfce7ef2e97bf015c0f8bba53e75dfe9)
+
+commit 367cf1bbf86233eb20ff2304e7d6caab77b84fcc
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Feb 11 10:14:36 2014 -0800
+
+    librbd: remove limit on number of objects in the cache
+    
+    The number of objects is not a significant indicated of when data
+    should be written out for rbd. Use the highest possible value for
+    number of objects and just rely on the dirty data limits to trigger
+    flushing. When the number of objects is low, and many start being
+    flushed before they accumulate many requests, it hurts average request
+    size and performance for many concurrent sequential writes.
+    
+    Fixes: #7385
+    Backport: emperor, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 0559d31db29ea83bdb6cec72b830d16b44e3cd35)
+
+commit 4856fc2950442fafc208c967af5131f7874f5441
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Feb 11 11:53:00 2014 -0800
+
+    ObjectCacher: use uint64_t for target and max values
+    
+    All the options are uint64_t, but the ObjectCacher was converting them
+    to int64_t. There's never any reason for these to be negative, so
+    change the type.
+    
+    Adjust a few conditionals so that they only convert known-positive
+    signed values to uint64_t before comparing with the target and max
+    values. Leave the actual stats accounting as loff_t for now, since
+    bugs in accounting will have bad effects if negative values wrap
+    around.
+    
+    Backport: emperor, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit db034acf546a72739ff6543241543f3bd651f3ae)
+
+commit a572aafe178dfa3ab4d82aa5c7f4a72a63590ccf
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Feb 11 10:35:14 2014 -0800
+
+    ObjectCacher: remove max_bytes and max_ob arguments to trim()
+    
+    These are never passed, so replace them with the defaults.
+    
+    Backport: emperor, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit bf8cf2d6d21a204a099347f3dcd5b48100b8c445)
+
+commit 4889234f80dbd95e5b2012ff9bfc2d87960034e2
+Merge: 6af657b 30a604d
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Feb 11 08:32:37 2014 -0800
+
+    Merge pull request #1210 from dachary/dumpling
+    
+    common: admin socket fallback to json-pretty format (dumpling)
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 30a604d2d6a5de7bcbfa0136e9a766cb34f96c0a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 10 23:42:38 2014 +0100
+
+    common: admin socket fallback to json-pretty format
+    
+    If the format argument to a command sent to the admin socket is not
+    among the supported formats ( json, json-pretty, xml, xml-pretty ) the
+    new_formatter function will return null and the AdminSocketHook::call
+    function must fall back to a sensible default.
+    
+    The CephContextHook::call and HelpHook::call failed to do that and a
+    malformed format argument would cause the mon to crash. A check is added
+    to each of them and fallback to json-pretty if the format is not
+    recognized.
+    
+    To further protect AdminSocketHook::call implementations from similar
+    problems the format argument is checked immediately after accepting the
+    command in AdminSocket::do_accept and replaced with json-pretty if it is
+    not known.
+    
+    A test case is added for both CephContextHook::call and HelpHook::call
+    to demonstrate the problem exists and is fixed by the patch.
+    
+    Three other instances of unsafe calls to new_formatter were found and
+    a fallback to json-pretty was added. All other calls have been audited
+    and appear to be safe.
+    
+    http://tracker.ceph.com/issues/7378 fixes #7378
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 165e76d4d03ffcc490fd3c2ba60fb37372990d0a)
+
+commit 6af657bd4cf87f6f7afe84257941e7e2366183d9
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Feb 5 17:26:02 2014 -0800
+
+    qa: add script for testing rados client timeout options
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 9e62beb80b6c92a97ec36c0db5ea39e417661b35)
+
+commit 21a0b67440eaa07fa051d26321a88654ee9e8ae7
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Feb 5 17:25:24 2014 -0800
+
+    rados: check return values for commands that can now fail
+    
+    A few places were not checking the return values of commands, since
+    they could not fail before timeouts were added.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 79c1874346ff55e2dc74ef860db16ce70242fd00)
+
+commit 2c42dd26b49d01922bd3df3ba26af70da0387a99
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Feb 5 17:24:16 2014 -0800
+
+    librados: check and return on error so timeouts work
+    
+    Some functions could not previously return errors, but they had an
+    int return value, which can now receive ETIMEDOUT.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 8e9459e897b1bc2f97d52ee07701fd22069efcf3)
+
+commit 28fe564cc298b96c063e6cca44304046a86942cd
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Feb 5 17:22:14 2014 -0800
+
+    msg/Pipe: add option to restrict delay injection to specific msg type
+    
+    This makes it possible to test timeouts reliably by delaying certain
+    messages effectively forever, but still being able to e.g. connect and
+    authenticate to the monitors.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit d389e617c1019e44848330bf9570138ac7b0e5d4)
+
+commit 1d2ea9efb844cb902d282c3a752acc45fefeb04c
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 3 18:30:00 2014 -0800
+
+    MonClient: add a timeout on commands for librados
+    
+    Just use the conf option directly, since librados is the only caller.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 671a76d64bc50e4f15f4c2804d99887e22dcdb69)
+
+commit 30dafacd0b54bb98b01284851e0d5abf76324e95
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 3 17:59:21 2014 -0800
+
+    Objecter: implement mon and osd operation timeouts
+    
+    This captures almost all operations from librados other than mon_commands().
+    
+    Get the values for the timeouts from the Objecter constructor, so only
+    librados uses them.
+    
+    Add C_Cancel_*_Op, finish_*_op(), and *_op_cancel() for each type of
+    operation, to mirror those for Op. Create a callback and schedule it
+    in the existing timer thread if the timeouts are specified.
+    
+    Fixes: #6507
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 3e1f7bbb4217d322f4e0ece16e676cd30ee42a20)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+    	src/osd/ReplicatedPG.cc
+    	src/osdc/Objecter.cc
+    	src/osdc/Objecter.h
+
+commit 2aa0d7589283fe5879a966601fbfe690816cc4a1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 3 12:53:15 2014 -0800
+
+    librados: add timeout to wait_for_osdmap()
+    
+    This is used by several pool operations independent of the objecter,
+    including rados_ioctx_create() to look up the pool id in the first
+    osdmap.
+    
+    Unfortunately we can't just rely on WaitInterval returning ETIMEDOUT,
+    since it may also get interrupted by a signal, so we can't avoid
+    keeping track of time explicitly here.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 1829d2c9fd13f2cbae4e192c9feb553047dad42c)
+    
+    Conflicts:
+    	src/librados/RadosClient.cc
+
+commit 55d254d5ea113d8be29afe18dc9940f14d93ebb4
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Feb 3 12:09:34 2014 -0800
+
+    conf: add options for librados timeouts
+    
+    These will be implemented in subsequent patches.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 0dcceff1378d85ca6d81d102d201890b8a71af6b)
+
+commit ccd9b5eb9bcfe2360e874b306d4decd8815ecf46
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Feb 9 20:53:00 2014 -0800
+
+    test_striper: fix warning
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit bb44c0d5e06c2b699c81a76373a0edde1bf90445
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 8 12:21:26 2014 -0800
+
+    crushtool: add cli test for off-by-one tries vs retries bug
+    
+    See bug #7370.  This passes on dumpling and breaks prior to the #7370 fix.
+    
+    Backport: emperor, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ed32c4002fb5cb1dd546331651eaf7de1a017471)
+
+commit c301ec689caac5bbcd21e02226045d3454cc82fd
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Feb 3 08:54:14 2014 -0800
+
+    client: use 64-bit value in sync read eof logic
+    
+    The file size can jump to a value that is very much larger than our current
+    position (for example, it could be a disk image file that gets a sparse
+    write at a large offset).  Use a 64-bit value so that 'some' doesn't
+    overflow.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: John Spray <john.spray at inktank.com>
+    (cherry picked from commit 7ff2b541c24d1c81c3bcfbcb347694c2097993d7)
+
+commit 183deb899bc6b1b7b2a1ec639425e45786e56b01
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 4 22:39:35 2014 -0800
+
+    osd: do not send peering messages during init
+    
+    Do not send any peering messages while we are still working our way
+    through init().
+    
+    Fixes: #7093
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 35da8f9d80e0c6c33fb6c6e00f0bf38f1eb87d0e)
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+
+commit 3a1fb17401897b0717cf1d264c6e6fdf99fc703f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 28 18:46:37 2014 -0800
+
+    OSDMap: fix deepish_copy_from
+    
+    Start with a shallow copy!
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d0f13f54146694a197535795da15b8832ef4b56f)
+    
+    Conflicts:
+    
+    	src/osd/OSDMap.h
+
+commit f01bd8a94adc4ce8e7131f74282de5b434a7316a
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jan 23 13:48:28 2014 -0800
+
+    rgw: fix listing of multipart upload parts
+    
+    Fixes: #7169
+    
+    There are two issues here. One is that we may return more entries than
+    we should (as specified by max_parts). Second issue is that the
+    NextPartNumberMarker is set incorrectly. Both of these issues mainly
+    affect uploads with > 1000 parts, although can be triggered with less
+    than that.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 6b657992d2397e399eacf554357ed807fda399fa
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Nov 21 06:52:48 2013 -0800
+
+    rgw: initialize RGWUserAdminOpState::system_specified
+    
+    Fixes: #6829
+    Backport: dumpling, emperor
+    We didn't init this member variable, which might cause that when
+    modifying user info that has this flag set the 'system' flag might
+    inadvertently reset.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 561e7b0b287e65e90b80699e45a52ae44e94684f)
+
+commit 585e0e7eec1bbee60fe352166b593d53476003f8
+Author: Robin H. Johnson <robbat2 at gentoo.org>
+Date:   Sun Dec 15 12:26:19 2013 -0800
+
+    rgw: Fix CORS allow-headers validation
+    
+    This fix is needed because Ceph presently validates CORS headers in a
+    case-sensitive manner. Keeps a local cache of lowercased allowed headers
+    to avoid converting the allowed headers to lowercase each time.
+    
+    CORS 6.2.6: If any of the header field-names is not a ASCII
+    case-insensitive match for any of the values in list of headers do not
+    set any additional headers and terminate this set of steps.
+    
+    Signed-off-by: Robin H. Johnson <robbat2 at gentoo.org>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 31b60bfd9347a386ff12b4e4f1812d664bcfff01)
+
+commit da2267a87e37afa28385e915a566de26fd784b70
+Author: Robin H. Johnson <robbat2 at gentoo.org>
+Date:   Sun Dec 15 11:40:31 2013 -0800
+
+    rgw: Clarify naming of case-change functions
+    
+    It is not clear that the lowercase_http_attr & uppercase_http_attr
+    functions replace dashes with underscores. Rename them to match the
+    pattern established by the camelcase_dash_http_attr function in
+    preperation for more case-change functions as needed by later fixes.
+    
+    Signed-off-by: Robin H. Johnson <robbat2 at gentoo.org>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 6a7edab2673423c53c6a422a10cb65fe07f9b235)
+
+commit fdea76ef6f7d7c4ee89c30d430f5495072023957
+Author: Robin H. Johnson <robbat2 at gentoo.org>
+Date:   Sun Dec 15 11:27:49 2013 -0800
+
+    rgw: Look at correct header about headers for CORS
+    
+    The CORS standard dictates that preflight requests are made with the
+    Access-Control-Request-Headers header containing the headers of the
+    author request. The Access-Control-Allow-Headers header is sent in the
+    response.
+    
+    The present code looks for Access-Control-Allow-Headers in request, so
+    fix it to look at Access-Control-Request-Headers instead.
+    
+    Signed-off-by: Robin H. Johnson <robbat2 at gentoo.org>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 2abacd9678ae04cefac457882ba718a454948915)
+
+commit a5739e3903f8c30c8168199413818922b4a29bad
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Dec 6 11:07:09 2013 -0800
+
+    rgw: fix reading bucket policy in RGWBucket::get_policy()
+    
+    Fixes: 6940
+    Backport: dumpling, emperor
+    
+    We changed the way we keep the bucket policy, and we shouldn't try to
+    access the bucket object directly. This had changed when we added the
+    bucket instance object around dumpling.
+    
+    Reported-by: Gao, Wei M <wei.m.gao at intel.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 7a9a088d82d04f6105d72f6347673724ac16c9f8)
+
+commit ba792cdc8d0c006e260e6a02a33ca1491b35901c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jan 16 11:45:27 2014 -0800
+
+    rgw: handle racing object puts when object doesn't exist
+    
+    If the object didn't exist before and now we have multiple puts coming
+    in concurrently, we need to make sure that we behave correctly. Only one
+    needs to win, the other one can fail silently. We do that by setting
+    exclusive flag on the object creation and handling the error correctly.
+    Note that we still want to return -EEXIST in some cases (when the
+    exclusive flag is passed to put_obj_meta(), e.g., on bucket creation).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 86c15480fc3e33b9a3b84d0af68d8398fc732bae)
+
+commit 1e2984ac4a4ed0508e1b5efc8b69ae4da0cac824
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jan 16 11:33:49 2014 -0800
+
+    rgw: don't return -ENOENT in put_obj_meta()
+    
+    Fixes: #7168
+    
+    An object put may race with the same object's delete. In this case just
+    ignore the error, same behavior as if object was created and then
+    removed.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 5c24a7ea905587fd4077e3b0cfc0f5ad2b178c29)
+
+commit 5f1eea2ccf1ee4296530fc754bfd5dfc1571cd62
+Author: Robin H. Johnson <robbat2 at gentoo.org>
+Date:   Sat Jan 18 18:01:20 2014 -0800
+
+    rgw: Use correct secret key for POST authn
+    
+    The POST authentication by signature validation looked up a user based
+    on the access key, then used the first secret key for the user. If the
+    access key used was not the first access key, then the expected
+    signature would be wrong, and the POST would be rejected.
+    
+    Signed-off-by: Robin H. Johnson <robbat2 at gentoo.org>
+    (cherry picked from commit 586ad1f69e6260ef298805647911b3b49f8be7cf)
+
+commit 14e933eb2e8adf3e7df2aef823d863c593067928
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jan 28 15:54:33 2014 +0000
+
+    osd: OSDMonitor: ignore pgtemps from removed pool
+    
+    There's a window in-between receiving an MOSDPGTemp message from an OSD
+    and actually handling it that may lead to the pool the pg temps refer to
+    no longer existing. This may happen if the MOSDPGTemp message is queued
+    pending dispatching due to an on-going proposal (maybe even the pool
+    removal).
+    
+    This patch fixes such behavior in two steps:
+    
+    1. Check if the pool exists in the osdmap upon preprocessing
+     - if pool does not exist in the osdmap, then the pool must have been
+       removed prior to handling the message, but after the osd sent it.
+     - safe to ignore the pg update
+    2. If all pg updates in the message have been ignored, ignore the whole
+       message.  Otherwise, let prepare handle the rest.
+    
+    3. Recheck if pool exists in the osdmap upon prepare
+     - We may have ignored this pg back in preprocess, but other pgs in the
+       message may have led the message to be passed on to prepare; ignore
+       pg update once more.
+    4. Check if pool is pending removal and ignore pg update if so.
+    
+    We delegate checking the pending value to prepare_pgtemp() because in this
+    case we should only ignore the update IFF the pending value is in fact
+    committed.  Otherwise we should retry the message.  prepare_pgtemp() is
+    the appropriate place to do so.
+    
+    Fixes: 7116
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit f513f66f48383a07c70ca18a4dba6c2449ea9860)
+
+commit 3672fc49bea5efcef2069673c88fd8e526eeb7e5
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 28 11:00:34 2014 -0800
+
+    OSDMonitor: use deepish_copy_from for remove_down_pg_temp
+    
+    This is a backport of 368852f6c0a884b8fdc80a5cd6f9ab72e814d412.
+    
+    Make a deep copy of the OSDMap to avoid clobbering the in-memory copy with
+    the call to apply_incremental.
+    
+    Fixes: #7060
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit e6fef68ee51a2e3be6537086246ce860819788eb
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 24 11:03:26 2014 -0800
+
+    OSDMap: deepish_copy_from()
+    
+    Make a deep(ish) copy of another OSDMap.  Unfortunatley we can't make the
+    compiler-generated copy operator/constructors private until c++11.  :(
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bd54b9841b9255406e56cdc7269bddb419453304)
+
+commit 2528186c0dd327607b1e76a51581df72aeea52f2
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 28 10:26:12 2014 -0800
+
+    buffer: make 0-length splice() a no-op
+    
+    This was causing a problem in the Striper, but fixing it here will avoid
+    corner cases all over the tree.  Note that we have to bail out before
+    the end-of-buffer check to avoid hitting that check when the bufferlist is
+    also empty.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit ff5abfbdae07ae8a56fa83ebaa92000896f793c2)
+
+commit fe9539e118a830aa71bc5846ad2693543213fc59
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 28 10:09:17 2014 -0800
+
+    osdc/Striper: test zero-length add_partial_result
+    
+    If we add a partial result that is 0-length, we used to hit an assert in
+    buffer::list::splice().  Add a unit test to verify the fix.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 28c7388d320a47657c2e12c46907f1bf40672b08)
+
+commit 9801718e6e7a335d1aeffb7f3d958b012d8dd79c
+Author: Derek Yarnell <derek at umiacs.umd.edu>
+Date:   Mon Jan 27 12:27:51 2014 -0700
+
+    packaging: apply udev hack rule to RHEL
+    
+    In the RPM spec file there is a test to deploy the uuid hack udev rules
+    for older udev operating systems. This includes CentOS and RHEL, but the
+    check currently only is for CentOS, causing RHEL clients to get a bogus
+    osd rules file.
+    
+    Adjust the conditional to apply to RHEL as well as CentOS. (The %{rhel}
+    macro is defined in both platforms' redhat-rpm-config package.)
+    
+    Fixes http://tracker.ceph.com/issues/7245
+    
+    Signed-off-by: Ken Dreyer <ken.dreyer at inktank.com>
+    (cherry picked from commit 64a0b4fa563795bc22753940aa3a4a2946113109)
+
+commit 5817078ba9b2aa38f39e1f62d8d08e943646c0bb
+Merge: 9fa8d2d abf6441
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jan 23 07:12:37 2014 -0800
+
+    Merge pull request #1129 from ceph/wip-dumpling-backport-6620
+    
+    mds: MDSMap: adjust buffer size for uint64 values with more than 5 chars
+
+commit abf64417bbc63b006c53a07262a5774d0d40550e
+Author: Joao Eduardo Luis <jecluis at gmail.com>
+Date:   Thu Jan 23 11:36:16 2014 +0000
+
+    mds: MDSMap: adjust buffer size for uint64 values with more than 5 chars
+    
+    Fixes: #6620
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 0e8182edd850f061421777988974efbaa3575b9f)
+
+commit 9fa8d2d1bd4a8cf56fdebae484bee35c3930fb62
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jan 21 11:29:56 2014 -0800
+
+    mon/MDSMonitor: do not generate mdsmaps from already-laggy mds
+    
+    There is one path where a mds that is not sending its beacon (e.g.,
+    because it is not running at all) will lead to proposal of new mdsmaps.
+    Fix it.
+    
+    Backport: emperor, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 584c2dd6bea3fe1a3c7f306874c054ce0cf0d2b5)
+
+commit a2e34b8d322e571600d6c0a3ff363f9910196f28
+Author: John Spray <john.spray at inktank.com>
+Date:   Mon Jan 20 11:08:27 2014 +0000
+
+    Fix #7187: Include all summary items in JSON health output
+    
+    Signed-off-by: John Spray <john.spray at inktank.com>
+    (cherry picked from commit fdf3b5520d150f14d90bdfc569b70c07b0579b38)
+
+commit ee9fc590a556354b54a174a4790c4142949d7409
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Jan 6 18:32:42 2014 -0800
+
+    rgw: convert bucket info if needed
+    
+    Fixes: #7110
+    In dumpling, the bucket info was separated into bucket entry point and
+    bucket instance objects. When setting bucket attrs we only ended up
+    updating the bucket instance object. However, pre-dumpling buckets still
+    keep everything at the entry-point object, so acl changes didn't affect
+    anything (because we never updated the entry point). This change just
+    converts the bucket info into the new format.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit a5f8cc7ec9ec8bef4fbc656066b4d3a08e5b215b)
+
+commit 69a99e6edd67aadaea77fb5ebcf46190dbfcdbc6
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 4 22:40:43 2014 -0800
+
+    osd: ignore OSDMap messages while we are initializing
+    
+    The mon may occasionally send OSDMap messages to random OSDs, but is not
+    very descriminating in that we may not have authenticated yet.  Ignore any
+    messages if that is the case; we will reqeust whatever we need during the
+    BOOTING state.
+    
+    Fixes: #7093
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f68de9f352d53e431b1108774e4a23adb003fe3f)
+
+commit 1545ddbd3b6dfac897d483bd58a4335d68b9b62a
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jan 4 22:43:26 2014 -0800
+
+    mon: only send messages to current OSDs
+    
+    When choosing a random OSD to send a message to, verify not only that
+    the OSD id is up but that the session is for the same instance of that OSD
+    by checking that the address matches.
+    
+    Fixes: #7093
+    Backport: emperor, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 98ed9ac5fed6eddf68f163086df72faabd9edcde)
+
+commit 4d88dd10bfab4e5fb45632245be5f79eeba73a30
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Aug 26 13:58:47 2013 -0700
+
+    osd: discriminate based on connection messenger, not peer type
+    
+    Replace ->get_source().is_osd() checks and instead see if it is the
+    cluster_messenger so that we do not confuse ourselves when we get
+    legit requests from other OSDs on our public interface.
+    
+    NOTE: backporting this because a mixed cluster may send OSD requests
+    via the client interface, even though dumpling doesn't do this.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a6b04c5d8ba043727a2e39a62e9d4126485bcfeb)
+    
+    Conflicts:
+    
+    	src/osd/OSD.cc
+
+commit 2354b957b7924af3e81f559d5c975262848c3bf6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Dec 15 22:59:51 2013 +0100
+
+    qa: test for error when ceph osd rm is EBUSY
+    
+    http://tracker.ceph.com/issues/6824 fixes #6824
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 31507c90f0161c4569a2cc634c0b5f671179440a)
+
+commit 10ad2e01f832ca9293a1bda1c82f7d318e8c3589
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Dec 15 16:27:02 2013 +0100
+
+    mon: set ceph osd (down|out|in|rm) error code on failure
+    
+    Instead of always returning true, the error code is set if at least one
+    operation fails.
+    
+    EINVAL if the OSD id is invalid (osd.foobar for instance).
+    EBUSY if trying to remove and OSD that is up.
+    
+    When used with the ceph command line, it looks like this:
+    
+        ceph -c ceph.conf osd rm osd.0
+        Error EBUSY: osd.0 is still up; must be down before removal.
+        kill PID_OF_osd.0
+        ceph -c ceph.conf osd down osd.0
+        marked down osd.0.
+        ceph -c ceph.conf osd rm osd.0 osd.1
+        Error EBUSY: removed osd.0, osd.1 is still up; must be down before removal.
+    
+    http://tracker.ceph.com/issues/6824 fixes #6824
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 15b8616b13a327701c5d48c6cb7aeab8fcc4cafc)
+
+commit db82bfec50349783c3bb708c65cf89bceff7b2ca
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Oct 29 20:30:37 2013 +0000
+
+    mon: OSDMonitor: fix some annoying whitespace
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 42c4137cbfacad5654f02c6608cc0e81b45c06be)
+
+commit 1abb16988727a21dff61edca48bfcb05c60d26f2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Dec 26 17:38:52 2013 -0800
+
+    librbd: call user completion after incrementing perfcounters
+    
+    The perfcounters (and the ictx) are only valid while the image is
+    still open.  If the librbd user gets the callback for its last I/O,
+    then closes the image, the ictx and its perfcounters will be
+    invalid. If the AioCompletion object is has not run the rest of its
+    complete() method yet, it will access these now-invalid addresses,
+    possibly leading to a crash.
+    
+    The AioCompletion object is independent of the ictx and does not
+    access it again after incrementing perfcounters, so avoid this race by
+    calling the user's callback after this step. The AioCompletion object
+    will be cleaned up by the rest of complete_request(), independent of
+    the ImageCtx.
+    
+    Fixes: #5426
+    Backport: dumpling, emperor
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 4cea7895da7331b84d8c6079851fdc0ff2f4afb1)
+
+commit 4dae50d8a0ffe3f3491eae62950fe46229aaa0e6
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Fri Dec 6 16:03:20 2013 -0800
+
+    objecter: don't take extra throttle budget for resent ops
+    
+    These ops have already taken their budget in the original op_submit().
+    It will be returned via put_op_budget() when they complete.
+    If there were many localized reads of missing objects from replicas,
+    or cache pool redirects, this would cause the objecter to use up all
+    of its op throttle budget and hang.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 8d0180b1b7b48662daef199931efc7f2a6a1c431)
+    
+    Conflicts:
+    
+    	src/osdc/Objecter.cc
+
+commit 4944618fe74e1875e37a5de9a5bfe3922f906942
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Dec 5 17:44:37 2013 -0800
+
+    rbd: check write return code during bench-write
+    
+    This is allows rbd-bench to detect http://tracker.ceph.com/issues/6938
+    when combined with rapidly changing the mon osd full ratio.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 3caf3effcb113f843b54e06099099909eb335453)
+
+commit 3a7a0353d7c8521a2c3c25778801d45f0ca10957
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Dec 5 17:36:33 2013 -0800
+
+    objecter: resend all writes after osdmap loses the full flag
+    
+    Now that the osd does not respond if it gets a map with the full flag
+    set first, clients need to resend all writes.
+    
+    Clients talking to old osds are still subject to the race condition,
+    so both sides must be upgraded to avoid it.
+    
+    Refs: #6938
+    Backport: dumpling, emperor
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e32874fc5aa6f59494766b7bbeb2b6ec3d8f190e)
+    
+    Conflicts:
+    
+    	src/osdc/Objecter.h
+
+commit f4d0fc8afac1bcbea76f46744397a8462025f373
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Dec 5 17:34:38 2013 -0800
+
+    osd: drop writes when full instead of returning an error
+    
+    There's a race between the client and osd with a newly marked full
+    osdmap.  If the client gets the new map first, it blocks writes and
+    everything works as expected, with no errors from the osd.
+    
+    If the osd gets the map first, however, it will respond to any writes
+    with -ENOSPC. Clients will pass this up the stack, and not retry these
+    writes later.  -ENOSPC isn't handled well by all clients. RBD, for
+    example, may pass it on to qemu or kernel rbd which will both
+    interpret it as EIO.  Filesystems on top of rbd will not behave well
+    when they receive EIOs like this, especially if the cluster oscillates
+    between full and not full, so some writes succeed.
+    
+    To fix this, never return ENOSPC from the osd because of a map marked
+    full, and rely on the client to retry all writes when the map is no
+    longer marked full.
+    
+    Old clients talking to osds with this fix will hang instead of
+    propagating an error, but only if they run into this race
+    condition. ceph-fuse and rbd with caching enabled are not affected,
+    since the ObjectCacher will retry writes that return errors.
+    
+    Refs: #6938
+    Backport: dumpling, emperor
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 4111729dda7437c23f59e7100b3c4a9ec4101dd0)
+
+commit 2b109803b9434d2d495e65d6a045838ee3ebf169
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Nov 6 16:55:52 2013 -0800
+
+    objecter: clean pause / unpause logic
+    
+    op->paused holds now whether operation should be paused or not, and it's
+    being updated when scanning requests. No need to do a second scan.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 5fe3dc647bf936df8e1eb2892b53f44f68f19821)
+
+commit 7b229fca346b7ab60131b229591d35f63f64a6ad
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Nov 6 16:15:47 2013 -0800
+
+    objecter: set op->paused in recalc_op_target(), resend in not paused
+    
+    When going through scan_requests() in handle_osd_map() we need to make
+    sure that if an op should not be paused anymore then set it on the op
+    itself, and return NEED_RESEND. Otherwise we're going to miss reset of
+    the full flag.
+    Also in handle_osd_map(), make sure that op shouldn't be paused before
+    sending it. There's a lot of cleanup around that area that we should
+    probably be doing, make the code much more tight.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 98ab7d64a191371fa39d840c5f8e91cbaaa1d7b7)
+
+commit a3fdfd77c953a8f9ace4991630599e60f56abc4a
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Nov 6 10:46:37 2013 +0800
+
+    objecter: don't resend paused ops
+    
+    Paused ops are meant to block on the client side until a new map that
+    unpauses them is recieved. If we send paused writes when the FULL flag
+    is set, we'll get -ENOSPC from the osds, which is not what Objecter
+    users expect. This may cause rbd without caching to produce an I/O
+    error instead of waiting for the cluster to have capacity.
+    
+    Fixes: #6725
+    Backport: dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit c5c399d327cfc0d232d9ec7d49ababa914d0b21a)
+
+commit 78037886ae6ae278d8fb2db52d7767b8612313fe
+Merge: a60ac91 4e47a00
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Dec 29 21:10:30 2013 -0800
+
+    Merge pull request #808 from ceph/wip-6152-dumpling
+    
+    rgw: Fix S3 auth when using response-* query string params
+
+commit 4e47a003bb3adcee690067d4037c248a93023c20
+Author: Sylvain Munaut <s.munaut at whatever-company.com>
+Date:   Thu Aug 29 16:17:30 2013 +0200
+
+    rgw: Fix S3 auth when using response-* query string params
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Signed-off-by: Sylvain Munaut <s.munaut at whatever-company.com>
+    (cherry picked from commit 7a7361d7e798d94796d4985e2e4b35af22463ae2)
diff --git a/doc/changelog/v0.67.7.txt b/doc/changelog/v0.67.7.txt
new file mode 100644
index 0000000..71442f6
--- /dev/null
+++ b/doc/changelog/v0.67.7.txt
@@ -0,0 +1,110 @@
+commit d7ab4244396b57aac8b7e80812115bbd079e6b73 (tag: refs/tags/v0.67.7, refs/remotes/gh/dumpling)
+Author: Ken Dreyer <ken.dreyer at inktank.com>
+Date:   Wed Feb 19 18:09:39 2014 +0000
+
+    v0.67.7
+    
+    Signed-off-by: Ken Dreyer <ken.dreyer at inktank.com>
+
+commit c1f42770f45205c8a3eae774d09e747408130c50
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Jan 6 12:53:58 2014 -0800
+
+    radosgw-admin: fix object policy read op
+    
+    Fixes: #7083
+    This was broken when we fixed #6940. We use the same function to both
+    read the bucket policy and the object policy. However, each needed to be
+    treated differently. Restore old behavior for objects.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b1976dd00f5b29c01791272f63a18250319f2edb)
+
+commit 404500811adc74c79583bbf3122dc333e0b41b51
+Merge: 3e7ea33 fec55a2
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 15 22:20:45 2014 -0800
+
+    Merge pull request #1243 from dachary/wip-ceph-disk-dumpling
+    
+    ceph-disk: unit tests (dumpling)
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 3e7ea33cfc80031aed8d6c61e1bdca947b36d69b
+Author: Ken Dreyer <ken.dreyer at inktank.com>
+Date:   Fri Jan 3 16:38:25 2014 -0700
+
+    add autotools-generated files to .gitignore
+    
+    When running "make check", Automake generates test-suite.log, along with
+    various *.log and *.trs files in the tree. Add these files to
+    .gitignore.
+    
+    (It looks like this feature arrived in Automake 1.13.)
+    
+    Signed-off-by: Ken Dreyer <ken.dreyer at inktank.com>
+    (cherry picked from commit bb8b7503b03fac5830fb71b9723963fdc803ca90)
+
+commit fec55a2174b49ef68c816755c1218f9cd69033b6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Feb 15 18:34:04 2014 +0100
+
+    ceph-disk: unit tests
+    
+    src/test/ceph-disk.sh replaces src/test/cli/ceph-disk/data-dir.t
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+
+commit 0679b11b4d2f7cb7bd9c1cd86854a064aaa83f8a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jan 2 22:42:17 2014 +0100
+
+    ceph-disk: cannot run unit tests
+    
+    Because ceph-disk relies on hardcoded paths. The corresponding test will
+    be added back when ceph-disk can run from sources.
+    
+    Fixes: #7085
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 2ba6930d62263a39f150ab43bf8cd860b9245188)
+
+commit 9dae9993e9b36e741e05804807bdb738fbe52e6f
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 14 23:52:06 2014 -0800
+
+    Revert "librbd: remove limit on number of objects in the cache"
+    
+    This reverts commit 367cf1bbf86233eb20ff2304e7d6caab77b84fcc.
+    
+    Removing the limit on objects means we leak memory, since Objects without
+    any buffers can exist in the cache.
+
+commit 2795339d3632df975486d51e69762f9f567fb43d
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Oct 7 05:22:20 2013 -0700
+
+    os/FileStore: fix ENOENT error code for getattrs()
+    
+    In commit dc0dfb9e01d593afdd430ca776cf4da2c2240a20 the omap xattrs code
+    moved up a block and r was no longer local to the block.  Translate
+    ENOENT -> 0 to compensate.
+    
+    Fix the same error in _rmattrs().
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 6da4b91c07878e07f23eee563cf1d2422f348c2f)
+
+commit c158de232fcfb0e39f4b7eaac6dacbaaaee84b5f
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 15 16:00:26 2013 -0700
+
+    test/filestore/run_seed_to.sh: avoid obsolete --filestore-xattr-use-omap
+    
+    This option no longer exists.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1d4f501a015727a7ff4b2f9b20dc91f2bbd9707b)
diff --git a/doc/changelog/v0.67.8.txt b/doc/changelog/v0.67.8.txt
new file mode 100644
index 0000000..2f8e0c9
--- /dev/null
+++ b/doc/changelog/v0.67.8.txt
@@ -0,0 +1,1220 @@
+commit ffc58b4ea6a3ea10e91050aaa28d14d87dea5656 (tag: refs/tags/v0.67.8, refs/remotes/gh/dumpling)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Thu May 1 11:18:24 2014 +0000
+
+    0.67.8
+
+commit 4b16b70c53be83481efefcf394eca99c73bb9805
+Merge: 5a6b351 fb0944e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Apr 30 15:15:48 2014 -0700
+
+    Merge pull request #1743 from ceph/wip-mon-backports.dumpling
+    
+    mon: OSDMonitor: HEALTH_WARN on 'mon osd down out interval == 0'
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit fb0944e22acf6f8b6cefb59cc4c41dc48087bfd7
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Apr 30 17:13:30 2014 +0100
+
+    mon: OSDMonitor: HEALTH_WARN on 'mon osd down out interval == 0'
+    
+    A 'status' or 'health' request will return a HEALTH_WARN whenever the
+    monitor handling the request has the option set to zero.
+    
+    Fixes: 7784
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit b2112d5087b449d3b019678cb266ff6fa897897e)
+
+commit 5a6b35160417423db7c6ff892627f084ab610dfe
+Author: Sandon Van Ness <sandon at inktank.com>
+Date:   Tue Mar 4 16:15:15 2014 -0800
+
+    Make symlink  of librbd to qemu's folder so it can detect it.
+    
+    Per issue #7293.
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit 65f3354903fdbdb81468a84b8049ff19c00f91ba)
+
+commit 735a90a95eea01dbcce5026758895117c2842627
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Apr 25 14:11:27 2014 -0700
+
+    rgw: fix url escaping
+    
+    Fixes: #8202
+    This fixes the radosgw side of issue #8202. Needed to cast value
+    to unsigned char, otherwise it'd get padded.
+    
+    Backport: dumpling
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit bcf92c496aba0dfde432290fc2df5620a2767313)
+
+commit 438b57890dfce04226d769389a601d35b74e11fe
+Merge: c049967 476b929
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Apr 25 16:00:24 2014 -0700
+
+    Merge pull request #1700 from xanpeng/patch-1
+    
+    Fix error in mkcephfs.rst
+    
+    Signed-off-by: Xan Peng <xanpeng at gmail.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 476b929ecc5b7351a5be3024817b900976a90a3e
+Author: xanpeng <xanpeng at gmail.com>
+Date:   Mon Apr 21 11:30:42 2014 +0800
+
+    Update mkcephfs.rst
+    
+    There should be no blank between mount options.
+
+commit c049967af829497f8a62e0cbbd6031f85ead8a59
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Apr 1 17:27:01 2014 -0700
+
+    auth: add rwlock to AuthClientHandler to prevent races
+    
+    For cephx, build_authorizer reads a bunch of state (especially the
+    current session_key) which can be updated by the MonClient. With no
+    locks held, Pipe::connect() calls SimpleMessenger::get_authorizer()
+    which ends up calling RadosClient::get_authorizer() and then
+    AuthClientHandler::bulid_authorizer(). This unsafe usage can lead to
+    crashes like:
+    
+    Program terminated with signal 11, Segmentation fault.
+    0x00007fa0d2ddb7cb in ceph::buffer::ptr::release (this=0x7f987a5e3070) at common/buffer.cc:370
+    370 common/buffer.cc: No such file or directory.
+    in common/buffer.cc
+    (gdb) bt
+    0x00007fa0d2ddb7cb in ceph::buffer::ptr::release (this=0x7f987a5e3070) at common/buffer.cc:370
+    0x00007fa0d2ddec00 in ~ptr (this=0x7f989c03b830) at ./include/buffer.h:171
+    ceph::buffer::list::rebuild (this=0x7f989c03b830) at common/buffer.cc:817
+    0x00007fa0d2ddecb9 in ceph::buffer::list::c_str (this=0x7f989c03b830) at common/buffer.cc:1045
+    0x00007fa0d2ea4dc2 in Pipe::connect (this=0x7fa0c4307340) at msg/Pipe.cc:907
+    0x00007fa0d2ea7d73 in Pipe::writer (this=0x7fa0c4307340) at msg/Pipe.cc:1518
+    0x00007fa0d2eb44dd in Pipe::Writer::entry (this=<value optimized out>) at msg/Pipe.h:59
+    0x00007fa0e0f5f9d1 in start_thread (arg=0x7f987a5e4700) at pthread_create.c:301
+    0x00007fa0de560b6d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:115
+    
+    and
+    
+    Error in `qemu-system-x86_64': invalid fastbin entry (free): 0x00007ff12887ff20
+    *** ======= Backtrace: =========
+    /lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7ff3dea1fa46]
+    /usr/lib/librados.so.2(+0x29eb03)[0x7ff3e3d43b03]
+    /usr/lib/librados.so.2(_ZNK9CryptoKey7encryptEP11CephContextRKN4ceph6buffer4listERS4_RSs+0x71)[0x7ff3e3d42661]
+    /usr/lib/librados.so.2(_Z21encode_encrypt_enc_blIN4ceph6buffer4listEEvP11CephContextRKT_RK9CryptoKeyRS2_RSs+0xfe)[0x7ff3e3d417de]
+    /usr/lib/librados.so.2(_Z14encode_encryptIN4ceph6buffer4listEEiP11CephContextRKT_RK9CryptoKeyRS2_RSs+0xa2)[0x7ff3e3d41912]
+    /usr/lib/librados.so.2(_ZN19CephxSessionHandler12sign_messageEP7Message+0x242)[0x7ff3e3d40de2]
+    /usr/lib/librados.so.2(_ZN4Pipe6writerEv+0x92b)[0x7ff3e3e61b2b]
+    /usr/lib/librados.so.2(_ZN4Pipe6Writer5entryEv+0xd)[0x7ff3e3e6c7fd]
+    /lib/x86_64-linux-gnu/libpthread.so.0(+0x7f8e)[0x7ff3ded6ff8e]
+    /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7ff3dea99a0d]
+    
+    Fix this by adding an rwlock to AuthClientHandler. A simpler fix would
+    be to move RadosClient::get_authorizer() into the MonClient() under
+    the MonClient lock, but this would not catch all uses of other
+    Authorizer, e.g. for verify_authorizer() and it would serialize
+    independent connection attempts.
+    
+    This mainly matters for cephx, but none and unknown can have the
+    global_id reset as well.
+    
+    Partially-fixes: #6480
+    Backport: dumpling, emperor
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 2cc76bcd12d803160e98fa73810de2cb916ef1ff)
+
+commit 2b4b00b76b245b1ac6f95e4537b1d1a4656715d5
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Apr 1 11:37:29 2014 -0700
+
+    pipe: only read AuthSessionHandler under pipe_lock
+    
+    session_security, the AuthSessionHandler for a Pipe, is deleted and
+    recreated while the pipe_lock is held. read_message() is called
+    without pipe_lock held, and examines session_security. To make this
+    safe, make session_security a shared_ptr and take a reference to it
+    while the pipe_lock is still held, and use that shared_ptr in
+    read_message().
+    
+    This may have caused crashes like:
+    
+    *** Error in `qemu-system-x86_64': invalid fastbin entry (free): 0x00007f42a4002de0 ***
+    ======= Backtrace: =========
+    /lib/x86_64-linux-gnu/libc.so.6(+0x80a46)[0x7f452f1f3a46]
+    /usr/lib/x86_64-linux-gnu/libnss3.so(PK11_FreeSymKey+0xa8)[0x7f452e72ff98]
+    /usr/lib/librados.so.2(+0x2a18cd)[0x7f453451a8cd]
+    /usr/lib/librados.so.2(_ZNK9CryptoKey7encryptEP11CephContextRKN4ceph6buffer4listERS4_RSs+0x71)[0x7f4534519421]
+    /usr/lib/librados.so.2(_Z21encode_encrypt_enc_blIN4ceph6buffer4listEEvP11CephContextRKT_RK9CryptoKeyRS2_RSs+0xfe)[0x7f453451859e]
+    /usr/lib/librados.so.2(_Z14encode_encryptIN4ceph6buffer4listEEiP11CephContextRKT_RK9CryptoKeyRS2_RSs+0xa2)[0x7f45345186d2]
+    /usr/lib/librados.so.2(_ZN19CephxSessionHandler23check_message_signatureEP7Message+0x246)[0x7f4534516866]
+    /usr/lib/librados.so.2(_ZN4Pipe12read_messageEPP7Message+0xdcc)[0x7f453462ecbc]
+    /usr/lib/librados.so.2(_ZN4Pipe6readerEv+0xa5c)[0x7f453464059c]
+    /usr/lib/librados.so.2(_ZN4Pipe6Reader5entryEv+0xd)[0x7f4534643ecd]
+    /lib/x86_64-linux-gnu/libpthread.so.0(+0x7f8e)[0x7f452f543f8e]
+    /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f452f26da0d]
+    
+    Partially-fixes: #6480
+    Backport: dumpling, emperor
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 1d74170a4c252f35968ccfbec8e432582e92f638)
+
+commit 48895a46015c9d6d67543816f5a400c21aa206b1 (refs/remotes/gh/wip-objectcacher-flusher-dumpling)
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jan 3 12:51:15 2014 -0800
+
+    osdc/ObjectCacher: back off less during flush
+    
+    In cce990efc8f2a58c8d0fa11c234ddf2242b1b856 we added a limit to avoid
+    holding the lock for too long.  However, if we back off, we currently
+    wait for a full second, which is probably a bit much--we really just want
+    to give other threads a chance.
+    
+    Backport: emperor
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e2ee52879e9de260abbf5eacbdabbd71973a6a83)
+
+commit f3b5ba6f25010291a2918bdd286f1b39570bb907
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Oct 1 09:28:29 2013 -0700
+
+    osdc/ObjectCacher: limit writeback IOs generated while holding lock
+    
+    While analyzing a log from Mike Dawson I saw a long stall while librbd's
+    objectcacher was starting lots (many hundreds) of IOs.  Limit the amount of
+    time we spend doing this at a time to allow IO replies to be processed so
+    that the cache remains responsive.
+    
+    I'm not sure this warrants a tunable (which we would need to add for both
+    libcephfs and librbd).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cce990efc8f2a58c8d0fa11c234ddf2242b1b856)
+
+commit 06f27fc6446d47b853208357ec4277c5dc10d9fe
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Apr 8 10:52:43 2014 -0700
+
+    os/FileStore: reset journal state on umount
+    
+    We observed a sequence like:
+    
+     - replay journal
+       - sets JournalingObjectStore applied_op_seq
+     - umount
+     - mount
+       - initiate commit with prevous applied_op_seq
+     - replay journal
+       - commit finishes
+       - on replay commit, we fail assert op > committed_seq
+    
+    Although strictly speaking the assert failure is harmless here, in general
+    we should not let state leak through from a previous mount into this
+    mount or else assertions are in general more difficult to reason about.
+    
+    Fixes: #8019
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4de49e8676748b6ab4716ff24fd0a465548594fc)
+
+commit b29238729f87c73dfdcf16dddcf293577678dea2
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Nov 5 14:54:20 2013 -0800
+
+    rgw: deny writes to a secondary zone by non-system users
+    
+    Fixes: #6678
+    We don't want to allow regular users to write to secondary zones,
+    otherwise we'd end up with data inconsistencies.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 6961b5254f16ac3362c3a51f5490328d23640dbf)
+    
+    Conflicts:
+    	src/rgw/rgw_rados.h
+
+commit 051a17eb008d75aa6b0737873318a2e7273501ab
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Apr 5 16:58:55 2014 -0700
+
+    mon: wait for quorum for MMonGetVersion
+    
+    We should not respond to checks for map versions when we are in the
+    probing or electing states or else clients will get incorrect results when
+    they ask what the latest map version is.
+    
+    Fixes: #7997
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 67fd4218d306c0d2c8f0a855a2e5bf18fa1d659e)
+
+commit 0716516da05eee967796fb71eb2f85c86afc40f1
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Feb 19 08:59:07 2014 -0800
+
+    rgw: fix swift range response
+    
+    Fixes: #7099
+    Backport: dumpling
+    The range response header was broken in swift.
+    
+    Reported-by: Julien Calvet <julien.calvet at neurea.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 0427f61544529ab4e0792b6afbb23379fe722de1)
+
+commit 94a1deefcfe525a7e698a1ae70a3bb561b6157de
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Nov 22 15:41:49 2013 -0800
+
+    rgw: don't log system requests in usage log
+    
+    Fixes: 6889
+    System requets should not be logged in the usage log.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 42ef8ba543c7bf13c5aa3b6b4deaaf8a0f9c58b6)
+
+commit 23fed8fc427e7077c61f86168a42f61a5f73867d
+Author: Greg Farnum <greg at inktank.com>
+Date:   Fri Apr 4 16:06:05 2014 -0700
+
+    OSD: _share_map_outgoing whenever sending a message to a peer
+    
+    This ensures that they get new maps before an op which requires them (that
+    they would then request from the monitor).
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 232ac1a52a322d163d8d8dbc4a7da4b6a9acb709)
+
+commit c45e15fd5cbe57a34c743b2835ecc30ee5a43963
+Author: Xihui He <xihuihe at gmail.com>
+Date:   Mon Dec 30 12:04:10 2013 +0800
+
+    msgr: fix rebind() race
+    stop the accepter and mark all pipes down before rebind to avoid race
+    
+    Fixes: #6992
+    
+    Signed-off-by: Xihui He xihuihe at gmail.com
+    (cherry picked from commit f8e413f9c79a3a2a12801f5f64a2f612de3f06a0)
+
+commit 3d31cf012a59e1fea8080b13bdc06c9021ba0656
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Nov 26 13:20:21 2013 -0800
+
+    PG: retry GetLog() each time we get a notify in Incomplete
+    
+    If for some reason there are no up OSDs in the history which
+    happen to have usable copies of the pg, it's possible that
+    there is a usable copy elsewhere on the cluster which will
+    become known to the primary if it waits.
+    
+    Fixes: #6909
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 964c8e978f86713e37a13b4884a6c0b9b41b5bae)
+
+commit 1f80bbdf45439c7224ed52e4956973fc6d007848
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 17 15:37:44 2014 -0700
+
+    os/FileJournal: return errors on make_writeable() if reopen fails
+    
+    This is why #7738 is resulting in a crash instead of an error.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit aed074401d2834a5b04edd1b7f6b4f36336f6293)
+
+commit 62d942294a54208cdc82aebf8b536d164cae5dc6
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Mar 17 16:21:17 2014 -0700
+
+    mon/Paxos: commit only after entire quorum acks
+    
+    If a subset of the quorum accepts the proposal and we commit, we will start
+    sharing the new state.  However, the mon that didn't yet reply with the
+    accept may still be sharing the old and stale value.
+    
+    The simplest way to prevent this is not to commit until the entire quorum
+    replies.  In the general case, there are no failures and this is just fine.
+    In the failure case, we will call a new election and have a smaller quorum
+    of (live) nodes and will recommit the same value.
+    
+    A more performant solution would be to have a separate message invalidate
+    the old state and commit once we have all invalidations and a majority of
+    accepts.  This will lower latency a bit in the non-failure case, but not
+    change the failure case significantly.  Later!
+    
+    Fixes: #7736
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit fa1d957c115a440e162dba1b1002bc41fc1eac43)
+
+commit 2160c72b393893896be581e89a42c4e37b79cb23
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Mar 13 14:04:19 2014 -0700
+
+    PrioritizedQueue: cap costs at max_tokens_per_subqueue
+    
+    Otherwise, you can get a recovery op in the queue which has a cost
+    higher than the max token value.  It won't get serviced until all other
+    queues also do not have enough tokens and higher priority queues are
+    empty.
+    
+    Fixes: #7706
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 2722a0a487e77ea2aa0d18caec0bdac50cb6a264)
+
+commit 1dd42e0f75fe1f5363f92bd5a4506812e54b8fb5
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Apr 3 13:59:59 2014 -0700
+
+    Fix byte-order dependency in calculation of initial challenge
+    
+    Fixes: #7977
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4dc62669ecd679bc4d0ef2b996b2f0b45b8b4dc7)
+
+commit c66b61f9dcad217429e4876d27881d9fb2e7666f
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Tue Dec 31 17:00:06 2013 -0800
+
+    rbd: return 0 and an empty list when pool is entirely empty
+    
+    rbd_list will return -ENOENT when no rbd_directory object
+    exists. Handle this in the cli tool and interpret it as success with
+    an empty list.
+    
+    Add this to the release notes since it changes command line behavior.
+    
+    Fixes: #6693
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit ac547a5b7dc94282f079aef78e66348d99d9d5e9)
+    
+    Conflicts:
+    	PendingReleaseNotes
+    	src/rbd.cc
+
+commit 60b7aa96abfe09f7e9a263fa3f9b72c556dee8cb
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Nov 20 18:35:34 2013 -0800
+
+    test: use older names for module setup/teardown
+    
+    setUp and tearDown require nosetests 0.11, but 0.10.4 is the latest on
+    centos. Rename to use the older aliases, which still work with newer
+    versions of nosetests as well.
+    
+    Fixes: #6368
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit f753d56a9edba6ce441520ac9b52b93bd8f1b5b4)
+
+commit b405bfa49ec31f0c6d8636c4bdde17ee1f81deb7
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Nov 3 11:06:10 2013 -0800
+
+    OSD: don't clear peering_wait_for_split in advance_map()
+    
+    I really don't know why I added this...  Ops can be discarded from the
+    waiting_for_pg queue if we aren't primary simply because there must have
+    been an exchange of peering events before subops will be sent within a
+    particular epoch.  Thus, any events in the waiting_for_pg queue must be
+    client ops which should only be seen by the primary.  Peering events, on
+    the other hand, should only be discarded if we are in a new interval,
+    and that check might as well be performed in the peering wq.
+    
+    Fixes: #6681
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 9ab513334c7ff9544bac07bd420c6d5d200cf535)
+
+commit a498c940bd630cb103d17ad8532a11122439411d
+Merge: 225fc97 80e0a0a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Apr 2 12:57:30 2014 -0700
+
+    Merge remote-tracking branch 'gh/wip-7888-dumpling' into dumpling
+
+commit 225fc97f228490dfc13c2e4deed8fecffdb28c5e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Nov 5 21:48:53 2013 -0800
+
+    PG: fix operator<<,log_wierdness log bound warning
+    
+    Split may cause holes such that head != tail and yet
+    log.empty().
+    
+    Fixes: #6722
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit c6826c1e8a301b2306530c6e5d0f4a3160c4e691)
+
+commit 26eeab43f3f703a25e7ba62c75d0382d15e38263
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Nov 5 17:47:48 2013 -0800
+
+    PGLog::rewind_divergent_log: log may not contain newhead
+    
+    Due to split, there may be a hole at newhead.
+    
+    Fixes: #6722
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit f4648bc6fec89c870e0c47b38b2f13496742b10f)
+
+commit 040abd75ad45bbcc05b24c9dddbd2026dd35e659
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Mar 29 14:23:21 2014 -0700
+
+    qa/workunits/fs/misc/layout_vxattrs: ceph.file.layout is not listed
+    
+    As of 08a3d6bd428c5e78dd4a10e6ee97540f66f9729c.  A similar change was made
+    in the kernel.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4f9f7f878953b29cd5f56a8e0834832d6e3a9cec)
+
+commit f5aa492a338ff711f3a45e4ebbf0d6b187b5f78e
+Merge: fef70cb 84cb345
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 28 18:01:08 2014 -0700
+
+    Merge pull request #1519 from ceph/wip-6951-dumpling
+    
+    rgw: reset objv tracker on bucket recreation
+
+commit fef70cbb52cf1ad12db45998b38858d9bbc3360d
+Merge: 9bfbce3 f443ff3
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 28 17:02:39 2014 -0700
+
+    Merge pull request #1559 from ceph/wip-7881-dumpling
+    
+    Wip 7881 dumpling
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 80e0a0a8fee2f6f903f612734b2cc72eae703eae (refs/remotes/gh/wip-7888-dumpling)
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 27 21:33:21 2014 -0700
+
+    mon/MonClient: use keepalive2 to verify the mon session is live
+    
+    Verify that the mon is responding by checking the keepalive2 reply
+    timestamp.  We cannot rely solely on TCP timing out and returning an
+    error.
+    
+    Fixes: #7888
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 056151a6334c054505c54e59af40f203a0721f28)
+
+commit 8723218379e80725a449b0594a4b15eb1c236b05
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 27 21:09:13 2014 -0700
+
+    msgr: add KEEPALIVE2 feature
+    
+    This is similar to KEEPALIVE, except a timestamp is also exchanged.  It is
+    sent with the KEEPALIVE, and then returned with the ACK.  The last
+    received stamp is stored in the Connection so that it can be queried for
+    liveness.  Since all of the users of keepalive are already regularly
+    triggering a keepalive, they can check the liveness at the same time.
+    
+    See #7888.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d747d79fd5ea8662a809c5636dfd2eaaa9bf8f5d)
+    
+    Conflicts:
+    
+    	src/include/ceph_features.h
+
+commit a2f0974f8b3567c0385494a0b2c828ade6ca8e1c
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Mar 26 15:58:10 2014 -0700
+
+    Pipe: rename keepalive->send_keepalive
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 38d4c71a456c1cc9a5044dbcae5378836a34484d)
+
+commit 9bfbce30678742515025ca235c4443bb3a69199f
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 26 21:52:00 2014 -0700
+
+    client: pin Inode during readahead
+    
+    Make sure the Inode does not go away while a readahead is in progress.  In
+    particular:
+    
+     - read_async
+       - start a readahead
+       - get actual read from cache, return
+     - close/release
+       - call ObjectCacher::release_set() and get unclean > 0, assert
+    
+    Fixes: #7867
+    Backport: emperor, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f1c7b4ef0cd064a9cb86757f17118d17913850db)
+
+commit 232445578a2c6d0fb974e55378057fce473095f7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 28 12:34:07 2014 -0700
+
+    osdc/ObjectCacher: call read completion even when no target buffer
+    
+    If we do no assemble a target bl, we still want to return a valid return
+    code with the number of bytes read-ahead so that the C_RetryRead completion
+    will see this as a finish and call the caller's provided Context.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 032d4ec53e125ad91ad27ce58da6f38dcf1da92e)
+
+commit f443ff3006d41a7b0a2d7b649e8def0ffef6df12
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Oct 30 16:54:39 2013 -0700
+
+    PGLog: remove obsolete assert in merge_log
+    
+    This assert assumes that if olog.head != log.head, olog contains
+    a log entry at log.head, which may not be true since pg splitting
+    might have left the log with arbitrary holes.
+    
+    Related: 0c2769d3321bff6e85ec57c85a08ee0b8e751bcb
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 353813b2e1a98901b876790c7c531f8a202c661d)
+
+commit 636e53c0f4fc43e9bfc1c8e7214cab9e0b46a359
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Sep 30 15:54:27 2013 -0700
+
+    PGLog: on split, leave log head alone
+    
+    This way last_update doesn't go backwards.
+    
+    Fixes: 6447
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0c2769d3321bff6e85ec57c85a08ee0b8e751bcb)
+
+commit a0a560a9f04311306a9784fa3c6ea2586d637f56
+Merge: 466cd53 41d5e9a
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 26 17:18:24 2014 -0700
+
+    Merge pull request #1539 from ceph/wip-6910-dumpling
+    
+    PG: don't query unfound on empty pgs
+
+commit 41d5e9ab39e69c80bec1cb0627004c3fae6dc81d
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Nov 26 19:17:59 2013 -0800
+
+    PG: don't query unfound on empty pgs
+    
+    When the replica responds, it responds with a notify
+    rather than a log, which the primary then ignores since
+    it is already in the peer_info map.  Rather than fix that
+    we'll simply not send queries to peers we already know to
+    have no unfound objects.
+    
+    Fixes: #6910
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 838b6c8387087543ce50837277f7f6b52ae87d00)
+
+commit 466cd536ed7e541a36d88bce43683a2d9e2ca283
+Merge: 2ef0d6a c188949
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 21 14:53:23 2014 -0700
+
+    Merge pull request #1313 from ceph/dumpling-osd-subscribe
+    
+    Dumpling backport: clean up osd subscriptions
+
+commit 2ef0d6a25bf8c0cfb38768c157c29ba52295f3ca
+Merge: 77e46d0 bdd96c6
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Mar 21 14:52:20 2014 -0700
+
+    Merge pull request #1485 from ceph/wip-7212.dumpling
+    
+    backport 7212 fixes to dumpling
+
+commit 84cb345e4f12a9b1db5e384411492a9d88f17dd8
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Feb 19 08:11:56 2014 -0800
+
+    rgw: reset objv tracker on bucket recreation
+    
+    Fixes: #6951
+    If we cannot create a new bucket (as it already existed), we need to
+    read the old bucket's info. However, this was failing as we were holding
+    the objv tracker that we created for the bucket creation. We need to
+    clear it, as subsequent read using it will fail.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 859ed33ed7f9a96f4783dfb3e130d5eb60c622dd)
+
+commit 77e46d0d7984f2d3ee0e15f27d2961a637c20b45
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Nov 6 14:33:03 2013 -0800
+
+    ReplicatedPG: don't skip missing if sentries is empty on pgls
+    
+    Formerly, if sentries is empty, we skip missing.  In general,
+    we need to continue adding items from missing until we get
+    to next (returned from collection_list_partial) to avoid
+    missing any objects.
+    
+    Fixes: #6633
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit c7a30b881151e08b37339bb025789921e7115288)
+
+commit bdd96c620f33fb8f48f30f8d543af3290e6c934a
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 15 08:59:51 2014 -0800
+
+    mon/Elector: bootstrap on timeout
+    
+    Currently if an election times out we call a new
+    election.  If we have never joined a quorum, bootstrap
+    instead. This is heavier weight, but captures the case
+    where, during bootstrap:
+    
+     - a and b have learned each others' addresses
+     - everybody calls an election
+     - a and b form a quorum
+     - c loops trying to call an election, but is ignored
+       because a and b don't see its address in the monmap
+    
+    See logs:
+      ubuntu at teuthology:/var/lib/teuthworker/archive/sage-2014-02-14_13:50:04-ceph-deploy-wip-7212-sage-b-testing-basic-plana/83194
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a4bcb1f8129a4ece97bd3419abf1ff45d260ad8e)
+    (cherry picked from commit 143ec0281aa8b640617a3fe19a430248ce3b514c)
+
+commit 68fcc63c0423a2071b7b944ea6c3448282a78a09
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 14 11:25:52 2014 -0800
+
+    mon: tell MonmapMonitor first about winning an election
+    
+    It is important in the bootstrap case that the very first paxos round
+    also codify the contents of the monmap itself in order to avoid any manner
+    of confusing scenarios where subsequent elections are called and people
+    try to recover and modify paxos without agreeing on who the quorum
+    participants are.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ad7f5dd481a7f45dfe6b50d27ad45abc40950510)
+    (cherry picked from commit e073a062d56099b5fb4311be2a418f7570e1ffd9)
+
+commit a3e57b7231cb28c2e0a896f747537ebdbe3a4e96
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Feb 14 11:13:26 2014 -0800
+
+    mon: only learn peer addresses when monmap == 0
+    
+    It is only safe to dynamically update the address for a peer mon in our
+    monmap if we are in the midst of the initial quorum formation (i.e.,
+    monmap.epoch == 0).  If it is a later epoch, we have formed our initial
+    quorum and any and all monmap changes need to be agreed upon by the quorum
+    and committed via paxos.
+    
+    Fixes: #7212
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7bd2104acfeff0c9aa5e648d82ed372f901f767f)
+    (cherry picked from commit 1996fd89fb3165a63449b135e05841579695aabd)
+
+commit 21ed54201bd4b0f02c07f6f96a63a5720057f011
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Mon Mar 17 14:37:09 2014 +0000
+
+    ceph.in: do not allow using 'tell' with interactive mode
+    
+    This avoids a lot of hassle when dealing with to whom tell each command
+    on interactive mode, and even more so if multiple targets are specified.
+    
+    As so, 'tell' commands should be used while on interactive mode instead.
+    
+    Backport: dumpling,emperor
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit e39c213c1d230271d23b74086664c2082caecdb9)
+
+commit be0205c33ccbab3b6f105bdf4da114658a981557
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Mar 12 22:56:44 2014 +0100
+
+    RGWListBucketMultiparts: init max_uploads/default_max with 0
+    
+    CID 717377 (#1 of 1): Uninitialized scalar field (UNINIT_CTOR)
+     2. uninit_member: Non-static class member "max_uploads" is not initialized
+        in this constructor nor in any functions that it calls.
+     4. uninit_member: Non-static class member "default_max" is not initialized
+        in this constructor nor in any functions that it calls.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b23a141d54ffb39958aba9da7f87544674fa0e50)
+
+commit 6c3d4fbeb9cc50eca6eba12cfe7fed64b34eec3d
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Mar 13 14:49:30 2014 -0700
+
+    ceph_test_rados: wait for commit, not ack
+    
+    First, this is what we wanted in the first place
+    
+    Second, if we wait for ACK, we may look at a user_version value that is
+    not stable.
+    
+    Fixes: #7705
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f2124c5846f1e9cb44e66eb2e957b8c7df3e19f4)
+    
+    Conflicts:
+    
+    	src/test/osd/RadosModel.h
+
+commit 2daed5ff99dab238b696da5aba3816c4f5d763e8
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Mar 13 09:50:16 2014 -0700
+
+    test-upgrade-firefly: skip watch-notify system test
+    
+    This also fails on mixed version clusters due to watch on a
+    non-existent object returning ENOENT in firefly and 0 in dumpling.
+    
+    Reviewed-by: Sage Weil <sage.weil at inktank.com>
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 90a21d8cf6df5fe14b2dc9b2c175983b6bb017ce
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 12 21:30:12 2014 -0700
+
+    qa/workunit/rados/test-upgrade-firefly: skip watch-notify test
+    
+    A watch on a non-existent object now returns ENOENT in firefly; skip this
+    test as it will fail on a hybrid or upgraded cluster.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit 32fdca6d9c2e3b923db7f21568bd315ab2c1c4ad
+Merge: 6700dd0 cd7986c
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Mar 11 21:33:40 2014 -0700
+
+    Merge pull request #1411 from ceph/wip-7076-dumpling
+    
+    dumpling backport of watchers check for rbd_remove()
+
+commit 6700dd068e236473343d15eee6307d44156958a3
+Author: Ray Lv <xiangyulv at gmail.com>
+Date:   Wed Feb 26 21:17:32 2014 +0800
+
+    rgw: off-by-one in rgw_trim_whitespace()
+    
+    Fixes: #7543
+    Backport: dumpling
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Signed-off-by: Ray Lv <raylv at yahoo-inc.com>
+    (cherry picked from commit 195d53a7fc695ed954c85022fef6d2a18f68fe20)
+
+commit cd7986caf6baee5f9d6498b113b3382e66dd6f77
+Author: Ilya Dryomov <ilya.dryomov at inktank.com>
+Date:   Wed Jan 29 16:12:01 2014 +0200
+
+    rbd: check for watchers before trimming an image on 'rbd rm'
+    
+    Check for watchers before trimming image data to try to avoid getting
+    into the following situation:
+    
+      - user does 'rbd rm' on a mapped image with an fs mounted from it
+      - 'rbd rm' trims (removes) all image data, only header is left
+      - 'rbd rm' tries to remove a header and fails because krbd has a
+        watcher registered on the header
+      - at this point image cannot be unmapped because of the mounted fs
+      - fs cannot be unmounted because all its data and metadata is gone
+    
+    Unfortunately, this fix doesn't make it impossible to happen (the
+    required atomicity isn't there), but it's a big improvement over the
+    status quo.
+    
+    Fixes: http://tracker.ceph.com/issues/7076
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Signed-off-by: Ilya Dryomov <ilya.dryomov at inktank.com>
+    (cherry picked from commit 0a553cfa81b06e75585ab3c39927e307ec0f4cb6)
+
+commit a931aaa6cc104d63b20c0cbe9e3af4006c3abfaf
+Merge: b476d32 f5668b3
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Mar 9 10:56:31 2014 -0700
+
+    Merge pull request #1407 from dachary/wip-7188-dumpling
+    
+    common: ping existing admin socket before unlink (dumpling)
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit f5668b363b0724f385bebded3cbc7f363893f985
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Feb 15 11:43:13 2014 +0100
+
+    common: ping existing admin socket before unlink
+    
+    When a daemon initializes it tries to create an admin socket and unlinks
+    any pre-existing file, regardless. If such a file is in use, it causes
+    the existing daemon to loose its admin socket.
+    
+    The AdminSocketClient::ping is implemented to probe an existing socket,
+    using the "0" message. The AdminSocket::bind_and_listen function is
+    modified to call ping() on when it finds existing file. It unlinks the
+    file only if the ping fails.
+    
+    http://tracker.ceph.com/issues/7188 fixes: #7188
+    
+    Backport: emperor, dumpling
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 45600789f1ca399dddc5870254e5db883fb29b38)
+
+commit b476d324c69d4e6018191a7ffea8c9d6c1dfa008
+Merge: d3e13a7 5133dd6
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 5 14:19:31 2014 -0800
+
+    Merge pull request #1366 from ceph/wip-6820.dumpling
+    
+    mon: OSDMonitor: don't crash if formatter is invalid during osd crush dump
+
+commit d3e13a7cdab42fa33182680f45fe21b4f9dc4b20
+Merge: c218c99 9c626e0
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Mar 5 12:45:57 2014 -0800
+
+    Merge pull request #1377 from ceph/wip-7584
+    
+    qa/workunit/rados/test-upgrade-firely.sh
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 9c626e0b18f538eb60883da01713ba629220e35e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Mar 5 12:37:10 2014 -0800
+
+    qa/workunit/rados/test-upgrade-firely.sh
+    
+    Skip the tests that don't pass when run against firefly OSDs.
+    
+    Fixes: #7584
+    Signed-off-by: Sage Weil <sage at inktank.com>
+
+commit c218c999ecebe41e6de6fde76e85cc765cad8257
+Merge: 0eabbf1 24711cd
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Mar 4 07:28:44 2014 -0800
+
+    Merge pull request #1357 from ceph/wip-dumpling-removewq
+    
+    OSD: ping tphandle during pg removal
+    
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 5133dd60e272d3fcbaacd5662a708ee4cf0db46d
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Nov 22 02:17:16 2013 +0000
+
+    mon: OSDMonitor: don't crash if formatter is invalid during osd crush dump
+    
+    Code would assume a formatter would always be defined. If a 'plain'
+    formatter or even an invalid formatter were to be supplied, the monitor
+    would crash and burn in poor style.
+    
+    Fixes: 6820
+    Backport: emperor
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 49d2fb71422fe4edfe5795c001104fb5bc8c98c3)
+
+commit 24711cd49f85dbe827d41c4bcad2700cd6c42ad7
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Oct 15 13:11:29 2013 -0700
+
+    OSD: ping tphandle during pg removal
+    
+    Fixes: #6528
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    
+    (cherry picked from commit c658258d9e2f590054a30c0dee14a579a51bda8c)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit 0eabbf145e1c44f4d128b192cc77b708f180c968
+Merge: fe8915a 9d5d931
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Feb 25 15:47:05 2014 -0800
+
+    Merge pull request #1316 from ceph/dumpling-6922
+    
+    Dumpling: Prevent extreme PG split multipliers
+    
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit fe8915ae7e182340d1e22154e852895742c7da51
+Merge: 87822cc 5667566
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Feb 25 15:45:45 2014 -0800
+
+    Merge pull request #1315 from ceph/dumpling-hashpspool
+    
+    mon: OSDMonitor: allow (un)setting 'hashpspool' flag via 'osd pool set'
+    
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit 87822ccc862b533132c1fe232dfe4b7b17b816ad
+Merge: 0ae3352 37fbcb9
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Feb 25 15:44:39 2014 -0800
+
+    Merge pull request #1314 from ceph/dumpling-osd-pgstatsack
+    
+    Dumpling osd pgstatsack
+    
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit 5667566313b69dca011e897b2fa752356ad8901b
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Oct 10 17:43:48 2013 -0700
+
+    mon: OSDMonitor: allow (un)setting 'hashpspool' flag via 'osd pool set'
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1c2886964a0c005545abab0cf8feae7e06ac02a8)
+    
+    Conflicts:
+    
+    	src/mon/MonCommands.h
+    	src/mon/OSDMonitor.cc
+    
+    mon: ceph hashpspool false clears the flag
+    instead of toggling it.
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    Reviewed-by: Christophe Courtaut <christophe.courtaut at gmail.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 589e2fa485b94244c79079f249428d4d545fca18
+    
+    Replace some of the infrastructure required by this command that
+    was not present in Dumpling with single-use code.
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+
+commit 9d5d931c60104823b3b20dcfb09480d65ffaa5ed
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Dec 3 10:57:09 2013 -0800
+
+    OSDMonitor: use a different approach to prevent extreme multipliers on PG splits
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d8ccd73968fbd0753ca08916ebf1062cdb4d5ac1)
+    
+    Conflicts:
+    
+    	src/mon/OSDMonitor.cc
+
+commit c0c4448dc7df7900a564a6745903398cd39be7f1
+Author: Greg Farnum <greg at inktank.com>
+Date:   Mon Dec 2 15:13:40 2013 -0800
+
+    OSDMonitor: prevent extreme multipliers on PG splits
+    
+    Fixes: #6922
+    Backport: emperor
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f57dad6461171c903e8b5255eaed300374b00e74)
+    
+    Conflicts:
+    
+    	src/mon/OSDMonitor.cc
+
+commit c1889497b93ae9f0a946b11d9f5f6fcc7427e934
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Feb 22 08:08:37 2014 -0800
+
+    osd: fix off-by-one is boot subscription
+    
+    If we have osdmap N, we want to onetime subscribe
+    starting at N+1.  Among other things, it means we
+    hear when the NOUP flag is cleared.
+    
+    This appears to have broken somewhere around
+    3c76b81f2f96b790b72f2088164ed8e9d5efbba1.
+    
+    Fixes: #7511
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Sam Just <sam.just at inktank.com>
+    (cherry picked from commit 70d23b9a0ad9af5ca35a627a7f93c7e610e17549)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 4584f60653bee0305e85418323d80332ceecd0cf
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Feb 11 12:51:19 2014 -0800
+
+    OSD: use the osdmap_subscribe helper
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3c76b81f2f96b790b72f2088164ed8e9d5efbba1)
+
+commit 61b2aeee7c37e03d5f6691c08c7760c48a85a2e1
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Feb 11 13:34:39 2014 -0800
+
+    OSD: create a helper for handling OSDMap subscriptions, and clean them up
+    
+    We've had some trouble with not clearing out subscription requests and
+    overloading the monitors (though only because of other bugs). Write a
+    helper for handling subscription requests that we can use to centralize
+    safety logic. Clear out the subscription whenever we get a map that covers
+    it; if there are more maps available than we received, we will issue another
+    subscription request based on "m->newest_map" at the end of handle_osd_map().
+    
+    Notice that the helper will no longer request old maps which we already have,
+    and that unless forced it will not dispatch multiple subscribe requests
+    to a single monitor.
+    Skipping old maps is safe:
+    1) we only trim old maps when the monitor tells us to,
+    2) we do not send messages to our peers until we have updated our maps
+    from the monitor.
+    That means only old and broken OSDs will send us messages based on maps
+    in our past, and we can (and should) ignore any directives from them anyway.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6db3ae851d1c936de045390d18b1c6ae95f2a209)
+    
+    Conflicts:
+    
+    	src/osd/OSD.h
+
+commit d93d67d1a315d8abe8d1cd9d7ea83417a19e2406
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Feb 11 13:31:26 2014 -0800
+
+    monc: new fsub_want_increment( function to make handling subscriptions easier
+    
+    Provide a subscription-modifying function which will not decrement
+    the start version.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 5b9c187caf6f7847aaa4a1003d200158dd32bf63)
+
+commit 37fbcb958f79bbfcba57c516b4862a14c52be398
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Feb 12 11:30:15 2014 -0800
+
+    OSD: disable the PGStatsAck timeout when we are reconnecting to a monitor
+    
+    Previously, the timeout counter started as soon as we issued the reopen,
+    but if the reconnect process itself took a while, we might time out and
+    issue another reopen just as we get to the point where it's possible to
+    get work done. Since the mon client has its own reconnect timeouts (that is,
+    the OSD doesn't need to trigger those), we instead disable our timeouts
+    while the reconnect is happening, and then turn them back on again starting
+    from when we get the reconnect callback.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 64cedf6fa3ee309cc96554286bfb805e4ca89439)
+    
+    Conflicts:
+    
+    	src/osd/OSD.cc
+
+commit 9be395e870c50d97604ef41f17667cc566fd84e1
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Feb 12 13:51:48 2014 -0800
+
+    monc: backoff the timeout period when reconnecting
+    
+    If the monitors are systematically slowing down, we don't want to spam
+    them with reconnect attempts every three seconds. Instead, every time
+    we issue a reconnect, multiply our timeout period by a configurable; when
+    we complete the connection, reduce that multipler by 50%. This should let
+    us respond to monitor load.
+    Of course, we don't want to do that for initial startup in the case of a
+    couple down monitors, so don't apply the backoff until we've successfully
+    connected to a monitor at least once.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 794c86fd289bd62a35ed14368fa096c46736e9a2)
+
+commit 8f4c20bdab153d1603cc99186d8d3e3970aa8976
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Feb 12 13:37:50 2014 -0800
+
+    monc: set "hunting" to true when we reopen the mon session
+    
+    If we don't have a connecton to a monitor, we want to retry to another
+    monitor regardless of whether it's the first time or not.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 60da8abe0ebf17ce818d6fcc6391401878123bb7)
+
+commit c6317558e0d3c8c62aecee0d95a839f93303f681
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Feb 11 17:53:56 2014 -0800
+
+    monc: let users specify a callback when they reopen their monitor session
+    
+    Then the callback is triggered when a new session is established, and the
+    daemon can do whatever it likes. There are no guarantees about how long it
+    might take to trigger, though. In particular we call the provided callback
+    while not holding our own lock in order to avoid deadlock. This could lead
+    to some funny ordering from the user's perspective if they call
+    reopen_session() again before getting the callback, but there's no way around
+    that, so they just have to use it appropriately.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1a8c43474bf36bfcf2a94bf9b7e756a2a99f33fd)
+
+commit 0ae335298b85daba5125a3da4ad26d598c76ecab (refs/remotes/gh/multi-object-delete)
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue Feb 11 16:54:05 2014 -0800
+
+    rgw: multi object delete should be idempotent
+    
+    Fixes: #7346
+    When doing a multi object delete, if an object does not exist then we
+    should return a success code for that object.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 8ca3d95bf633ea9616852cec74f02285a03071d5)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
diff --git a/doc/changelog/v0.67.9.txt b/doc/changelog/v0.67.9.txt
new file mode 100644
index 0000000..8ae98cd
--- /dev/null
+++ b/doc/changelog/v0.67.9.txt
@@ -0,0 +1,233 @@
+commit ba340a97c3dafc9155023da8d515eecc675c619a (tag: refs/tags/v0.67.9, refs/remotes/gh/dumpling)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Wed May 21 16:57:02 2014 +0000
+
+    0.67.9
+
+commit b638d19d126646d2a8f6da11067c5f392a62525e
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Fri May 9 09:21:23 2014 +0000
+
+    msg: Fix inconsistent message sequence negotiation during connection reset
+    
+    Backport: firefly, emperor, dumpling
+    
+    Signed-off-by: Guang Yang (yguang at yahoo-inc.com)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit bdee119076dd0eb65334840d141ccdf06091e3c9)
+
+commit 55b1112819ed2e6fd509c09c2c1a2b434d22aac6
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 20 10:46:34 2014 -0700
+
+    OSD::handle_pg_query: on dne pg, send lb=hobject_t() if deleting
+    
+    We will set lb=hobject_t() if we resurrect the pg.  In that case,
+    we need to have sent that to the primary before hand.  If we
+    finish the removal before the pg is recreated, we'll just end
+    up backfilling it, which is ok since the pg doesn't exist anyway.
+    
+    Fixes: #7740
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 04de781765dd5ac0e28dd1a43cfe85020c0854f8)
+    
+    Conflicts:
+    
+    	src/osd/OSD.cc
+
+commit 3b8ab41e1ec86f2ab5c6b4bee3fb4030077e2c21
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 2 14:48:35 2014 -0700
+
+    mon/MonClient: remove stray _finish_hunting() calls
+    
+    Callig _finish_hunting() clears out the bool hunting flag, which means we
+    don't retry by connection to another mon periodically.  Instead, we send
+    keepalives every 10s.  But, since we aren't yet in state HAVE_SESSION, we
+    don't check that the keepalives are getting responses.  This means that an
+    ill-timed connection reset (say, after we get a MonMap, but before we
+    finish authenticating) can drop the monc into a black hole that does not
+    retry.
+    
+    Instead, we should *only* call _finish_hunting() when we complete the
+    authentication handshake.
+    
+    Fixes: #8278
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 77a6f0aefebebf057f02bfb95c088a30ed93c53f)
+
+commit a915350491092abcd2584d0bbb5f5d8610ed89fc
+Merge: bd5d6f1 d4e67ff
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 20 10:19:00 2014 -0700
+
+    Merge pull request #1826 from ceph/wip-8162-dumpling
+    
+    Wip 8162 dumpling
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit bd5d6f116416d1b410d57ce00cb3e2abf6de102b
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu May 15 16:50:43 2014 -0700
+
+    OSD: fix an osdmap_subscribe interface misuse
+    
+    When calling osdmap_subscribe, you have to pass an epoch newer than the
+    current map's. _maybe_boot() was not doing this correctly -- we would
+    fail a check for being *in* the monitor's existing map range, and then
+    pass along the map prior to the monitor's range. But if we were exactly
+    one behind, that value would be our current epoch, and the request would
+    get dropped. So instead, make sure we are not *in contact* with the monitor's
+    existing map range.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 290ac818696414758978b78517b137c226110bb4)
+
+commit c5ae8ffc281ac538dd0966a552a6cf729728e925
+Merge: fced056 8d991fa
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 19 13:45:50 2014 -0700
+
+    Merge pull request #1827 from ceph/wip-6565-dumpling
+    
+    Wip 6565 dumpling
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit 8d991fa2c3fdbfd9178d93e4ca33d47504a37195
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Oct 16 10:07:37 2013 -0700
+
+    OSD: check for splitting when processing recover/backfill reservations
+    
+    Fixes: 6565
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 15ec5332ba4154930a0447e2bcf1acec02691e97)
+
+commit d4e67ff3037a3cc7ae2ecc9e1d8d086c45ae515a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 8 13:25:32 2014 -0700
+
+    ReplicatedPG::recover_backfill: do not update last_backfill prematurely
+    
+    Previously, we would update last_backfill on the backfill peer to
+    
+    backfills_in_flight.empty() ? backfill_pos :
+      backfills_in_flight.begin()->first
+    
+    which is actually the next backfill to complete.  We want to update
+    last_backfill to the largest completed backfill instead.
+    
+    We use the pending_backfill_updates mapping to identify the most
+    recently completed backfill.  Due to the previous patch, deletes
+    will also be included in that mapping.
+    
+    Related sha1s from master:
+    4139e75d63b0503dbb7fea8036044eda5e8b7cf1
+    7a06a71e0f2023f66d003dfb0168f4fe51eaa058
+    
+    We don't really want to backport those due to the changes in:
+    9ec35d5ccf6a86c380865c7fc96017a1f502560a
+    
+    This patch does essentially the same thing, but using backfill_pos.
+    
+    Fixse: #8162
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit d620b13c51fc69b509824177af32de55c89c2259
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Oct 28 16:03:25 2013 -0700
+
+    ReplicatedPG: add empty stat when we remove an object in recover_backfill
+    
+    Subsequent updates to that object need to have their stats added
+    to the backfill info stats atomically with the last_backfill
+    update.
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit ecddd12b01be120fba87f5ac60539f98f2c69a28)
+
+commit fced0562f6b80035cd522cc81bdc844ccc92d9bc
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Nov 27 13:34:00 2013 -0800
+
+    rgw: don't error out on empty owner when setting acls
+    
+    Fixes: #6892
+    Backport: dumpling, emperor
+    s3cmd specifies empty owner field when trying to set acls on object
+    / bucket. We errored out as it didn't match the current owner name, but
+    with this change we ignore it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 14cf4caff58cc2c535101d48c53afd54d8632104)
+
+commit 0e685c68aa6a500aa7fa433cd9b8246f70c5383e
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Apr 21 15:34:04 2014 -0700
+
+    rgw: send user manifest header field
+    
+    Fixes: #8170
+    Backport: firefly
+    If user manifest header exists (swift) send it as part of the object
+    header data.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 5cc5686039a882ad345681133c9c5a4a2c2fd86b)
+
+commit 20383e359cdfbf146838742fa050ec4b6073271d
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Fri Apr 11 15:03:37 2014 +0800
+
+    client: add asok command to kick sessions that were remote reset
+    
+    Fixes: #8021
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit 09a1bc5a4601d356b9cc69be8541e6515d763861)
+
+commit 4e5e41deeaf91c885773d90e6f94da60f6d4efd3
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Apr 18 13:50:11 2014 -0700
+
+    osd: throttle snap trimmming with simple delay
+    
+    This is not particularly smart, but it is *a* knob that lets you make
+    the snap trimmer slow down.  It's a flow and a simple delay, so it is
+    adjustable at runtime.  Default is 0 (no change in behavior).
+    
+    Partial solution for #6278.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4413670d784efc2392359f0f22bca7c9056188f4)
+
+commit 14650b282ecd344025714a4e743b255ae01b3ce0
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Apr 1 16:01:28 2014 -0700
+
+    PG: only complete replicas should count toward min_size
+    
+    Backport: emperor,dumpling,cuttlefish
+    Fixes: #7805
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0d5d3d1a30685e7c47173b974caa12076c43a9c4)
+
+commit 3f1d7f5e0a67ad646de465335fb7ee00eb07e220
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 2 15:10:43 2014 -0700
+
+    mon/PGMonitor: set tid on no-op PGStatsAck
+    
+    The OSD needs to know the tid.  Both generally, and specifically because
+    the flush_pg_stats may be blocking on it.
+    
+    Fixes: #8280
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 5a6ae2a978dcaf96ef89de3aaa74fe951a64def6)
diff --git a/doc/changelog/v0.72.2.txt b/doc/changelog/v0.72.2.txt
new file mode 100644
index 0000000..66fd667
--- /dev/null
+++ b/doc/changelog/v0.72.2.txt
@@ -0,0 +1,189 @@
+commit a913ded2ff138aefb8cb84d347d72164099cfd60
+Author: Gary Lowell <gary.lowell at inktank.com>
+Date:   Fri Dec 20 19:28:37 2013 +0000
+
+    v0.72.2
+
+commit b570c8014325fef590d16e6157cb33026155932c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Dec 18 13:11:01 2013 -0800
+
+    rgw: fix use-after-free when releasing completion handle
+
+    Backport: emperor, dumpling
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c8890ab2d46fe8e12200a0d2f9eab31c461fb871)
+
+commit 451381b4dba9d50fbee2accf5d75562615001ef3
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Dec 18 13:10:21 2013 -0800
+
+    rgw: don't return data within the librados cb
+
+    Fixes: #7030
+    The callback is running within a single Finisher thread, thus we
+    shouldn't block there. Append read data to a list and flush it within
+    the iterate context.
+
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit d6a4f6adfaa75c3140d07d6df7be03586cc16183)
+
+commit c044b218cb32d7ef2f2aa5db81ebf38ad0dc1049
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Dec 1 22:21:31 2013 -0800
+
+    Partial revert "mon: osd pool set syntax relaxed, modify unit tests"
+
+    This reverts commit 08327fed8213a5d24cd642e12b38a171b98924cb, except
+    for the hashpspool bit.  We switched back to an integer argument in
+    commit 337195f04653eed8e8f153a5b074f3bd48408998.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e80ab94bf44e102fcd87d16dc11e38ca4c0eeadb)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 1983ed8013637e9b80ca4a0e8d2800d6a36b120e
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Nov 19 23:21:11 2013 +0000
+
+    mon: OSDMonitor: drop cmdval_get() for unused variable
+
+    We don't ever use any value as a float, so just drop obtaining it.  This
+    makes it easier to partially revert 2fe0d0d9 in an upcoming patch.
+
+    Backport: emperor
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 7191bb2b2485c7819ca7b9d9434d803d0c94db7a)
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit 1c4759cebb11ae1aa84aa3cbdb2b31e6d111f28e
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Nov 22 02:10:35 2013 +0000
+
+    mon: OSDMonitor: receive CephInt on 'osd pool set' instead on CephString
+
+    This partially reverts 2fe0d0d9 in order to allow Emperor monitors to
+    forward mon command messages to Dumpling monitors without breaking a
+    cluster.
+
+    The need for this patch became obvious after issue #6796 was triggered.
+    Basically, in a mixed cluster of Emperor/Dumpling monitors, if a client
+    happens to obtain the command descriptions from an Emperor monitor and
+    then issue an 'osd pool set' this can turn out in one of two ways:
+
+    1. client msg gets forwarded to an Emperor leader and everything's a-okay;
+    2. client msg gets forwarded to a Dumpling leader and the string fails to
+    be interpreted without the monitor noticing, thus leaving the monitor with
+    an uninitialized variable leading to trouble.
+
+    If 2 is triggered, a multitude of bad things can happen, such as thousands
+    of pg splits, due to a simple 'osd set pool foo pg_num 128' turning out
+    to be interpreted as 109120394 or some other random number.
+
+    This patch is such that we make sure the client sends an integer instead
+    of a string. We also make sure to interpret anything the client sends as
+    possibly being a string, or an integer.
+
+    Fixes: 6796
+    Backport: emperor
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 337195f04653eed8e8f153a5b074f3bd48408998)
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit c2e467b42dfaecf082a3838b10e873f9f8bd5633
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Nov 25 13:43:43 2013 -0800
+
+    init, upstart: prevent daemons being started by both
+
+    There can be only one init system starting a daemon. If there is a
+    host entry in ceph.conf for a daemon, sysvinit would try to start it
+    even if the daemon's directory did not include a sysvinit file. This
+    preserves backwards compatibility with older installs using sysvinit,
+    but if an upstart file is present in the daemon's directory, upstart
+    will try to start them, regardless of host entries in ceph.conf.
+
+    If there's an upstart file in a daemon's directory and a host entry
+    for that daemon in ceph.conf, both sysvinit and upstart would attempt
+    to manage it.
+
+    Fix this by only starting daemons if the marker file for the other
+    init system is not present. This maintains backwards compatibility
+    with older installs using neither sysvinit or upstart marker files,
+    and does not break any valid configurations. The only configuration
+    that would break is one with both sysvinit and upstart files present
+    for the same daemon.
+
+    Backport: emperor, dumpling
+    Reported-by: Tim Spriggs <tims at uahirise.org>
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 5e34beb61b3f5a1ed4afd8ee2fe976de40f95ace)
+
+commit 8812c4e958b154ca401c7257fd48ccaffe013639
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Nov 27 13:34:00 2013 -0800
+
+    rgw: don't error out on empty owner when setting acls
+
+    Fixes: #6892
+    Backport: dumpling, emperor
+    s3cmd specifies empty owner field when trying to set acls on object
+    / bucket. We errored out as it didn't match the current owner name, but
+    with this change we ignore it.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 14cf4caff58cc2c535101d48c53afd54d8632104)
+
+commit 69e055f367ae37dd771c050f158d684e2a3cb246
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri Nov 22 07:04:01 2013 -0800
+
+    rgw: lower some debug message
+
+    Fixes: #6084
+    Backport: dumpling, emperor
+
+    Reported-by: Ron Allred <rallred at itrefined.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b35fc1bc2ec8c8376ec173eb1c3e538e02c1694e)
+
+commit 53951fd5459d6396b6ab59b52dc33df0ebcf4414
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Nov 12 15:15:26 2013 -0800
+
+    ReplicatedPG: test for missing head before find_object_context
+
+    find_object_context doesn't return EAGAIN for a missing head.
+    I chose not to change that behavior since it might hide bugs
+    in the future.  All other callers check for missing on head
+    before calling into find_object_context because we potentially
+    need head or snapdir to map a snapid onto a clone.
+
+    Backport: emperor
+    Fixes: 6758
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    Reviewed-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit dd9d8b020286d5e3a69455023c3724a7b436d687)
+
+commit 83ee6843de6432278dc2891526691006c51eb1fa
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Nov 18 14:39:12 2013 -0800
+
+    osd: fix bench block size
+
+    The command was declared to take 'size' in dumpling, but was trying to
+    read 'bsize' instead, so it always used the default of 4MiB. Change
+    the bench command to read 'size', so it matches what existing clients
+    are sending.
+
+    Fixes: #6795
+    Backport: emperor, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 40a76ef0d09f8ecbea13712410d9d34f25b91935)
diff --git a/doc/changelog/v0.80.1.txt b/doc/changelog/v0.80.1.txt
new file mode 100644
index 0000000..70d6fd6
--- /dev/null
+++ b/doc/changelog/v0.80.1.txt
@@ -0,0 +1,216 @@
+commit a38fe1169b6d2ac98b427334c12d7cf81f809b74 (tag: refs/tags/v0.80.1)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon May 12 15:12:54 2014 +0000
+
+    0.80.1
+
+commit ab873622c6d41bc8053a1d205da2e4b55e77351d
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon May 12 15:11:33 2014 +0000
+
+    0.80.1
+
+commit 03e7d1d550132a55e87972123d5bc3c0bb0cc981
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon May 12 15:10:56 2014 +0000
+
+    0.80.1
+
+commit 7a4919c7fa10020643df09e012376e4b563ca17d
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon May 12 15:09:01 2014 +0000
+
+    0.80.1
+
+commit ce852b29dc5cf9857a6bfeef7839293cfadf1877 (refs/remotes/gh/firefly)
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 2 16:21:26 2014 -0700
+
+    Revert "ReplicatedPG: block scrub on blocked object contexts"
+
+    This reverts commit e66f2e36c06ca00c1147f922d3513f56b122a5c0.
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+    0f3235d46c8fd6c537bd4aa8a3faec6c00f311a8 is the firefly commit
+    corresponding to e66f2e36c06ca00c1147f922d3513f56b122a5c0.
+
+    (cherry picked from commit 84728058dbb91b8ed062240b3373b18078f0c9ca)
+
+commit db8873b69c73b40110bf1512c114e4a0395671ab
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue May 6 16:55:27 2014 -0700
+
+    rgw: fix stripe_size calculation
+
+    Fixes: #8299
+    Backport: firefly
+    The stripe size calculation was broken, specifically affected cases
+    where we had manifest that described multiple parts.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 9968b938b5d47fdf3a67db134bd2ea6bf3a28086)
+
+commit e0fb2e63074d5f71679bb68656336f68e8190f39
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue May 6 11:06:29 2014 -0700
+
+    rgw: cut short object read if a chunk returns error
+
+    Fixes: #8289
+    Backport: firefly, dumpling
+    When reading an object, if we hit an error when trying to read one of
+    the rados objects then we should just stop. Otherwise we're just going
+    to continue reading the rest of the object, and since it can't be sent
+    back to the client (as we have a hole in the middle), we end up
+    accumulating everything in memory.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 03b0d1cfb7bd30a77fedcf75eb06476b21b14e95)
+
+commit 328665db17bf87d36a3dcbf5f0d0d1a9410e2f96
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Apr 21 15:34:04 2014 -0700
+
+    rgw: send user manifest header field
+
+    Fixes: #8170
+    Backport: firefly
+    If user manifest header exists (swift) send it as part of the object
+    header data.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 5cc5686039a882ad345681133c9c5a4a2c2fd86b)
+
+commit cdb0fac29693fb0250b515891804c4c7fd3045c7
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Fri Apr 11 15:03:37 2014 +0800
+
+    client: add asok command to kick sessions that were remote reset
+
+    Fixes: #8021
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit 09a1bc5a4601d356b9cc69be8541e6515d763861)
+
+commit 4a91196bf49936471a731f9316ef904fda982b26
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Apr 18 13:50:11 2014 -0700
+
+    osd: throttle snap trimmming with simple delay
+
+    This is not particularly smart, but it is *a* knob that lets you make
+    the snap trimmer slow down.  It's a flow and a simple delay, so it is
+    adjustable at runtime.  Default is 0 (no change in behavior).
+
+    Partial solution for #6278.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4413670d784efc2392359f0f22bca7c9056188f4)
+
+commit 3ba2e228db1829a02f9cd31225672604fdc8adf7
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 2 14:48:35 2014 -0700
+
+    mon/MonClient: remove stray _finish_hunting() calls
+
+    Callig _finish_hunting() clears out the bool hunting flag, which means we
+    don't retry by connection to another mon periodically.  Instead, we send
+    keepalives every 10s.  But, since we aren't yet in state HAVE_SESSION, we
+    don't check that the keepalives are getting responses.  This means that an
+    ill-timed connection reset (say, after we get a MonMap, but before we
+    finish authenticating) can drop the monc into a black hole that does not
+    retry.
+
+    Instead, we should *only* call _finish_hunting() when we complete the
+    authentication handshake.
+
+    Fixes: #8278
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 77a6f0aefebebf057f02bfb95c088a30ed93c53f)
+
+commit 383f6440ce34b0d84c0dfa06f561896dad6862f4
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 2 16:41:26 2014 -0700
+
+    osd/ReplicatedPG: fix trim of in-flight hit_sets
+
+    We normally need to stat the hit_set to know how many bytes to adjust the
+    stats by.  If the hit_set was just written, we will get ENOENT.
+
+    Get the obc instead, which will either get the in-memory copy (because the
+    repop is still in flight) or load it off of disk.
+
+    Fixes: #8283
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 72fdd557c35cb721d4b502c5a8f68c878f11a19c)
+
+commit ef35448e63916102261ff6198f2c0ab4e4a57e9b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 6 11:01:27 2014 -0700
+
+    osd/ReplicatedPG: fix whiteouts for other cache mode
+
+    We were special casing WRITEBACK mode for handling whiteouts; this needs to
+    also include the FORWARD and READONLY modes.  To avoid having to list
+    specific cache modes, though, just check != NONE.
+
+    Fixes: #8296
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3e387d62ed95898db8a7d7163c2bacc363b8f617)
+
+commit e7df73dd7aaf5a0b1171f73d6695d26cd25b7b35
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 1 16:53:17 2014 -0700
+
+    osd: Prevent divide by zero in agent_choose_mode()
+
+    Fixes: #8175
+    Backport: firefly
+
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f47f867952e6b2a16a296c82bb9b585b21cde6c8)
+
+commit 022d467b5d6b77c17b6fdaeec8369cae61e9e5a4
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon Apr 21 23:52:04 2014 -0700
+
+    osd, common: If agent_work() finds no objs to work on delay 5 (default) secs
+
+    Add config osd_agent_delay_time of 5 seconds
+    Honor delay by ignoring agent_choose_mode() calls
+    Add tier_delay to logger
+    Treat restart after delay like we were previously idle
+
+    Fixes: #8113
+    Backport: firefly
+
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit b7d31e5f5952c631dd4172bcb825e77a13fc60bc)
+
+commit 6a55c3bc3caf46652e962fa9434900fb494d1e6c
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Thu May 1 18:54:30 2014 -0700
+
+    osd/ReplicatedPG: agent_work() fix next if finished early due to start_max
+
+    Backport: firefly
+
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 9cf470cac8dd4d8f769e768f2de6b9eb67a3c3af)
+
+commit 1b899148a729235ab2835d368077f18e62a36a93
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Sat May 3 12:53:06 2014 +0800
+
+    Fix clone problem
+
+    When clone happened, the origin header also will be updated in GenericObjectMap,
+    so the new header wraper(StripObjectHeader) should be updated too.
+
+    Fix #8282
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 3aee1e0ffe0583f74c02d9c9e86c7fb267f3515c)
diff --git a/doc/changelog/v0.80.10.txt b/doc/changelog/v0.80.10.txt
new file mode 100644
index 0000000..be82bcc
--- /dev/null
+++ b/doc/changelog/v0.80.10.txt
@@ -0,0 +1,3308 @@
+commit ea6c958c38df1216bf95c927f143d8b13c4a9e70 (tag: refs/tags/v0.80.10)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Thu Jun 18 09:48:56 2015 -0700
+
+    0.80.10
+
+commit 9b7f09e280b4610b9f85ac34ec014018f0e2e1d3
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 17 09:35:28 2015 -0700
+
+    qa/workunits/rados/test-upgarde-v9.0.1: fix exclude syntax
+    
+    It's -, then a list of all exclusions separated by :.  There are just 2.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 78d894a634d727a9367f809a1f57234e5e6935be)
+
+commit 4e28fbc52db7d808aeaede884f342beafb7fc581
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jun 16 21:05:29 2015 -0700
+
+    qa/workunits/rados/test-upgrade-v9.0.1: skip one more evict test
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3e8d60a80ce31860eac76a1f6489a35e1795a0c0)
+
+commit 34ba3719997fed6d0b8148f21e59b446bdf42962
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Jun 15 15:12:43 2015 -0700
+
+    qa: add compatibility filtered rados api tests for upgrades
+    
+    Post-9.0.1, the evict op returns success when an object doesn't exist
+    in the cache tier. Skip the tests that are incompatible across
+    versions.
+    
+    Fixes: #11548
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 348a3d3c9880e7d022e71a2faafe51c8f771406e)
+
+commit d1f478200342f422ee6e563bf7aad54ba38b3ed3
+Merge: d0f9c5f 7f1abd9
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 10 15:03:48 2015 -0700
+
+    Merge pull request #4924 from ceph/wip-11955-firefly
+    
+    11955: ceph.spec.in: package mkcephfs on EL6
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 7f1abd9053088ded6613aeca4e7c9489c44910e4
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Wed Jun 10 15:43:41 2015 -0600
+
+    ceph.spec.in: package mkcephfs on EL6
+    
+    Commit efbca0465c2946e113771966df08cf7cf37b1196 added mkcephfs to the
+    RPM %files listing, but this /usr/sbin path is only correct for CentOS
+    7. In CentOS 6, the utility is present at /sbin/mkcephfs instead. This
+    causes rpmbuild to fail to build the tip of the firefly branch on EL6.
+    
+    Adjust the RPM %files list so we properly package mkcephfs on both EL7
+    and EL6.
+    
+    http://tracker.ceph.com/issues/11955 Refs: #11955
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit d0f9c5f47024f53b4eccea2e0fde9b7844746362
+Merge: efbca04 9930138
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Jun 4 19:07:03 2015 +0200
+
+    Merge pull request #4851 from ceph/wip-10873-firefly
+    
+    rgw: generate the "Date" HTTP header for civetweb.
+
+commit 99301384be96997203682679c0430ca0a53be5d3 (refs/remotes/gh/wip-10873-firefly)
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Wed Feb 18 15:48:43 2015 +0100
+
+    rgw: generate the "Date" HTTP header for civetweb.
+    
+    Fixes: #10873
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit ea384f83b601f60e135c3d3f960fdb75a919dd84)
+
+commit efbca0465c2946e113771966df08cf7cf37b1196
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 3 13:03:50 2015 -0400
+
+    ceph.spec: add mkcephfs to ceph.rpm
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit e785f1a2bb4cd77b0aaaccd78060183157ad842e
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Tue Dec 2 13:58:10 2014 -0700
+
+    packaging: package ceph-disk(8)
+    
+    The ceph-disk man page was added in
+    a450cab2b8148cb8a9b043d629feccf89e5aabac, but this was not added to the
+    RPM or DEB packaging. Add it here.
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit b743a951114b00bbb6e14fb88f1928b504bc0f8b)
+
+commit 819cf6ddb986b37c5d1229c4ea330010e88bb615
+Merge: e93711a 665a857
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Jun 2 19:53:03 2015 +0300
+
+    Merge pull request #4780 from oritwas/wip-10295-firefly
+    
+    rgw: civetweb should use unique request id
+    
+    Reviewd-by: Yehuda Sadeh <yehuda at rehat.com>
+
+commit e93711a40d680230b03fe722a4da49a6f9a9b667
+Merge: 071c943 50e8579
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Jun 2 19:02:07 2015 +0300
+
+    Merge pull request #4829 from oritwas/wip-negative_content_length-firefly
+    
+    rgw: don't allow negative / invalid content length
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 50e85797507a3ba13193f368cff461c08e44a9b3
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Aug 1 16:15:36 2014 -0700
+
+    rgw: don't allow negative / invalid content length
+    
+    Certain frontends (e.g., civetweb) don't filter such requests.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 0e74b7a1d56733358e2f1d3df4386125a94c2966)
+
+commit 071c94385ee71b86c5ed8363d56cf299da1aa7b3
+Merge: 68211f6 c632ef1
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed May 27 15:36:15 2015 -0700
+
+    Merge pull request #4766 from SUSE/wip-11673-firefly
+    
+    Debian: ceph-test and rest-bench debug packages should require their respective binary packages
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 665a85701177230365e43a351d7722cb2adbde93
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Apr 23 17:36:47 2015 +0200
+
+    rgw: civetweb should use unique request id
+    
+    max_req_id was moved to RGWRados and changed to atomic64_t.
+    
+    The same request id resulted in gc giving the same idtag to all objects
+    resulting in a leakage of rados objects. It only kept the last deleted object in
+    it's queue, the previous objects were never freed.
+    
+    Fixes: 10295
+    Backport: Hammer, Firefly
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit c262259)
+    
+    Conflicts:
+    	src/rgw/rgw_main.cc
+    	src/rgw/rgw_rados.h
+
+commit c632ef13e05654d0e5ddc79fc7e9553cad8cbed0
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Mon May 18 10:50:58 2015 -0600
+
+    debian: set rest-bench-dbg ceph-test-dbg dependencies
+    
+    Debian's debug packages ought to depend on their respective binary
+    packages. This was the case for many of our ceph packages, but it was
+    not the case for ceph-test-dbg or rest-bench-dbg.
+    
+    Add the dependencies on the relevant binary packages, pinned to
+    "= ${binary:Version}" per convention.
+    
+    http://tracker.ceph.com/issues/11673 Fixes: #11673
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit f898ec1e4e3472b0202280f09653a769fc62c8d3)
+
+commit 68211f695941ee128eb9a7fd0d80b615c0ded6cf
+Merge: 7d11b19 cd8f183
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 18 14:25:59 2015 +0200
+
+    Merge pull request #4697 from ceph/wip-11622-firefly
+    
+    Wip 11622 firefly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit cd8f1830eb5d7ff75b17d7f0915ee4b3b834b149 (refs/remotes/gh/wip-11622-firefly)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed May 13 17:05:22 2015 -0700
+
+    rgw: merge manifests correctly when there's prefix override
+    
+    Fixes: #11622
+    Backport: hammer, firefly
+    
+    Prefix override happens in a manifest when a rados object does not
+    conform to the generic prefix set on the manifest. When merging
+    manifests (specifically being used in multipart objects upload), we need
+    to check if the rule that we try to merge has a prefix that is the same
+    as the previous rule. Beforehand we checked if both had the same
+    override_prefix setting, but that might not apply as both manifests
+    might have different prefixes.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 389ae6739ddc6239a4dd7c5f7f9bfc9b645b8577)
+
+commit eef3d2f1c400573db90936fd417769183950b6ee
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue May 12 16:40:10 2015 -0700
+
+    rgw: restore buffer of multipart upload after EEXIST
+    
+    Fixes #11604
+    Backport: hammer, firefly
+    
+    When we need to restart a write of part data, we need to revert to
+    buffer to before the write, otherwise we're going to skip some data.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 580ccaec12daae64c38a1616d0be907bdd70a888)
+
+commit 7d11b19003503a9db1572d01f7a170e35b29017d
+Merge: 114f2e9 9b33965
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 15 10:27:42 2015 -0700
+
+    Merge pull request #4414 from xinxinsh/wip-11125-firefly
+    
+    rgw: keystone token cache does not work correctly
+
+commit 114f2e9bb5665760a5be9816785508f1c97662d5
+Merge: ac7d28a f33effc
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri May 15 17:03:04 2015 +0200
+
+    Merge pull request #4415 from xinxinsh/wip-11244-firefly
+    
+    cancel_pull: requeue waiters
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit ac7d28a6977084da0b70a3f2d0a54c8fa55b16fa
+Merge: f273792 1f6b1bb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri May 15 17:02:27 2015 +0200
+
+    Merge pull request #4416 from xinxinsh/wip-10976-firefly
+    
+    fix PG::all_unfound_are_queried_or_lost for non-existent osds
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f273792c675aca95694cd36794d8a854731bf308
+Merge: 8a6632b 019b28b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri May 15 17:02:05 2015 +0200
+
+    Merge pull request #4556 from xinxinsh/wip-11429-firefly
+    
+    OSD::load_pgs: we need to handle the case where an upgrade from earlier versions which ignored non-existent pgs resurrects a pg with a prehistoric osdmap
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 8a6632b4e5ffad305f92c89656b161a521529e45
+Merge: 156c385 a71f309
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu May 14 09:50:28 2015 -0700
+
+    Merge pull request #4638 from SUSE/wip-11453-firefly
+    
+    run RGW as root
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 019b28b6397dbc3111faa6a8eb57349a48f408d8
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Apr 20 23:45:57 2015 -0700
+
+    OSD: handle the case where we resurrected an old, deleted pg
+    
+    Prior to giant, we would skip pgs in load_pgs which were not present in
+    the current osdmap.  Those pgs would eventually refer to very old
+    osdmaps, which we no longer have causing the assertion failure in 11429
+    once the osd is finally upgraded to a version which does not skip the
+    pgs.  Instead, if we do not have the map for the pg epoch, complain to
+    the osd log and skip the pg.
+    
+    Fixes: 11429
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit fbfd50de5b9b40d71d2e768418a8eca28b1afaca)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+            resolved by add a new comment line
+
+commit 156c385ef726e56d219c3383a4015c50aec2758a
+Merge: fcd0ea3 8cc4bc1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue May 12 13:57:36 2015 +0200
+
+    Merge pull request #4379 from ceph/wip-11416
+    
+    rgw: use correct objv_tracker for bucket instance
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a71f3091a4ea810c02517642fb4ab9ce5516b452
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Wed Apr 22 16:36:42 2015 -0600
+
+    init-radosgw: run RGW as root
+    
+    The ceph-radosgw service fails to start if the httpd package is not
+    installed. This is because the init.d file attempts to start the RGW
+    process with the "apache" UID. If a user is running civetweb, there is
+    no reason for the httpd or apache2 package to be present on the system.
+    
+    Switch the init scripts to use "root" as is done on Ubuntu.
+    
+    http://tracker.ceph.com/issues/11453 Refs: #11453
+    
+    Reported-by: Vickey Singh <vickey.singh22693 at gmail.com>
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 47339c5ac352d305e68a58f3d744c3ce0fd3a2ac)
+
+commit fcd0ea3383582e7a1dc8091e7a48e1d4bbaa76ee
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Fri May 8 11:29:44 2015 -0700
+
+    workunits: remove defunct cephfs set_layout test
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+
+commit df053b86a89edf8f390400dad8c5e654e14df327
+Merge: aef0272 62645d3
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed May 6 13:07:11 2015 -0700
+
+    Merge pull request #4571 from ceph/wip-11256-firefly
+    
+    Wip 11256 firefly
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit aef0272d72afaef849b5d4acbf55626033369ee8
+Author: Noah Watkins <noahwatkins at gmail.com>
+Date:   Fri Mar 27 19:34:12 2015 -0700
+
+    java: libcephfs_jni.so is in /usr/lib64 on rhel
+    
+    Signed-off-by: Noah Watkins <noahwatkins at gmail.com>
+    (cherry picked from commit aed3434dc7c5161c72c7d5655faa3bc693fc9777)
+
+commit a551a23d36e3f30ff5b0679a98ee760166ae47ae
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Mon Mar 2 21:04:25 2015 +0800
+
+    qa/workunits/fs/misc: fix filelock_interrupt.py
+    
+    Handle the case that kernel does not support fcntl.F_OFD_SETLK.
+    Also fix the code that checks if fnctl fails with errno == EINTR.
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 4ececa3dc4a21b98f61a592da9e2be60a0d71625)
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 07031b151b4ac6677b1f663ac200d09088deff64
+Merge: 83f8d43 3fb97e2
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Apr 30 00:32:21 2015 +0200
+
+    Merge pull request #4385 from xinxinsh/wip-11199-firefly
+    
+    osd: ENOENT on clone
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 83f8d434a5c245711922ea43a962160177aa5a40
+Merge: f1425e0 29bc9e5
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Apr 30 00:31:48 2015 +0200
+
+    Merge pull request #4384 from xinxinsh/wip-11197-firefly
+    
+    pg stuck stale after create with activation delay
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f1425e093e00343a5ae4b9ff56911bf654a5c152
+Merge: e980e00 69d9339
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Apr 30 00:31:32 2015 +0200
+
+    Merge pull request #4382 from xinxinsh/wip-10718-firefly
+    
+    osd/PGLog.h: 279: FAILED assert(log.log.size() == log_keys_debug.size())
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit e980e0036909afc392f9bdf5532ce500af602c2f
+Merge: b36229b 110c354
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Apr 30 00:23:04 2015 +0200
+
+    Merge pull request #4185 from ldachary/wip-11156-firefly
+    
+    FAILED assert(soid < scrubber.start || soid >= scrubber.end)
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit b36229b5aeec669cd1494f47120ae207a393846f
+Merge: da75978 20c2175
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Apr 28 08:11:18 2015 -0700
+
+    Merge pull request #4475 from ceph/wip-9538.firefly
+    
+    mon: OSDMonitor: fallback to json-pretty in case of invalid formatter
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 20c2175352c9d4e4d0e709d294fe6fe0695761cc
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Sep 19 15:28:36 2014 +0200
+
+    mon: osd find / metadata --format plain fallback
+    
+    ceph --format plain osd find 1 (and metadata) are not implemented and
+    must fallback to the default (json-pretty).
+    
+    http://tracker.ceph.com/issues/9538 Fixes: #9538
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 13780d755115387591888f94ea6c58ac0db3ecc4)
+
+commit da759784ebda11275106c3b280f1d32b64ade00a
+Merge: 1a10a7e e1d5773
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Apr 27 10:30:49 2015 -0700
+
+    Merge pull request #4453 from ceph/wip-11454
+    
+    PG::actingset should be used when checking the number of acting OSDs for...
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1a10a7eac190249a41b5200f0cc5e3863e76c31d
+Merge: a860e2b b9da6f1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Apr 27 10:14:00 2015 +0200
+
+    Merge pull request #4245 from ceph/wip-11113-firefly
+    
+    librbd: snap_remove should ignore -ENOENT errors
+    
+    Reviewed-by: Shu, Xinxin <xinxin.shu at intel.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a860e2b3c02ef4f1402b54b08a6bacd4b02cc07f
+Merge: dd15e54 364563a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Apr 27 10:12:40 2015 +0200
+
+    Merge pull request #4206 from ceph/wip-5488-firefly
+    
+    librbd: acquire cache_lock before refreshing parent
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit dd15e54b2fae134126e9795a8a973e391c628eb7
+Merge: 51ff2b6 5404fbf
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Apr 27 10:09:23 2015 +0200
+
+    Merge pull request #3963 from dachary/wip-10153-firefly
+    
+    Rados.shutdown() dies with Illegal instruction (core dumped)
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 51ff2b60dc576fb444bcfea8f6cd3e12043ed5b8
+Merge: 12143ff c0cfd6e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Apr 27 10:08:15 2015 +0200
+
+    Merge pull request #4383 from xinxinsh/wip-11144-firefly
+    
+    erasure-code-profile set races with erasure-code-profile rm
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1f6b1bb51d0b40899155313165ac5e3a21dde11a
+Author: Mykola Golub <mgolub at mirantis.com>
+Date:   Tue Mar 3 08:45:58 2015 +0200
+
+    osd: fix PG::all_unfound_are_queried_or_lost for non-existent osds
+    
+    A common mistake upon osd loss is to remove the osd from the crush map
+    before marking the osd lost. This tends to make it so that the user
+    can no longer mark the osd lost to satisfy all_unfound_are_queried_or_lost.
+    
+    The simple solution is for all_unfound_are_queried_or_lost to ignore
+    the osd if it does not exist.
+    
+    Fixes: #10976
+    Backports: firefly,giant
+    
+    Signed-off-by: Mykola Golub <mgolub at mirantis.com>
+    (cherry picked from commit 5bb51320138ff714806d24312149f6275d546608)
+
+commit e1d57730ddfc92b17562080b10bc22fceb86539a
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Mon Sep 29 08:21:10 2014 +0000
+
+    PG::actingset should be used when checking the number of acting OSDs for a given PG.
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    
+    (cherry picked from commit 19be358322be48fafa17b28054619a8b5e7d403b)
+    
+    Conflicts:
+    	src/osd/PG.cc	PG::get_backfill_priority() doesn't exist in firefly
+    			Variation in code related to no "undersized" state in firefly
+    
+    Fixes: #11454
+
+commit f33effccc0592fddfcd9c5c2f5c3385462aa9b84
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Mar 26 10:26:48 2015 -0700
+
+    ReplicatedPG::cancel_pull: requeue waiters as well
+    
+    If we are in recovery_wait, we might not recover that object as part of
+    recover_primary for some time.  Worse, if we are waiting on a backfill
+    which is blocked waiting on a copy_from on the missing object in
+    question, it can become a dead lock.
+    
+    Fixes: 11244
+    Backport: firefly
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 0b2e272430dd7433e6763be99b8a4cb127d9be19)
+
+commit 9b3396516c00ef931bab2d4aa6288ad974ec579d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Mar 3 11:03:35 2015 -0800
+
+    rgw: update keystone cache with token info
+    
+    Fixes: #11125
+    Backport: hammer, firefly
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 6616294aa140ceb83cc61c6ab6f9947636f5e67d)
+
+commit 8cc4bc162c8c1c240e62840d968b967f5f47b682 (refs/remotes/gh/wip-11416)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Dec 17 17:12:43 2014 -0800
+
+    rgw: use correct objv_tracker for bucket instance
+    
+    When trying to create a bucket that already existed, use the
+    objv_tracker of the newly created instance, and not of the original
+    bucket.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fe158ecc25feefcea8aea4133118e4a84900a8ec)
+
+commit c0cfd6e56ca9d17241da159295bcee7cf44c9ba3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Mar 18 14:17:00 2015 +0100
+
+    osd: erasure-code-profile incremental rm before set
+    
+    It is possible for an incremental change to have both a rm and a set for
+    a given erasure code profile. It only happens when a rm is followed by a
+    set. When a set is followed by a rm, the rm will remove the pending set
+    in the incremental change.
+    
+    The logic is the same for pool create and pool delete.
+    
+    We must apply the incremental erasure-code-profile removal before the
+    creation otherwise rm and set in the same proposal will ignore the set.
+    
+    This fix is minimal. A better change would be that erasure-code-profile
+    set checks if there is a pending removal and wait_for_finished_proposal
+    before creating.
+    
+    http://tracker.ceph.com/issues/11144 Fixes: #11144
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 0d52aca0d0c302983d03b0f5213ffed187e4ed63)
+    
+    Conflicts:
+    	src/osd/OSDMap.cc
+            resolved by replacing i++ with ++i
+
+commit 3fb97e25b194e92112077385b10381801e02ddb9
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Mar 24 15:14:34 2015 -0700
+
+    ReplicatedPG: trim backfill intervals based on peer's last_backfill_started
+    
+    Otherwise, we fail to trim the peer's last_backfill_started and get bug 11199.
+    
+    1) osd 4 backfills up to 31bccdb2/mira01213209-286/head (henceforth: foo)
+    
+    2) Interval change happens
+    
+    3) osd 0 now finds itself backfilling to 4 (lb=foo) and osd.5
+    (lb=b6670ba2/mira01213209-160/snapdir//1, henceforth: bar)
+    
+    4) recover_backfill causes both 4 and 5 to scan forward, so 4 has an interval
+    starting at foo, 5 has an interval starting at bar.
+    
+    5) Once those have come back, recover_backfill attempts to trim off the
+    last_backfill_started, but 4's interval starts after that, so foo remains in
+    osd 4's interval (this is the bug)
+    
+    7) We serve a copyfrom on foo (sent to 4 as well).
+    
+    8) We eventually get to foo in the backfilling. Normally, they would have the
+    same version, but of course we don't update osd.4's interval from the log since
+    it should not have received writes in that interval. Thus, we end up trying to
+    recover foo on osd.4 anyway.
+    
+    9) But, an interval change happens between removing foo from osd.4 and
+    completing the recovery, leaving osd.4 without foo, but with lb >= foo
+    
+    Fixes: #11199
+    Backport: firefly
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1388d6bd949a18e8ac0aecb0eb79ffb93d316879)
+
+commit 29bc9e56a978d4e18a507e71858baa21037964c4
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Mar 24 10:48:02 2015 -0700
+
+    PG: set/clear CREATING in Primary state entry/exit
+    
+    Previously, we did not actually set it when we got a pg creation message from
+    the mon.  It would actually get set on the first start_peering_interval after
+    that point.  If we don't get that far, but do send a stat update to the mon, we
+    can end up with 11197.  Instead, let's just set it and clear it upon entry into
+    and exit from the Primary state.
+    
+    Fixes: 11197
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit ddf0292250dfb1040d3cad96fa2cf886fd65933c)
+
+commit 12143ff9b25fdd96f8d1a9cecb1329c7f354d414
+Merge: 53eff01 bf1d8e8
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Apr 6 10:24:06 2015 -0700
+
+    Merge pull request #4275 from jeanchlopez/wip-11160-firefly
+    
+    rgw: shouldn't need to disable rgw_socket_path if frontend is configured
+
+commit bf1d8e888439df75feadde76bafe7d07d0e8481a
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Mar 18 20:49:13 2015 -0700
+
+    rgw: don't use rgw_socket_path if frontend is configured
+    
+    Fixes: #11160
+    Backport: hammer, firefly
+    
+    Previously if we wanted to use the tcp fcgi socket, we needed to clear
+    rgw_socket_path.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 53eff01f1e7ecd3783bb05c47588a134d4fededc
+Merge: 899738e 80afc5e
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Apr 1 16:30:23 2015 -0700
+
+    Merge pull request #4247 from ceph/wip-11303
+    
+    Fix do_autogen.sh so that -L is allowed
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 80afc5eca293e5e2f168f219931a2f554040cdd8
+Author: Alfredo Deza <adeza at redhat.com>
+Date:   Wed Apr 1 19:10:33 2015 -0400
+
+    Fix do_autogen.sh so that -L is allowed
+    
+    Signed-off-by: Alfredo Deza <adeza at redhat.com>
+
+commit b9da6f1025683d240baa73a9fcccbf2780035231
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Mar 16 18:40:49 2015 -0400
+
+    librbd: snap_remove should ignore -ENOENT errors
+    
+    If the attempt to deregister the snapshot from the parent
+    image fails with -ENOENT, ignore the error as it is safe
+    to assume that the child is not associated with the parent.
+    
+    Fixes: #11113
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit cf8094942ccdba831e03e5a79451cfa5d78a135f)
+
+commit b250b3cfae69f4e8354027fae26fd85a792da0df
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Mar 16 18:35:07 2015 -0400
+
+    librbd: get_parent_info should protect against invalid parent
+    
+    get_parent_info should return -ENOENT if the image does not
+    have an associated parent image.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 21afd0ef8e1fb81c5ace5fd403513c542e2413e3)
+
+commit 69d9339fb352342a87e1148e9b5161246b27776a
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Feb 2 09:07:27 2015 -0800
+
+    PGLog: improve PGLog::check() debugging
+    
+    Related: 10718
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit c656bcec2441c90b084ca50a17c37625d69942a1)
+
+commit 73cbb6f34a5a556dbbd4db2e6f81391d83447efd
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Mar 17 10:07:03 2015 -0700
+
+    PGLog::merge_log: in tail extend case, log.log might be empty
+    
+    Even if the tail != last_update, the log might be empty due to split
+    moving all entries into other logs.
+    
+    Fixes: 10718
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit f5a2aef3db29b99634250fd388a0c2d9b9a23d38)
+
+commit 62645d30b0ceee075a56bc692fd65cee85b09aa5 (refs/remotes/gh/wip-11256-firefly)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Mar 30 17:34:57 2015 -0700
+
+    cls_rgw: use multimap to keep pending operations in bucket index
+    
+    Fixes: #11256
+    Multiple concurrent requests might be sent using the same tag, need the
+    entry map to be able to hold multiple entries.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 7538319dd7aa80a3318c108d345dee8044cf20a8
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Mar 27 16:32:48 2015 -0700
+
+    rgw: generate new tag for object when setting object attrs
+    
+    Fixes: #11256
+    Backport: firefly, hammer
+    
+    Beforehand we were reusing the object's tag, which is problematic as
+    this tag is used for bucket index updates, and we might be clobbering a
+    racing update (like object removal).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 364563aac979fdf5ccbb6c588051d097a26bc594
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Mar 16 11:04:22 2015 -0400
+
+    librbd: acquire cache_lock before refreshing parent
+    
+    cache_lock needs to be acquired before snap_lock to avoid
+    the potential for deadlock.
+    
+    Fixes: #5488
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 110c35498942ea0feec395b6e7992f802dd740ce
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Mar 20 15:28:15 2015 -0700
+
+    ReplicatedPG::promote_object: check scrubber and block if necessary
+    
+    Otherwise, we might attempt to promote into an in-progress scrub
+    interval causing 11156.  I would have added a return value to
+    promote_object(), but could not find an existing user which
+    cared to distinguish the cases, even with a null op passed.
+    All existing users are in maybe_handle_cache.  The ones which
+    pass a null op are for promoting the object in parallel
+    with a proxy -- a case where not actually performing the promote
+    does not really matter.
+    
+    Fixes: #11156
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 65bb4df599541cd2e0f195b905f24f529e255c00)
+
+commit 899738e10e82b50dcf7dfffe5cc83937179bf323
+Merge: 15acfe7 9437cb1
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 23 20:38:43 2015 +0100
+
+    Merge pull request #4126 from dzafman/wip-11176-firefly
+    
+    ceph-objectstore-tool: Output only unsupported features when incomatible
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 15acfe7f226ca7bc2c942d5fbcd3a40bd41e5930
+Merge: 6c95cd2 cddbff9
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sat Mar 21 11:38:28 2015 +0100
+
+    Merge pull request #4079 from dachary/wip-11157-firefly
+    
+    doc,tests: force checkout of submodules
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit 6c95cd24f6f4a1a933f8799754831e7a5c0a725d
+Merge: ea79a3b 43053fc
+Author: Yuri Weinstein <yuri.weinstein at gmail.com>
+Date:   Fri Mar 20 21:06:17 2015 -0700
+
+    Merge pull request #4129 from dzafman/wip-11139-firefly
+    
+    ceph-objectstore-tool: Use exit status 11 for incompatible import attemp...
+
+commit 43053fcd8969c406969fef67613aa37ad1cc86bf
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Mar 20 17:48:01 2015 -0700
+
+    ceph-objectstore-tool: Use exit status 11 for incompatible import attempt
+    
+    This is used so upgrade testing doesn't generate false failure.
+    Fixes: #11139
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 175aff8afe8215547ab57f8d8017ce8fdc0ff543)
+
+commit 9437cb1b284ec9366b51d660396c2c8a9366b31f
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Mar 20 16:57:40 2015 -0700
+
+    ceph-objectstore-tool: Output only unsupported features when incomatible
+    
+    Fixes: #11176
+    Backport: firefly, giant
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 5b23f5b5892b36fb7d06efc0d77e64a24ef6e8c9)
+
+commit ea79a3b122917ddf5dc1972bb9dc5b20f78e2f18
+Merge: c1c20d8 07fc9f6
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Mar 20 08:44:39 2015 +0100
+
+    Merge pull request #3970 from ceph/firefly-11053
+    
+    mds: fix assertion caused by system clock backwards
+    
+    Reviewed-by: John Spray <john.spray at redhat.com>
+
+commit c1c20d89d511499d678fdba0667581e88b9b5d95
+Merge: 2fbb9a6 63b39db
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Mar 20 08:42:58 2015 +0100
+
+    Merge pull request #4021 from ceph/wip-7737-firefly
+    
+    osd: fix negative degraded objects during backfilling
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 2fbb9a63a82ac5136b033799aec303fc151b25e5
+Merge: 3160e8d 2c7eda6
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Mar 20 08:38:26 2015 +0100
+
+    Merge pull request #3952 from dachary/wip-9986-firefly
+    
+    objecter: fix map skipping
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 3160e8d6918a04d1fec9fdccbc30bf007c7940c6
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Mar 18 20:55:24 2015 -0700
+
+    init-radosgw*: don't require rgw_socket_path to be defined
+    
+    Fixes: #11159
+    Backport: hammer, firefly
+    
+    Scripts required rgw_socket_path to exist in order to start radosgw.
+    This is not needed.
+    
+    Reported-by: Dan Mick <dmick at redhat.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 6823bcdcd0ce72cd223e809291f46d82da76115c)
+
+commit cddbff9a3653d6257d13e0ac411cd6e4cd71feef
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Mar 19 00:32:39 2015 +0100
+
+    doc,tests: force checkout of submodules
+    
+    When updating submodules, always checkout even if the HEAD is the
+    desired commit hash (update --force) to avoid the following:
+    
+        * a directory gmock exists in hammer
+        * a submodule gmock replaces the directory gmock in master
+        * checkout master + submodule update : gmock/.git is created
+        * checkout hammer : the gmock directory still contains the .git from
+          master because it did not exist at the time and checkout won't
+          remove untracked directories
+        * checkout master + submodule update : git rev-parse HEAD is
+          at the desired commit although the content of the gmock directory
+          is from hammer
+    
+    http://tracker.ceph.com/issues/11157 Fixes: #11157
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+
+commit 63b39dbd529936e60d0fd08dffd35f82b3d1729c (refs/remotes/gh/wip-7737-firefly)
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Thu Feb 26 08:13:12 2015 +0000
+
+    osd: fix negative degraded objects during backfilling
+    
+    When there is deleting requests during backfilling, the reported number of degraded
+    objects could be negative, as the primary's num_objects is the latest (locally) but
+    the number for replicas might not reflect the deletings. A simple fix is to ignore
+    the negative subtracted value.
+    
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit 14d7e36d3c978844da73d0e1c8a3a1ec863bac15)
+    
+    Conflicts:
+    	src/osd/PG.cc
+
+commit 493d285508914769cba3639b601ae6c20303af0d
+Merge: 9839726 8a25a51
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 23:20:36 2015 +0100
+
+    Merge pull request #3966 from theanalyst/wip-10698-backport
+    
+    rgw: fail s3 POST auth if keystone not configured
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 9839726f009a3189013a23e8226d2f7618f1d56b
+Merge: dab85cb 651dc55
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 23:19:22 2015 +0100
+
+    Merge pull request #3934 from dachary/wip-10665-firefly
+    
+    rgw: Swift API. Dump container's custom metadata.
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit dab85cb7fcc5770fe4d6f075cf583a33ea335aa3
+Merge: 0e55046 d0fd417
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 23:18:59 2015 +0100
+
+    Merge pull request #3929 from dachary/wip-10475-firefly
+    
+    rgw: Swift API. Support for X-Remove-Container-Meta-{key} header.
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 0e550461666d6e3d32981f99c8327931a6bd6d62
+Merge: 1ca6dd9 963439f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 23:18:24 2015 +0100
+
+    Merge pull request #3938 from dachary/wip-10770-firefly
+    
+    rgw: send appropriate op to cancel bucket index pending operation
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 1ca6dd9676014a81983bd397e3154bf53243c7f2
+Merge: 66327d6 34d19e1
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 23:17:56 2015 +0100
+
+    Merge pull request #3961 from dachary/wip-10106-firefly
+    
+    rgw: flush xml header on get acl request
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 66327d69a9bfa875d58b063c180a11b2769a093e
+Merge: de45d9e 9074eb7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 23:16:53 2015 +0100
+
+    Merge pull request #3958 from dachary/wip-10062-firefly
+    
+    rgw: check for timestamp for s3 keystone auth
+    
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+    Reviewed-by: Valery Tschopp <valery.tschopp at switch.ch>
+
+commit de45d9e2606d8fb6ea5533521163669e748e7d01
+Merge: 308f758 8ef14fc
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 17:00:27 2015 +0100
+
+    Merge pull request #3942 from dachary/wip-10844-firefly
+    
+    mon: MonCap: take EntityName instead when expanding profiles
+    
+    Reviewed-by: Joao Eduardo Luis <joao at redhat.com>
+
+commit 308f758f49d28c012f3ba765519144e5ea5794e6
+Merge: c59a081 ca42905
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:53:48 2015 +0100
+
+    Merge pull request #3936 from dachary/wip-10724-firefly
+    
+     backport ceph-disk man page to Firefly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit c59a08135c35072fa05104e26b500553e800cdd1
+Merge: 331acae 8ec8f11
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:50:39 2015 +0100
+
+    Merge pull request #3940 from dachary/wip-8753-firefly
+    
+    ReplicatedPG::on_change: clean up callbacks_for_degraded_object
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 331acae4d6b34bb047c914945a2d9c0d9c7b9562
+Merge: fc364a7 4e32ff2
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:49:56 2015 +0100
+
+    Merge pull request #3827 from dachary/wip-10259-firefly
+    
+    osd_types: op_queue_age_hist and fs_perf_stat should be in osd_stat_t::o...
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit fc364a76f85eb5016ea460e5fd9c1603df374bcf
+Merge: 31d99d2 b0d0d44
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:48:02 2015 +0100
+
+    Merge pull request #3962 from dachary/wip-10150-firefly
+    
+    ReplicatedPG::scan_range: an object can disappear between the list and t...
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 31d99d2de714eb4a8eeb4a431cbc0d40ca749f15
+Merge: 45f0870 5865411
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:45:32 2015 +0100
+
+    Merge pull request #3948 from dachary/wip-9891-firefly
+    
+    DBObjectMap: lock header_lock on sync()
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 45f087032e27c63dc459318717b05fe5f9888664
+Merge: 3050262 6207333
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:43:48 2015 +0100
+
+    Merge pull request #3949 from dachary/wip-9915-firefly
+    
+    osd: cache tiering: fix the atime logic of the eviction
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 3050262d7dcb8ac20b9f86544461bb59f4b87cf5
+Merge: c0abc4d 0f31388
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:40:12 2015 +0100
+
+    Merge pull request #3944 from dachary/wip-9193-firefly
+    
+    messages/MWatchNotify: include an error code in the message
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit c0abc4d769afd00773a9f466ffd3feced9cdb17d
+Merge: f9acd3a f856739
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:39:41 2015 +0100
+
+    Merge pull request #3943 from dachary/wip-8011-firefly
+    
+    ReplicatedPG: fail a non-blocking flush if the object is being scrubbed
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f9acd3ad7397ac1e745beeeaf21b55ecd95484a1
+Merge: f95d327 ca96b59
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:39:16 2015 +0100
+
+    Merge pull request #3941 from dachary/wip-10817-firefly
+    
+    WorkQueue: make wait timeout on empty queue configurable
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f95d327cbc0750cfb77114c66082ddd5fc458b94
+Merge: 32de8ab 3782b8b
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:38:42 2015 +0100
+
+    Merge pull request #3937 from dachary/wip-10762-firefly
+    
+    mon: ignore osd failures from before up_from
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 32de8ab146f242f7b73aca211f059bc39d38f85c
+Merge: 24a8c10 6fd3dfa
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:38:22 2015 +0100
+
+    Merge pull request #3933 from dachary/wip-10617-firefly
+    
+    osd: do not ignore deleted pgs on startup
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 24a8c10a5a215c60b525f4170e45565390e02231
+Merge: f4e76c3 368a5a8
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:38:01 2015 +0100
+
+    Merge pull request #3932 from dachary/wip-10546-firefly
+    
+    mon: Monitor: fix timecheck rounds period
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f4e76c3db90bf383c02cdb8cca19a37cd187095b
+Merge: fa518ff 66b13f2
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:37:36 2015 +0100
+
+    Merge pull request #3931 from dachary/wip-10512-firefly
+    
+    osd: requeue blocked op before flush it was blocked on
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit fa518ffc5961785f01f0f91980c38a7e02686901
+Merge: ac9980e a22aa8f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:37:05 2015 +0100
+
+    Merge pull request #3930 from dachary/wip-10497-firefly
+    
+    librados: Translate operation flags from C APIs
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit ac9980e074adf587b8b16af0bd08b3fc3233804d
+Merge: ccebb5f d3de8a5
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:31:40 2015 +0100
+
+    Merge pull request #3955 from dachary/wip-10059-firefly
+    
+    PG: always clear_primary_state
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit ccebb5f90bea0fd3bac1bd7ab93e5e07700f1301
+Merge: a30379d f4bab86
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:31:16 2015 +0100
+
+    Merge pull request #3954 from dachary/wip-10014-firefly
+    
+    ObjectStore: Don't use largest_data_off to calc data_align.
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit a30379d9af89cffa4b3083ae14a94e3758c2b01c
+Merge: e575ca8 eb03e79
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:25:59 2015 +0100
+
+    Merge pull request #3947 from dachary/wip-9555-firefly
+    
+    osd: check that source OSD is valid for MOSDRepScrub
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit e575ca84419f8be5c7fae7e2ffac549956a74f82
+Merge: cd675bb c60da2f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:25:30 2015 +0100
+
+    Merge pull request #3964 from dachary/wip-10157-firefly
+    
+    PGLog: include rollback_info_trimmed_to in (read|write)_log
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit cd675bba5fdfb85689880ca7ecbd284181984a63
+Merge: 2b8e476 1a0f770
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:24:55 2015 +0100
+
+    Merge pull request #3960 from dachary/wip-6003-firefly
+    
+    FileJournal: fix journalq population in do_read_entry()
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 2b8e4762edb7c35950f7e0d69bba2b5e1d83133a
+Merge: d434ead a746f7e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:24:03 2015 +0100
+
+    Merge pull request #3950 from dachary/wip-9985-firefly
+    
+    Get the currently atime of the object in cache pool for eviction
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Xinze Chi <xmdxcxz at gmail.com>
+
+commit d434eadadd1df6e4df18a6914015736bc09722d1
+Merge: e79e5f8 5f1245e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 16:20:12 2015 +0100
+
+    Merge pull request #3935 from dachary/wip-10723-firefly
+    
+    Fix memory leak in python rados bindings
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit e79e5f8fbbfba6984cf21784e20d1c46cb60a397
+Merge: a9a36de 91b2aca
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 15:02:37 2015 +0100
+
+    Merge pull request #3866 from ceph/wip-cot-firefly
+    
+    Backport ceph-objectstore-tool changes to firefly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a9a36deb89ac5719787e905469fe0b1bde5d58ca
+Merge: 83c571e 7e85722
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 15:00:56 2015 +0100
+
+    Merge pull request #3996 from dzafman/wip-10676
+    
+    Fix ceph command manpage to match ceph -h
+    
+    Reviewed-by: Xinxin Shu <xinxin.shu5040 at gmail.com>
+
+commit 83c571e3067b4cad3e4567522c797d09a82d87db
+Merge: baa74b8 d5c3a14
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 16 14:55:37 2015 +0100
+
+    Merge pull request #3927 from dachary/wip-10351-firefly
+    
+    mount.ceph: avoid spurious error message
+    
+    Reviewed-by: Yan, Zheng <zyan at redhat.com>
+
+commit 7e85722fd4c89715fc2ed79697c82d65d7ebf287
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Mar 13 16:50:13 2015 -0700
+
+    doc: Minor fixes to ceph command manpage
+    
+    Fixes: #10676
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+
+commit 9ac488c1eb0e30511079ba05aaf11c79615b3940
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Mar 12 11:39:52 2015 -0700
+
+    doc: Fix ceph command manpage to match ceph -h (firefly)
+    
+    Improve synopsis section
+    Fixes: #10676
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+
+commit 5f1245e131e33a98572408c8223deed2c7cf7b75
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Feb 9 20:50:23 2015 -0800
+
+    rados.py: keep reference to python callbacks
+    
+    If we don't keep a reference to these, the librados aio calls will
+    segfault since the python-level callbacks will have been garbage
+    collected. Passing them to aio_create_completion() does not take a
+    reference to them. Keep a reference in the python Completion object
+    associated with the request, since they need the same lifetime.
+    
+    This fixes a regression from 60b019f69aa0e39d276c669698c92fc890599f50.
+    
+    Fixes: #10775
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 36d37aadbbbece28d70e827511f1a473d851463d)
+
+commit cf366fc3b21ff6f98530dbadb75a430c25672d56
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Thu Dec 18 17:11:22 2014 +0530
+
+    doc: Changes format style in ceph to improve readability as html.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 8b796173063ac9af8c21364521fc5ee23d901196)
+
+commit 07fc9f66a69aa31d2cf8bf7a277d3e14ad6209be
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Mar 12 11:01:46 2015 +0800
+
+    mds: fix assertion caused by system clock backwards
+    
+    Fixes: #11053
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+
+commit 8a25a51e42cdaed2c66dc25a6c6d0245441123a3
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jan 30 07:03:30 2015 -0800
+
+    rgw: fail s3 POST auth if keystone not configured
+    
+    Fixes: #10698
+    This fixes issue introduced in 8b3dfc9472022ea45ad24e02e0aa21dfdad798f8,
+    where if user does not exist, we try keystone authentication. However,
+    if keystone is not configured we justt fall through without failing.
+    This would have failed later on due to bucket permissions, unless bucket
+    had a public write permissions.
+    
+    Backports: Firefly
+    Reported-by: Valery Tschopp <valery.tschopp at switch.ch>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    
+    Conflicts:
+    	src/rgw/rgw_rest_s3.cc
+
+commit eb03e792040bd22c1ae8b7dd73d94fbfd6208eec
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Dec 13 08:06:31 2014 -0800
+
+    osd: check that source OSD is valid for MOSDRepScrub
+    
+    Make sure the message we got from the peer OSD is valid.  Specifically,
+    this avoids a race like this:
+    
+    - A marks down B
+    - B sends MOSDRepScrub
+    - A accepts connection from B as new
+    - A replies to scrub
+    - B crashes because msgr seq 1 < expected seq 1000+
+    
+    See #8880 for the most recent fix for requests.
+    
+    Fixes: #9555
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 847e5e102522d651aa9687a54aaafcebf3afc596)
+    
+    Conflicts:
+        src/osd/OSD.cc: require functions first argument is now a reference
+
+commit ae18707b3caa115dc510aff38b77f8afe8555c61
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Dec 13 07:56:39 2014 -0800
+
+    osd: pass Message* to most require_* helpers
+    
+    These do nothing but op->get_req(); pass the Message* explicitly so that
+    non-OpRequest callers can use them.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 707a111d53efb09b3471dd3788b86d2bfee4e96f)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+    	src/osd/OSD.h
+            significantly changes had to be made but in a simple way and
+    	stays within the scope of the original commit
+
+commit c60da2f3c34e7325c748d2d6e55140a0a30013fd
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Nov 20 15:15:08 2014 -0800
+
+    PGLog: include rollback_info_trimmed_to in (read|write)_log
+    
+    Fixes: #10157
+    Backport: firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1fe8b846641486cc294fe7e1d2450132c38d2dba)
+    
+    Conflicts:
+    	src/osd/PGLog.cc
+            in the context coll_t::META_COLL was replaced with META_COLL
+
+commit 1a0f770eea18af6b276a31157f201a93166eb038
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Feb 6 09:52:29 2015 -0800
+
+    FileJournal: fix journalq population in do_read_entry()
+    
+    Fixes: 6003
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit bae1f3eaa09c4747b8bfc6fb5dc673aa6989b695)
+    
+    Conflicts:
+    	src/os/FileJournal.cc
+            because reinterpret_cast was added near two hunks after firefly
+
+commit a746f7e5985198024067cb6e123569c09169b356
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 31 19:33:59 2014 -0700
+
+    osd/ReplicatedPG: fix compile error
+    
+    From 1fef4c3d541cba360738437420ebfa2447d5802e.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 4a9ad7dc2da6f4fa6a64235776a3f1d2799aef60)
+
+commit 5404fbfdd9b18cdb3fe5bed67146c769ec3acfa0
+Author: Federico Simoncelli <fsimonce at redhat.com>
+Date:   Sat Nov 15 14:14:04 2014 +0000
+
+    common: do not unlock rwlock on destruction
+    
+    According to pthread_rwlock_unlock(3p):
+    
+     Results are undefined if the read-write lock rwlock is not held
+     by the calling thread.
+    
+    and:
+    
+     https://sourceware.org/bugzilla/show_bug.cgi?id=17561
+    
+     Calling pthread_rwlock_unlock on an rwlock which is not locked
+     is undefined.
+    
+    calling pthread_rwlock_unlock on RWLock destruction could cause
+    an unknown behavior for two reasons:
+    
+    - the lock is acquired by another thread (undefined)
+    - the lock is not acquired (undefined)
+    
+    Moreover since glibc-2.20 calling pthread_rwlock_unlock on a
+    rwlock that is not locked results in a SIGILL that kills the
+    application.
+    
+    This patch removes the pthread_rwlock_unlock call on destruction
+    and replaces it with an assertion to check that the RWLock is
+    not in use.
+    
+    Any code that relied on the implicit release is now going to
+    break the assertion, e.g.:
+    
+     {
+       RWLock l;
+       l.get(for_write);
+     } // implicit release, wrong.
+    
+    Signed-off-by: Federico Simoncelli <fsimonce at redhat.com>
+    (cherry picked from commit cf2104d4d991361c53f6e2fea93b69de10cd654b)
+
+commit a73a4cb3889a6da21c3cfa4ddfa16d1a7059d20c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Sat May 3 08:32:19 2014 -0700
+
+    common/RWLock: track read/write locks via atomics for assertion checks
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 92615ea95a31d9fd22c3d11c860e0f502dc52c26)
+
+commit b0d0d44018de6289b64b6334edd4959ca4a0cc48
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Dec 11 13:05:54 2014 -0800
+
+    ReplicatedPG::scan_range: an object can disappear between the list and the attr get
+    
+    The first item in the range is often last_backfill, upon which writes
+    can be occuring.  It's trimmed off on the primary side anyway.
+    
+    Fixes: 10150
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit dce6f288ad541fe7f0ef8374301cd712dd3bfa39)
+
+commit 34d19e1501b242fd8fc7cc95656592b5982f29a6
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jan 30 18:42:40 2015 -0800
+
+    rgw: flush xml header on get acl request
+    
+    Fixes: #10106
+    Backport: firefly, giant
+    
+    dump_start() updates the formatter with the appropriate prefix, however,
+    we never flushed the formatter.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit eb45f861343162e018968b8c56693a8c6f5b2cab)
+
+commit 9074eb7c46589aa1e5d10a2b9a8534f22dff2154
+Author: Abhishek Lekshmanan <abhishek.lekshmanan at gmail.com>
+Date:   Mon Nov 17 17:37:00 2014 +0530
+
+    rgw: check for timestamp for s3 keystone auth
+    
+    This commit ensures that we check for timestamp of s3 request is within
+    acceptable grace time of radosgw
+    Addresses some failures in #10062
+    Fixes: #10062
+    Signed-off-by: Abhishek Lekshmanan <abhishek.lekshmanan at gmail.com>
+    
+    (cherry picked from commit 4b35ae067fef9f97b886afe112d662c61c564365)
+
+commit d3de8a5722a68d69023cf60c9076c2fb19058bf9
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed Nov 19 08:20:16 2014 -0800
+
+    PG: always clear_primary_state on new interval, but only clear pg temp if not primary
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit f692bfe076b8ddb679c6d1a6ea78cc47f0876326)
+
+commit 8b07236cd799b4752cbe620b737343a02a703a17
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Nov 14 15:44:20 2014 -0800
+
+    PG: always clear_primary_state when leaving Primary
+    
+    Otherwise, entries from the log collection process might leak into the next
+    epoch, where we might end up choosing a different authoritative log.  In this
+    case, it resulted in us not rolling back to log entries on one of the replicas
+    prior to trying to recover from an affected object due to the peer_missing not
+    being cleared.
+    
+    Fixes: #10059
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit c87bde64dfccb5d6ee2877cc74c66fc064b1bcd7)
+
+commit f4bab86fe3b218d66c14d06883c297836d9ca19d
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Mon Oct 27 11:22:13 2014 +0800
+
+    ObjectStore: Don't use largest_data_off to calc data_align.
+    
+    If largest_data_off % CEPH_PAGE_SIZE != 0, the get_data_aligment return
+    a erro value. This make the FileJouranl::align_bl to memcopy much data.
+    
+    Tested-by: Sage Weil <sage at redhat.com>
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit a1aa70f2f21339feabfe9c1b3c9c9f97fbd53c9d)
+
+commit 2c7eda690ae2f71c8e8e189b8f7330196c1f385f
+Author: Ding Dinghua <dingdinghua85 at gmail.com>
+Date:   Thu Oct 30 14:58:42 2014 +0800
+
+    osdc/Objecter: Fix a bug of dead looping in Objecter::handle_osd_map
+    
+    If current map epoch is less than oldest epoch, current map epoch
+    should step up to oldest epoch.
+    
+    Fixes: #9986
+    Signed-off-by: Ding Dinghua <dingdinghua85 at gmail.com>
+    (cherry picked from commit e0166a23c2cf655bfb4cf873be021a14d9b9be27)
+    
+    Conflicts:
+    	src/osdc/Objecter.cc
+            the debug line that follows was re-indented
+
+commit 11f8017cbdf94d4a8083412b96c251ee39286541
+Author: Ding Dinghua <dingdinghua85 at gmail.com>
+Date:   Thu Oct 30 14:58:05 2014 +0800
+
+    osdc/Objecter: e shouldn't be zero in Objecter::handle_osd_map
+    
+    Signed-off-by: Ding Dinghua <dingdinghua85 at gmail.com>
+    (cherry picked from commit 31c584c8ba022cd44fe2872d221f3026618cefab)
+    
+    Conflicts:
+    	src/osdc/Objecter.cc
+            the debug line that follows was re-indented
+
+commit 7831582026441abbd6066dd951db4b63ffb45402
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Wed Oct 29 07:11:11 2014 +0000
+
+    Get the currently atime of the object in cache pool for eviction
+    
+    Because if there are mutiple atime in agent_state for the same object, we should use the recently one.
+    
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 1fef4c3d541cba360738437420ebfa2447d5802e)
+
+commit 620733386bd0694960cecac8f32bd1538382d5bb
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Tue Oct 28 09:37:11 2014 +0800
+
+    osd: cache tiering: fix the atime logic of the eviction
+    
+    Reported-by: Xinze Chi <xmdxcxz at gmail.com>
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+    (cherry picked from commit 622c5ac41707069ef8db92cb67c9185acf125d40)
+
+commit 5865411360f722ec511f2df6656d4ba975bef8eb
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Feb 20 13:43:46 2015 -0800
+
+    DBObjectMap: lock header_lock on sync()
+    
+    Otherwise, we can race with another thread updating state.seq
+    resulting in the old, smaller value getting persisted.  If there
+    is a crash at that time, we will reuse a sequence number, resulting
+    in an inconsistent node tree and bug #9891.
+    
+    Fixes: 9891
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 2b63dd25fc1c73fa42e52e9ea4ab5a45dd9422a0)
+    
+    Conflicts:
+    	src/os/DBObjectMap.cc
+            because we have state.v = 1; instead of state.v = 2;
+
+commit baa74b88a4f4b6073b99b7a9774692b37405b59e
+Merge: be6559a 420ea03
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Mar 11 09:09:23 2015 +0100
+
+    Merge pull request #3828 from dachary/wip-10425-firefly
+    
+    librados: fix resources leakage in RadosClient::connect()
+    
+    Reviewed-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+
+commit be6559a423badde3b573b0c9055056999baae104
+Merge: f91d355 6e58732
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Mar 11 09:06:27 2015 +0100
+
+    Merge pull request #3826 from dachary/wip-10257-firefly
+    
+    mon: PGMonitor: several stats output error fixes
+    
+    Reviewed-by: Joao Eduardo Luis <joao at redhat.com>
+
+commit f91d355306620cc543113ed21fddf84f4c170d6e
+Merge: f5525a1 1e58bb4
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Mar 11 09:05:13 2015 +0100
+
+    Merge pull request #3824 from dachary/wip-10353-firefly
+    
+    crush: set_choose_tries = 100 for erasure code rulesets
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit f5525a1f41c9154b48f3ad0ccd899b5203c897bd
+Merge: b7e3614 27dbbb3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Mar 11 09:04:33 2015 +0100
+
+    Merge pull request #3823 from dachary/wip-10787-firefly
+    
+    mon/OSDMonitor: do not trust small values in osd epoch cache
+    
+    Reviewed-by: Joao Eduardo Luis <joao at redhat.com>
+
+commit b7e3614ff38379aeea66ba00c64bc88ffa080963
+Merge: b5a67f0 7ed92f7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Mar 11 09:02:16 2015 +0100
+
+    Merge pull request #3915 from dachary/wip-10080-firefly
+    
+    SimpleMessenger: allow RESETSESSION whenever we forget an endpoint
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 8ef14fcca715a33be8c611a37628c90d7fafca43
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Wed Feb 11 23:36:01 2015 +0000
+
+    mon: MonCap: take EntityName instead when expanding profiles
+    
+    entity_name_t is tightly coupled to the messenger, while EntityName is
+    tied to auth.  When expanding profiles we want to tie the profile
+    expansion to the entity that was authenticated.  Otherwise we may incur
+    in weird behavior such as having caps validation failing because a given
+    client messenger inst does not match the auth entity it used.
+    
+    e.g., running
+    
+    ceph --name osd.0 config-key exists foo daemon-private/osd.X/foo
+    
+    has entity_name_t 'client.12345' and EntityName 'osd.0'.  Using
+    entity_name_t during profile expansion would not allow the client access
+    to daemon-private/osd.X/foo (client.12345 != osd.X).
+    
+    Fixes: #10844
+    Backport: firefly,giant
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 87544f68b88fb3dd17c519de3119a9ad9ab21dfb)
+
+commit 370f37f452aff3b48f9ae8a33b7ef26b572b41c8
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Nov 14 21:03:54 2014 +0000
+
+    mon: Monitor: stash auth entity name in session
+    
+    Backport: giant
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit ca8e1efc0be9bffcfbdce5593526d257aa498062)
+
+commit 0f31388eb2bb68c09ab270f871b421a9c368af97
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 10 17:51:08 2014 -0700
+
+    messages/MWatchNotify: include an error code in the message
+    
+    Document the fields, while we are here.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 7c7bf5fee7be397ef141b947f532a2a0b3567b42)
+
+commit f856739824bc271405a6fa35bdefc2bdc42c2f02
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Nov 20 14:27:39 2014 -0800
+
+    ReplicatedPG: fail a non-blocking flush if the object is being scrubbed
+    
+    Fixes: #8011
+    Backport: firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 9b26de3f3653d38dcdfc5b97874089f19d2a59d7)
+
+commit ca96b59db529ffbba0c834795800b6e90a7e4fce
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Feb 9 17:11:38 2015 -0800
+
+    WorkQueue: make wait timeout on empty queue configurable
+    
+    Fixes: 10817
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 5aa6f910843e98a05bfcabe6f29d612cf335edbf)
+
+commit 8ec8f1175a129624dffb511782664d74966d3c42
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Feb 9 10:37:15 2015 -0800
+
+    ReplicatedPG::on_change: clean up callbacks_for_degraded_object
+    
+    Backport: dumpling, firefly, giant
+    Fixes: 8753
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit a5ecaa189d47a69466a6cd55fa4180e5c3092dc2)
+
+commit 963439f1038000c3f28c728350a2e9d351341e0b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Feb 5 09:33:26 2015 -0800
+
+    rgw: send appropriate op to cancel bucket index pending operation
+    
+    Fixes: #10770
+    Backport: firefly, giant
+    
+    Reported-by: baijiaruo <baijiaruo at 126.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit dfee96e3aebcaeef18c721ab73f0460eba69f1c7)
+    
+    Conflicts:
+    	src/rgw/rgw_rados.cc
+
+commit 3782b8b3652c0eb3fb8f65193ecfe09e92925170
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Feb 5 03:07:50 2015 -0800
+
+    mon: ignore osd failures from before up_from
+    
+    If the failure was generated for an instance of the OSD prior to when
+    it came up, ignore it.
+    
+    This probably causes a fair bit of unnecessary flapping in the wild...
+    
+    Backport: giant, firefly
+    Fixes: #10762
+    Reported-by: Dan van der Ster <dan at vanderster.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 400ac237d35d0d1d53f240fea87e8483c0e2a7f5)
+
+commit ca42905a6fca8b2b404500a6f74951ae20c8a488
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Wed Nov 26 22:21:32 2014 +0530
+
+    doc: Adds the updated man page for ceph-disk utility.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 016080d2c39919d73956e5e138ba5f079327aa44)
+
+commit 6602ab4581f27e066484b4c419d8206fcc20e045
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Wed Nov 26 22:19:01 2014 +0530
+
+    doc: Updates the man page for ceph-disk utility with some changes.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 8a48847cd46d4807ca1dbd13d3a561a693cdc877)
+
+commit 459807021dd3bf86ce31d30a3b576e783da67e3f
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Tue Nov 25 21:23:08 2014 +0530
+
+    doc: Adds man page for ceph-disk utility.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 9a118d56d4a5b0a0456e9f092f5ae9293f7bf3f3)
+
+commit 430d821b7592148ad9b2656bb3031a0484763f33
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Tue Nov 25 21:16:16 2014 +0530
+
+    doc: Removes ceph-deploy usage instances from ceph-disk man page.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 242dd1c0bbb728475a94f47740790b8a196d9804)
+
+commit 21c3256c851065521e34a179dc05d48fcc0a6e0f
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Tue Nov 25 02:06:39 2014 +0530
+
+    doc: Updates man page for ceph-disk utility.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 7dcc85042b0c0a26e495f7574ce144d1083d15f8)
+
+commit 1a6490e38d7f5fd3ff640a810c3b911699cd4884
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Mon Nov 24 22:05:11 2014 +0530
+
+    doc: Adds man page for ceph-disk utility.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit a450cab2b8148cb8a9b043d629feccf89e5aabac)
+
+commit 3bab47054dc77b9a00d3f47fa73f458ede7d4ab4
+Author: Billy Olsen <billy.olsen at gmail.com>
+Date:   Mon Feb 2 16:24:59 2015 -0700
+
+    Fix memory leak in python rados bindings
+    
+    A circular reference was inadvertently created when using the
+    CFUNCTYPE binding for callbacks for the asynchronous i/o callbacks.
+    This commit refactors the usage of the callbacks such that the
+    Ioctx object does not have a class reference to the callbacks.
+    
+    Fixes: #10723
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Billy Olsen <billy.olsen at gmail.com>
+    Reviewed-by: Dan Mick <dmick at redhat.com>
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 60b019f69aa0e39d276c669698c92fc890599f50)
+
+commit d0fd417e872a73033903fb36144fe7a39e90fc9a
+Author: Dmytro Iurchenko <diurchenko at mirantis.com>
+Date:   Tue Feb 3 17:54:38 2015 +0200
+
+    rgw: Swift API. Support for X-Remove-Container-Meta-{key} header.
+    
+    Fixes: #10475
+    Backport: hammer, firefly
+    Reported-by: Josh Durgin <jdurgin at redhat.com>
+    Signed-off-by: Dmytro Iurchenko <diurchenko at mirantis.com>
+    (cherry picked from commit f67bfa24fd6f69c2fcc0987eba8b6b426dd78320)
+    
+    Conflicts:
+    	src/rgw/rgw_rest.h
+            trivial merge: prototype of an unrelated function changed
+            s/is_object_op/!(s->object == NULL)/
+
+commit 651dc556047aa4ee9e95fe9fc7bcd11488973872
+Author: Dmytro Iurchenko <diurchenko at mirantis.com>
+Date:   Mon Feb 2 11:27:00 2015 +0200
+
+    rgw: Swift API. Dump container's custom metadata.
+    
+    Fixes: #10665
+    Backport: hammer, firefly
+    Reported-by: Ahmad Faheem <ahmad.faheem at ril.com>
+    Signed-off-by: Dmytro Iurchenko <diurchenko at mirantis.com>
+    (cherry picked from commit 2f8d31e9b1c4b09506bd1b0dad635c6e820783b2)
+    
+    Conflicts:
+    	src/rgw/rgw_rest_swift.cc
+            The first hunk conflicts because X-Storage-Policy was added
+    	after firefly. The second hunk conflicts because the type of the
+    	s->object data member changed after firefly but it is irrelevant
+    	because the patch does not need to access s->object anymore.
+
+commit 6fd3dfa7224f0af3101fd1614506e8cb2fc7f6a0
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 23 10:47:44 2015 -0800
+
+    osd: do not ignore deleted pgs on startup
+    
+    These need to get instantiated so that we can complete the removal process.
+    
+    Fixes: #10617
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 879fd0c192f5d3c6afd36c2df359806ea95827b8)
+
+commit 368a5a8a8739e98ffdb8ac1210d111092e31be9e
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Jan 30 11:37:28 2015 +0000
+
+    mon: Monitor: fix timecheck rounds period
+    
+    Fixes: #10546
+    Backports: dumpling?,firefly,giant
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 2e749599ac6e1060cf553b521761a93fafbf65bb)
+
+commit 66b13f2beff702c3b0bcb0aaa8da4e12d594eddf
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Jan 11 17:28:04 2015 -0800
+
+    osd: requeue blocked op before flush it was blocked on
+    
+    If we have request A (say, cache-flush) that blocks things, and then
+    request B that gets blocked on it, and we have an interval change, then we
+    need to requeue B first, then A, so that the resulting queue will keep
+    A before B and preserve the order.
+    
+    This was observed on this firefly run:
+    
+      ubuntu at teuthology:/a/sage-2015-01-09_21:43:43-rados-firefly-distro-basic-multi/694675
+    
+    Backport: giant, firefly
+    Fixes: #10512
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 11bdfb4131ecac16d4a364d651c6cf5d1d28c702)
+
+commit a22aa8f3228e0baf2ba08d9e79ee4924cd341a07
+Author: Matt Richards <mattjrichards at gmail.com>
+Date:   Thu Jan 8 13:16:17 2015 -0800
+
+    librados: Translate operation flags from C APIs
+    
+    The operation flags in the public C API are a distinct enum
+    and need to be translated to Ceph OSD flags, like as happens in
+    the C++ API. It seems like the C enum and the C++ enum consciously
+    use the same values, so I reused the C++ translation function.
+    
+    Signed-off-by: Matthew Richards <mattjrichards at gmail.com>
+    (cherry picked from commit 49d114f1fff90e5c0f206725a5eb82c0ba329376)
+    
+    Conflicts:
+    	src/librados/librados.cc
+            comes from lttng tracepoints introduced after firefly
+
+commit d5c3a14390f6bb2af45a1a4ad842777302dd0553
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Sat Jan 3 15:29:29 2015 +0800
+
+    mount.ceph: avoid spurious error message
+    
+    /etc/mtab in most modern distributions is a symbol link to
+    /proc/self/mounts.
+    
+    Fixes: #10351
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit bdd0e3c4bda97fe18487a58dd173a7dff752e1a2)
+
+commit 7ed92f7dc5f0f327b77b6f3835e3f821fc810708
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Tue Dec 2 15:17:57 2014 -0800
+
+    SimpleMessenger: allow RESETSESSION whenever we forget an endpoint
+    
+    In the past (e229f8451d37913225c49481b2ce2896ca6788a2) we decided to disable
+    reset of lossless Pipes, because lossless peers resetting caused trouble and
+    they can't forget about each other. But they actually can: if mark_down()
+    is called.
+    
+    I can't figure out how else we could forget about a remote endpoint, so I think
+    it's okay if we tell them we reset in order to clean up state. That's desirable
+    so that we don't get into strange situations with out-of-whack counters.
+    
+    Fixes: #10080
+    Backport: giant, firefly, dumpling
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 8cd1fdd7a778eb84cb4d7161f73bc621cc394261)
+
+commit 91b2acaadee1b62c1fcac73147908ec4477840f3
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Oct 9 11:20:13 2014 -0700
+
+    osd: Get pgid ancestor from last_map when building past intervals
+    
+    Fixed OSD::build_past_intervals_parallel() and PG::generate_past_intervals()
+    
+    Fixes: #10430
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0c5b66da7a9ba516340d06d9e806beb9d1040d0e)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit c09b6d9d64fdcdc3842c4f89acf10080125a4adc
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Dec 23 12:04:26 2014 -0800
+
+    osd: Pass oldest_map when generating past intervals
+    
+    From load_pgs() the superblock hasn't been published yet
+    so we need to retrieve the value of oldest_map depending on the context.
+    
+    Fixes: #10427
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 7fb721c1ceb39b38ca2e653299bcf51e109411d7)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit 9235d781bf860c1ecef5af600431f1619b56fbc1
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Dec 17 16:59:09 2014 -0800
+
+    osd: build_push_op() handle short reads so recipient doesn't crash
+    
+    Fixes: #8121
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit b9a04846d18e1c6621d7f2794ec1fae02875bed2)
+
+commit 7ce0cb8e33a281d5f675273d7bcbc570a32e5497
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Thu Feb 5 16:33:08 2015 +0800
+
+    ceph_objectstore_tool: fix check_output on python2.6
+    
+    * backported the subprocess.check_output from python2.7
+    
+    Fixes: #10756
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 15350a088d84bc6fc664f0d3f5d09b35f58b2144)
+    
+    Conflicts:
+    	src/test/ceph_objectstore_tool.py
+
+commit d5d34ddd1eac688d9422ca02c859d61be8e3e56e
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Jan 6 15:49:50 2015 -0800
+
+    ceph_objectstore_tool: For import get object_info_t available for each object
+    
+    Add object_info_t to object_begin so we have at object create time
+    This will be useful for importing from multiple erasure coded exports
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 05d916ed12f361da48ef73953bcc0cef465fcc2a)
+
+commit f70590b211ba28f350921b2f0c92712ed779858e
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 12 15:16:03 2014 -0800
+
+    ceph_objectstore_tool: Handle import of pg which OSD has split
+    
+    Fail import if import data doesn't include OSDMap and can't find it locally
+    See if local map can be read for import's epoch
+    Jump to current epoch like a split would if local map not present
+    
+    Fixes: #9781
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit afda6e4f3b98cc1773fd014583dfb5e1f214a939)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit aedd324f8fbb031d5126ae158f03066c7342f4b0
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 12 15:38:33 2014 -0800
+
+    ceph_objectstore_tool: On import following a split skip objects no longer in pg
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 68b27e25a3729566c3a22c0b71f70f7f3aca29a3)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit c3de607c2ce16a26af7a78a4e557f321ffbcb44d
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 5 15:12:21 2014 -0800
+
+    ceph_objectstore_tool: Verify that object pool and pgid pool match
+    
+    Also, earlier check for invalid --pgid with import op
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit da3be80497a1b1878ee5d2015f8840d202a83aa2)
+
+commit 5ec38e54f40431a5303cafe202c5097cc400fdb6
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Nov 19 11:47:36 2014 -0800
+
+    ceph_objectstore_tool: Check for splits and fail import if there were splits
+    
+    Add osdmap into metadata_section
+    On export put metadata_section before file data
+    
+    Fixes: #9780
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 19fdeea8b67091ed044ebce25799d3237b4d734a)
+
+commit aa472fa4df19d826a5af72e286365fa5ce4c71fb
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Dec 15 10:03:53 2014 -0800
+
+    ceph_objectstore_tool: Add special exit code for test infrastructure
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit b1f12f09c0211b608178f5ca2e292ab1765ce620)
+
+commit 22b7c2faee8cfad1b40cef019984f4a2d112b268
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Nov 19 11:41:39 2014 -0800
+
+    ceph_objectstore_tool: Check that pool exists before allowing import
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit f24f646d870703b7b79563cdbc20920248be6142)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit f65db436f6eb83d7c59fdddced4d35dd9eeeb078
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Oct 15 15:21:11 2014 -0700
+
+    ceph_objectstore_tool: Check cluster_fsid before allowing an import
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 196c8112dc9a6e8780b05d6c579cd7fbd5b07589)
+
+commit 360f68ec69b36b172d15c6206698340a5c00aafa
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Oct 16 12:27:56 2014 -0700
+
+    ceph_objectstore_tool: Allow the metadata_section to be anywhere in the export
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 62dd912f1192b28700a15b02507a8c9efd710cb5)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit c3fcbe636ae1a936b9180628cff939b2b5dddf7c
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 12 15:01:24 2014 -0800
+
+    ceph_objectstore_tool: import-rados shouldn't import internal namespace objects
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit f727d2eaf50b0351feb9f12dcd65d50fb6eff7e9)
+
+commit 2d69076943b9724ce1d5c9f03f2f7594a77b92d2
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 12 14:58:54 2014 -0800
+
+    ceph_objectstore_tool: Get g_ceph_context available to import-rados
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit ddc4613ec71752e5dccbbfe6dc078b86f0f186a9)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit bbed3a728471292de625d922abeae8b39d290045
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Dec 9 18:09:04 2014 -0800
+
+    ceph_objectstore_tool: Fix import-rados skipping of snapshots
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit fe936026ed87c9f95f3b7ad235b24c22e8de5f55)
+
+commit d962c79dc1f0f2189e25743c6d253fac412c004d
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Nov 20 13:00:10 2014 -0800
+
+    ceph_objectstore_tool: read_fd() doesn't handle ^D from tty stdin, don't allow
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 5cb692528e3ac0ebea3f1714b3ac43f69d176888)
+
+commit 8b7f4cb232c2f1bde6f50c1f092cb622fe2c41f1
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 19 13:47:32 2014 -0800
+
+    ceph-objectstore-tool: Remove --pretty-format and use new --format options
+    
+    Call new_formatter() with --format specified argument
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 22b71744bb0cb56434d5f6214ccea7d81f771860)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit ee183b8e56c6f8a88ac781cf1fedb6a7a93f1005
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Oct 15 15:20:03 2014 -0700
+
+    ceph_objectstore_tool: Describe super_ver values
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0aeba0f216a54390288b5e3d6147deb31877f744)
+
+commit 5f82f824c7b1bb246bdb54b11a694133a49da70a
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Jan 2 18:36:54 2015 +0100
+
+    ceph_objectstore_tool.cc: reduce scope of variable
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 78542f9a901c05e627b53b5306ea604be3bc82e8)
+
+commit 2f97c51b5ee5de7c1657bc8fee6ccaa474f6f478
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Jan 2 15:48:08 2015 +0100
+
+    ceph_objectstore_tool.cc: prefer ++operator for non-primitive iterators
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 252fc03ba21c7b09922598a8d40997fc639bb994)
+
+commit 2a22bfedc4fa9f461dc8cfd42c659b9c55ddafca
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Nov 25 16:56:19 2014 -0800
+
+    ceph_objectstore_tool: Prevent tool from transitioning struct_v on rm-past-intervals
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit f056bdf93980a0a8e6157dbb124a79389a8f1a3c)
+
+commit 53aa04f95c43795da81a7d9f3117d7e5816aedcb
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 4 18:53:08 2014 -0800
+
+    ceph_objectstore_tool: Accept json object with --pgid instead of array
+    
+    It isn't anticipated that anyone would use this but keeps backward compatible
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 59b423e2e8846b098326fdec440de46b8e3d2769)
+
+commit 60e9a8120b292628ee4e5ef33fe933222609b861
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 4 18:27:50 2014 -0800
+
+    ceph_objectstore_tool: Improve object spec parsing error messages
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit de6384fda183801c16af1b61ed36eaed289bb4f6)
+
+commit 4f95409c0dadeed18334c00630ddc6d7c99d2819
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 4 17:48:28 2014 -0800
+
+    ceph_objectstore_tool: Fix errors messages in newer code
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit eae7c02fded460f6c8aaf18aa83d2730b89e0eb1)
+
+commit 1703867735c8f8ab1c83aa526c84b278436f38d5
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 4 16:00:40 2014 -0800
+
+    ceph_objectstore_tool: Remove extraneous endl on error throw messages
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 32c832f0c62259a492d1c934c56ac165496763a0)
+
+commit f2d2110a8cb1a1b1216c1083b54ea6212138dc93
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 4 14:01:39 2014 -0800
+
+    ceph_objectstore_tool: Add --format and --pretty-format support
+    
+    --pretty-format defaults true
+    Add --format so xml output can be requested
+    --op list defaults to single line of json per object
+    To override this more human readable output use --pretty-format=false
+    Add testing of --op list special handling
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit cca85a534fe488ae314400e8faad55a758609467)
+
+commit a5544c12c3e982edf66f55a8edfb7fc69300520b
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Dec 3 17:53:11 2014 -0800
+
+    ceph_objectstore_tool: Strip _* (always _head) from pgid in list entry output
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 5eacd3c5f39766cb8be6b3251d139d16431cf6b6)
+
+commit 4a0a42f3e6b9a1b7ed4df3d4b6c417acfc00050a
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Dec 3 16:39:04 2014 -0800
+
+    ceph_objectstore_tool: BUG: --op list wasn't including snapshots
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit b617ee2d45886ec6b3dc0db0edbf814ea5748083)
+
+commit 06579b9f269dc9864e920368c5bea9bcb9dd8be9
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Dec 3 16:38:22 2014 -0800
+
+    ceph_objectstore_tool: For terminal output of list one object per line
+    
+    Instead of a parsable array make it easier to cut and paste listed objects
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 5a66db9418aeed31fec98999c5053dab357d9c1e)
+
+commit 22c6bf410de1b0c81f131aa4d5682f5162dd1a56
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Dec 3 16:35:09 2014 -0800
+
+    ceph_objectstore_tool: In error case umount objectstore
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit bc6ea9cb8a2b86c73f7f15bc46145177ccf91f4b)
+
+commit d802ab69a4a0f37ed9328ec385746f59643e1420
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 27 01:24:03 2014 +0100
+
+    objectstore_tool: test --op list variants
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit ddba2676c4c48c2a556f5d4ffd817bfe134a9153)
+
+commit f30e053fe7b3e5efc679b20cf1b3e2f7f8ed7e54
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 27 00:11:45 2014 +0100
+
+    objectstore_tool: parse new object description format
+    
+    The object format changed from
+    
+        {json object}
+    
+    to
+    
+        [pgid,{json object}]
+    
+    The parser is updated accordingly. If the --pgid is present, check that
+    it equals the pgid from the object description.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit df9d5c5cfd8b0ff793647a592c7661965cef5c92)
+
+commit fce87c9d7dbb51989826d068d6b6657a2f3d129d
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Nov 26 23:35:21 2014 +0100
+
+    objectstore_tool: filter --op list and explore all PGs
+    
+    The positional object name is used to filter the output of --op list and
+    only show the objects with a matching name. If both the object name and
+    the pgid are omitted, all objects from all PGs are displayed.
+    
+    The output format is changed from
+    
+        {"oid":"GROUP","key":"","snapid":-2,
+         "hash":2659194943,"max":0,"pool":0,"namespace":""}
+    
+    to
+    
+        [["0.7_head",{"oid":"GROUP","key":"","snapid":-2,
+                      "hash":2659194943,"max":0,"pool":0,
+                      "namespace":""}]]
+    
+    where the first member is the pgid where the object is found.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit c69aaceac7f370e5369d511bf17898adc338ae43)
+
+commit 2f874fd3715d216a68658e94a5c741e665c76632
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Nov 26 23:34:22 2014 +0100
+
+    objectstore_tool: lookup objects by name
+    
+    If the object is not a parsable JSON string, assume an object name and
+    look it up in all the PGs. If multiple objects have the same name, only
+    apply the command to one of them. It is primarily useful in a test
+    environment where the names of the tests objects are known and only a
+    small number of objects exists. It replaces the following:
+    
+        path='--data-path dev/osd0 --journal-path dev/osd0.journal'
+        for pgid in $(./ceph_objectstore_tool $path --op list-pgs) ; do
+          object=$(./ceph_objectstore_tool $path --pgid $pgid --op list |
+                   grep '"oid":"NAME"')
+          test -n "$object" && break
+        done
+        ./ceph_objectstore_tool $path --pgid $pgid "$object" remove
+    
+    with:
+    
+        ./ceph_objectstore_tool $path NAME remove
+    
+    http://tracker.ceph.com/issues/10192 Fixes: #10192
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 7c1165f96391821c00cca1ac04b3433dbec6bb6e)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit eb48aba2119959c53ea8a103b53f0c2e07c52acb
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Nov 26 17:30:30 2014 +0100
+
+    objectstore_tool: refactor list-lost and fix-lost
+    
+    Abstract out the PG exploration loops and encapsulate the list-lost and
+    fix-lost semantic in a callable object.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit d9e747b1bdb53d1fe543ef311e3db35fb78d8051)
+
+commit eab3226edc8ecc6d2d93f463e019ef4eacb9f468
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Nov 26 17:26:54 2014 +0100
+
+    objectstore_tool: update usage strings
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit a90233c8b79ae6c035b5169c7f8809f853631689)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit 5bbe41cb1e7faf40a9c53a9bdc01db8c35670a36
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Nov 18 13:00:15 2014 -0800
+
+    ceph_objectstore_tool: Add feature called set-allow-sharded-objects
+    
+    Uses --op set-allow-sharded-objects option
+    This operation will be rejected if on the target OSD's osdmap there is
+        at least one OSD which does not support ERASURE CODES.
+    Prompt the user that they could import if sharded state allowed
+    Prompt the user to use new feature if sharded state found inconsistent
+    
+    Fixes: #10077
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit f3dab446fc8e58b3b3d9334b8c38722e73881b9e)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit 4e30d8c53c0a4952f81cc3b5680c7e92fffb1355
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Nov 18 11:59:18 2014 -0800
+
+    ceph_objectstore_tool: Add utility routine get_osdmap()
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit b3021b0d3362000b5938d406ed2e032a8eb38405)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit f997b126afaeadebe6b6d76954fbe2008bd2a7d8
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Nov 12 21:14:11 2014 -0800
+
+    ceph_objectstore_tool: Clear ...INCOMPAT_SHARDS from feature if exporting replicated pg
+    
+    Don't require importing OSD to have shards feature for replicated pg
+    
+    http://tracker.ceph.com/issues/10077 Fixes: #10077
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 86baf2d38170ef19de2dd5e9ce3f280237d8474d)
+
+commit 3f862da57945f821ed459f5a77f8032331c9cb20
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Nov 18 00:10:41 2014 -0800
+
+    tests: ceph_objectstore_tool.py test all variants of export/import
+    
+    Handle change of error message text
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 9e53c3554c71121f2e2dd0234b5232da37ad5a1b)
+
+commit 2a58bdee19eb8f02a2800d728d402e76566d7f58
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Nov 17 23:23:40 2014 -0800
+
+    ceph_objectstore_tool: Make --file option consistent by treating "-" as stdout/stdin
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 8c87f3284f87d1121218cb7f41edc81b74c9df29)
+
+commit 70329be7be5d80e52d5424958cecd7f4d939add6
+Author: David Zafman <dzafman at redhat.com>
+Date:   Sat Nov 15 11:43:10 2014 -0800
+
+    tests: ceph_objectstore_tool.py fix list-attr for erasure code
+    
+    Adding testing of xattr for erasure coded shards
+    Fix error message when finding an unexpected xattr key
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit cbecab477a70782f2f69258f035e78fb5c829810)
+    
+    Conflicts:
+    	src/test/ceph_objectstore_tool.py
+
+commit bc921c7ecbc061ccef4847d967986c9fa902111f
+Author: David Zafman <dzafman at redhat.com>
+Date:   Sat Nov 15 11:46:15 2014 -0800
+
+    tests: ceph_objectstore_tool.py check for malformed JSON for erasure code objs
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 40717aa4c399e87d2c3e32038f78788eb213f87d)
+
+commit 99ffd137f17c438e3ee9dbbc0ab73cdcd3a45a5c
+Author: David Zafman <dzafman at redhat.com>
+Date:   Sat Nov 15 11:44:54 2014 -0800
+
+    tests: ceph_objectstore_tool.py fix off by 1 ATTR_OBJS handling
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit eaf1d1e35243566c46b478788e79e0ebf7583015)
+
+commit 951c951a0f164271c5e9b96ecbd510cf5c6663b6
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Nov 14 11:00:17 2014 +0100
+
+    tests: ceph_objectstore_tool.py skip if /dev/tty fails
+    
+    Some environments do not have a /dev/tty. When opening /dev/tty fails,
+    skip the test instead of returning an error.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 4c94f1778fdf483e9e0b62f89f7e46e78aeeebf3)
+
+commit 8dc263555d7aca2befa912c78c585a43c8e7592c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 19:15:50 2014 +0100
+
+    tests: ceph_objectstore_tool.py encapsulate init-ceph stop
+    
+    Call init-ceph in kill_daemons and add a call to kill_daemon when main
+    returns on error so that it never leaves daemons hanging.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit fc435ff3623d196dd7cc375302acd8dfc9eb59fd)
+
+commit b78d802f3e082b0762203ae37b3c3a44b7608907
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 19:14:49 2014 +0100
+
+    tests: ceph_objectstore_tool.py main returns
+    
+    Instead of calling sys.exit() the main function returns the desired exit
+    code.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 0f3d7b1315f2b5595047d8bd13949ed0d9194bfa)
+
+commit 04e480b09b59f5318e9b206e6c3e529d8bb22328
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 17:32:14 2014 +0100
+
+    tests: ceph_objectstore_tool.py replace stop.sh with init-ceph
+    
+    The stop.sh will stop all ceph-* processes. Use the init-ceph script
+    instead to selectively kill the daemons run by the vstart.sh cluster
+    used for ceph_objectstore_tool.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit e8f34bd62bf282144b8851fb9764cf4429a49c25)
+
+commit 51855584eb970b28dfa266ee3653963fb77a2b1e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 17:30:29 2014 +0100
+
+    tests: ceph_objectstore_tool.py use a dedicated directory
+    
+    Set CEPH_DIR to a directory that is specific to ceph_objectstore_tool so
+    that it can run in parallel with other vstart.sh clusters.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit e303d1afde58e68c1f587962010da9e1f1278bc3)
+    
+    Conflicts:
+    	src/test/ceph_objectstore_tool.py
+
+commit 454ec85ae449cb20c2ddecade421262d9d9de615
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 17:27:01 2014 +0100
+
+    tests: ceph_objectstore_tool.py run faster by default
+    
+    By default use only a small number of objects to speed up the tests. If
+    the argument "big" is given, use a large number of objects as it may
+    help find some problems.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 235257c257aea98b770d9637957818c8aeb6c745)
+
+commit 427fe9177f90db091685b937839dcc4dfe4c8a01
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 17:21:48 2014 +0100
+
+    tests: ceph_objectstore_tool.py run mon and osd on specific port
+    
+    By default vstart.sh runs MDS but they are not needed for the tests,
+    only run mon and osd instead. Instead of using the default vstart.sh
+    port which may conflict with a already running vstart.sh, set the
+    CEPH_PORT=7400 which is not used by any other test run with make check.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit f04d4e7539bc8c1b6cf94db815f9dcdecc52faa2)
+
+commit 28ed34a7dc32033be61cd61178eb59471de45aac
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 17:16:41 2014 +0100
+
+    tests: ceph_objectstore_tool.py can use a WARN cluster
+    
+    The tests do not need HEALTH_OK exclusively, a HEALTH_WARN cluster can
+    also run them successfully.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 783378c019aaac36d542e1b12c0d64196ea21012)
+
+commit 8548d7c65e8743d4e743c77981acd702efab3fb2
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Nov 13 17:12:35 2014 +0100
+
+    tests: ceph_objectstore_tool.py use env python
+    
+    Using #/usr/bin/env python instead of a hard coded path is more flexible
+    and can also be used to run from virtualenv.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 74506d2506d03d05935cbe342fef9dc1d9022a13)
+
+commit 5b4c2ee0902d94e6fa5bee67188fddcf0e0c38a2
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Nov 12 15:22:04 2014 -0800
+
+    ceph_objectstore_tool: Fixes to make import work again
+    
+    The is_pg() call is now true even for pgs pending removal, fix broken
+        finish_remove_pgs() by removing is_pg() check.
+    Need to add create_collection() to the initial transaction on import
+    
+    Fixes: #10090
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 5ce09198bf475e5c3a2df26232fa04ba9912b103)
+    
+    Conflicts:
+    	src/tools/ceph_objectstore_tool.cc
+
+commit e0dab883d29bd3a54b5707f8d3ea830f8a1ce516
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Oct 6 18:26:44 2014 -0700
+
+    ceph_objectstore_tool: Accept CEPH_ARGS environment arguments
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 10fe7cfe561f91717f2ac2e13aeecc06a903704e)
+
+commit 5f788eaa61054c6cb27960b5544b321078706343
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Oct 3 15:12:28 2014 -0700
+
+    ceph_objectstore_tool: MemStore needs a CephContext
+    
+    Pass g_ceph_context to ObjectStore::create() needed by MemStore
+    
+    Fixes: #9661
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0b155d00c542f0d8b8b5b0324dac4b3cf7ff37b5)
+
+commit 7470c7ca02ef6313b925be3ce4b27437a0c2e1e0
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Mar 3 10:41:28 2015 -0800
+
+    ceph_objectstore_tool: Rename generated binary to ceph-objectstore-tool
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 4f72ba545e204a24a55adead43c61cb1d4394381)
+    
+    Conflicts:
+    	debian/ceph-test.install
+    	src/.gitignore
+    	src/test/ceph-helpers.sh (doesn't exist in firefly)
+    	src/test/ceph_objectstore_tool.py
+    	src/tools/ceph_objectstore_tool.cc
+
+commit 4b51645fdfe8a761f7ebc0faee1a87187d498fee
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Nov 12 13:35:43 2014 -0800
+
+    vstart.sh: warn less
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a69b8450f642af91a352d0de4378d93828291933)
+
+commit 3075919c0dcee1f33a0beb299e98d8a88836c5f8
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Nov 17 23:02:50 2014 -0800
+
+    ceph_objectstore_tool: When exporting to stdout, don't cout messages
+    
+    Fixes: #10128
+    Caused by a2bd2aa7
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0d5262ac2f69ed3996af76a72894b1722a27b37d)
+    (cherry picked from commit 6cb9a2499cac2645e2cc6903ab29dfd95aac26c7)
+
+commit ca9df2803f3200431f5f7ea99a713005f15b7f5a
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Sep 2 14:56:10 2014 +0200
+
+    ceph_objectstore_tool.cc: prefer ++operator for non-primitive iterators
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit a5468abe4459159e8a9f7a4f21d082bb414e1cdd)
+
+commit ac396f5df3c51d09b9dbf7e6be7bed1d755d2317
+Author: Zhiqiang Wang <wonzhq at hotmail.com>
+Date:   Fri Aug 29 16:39:40 2014 +0800
+
+    Test: fixing a compile warning in ceph_objectstore_tool.cc
+    
+    For the compiler's sake:
+    tools/ceph_objectstore_tool.cc:2547:15: warning: ‘r’ may be used
+    uninitialized in this function [-Wmaybe-uninitialized]
+    
+    Signed-off-by: Zhiqiang Wang <wonzhq at hotmail.com>
+    (cherry picked from commit c3e1466b46076f133b62f98e2c0b712bdde0e119)
+
+commit b863970110e7f8e835e77864ea59b81f0b026158
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Aug 20 01:33:45 2014 -0700
+
+    ceph_objectstore_tool: Bug fixes and test improvements
+    
+    ceph_objectgstore_tool:
+    Fix bugs in the way collection_list_partial() was being called
+    which caused objects to be seen over and over again.
+    
+    Unit test:
+    Fix get_objs() to walk pg tree for pg with sub-directories
+    Create more objects to test object listing code
+    Limit number of larger objects
+    Limit number of objects which get attributes and omaps
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit a03f719eb3a46f410550afce313e6720e0c27946)
+
+commit 4f83005bb8a615df370de7b6dfe5d926c7cfef7f
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue Aug 5 18:26:11 2014 -0700
+
+    ceph_objectstore_tool, test: Implement import-rados feature and unit test code
+    
+    Fixes: #8276
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 23ec93a86140c4b271b45d87c62682288079cbba)
+
+commit df334617705fe862b820ef5de674ae54efad0cea
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed Aug 6 19:53:43 2014 -0700
+
+    test: ceph_objectstore_tool unit test improvements
+    
+    Add namespaces to testing
+    Increase filesize so export will have multiple chunks
+    Put json for each object into the db dict
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+
+commit ecd25cf6ce1a1a34e536c7fd313225b3bdedd2e0
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Thu Aug 7 13:31:48 2014 -0700
+
+    ceph_objectstore_tool: Add operation "rm-past-intervals" for testing purposes
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 3694068b67fd625495c4511390bc5bcbfbbd28f5)
+
+commit 6b50b384efc1f0735f8635a59663b50e3155de1a
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Thu Aug 7 11:46:08 2014 -0700
+
+    ceph_objectstore_tool: Add past_intervals to export/import code
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 9325ec15d4b89c5537cbcbda4c7594e25dc6e7df)
+
+commit 63529079b97c99cbaa863e1be865e2693e90c556
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Thu Aug 7 14:11:21 2014 -0700
+
+    ceph_objectstore_tool: Minor improvements
+    
+    Make all non-error non-debug output to stdout
+    Fix a message
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit a2bd2aa7babb4ad45ba21c70f9d179fda27742aa)
+
+commit 5e3f89ece7bdd09ed06ca4208cfa0a0b3104f109
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue Aug 5 12:26:42 2014 -0700
+
+    ceph_objectstore_tool, test: Add list-pgs operations and unit test case
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit f01e334c697057158354f0ce5ecff6d6ba8e2704)
+
+commit edc9f71efeebe5241004c669cc58089905907634
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed Jul 30 12:39:49 2014 -0700
+
+    Complete replacement of ceph_filestore_tool and ceph_filestore_dump
+    with unified ceph_objectstore_tool
+    
+    Move list-lost-objects and fix-lost-objects features from
+      ceph_filestore_tool to ceph_objectstore_tool as list-lost, fix-lost
+    Change --type to --op for info, log, export...operations
+    Add --type for the ObjectStore type (defaults to filestore)
+    Change --filestore-path to --data-path
+    Update installation, Makefile.am, and .gitignore
+    Fix and rename test case to match
+      Add some additional invalid option checks
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 83fbc91e5c4e52cc1513f34908f99d2ac3b930df)
+
+commit a42273ecd955470105cba1cc4ac7eb782ac46833
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed Jul 30 11:22:29 2014 -0700
+
+    Renames and removal towards a unified ceph_objectstore_tool
+    
+    Rename ceph_filestore_dump.cc and ceph_filestore_dump.py
+    Remove ceph_filestore_tool.cc
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 77864193a1162393ade783480aee39a232934377)
+
+commit 9ee2c27096784efceb02b06a0df4325979385f44
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue May 20 11:19:19 2014 -0700
+
+    ceph_filestore_dump: Add set-omaphdr object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit b4d95cc85af9af64d33d541cd69c5f28fd45423b)
+
+commit c7d261d40367ab01a577bf255da776a622f8984a
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue May 20 10:44:37 2014 -0700
+
+    ceph_filestore_dump: Add get-omaphdr object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 30c0f3114e665acdd99e64bf0d2a7399b33e8d61)
+
+commit 271e3ca19b9e878c6c3c26a9ec461faf06e7a19d
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 19 20:55:47 2014 -0700
+
+    ceph_filestore_dump: Add rm-omap object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 0fc6bd2777edf24a044f454beacf1647cc52f9fe)
+
+commit 20165d101a30c6beb591ca56b56bdf5505f70cf3
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 19 20:47:14 2014 -0700
+
+    ceph_filestore_dump: Add set-omap object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 50cd57e902fe508f98f63fea30626780b07561d9)
+
+commit 7547f3d17bc89437c529aa96413b0bebb808da5e
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 19 20:37:01 2014 -0700
+
+    ceph_filestore_dump: Add get-omap object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit b50c43ce5e52f5bbcb3684f6793d50f34ed741d1)
+
+commit f391feb1f50632adbe94c3e8cdc4b75091d6b8e1
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 19 18:33:24 2014 -0700
+
+    ceph_filestore_dump: Add rm-attr object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 465d77733c7499fbd65bebe7141895714c625e0d)
+
+commit 7bd2dd3a1d022df6d3f886ad12a191d0cfcef1d6
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 19 18:17:27 2014 -0700
+
+    ceph_filestore_dump: Add set-attr object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 95554e03dcb74b6d74b2f1b2891b3570abb187b8)
+
+commit 6724da821158ddee6ef6ee7b5bac9e97dcfc2292
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Thu May 15 15:50:48 2014 -0700
+
+    ceph_filestore_dump: Add get-attr object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 55d43c0e20fc853daec134449b9954248fd7ef31)
+
+commit 55c21b898834d77234227d3fc14c8580ef698663
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 17:52:09 2014 -0700
+
+    ceph_filestore_dump: Add set-bytes object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 3c24d1f46a624d0a053ad234997a1f8c8b036db5)
+
+commit 2f1926d2f57082666350d8223b09f61da5f95b6f
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 17:51:29 2014 -0700
+
+    ceph_filestore_dump: Add get-bytes object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 869dd92cc8ec29a3a684f88c335d359f225bba24)
+
+commit fcabb8133af3b90d5d9e976ce658ceccfc5b89c5
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 17:50:16 2014 -0700
+
+    ceph_filestore_dump: Add list-omap object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 48890c7741d76cf92b5f589f49378ca57292e88b)
+
+commit 303e4cedd91ca3553e956eec495a05e3136b3c56
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 18:32:42 2014 -0700
+
+    ceph_filestore_dump: Add list-attrs object command
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 00c6b0673288ca76fe144575b7af76eaa36f5857)
+
+commit aff2c995f67bdde1a592a9b24e4e96e85735d500
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 17:39:17 2014 -0700
+
+    ceph_filestore_dump: Add --type list to output objects in a pg in json
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 844dabb7f311e68eba0293ae9ca4c68521745877)
+
+commit 7cda8b7a0b43d709b73d875088ecd169f47d59ab
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 17:44:31 2014 -0700
+
+    ceph_filestore_dump: Add remove object command and usage for new commands
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 605caec64b036f8ab5ae451d7e9e7515d414f28e)
+
+commit a4694643ae4503746d3fac8a0feac706ddc13a16
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Fri Jun 6 17:05:53 2014 -0700
+
+    ceph_filestore_dump: Add utility function get_fd_data()
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit d4a9dafe442f139562497d746f80ba49faa954e8)
+
+commit 62dc823fb3b969c0ad52594419e8a86a3ff1e6ef
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 19 18:16:52 2014 -0700
+
+    ceph_filestore_dump: Fail import/export with a tty for stdin/stdout
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 7520e504cf2cdd3de2f236acb2cbf8a5016e6698)
+
+commit 9816f872ad59bcaa1a125b297f3991b333aad39c
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue May 20 11:56:20 2014 -0700
+
+    ceph_filstore_dump: Save if stdout is a tty and add routine to clean binary strings
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 3a574cc78b0e3ec6d8dd0c39ee20e7a54ad64056)
+
+commit d4aedeb833f23bf4ce6187cb82910ab2e71d48e5
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 15:30:11 2014 -0700
+
+    common: Add missing ghobject_t::decode() for json
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit c05f895d15a1d0e78ff5e9ae1a83f0a5424103d0)
+    
+    Changes:
+    	Adjusted for older shard_t
+
+commit dadecb1e05e528093642ba356fa7a70a0b546727
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 15:37:17 2014 -0700
+
+    ceph_filestore_dump: Add --skip-journal-replay and --skip-mount-omap
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 2e9dcb256509e7c921556202052f0cc1dcd91398)
+
+commit c6369987b1e1e55a9d0ab0bc328f61f52fc608d0
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 15:41:15 2014 -0700
+
+    os: Add optional flags to generic ObjectStore creation (SKIP_JOURNAL_REPLAY
+    and SKIP_MOUNT_OMAP)
+    
+    Only FileStore cares about these flags, so passed on during create()
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 3d9fde9d92322cd8ac3e3d8bcbf5b0a01ef0528b)
+    
+    Conflicts:
+    	src/os/FileStore.cc
+
+commit 3381aebb113d14249f6998a86ebf6b4ec6adc42d
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Fri May 16 18:20:11 2014 -0700
+
+    ceph_filestore_dump: Improve debug output by showing actual offset
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 44b261d5d1b36528bfbcb37dbd866b615e14be99)
+
+commit 1164b2e1610028a40cddbed09f9da5649bd2023a
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 12:36:37 2014 -0700
+
+    ceph_filestore_dump: Use cerr now that we aren't closing stderr
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 087c0f9d31e0f3d5bae7eac6231978105a71677e)
+
+commit f224429aa4fcba897be5e438bbb49d1025e2c482
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Wed May 14 12:42:21 2014 -0700
+
+    common,ceph_filestore_dump: Add ability for utilities to suppress library dout output
+    
+    Suppress dout output with CODE_ENVIRONMENT_UTILITY_NODOUT
+    ceph_filestore_dump turns on dout output if --debug specified
+    When used it can still be enable with --log-to-stderr --err-to-stderr
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit f7f9b251fc377651d8da4cbfd1942c3b86f3247e)
+
+commit 3f4cabdb84e58fcec0c3f508f980881c59fba948
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue May 13 18:27:30 2014 -0700
+
+    ceph_filestore_dump: Export omap in batches for large omap case
+    
+    New function get_omap_batch()
+    Create a TYPE_OMAP section for each batch
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 501dd3c05b8983159a289b021943cb828b908f53)
+
+commit 0b757af5be338b65fd9124ac5158bfe02ad5f899
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Mon May 12 15:50:34 2014 -0700
+
+    ceph_filestore_dump: Remove unused bufferlist databl
+    
+    Signed-off-by: David Zafman <david.zafman at inktank.com>
+    (cherry picked from commit 398b418e2b9f8260bcfacac8bcebea5beffcceca)
+
+commit 4a742fe29b6d959912a38d132344c695f89dd34f
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed May 7 14:12:15 2014 +0200
+
+    ceph_filestore_dump.cc: cleanup includes
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 8620609884243596d35b69c571d2da751e63cf2b)
+
+commit 420ea03aa3cd52bd035d31ba111c3d6d0745352d
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Thu Jan 29 18:19:16 2015 +0100
+
+    librados: rectify the guard in RadosClient::wait_for_osdmap().
+    
+    RadosClient::wait_for_osdmap() did not signalize lack of connection
+    via -ENOTCONN error code when the Objecter instance was allocated.
+    The proper way is to check the connection state explicitly.
+    
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 34473f78f101d87d2606e0e7112682a47ff24830)
+    
+    Conflicts:
+    	src/librados/RadosClient.cc
+            the modified guard was not present: add the new guard instead
+            of modifying it
+
+commit 1b2667211f90a1b630d2ddffe99b0fb00bb3c07c
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Mon Jan 19 15:07:21 2015 +0100
+
+    librados: fix resources leakage in RadosClient::connect().
+    
+    If RadosClient::connect was called a second time (which could
+    happen as a part of recovery from failure), the instances
+    of Objecter and Messenger allocated by the first call were leaked.
+    
+    Additionally, the implementation of the method wrongly reported
+    memory allocation problems -- it throwed std::bad_alloc exception
+    instead of returning -ENOMEM error code.
+    
+    Fixes: #10425
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 624c056da093c8741242892413438a291c03c7d5)
+    
+    Conflicts:
+    	src/librados/RadosClient.cc
+            resolve adding (std::nothrow) that failed because the
+            prototype of the constructor is not the same
+
+commit 4e32ff2b60549742d01b18429810c89f5f707548
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Dec 5 15:29:52 2014 -0800
+
+    osd_types: op_queue_age_hist and fs_perf_stat should be in osd_stat_t::operator==
+    
+    Fixes: 10259
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1ac17c0a662e6079c2c57edde2b4dc947f547f57)
+
+commit 6e58732f546ec6241b198d2473902d66327cdc36
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Mon Jan 19 18:49:15 2015 +0000
+
+    mon: PGMonitor: skip zeroed osd stats on get_rule_avail()
+    
+    Fixes: #10257
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit b311e7c36273efae39aa2602c1f8bd90d39e5975)
+    
+    Conflicts:
+    	src/mon/PGMonitor.cc
+            ceph::unordered_map changed the context, simple resolution
+
+commit bcc8cfb24a96a7874a24760771755088a231a8d7
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Jan 16 18:13:05 2015 +0000
+
+    mon: PGMonitor: available size 0 if no osds on pool's ruleset
+    
+    get_rule_avail() may return < 0, which we were using blindly assuming it
+    would always return an unsigned value.  We would end up with weird
+    values if the ruleset had no osds.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 8be6a6ab2aa5a000a39c73a98b11a0ab32fffa1c)
+
+commit 894c8ad26fd2da203dcbf8eb0ad5e2af0223d5a9
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Jan 16 18:12:42 2015 +0000
+
+    mon: PGMonitor: fix division by zero on stats dump
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 50547dc3c00b7556e26b9a44ec68640c5c3a2384)
+
+commit 1e58bb49b99118d064c1ca92e42cbfb2786fdaff
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 17 16:06:55 2014 +0100
+
+    crush: set_choose_tries = 100 for erasure code rulesets
+    
+    It is common for people to try to map 9 OSDs out of a 9 OSDs total ceph
+    cluster. The default tries (50) will frequently lead to bad mappings for
+    this use case. Changing it to 100 makes no significant CPU performance
+    difference, as tested manually by running crushtool on one million
+    mappings.
+    
+    http://tracker.ceph.com/issues/10353 Fixes: #10353
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 2f87ac807f3cc7ac55d9677d2051645bf5396a62)
+    
+    Conflicts:
+    	src/erasure-code/lrc/ErasureCodeLrc.cc
+            safely ignored because the file does not exist
+
+commit 27dbbb3c312ea68a96b011ccb12394c75c0fb0f3
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Feb 12 13:49:50 2015 -0800
+
+    mon/OSDMonitor: do not trust small values in osd epoch cache
+    
+    If the epoch cache says the osd has epoch 100 and the osd is asking for
+    epoch 200+, do not send it 100+.
+    
+    Fixes: #10787
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a5759e9b97107488a8508f36adf9ca1aba3fae07)
diff --git a/doc/changelog/v0.80.11.txt b/doc/changelog/v0.80.11.txt
new file mode 100644
index 0000000..beb1ea9
--- /dev/null
+++ b/doc/changelog/v0.80.11.txt
@@ -0,0 +1,3184 @@
+commit 8424145d49264624a3b0a204aedb127835161070 (tag: refs/tags/v0.80.11, refs/remotes/gh/firefly)
+Author: Jenkins Build Slave User <jenkins-build at jenkins-slave-wheezy.localdomain>
+Date:   Tue Nov 17 18:57:48 2015 +0000
+
+    0.80.11
+
+commit 2a14d16712fbe2ee9d7d2aef389e18fcb2809a47
+Merge: c551622 a06179a
+Author: Yuri Weinstein <yuri.weinstein at gmail.com>
+Date:   Mon Nov 2 14:34:28 2015 -0800
+
+    Merge pull request #6451 from jcsp/wip-firefly-urls
+    
+    qa: http://ceph.com/qa -> http://download.ceph.com/qa
+
+commit a06179acb268b073fcf67fbbf19152c1a5a275af
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 24 18:10:46 2015 -0400
+
+    qa: http://ceph.com/qa -> http://download.ceph.com/qa
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d4d65fbd6ad15320339751c604613ac63511e645)
+
+commit c551622ca21fe044bc1083614c45d888a2a34aeb
+Merge: 241edfa bff2f47
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Oct 23 21:47:27 2015 +0200
+
+    Merge pull request #5823 from SUSE/wip-11700-firefly
+    
+    make the all osd/filestore thread pool suicide timeouts separately configurable
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 241edfabf6a6c767afc1e283dd7387377ece36c7
+Merge: 07e90f5 f39c791
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Oct 23 21:01:54 2015 +0200
+
+    Merge pull request #5815 from SUSE/wip-12838-firefly
+    
+    Mutex Assert from PipeConnection::try_get_pipe
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 07e90f54318c0a6202add4de16f965c6e331d513
+Merge: eaf7dc3 d0d6727
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Oct 22 18:19:39 2015 +0200
+
+    Merge pull request #5529 from SUSE/wip-12586-firefly
+    
+    FileStore calls syncfs(2) even it is not supported
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit eaf7dc343eb78f09d9a4b1815f6bd6ceb4217ad7
+Merge: a960327 98769f7
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Oct 22 07:44:12 2015 -0700
+
+    Merge pull request #5532 from SUSE/wip-12635-firefly
+    
+    swift smoke test fails on TestAccountUTF8
+
+commit a96032738ba1e1cc35f21607eba06e7e241abd97
+Merge: 15f3628 86f9e55
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Oct 22 07:33:02 2015 -0700
+
+    Merge pull request #5997 from SUSE/wip-13178-firefly
+    
+    rgw: content length parsing calls strtol() instead of strtoll()
+
+commit 15f362808b7100a5bade24cc78e718b04d391b54
+Merge: e010899 ebba1d5
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Oct 22 10:45:48 2015 +0200
+
+    Merge pull request #5526 from SUSE/wip-12584-firefly
+    
+    OSD crash creating/deleting pools
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit e010899ac9cd4060c09f0f1c754f0840b5149f6b
+Merge: 24ffe4c 8c02376
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Oct 22 10:43:29 2015 +0200
+
+    Merge pull request #5287 from SUSE/wip-12389-firefly
+    
+    PGLog::proc_replica_log: correctly handle case where entries between olog.head and log.tail were split out
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 24ffe4c5156843ce69cae30087fb767063fd489a
+Merge: f48450b c155df2
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Oct 21 10:03:13 2015 +0200
+
+    Merge pull request #6328 from dachary/wip-13551-firefly
+    
+    qemu workunit refers to apt-mirror.front.sepia.ceph.com
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit c155df217287b980e176c3c98ee49753d6378740
+Author: Yuan Zhou <yuan.zhou at intel.com>
+Date:   Fri Jun 19 00:02:20 2015 +0800
+
+    qa: Use public qemu repo
+    
+    This would allow some external tests outside of sepia lab
+    
+    Signed-off-by: Yuan Zhou <yuan.zhou at intel.com>
+    (cherry picked from commit 4731c1e35539c9506ff3fe3141553fad099d0eee)
+
+commit d9ae7d80850b9ea4a84549c3afb4603cf9585b6a
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Apr 16 08:29:41 2015 -0700
+
+    use git://git.ceph.com
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 34c467ba06345eacd2fd0e79c162dfd0b22f0486)
+    
+    Conflicts:
+    	qa/run_xfstests-obsolete.sh : does not exist in firefly
+    	qa/workunits/suites/fsx.sh  : trivial resolution
+
+commit f48450bdc70eef7cef8f76bc30f678a6d8d52b78
+Merge: f275ad2 b894b36
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Oct 21 01:02:08 2015 +0200
+
+    Merge pull request #5822 from SUSE/wip-12837-firefly
+    
+    WBThrottle::clear_object: signal on cond when we reduce throttle values
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit f275ad21a48cc4f2812f3ab9e3e9b8b05469c3c7
+Merge: 143e267 81bb6dd
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:48:39 2015 +0200
+
+    Merge pull request #6325 from dachary/wip-13041-firefly
+    
+    common/Thread:pthread_attr_destroy(thread_attr) when done with it
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 143e267a30ef7aac04fdfa530babab529cf30c1a
+Merge: 725401e 6d396a3
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:46:28 2015 +0200
+
+    Merge pull request #6091 from SUSE/wip-13252-firefly
+    
+    mon: does not check for IO errors on every transaction
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 725401e05d0fbe41d93b200fe39d73d9dddae80c
+Merge: 8fd4dd7 c85d063
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:45:19 2015 +0200
+
+    Merge pull request #6087 from SUSE/wip-13244-firefly
+    
+    client nonce collision due to unshared pid namespaces
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 8fd4dd7480148c664d2c99956a7c987b8707c3c3
+Merge: 77a1b5f 6d82eb1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:44:32 2015 +0200
+
+    Merge pull request #6010 from liewegas/wip-globalid-firefly
+    
+    increase globalid default for firefly
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 77a1b5f1292d8410a1c29cebb0da449b09a230d3
+Merge: a3823fe 8c14cad
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:43:33 2015 +0200
+
+    Merge pull request #5991 from SUSE/wip-13043-firefly
+    
+    ThreadPool add/remove work queue methods not thread safe
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit a3823fe76171479e4c8f071f6e8eee3f13a02441
+Merge: e771054 48c929e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:42:28 2015 +0200
+
+    Merge pull request #5988 from SUSE/wip-13038-firefly
+    
+    PG::handle_advance_map: on_pool_change after handling the map change
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit e771054241fcba536a478f1d014feb20a434fa3f
+Merge: e43d049 cd1396c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:41:19 2015 +0200
+
+    Merge pull request #5820 from SUSE/wip-12845-firefly
+    
+    osd/PGLog.cc: 732: FAILED assert(log.log.size() == log_keys_debug.size())
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit e43d0492a415be5a0feb361efbfbdda6e00a6234
+Merge: 11ed9f9 2c2ffa1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:40:28 2015 +0200
+
+    Merge pull request #5814 from SUSE/wip-12840-firefly
+    
+    recursive lock of md_config_t (0)
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 11ed9f9b263a1d3a8df7996d5644f0f6de7a9b1a
+Merge: aead425 2c0d7fe
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:39:32 2015 +0200
+
+    Merge pull request #5813 from SUSE/wip-12822-firefly
+    
+    ceph-fuse crash in test_client_recovery
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit aead4255528e60a2ccc6f4d47a6cb482bfdccc82
+Merge: 1c65d09 d3c9469
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:37:58 2015 +0200
+
+    Merge pull request #5726 from ceph/wip-12752
+    
+    is_new_interval() fixes
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1c65d09ef8de2732cfa6f18d22de2c7b3fac0f0f
+Merge: 1f0f4bb 411769c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:37:01 2015 +0200
+
+    Merge pull request #5698 from tchaikov/wip-12638-firefly
+    
+    mon: add a cache layer over MonitorDBStore
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1f0f4bb5347cb935095dd374d6dcdec44ff175e2
+Merge: 4a1e54f 278d732
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:35:56 2015 +0200
+
+    Merge pull request #5619 from liewegas/wip-journal-firefly
+    
+    os/FileJournal: Fix journal write fail, align for direct io
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+    Reviewed-by: Nathan Cutler <ncutler at suse.cz>
+
+commit 4a1e54fc88e43885c57049d1ad4c5641621b6c29
+Merge: f272435 de53add
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:31:52 2015 +0200
+
+    Merge pull request #5360 from ceph/wip-11786.firefly
+    
+    mon: MonitorDBStore: get_next_key() only if prefix matches
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit f272435c1303327e7dae248179387d12e28ea6bc
+Merge: 21452ed e7d08b1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:30:04 2015 +0200
+
+    Merge pull request #5236 from SUSE/wip-12312-firefly
+    
+    mon: adding exsting pool as tier with --force-nonempty clobbers removed_snaps
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 21452ed93b707984d5301a51040ba8c311678c9c
+Merge: 14c8528 971eb3f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 21:28:31 2015 +0200
+
+    Merge pull request #5050 from SUSE/wip-12015-firefly
+    
+    LibRadosTwoPools[EC]PP.PromoteSnap failure
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 14c85282399aca29a31566e0f068376b10cb95e6
+Merge: b6d5768 7a8b6fb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 13:09:38 2015 +0200
+
+    Merge pull request #6207 from SUSE/wip-13417-firefly
+    
+    Fix -Wno-format and -Werror=format-security options clash
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit b6d57686e1f482bf510e6c6c0ae56cff575f3eca
+Merge: fca8a17 415335d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 13:08:01 2015 +0200
+
+    Merge pull request #6203 from SUSE/wip-13413-firefly
+    
+    fedora21 has junit, not junit4
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit fca8a17bbb91ce5b3cb0c6a282cded03fe37956f
+Merge: 6240b61 20ad17d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 13:06:14 2015 +0200
+
+    Merge pull request #5992 from SUSE/wip-13168-firefly
+    
+    upstart: configuration is too generous on restarts
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 6240b61fc48e4f7b306ec18eca51f40081b5160d
+Merge: d2459d8 04b2a87
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 13:04:40 2015 +0200
+
+    Merge pull request #5541 from dachary/wip-12418-firefly
+    
+    ceph-disk: sometimes the journal symlink is not created
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d2459d8b9c189e557f81bb7d10dd17cc53cf9af1
+Merge: 3e0e3c5 644f213
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 12:36:01 2015 +0200
+
+    Merge pull request #5729 from ceph/wip-11455-firefly
+    
+    rgw: init some manifest fields when handling explicit objs
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 3e0e3c518bf68e9d0ad7a79d804602634b9c6466
+Merge: e44a777 e7931a7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 12:35:22 2015 +0200
+
+    Merge pull request #5730 from ceph/wip-12537-firefly
+    
+    RGW returns requested bucket name raw in "Bucket" response header
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit e44a7775fb34ccdf7ff36e5e56aba9a309521be1
+Merge: 028da25 3be204f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 20 12:34:01 2015 +0200
+
+    Merge pull request #5831 from gnuoy/wip-11140-firefly
+    
+    /etc/init.d/radosgw restart does not work correctly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 81bb6dd7de8a191c11c16b3cdc07355ef3434435
+Author: zqkkqz <zheng.qiankun at h3c.com>
+Date:   Fri Aug 7 10:49:45 2015 +0800
+
+    Common/Thread: pthread_attr_destroy(thread_attr) when done with it
+    When a thread attributes object is no longer required, it should be destroyed using the
+    pthread_attr_destroy() function. Destroying a thread attributes object has no effect on threads that were created using that object.
+    
+    Fixes: #12570
+    Signed-off-by: zqkqkz zheng.qiankun at h3c.com
+    (cherry picked from commit 9471bb838a420ef5f439191d87e5388fecccb9e6)
+
+commit 77d6426a8323db91a60f246f385826c35f31521c
+Author: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+Date:   Fri Jul 17 12:43:52 2015 +0200
+
+    Thread.cc: remove malloc/free pair
+    
+    There's no need for mallocing pthread_attr_t in Thread::try_create(),
+    it can be located on stack as it is freed in same function. This reduces
+    pressure put on memory manager.
+    
+    Signed-off-by: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+    (cherry picked from commit 614ac0f4e375f3dd008c8937d3f89f6005d6e0a0)
+
+commit 7a8b6fb4c7b80c33dd3565fc4140d45fe70f0438
+Author: Boris Ranto <branto at redhat.com>
+Date:   Fri Aug 15 19:34:27 2014 +0200
+
+    Fix -Wno-format and -Werror=format-security options clash
+    
+    This causes build failure in latest fedora builds, ceph_test_librbd_fsx adds -Wno-format cflag but the default AM_CFLAGS already contain -Werror=format-security, in previous releases, this was tolerated but in the latest fedora rawhide it no longer is, ceph_test_librbd_fsx builds fine without -Wno-format on x86_64 so there is likely no need for the flag anymore
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 7df67a544f6401fd31157b6e2a6ca590d87d7cbc)
+    
+    Conflicts:
+    	src/test/Makefile.am
+
+commit 415335df53bf0d6b42f745b038c1c0c9c4aaa810
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 3 16:14:23 2015 +0100
+
+    ceph.spec.in: junit always except for EPEL 6
+    
+    The package was renamed a long time ago (around the Fedora 15
+    timeframe). The "junit4" name is only relevant for EPEL 6. For EPEL 7
+    and Fedora 20, the "junit" package has "Provides: junit4". And most
+    recently, in the junit package that ships in Fedora 21 and 22, the
+    package maintainer dropped the old Provides: line.
+    
+    http://tracker.ceph.com/issues/10728 Fixes: #10728
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 4f36eaee9ea71ed48018ccb2d7eac3e809c72d82)
+
+commit 98769f7ccf97d6a0c98438f1eab7a5705fb9920b
+Author: Robin H. Johnson <robin.johnson at dreamhost.com>
+Date:   Fri Sep 4 01:07:48 2015 +0000
+
+    Fix casing of Content-Type header
+    
+    It turns out, despite the HTTP spec declaring that header field names
+    should be case-insensitive, some clients treat them wrongly, and
+    consider "Content-type" to not match "Content-Type".
+    
+    CyberDuck was one of those clients, now fixed upstream in
+    https://trac.cyberduck.io/ticket/8999
+    
+    To reduce future occurances of this bug, fix the casing of the
+    Content-Type header, to strictly comply with the HTTP specification (be
+    strict about what you send, and generous about what you receive).
+    
+    Fixes: #12939
+    Backport: hammer, firefly
+    Signed-off-by: Robin H. Johnson <robin.johnson at dreamhost.com>
+    (cherry picked from commit 1b9fbffdc24160251b96cec820d62fb2a12b6eab)
+
+commit ccf268502b0592f5ff58cd1a5920ec02a117acfb
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Aug 13 15:02:03 2015 +0200
+
+    rgw: we should not overide Swift sent content type
+    
+    Fixes: #12363
+    backport: hammer
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit 423cf136f15df3099c9266f55932542d303c2713)
+
+commit 6829ee29a484a3b7055122addcda06a233d3ce53
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Thu Jun 25 18:28:50 2015 +0200
+
+    rgw: send Content-Length in response for GET on Swift account.
+    
+    Fixes: #12158
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 5f47b11791cd46ce2771046e4888575869cc9685)
+    
+    Conflicts:
+    	src/rgw/rgw_rest_swift.cc
+                omit dump_account_metadata() call
+
+commit c9226afd7b9e54a8998bf88dfbd6753b262fdf9d
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Tue Jun 23 11:54:09 2015 +0200
+
+    rgw: enforce Content-Type in Swift responses.
+    
+    Swift sends Content-Type HTTP header even if the response
+    doesn't contain body. We have this behaviour implemented
+    until applying some changes in end_header() function.
+    Unfortunately, lack of Content-Type causes early exits in
+    many Tempest's tests for Swift API verification.
+    
+    Fixes: #12157
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 106aeba206736d4080326f9bc191876bed63370b)
+
+commit 9139fbbc1ab3ae455d2e36b3a768601ccb216801
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Mon Jun 22 13:51:49 2015 +0200
+
+    rgw: force content_type for swift bucket stats request
+    
+    Fixes: 12095
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit da259e4da1329e1e448d75c48c6ee3d1318e19b2)
+
+commit 767f1f74c9f015d6bb3376266ec77a10a2d2c59a
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Tue Apr 21 12:31:19 2015 +0200
+
+    rgw: force content-type header for swift account responses without body
+    
+    This regression was introduced in commit 4cfeca03ade21861ab70ca759f94eb244c16cb39
+    
+    Fixes: #11438
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit 009664e560ee37ef6dc170a0155d6c749e151b06)
+
+commit e3da03dd6be04e782c3e5786767bba4b4964fbec
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Apr 9 20:04:59 2015 +0200
+
+    rgw: shouldn't return content-type: application/xml if content length is 0
+    
+    Fixed: #11091
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit 5cc92bb27cfbaee4af24dc312c9b98331f899794)
+
+commit e7d08b1bca951f9a963eb0aeb4cd88abbe5723ba
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri May 8 10:26:48 2015 -0700
+
+    test/librados/tier.cc: destroy and recreate cache pool on every test
+    
+    Namespaces are not sufficient with the checks for 11493 in the mon.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit bef09e0cdb274cb1c87335a2af9ee532d14a4596)
+
+commit d7f53442260dcfc92e7afa8bba2dd116c15e030d
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Apr 29 12:34:25 2015 -0700
+
+    mon: prevent pool with snapshot state from being used as a tier
+    
+    If we add a pool with snap state as a tier the snap state gets clobbered
+    by OSDMap::Incremental::propogate_snaps_to_tiers(), and may prevent OSDs
+    from starting.  Disallow this.
+    
+    Include a test.
+    
+    Fixes: #11493
+    Backport: hammer, giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit bbec53edf9e585af4e20bbc9ba9057d6fdfda342)
+    
+    Conflicts:
+    	qa/workunits/cephtool/test.sh
+               properly co-exist with "# make sure we can't create an ec pool tier"
+    	src/mon/OSDMonitor.cc
+               properly co-exist with preceding "if (tp->ec_pool())"
+            (The changes to both files would have applied cleanly if
+            https://github.com/ceph/ceph/pull/5389 had not been merged first.)
+
+commit 028da252d85733fcc7d8495750b9ae97043cb0dd
+Merge: ecabc67 f71a6eb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Oct 3 09:40:33 2015 +0200
+
+    Merge pull request #5993 from SUSE/wip-13169-firefly
+    
+    update docs to point to download.ceph.com
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 971eb3f6dddb509d15e5e4bcfd5e34d42ae2e75b
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Nov 13 22:33:10 2014 -0800
+
+    ceph_test_rados_api_tier: fix cleanup of whiteouts
+    
+    Doing a normal DELETE on a whiteout returns ENOENT.  Use the IGNORE_CACHE
+    flag to make sure it removes the whiteout, too.
+    
+    Fixes: #10052
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8dde6a61921798aa188bd69406c8fa7afeb96b45)
+    
+    Conflicts:
+    	src/test/librados/TestCase.cc
+                for it of type ObjectIterator:
+                - use it->first instead of it->get_oid()
+                - use it->second instead of it->get_locator()
+
+commit b134a629863b4601892db03d7c4377040d556bdd
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Nov 13 22:32:20 2014 -0800
+
+    osd/ReplicatedPG: allow whiteout deletion with IGNORE_CACHE flag
+    
+    If the client specifies IGNORE_CACHE, allow a regular DELETE to zap a
+    whiteout.  Expand test case to verify this works.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 34e4d24)
+    
+        Conflicts:
+            src/test/librados/tier.cc
+                replaced NObjectIterator -> ObjectIterator
+                replaced cache_ioctx.nobjects_begin -> cache_ioctx.objects_begin
+                replaced cache_ioctx.nobjects_end -> cache_ioctx.objects_end
+                replace it->get_oid() with it->first for it of type ObjectIterator
+
+commit 6d396a322e5ad61a3ca262b1c78a670481ff740c
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 23 10:58:01 2015 -0400
+
+    mon/Elector: do a trivial write on every election cycle
+    
+    Currently we already do a small write when the *first* election in
+    a round happens (to update the election epoch).  If the backend
+    happens to fail while we are already in the midst of elections,
+    however, we may continue to call elections without verifying we
+    are still writeable.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ef909ccbdc303cce8a39edef255325127832ff16)
+    
+        Conflicts:
+    	src/mon/Elector.cc
+                no MonitorDBStore::TransactionRef in firefly
+
+commit d2bfa19077422eea37205fee9ed6fd5f2692f222
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 23 10:58:13 2015 -0400
+
+    mon/MonitorDBStore: assert/crash if there is a write error
+    
+    Do this globally intead of relying on teh zillion mon callers to
+    check the error code.  There are no cases where we want to
+    tolerate a commit failure.
+    
+    Fixes: #13089
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2fb7b1f0e33ada7c9a1be3de2f7708eb0760fcef)
+
+commit c85d06384e795ab2717868ce45f01ae93181a6be
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Sep 21 15:46:42 2015 -0700
+
+    use simplifed messenger constructor for clients
+    
+    This is all mechanical except the calculation of the nonce, which is
+    now always randomized for clients.
+    
+    Fixes: #13032
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit a3a8c85b79afef67681c32c57b591c0e0a87a349)
+    
+    Conflicts:
+    	src/ceph_fuse.cc
+    	src/ceph_syn.cc
+    	src/libcephfs.cc
+    	src/librados/RadosClient.cc
+    	src/mds/MDSUtility.cc
+    	src/mon/MonClient.cc
+    	src/test/mon/test_mon_workloadgen.cc
+                - different arguments to Messenger::create() in firefly
+
+commit ef24b4ec7245959b1960a415617439bc3baac9a3
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Oct 6 21:20:08 2014 -0700
+
+    librados: use Messenger factory method
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 5a860bec48348ed4c09256ccd394b33ace6b4f52)
+
+commit 3a52acde3133aab2a717fefa967b0d404e50e2d8
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Oct 6 08:50:48 2014 -0700
+
+    mon/MonClient: use generic Messenger factory
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e55cb1f68ae1a04cc5d281bea57ee79ef4a8af38)
+
+commit de8da652b6c969aa0446f0d3351f63b012063c71
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Sep 21 15:20:53 2015 -0700
+
+    msg: add simplified messenger constructor
+    
+    Several callers create messengers using exactly the same parameters:
+    
+    - reading the ms type from cct that is also passed in
+    - a default entity_name_t::CLIENT
+    - the default features
+    
+    Additionally, the nonce should be randomized and not depend on
+    e.g. pid, as it does in several callers now. Clients running in
+    containers can easily have pid collisions, leading to hangs, so
+    randomize the nonce in this simplified constructor rather than
+    duplicating that logic in every caller.
+    
+    Daemons have meaningful entity_name_ts, and monitors currently depend
+    on using 0 as a nonce, so make this simple constructer
+    client-specific.
+    
+    Related: #13032
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit e3785b0b5fbff870adbd5f121021b671912386cf)
+    
+    Conflicts:
+    	src/msg/Messenger.cc
+                - different #includes in firefly
+                - different Messenger::create() arguments in firefly
+
+commit ecabc6796f19c03947bb5b14da4e1b761ff8847f
+Merge: 741dd5b 2e09a2c
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 23 17:09:18 2015 -0400
+
+    Merge pull request #6038 from liewegas/wip-13088
+    
+    common/HeartBeat: include types
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 2e09a2c22ab885f8ec81dbc55f2c8fc0f2984543
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 23 17:06:52 2015 -0400
+
+    common/RWLock: include assert
+    
+    Fixes atomic_t build issue without libatomic-ops.
+    
+    Fixes: #13088
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 741dd5b9433d1592ce91aea70ebec106a1354973
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Sep 22 13:03:49 2015 -0400
+
+    .gitmodules: fix ceph-object-corpus source url
+    
+    Fixes: #13196
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit a1997879aa26299519ed157017f8f5715c626dcc
+Merge: ee81812 01dc221
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Sep 22 12:29:08 2015 -0400
+
+    Merge pull request #6000 from SUSE/wip-12097-firefly
+    
+    kernel_untar_build fails on EL7
+
+commit ee8181206726712729235e4a5f8d2094a6e72f71
+Merge: bb8b422 4e7de5b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Sep 21 13:07:49 2015 -0700
+
+    Merge pull request #5234 from SUSE/wip-12244-firefly
+    
+    Civetweb RGW appears to report full size of object as downloaded when only partially downloaded
+
+commit bb8b422beac22bd8c2e9c1ecd83e265a3de1a3e6
+Merge: 4b08895 f602263
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Sep 21 12:35:52 2015 -0700
+
+    Merge pull request #4535 from xinxinsh/wip-11416-firefly
+    
+    rgw: use correct objv_tracker for bucket instance
+
+commit 6d82eb165fdc91851f702a463022b26c50f5094b (refs/remotes/me/wip-globalid-firefly)
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Jan 18 16:49:20 2015 -0800
+
+    mon: handle case where mon_globalid_prealloc > max_global_id
+    
+    This triggers with the new larger mon_globalid_prealloc value.  It didn't
+    trigger on the existing cluster I tested on because it already had a very
+    large max.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit bbaf582e5bb54ae35327ffd234e4ccf0f07317db)
+
+commit f545a0f430bf6f1e26983fc0ff20a645697f017c
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Jan 18 10:39:25 2015 -0800
+
+    mon: change mon_globalid_prealloc to 10000 (from 100)
+    
+    100 ids (session 100 authentications) can be consumed quite quickly if
+    the monitor is being queried by the CLI via scripts or on a large cluster,
+    especially if the propose interval is long (many seconds).  These live in
+    a 64-bit value and are only "lost" if we have a mon election before they
+    are consumed, so there's no real risk here.
+    
+    Backport: giant, firefly
+    Reviewed-by: Joao Eduardo Luis <joao at redhat.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1d1215fe5f95c2bafee5b670cdae1353104636a0)
+
+commit 01dc221f280ad25aa556f246414e3c3c42762956
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Tue Jun 16 08:13:41 2015 -0700
+
+    qa: update to newer Linux tarball
+    
+    This should make newer gcc releases happier in their default configuration.
+    kernel.org is now distributing tarballs as .xz files so we change to that
+    as well when decompressing (it is supported by Ubuntu Precise so we should
+    be all good).
+    
+    Fixes: #11758
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 1ea3f47ab806d48ca7b045c2731d344eae3900e1)
+    
+    Conflicts:
+    	qa/workunits/kernel_untar_build.sh
+                trivial resolution
+
+commit 86f9e55f0c151c0b9a289b475f87b6a11329e6e1
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jan 30 10:51:52 2015 -0800
+
+    rgw: use strict_strtoll() for content length
+    
+    instead of strict_strtol().
+    
+    Backport: giant, firefly
+    Fixes: #10701
+    
+    Reported-by: Axel Dunkel <ad at dunkel.de>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 1c25dbafb45caf1b261cfcec15b868a2ba6b5fef)
+
+commit f71a6ebf1b371f9389865a0a33652841726ff77b
+Author: Alfredo Deza <adeza at redhat.com>
+Date:   Fri Sep 18 14:13:02 2015 -0400
+
+    doc: correct links to download.ceph.com
+    
+    Signed-off-by: Alfredo Deza <adeza at redhat.com>
+    (cherry picked from commit 387d7800359154950431d0984c756f43f21dd9b4)
+    
+    Conflicts:
+    	doc/install/get-packages.rst
+                preferred the new version in all cases
+
+commit 20ad17d271fb443f6c40591e205e880b5014a4f3
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 3 14:57:34 2015 -0400
+
+    upstart: limit respawn to 3 in 30 mins (instead of 5 in 30s)
+    
+    It may take tens of seconds to restart each time, so 5 in 30s does not stop
+    the crash on startup respawn loop in many cases.  In particular, we'd like
+    to catch the case where the internal heartbeats fail.
+    
+    This should be enough for all but the most sluggish of OSDs and capture
+    many cases of failure shortly after startup.
+    
+    Fixes: #11798
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit eaff6cb24ef052c54dfa2131811758e335f19939)
+
+commit 8c14cad0895590f19a6640c945b52213f30a9671
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Aug 10 19:10:19 2015 -0400
+
+    WorkQueue: add/remove_work_queue methods now thread safe
+    
+    These methods were not acquiring the ThreadPool lock when
+    manipulating the work_queue collection.  This was causing
+    occasional crashes within librbd when opening and closing
+    images.
+    
+    Fixes: #12662
+    Backport: hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3e18449b01c1ab78d1bbfc1cf111aa9bdbef7b1f)
+
+commit 48c929e689b0fa5138922fcb959be5d05296e59a
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Aug 27 11:08:33 2015 -0700
+
+    PG::handle_advance_map: on_pool_change after handling the map change
+    
+    Otherwise, the is_active() checks in the hitset code can erroneously
+    return true firing off repops stamped with the new epoch which then get
+    cleared in the map change code.  The filestore callbacks then pass the
+    interval check and call into a destroyed repop structure.
+    
+    Fixes: 12809
+    Backport: hammer,firefly
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 14e02bc90a463805f4c3e2de210892067a52514b)
+
+commit 4b0889567d7fe28ef6976f8dbb0d329b03200986
+Merge: 0a740d7 5426421
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Thu Sep 10 11:46:41 2015 +0200
+
+    Merge pull request #5200 from SUSE/wip-12289-firefly
+    
+    mon: scrub error (osdmap encoding mismatch?) upgrading from 0.80 to ~0.80.2
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit de53addac8234037a66cdd45cf8007deba7a0530 (refs/remotes/gh/wip-11786.firefly)
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Mon Sep 7 14:12:19 2015 +0100
+
+    mon: MonitorDBStore: make get_next_key() work properly
+    
+    We introduced a significant bug with 2cc7aee, when we fixed issue #11786.
+    Although that patch would fix the problem described in #11786, we
+    managed to not increment the iterator upon returning the current key.
+    This would have the iterator iterating over the same key, forever and
+    ever.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 70d31082fd3dc8c7857994104577f1a3631c678c)
+
+commit 0a740d7b2b62e55056fb96d6423203c47e0f3cf6
+Merge: aeea956 37d16a9
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Sep 9 15:45:37 2015 +0200
+
+    Merge pull request #5388 from SUSE/wip-12490-firefly
+    
+    buffer: critical bufferlist::zero bug
+    
+    Reviewed-by: Gregory Farnum <gfarnum at redhat.com>
+
+commit aeea9567e8b047b3a67badfcc4e43c880f0efa46
+Merge: 973b74d 6b42b06
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Sep 9 06:10:09 2015 +0200
+
+    Merge pull request #5408 from SUSE/wip-12492-firefly
+    
+    the output is wrong when runing ceph osd reweight
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 973b74d5b266f4e9e7f992a85b22f42c9fb543b1
+Merge: 79403ba 5445461
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Sep 9 06:07:51 2015 +0200
+
+    Merge pull request #5404 from SUSE/wip-12395-firefly
+    
+    register_new_pgs() should check ruleno instead of its index
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 79403ba8ce526d65521e6cd2ca2bc06f5fe261b9
+Merge: db44bb2 dc12875
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Sep 9 06:05:39 2015 +0200
+
+    Merge pull request #5199 from SUSE/wip-11980-firefly
+    
+    MDSMonitor: handle MDSBeacon messages properly
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit db44bb29b8b036642c50f5d322b5edd9d51699bb
+Merge: fc699f4 31ff7d1
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Sep 9 06:04:15 2015 +0200
+
+    Merge pull request #5410 from SUSE/wip-12497-firefly
+    
+    get pools health'info have error
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit fc699f42459ab3723f3e63b28a4aa5f481c78fc4
+Merge: 6762295 ea0d67c
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Sep 9 06:01:50 2015 +0200
+
+    Merge pull request #5409 from SUSE/wip-12495-firefly
+    
+    pgmonitor: wrong at/near target max“ reporting
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 67622955b1cfd0b97ac8d3d96b223995440af0b1
+Merge: c4fa5ef 2f35a41
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Mon Sep 7 14:22:52 2015 +0200
+
+    Merge pull request #5358 from ceph/wip-11470.firefly
+    
+    mon: PaxosService: call post_refresh() instead of post_paxos_update()
+    
+    Reviewed-by: Joao Eduardo Luis <joao at suse.de>
+
+commit 3be204f6a22be109d2aa8cfd5cee09ec3381d9b2
+Author: Dmitry Yatsushkevich <dyatsushkevich at mirantis.com>
+Date:   Tue Mar 17 15:44:52 2015 -0700
+
+    rgw: init script waits until the radosgw stops
+    
+    Fixes: #11140
+    Init script waits in stop action until the radowgw daemons stop.
+    
+    Signed-off-by: Dmitry Yatsushkevich <dyatsushkevich at mirantis.com>
+    (cherry picked from commit 1cca0c1e91a1e18f82f4d22855e96b2fc947f5ea)
+
+commit c4fa5ef989247404ded7adf5dad4e5316b8af04a
+Merge: beff99b c6f3780
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Mon Sep 7 10:20:27 2015 +0200
+
+    Merge pull request #5403 from SUSE/wip-12393-firefly
+    
+    Memory leak in Mutex.cc, pthread_mutexattr_init without pthread_mutexattr_destroy
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+    Reviewed-by: Nathan Cutler <ncutler at suse.com>
+
+commit beff99bc7358ee0625079ca60adbf109986f2285
+Merge: 4a3c178 68508e2
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sun Sep 6 21:19:55 2015 +0200
+
+    Merge pull request #5225 from SUSE/wip-12266-firefly
+    
+    ceph.spec.in: 50-rbd.rules conditional is wrong
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4a3c17834890b69e0467b65f83b1979328f3d27c
+Merge: 6571cd9 2544a6f
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sun Sep 6 21:19:42 2015 +0200
+
+    Merge pull request #5217 from SUSE/wip-12268-firefly
+    
+    ceph-common needs python-argparse on older distros, but doesn't require it
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit bff2f477c4ad86b4bd6e3ca3e637a6168c5c8053
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Sun Sep 6 16:30:35 2015 +0200
+
+    OSD: add scrub_finalize_wq suicide timeout
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+
+commit 91d4c217e32b8b76fcac49f37879a3f78088694d
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:52:40 2015 -0700
+
+    OSD: add scrub_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 547a7041edc833f3cc8e04d388574809e30a8af6)
+    
+    Conflicts:
+            src/osd/OSD.cc
+                firefly still has scrub_finalize_wq
+
+commit 7f6ec65b7c2ca0174142c1c48f18998d8c586b02
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 11:02:19 2015 -0700
+
+    OSD: add op_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 3f2946aa9f9b4b432e8c018283503153a2b1eddc)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+              adapt op_wq() and peering_wq() calls in OSD::OSD
+    	src/osd/OSD.h
+              adapt OpWQ instead of ShardedOpWQ
+
+commit 9ce8ce689009cf8ef749edd320d1c2a73ecc2f90
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:54:31 2015 -0700
+
+    OSD: add remove_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit f2fbfa32a16666be46359f0eab7b04ca80a753f5)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+               No next_removal_seq(0) in master
+
+commit 6926a64fbd4718b8a5df8e04545bc93c4981e413
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:51:28 2015 -0700
+
+    OSD: add snap_trim_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit e1073a4a577211672148a4112bd633831552d66f)
+
+commit d31d1f6f5b08362779fa6af72690e898d2407b90
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:50:19 2015 -0700
+
+    OSD: add recovery_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 85311b656852af75bfbbc6699f92fc6aa233c316)
+    
+    Conflicts:
+    	src/common/config_opts.h
+               place OPTION(osd_command_thread_suicide_timeout, ...)
+               directly after OPTION(osd_command_thread_timeout, ...)
+
+commit f85ec2a52e969f9a7927d0cfacda6a1cc6f2898c
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:49:00 2015 -0700
+
+    OSD: add command_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit df4e5de819c30003cfbe50a071c49039cf534419)
+    
+    Conflicts:
+    	src/common/config_opts.h
+               place OPTION(osd_command_thread_suicide_timeout, ...)
+               directly after OPTION(osd_command_thread_timeout, ...)
+
+commit b894b368790de3383295372250888ba674502fb1
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Jul 7 08:49:54 2015 -0700
+
+    WBThrottle::clear_object: signal if we cleared an object
+    
+    Fixes: #12223
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 8447b08d60d5cf7dce20f8b839cc2cb5a93782de)
+
+commit cd1396cd62c79b177e46cfb57ab6b3b6fdcd227b
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 9 10:46:10 2015 -0400
+
+    osd/PGLog: dirty_to is inclusive
+    
+    There are only two callers of mark_dirty_to who do not pass max,
+    and they are both in the merge_log extending tail path.  In that
+    case, we want to include the last version specified in the log
+    writeout.  Fix the tail extending code to always specify the
+    last entry added, inclusive.
+    
+    Fixes: #12652
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f0ca14df0641daa04eee39d98d8bd0faf46e4e6d)
+
+commit f39c7917a39e445efa8d73178657fc5960772275
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Fri Sep 4 17:38:32 2015 +0200
+
+    osd: Keep a reference count on Connection while calling send_message()
+    
+    Fixes: #12437
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (manual backport of commit a140085)
+    
+    Conflicts:      src/osd/OSD.cc
+                       master has share_map_peer; firefly has osd->_share_map_outgoing
+
+commit 6571cd9a9616637bf32f9ac97a9bd864c0bff856
+Merge: 8edc091 bd25136
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Fri Sep 4 11:50:22 2015 -0600
+
+    Merge pull request #5224 from SUSE/wip-12304-firefly
+    
+    ceph.spec.in running fdupes unnecessarily
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 8edc091df90be6935fcfe59c18d7060c88501556
+Merge: 6053bff 601eadb
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Fri Sep 4 11:47:49 2015 -0600
+
+    Merge pull request #5394 from SUSE/wip-12447-firefly
+    
+    ceph.spec.in: useless %py_requires breaks SLE11-SP3 build
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 2c2ffa1d6d1112dbf52cbbe36f4a5376e17da56a
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Aug 24 15:40:39 2015 -0700
+
+    config: skip lockdep for intentionally recursive md_config_t lock
+    
+    lockdep can't handle recursive locks, resulting in false positive
+    reports for certain set_val_or_die() calls, like via
+    md_config_t::parse_argv() passed "-m".
+    
+    Fixes: #12614
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 415226995ebe841cc9e8639a3233150a75aecaed)
+
+commit 6053bffa8955953cf40a05f2b22684e77b6003a3
+Merge: 49d416e 5559a5f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Sep 4 17:18:30 2015 +0200
+
+    Merge pull request #5043 from SUSE/wip-12007-firefly
+    
+    Objecter: pg listing can deadlock when throttling is in use
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 2c0d7feeb1c7592887e0408fe4fadaa9b4f659e9
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Aug 13 19:41:47 2015 +0200
+
+    tests: tiering agent and proxy read
+    
+    Verify that an object promoted to a cache tier because of a proxy read
+    is evicted as expected.
+    
+    http://tracker.ceph.com/issues/12673 Refs: #12673
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 7924231930732bd297d3bd034c8295e96cb81088)
+    
+    Conflicts:
+    	qa/workunits/cephtool/test.sh
+                resolved by manually adding the new test to TESTS
+
+commit aa911767d9326c8aa37671883892b7d383596960
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Aug 13 13:47:24 2015 +0200
+
+    osd: trigger the cache agent after a promotion
+    
+    When a proxy read happens, the object promotion is done in parallel. The
+    agent_choose_mode function must be called to reconsider the situation
+    to protect against the following scenario:
+    
+      * proxy read
+      * agent_choose_mode finds no object exists and the agent
+        goes idle
+      * object promotion happens
+      * the agent does not reconsider and eviction does not happen
+        although it should
+    
+    http://tracker.ceph.com/issues/12673 Fixes: #12673
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit e1f58feb9b1d20b72f2eb2eefdea5982e0cddccd)
+
+commit 49d416e6e2e2f3e1f317978371089f9d92358642
+Merge: 7744518 f93eadd
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Sep 4 17:08:41 2015 +0200
+
+    Merge pull request #4769 from SUSE/wip-11741-firefly
+    
+    crush: take crashes due to invalid arg
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 774451810ff055984b79e1d1875bd6a3468dfb7a
+Merge: fc27b0d f122788
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Fri Sep 4 16:50:45 2015 +0200
+
+    Merge pull request #4788 from SUSE/wip-11801-firefly
+    
+    Make it more difficult to delete pools in firefly
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit fc27b0dbe074dc15450d7669ea722aa3b605b3b2
+Merge: 055624b da78889
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Sep 4 16:44:57 2015 +0200
+
+    Merge pull request #5235 from SUSE/wip-12310-firefly
+    
+    read on chunk-aligned xattr not handled
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 055624bf9a6480fffefb3c7cf5c3a4d4d73985c1
+Merge: 045c056 46e5dea
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Sep 4 16:42:28 2015 +0200
+
+    Merge pull request #5389 from SUSE/wip-12391-firefly
+    
+    EC pools are not allowed as cache pools, disallow in the mon
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 045c0562f97e7d2c68278fbddb9ca1707bb8d5fd
+Merge: 99612e7 b8e3f6e
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 4 09:42:03 2015 -0400
+
+    Merge pull request #5406 from ceph/wip-12465-firefly
+    
+    log: take mutex while opening fd
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 99612e7ed9573f2af36604f7d258535f6feadff3
+Merge: 7f8a397 4a709a4
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Thu Sep 3 12:34:32 2015 +0200
+
+    Merge pull request #4854 from ceph/wip-11769-firefly
+    
+    librbd: aio calls may block
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 7f8a397e38101017ef9783d8ed08bb393a8d8825
+Merge: ea601ef f0d2429
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 07:55:15 2015 +0200
+
+    Merge pull request #5233 from SUSE/wip-12074-firefly
+    
+    RGW logfile does not get chowned properly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 644f213c672f6fe2786e041043fdd55f8399871e (refs/remotes/gh/wip-11455-firefly)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Aug 26 14:34:30 2015 -0700
+
+    rgw: init some manifest fields when handling explicit objs
+    
+    Fixes: #11455
+    When dealing with old manifest that has explicit objs, we also
+    need to set the head size and head object correctly so that
+    code that relies on this info doesn't break.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d7bf8cb594e5276d1c80544f5ec954d52b159750)
+
+commit e7931a73df1ab77feb1c2ece13e3de3989ef7a0e
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jul 30 14:47:15 2015 -0700
+
+    rgw: url encode exposed bucket
+    
+    Fixes: #12537
+    Don't send the bucket name back without url encoding it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit ad5507fe0bf72ed5bdf8353e315cc9092c740144)
+
+commit 558c52955d464827630e0aa2fed970df987bb036
+Author: Wido den Hollander <wido at 42on.com>
+Date:   Wed Jun 3 13:13:33 2015 +0200
+
+    rgw: Do not enclose the Bucket header in quotes
+    
+    Fixes: #11860
+    Signed-off-by: Wido den Hollander <wido at 42on.com>
+    (cherry picked from commit 8af25faed93fe02d3dad585b8579ce8b041cc4e6)
+
+commit d3c94698e4e852bef3e65fbf439f5f209fbc0b25 (refs/remotes/gh/wip-12752)
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Aug 21 11:32:39 2015 -0400
+
+    Objecter: pg_interval_t::is_new_interval needs pgid from previous pool
+    
+    When increasing the pg_num of a pool, an assert would fail since the
+    calculated pgid seed would be for the pool's new pg_num value instead
+    of the previous pg_num value.
+    
+    Fixes: #10399
+    Backport: infernalis, hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f20f7a23e913d09cc7fc22fb3df07f9938ddc144)
+    
+    Conflicts: (hobject_t sort order not backported, trivial resolution)
+    	src/osdc/Objecter.cc
+    	src/osdc/Objecter.h
+
+commit 56d267b7ae02070a7d7ed247990b84124fd62411
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue May 26 12:35:11 2015 -0700
+
+    osd_types::is_new_interval: size change triggers new interval
+    
+    Fixes: 11771
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit ff79959c037a7145f7104b06d9e6a64492fdb95f)
+
+commit 411769c1461c11611b479bd826c72c56b3ce47c5
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon Aug 10 04:25:03 2015 -0700
+
+    mon: add a cache layer over MonitorDBStore
+    
+    the cache of of leveldb does not perform well under some condition,
+    so we need a cache in our own stack.
+    
+    * add an option "mon_osd_cache_size" to control the size of cache size
+      of MonitorDBStore.
+    
+    Fixes: #12638
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 5e99a578050976ca22b549812ac80d494fe7041d)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.h
+    minor differences in OSDMonitor ctor
+
+commit 278d732ecd3594cd76e172d78ce3ec84e58e178b (refs/remotes/me/wip-journal-firefly)
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 15 11:20:18 2015 -0800
+
+    os/FileJournal: Fix journal write fail, align for direct io
+    
+    when config journal_zero_on_create true, osd mkfs will fail when zeroing journal.
+    journal open with O_DIRECT, buf should align with blocksize.
+    
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Xie Rui <875016668 at qq.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 80473f63853593e53d72f17c098152caf17f5e9e)
+
+commit d0d6727762ebda858065101635935df3d44a18ad
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Jul 29 15:52:19 2015 +0800
+
+    common/syncfs: fall back to sync(2) if syncfs(2) not available
+    
+    Fixes: #12512
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 08210d6a85527b0759f6dc4411f742bc13a4939f)
+
+commit 40494c6e479c2ec4dfe5f6c2d6aef3b6fa841620
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Mar 12 17:38:27 2015 +0100
+
+    sync_filesystem.h: fix unreachable code
+    
+    Fix for:
+    
+    CID 1264460 (#1 of 1): Structurally dead code (UNREACHABLE)
+    unreachable: This code cannot be reached: sync();
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 9921836e982818b92e20280eecb74e701523045c)
+
+commit 3dbbc86ad6d1e7131bbe49a4eff1557d7da9822f
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Thu Jan 8 10:29:37 2015 +0800
+
+    mon, os: check the result of sync_filesystem.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 27cb78bd3b2dde40c70de245769d1c0ec252533b)
+
+commit 7fa6fdc6c5e52f11456e4bea4ae32fd62248c80b
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Wed Jan 7 15:28:37 2015 +0800
+
+    common: Don't call ioctl(BTRFS_IOC_SYNC) in sync_filesystem.
+    
+    From the manual of syncfs, it first appeared in Linux 2.6.39. At this
+    point, btrfs didn't as a stable production. So remove this.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 397b261630dccc656f6eca509f4c70173c8d8d8f)
+
+commit 9f15ed5bb5a837727cb3bef70508e056c125a518
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Wed Jan 7 15:26:08 2015 +0800
+
+    common: Directly return the result of syncfs().
+    
+    In commit 808c644248e4, it will try sync() if syncfs() return error.
+    No evidence prove this way can work. And sync() don't return result
+    so make this function always return zero which cause filestore omit the
+    error.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 3f7faa4d8d3af3d2e3889c23290b016f27d36386)
+
+commit ea601efc6c693ba8041509c98756fa8c49b9c13a
+Merge: 50fa963 a128ce3
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Wed Aug 12 09:43:19 2015 +0200
+
+    Merge pull request #5390 from SUSE/wip-12503-firefly
+    
+    rgw/logrotate.conf calls service with wrong init script name
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 50fa9636d0c5e8946fa410891623e2c8363e2067
+Merge: abe6c03 d4ef556
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Aug 11 11:27:16 2015 -0700
+
+    Merge pull request #4765 from SUSE/wip-11721-firefly
+    
+    rgw: Keystone PKI token expiration is not enforced
+
+commit 04b2a878b1329202758465cf8e9b0f874cbeeef5
+Author: Dan van der Ster <daniel.vanderster at cern.ch>
+Date:   Tue Nov 18 15:51:46 2014 +0100
+
+    ceph-disk: don't change the journal partition uuid
+    
+    We observe that the new /dev/disk/by-partuuid/<journal_uuid>
+    symlink is not always created by udev when reusing a journal
+    partition. Fix by not changing the uuid of a journal partition
+    in this case -- instead we can reuse the existing uuid (and
+    journal_symlink) instead. We also now assert that the symlink
+    exists before further preparing the OSD.
+    
+    Fixes: #10146
+    Signed-off-by: Dan van der Ster <daniel.vanderster at cern.ch>
+    Tested-by: Dan van der Ster <daniel.vanderster at cern.ch>
+    (cherry picked from commit 29eb1350b4acaeabfe1d2b19efedbce22641d8cc)
+
+commit e57e6f5da10a62f2f4d7b1a6a734a095ed494ebe
+Author: Dan van der Ster <daniel.vanderster at cern.ch>
+Date:   Mon Sep 29 13:20:10 2014 +0200
+
+    ceph-disk: set guid if reusing a journal partition
+    
+    When reusing a journal partition (e.g. /dev/sda2) we should set a
+    new partition guid and link it correctly with the OSD. This way
+    the journal is symlinked by its persistent name and ceph-disk list
+    works correctly.
+    
+    Signed-off-by: Dan van der Ster <daniel.vanderster at cern.ch>
+    (cherry picked from commit beff616f506b96eb52285f0d2e268e10f8edaa2c)
+
+commit ebba1d59b5e4bc11cbdfcda4e480639f7d9e1498
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Jul 30 14:20:56 2015 +0100
+
+    osd/OSDMap: handle incrementals that modify+del pool
+    
+    Because new_pools was processed after old_pools, if something
+    was modified and then deleted in the same incremental
+    map, then the resulting state would be a pool in the map
+    that had no entry in pool_name.
+    
+    Fixes: #12429
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 8d4932e721e32a33c1bada54e11d4ecccd868618)
+
+commit 31ff7d14e801ef7b7dff3b050094f1eceacf75dd
+Author: renhwztetecs <rhwlyw at 163.com>
+Date:   Tue Jul 21 18:55:00 2015 +0800
+
+    Update OSDMonitor.cc
+    
+    OSDMonitor::get_pools_health(), s/objects/bytes/
+    
+    Fixes: #12402
+    Signed-off-by: ren.huanwen at zte.com.cn
+    (cherry picked from commit 7fc13c9d6b9a4962d7640240416105d8f558d600)
+
+commit ea0d67c482659dfb8c08055a77f400d0689866e0
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Mon Jul 20 10:50:20 2015 +0800
+
+      mon/PGMonitor: avoid uint64_t overflow when checking pool 'target/max' status.
+      Fixes: #12401
+    
+      Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    
+    (cherry picked from commit f84e6b8157e78fd05cd1c8ac957c92df17e6ba06)
+
+commit 6b42b06239426e5ec54dfaa82f48abca56f824ca
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Tue Jul 21 11:20:53 2015 +0100
+
+    mon: OSDMonitor: fix hex output on 'osd reweight'
+    
+    Fixes: #12251
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 787fa80c2746fde44ac0583ff7995ec5be9a672d)
+
+commit 5445461ba08fa5b2e12a951a1432916224d3f668
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Fri Jul 3 18:27:13 2015 +0800
+
+    mon/PGMonitor: bug fix pg monitor get crush rule
+    
+    when some rules have been deleted before, the index in array of crush->rules
+    is not always equals to crush_ruleset of pool.
+    
+    Fixes: #12210
+    Reported-by: Ning Yao <zay11022 at gmail.com>
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 498793393c81c0a8e37911237969fba495a3a183)
+
+commit c6f37807d04af66fbed24e75776aed1b44241150
+Author: Ketor Meng <d.ketor at gmail.com>
+Date:   Tue May 26 18:50:17 2015 +0800
+
+    Mutex: fix leak of pthread_mutexattr
+    
+    Need pthread_mutexattr_destroy after pthread_mutexattr_init
+    
+    Fixes: #111762
+    Signed-off-by: Ketor Meng <d.ketor at gmail.com>
+    (cherry picked from commit 2b23327b3aa8d96341d501a5555195ca1bc0de8f)
+
+commit 601eadbf707597d9a1572efbdf86b22ff6813602
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jul 9 11:51:13 2015 +0200
+
+    ceph.spec.in: drop SUSE-specific %py_requires macro
+    
+    %py_requires expands to
+    
+    BuildRequires: /usr/bin/python
+    PreReq: python = 2.7
+    
+    The BuildRequires: is already provided, and the PreReq is wrong because
+    e.g. SLE11-SP3 (a platform we are trying to support) has Python 2.6.
+    
+    http://tracker.ceph.com/issues/12351 Fixes: #12351
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit cbf6c7b46b42e163950bf7956e5b7565fca961c9)
+    
+    Conflicts:
+    	ceph.spec.in
+                in master, the %py_requires is in the python-rados package,
+                while in firefly it is in the python-ceph package
+
+commit a128ce37038ef6e44c8d7bd082ba196583974ef7
+Author: wuxingyi <wuxingyi2015 at outlook.com>
+Date:   Wed Mar 11 17:34:40 2015 +0800
+
+    rgw/logrotate.conf: Rename service name
+    
+    The service name for ceph rados gateway was changed to "ceph-radosgw",
+    the previous version of service name "radosgw" would cause a failed reload,
+    and finally make it impossible to write any log data to the log file.
+    
+    Signed-off-by: wuxingyi <wuxingyi2015 at outlook.com>
+    (cherry picked from commit 9df3f798179481fe8ae6ae873dcb793de7d8f367)
+
+commit 46e5deabebeeb047783cfc980aa28a3df46eeeca
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri May 15 13:05:40 2015 -0700
+
+    OSDMonitor: disallow ec pools as tiers
+    
+    Fixes: 11650
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 11b7801bb57cb25cd2d26d58722d49691747725b)
+    
+    Conflicts:
+    	qa/workunits/cephtool/test.sh
+               no "# make sure we can't clobber snapshot state" tests in firefly
+    	src/mon/OSDMonitor.cc
+               no tp->removed_snaps.empty() in firefly
+
+commit 37d16a9e572580eeae86a2bae6d4ddd0299fb833
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Thu Jul 9 13:32:03 2015 +0800
+
+    UnittestBuffer: Add bufferlist zero test case
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 577acf665948e531e50d36f5780ea19351a5bf65)
+
+commit 4443acdbef1148e0261bce25f7d7a3433e09cecc
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Thu Jul 9 13:42:42 2015 +0800
+
+    buffer: Fix bufferlist::zero bug with special case
+    
+    Fixes: #12252
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 43f583d160ccaf879eaf0f3020e77860cf8d1df0)
+
+commit d52187019d321fe8a2dc54fe8a67a5139c310db1
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Wed May 27 22:28:49 2015 +0100
+
+    mon: MonitorDBStore: get_next_key() only if prefix matches
+    
+    get_next_key() had a bug in which we would always return the first key
+    from the iterator, regardless of whether its prefix had been specified
+    to the iterator.
+    
+    Fixes: #11786
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 2cc7aee1abe40453093306c8fef2312b650dff5d)
+
+commit 2f35a415dcd31683151defb0ddb1a6d5696c7051
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Fri Jun 12 19:21:10 2015 +0100
+
+    mon: PaxosService: call post_refresh() instead of post_paxos_update()
+    
+    Whenever the monitor finishes committing a proposal, we call
+    Monitor::refresh_from_paxos() to nudge the services to refresh.  Once
+    all services have refreshed, we would then call each services
+    post_paxos_update().
+    
+    However, due to an unfortunate, non-critical bug, some services (mainly
+    the LogMonitor) could have messages pending in their
+    'waiting_for_finished_proposal' callback queue [1], and we need to nudge
+    those callbacks.
+    
+    This patch adds a new step during the refresh phase: instead of calling
+    directly the service's post_paxos_update(), we introduce a
+    PaxosService::post_refresh() which will call the services
+    post_paxos_update() function first and then nudge those callbacks when
+    appropriate.
+    
+    [1] - Given the monitor will send MLog messages to itself, and given the
+    service is not readable before its initial state is proposed and
+    committed, some of the initial MLog's would be stuck waiting for the
+    proposal to finish.  However, by design, we only nudge those message's
+    callbacks when an election finishes or, if the leader, when the proposal
+    finishes.  On peons, however, we would only nudge those callbacks if an
+    election happened to be triggered, hence the need for an alternate path
+    to retry any message waiting for the initial proposal to finish.
+    
+    Fixes: #11470
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 1551ebb63238073d2fd30201e6b656a8988e958c)
+
+commit b8e3f6e190809febf80af66415862e7c7e415214
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Jul 24 15:38:18 2015 -0700
+
+    Log::reopen_log_file: take m_flush_mutex
+    
+    Otherwise, _flush() might continue to write to m_fd after it's closed.
+    This might cause log data to go to a data object if the filestore then
+    reuses the fd during that time.
+    
+    Fixes: #12465
+    Backport: firefly, hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 8778ab3a1ced7fab07662248af0c773df759653d)
+    
+      - modified to drop m_flush_mutex_holder, which isn't present in firefly
+
+commit abe6c03d411f5f1d277f910ae87123309fa95d4a
+Merge: 5df7273 9614e4d
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sat Jul 25 13:51:43 2015 +0200
+
+    Merge pull request #4583 from SUSE/wip-11542-firefly
+    
+    rgw: Change variable length array of std::strings (not legal in C++) to std::vector<std::string>
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 5df727379b63abb25421a32c95fdda9a0b62eeac
+Merge: 2a77154 8c573c8
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sat Jul 25 13:50:06 2015 +0200
+
+    Merge pull request #4584 from SUSE/wip-8911-firefly
+    
+    rgw: doesn't return 'x-timestamp' in header which is used by 'View Details' of OpenStack
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 2a77154b4abcd4eebc8d1a315f7beeeabaf2213b
+Merge: 64c3a64 d78e31f
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sat Jul 25 13:48:31 2015 +0200
+
+    Merge pull request #4642 from SUSE/wip-11323-firefly
+    
+    rgw: quota not respected in POST object
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 64c3a645c4dba1846532997758c5d7c3a42760b2
+Merge: f11df3c 177ef55
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sat Jul 25 13:24:39 2015 +0200
+
+    Merge pull request #4641 from SUSE/wip-11149-firefly
+    
+    rgw: delete bucket does not remove .bucket.meta file
+    
+    Reviewed-by: Yahuda Sadeh <yehuda at redhat.com>
+
+commit f11df3c7819a5f8dd5336be7dbe43e0f21dbb394
+Merge: 090bd12 2ee6e9a
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sat Jul 25 13:21:31 2015 +0200
+
+    Merge pull request #5170 from SUSE/wip-12039-firefly
+    
+    rgw: Swift API: response for PUT on /container does not contain the mandatory Content-Length header when FCGI is used
+    
+    Reviewed-by: Yahuda Sadeh <yehuda at redhat.com>
+
+commit 090bd126e15acacc46bce3271d2aa0cfa889b499
+Merge: 94060b7 2d5d8da
+Author: Nathan Cutler <presnypreklad at gmail.com>
+Date:   Sat Jul 25 13:20:15 2015 +0200
+
+    Merge pull request #4762 from SUSE/wip-11754-firefly
+    
+    rgw: Object copy bug
+    
+    Reviewed-by: Yahuda Sadeh <yehuda at redhat.com>
+
+commit 94060b78a2e9b38422a951664dd4f37a6f52316f
+Merge: b9f45fe 3223bd6
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Fri Jul 24 11:42:58 2015 -0700
+
+    Merge pull request #5171 from SUSE/wip-12240-firefly
+    
+    librbd: internal.cc: 1967: FAILED assert(watchers.size() == 1)
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit b9f45fe7816da1ce1fcbfd2a60fe370abe0f1848
+Merge: 57bbc8e 9845258
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Fri Jul 24 11:26:23 2015 -0700
+
+    Merge pull request #4639 from SUSE/wip-7385-firefly
+    
+    librbd: Objectcacher setting max object counts too low
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 8c02376bd58d463f742966b67fa075a59b5f4269
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Fri Jul 24 18:50:03 2015 +0200
+
+    TestPGLog: fix invalid proc_replica_log test case
+    
+    If 1'3 is non-divergent, no osd could correctly have created 2'3.  Also,
+    proc_replica_log does not add the extra entries from the auth log to the
+    missing set, that happens later on in activate.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1333b676dba4ed4b5db854fe935bdadbf9f21d08)
+    
+    Conflicts:
+        src/test/osd/TestPGLog.cc
+           "sjustm: set_hash() method just does hash = and then rebuilds a cache,
+            but the cache does not exist in firefly so hash = will do fine"
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+
+commit 4a709a450987cc90126b11a20c1c762d4fbfcea9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 2 10:33:35 2015 -0400
+
+    tests: verify librbd blocking aio code path
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4cf41486e9c9e1efcb863960a8f3e0326ffca7e5)
+
+commit 4501e90d9b667310a222c3616a7b1f1fb382f997
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jun 1 22:56:11 2015 -0400
+
+    librbd: new rbd_non_blocking_aio config option
+    
+    Setting this option to false reverts librbd to legacy behavior
+    where AIO operations could potentially block.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 769cad12716b85d87eacc1069dd9f5c21cad3915)
+    
+    Conflicts:
+    	src/common/config_opts.h: trivial resolution
+    	src/librbd/librbd.cc: trivial resolution
+
+commit 68863968dd734fc45557dca100c8a0a5060cbd8b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 9 20:34:28 2015 -0400
+
+    PendingReleaseNotes: document changes to librbd's aio_read methods
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 861c20bb2cc05a13a45b0e2368c591212e4eda72
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 21:55:36 2015 -0400
+
+    tests: update librbd AIO tests to remove result code
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    
+    Conflicts:
+    	src/test/librbd/test_librbd.cc: trivial resolution
+
+commit 4e7cf6115798dd339efe41a528aac148be640b29
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 9 13:33:09 2015 -0400
+
+    librbd: AioRequest::send no longer returns a result
+    
+    The librados calls used by AioRequest::send should always return
+    zero unless there is a bug.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c77bce3311ab62892eb8c1d883263ba7ed663b20)
+    
+    Conflicts:
+    	src/librbd/AioRequest.cc: trivial resolution
+    	src/librbd/AioRequest.h: trivial resolution
+    	src/librbd/internal.cc: trivial resolution
+
+commit 0ccf47bf9f070ff7fe4e1dd3d3c3e3daa1f621c4
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 21:37:50 2015 -0400
+
+    librbd: internal AIO methods no longer return result
+    
+    All failures should be returned via the AioCompletion.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 9ab42d613128ab08c688ddbea93df4c95068b9cd)
+    
+    Conflicts:
+    	src/librbd/AioRequest.cc: trivial resolution
+    	src/librbd/internal.cc: trivial resolution
+    	src/librbd/internal.h: trivial resolution
+
+commit e48040413849c5d3a577addff644502858ac5a66
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 21:48:21 2015 -0400
+
+    Throttle: added pending_error method to SimpleThrottle
+    
+    Allow the client of SimpleThrottle to detect an async error
+    so that it can exit early.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b88b88c5df91325fb713c2031a56bffe421268e0)
+
+commit 8ec341ee8f256e8ab91a931f6005e1ebd4b1db60
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 20:18:50 2015 -0400
+
+    librbd: add new fail method to AioCompletion
+    
+    Helper method to handle passing fatal errors generated within
+    librbd (not from the OSDs) back to the client.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6d1d0c867855a96bee4c13a0c0a39a0e002ccd12)
+    
+    Conflicts:
+    	src/librbd/AioCompletion.cc: trivial resolution
+    	src/librbd/AioCompletion.h: trivial resolution
+
+commit eed8ce258d116e837d8777f246f31c21a03ceb74
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 19:06:52 2015 -0400
+
+    librbd: avoid blocking AIO API methods
+    
+    Enqueue all AIO API methods within the new librbd thread pool to
+    reduce the possibility of any blocking operations. To maintain
+    backwards compatibility with the legacy return codes of the API's
+    AIO methods, it's still possible to block attempting to acquire
+    the snap_lock.
+    
+    Fixes: #11056
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3a7b5e30efdb21aa1a0aeb68a5d02a1ac2a5faf3)
+    
+    Conflicts:
+    	src/librbd/librbd.cc: trivial resolution
+
+commit 220a23e8d99882838626d5647f9c055eefeb28c6
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 17:24:08 2015 -0400
+
+    librbd: add task pool / work queue for AIO requests
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit afb896d91f886b647baf38f7ec94cc3739f6d2a9)
+    
+    Conflicts:
+    	src/common/config_opts.h: trivial resolution
+    	src/librbd/ImageCtx.cc: trivial resolution
+    	src/librbd/ImageCtx.h: trivial resolution
+    	src/librbd/internal.cc: trivial resolution
+
+commit 3292bd26127f5beb69ac9c5fbcdea7efe002fd40
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon May 11 17:05:49 2015 -0400
+
+    WorkQueue: added virtual destructor
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b3f5a75332c058816dc39b71e9d2b36e752159f4)
+
+commit 9bf970c1d956c94bc420d874eb83db1f16cf5d44
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 16:46:34 2015 -0400
+
+    WorkQueue: add new ContextWQ work queue
+    
+    The queue holds a collection of Context pointers that will
+    be completed by the thread pool.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 24a33e977f7b71962adeeb48f75d488a76e70fa9)
+    
+    Conflicts:
+    	src/common/WorkQueue.h: trivial resolution
+
+commit 94aa947b33083bcfe3cb61f41bfdaea7df605cbb
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 14:21:08 2014 -0800
+
+    common/ceph_context: don't import std namespace
+    
+    This was broken by 7fed5dee4f96a83d1d6914f6fc0895bba2d15b99
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9029813b2784fe71879b1b7684855415b4c7566b)
+
+commit b91e594401ab75987a370f6dee0ee8d212189c9f
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Mon Dec 1 23:54:16 2014 +0800
+
+    CephContext: Add AssociatedSingletonObject to allow CephContext's singleton
+    
+    If some objects associated to CephContext want to create a singleton object,
+    it can inherit AssociatedSingletonObject and implement destruction to get notified.
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 7fed5dee4f96a83d1d6914f6fc0895bba2d15b99)
+
+commit f122788b3592da516cdb9f6abdc3383a2e7424a2
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 16 07:54:22 2015 -0800
+
+    mon/OSDMonitor: require mon_allow_pool_delete = true to remove pools
+    
+    This is a simple safety check.  Since we default to true it is currently
+    opt-in.
+    
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6b982e4cc00f9f201d7fbffa0282f8f3295f2309)
+    
+    Conflicts:
+         src/test/mon/osd-pool-create.sh
+    
+         Changed $CEPH_MON to 127.0.0.1 -- the CEPH_MON was introduced after
+         firefly to allow tests to run in parallel. Back in firefly all tests
+         use the same port because 127.0.0.1 was hardcoded. We can't
+         conveniently backport all that's necessary for tests to run in
+         parallel, therefore we keep the 127.0.0.1 hardcoded.
+    
+    Conflicts:
+    	src/test/mon/osd-pool-create.sh
+                TEST_no_pool_delete() follows a different test than in master
+
+commit 57bbc8e630e6611d1ab74b9756c96daf0e91be6b
+Merge: c0a601f 3f2fb8a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 24 10:49:50 2015 +0200
+
+    Merge pull request #5051 from SUSE/wip-12016-firefly
+    
+    osd: cache full mode still skips young objects
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c0a601ff5be45c0630a8659994107672558a982a
+Merge: 71174a5 ef648e5
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 22 11:36:47 2015 -0400
+
+    Merge pull request #5307 from dachary/wip-release-notes-firefly
+    
+    backport v0.80.10 release notes to firefly
+
+commit 5559a5fe0f593c0e7af47c6d8a8359dbcbfd1f08
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Mon Sep 15 11:41:06 2014 +0000
+
+    For pgls OP, get/put budget on per list session basis, instead of per OP basis, which could lead to deadlock.
+    
+    Signed-off-by: Guang Yang (yguang at yahoo-inc.com)
+    (cherry picked from commit 0f884fdb31a26f241401ce2a9329dc0f2c4eccc7)
+    
+    Conflicts:
+    	src/librados/IoCtxImpl.cc
+                In firefly, return value of objecter->pg_read() is not assigned to c->tid.
+    	src/osdc/Objecter.cc
+    	src/osdc/Objecter.h
+                There is no _op_submit_with_budget() function in firefly.
+                There is no Objecter::_finish_op() function in firefly.
+                In firefly, _take_op_budget() is called take_op_budget().
+
+commit 71174a53c9a3a2b54b947da7e1425ff36fd44e37
+Merge: f7a085f 989e047
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 22 10:20:32 2015 +0200
+
+    Merge pull request #4867 from SUSE/wip-11878-firefly
+    
+    mon: Clock skew causes missing summary and confuses Calamari
+    
+    Reviewed-by: Joao Eduardo Luis <joao at suse.de>
+
+commit 989e04799be567ee93369a87b90405833c3fe8d2
+Author: Thorsten Behrens <tbehrens at suse.com>
+Date:   Fri Feb 6 01:26:40 2015 +0100
+
+    Always provide summary for non-healthy cluster.
+    
+    This fixes a problem, wherein calamari does not provide
+    popup drill-downs for warnings or errors, should the summary
+    be missing.
+    
+    Calamari gets health info from /api/v1/cluster/$FSID/health.
+    If the data here has a summary field, this summary is provided
+    in a popup window:
+    
+      /api/v1/cluster/$FSID/health is populated (ultimately) with
+      status obtained via librados python bindings from the ceph
+      cluster. In the case where there's clock skew, the summary
+      field supplied by the ceph cluster is empty.
+    
+    No summary field, no popup window with more health details.
+    
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit eaf6e0cf48488fe604d0ef0db164d44948d4e8d4)
+    
+    Conflicts:
+    	src/mon/Monitor.cc
+                firefly needs ss
+
+commit f7a085f04c544895bab3d79569276574a96636eb
+Merge: 2f1dd10 d296120
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Tue Jul 21 13:31:33 2015 -0700
+
+    Merge pull request #5062 from SUSE/wip-11699-firefly
+    
+    objecter: resend linger ops on split
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit ef648e592404e8677df91f218c4400caad4034b6
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 21 12:54:19 2015 -0400
+
+    doc: v0.80.10 changelog
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b3a3e0e509eb9530994723ed9d68f85b8434a22d)
+
+commit df837e5cc30cf08ade26df6e42ca402fc628a9bb
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 21 10:55:18 2015 -0400
+
+    doc/release-notes: v0.80.10
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2a61b611987d169d5a501d77fbd545068550c28c)
+    
+    Conflicts:
+    	doc/release-notes.rst
+
+commit 90cddd425ca8f1731fff0b8fb4b7e02a96048f92
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Jul 14 16:15:44 2015 +0200
+
+    doc/release-notes: update notes for v0.80.10
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 1231ae09d675f2ee9e76a04b91f771d73a2fb346)
+    
+    Conflicts:
+    	doc/release-notes.rst
+
+commit 2f1dd10b71d29a647aa2bab4a51fecc0501d6741
+Merge: 0caf6b3 1d2af55
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 13:03:07 2015 +0200
+
+    Merge pull request #5129 from SUSE/wip-12202-firefly
+    
+    mon: ceph fails to compile with boost 1.58
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 0caf6b32849bd673d83e96f0eae19bb6d7e423ae
+Merge: 3010f23 6793d50
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:51:10 2015 +0200
+
+    Merge pull request #5044 from SUSE/wip-12011-firefly
+    
+    osd: PG stuck with remapped
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 3010f23fae10d37ff78b8d7d5049ccba798bbe6b
+Merge: ad58a32 fcac7ab
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:45:22 2015 +0200
+
+    Merge pull request #5039 from SUSE/wip-11961-firefly
+    
+    osd: Cleanup boost optionals for boost 1.56
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit ad58a32292eee39905ae7bacc8fc52a52c2d08fc
+Merge: 13946e9 a62c720
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:39:34 2015 +0200
+
+    Merge pull request #5037 from SUSE/wip-11875-firefly
+    
+    tools: ceph-post-file fails on rhel7
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 13946e9c18bbeb209458a3faac6e687ff380ac6e
+Merge: bde35c1 90a1a75
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:34:51 2015 +0200
+
+    Merge pull request #4771 from SUSE/wip-11759-firefly
+    
+    tools: ceph-disk: support NVMe device partitions
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit bde35c11acd34c76d704b41292d167c3fc4cea53
+Merge: 9e11564 10d85e1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:22:52 2015 +0200
+
+    Merge pull request #4636 from SUSE/wip-11143-firefly
+    
+    tools:  src/ceph-disk : disk zap sgdisk invocation
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 9e11564b36a42b605f256943c7236b91a736fceb
+Merge: 8638443 424289d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:20:50 2015 +0200
+
+    Merge pull request #4635 from SUSE/wip-7387-firefly
+    
+    common: Malformed JSON command output when non-ASCII strings are present
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 8638443eac92ac80b4c57271f7350d94e445abf5
+Merge: 4c37d3d 8372f1d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:17:43 2015 +0200
+
+    Merge pull request #4632 from SUSE/wip-11507-firefly
+    
+    osd: object creation by write cannot use an offset on an erasure coded pool
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4c37d3d99f660c835d2f73e8f08b6ef170c0c7b7
+Merge: 8f11ab7 9090967
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:12:36 2015 +0200
+
+    Merge pull request #4630 from SUSE/wip-10983-firefly
+    
+    tools: use a new disk as journal disk,ceph-disk prepare fail
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 8f11ab7ce27cab43145a2821f3996d3103cf7870
+Merge: 64a21b7 b1ff739
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:08:26 2015 +0200
+
+    Merge pull request #4597 from xinxinsh/wip-11026-firefly
+    
+    objecter: can get stuck in redirect loop if osdmap epoch == last_force_op_resend
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 64a21b71526c51f8e787b365039de2b0cb0a285b
+Merge: 82e8359 2cb2333
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 21 12:04:39 2015 +0200
+
+    Merge pull request #4582 from SUSE/wip-11543-firefly
+    
+    tools: ceph_argparse_flag has no regular 3rd parameter
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit bba50ce8f227af29d559b486274871bb3999fb24
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 16:28:23 2015 -0700
+
+    TestPGLog: fix noop log proc_replica_log test case
+    
+    Need to fill in log.head, olog.head.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1e5b22053381580708af29a1536f1e106c9b479c)
+
+commit fdff8ce6c996cda7b3966d20c24b20ff545e468a
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 15:01:41 2015 -0700
+
+    TestPGLog: add test for 11358
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit b61e5aef15d7448d24b713d13dce77697bc0af74)
+    
+    Conflicts:
+    	src/test/osd/TestPGLog.cc
+                leave out all the other tests that have been
+                added to master since firefly
+
+commit 65028b6304235ba5fa54d14805028db1a032e5a0
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 15:01:29 2015 -0700
+
+    PGLog::proc_replica_log: handle split out overlapping entries
+    
+    See the comment, if the overlapping entries between olog.head
+    and log.tail were split out, last_update should be log.tail.
+    
+    Fixes: 11358
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 6561e0d955c4563a8505b717de41f5bd89119f63)
+
+commit 82e8359783f056cce5f7ede2dabd0cc61d278eab
+Merge: 741f0c2 b061140
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Fri Jul 17 16:10:43 2015 -0700
+
+    Merge pull request #4633 from SUSE/wip-11535-firefly
+    
+    Client admin socket leaks file descriptors
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit da78889d76f641dfcbb80164be32b85e880bb97f
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Mar 18 13:49:20 2015 -0700
+
+    os/chain_xattr: handle read on chnk-aligned xattr
+    
+    If we wrote an xattr that was a multiple of a chunk, we will try to read
+    the next chunk and get ENODATA.  If that happens bail out of the loop and
+    assume we've read the whole thing.
+    
+    Backport: hammer, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8614dcebf384b74b283cd352001a65fa26ba925c)
+    
+    Conflicts:
+        src/test/objectstore/chain_xattr.cc
+            added #define FILENAME
+
+commit 4e7de5b5f0e32d1183e2a0490d65e4e01490d942
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jun 25 14:31:03 2015 -0700
+
+    rgw: error out if frontend did not send all data
+    
+    Fixes: #11851
+    The civetweb mg_write() doesn't return error when it can't flush all data
+    to the user, it just sends the total number of bytes written. Modified the
+    client io to return total number of bytes and return an error if didn't
+    send anything.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit daa679c3dd3770a6d5421e2cc9a36924f4550439)
+
+commit f0d2429f764aaa756fc8002309545b02dc45c199
+Author: Thorsten Behrens <tbehrens at suse.com>
+Date:   Wed Dec 10 11:53:43 2014 +0100
+
+    Unconditionally chown rados log file.
+    
+    This fixes bnc#905047 (in a somewhat ad-hoc way). Sadly the log
+    file gets created from several places, so its existence does not
+    mean init-radosgw had actually run.
+    
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit 41611ea27a42d6221c418613d24dce34d988f2e6)
+
+commit 68508e28adffae64a52ea4c0046fbe8537e0d093
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jun 25 22:37:52 2015 +0200
+
+    ceph.spec.in: use _udevrulesdir to eliminate conditionals
+    
+    The conditionals governing where 50-rbd.rules is installed were not doing the
+    right thing on SUSE distros.
+    
+    Start using the %_udevrulesdir RPM macro, while taking care that it is defined
+    and set to the right value. Use it to eliminate some conditionals around other
+    udev rules files as well.
+    
+    http://tracker.ceph.com/issues/12166 Fixes: #12166
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 8aa758ee7a14e93ded1d55b4aca7a54aa47d7174)
+    
+    Conflicts:
+    	ceph.spec.in
+                master spec file has diverged significantly from firefly
+
+commit bd25136d45d32b8d419fbe60e39572038e33cc59
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Mon Jul 13 18:12:01 2015 +0200
+
+    ceph.spec.in: do not run fdupes, even on SLE/openSUSE
+    
+    In openSUSE there is a policy to use %fdupes in the spec file if RPMLINT
+    complains about duplicate files wasting space in the filesystem.
+    
+    However, RPMLINT is not so complaining, so drop fdupes.
+    
+    http://tracker.ceph.com/issues/12301 Fixes: #12301
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 53072b9019caf72e0313b2804ea174237ed7da33)
+
+commit 2544a6fc59a86d3f02dcd67d3c84a72d7a1100a0
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Tue Jun 16 18:27:20 2015 +0200
+
+    ceph.spec.in: python-argparse only in Python 2.6
+    
+    argparse is a widely-used Python module for parsing command-line arguments.
+    Ceph makes heavy use of Python scripts, both in the build environment and on
+    cluster nodes and clients.
+    
+    Until Python 2.6, argparse was distributed separately from Python proper.
+    As of 2.7 it is part of the Python standard library.
+    
+    Although the python package in a given distro may or may not Provide:
+    python-argparse, this cannot be relied upon.
+    
+    Therefore, this commit puts appropriate conditionals around Requires:
+    python-argparse and BuildRequires: python-argparse. It does so for Red
+    Hat/CentOS and SUSE only, because the last Fedora version with Python 2.6
+    was Fedora 13, which is EOL.
+    
+    argparse is required by both the ceph and ceph-common packages, but since ceph
+    requires ceph-common, the argparse Requires and BuildRequires need only appear
+    once, under ceph-common.
+    
+    http://tracker.ceph.com/issues/12034 Fixes: #12034
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 23171c952997d104cfa6b5700ec0bb658a8e0915)
+    
+    Conflicts:
+    	ceph.spec.in
+
+commit 54264210f4ebec23b08dd6712e09aea49543b52b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 12 15:24:26 2014 -0700
+
+    ReplicatedPG::maybe_handle_cache: do not skip promote for write_ordered
+    
+    We cannot redirect a RW ordered read.
+    
+    Fixes: #9064
+    Introduced: 0ed3adc1e0a74bf9548d1d956aece11f019afee0
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 24aeca9c439474b079d23600d8d42c0af5d9ce5c)
+
+commit 7e2526784203b0f1bce08869aa7b1fda9c5eedd9
+Author: Zhiqiang Wang <wonzhq at hotmail.com>
+Date:   Mon Jul 28 14:06:06 2014 +0800
+
+    osd: promotion on 2nd read for cache tiering
+    
+    http://tracker.ceph.com/issues/8674 Fixes: #8674
+    
+    Signed-off-by: Zhiqiang Wang <wonzhq at hotmail.com>
+    (cherry picked from commit 0ed3adc1e0a74bf9548d1d956aece11f019afee0)
+
+commit 66f61cd9ae105948f653fd888812df270ff1e832
+Author: Signed-off-by: Zhiqiang Wang <wonzhq at hotmail.com>
+Date:   Thu Jul 31 15:49:44 2014 -0700
+
+    ceph_test_rados_api_tier: test promote-on-second-read behavior
+    
+    http://tracker.ceph.com/issues/8674 References: #8674
+    
+    Signed-off-by: Zhiqiang Wang <wonzhq at hotmail.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1417eded65f40bdb2a49c8252fcfffa383a7b965)
+
+commit a8f3d6e1f1f186cbe2299566a575bf5a40500227
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 11 11:31:22 2014 -0700
+
+    osd/osd_types: be pedantic about encoding last_force_op_resend without feature bit
+    
+    The addition of the value is completely backward compatible, but if the
+    mon feature bits don't match it can cause monitor scrub noice (due to the
+    parallel OSDMap encoding).  Avoid that by only adding the new field if the
+    feature (which was added 2 patches after the encoding, see
+    3152faf79f498a723ae0fe44301ccb21b15a96ab and
+    45e79a17a932192995f8328ae9f6e8a2a6348d10.
+    
+    Fixes: #8815
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c93da05bd3dd6b73e8cfa182c6349359b042717c)
+    
+    Conflicts:
+        src/osd/osd_types.cc
+            drop encode_compat variable which is otherwise unused in this context
+
+commit dc128758bb68a50992819f759b5684ff656406ba
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri May 15 22:50:36 2015 +0800
+
+    mon: always reply mdsbeacon
+    
+    the MDS (Beacon) is always expecting the reply for the mdsbeacon messages from
+    the lead mon, and it uses the delay as a metric for the laggy-ness of the
+    Beacon. when it comes to the MDSMonitor on a peon, it will remove the route
+    session at seeing a reply (route message) from leader, so a reply to
+    mdsbeacon will stop the peon from resending the mdsbeacon request to the
+    leader.
+    
+    if the MDSMonitor re-forwards the unreplied requests after they are
+    outdated, there are chances that the requests reflecting old and even wrong
+    state of the MDSs mislead the lead monitor. for example, the MDSs which sent
+    the outdated messages could be dead.
+    
+    Fixes: #11590
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit b3555e9c328633c9e1fbc27d652c004b30535e5b)
+
+commit da720d7d870a53faeacc169796083b4eba4b9406
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 23:20:21 2015 -0700
+
+    mon/MDSMonitor: rename labels to a better name
+    
+    * s/ignore/reply/
+    * s/out/ignore/
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit f00ecb8b3df73ce6337985bc6d43bce5143ee537)
+    
+    Conflicts:
+        src/mon/MDSMonitor.cc
+            Do not compare known daemon health with m->get_health()
+
+commit 329da091d6e8444722b312ff94c7093f81939f13
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 12:55:06 2015 +0800
+
+    mon: send no_reply() to peon to drop ignored mdsbeacon
+    
+    so the peon can remove the ignored mdsbeacon request from the
+    routed_requets at seeing this reply, and hence no longer resend the
+    request.
+    
+    Fixes: #11590
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 72a37b3a8e145d8522ea67fc14ce2c5510b6852b)
+
+commit 508332f53075a99295b9edb683ed343d8f59ca4f
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 12:22:26 2015 +0800
+
+    mon: remove unnecessary error handling
+    
+    msg.get_session() should always return a non-zero pointer in
+    Monitor.dispatch()
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 16e8e2cc82a90c49cd8aa3d0e3acc4694ba659a0)
+    
+    Conflicts:
+        src/mon/Monitor.cc
+            Monitor::_ms_dispatch(Message *m) is bool in firefly
+
+commit 741f0c235228b371486574ba0c3fbf55729e03bd
+Merge: 1623e6c 0a7f2b2
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jul 9 17:24:04 2015 -0700
+
+    Merge pull request #4631 from SUSE/wip-11069-firefly
+    
+    PGLog: split divergent priors as well
+    
+    Reviewed-by: Samuel Just
+
+commit 3223bd604117b0b302b1e3e235ff9bced8e986bc
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Jun 26 09:59:36 2015 -0400
+
+    librbd: assertion failure race condition if watch disconnected
+    
+    It's possible for librbd's watch of the header object to be reset by
+    connection issues just prior to the image being removed.  This will
+    causes an assertion failure which assumes at least one watcher on the
+    image.
+    
+    Fixes: #12176
+    Backport: hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit af276de4f299960e43761904c043924cec5fef11)
+
+commit 2ee6e9a0cc6513097d6c9f9e40787a1c60c09796
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Sun Mar 8 22:45:34 2015 +0100
+
+    rgw: send Content-Length in response for HEAD on Swift account.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 29073d84640b61d0221b2d2ab73c271d60fd13ba)
+
+commit 1b4536aa47fd6d2440fbd30b64b5b46eaa21215a
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 6 13:18:19 2015 +0100
+
+    rgw: send Content-Length in response for DELETE on Swift container.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit d260a93405a7a34a899f716bd9c4e731baa9ffd0)
+
+commit 177324ced968b254458a450f8e348c96cbd10931
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 6 13:14:26 2015 +0100
+
+    rgw: send Content-Length in response for PUT on Swift container.
+    
+    Fixes: #11036
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 10c1f1aa1e09df5edf5d2f9f9b0273ddbcb384fa)
+
+commit 0a580c4a23b985ede28cdfc751eed2a368473e09
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Feb 27 15:23:16 2015 +0100
+
+    rgw: send Content-Length in response for GET on Swift container.
+    
+    Fixes: #10971
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 5a64fb5430b6b42174bf53a5910d9435043c1380)
+
+commit 84525806a057054dca295f860e0a31d6936d4985
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 6 12:42:52 2015 +0100
+
+    rgw: enable end_header() to handle proposal of Content-Length.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit f98fd4dfda7a105d621f99c2b48eb9ab9b45d979)
+
+commit 1d2af55f8c69b4a382eb516d8f90a8316fd3bc02
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri May 8 15:21:20 2015 +0800
+
+    mon: remove unused variable
+    
+    * as a side effect, this change silences
+      http://tracker.ceph.com/issues/11576
+    
+    Fixes: #11576
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit e7b196a4a091c0ea258866559ba06e7ed0cc4247)
+
+commit d296120c144a62794483338fd696ca8089778e84
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Oct 20 13:29:13 2014 -0700
+
+    Objecter: resend linger ops on any interval change
+    
+    Watch/notify ops need to be resent after a pg split occurs, as well as
+    a few other circumstances that the existing objecter checks did not
+    catch.
+    
+    Refactor the check the OSD uses for this to add a version taking the
+    more basic types instead of the whole OSD map, and stash the needed
+    info when an op is sent.
+    
+    Fixes: #9806
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit cb9262abd7fd5f0a9f583bd34e4c425a049e56ce)
+    
+    Conflicts:
+    	src/osd/osd_types.cc
+    	src/osdc/Objecter.cc
+                Minor differences.
+
+commit a44b7b4bd870cc72e50a49900cd81fde6d40845b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed May 7 11:02:16 2014 -0700
+
+    osd_types: factor out is_new_interval from check_new_interval
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 2ee355113ed4374c664909a8cd7dc5dfdc4c9ed7)
+
+commit 3f2fb8a996820843d0287a9337d38d80c7cb616b
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Wed Nov 5 01:00:01 2014 +0000
+
+    osd: cache pool: flush object ignoring cache min flush age when cache pool is full
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    
+    (cherry picked from commit f4ee9496ed15e7734abd659f5a353a3cde0dcb23)
+
+commit 9969ae5710bc66e1e96125f22593ea1e0ba381af
+Author: Zhiqiang Wang <wonzhq at hotmail.com>
+Date:   Fri Aug 1 16:09:50 2014 +0800
+
+    osd: add local_mtime to struct object_info_t
+    
+    This fixes a bug when the time of the OSDs and clients are not
+    synchronized (especially when client is ahead of OSD), and the cache
+    tier dirty ratio reaches the threshold, the agent skips the flush work
+    because it thinks the object is too young.
+    
+    Signed-off-by: Zhiqiang Wang <wonzhq at hotmail.com>
+    (cherry picked from commit 13b9dc708426c35436ba58388fc54f04f066f03a)
+
+commit 6793d504b5b622a7a6f69ffb30d6822167b557a3
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Mon Oct 13 04:18:45 2014 +0000
+
+    The fix for issue 9614 was not completed, as a result, for those erasure coded PGs with one OSD down, the state was wrongly marked as active+clean+degraded. This patch makes sure the clean flag is not set for such PG.
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    
+    (cherry picked from commit 35bbb2d6002b1b435ff0b1df653cc7ab271f9258)
+
+commit fcac7ab6305dc3215fdcb46951fa9ee4cbf68ce3
+Author: William A. Kennington III <william at wkennington.com>
+Date:   Sat Sep 20 22:52:31 2014 -0700
+
+    osd: Cleanup boost optionals
+    
+    Signed-off-by: William A. Kennington III <william at wkennington.com>
+    (cherry picked from commit a53ead14c113047567177630b4906136a2109b65)
+
+commit a62c720dc783b40377dcd34d4e53aa778ac1a84b
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jun 1 15:10:14 2015 -0700
+
+    Makefile: install ceph-post-file keys with mode 600
+    
+    Otherwise ssh (may) prompt for a password.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 106a1c3081d02446aa3d8e13865da0c3393bae90)
+
+commit fc59ca391f639b2ef1b5c9dda202a3d7d718cf25
+Author: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+Date:   Mon Jun 1 15:05:32 2015 -0700
+
+    ceph-post-file: improve check for a source install
+    
+    Signed-off-by: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+    (cherry picked from commit ee170eadcdcb4b54d36a7d474558484de9d917eb)
+
+commit 50bfb354d0648162f94c2659e8b915d69f27bf73
+Author: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+Date:   Mon Jun 1 15:00:39 2015 -0700
+
+    ceph-post-file: behave when sftp doesn't take -i
+    
+    Fixes: #11836
+    Signed-off-by: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+    (cherry picked from commit b84031ed5eaace1222e14d3c4076a3ab1155da96)
+
+commit 1623e6c6517ff6958b343493fce6a8e50a52a042
+Merge: ea6c958 254676b
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Jun 19 15:57:46 2015 -0700
+
+    Merge pull request #4960 from ceph/wip-10911-firefly
+    
+    osd,mon: explicitly specify OSD features in MOSDBoot
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit 254676b63b559fa0117520edb5dcbfe067a76747 (refs/remotes/jashan/wip-10911-firefly)
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Feb 18 14:53:04 2015 -0800
+
+    osd,mon: explicitly specify OSD features in MOSDBoot
+    
+    We are using the connection features to populate the features field in the
+    OSDMap, but this is the *intersection* of mon and osd features, not the
+    osd features.  Fix this by explicitly specifying the features in
+    MOSDBoot.
+    
+    Fixes: #10911
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit bee91548b07c6a28314dddc50fef8b6a2677e774)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+    Minor difference in the MOSDBoot constructor
+
+commit b1ff7396c8e9668c0be1a4023e0ffa292067cf64
+Author: xinxin shu <xinxin.shu at intel.com>
+Date:   Thu May 7 05:49:18 2015 +0800
+
+    osdc: add epoch_t last_force_resend in Op/LingerOp.
+    
+    Using this field record the pg_poo_t::last_force_op_resend to avoid op
+    endless when osd reply with redirect.
+    
+    Fixes: #11026
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit def4fc4a)
+
+commit 90a1a7587fcb567e2cc6e9188fdd56ec1255a881
+Author: islepnev <islepnev at gmail.com>
+Date:   Fri Apr 17 22:33:01 2015 +0300
+
+    ceph-disk: support NVMe device partitions
+    
+    Linux nvme kernel module v0.9 enumerate devices as following:
+    
+    /dev/nvme0 - characted revice
+    /dev/nvme0n1 - whole block device
+    /dev/nvme0n1p1 - first partition
+    /dev/nvme0n1p2 - second partition
+    
+    http://tracker.ceph.com/issues/11612 Fixes: #11612
+    
+    Signed-off-by: Ilja Slepnev <islepnev at gmail.com>
+    (cherry picked from commit 9b62cf254d02d30609793be8b1cb8a94f38891f1)
+    
+    Conflicts:
+    	src/ceph-disk
+
+commit f93eadd793f9f4fded30df5589f98ccfc0e1839f
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue May 12 16:37:56 2015 -0700
+
+    mon: prevent bucket deletion when referenced by a rule
+    
+    If a rule references a bucket with 'take', prevent deletion.
+    
+    Fixes: #11602
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3d591afef90b0601572c748f13faac029d05f5a0)
+
+commit d4ef5566e6b1b2ac73925660a1d627dbb6cc7632
+Author: Anton Aksola <anton.aksola at nebula.fi>
+Date:   Fri Apr 10 13:25:21 2015 +0300
+
+    rgw: always check if token is expired
+    
+    Fixes: #11367
+    
+    Currently token expiration is only checked by the token cache. With PKI
+    tokens no expiration check is done after decoding the token. This causes
+    PKI tokens to be valid indefinitely. UUID tokens are validated by
+    keystone after cache miss so they are not affected by this bug.
+    
+    This commit adds explicit token expiration check to
+    RGWSwift::validate_keystone_token()
+    
+    Signed-off-by: Anton Aksola <anton.aksola at nebula.fi>
+    Reported-by: Riku Lehto <riku.lehto at nexetic.com>
+    (cherry picked from commit 2df069390ea3bbcfbab5022750e89f51d197cc11)
+
+commit 2d5d8da35f627840ee57a8fa071147943b890d0c
+Author: Javier M. Mellid <jmunhoz at igalia.com>
+Date:   Fri May 15 14:22:29 2015 +0200
+
+    rgw: Use attrs from source bucket on copy
+    
+    On copy objects, when bucket source is the same as the destination, use attrs
+    from source bucket.
+    
+    Fixes: #11639
+    
+    Signed-off-by: Javier M. Mellid <jmunhoz at igalia.com>
+    (cherry picked from commit 1dac80df1d4a2364154ed8b404d13609936c257b)
+
+commit d78e31f005756700e15d26d187c6cef6d5d24a7a
+Author: 9seconds <nineseconds at yandex.ru>
+Date:   Wed Apr 1 09:12:06 2015 +0300
+
+    rgw: quota not respected in POST object
+    
+    Signed-off-by: Sergey Arkhipov <nineseconds at yandex.ru>
+    Backport: hammer, firefly
+    Fixes: #11323
+    (cherry picked from commit e76f84e179d2ba8bfc0dc5abf4e620fef14bc8a0)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
+            discard the whitespace modification hunks that were creating
+            conflicts and ignore the conflict due to an unrelated cast
+            modification in the context
+
+commit 177ef55d61c9b08783ae746aa521d2535324d6ba
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Fri Apr 3 13:43:31 2015 +0200
+
+    rgw: remove meta file after deleting bucket
+    The meta file is deleted only if the bucket meta data is not synced
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    
+    Fixes: #11149
+    Backport: hammer, firefly
+    (cherry picked from commit dfdc7afb59cc8e32cf8bff55faa09076c853de06)
+
+commit 9845258f184c823d1e48da1dcb97bdde97220bb6
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 22 11:27:35 2015 -0400
+
+    librbd: updated cache max objects calculation
+    
+    The previous calculation was based upon the image's object size.
+    Since the cache stores smaller bufferheads, the object size is not
+    a good indicator of cache usage and was resulting in objects being
+    evicted from the cache too often.  Instead, base the max number of
+    objects on the memory load required to store the extra metadata
+    for the objects.
+    
+    Fixes: #7385
+    Backport: firefly, hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0b378942c4f1b79cb65967f2d3466728ca1c8d5b)
+    
+    Conflicts:
+    	src/librbd/ImageCtx.cc
+            because firefly has cct->_conf->rbd_cache_size
+            instead of cache_size
+
+commit 0a7f2b2a859aefebc995ad5c7b699eb117d6fa12
+Author: Nathan Cutler <ncutler at suse.cz>
+Date:   Sun May 10 17:13:22 2015 +0200
+
+    PGLog: split divergent priors as well
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit bbe231a61fc06a1a668e6b831fb8224526721f93)
+    
+    Conflicts:
+        src/osd/PGLog.h
+    
+        The cherry-picked commit did not compile as-is, because the hobject_t
+        class in firefly lacks a get_hash() method, which was added in 6de83d4.
+        To get the patch to compile, I replaced i->second.get_hash() with
+        i->second.hash.
+
+commit 424289dc4ee8fb09dd00d507b5a9d1fecc786937
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri May 8 12:01:16 2015 +0800
+
+    json_sprit: fix the FTBFS on old gcc
+    
+    Fixes: #11574
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 6b68b27146852f057a3373cd04b08cd6917f3eea)
+
+commit 84b00f189554fc37413c990ac4011079bb5cdb60
+Author: Tim Serong <tserong at suse.com>
+Date:   Sat May 2 01:59:53 2015 +1000
+
+    json_spirit: use utf8 intenally when parsing \uHHHH
+    
+    When the python CLI is given non-ASCII characters, it converts them to
+    \uHHHH escapes in JSON.  json_spirit parses these internally into 16 bit
+    characters, which could only work if json_spirit were built to use
+    std::wstring, which it isn't; it's using std::string, so the high byte
+    ends up being zero'd, leaving the low byte which is effectively garbage.
+    
+    This hack^H^H^H^H change makes json_spirit convert to utf8 internally
+    instead, which can be stored just fine inside a std::string.
+    
+    Note that this implementation still assumes \uHHHH escapes are four hex
+    digits, so it'll only cope with characters in the Basic Multilingual
+    Plane.  Still, that's rather a lot more characters than it could cope
+    with before ;)
+    
+    (For characters outside the BMP, Python seems to generate escapes in the
+    form \uHHHHHHHH, i.e. 8 hex digits, which the current implementation
+    doesn't expect to see)
+    
+    Fixes: #7387
+    
+    Signed-off-by: Tim Serong <tserong at suse.com>
+    (cherry picked from commit 8add15b86e7aaef41397ab8fa9e77ee7957eb607)
+    
+    Conflicts:
+    	src/test/mon/osd-pool-create.sh
+    
+            Changed $CEPH_MON to 127.0.0.1 -- the CEPH_MON was introduced after
+            firefly to allow tests to run in parallel. Back in firefly all tests
+            use the same port because 127.0.0.1 was hardcoded. We can't
+            conveniently backport all that's necessary for tests to run in
+            parallel, therefore we keep the 127.0.0.1 hardcoded.
+
+commit 10d85e1126768f6c72f7d2a301ea7ca9ba59f8e0
+Author: Owen Synge <osynge at suse.com>
+Date:   Tue Mar 17 15:41:33 2015 +0100
+
+    Fix "disk zap" sgdisk invocation
+    
+    Fixes #11143
+    
+    If the metadata on the disk is truly invalid, sgdisk would fail to zero
+    it in one go, because --mbrtogpt apparently tried to operate on the
+    metadata it read before executing --zap-all.
+    
+    Splitting this up into two separate invocations to first zap everything
+    and then clear it properly fixes this issue.
+    
+    Based on patch by Lars Marowsky-Bree <lmb at suse.com> in ceph-deploy.
+    Created by Vincent Untz <vuntz at suse.com>
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit fdd7f8d83afa25c4e09aaedd90ab93f3b64a677b)
+
+commit b06114088a354f9dbcfc9182643733399c31f2a8
+Author: Jon Bernard <jbernard at tuxion.com>
+Date:   Fri May 8 11:54:06 2015 -0400
+
+    common/admin_socket: close socket descriptor in destructor
+    
+    Long-running processes that do not reuse a single client connection will
+    see accumulating file descriptors as a result of not closing the
+    listening socket.  In this case, eventually the system will reach
+    file-max and subsequent connections will fail.
+    
+    Fixes: #11535
+    
+    Signed-off-by: Jon Bernard <jbernard at tuxion.com>
+    (cherry picked from commit 88fabb1ee6cd3c7d211ca46919055195e32245db)
+
+commit 8372f1d53b847224bf4c61894d18851e84ccd357
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Fri Mar 6 15:54:07 2015 +0800
+
+    osd: refuse to write a new erasure coded object with an offset > 0
+    
+    Even if the offset is properly aligned.
+    
+    http://tracker.ceph.com/issues/11507 Fixes: #11507
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit a4f1256c214ee0e7ebb91ac4ea8655f5d9642dc8)
+
+commit 909096713dcef5dc4fdbb22a9971609554688e23
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 8 15:15:35 2015 +0100
+
+    ceph-disk: more robust parted output parser
+    
+    In some cases, depending on the implementation or the operating system,
+    
+       parted --machine -- /dev/sdh print
+    
+    may contain empty lines. The current parsing code is fragile and highly
+    depends on output details. Replace it with code that basically does the
+    same sanity checks (output not empty, existence of units, existence of
+    the dev entry) but handles the entire output instead of checking line by
+    line.
+    
+    http://tracker.ceph.com/issues/10983 Fixes: #10983
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit f5acf6bb6a342b05897605703d7d9cb7c09714fd)
+
+commit 8c573c8826096d90dc7dfb9fd0126b9983bc15eb
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 30 14:15:47 2014 -0700
+
+    rgw: swift GET / HEAD object returns X-Timestamp field
+    
+    Fixes: #8911
+    Backport: giant, firefly, dumpling
+    Swift clients expect X-Timestamp header, dump it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5b41d80b7fb9ed96c26801fc42c044191bb18d84)
+
+commit 9614e4dc5be745dab367d17f29a07377e348b2ca
+Author: Daniel J. Hofmann <daniel at trvx.org>
+Date:   Mon May 5 16:06:45 2014 +0200
+
+    Variable length array of std::strings (not legal in C++) changed to std::vector<std::string>
+    
+    Signed-off-by: Daniel J. Hofmann <daniel at trvx.org>
+    (cherry picked from commit 08a4e8889783673436972a979c2fc780466893c8)
+
+commit 2cb2333ecdf2106925d74e024697f73ad947f378
+Author: Thorsten Behrens <tbehrens at suse.com>
+Date:   Thu Jul 3 00:15:03 2014 +0200
+
+    ceph_argparse_flag has no regular 3rd parameter.
+    
+    With clang warning: 'va_start' has undefined behavior with reference
+    types, noticing copy-paste mistake on ceph_argparse_flag.
+    
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit 0c7c7223a2beb4ffb953d89d316f87d350677063)
+
+commit f6022639758ec13b9a25b03cd831882db0b517b3
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Dec 17 17:12:43 2014 -0800
+
+    rgw: use correct objv_tracker for bucket instance
+    
+    When trying to create a bucket that already existed, use the
+    objv_tracker of the newly created instance, and not of the original
+    bucket.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fe158ecc25feefcea8aea4133118e4a84900a8ec)
diff --git a/doc/changelog/v0.80.2.txt b/doc/changelog/v0.80.2.txt
new file mode 100644
index 0000000..1b4a857
--- /dev/null
+++ b/doc/changelog/v0.80.2.txt
@@ -0,0 +1,1187 @@
+commit 198236d68deceb16b6b590d807786a140209bfea (tag: refs/tags/v0.80.2, refs/remotes/gh/last)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Wed Jul 9 19:32:26 2014 +0000
+
+    0.80.2
+
+commit 0b6bd2545925b5e8a80d41de1fda13ffe9d30e2b
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Jul 9 12:04:49 2014 -0700
+
+    Revert "rgw: if extra data pool name is empty, use data pool name instead"
+    
+    This breaks multipart uploads on firefly, though not on master.
+    Revert for now so we can release 0.80.2.
+    
+    This reverts commit 5fd8b0d1639c67e355f0fc0d7e6d7036618d87a1.
+
+commit 9426c4faa9ca327f18f20a57ba772b08d6f069e7
+Merge: b81a277 4733178
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 8 10:06:01 2014 -0700
+
+    Merge pull request #2083 from ceph/wip-8727.firefly
+    
+    messages: MForward: fix compat version
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 4733178c3a8f57c54196f176b20154415783dba0
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 8 16:46:27 2014 +0100
+
+    messages: MForward: fix compat version
+    
+    A while ago we bumped the head version and reset the compat version to 0.
+    Doing this so happens to make the messenger assume that the message does
+    not support the compat versioning and sets the compat version to the head
+    version -- thus making compat = 2 when it should have been 1.
+    
+    The nasty side-effect of this is that upgrading from emperor to firefly
+    will have emperor-leaders being unable to decode forwarded messages from
+    firefly-peons.
+    
+    Fixes: #8727
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit c92feebb81f90344a085f8256f0ed03cdc2f14e1)
+
+commit b81a2777aea636ffe544e737cd8e17dc892ba328
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Jul 3 16:11:24 2014 -0700
+
+    ceph.spec.in: add bash completion file for radosgw-admin
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit b70096307130bcbac176704493a63c5d039d3edc)
+
+commit 4649d7e90ffec89b452aef69cf833522bdb81f88
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Jul 3 16:10:55 2014 -0700
+
+    ceph.spec.in: rhel7-related changes:
+    
+    udev rules: /lib -> /usr/lib
+    /sbin binaries move to /usr/sbin or %{_sbindir}
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit 235e4c7de8f8efe491edefbdde8e5da4dfc44034)
+    
+    Conflicts:
+    	ceph.spec.in
+
+commit 38a9566e70d3a2de80c7547fd4e84c8372639f80
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Jul 3 16:08:44 2014 -0700
+
+    Fix/add missing dependencies:
+    
+    - rbd-fuse depends on librados2/librbd1
+    - ceph-devel depends on specific releases of libs and libcephfs_jni1
+    - librbd1 depends on librados2
+    - python-ceph does not depend on libcephfs1
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit 7cf81322391b629b241da90181800ca1f138ce78)
+    
+    Conflicts:
+    	ceph.spec.in
+
+commit 733c89dc6af89321ee58ad78b30bc6a0c4e78291
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Jul 3 16:05:00 2014 -0700
+
+    ceph.spec.in: whitespace fixes
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit ec8af52a5ede78511423a1455a496d46d580c644)
+    
+    Conflicts:
+    	ceph.spec.in
+
+commit 21b03bc96ab1a0877235f1e3e4a96899cba2b4fa
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Jul 3 16:04:10 2014 -0700
+
+    ceph.spec.in: split out ceph-common as in Debian
+    
+    Move files, postun scriptlet, and add dependencies on ceph-common
+    where appropriate
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit e131b9d5a5e90e87d8a8346cb96cb5a26135c144)
+
+commit dbee797d1344aec47fedc8d3fdd6c9460e0ffa16
+Merge: 6d6039a 9e81fc1
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 7 09:40:51 2014 -0700
+
+    Merge pull request #2057 from ceph/wip-8593-firefly
+    
+    mon: backport health check improvements
+    
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+
+commit 6d6039a5a56743c006a0d081157cb6ee9e3b7af6
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu Jul 3 16:30:49 2014 -0700
+
+    mon: check changes to the whole CRUSH map and to tunables against cluster features
+    
+    When we change the tunables, or set a new CRUSH map, we need to make sure it's
+    supported by all the monitors and OSDs currently participating in the cluster.
+    
+    Fixes: #8738
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 54af8104816ccc76aad251aa47a6efc1bf879e7d)
+
+commit 0a8d194f2c44a73c31ae8c52fabb430d66d4a1b1
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu Jul 3 15:24:30 2014 -0700
+
+    OSDMonitor: fix quorum_features comparison in check_cluster_features
+    
+    We need to see if there's a feature which is not in the quorum_features,
+    not if there are no features in common!
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 2280c0eaa9f3f733062085a5e7f7dc23c3bbe291)
+
+commit a49c61222f8014db533d8f505ec44d10dc5478e6
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 12:57:36 2014 -0700
+
+    ceph_test_rados_api_tier: disable LibRadosTierECPP::HitSetWrite
+    
+    Disable this test until hitget-get reliably works on EC pools (currently
+    it does not, and this test usually passes only because we get the in-memory
+    HitSet).
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c5b5ed672c039cc4fa04772e065a59d3b1df803a)
+
+commit 828ce4055c8580e42175159c02a9dfa76bc414ff
+Merge: b9b498e b1a4a7c
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 4 21:18:32 2014 -0700
+
+    Merge pull request #2073 from ceph/wip-rgw-firefly-2
+    
+    rgw: more firefly backports
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit b1a4a7cb91e164d1f8af8ce9319e3b3c1949858d
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jun 11 16:50:41 2014 -0700
+
+    rgw: set a default data extra pool name
+    
+    Fixes: #8585
+    Have a default name for the data extra pool, otherwise it would be empty
+    which means that it'd default to the data pool name (which is a problem
+    with ec backends).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b2542f8e880e45bb6d052f13eb3ef6a7c61e4cd4)
+
+commit b9b498e6a7794205af8aa99ffe5266e478c0e711
+Merge: f285266 053c261
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 3 07:00:52 2014 -0700
+
+    Merge pull request #2028 from ceph/wip-rgw-firefly
+    
+    rgw: a couple backports for firefly
+    
+    Passed the rgw suite, modulo a python bootstrap issue.
+    
+    sage-2014-07-01_09:50:22-rgw-wip-rgw-firefly-testing-basic-plana/337393
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+
+commit 9f06e2c16e409a9a8284af9964f0cfff6e222164
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 30 12:55:45 2014 -0700
+
+    rgw: fix uninit ofs in RGWObjManifect::obj_iterator
+    
+    Valgrind picked this up:
+    
+      <kind>UninitCondition</kind>
+      <what>Conditional jump or move depends on uninitialised value(s)</what>
+      <stack>
+        <frame>
+          <ip>0x5145B8</ip>
+          <obj>/usr/bin/radosgw</obj>
+          <fn>RGWObjManifest::obj_iterator::seek(unsigned long)</fn>
+          <dir>/srv/autobuild-ceph/gitbuilder.git/build/out~/ceph-0.82-354-g62027ec/src/rgw</dir>
+          <file>rgw_rados.cc</file>
+          <line>562</line>
+        </frame>
+        <frame>
+          <ip>0x5672A4</ip>
+          <obj>/usr/bin/radosgw</obj>
+          <fn>list_multipart_parts(RGWRados*, req_state*, std::string const&, std::string&, int, int, std::map<unsigned int, RGWUploadPartInfo, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, RGWUploadPartInfo> > >&, int*, bool*, bool)</fn>
+          <dir>/srv/autobuild-ceph/gitbuilder.git/build/out~/ceph-0.82-354-g62027ec/src/rgw</dir>
+          <file>rgw_rados.h</file>
+          <line>217</line>
+        </frame>
+        <frame>
+          <ip>0x5688EE</ip>
+          <obj>/usr/bin/radosgw</obj>
+          <fn>RGWListMultipart::execute()</fn>
+          <dir>/srv/autobuild-ceph/gitbuilder.git/build/out~/ceph-0.82-354-g62027ec/src/rgw</dir>
+          <file>rgw_op.cc</file>
+          <line>2956</line>
+        </frame>
+    ...
+    
+    Fixes: #8699
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e0d3b78b6af523ae77b0cee385cd40f67f7a0ab6)
+
+commit 5fd8b0d1639c67e355f0fc0d7e6d7036618d87a1
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 30 14:47:25 2014 -0700
+
+    rgw: if extra data pool name is empty, use data pool name instead
+    
+    Fixes: #8311
+    An empty pool name could be used as the extra data pool.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit b300318113b162522759d4794b1cfa3d1d9398e4)
+
+commit cbad09e1907ceac4feb069f9cf257e580f36da91
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Tue May 6 15:35:20 2014 -0700
+
+    rgw: extend manifest to avoid old style manifest
+    
+    In case we hit issue #8269 we'd like to avoid creating an old style
+    manifest. Since we need to have parts that use different prefix we add a
+    new rule param that overrides the manifest prefix.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 545d8ad1d2dfe53b967ab1bd17dfeb1780abbb5e)
+
+commit ea68b9372319fd0bab40856db26528d36359102e
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 2 17:06:05 2014 -0700
+
+    rgw: don't allow multiple writers to same multiobject part
+    
+    Fixes: #8269
+    Backport: firefly, dumpling
+    
+    A client might need to retry a multipart part write. The original thread
+    might race with the new one, trying to clean up after it, clobbering the
+    part's data.
+    The fix is to detect whether an original part already existed, and if so
+    use a different part name for it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit bd8e026f88b812cc70caf6232c247844df5d99bf)
+
+commit f285266a320bf22df8b09a669d1c1fd400b05765
+Merge: d43e711 6a0dd1b
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 1 16:16:09 2014 -0700
+
+    Merge pull request #2056 from ceph/wip-8010
+    
+    Revert "mon: OSDMonitor: Refuse to delete CephFS pools"
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 9e81fc180a3999ebec95949a2cb31fea970573fb
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 17:00:51 2014 -0700
+
+    mon: ensure HealthService warning(s) include a summary
+    
+    The low disk space check would change our status to HEALTH_WARN and include
+    a detail message, but no summary.  We need both.
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3ed7f2dd4345633ff34017b201082f4c261ef387)
+
+commit e96637c2e33ec092f28af0ce96bfe2e4d7748ff8
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 16:58:14 2014 -0700
+
+    mon: refactor check_health()
+    
+    Refactor the get_health() methods to always take both a summary and detail.
+    Eliminate the return value and pull that directly from the summary, as we
+    already do with the PaxosServices.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 82e47db8073b622183a5e33f6e0b999a3a144804)
+
+commit 28584200df36dda5d434d4d7f58585933905de30
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 16:40:05 2014 -0700
+
+    mon: fix typos, punctuation for mon disk space warning(s)
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 98883f6308ce72f69a71feab29ef00e13f319cdb)
+    
+    Conflicts:
+    
+    	src/mon/DataHealthService.cc
+
+commit 4f0666085e2fd553ccc05cef8510aae820849aca
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 16:27:05 2014 -0700
+
+    mon/OSDMonitor: make down osd count sensible
+    
+    We currently log something like
+    
+     1/10 in osds are down
+    
+    in the health warning when there are down OSDs, but this is based on a
+    comparison of the number of up vs the number of in osds, and makes no sense
+    when there are up osds that are not in.
+    
+    Instead, count only the number OSDs that are both down and in (relative to
+    the total number of OSDs in) and warn about that.  This means that, if a
+    disk fails, and we mark it out, and the cluster fully repairs itself, it
+    will go back to a HEALTH_OK state.
+    
+    I think that is a good thing, and certainly preferable to the current
+    nonsense.  If we want to distinguish between down+out OSDs that were failed
+    vs those that have been "acknowledged" by an admin to be dead, we will
+    need to add some additional state (possibly reusing the AUTOOUT flag?), but
+    that will require more discussion.
+    
+    Backport: firefly (maybe)
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 55a97787088b79356c678a909b2410b3924e7f5b)
+
+commit 6a0dd1be909b423f52e2c7f11531b278dc8838ae
+Author: John Spray <john.spray at redhat.com>
+Date:   Tue Jul 1 22:04:25 2014 +0100
+
+    Revert "mon: OSDMonitor: Refuse to delete CephFS pools"
+    
+    This reverts commit c7d265a9b276aad5caf9b35f3ce8bc7bdd169f0f.
+    
+    Because this pre-dates the `fs rm` command, this change was
+    preventing firefly users from ever deleting their filesystem pools.
+    
+    Fixes: #8010
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+
+commit 053c261e5bfcb4d39770048775515eb6a667f987
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jun 4 09:24:33 2014 -0700
+
+    rgw: set meta object in extra flag when initializing it
+    
+    As part of the fix for 8452 we moved the meta object initialization.
+    Missed moving the extra flag initialization that is needed. This breaks
+    setups where there's a separate extra pool (needed in ec backends).
+    
+    Reported-by: Sylvain Munaut <s.munaut at whatever-company.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 703d0eb9bffdf6c553b659728a3a07f068fb15ee)
+
+commit d43e7113dd501aea1db33fdae30d56e96e9c3897
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 30 07:05:04 2014 -0700
+
+    qa/workunits/suites/fsx.sh: don't use zero range
+    
+    Zero range is not supported by cephfs.
+    
+    Fixes: #8542
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2dec8a810060f65d022c06e82090b4aa5ccec0cb)
+
+commit ee0d322c0b1ebaba2f225b8bed9af2948fdcf4c3
+Merge: 3ceafcf a7119c3
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Jun 30 17:01:03 2014 +0200
+
+    Merge pull request #1991 from dachary/wip-8307-erasure-code-profile-implicit-creation
+    
+    erasure code profile implicit creation (firefly backport)
+    
+    Reviewed-by: Joao Eduardo Luis <joao.luis at inktank.com>
+
+commit a7119c31e9a1b415f56426d2b4cd362357ad8b17
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jun 11 22:44:57 2014 +0200
+
+    erasure-code: pool create must not create profiles
+    
+    If a non existent profile is provided as an argument to osd pool create,
+    it must exit on error and not create the profile as a side effect.
+    
+    http://tracker.ceph.com/issues/8307 refs: #8307
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit ff2eb234e63cd281b40405cb3397da5babda943f)
+
+commit a67c1c1c51b111f40819643530e07f8026227caa
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jun 11 22:47:49 2014 +0200
+
+    erasure-code: OSDMonitor::get_erasure_code is a const
+    
+    If it is not, the non const version of OSDMap::get_erasure_code_profile
+    is called and a profile is created as a side effect, which is not
+    intended.
+    
+    http://tracker.ceph.com/issues/8307 refs: #8307
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 3c638111a4943758b6089c63a42aabbf281ac257)
+
+commit 3ceafcf3576efaef58dffbe70654baf1db4f3a1d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue May 27 10:06:46 2014 +0200
+
+    mon: fix set cache_target_full_ratio
+    
+    It was a noop because it was incorrectly using the variable n. Add a
+    test to protect against regression.
+    
+    http://tracker.ceph.com/issues/8440 Fixes: #8440
+    
+    Reported-by: Geoffrey Hartz <hartz.geoffrey at gmail.com>
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit c2225f874dcf37222d831b65b5a319d598d2fcd9)
+
+commit 5f66a2c99fdef2c8d609126740ca790ce10e67a4
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Jun 16 11:48:24 2014 -0700
+
+    rgw: allocate enough space for bucket instance id
+    
+    Fixes: #8608
+    Backport: dumpling, firefly
+    Bucket instance id is a concatenation of zone name, rados instance id,
+    and a running counter. We need to allocate enough space to account zone
+    name length.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit d2e86a66ca55685e04ffbfaa58452af59f381277)
+
+commit 84d7971c8e50e7d35d7a5fac9353e687f168a1a1
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Fri Jun 20 11:14:25 2014 -0400
+
+    log the command that is being run with subprocess
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit e189a668285f9ab73116bc19f9df1cc515473541)
+
+commit 291d448478360a1be0a9826ada58c94ecd643ad0
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 30 16:17:47 2014 -0700
+
+    rgw: fetch object attrs on multipart completion
+    
+    Fixes: #8452
+    Backport: firefly
+    This fixes a regression following a code cleanup.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 70afaaabf979d4cc1a14dbc2b772224cbafcac2f)
+
+commit 2fd808fe93fe0cbd8754eb81d281c83254411039
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu May 22 18:27:58 2014 -0700
+
+    rgw: check appropriate entity permission on put_metadata
+    
+    Fixes: #8428
+    Backport: firefly
+    
+    Cannot use verify_object_permission() to test acls, as the operation
+    here might either be on object or on bucket.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 2ceb13af34bc38b418bb88d81131d770a71159bf)
+
+commit d1afeb38b522baae1b15a7a3548002c830bb7567
+Author: Ilya Dryomov <ilya.dryomov at inktank.com>
+Date:   Thu Jun 5 10:08:42 2014 +0400
+
+    XfsFileStoreBackend: call ioctl(XFS_IOC_FSSETXATTR) less often
+    
+    No need to call ioctl(XFS_IOC_FSSETXATTR) if extsize is already set to
+    the value we want or if any extents are allocated - XFS will refuse to
+    change extsize in that's the case.
+    
+    Fixes: #8241
+    Signed-off-by: Ilya Dryomov <ilya.dryomov at inktank.com>
+    (cherry picked from commit bc3b30ed09b8f3eb86b61e3a05ccacfd928faa95)
+
+commit 7b8e5c99a4a40ae788ad29e36b0d714f529b12eb
+Author: John Spray <john.spray at inktank.com>
+Date:   Tue May 20 16:25:19 2014 +0100
+
+    mon: Fix default replicated pool ruleset choice
+    
+    Specifically, in the case where the configured
+    default ruleset is CEPH_DEFAULT_CRUSH_REPLICATED_RULESET,
+    instead of assuming ruleset 0 exists, choose the lowest
+    numbered ruleset.
+    
+    In the case where an explicit ruleset is passed to
+    OSDMonitor::prepare_pool_crush_ruleset, verify
+    that it really exists.
+    
+    The idea is to eliminate cases where a pool could
+    exist with its crush ruleset set to something
+    other than a value ruleset ID.
+    
+    Fixes: #8373
+    
+    Signed-off-by: John Spray <john.spray at inktank.com>
+    (cherry picked from commit 1d9e4ac2e2bedfd40ee2d91a4a6098150af9b5df)
+    
+    Conflicts:
+    
+    	src/crush/CrushWrapper.h
+
+commit 25a4a874c8e53cd644d6705478fbea4fdb232c4d
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Fri May 23 14:58:54 2014 -0700
+
+    rgw: calc md5 and compare if user provided appropriate header
+    
+    Fixes: #8436
+    Backport: firefly
+    
+    This was broken in ddc2e1a8e39a5c6b9b224c3eebd1c0e762ca5782. The fix
+    resurrects and old check that was dropped.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    Reviewed-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 9c56c86bdac6bcb8e76c3f04e7d393e4eaadd721)
+
+commit ad18a45a71be34899d9400c8bdef39d0548f9aaf
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Apr 21 15:07:12 2014 -0700
+
+    rgw: calculate user manifest
+    
+    Fixes: #8169
+    Backport: firefly
+    We didn't calculate the user manifest's object etag at all. The etag
+    needs to be the md5 of the contantenation of all the parts' etags.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit ddc2e1a8e39a5c6b9b224c3eebd1c0e762ca5782)
+
+commit 6aa7f7ee4e082819decc48da1f0eaffc4e616302
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 3 11:45:20 2014 -0700
+
+    librados: simplify/fix rados_pool_list bounds checks
+    
+    We were not breaking out of the loop when we filled up the buffer unless
+    we happened to do so on a pool name boundary.  This means that len would
+    roll over (it was unsigned).  In my case, I was not able to reproduce
+    anything particularly bad since (I think) the strncpy was interpreting the
+    large unsigned value as signed, but in any case this fixes it, simplifies
+    the arithmetic, and adds a simple test.
+    
+    - use a single 'rl' value for the amount of buffer space we want to
+      consume
+    - use this to check that there is room and also as the strncat length
+    - rely on the initial memset to ensure that the trailing 0 is in place.
+    
+    Fixes: #8447
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3ec32a6bb11d92e36a0e6381b40ce2fd1fbb016a)
+
+commit 2ba03e08f1bce0a8af87014583d635eb5c0aa376
+Merge: 50dc246 3ad451e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jun 25 12:42:11 2014 -0700
+
+    Merge pull request #1982 from accelazh/firefly-fix-issue-8256
+    
+    Make <poolname> in "ceph osd tier --help" clearer (fix issue 8256).
+    
+    Reviewed-by: Loic Dachary <loic at dachary.org>
+
+commit 50dc2462ab96c3457b08c50b4cc07676b50dbf72
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jun 3 16:14:15 2014 -0700
+
+    OSD::calc_priors_during: handle CRUSH_ITEM_NONE correctly
+    
+    Fixes: #8507
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0bd6f6797c69af9aff851033c57c42121671c684)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit a53bcf2357c7f351ad520039774d895b8c27987f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jun 3 16:11:32 2014 -0700
+
+    OSD::calc_priors_during: fix confusing for loop bracing (cosmetic)
+    
+    Confusing lack of braces is confusing.
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit d76936b92300be5cc403fd5a36616a2424c7877d)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit 178e6f0f422c9f1b8a51d0e9c364773397a4555f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jun 24 10:11:21 2014 -0700
+
+    rados.cc: fix pool alignment check
+    
+    Only check pool alignment if io_ctx is initialized.
+    
+    Introduced in 304b08a23a3db57010078046955a786fe3589ef8
+    Fixes: #8652
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    
+    (cherry picked from commit d7350a3741bf4cdb270c6361e68090fe280cf36d)
+    
+    Conflicts:
+    	src/tools/rados/rados.cc
+
+commit a9f97f8cae5b9d0245e0b0842c5c581cdacbb2da
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 17 13:33:14 2014 -0700
+
+    osd: fix filestore perf stats update
+    
+    Update the struct we are about to send, not the (unlocked!) one we will
+    send the next time around.
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 4afffb4a10a0bbf7f2018ef3ed6b167c7921e46b)
+
+commit b758fd5f0ebcccdb1641a852d40ee880bad01107
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu Apr 24 15:34:24 2014 -0700
+
+    FileStore: set XATTR_NO_SPILL_OUT when creating new files.
+    
+    Fixes: #8205
+    Backport: firefly
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit e3b995e1567f3ccc6d00ae27ab2aa99ca157228a)
+
+commit d6f302314fc3580dfc746c9d82bd2f7f0bc87d42
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Sat Jun 7 14:32:23 2014 +0800
+
+    FileStore: make _clone() copy spill out marker
+    
+    Previously we were not doing so, and that resulted in unpredictable loss
+    of xattrs from the client's perspective.
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 239476a92849159d2a8966d90ca055c116bee91e)
+
+commit bb2ed23d8129c8db628475d744656b9b43f839c0
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jun 18 17:01:54 2014 +0200
+
+    erasure-code: verify that rados put enforces alignment
+    
+    http://tracker.ceph.com/issues/8622 refs: #8622
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit b46c4056014dd6de5e3bd736f2c41f096ea708b4)
+
+commit dece65064d949b5afcc359cd408615883b5e002a
+Author: Lluis Pamies-Juarez <lluis at pamies.cat>
+Date:   Wed Jun 18 10:00:09 2014 -0700
+
+    enforce rados put aligment
+    
+    Signed-off-by: Lluis Pamies-Juarez <lluis.pamies-juarez at hgst.com>
+    (cherry picked from commit 304b08a23a3db57010078046955a786fe3589ef8)
+
+commit 203318b8eb3753723277ec7a459239c81097f090
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jun 6 13:31:29 2014 -0700
+
+    osd/OSDMap: do not require ERASURE_CODE feature of clients
+    
+    Just because an EC pool exists in the cluster does not mean tha tthe client
+    has to support the feature:
+    
+    1) The way client IO is initiated is no different for EC pools than for
+       replicated pools.
+    2) People may add an EC pool to an existing cluster with old clients and
+       locking those old clients out is very rude when they are not using the
+       new pool.
+    3) The only direct client user of EC pools right now is rgw, and the new
+       versions already need to support various other features like CRUSH_V2
+       in order to work.  These features are present in new kernels.
+    
+    Fixes: #8556
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3fe1699f9620280d0070cfe6f01cfeb2332e7470)
+
+commit 6340b14b9c9a9c786b5448f2ea2a5556055a02e9
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 12 16:44:53 2014 -0700
+
+    osd/OSDMap: make get_features() take an entity type
+    
+    Make the helper that returns what features are required of the OSDMap take
+    an entity type argument, as the required features may vary between
+    components in the cluster.
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 250677c965365edf3ecd24ef73700fc6d992ea42)
+
+commit 400fa88f6cf8b1e5b4b15d9e36b1de8c3d1c3970
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Wed May 21 18:12:22 2014 +0800
+
+    Avoid extra check for clean object
+    
+    We needn't to check clean object via buffer state, skip the clean object.
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit f51e33bd9c5a8e1cfc7065b30785696dc45918bc)
+
+commit 3ad451ef57e2ab3fc644c94d44c2de7a17cced45
+Author: Accela Zhao <accelazh at gmail.com>
+Date:   Wed Jun 18 17:17:03 2014 +0800
+
+    Make <poolname> in "ceph osd tier --help" clearer.
+    
+    The ceph osd tier --help info on the left always says <poolname>.
+    It is unclear which one to put <tierpool> on the right.
+    
+    $ceph osd tier --help
+    osd tier add <poolname> <poolname> {--   add the tier <tierpool> to base pool
+    force-nonempty}                          <pool>
+    osd tier add-cache <poolname>            add a cache <tierpool> of size <size>
+    <poolname> <int[0-]>                     to existing pool <pool>
+    ...
+    
+    This patch modifies description on the right to tell which <poolname>:
+    
+    osd tier add <poolname> <poolname> {--   add the tier <tierpool> (the second
+     force-nonempty}                          one) to base pool <pool> (the first
+                                               one)
+    ...
+    
+    Fix: http://tracker.ceph.com/issues/8256
+    
+    Signed-off-by: Yilong Zhao <accelazh at gmail.com>
+
+commit f290a021bc8ec31c18b91cb37323345692f2f198
+Merge: 5722419 d02d46e
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 16 09:25:32 2014 -0700
+
+    Merge pull request #1962 from dachary/wip-8599-ruleset-firefly
+    
+    mon: pool set <pool> crush_ruleset must not use rule_exists (firefly)
+    
+    Reviewed-by: Sage Weil <sage at inktank.com>
+
+commit d02d46e25080d5f7bb8ddd4874d9019a078b816b
+Author: John Spray <john.spray at inktank.com>
+Date:   Tue May 20 16:50:18 2014 +0100
+
+    mon: pool set <pool> crush_ruleset must not use rule_exists
+    
+    Implement CrushWrapper::ruleset_exists that iterates over the existing
+    rulesets to find the one matching the ruleset argument.
+    
+    ceph osd pool set <pool> crush_ruleset must not use
+    CrushWrapper::rule_exists, which checks for a *rule* existing, whereas
+    the value being set is a *ruleset*. (cherry picked from commit
+    fb504baed98d57dca8ec141bcc3fd021f99d82b0)
+    
+    A test via ceph osd pool set data crush_ruleset verifies the ruleset
+    argument is accepted.
+    
+    http://tracker.ceph.com/issues/8599 fixes: #8599
+    
+    Backport: firefly, emperor, dumpling
+    Signed-off-by: John Spray <john.spray at inktank.com>
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+
+commit 572241942706e2f845a147f19717bf6c487f23f4
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun Jun 8 20:18:49 2014 -0700
+
+    init-ceph: continue after failure doing osd data mount
+    
+    If we are starting many daemons and hit an error, we normally note it and
+    move on.  Do the same when doing the pre-mount step.
+    
+    Fixes: #8554
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6a7e20147cc39ed4689809ca7d674d3d408f2a17)
+
+commit e5a291ef69316519b105b57193753f0bf8ac8e62
+Author: Steve Taylor <steve at DES-U1404-STETAY.stc.local>
+Date:   Tue Jun 10 12:42:55 2014 -0600
+
+    Fix for bug #6700
+    
+    When preparing OSD disks with colocated journals, the intialization process
+    fails when using dmcrypt. The kernel fails to re-read the partition table after
+    the storage partition is created because the journal partition is already in use
+    by dmcrypt. This fix unmaps the journal partition from dmcrypt and allows the
+    partition table to be read.
+    
+    Signed-off-by: Stephen F Taylor <steveftaylor at gmail.com>
+    (cherry picked from commit 673394702b725ff3f26d13b54d909208daa56d89)
+
+commit 34d9b2bc659c4107b30e1ebe7a55315512a0222a
+Author: John Wilkins <john.wilkins at inktank.com>
+Date:   Thu Jun 5 11:29:20 2014 -0700
+
+    doc: Added Disable requiretty commentary.
+    
+    Signed-off-by: John Wilkins <john.wilkins at inktank.com>
+
+commit 54a89bab15a945d47b3f44448910521a2ebf41c6
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 16 16:56:33 2014 -0700
+
+    ReplicatedPG::start_flush: fix clone deletion case
+    
+    dsnapc.snaps will be non-empty most of the time if there
+    have been snaps before prev_snapc.  What we really want to
+    know is whether there are any snaps between oi.snaps.back()
+    and prev_snapc.
+    
+    Fixes: 8334
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 29f615b7ac9e92f77cdef9927070727fee9d5e33)
+
+commit 308e2ef5c107bf04d3c5623f3c6bdffa10cf8c21
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon May 12 15:08:07 2014 -0700
+
+    ReplicatedPG::start_flush: send delete even if there are no snaps
+    
+    Even if all snaps for the clone have been removed, we still have to
+    send the delete to ensure that when the object is recreated the
+    new snaps aren't included in the wrong clone.
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 2ec2182745fa7c22526a7cf3dedb25bc314c9db4)
+
+commit 8d04a7ece364c0a95b087990d6365401819b3efa
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 15 20:53:27 2014 -0700
+
+    HashIndex: in cleanup, interpret missing dir as completed merge
+    
+    If we stop between unlinking the empty subdir and removing the root
+    merge marker, we get ENOENT on the get_info.  That's actually fine.
+    
+    Backport: firefly
+    Fixes: 8332
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 5ff95dbdd2dbb533d344f37fea722ca4f140e670)
+
+commit b2bf8cb21761d88557fb2d5c0935c4a3678ee01f
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Wed May 28 11:48:12 2014 -0400
+
+    add backport of collections.Counter for python2.6
+    
+    Using Raymond Hettinger's MIT backport
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 23b75b550507438c79b3aa75e06721e5f7b134a4)
+
+commit 0b00443eec4c372f2ef245f85dc7c1f497ba3778
+Author: Ailing <ailzhang at users.noreply.github.com>
+Date:   Wed May 28 12:37:48 2014 -0700
+
+    rest-api: key missing for per "rx" and "rwx"
+    
+    commit 85a1cf31e6 and db266a3fb2 introduce new per "rx" and "rwx", but key missing for per "rx" and "rwx" in permmap
+    
+    Signed-off-by: Ailing Zhang <ailzhang at cisco.com>
+    (cherry picked from commit 0b5a67410793ec28cac47e6e44cbbcf5684d77e7)
+
+commit a898ee56e01f971c12c0f7bebc22e59f850f27c0
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed May 21 21:41:23 2014 -0700
+
+    cephfs-java: build against older jni headers
+    
+    Older versions of the JNI interface expected non-const parameters
+    to their memory move functions. It's unpleasant, but won't actually
+    change the memory in question, to do a cast_const in order to satisfy
+    those older headers. (And even if it *did* modify the memory, that
+    would be okay given our single user.)
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 4d4b77e5b6b923507ec4a0ad9d5c7018e4542a3c)
+
+commit 8a12a940817d957063c21ac71a6128f991801573
+Author: Ilya Dryomov <ilya.dryomov at inktank.com>
+Date:   Fri May 16 19:03:13 2014 +0400
+
+    OSDMonitor: set next commit in mon primary-affinity reply
+    
+    Commit 8c5c55c8b47e ("mon: set next commit in mon command replies")
+    fixed MMonCommand replies to include the right version, but the
+    primary-affinity handler was authored before that.  Fix it.
+    
+    Backport: firefly
+    Signed-off-by: Ilya Dryomov <ilya.dryomov at inktank.com>
+    (cherry picked from commit a78b14ec1769ef37bef82bfda6faabb581b4cd7d)
+
+commit 6ba57da94a6e00040677d6e43abf10a36ed9a931
+Author: Dmitry Smirnov <onlyjob at member.fsf.org>
+Date:   Mon May 12 14:08:44 2014 +1000
+
+    prioritise use of `javac` executable (gcj provides it through alternatives).
+    
+     On Debian this fixes FTBFS when gcj-jdk and openjdk-7-jdk are installed at
+     the same time because build system will use default `javac` executable
+     provided by current JDK through `update-alternatives` instead of blindly
+     calling GCJ when it is present.
+    
+    Signed-off-by: Dmitry Smirnov <onlyjob at member.fsf.org>
+    (cherry picked from commit 8b682d167e4535df582f1c77542e2b1ea0981228)
+
+commit 9e335a494c6eff209cff64bd663b5aa2a7bbc242
+Author: Dmitry Smirnov <onlyjob at member.fsf.org>
+Date:   Mon May 12 14:02:53 2014 +1000
+
+    pass '-classpath' option (gcj/javah ignores CLASSPATH environment variable).
+    
+     This should not affect OpenJDK which understands '-classpath' as well.
+    
+     With gcj-jdk we still get FTBFS later:
+    
+     ~~~~
+        java/native/libcephfs_jni.cc:2878:55: error: invalid conversion from 'const jbyte* {aka const signed char*}' to 'jbyte* {aka signed char*}' [-fpermissive]
+                     reinterpret_cast<const jbyte*>(rawAddress));
+                                                               ^
+        In file included from java/native/libcephfs_jni.cc:27:0:
+        /usr/lib/gcc/x86_64-linux-gnu/4.8/include/jni.h:1471:8: error:   initializing argument 4 of 'void _Jv_JNIEnv::SetByteArrayRegion(jbyteArray, jsize, jsize, jbyte*)' [-fpermissive]
+           void SetByteArrayRegion (jbyteArray val0, jsize val1, jsize val2, jbyte * val3)
+                ^
+        make[5] *** [java/native/libcephfs_jni_la-libcephfs_jni.lo] Error 1
+     ~~~~
+    
+    Signed-off-by: Dmitry Smirnov <onlyjob at member.fsf.org>
+    (cherry picked from commit 89fe0353582bde7e2fbf32f1626d430a20002dd0)
+
+commit fcd30500790eac0266ffb70d83ee17b23aeaf209
+Author: Dmitry Smirnov <onlyjob at member.fsf.org>
+Date:   Mon May 12 13:57:20 2014 +1000
+
+    look for "jni.h" in gcj-jdk path, needed to find "jni.h" with gcj-jdk_4.9.0
+    
+    Signed-off-by: Dmitry Smirnov <onlyjob at member.fsf.org>
+    (cherry picked from commit 0f4120c0115e7977ae7c03458addcc2b2916db07)
+
+commit de43f6d2d813d2c7e5cf915c1b9037fe662d6afc
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 08:52:51 2014 -0700
+
+    ceph-disk: partprobe before settle when preparing dev
+    
+    Two users have reported this fixes a problem with using --dmcrypt.
+    
+    Fixes: #6966
+    Tested-by: Eric Eastman <eric0e at aol.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0f196265f049d432e399197a3af3f90d2e916275)
+
+commit fe1fbfb7a43d6590efce99711e47f986249f0956
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue May 13 13:15:28 2014 -0700
+
+    test: fix some templates to match new output code
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 00225d739cefa1415524a3de45fb9a5a2db53018)
+
+commit 5c8afaa8861345efbcc5488e0336327a8a38d3bc
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu May 15 16:50:43 2014 -0700
+
+    OSD: fix an osdmap_subscribe interface misuse
+    
+    When calling osdmap_subscribe, you have to pass an epoch newer than the
+    current map's. _maybe_boot() was not doing this correctly -- we would
+    fail a check for being *in* the monitor's existing map range, and then
+    pass along the map prior to the monitor's range. But if we were exactly
+    one behind, that value would be our current epoch, and the request would
+    get dropped. So instead, make sure we are not *in contact* with the monitor's
+    existing map range.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 290ac818696414758978b78517b137c226110bb4)
+
+commit eb98f4ab3a27aa8e00e0eb7e504ca7bec7c48a06
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon May 19 10:32:12 2014 -0700
+
+    osd: skip out of order op checks on tiered pools
+    
+    When we send redirected ops, we do not assign a new tid, which means that
+    a given client's ops for a pool may not have strictly ordered tids.  Skip
+    this check if the pool is tiered to avoid false positives.
+    
+    Fixes: #8380
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cf2b172c843da0599164901956b66c306a59e570)
+
+commit 29ee6faecb9e16c63acae8318a7c8f6b14367af7
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 6 11:50:14 2014 -0700
+
+    ReplicatedPG: block scrub on blocked object contexts
+    
+    Fixes: #8011
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 7411477153219d66625a74c5886530029c516036)
+
+commit 6078726e0b89d0202c3a4bc594be11fc346bed9d
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Fri May 9 09:21:23 2014 +0000
+
+    msg: Fix inconsistent message sequence negotiation during connection reset
+    
+    Backport: firefly, emperor, dumpling
+    
+    Signed-off-by: Guang Yang (yguang at yahoo-inc.com)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit bdee119076dd0eb65334840d141ccdf06091e3c9)
+
+commit 02557f8bc05ff28013e241611cb046b28f97b4c6
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Apr 15 12:55:47 2014 -0700
+
+    Objecter::_op_submit: only replace the tid if it's 0
+    
+    Otherwise, redirected ops will suddenly have a different tid
+    and will become uncancelable.
+    
+    Fixes: #7588
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 76568aa0db4e16ac1af8fe6405edade1e61cbc81)
+
+commit 788b5fad515c48d4028f5a67d63052e373c81e66
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 10:42:42 2014 -0700
+
+    mon/OSDMonitor: force op resend when pool overlay changes
+    
+    If a client is sending a sequence of ops (say, a, b, c, d) and partway
+    through that sequence it receives an OSDMap update that changes the
+    overlay, the ops will get send to different pools, and the replies will
+    come back completely out of order.
+    
+    To fix this, force a resend of all outstanding ops any time the overlay
+    changes.
+    
+    Fixes: #8305
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 63d92ab0969357f78fdade749785136a509bc81b)
+
+commit 268df4862d95bf506ef6f594fdfa8294671babc3
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 10:50:51 2014 -0700
+
+    osd: discard client ops sent before last_force_op_resend
+    
+    If an op is sent before last_force_op_resend, and the client's feature is
+    present, drop the op because we know they will resend.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 45e79a17a932192995f8328ae9f6e8a2a6348d10)
+
+commit 8bc4992f434ed0b180d5e4a293d8191f4846358c
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 10:52:11 2014 -0700
+
+    osdc/Objecter: resend ops in the last_force_op_resend epoch
+    
+    If we are a client, and process a map that sets last_force_op_resend to
+    the current epoch, force a resend of this op.
+    
+    If the OSD expects us to do this, it will discard our previous op.  If the
+    OSD is old, it will process the old one, this will appear as a dup, and we
+    are no worse off than before.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dd700bdf7115223cb3e517b851f462d75dd76a2b)
+
+commit 83d03f0e1c65385dcf465108d544da84f8bfad97
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 10:40:10 2014 -0700
+
+    osd/osd_types: add last_force_op_resend to pg_pool_t
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 3152faf79f498a723ae0fe44301ccb21b15a96ab)
+
+commit c94ac44ab41fc62add3fc93c5c7ce06950eed3f1
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 9 09:20:34 2014 -0700
+
+    osd: handle race between osdmap and prepare_to_stop
+    
+    If we get a MOSDMarkMeDown message and set service.state == STOPPING, we
+    kick the prepare_to_stop() thread.  Normally, it will wake up and then
+    set osd.state == STOPPING, and when we process the map message next we
+    will not warn.  However, if dispatch() takes the lock instead and processes
+    the map, it will fail the preparing_to_stop check and issue a spurious
+    warning.
+    
+    Fix by checking for either preparing_to_stop or stopping.
+    
+    Fixes: #8319
+    Backport: firefly, emperor, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 6b858be0676f937a99dbd51321497f30c3a0097f)
+
+commit 22e2e7cff42970b00dc352513f1f138132f78d04
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat May 10 10:29:11 2014 -0700
+
+    osd/ReplicatedPG: do not queue NULL dup_op
+    
+    We call start_flush() with a NULL op in a couple different places.  Do not
+    put a NULL pointer on the dup_ops list or we will crash later.
+    
+    Fixes: #8328
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 0d67f9b0695765824bdc4a65fbed88edf8ea232e)
diff --git a/doc/changelog/v0.80.3.txt b/doc/changelog/v0.80.3.txt
new file mode 100644
index 0000000..d44f628
--- /dev/null
+++ b/doc/changelog/v0.80.3.txt
@@ -0,0 +1,19 @@
+commit a129e85cdc3446a427fffffe4c31617d49024946 (tag: refs/tags/v0.80.3)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Fri Jul 11 17:14:12 2014 +0000
+
+    0.80.3
+
+commit 8589c108dd5f00471986deae72d88811ccf0627f (refs/remotes/gh/firefly)
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jul 10 10:36:16 2014 -0700
+
+    rgw: fix RGWObjManifestRule decoder
+    
+    Only decode the new field if it is a new struct.
+    
+    Fixes: #8804
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit c4afaf9dabd261853a44b2e08f0911c075c1cd3a)
diff --git a/doc/changelog/v0.80.4.txt b/doc/changelog/v0.80.4.txt
new file mode 100644
index 0000000..4b44638
--- /dev/null
+++ b/doc/changelog/v0.80.4.txt
@@ -0,0 +1,36 @@
+commit 7c241cfaa6c8c068bc9da8578ca00b9f4fc7567f (tag: refs/tags/v0.80.4)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Tue Jul 15 12:13:55 2014 -0700
+
+    0.80.4
+
+commit 7557a8139425d1705b481d7f010683169fd5e49b (refs/remotes/gh/firefly)
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jul 14 13:29:37 2014 -0700
+
+    XfsFileStoreBackend: default to disabling extsize on xfs
+    
+    This appears to be responsible for the deep scrub mismatches on some rbd
+    workloads.
+    
+    Fixes: 8830
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 01cd3cdc726a3e838bce05b355a021778b4e5db1)
+
+commit ee7016a046c09be674808efb093b6ff80d0df18c
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jul 14 15:00:30 2014 -0700
+
+    Revert "Revert "rgw: if extra data pool name is empty, use data pool name instead""
+    
+    This reverts commit 0b6bd2545925b5e8a80d41de1fda13ffe9d30e2b.
+    
+    We confused commit 5fd8b0d1639c67e355f0fc0d7e6d7036618d87a1 with commit
+    b1a4a7cb91e164d1f8af8ce9319e3b3c1949858d in our tests.  We tested without
+    the latter, saw a failure, applied it and then reverted the former, and it
+    passed, but didn't actually resolve the problem.
+    
+    This puts them both back in place and all should be well.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
diff --git a/doc/changelog/v0.80.5.txt b/doc/changelog/v0.80.5.txt
new file mode 100644
index 0000000..4c7a231
--- /dev/null
+++ b/doc/changelog/v0.80.5.txt
@@ -0,0 +1,354 @@
+commit 38b73c67d375a2552d8ed67843c8a65c2c0feba6 (tag: refs/tags/v0.80.5, refs/remotes/gh/last, refs/remotes/gh/firefly)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Tue Jul 29 05:24:39 2014 -0700
+
+    0.80.5
+
+commit b576d5a242c16bc9e38ba283a9784f838614882a
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri May 9 08:41:33 2014 -0700
+
+    osd: cancel agent_timer events on shutdown
+    
+    We need to cancel all agent timer events on shutdown.  This also needs to
+    happen early so that any in-progress events will execute before we start
+    flushing and cleaning up PGs.
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c0dc245b662f1f9c640d7dd15fdf4cf26e729782)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit 6213130f76b1ee89947bae578a1fccf16b845956
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 8 16:11:44 2014 -0700
+
+    osd: s/applying repop/canceling repop/
+    
+    The 'applying' language dates back to when we would wait for acks from
+    replicas before applying writes locally.  We don't do any of that any more;
+    now, this loop just cancels the repops with remove_repop() and some other
+    cleanup.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ef40737eee4389faa7792661a0f9d15b3d0440f2)
+
+commit 2e7c91587d99c9eba85ab7bd407a5b722b25a81e
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 8 16:11:27 2014 -0700
+
+    osd: clear PGBackend state on shutdown
+    
+    This was leaking state on shutdown whenever there were in-flight repops
+    that were canceled.
+    
+    Fixes: #7891
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cafceae6c243369d3616af8217884e7e029896b9)
+
+commit f03110f3889ce7340c64f19358840b2425c93f68
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jul 8 16:10:58 2014 -0700
+
+    osd: separate cleanup from PGBackend::on_change()
+    
+    The generic portion of on_change() cleaned up temporary on-disk objects
+    and requires a Transaction.  The rest is clearing out in-memory state and
+    does not.  Separate the two.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e299357e2a24474ab7a02e65ca0279336fd04b76)
+
+commit 42ad241efab751a1d4f50d5a748d91d0fe967844
+Merge: 5f4ceb2 5049fc4
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Wed Jul 23 10:09:19 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-8858-firefly' into firefly
+    
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 5f4ceb208b55fab7fd1530dcf8fe03198b044148
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 22 00:25:37 2014 +0100
+
+    mon: AuthMonitor: always encode full regardless of keyserver having keys
+    
+    On clusters without cephx, assuming an admin never added a key to the
+    cluster, the monitors have empty key servers.  A previous patch had the
+    AuthMonitor not encoding an empty keyserver as a full version.
+    
+    As such, whenever the monitor restarts we will have to read the whole
+    state from disk in the form of incrementals.  This poses a problem upon
+    trimming, as we do every now and then: whenever we start the monitor, it
+    will start with an empty keyserver, waiting to be populated from whatever
+    we have on disk.  This is performed in update_from_paxos(), and the
+    AuthMonitor's will rely on the keyserver version to decide which
+    incrementals we care about -- basically, all versions > keyserver version.
+    
+    Although we started with an empty keyserver (version 0) and are expecting
+    to read state from disk, in this case it means we will attempt to read
+    version 1 first.  If the cluster has been running for a while now, and
+    even if no keys have been added, it's fair to assume that version is
+    greater than 0 (or even 1), as the AuthMonitor also deals and keeps track
+    of auth global ids.  As such, we expect to read version 1, then version 2,
+    and so on.  If we trim at some point however this will not be possible,
+    as version 1 will not exist -- and we will assert because of that.
+    
+    This is fixed by ensuring the AuthMonitor keeps track of full versions
+    of the key server, even if it's of an empty key server -- it will still
+    keep track of the key server's version, which is incremented each time
+    we update from paxos even if it is empty.
+    
+    Fixes: #8851
+    Backport: dumpling, firefly
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit b551ae2bcea2dd17b37f5f5ab34251cc78de0e26)
+
+commit 5c1d74848863b45aa9e98d134cbe0cd1c8199557
+Merge: 442c3fd c390ec4
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 21 13:10:28 2014 -0700
+
+    Merge pull request #2122 from ceph/wip-dencoder-firefly
+    
+    fix linking deps, cpeh-dencoder, etc., firefly backport
+
+commit 5049fc4c9d6513bc58c3c4464f3de18949ac0aa5
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jul 18 14:52:48 2014 -0700
+
+    rgw: dump prefix unconditionally
+    
+    As part of issue #8858, and to be more in line with S3, dump the Prefix
+    field when listing bucket even if bucket is empty.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d7209c11251d42227608bc54cc69232ef62ffe80)
+
+commit 7fdd6d94262d8e6c81d168f5b997b3a5f030e6fa
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 17 15:48:26 2014 -0700
+
+    rgw: list extra objects to set truncation flag correctly
+    
+    Otherwise we end up returning wrong truncated value, and no data on the
+    next iteration.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit dc417e477d4ad262885c6b5f5987cf06d63b159d)
+
+commit 1f8774e01a616739ab70a78c348ab986b64b8fce
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 17 11:45:44 2014 -0700
+
+    rgw: account common prefixes for MaxKeys in bucket listing
+    
+    To be more in line with the S3 api. Beforehand we didn't account the
+    common prefixes towards the MaxKeys (a single common prefix counts as a
+    single key). Also need to adjust the marker now if it is pointing at a
+    common prefix.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 82d2d612e700f94a0bb2d9fb7555abf327be379b)
+
+commit cb0a7ab8eb1d2fc8799b97c5a387b5f4f93b515c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Jul 17 11:24:51 2014 -0700
+
+    rgw: add NextMarker param for bucket listing
+    
+    Partially fixes #8858.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 924686f0b6593deffcd1d4e80ab06b1e7af00dcb)
+
+commit 34aa7086ba5293ee4d008016558dcdb1ada02e83
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 16 15:21:09 2014 -0700
+
+    rgw: improve delmited listing of bucket
+    
+    If found a prefix, calculate a string greater than that so that next
+    request we can skip to that. This is still not the most efficient way to
+    do it. It'll be better to push it down to the objclass, but that'll
+    require a much bigger change.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit e6cf618c257f26f97f60a4c1df1d23a14496cab0)
+
+commit d027ff1b432a265ad49ddfeafab45093bcd03e6c
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 16 16:05:58 2014 -0700
+
+    utf8: export encode_utf8() and decode_utf8()
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit 49fc68cf8c3122c878ea9503c9c74d7046bc9c6f)
+
+commit c390ec4fa919e0a17e646e595b30cfa878c3454f
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 22:44:51 2014 -0700
+
+    ceph-dencoder: don't link librgw.la (and rados, etc.)
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 34671108ce0b7597dba4f619732ecdb8933cda6e)
+
+commit 3d89380c90ab632eb76d3e429788fd81630e7a57
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 22:27:25 2014 -0700
+
+    rgw: move a bunch of stuff into rgw_dencoder
+    
+    This will help out ceph-dencoder ...
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b1a641f307942cbf43036f75ef67fb30441dfe95)
+
+commit dc6c9bf2b92d28bbd2bc822c267b0555f74c87fc
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 21:58:29 2014 -0700
+
+    libosd_types, libos_types, libmon_types
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1c170776cb8c0266f0f54f049ed07bbdb9c9ab5e)
+    
+    Conflicts:
+    
+    	src/os/Makefile.am
+    	src/os/ObjectStore.cc
+    	src/osd/Makefile.am
+
+commit 7be91e8c5d935f7094033842bde1da2486905c70
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 20:55:39 2014 -0700
+
+    Revert "ceph.spec: move ceph-dencoder to ceph from ceph-common"
+    
+    This reverts commit 95f5a448b52db545a2b9bbad47fdb287254f93ea.
+    (cherry picked from commit 58cc894b3252a848ebc2169bcc4980a0ae6cc375)
+
+commit 04ad08a18a773e104a826b2a77ab0b2ffaac1e5f
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 20:55:35 2014 -0700
+
+    Revert "debian: move ceph-dencoder to ceph from ceph-common"
+    
+    This reverts commit b37e3bde3bd31287b11c069062280258666df7c5.
+    (cherry picked from commit f181f78b7473260a717bc8ab4fc4d73a80e3b5ba)
+
+commit 442c3fd5a3b6a6c6a85d9bd7755923f14aa598e7
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Thu Jul 17 21:44:06 2014 -0700
+
+    configure: do not link leveldb with everything
+    
+    Detect leveldb, but do not let autoconf blindly link it with everything on the
+    planet.
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    Sighed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 06a8f7b99c5533f397b34f448138220384df60ac)
+
+commit c1073e430eafeb1f213f80636a3a24966b292698
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jul 14 17:02:05 2014 -0700
+
+    ceph.spec: move ceph-dencoder to ceph from ceph-common
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 95f5a448b52db545a2b9bbad47fdb287254f93ea)
+
+commit f4e9e0ef2eab3174584f1695122b114549feff57
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jul 14 14:16:43 2014 -0700
+
+    debian: move ceph-dencoder to ceph from ceph-common
+    
+    It links against the world currently (notably leveldb).  Not nice for the
+    client-side lib.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b37e3bde3bd31287b11c069062280258666df7c5)
+
+commit 681c399e83df4c6ebd7e0836203eb2466455f548
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 17 16:40:06 2014 -0700
+
+    logrotate.conf: fix osd log rotation under upstart
+    
+    In commit 7411c3c6a42bef5987bdd76b1812b01686303502 we generalized this
+    enumeration code by copying what was in the upstart scripts.  However,
+    while the mon and mds directories get a 'done' file, the OSDs get a 'ready'
+    file.  Bah!  Trigger off of either one.
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 14a9ca602fa9573b0b6b94709b384bca02d12fac)
+
+commit 794ec7fb43da4db930d28571a84c1c1cec1eb066
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Wed Jul 16 12:23:31 2014 -0700
+
+    rgw: don't try to wait for pending if list is empty
+    
+    Fixes: #8846
+    Backport: firefly, dumpling
+    
+    This was broken at ea68b9372319fd0bab40856db26528d36359102e. We ended
+    up calling wait_pending_front() when pending list was empty.
+    This commit also moves the need_to_wait check to a different place,
+    where we actually throttle (and not just drain completed IOs).
+    
+    Reported-by: Sylvain Munaut <s.munaut at whatever-company.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit f9f2417d7db01ecf2425039539997901615816a9)
+
+commit e75dd2e4b7adb65c2de84e633efcd6c19a6e457b
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Thu Jul 17 10:06:37 2014 -0400
+
+    remove suse service restarts
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 0f11aaeefd7e8b49f88607937aade6113ebda52c)
+
+commit 361c1f8554ce1fedfd0020cd306c41b0ba25f53e
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Jul 16 16:12:12 2014 -0400
+
+    remove ceph restarts on upgrades for RPMs
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit e3a5756f58ef5d07badf18ab08a26f47f7d232cb)
+
+commit 88f694dcd3d3342f764f3790572988b7808028ae
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Jul 16 11:07:13 2014 -0400
+
+    set the default log level to WARNING
+    
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 420f0a471a31d1e56359ea642ed831e8a38b1e90)
+
+commit 67b5193f73a2c9ec9e503ad3431473998217375d
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 15 18:11:41 2014 -0700
+
+    init-ceph: wrap daemon startup with systemd-run when running under systemd
+    
+    We want to make sure the daemon runs in its own systemd environment.  Check
+    for systemd as pid 1 and, when present, use systemd-run -r <cmd> to do
+    this.
+    
+    Probably fixes #7627
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    Tested-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 3e0d9800767018625f0e7d797c812aa44c426dab)
diff --git a/doc/changelog/v0.80.6.txt b/doc/changelog/v0.80.6.txt
new file mode 100644
index 0000000..2e1435e
--- /dev/null
+++ b/doc/changelog/v0.80.6.txt
@@ -0,0 +1,3266 @@
+commit f93610a4421cb670b08e974c6550ee715ac528ae (tag: refs/tags/v0.80.6, refs/remotes/gh/firefly)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Wed Oct 1 09:37:12 2014 -0700
+
+    0.80.6
+
+commit 2ecf362e15301ee07b511b2a84585ad691543569
+Merge: 1fafd6b 76341b0
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 29 13:55:02 2014 -0700
+
+    Merge pull request #2603 from dachary/wip-9620-test-mon-thrash-firefly
+
+    qa/workunits/cephtool/test.sh: fix thrash (ultimate)
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 76341b0b7581194273ac787df2b940221825d083
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Mon Sep 29 13:47:06 2014 +0200
+
+    qa/workunits/cephtool/test.sh: fix thrash (ultimate)
+
+    Keep the osd trash test to ensure it is a valid command but make it a
+    noop by giving it a zero argument (meaning thrash 0 OSD maps).
+
+    Remove the loops that were added after the command in an attempt to wait
+    for the cluster to recover and not pollute the rest of the tests. Actual
+    testing of osd thrash would require a dedicated cluster because it the
+    side effects are random and it is unnecessarily difficult to ensure they
+    are finished.
+
+    http://tracker.ceph.com/issues/9620 Fixes: #9620
+
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit beade63a17db2e6fc68d1f55332d602f8f7cb93a)
+
+    Conflicts:
+	qa/workunits/cephtool/test.sh
+
+commit 1fafd6bf2ef03672dfa27ec7a201a274927040b7
+Merge: ebb5995 71005c1
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Sep 25 10:08:03 2014 -0700
+
+    Merge pull request #2576 from ceph/wip-9593
+
+    osd/ReplicatedPG: fix objecter locking in start_flush
+
+    Reviewed-by: Josh Durgin <josh.durgin at inktank.com>
+
+commit 71005c1bdf38212ea2fde12de08c45598c815d37
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 25 09:59:29 2014 -0700
+
+    osd/ReplicatedPG: fix objecter locking in start_flush
+
+    Broken in backport fd96eb62ece27f5c660429584c2ff2e058bc6e94.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit ebb599545d70e4289e385f88b4f0594b4f23f3b7
+Merge: 2abd7a3 2e60c2f
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 23 10:37:27 2014 -0700
+
+    Merge pull request #2548 from dachary/wip-9547-python-rados-truncate-firefly
+
+    python radio aio_read must not truncate on \000 (firefly)
+
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit 2abd7a3fd018b52f45f9d6b7c9d847242aa97fe9
+Merge: 2675b0d 80f2f9c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 23 10:27:15 2014 -0700
+
+    Merge branch 'wip-sam-testing-firefly' into firefly
+
+commit 80f2f9cf687e25d6f2c4cee34fef55215ac6b027
+Merge: bb9e65b e6da732
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Sep 21 10:04:30 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-9240' into wip-sam-testing-firefly
+
+commit bb9e65bd9292e2ee03a260cc98aa6715008e6682
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Aug 28 15:32:22 2014 -0700
+
+    PG: wait until we've build the missing set to discover_all_missing
+
+    Fixes: #9179
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 970d9830a3a6e8568337c660fb8b4c4a60a2b3bf)
+
+    Conflicts:
+	src/osd/PG.cc
+
+commit fa645b21b587b6a1d9adbb9cedce1af3af1e5a62
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 26 16:53:02 2014 -0700
+
+    PG: mark_log_for_rewrite on resurrection
+
+    Fixes: #8777
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 8346e10755027e982f26bab4642334fd91cc31aa)
+
+commit fd96eb62ece27f5c660429584c2ff2e058bc6e94
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Sep 7 20:13:41 2014 -0700
+
+    ReplicatedPG:start_flush send a second delete
+
+    Suppose we start with the following in the cache pool:
+
+    30:[29,21,20,15,10,4]:[22(21), 15(15,10), 4(4)]+head
+
+    The object doesn't exist at 29 or 20.
+
+    First, we flush 4 leaving the backing pool with:
+
+    3:[]+head
+
+    Then, we begin to flush 15 with a delete with snapc 4:[4] leaving the
+    backing pool with:
+
+    4:[4]:[4(4)]
+
+    Then, we finish flushing 15 with snapc 9:[4] with leaving the backing
+    pool with:
+
+    9:[4]:[4(4)]+head
+
+    Next, snaps 10 and 15 are removed causing clone 10 to be removed leaving
+    the cache with:
+
+    30:[29,21,20,4]:[22(21),4(4)]+head
+
+    We next begin to flush 22 by sending a delete with snapc 4(4) since
+    prev_snapc is 4 <---------- here is the bug
+
+    The backing pool ignores this request since 4 < 9 (ORDERSNAP) leaving it
+    with:
+
+    9:[4]:[4(4)]
+
+    Then, we complete flushing 22 with snapc 19:[4] leaving the backing pool
+    with:
+
+    19:[4]:[4(4)]+head
+
+    Then, we begin to flush head by deleting with snapc 22:[21,20,4] leaving
+    the backing pool with:
+
+    22[21,20,4]:[22(21,20), 4(4)]
+
+    Finally, we flush head leaving the backing pool with:
+
+    30:[29,21,20,4]:[22(21*,20*),4(4)]+head
+
+    When we go to flush clone 22, all we know is that 22 is dirty, has snaps
+    [21], and 4 is clean. As part of flushing 22, we need to do two things:
+    1) Ensure that the current head is cloned as cloneid 4 with snaps [4] by
+    sending a delete at snapc 4:[4].
+    2) Flush the data at snap sequence < 21 by sending a copyfrom with snapc
+    20:[20,4].
+
+    Unfortunately, it is possible that 1, 1&2, or 1 and part of the flush
+    process for some other now non-existent clone have already been
+    performed.  Because of that, between 1) and 2), we need to send
+    a second delete ensuring that the object does not exist at 20.
+
+    Fixes: #9054
+    Backport: firefly
+    Related: 66c7439ea0888777b5cfc08bcb0fbd7bfd8653c3
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 4843fd510b33a71999cdf9c2cfa2b4c318fa80fd)
+
+commit 5aa35ac262c6e0910f99086f46dd792775ab6790
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Aug 11 12:59:16 2014 -0700
+
+    ReplicatedPG::start_flush: remove superfluous loop
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 66c7439ea0888777b5cfc08bcb0fbd7bfd8653c3)
+
+commit 14fb643bbda51cc31919197541973c332b0c37bc
+Merge: c468507 3578b11
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Sep 21 10:03:53 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-9339' into wip-sam-testing-firefly
+
+commit 2e60c2f1ec8c2aaf56b73a64f55becd679dd2825
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 20 12:41:30 2014 +0200
+
+    test: check python rados aio_read with buffers containing null
+
+    http://tracker.ceph.com/issues/9547 Refs: #9547
+
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 226c0c7ac6ee95ff2c1665d4e7164e2962c0346e)
+
+commit 72a46dec211d5c08d1ca9f969013d939c4361ba9
+Author: Mohammad Salehe <salehe+dev at gmail.com>
+Date:   Sun May 25 10:42:11 2014 +0430
+
+    pybind: Fix aio_read handling of string buffer
+
+    Read data may contain \0, and buf.value interprerts them as string terminator.
+
+    Signed-off-by: Mohammad Salehe <salehe+dev at gmail.com>
+    (cherry picked from commit 8bda44ff37fd04a0fc9498fbbc22f0daf515d721)
+
+commit 2675b0d159ff0608bc6e607be3727ed23e7e2976
+Merge: a67f915 d535fab
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 19 11:30:17 2014 -0700
+
+    Merge pull request #2535 from dachary/wip-9470-pidfile-firefly
+
+    daemons: write pid file even when told not to daemonize (firefly)
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit d535fab6ac4a025541340ded0d3568f565acf1cd
+Author: Alexandre Oliva <oliva at gnu.org>
+Date:   Wed Jul 30 23:08:43 2014 -0300
+
+    daemons: write pid file even when told not to daemonize
+
+    systemd wants to run daemons in foreground, but daemons wouldn't write
+    out the pid file with -f.  Fixed.
+
+    Signed-off-by: Alexandre Oliva <oliva at gnu.org>
+    (cherry picked from commit bccb0eb64891f65fd475e96b6386494044cae8c1)
+
+commit c4685075f583ff58cc05220a3044a10b8392033c (refs/remotes/gh/wip-log-crash-firefly)
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Sep 15 15:44:11 2014 -0700
+
+    PGLog::claim_log_and_clear_rollback_info: fix rollback_info_trimmed_to
+
+    We have been setting it to the old head value.  This is usually
+    harmless since the new head will virtually always be ahead of the
+    old head for claim_log_and_clear_rollback_info, but can cause trouble
+    in some edge cases.
+
+    Fixes: #9481
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 0769310ccd4e0dceebd8ea601e8eb5c0928e0603)
+
+commit 112f6f021bd063e2647169ba42729a447e5848e1
+Merge: a67f915 92cfd37 07f54f2
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Sep 18 09:46:38 2014 -0700
+
+    Merge remote-tracking branches 'origin/wip-9497' and 'origin/wip-9482' into wip-log-crash-firefly
+
+commit 07f54f28df7429a88dd9243800281ecf23f10036
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Sep 15 16:53:21 2014 -0700
+
+    PG::find_best_info: let history.last_epoch_started provide a lower bound
+
+    If we find a info.history.last_epoch_started above any
+    info.last_epoch_started, we must be missing updates and
+    min_last_update_acceptable should provisionally be max().
+
+    Fixes: #9482
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 92cfd370395385ca5537b5bc72220934c9f09026
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 16 20:36:51 2014 -0700
+
+    PG::choose_acting: let the pg go down if acting is smaller than min_size
+
+    Even if the backfill peer would bring us up to min_size, we can't go
+    active since build_prior will not consider the interval maybe_went_rw.
+
+    Fixes: #9497
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit a67f9152f128d693d160e5b08f2ac8b8bc83e8e0
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Jul 24 15:29:40 2014 -0700
+
+    librbd: fix crash using clone of flattened image
+
+    The crash occurs due to ImageCtx->parent->parent being uninitialized,
+    since the inital open_parent() -> open_image(parent) ->
+    ictx_refresh(parent) occurs before ImageCtx->parent->snap_id is set,
+    so refresh_parent() is not called to open an ImageCtx for the parent
+    of the parent. This leaves the ImageCtx->parent->parent NULL, but the
+    rest of ImageCtx->parent updated to point at the correct parent snapshot.
+
+    Setting the parent->snap_id earlier has some unintended side effects
+    currently, so for now just call refresh_parent() during
+    open_parent(). This is the easily backportable version of the
+    fix. Further patches can clean up this whole initialization process.
+
+    Fixes: #8845
+    Backport: firefly, dumpling
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 2545e80d274b23b6715f4d8b1f4c6b96182996fb)
+
+commit 2422f9fd634c239a1159c99aa4a49cfb5c5d097f
+Author: JuanJose 'JJ' Galvez <jgalvez at redhat.com>
+Date:   Sun Sep 14 20:38:20 2014 -0700
+
+    init-radosgw.sysv: Support systemd for starting the gateway
+
+    When using RHEL7 the radosgw daemon needs to start under systemd.
+
+    Check for systemd running on PID 1. If it is then start
+    the daemon using: systemd-run -r <cmd>. pidof returns null
+    as it is executed too quickly, adding one second of sleep and
+    script reports startup correctly.
+
+    Signed-off-by: JuanJose 'JJ' Galvez <jgalvez at redhat.com>
+    (cherry picked from commit ddd52e87b25a6861d3b758a40d8b3693a751dc4d)
+
+commit 6070383bc2c433e36f7ab5dc1ec09a3e7439d523
+Merge: 668cd13 7b25512
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 12 17:31:03 2014 -0700
+
+    Merge pull request #2479 from ceph/wip-9444
+
+    mds: fix root and mdsdir inodes' rsubdirs
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 7b25512d65c6337cbddc7d6c6f55747ba1591be5
+Author: Yan, Zheng <zheng.z.yan at intel.com>
+Date:   Fri May 2 23:08:41 2014 +0800
+
+    mds: fix root and mdsdir inodes' rsubdirs
+
+    inode rstat accounts inode itself.
+
+    Signed-off-by: Yan, Zheng <zheng.z.yan at intel.com>
+    (cherry picked from commit da17394941386dab88ddbfed4af2c8cb6b5eb72f)
+
+commit 668cd1359c94698bbb4f7b841e2f30264d4af937
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 9 14:03:50 2014 -0700
+
+    FileStore: report l_os_j_lat as commit latency
+
+    l_os_commit_lat is actually the commit cycle latency.
+
+    Fixes: #9269
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit d165238b4ee7e925e06ca22890c1e9dac101a7da)
+
+commit 7686966677867d098141aa08f45364eaa97121dd
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 9 12:58:07 2014 -0700
+
+    Objecter::_recalc_linger_op: resend for any acting set change
+
+    Fixes: #9220
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 1349383ac416673cb6df2438729fd2182876a7d1)
+
+    Conflicts:
+
+	src/osdc/Objecter.cc
+	src/osdc/Objecter.h
+
+commit 3abf95456783346e6686919b803c4819d5e82ab7
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 8 13:44:57 2014 -0700
+
+    osdc/Objecter: revoke rx_buffer on op_cancel
+
+    If we cancel a read, revoke the rx buffers to avoid a use-after-free and/or
+    other undefined badness by using user buffers that may no longer be
+    present.
+
+    Fixes: #9362
+    Backport: firefly, dumpling
+    Reported-by: Matthias Kiefer <matthias.kiefer at 1und1.de>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2305b2897acba38384358c33ca3bbfcae6f1c74e)
+
+    (adjusted for op->con instead of s->con)
+
+commit bc4108443a17de47b7c582e50fb884396a287152
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 8 13:45:52 2014 -0700
+
+    ceph_test_rados_api_io: add read timeout test
+
+    Verify we don't receive data after a timeout.
+
+    Based on reproducer for #9362 written by
+    Matthias Kiefer <matthias.kiefer at 1und1.de>.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f295c1fee4afb9447cdf46f05a44234274d23b6c)
+
+commit 19e7606545f829e5b9ea0255049d9130c51e42fd
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 8 13:42:43 2014 -0700
+
+    ceph_test_rados_api_*: expose nspace
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 977d289055d69ab8a7baaf7ef68c013019225833)
+
+commit 881c267fa4f8257a9205ec897c631183ef5c6388
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 9 12:40:51 2014 -0700
+
+    Revert "PG: mark_log_for_rewrite on resurrection"
+
+    Actually, we don't want to backport this one without the fix
+    for #9293.
+
+    This reverts commit 7ddf0a252bb887553b29fd93e58d01cac38835e6.
+
+commit 3578b1193d497373db14d040ff7f0fc9e06e5ac2
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Sep 3 15:49:47 2014 -0700
+
+    ReplicatedPG: create max hitset size
+
+    Otherwise, hit_set_create could create an unbounded size hitset
+    object.
+
+    Fixes: #9339
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit d73eb895cdc792ddef2626643e61c1521cf53434
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Aug 27 16:21:41 2014 -0700
+
+    PG::can_discard_op: do discard old subopreplies
+
+    Otherwise, a sub_op_reply from a previous interval can stick around
+    until we either one day go active again and get rid of it or delete the
+    pg which is holding it on its waiting_for_active list.  While it sticks
+    around futily waiting for the pg to once more go active, it will cause
+    harmless slow request warnings.
+
+    Fixes: #9259
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit ae3d87348ca4e2dde809c9593b0d54ce0469f7a0)
+
+commit 7ddf0a252bb887553b29fd93e58d01cac38835e6
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 26 16:53:02 2014 -0700
+
+    PG: mark_log_for_rewrite on resurrection
+
+    Fixes: #8777
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 8346e10755027e982f26bab4642334fd91cc31aa)
+
+commit 49a08eb46ef277225fff0d9a0920c37427175f54
+Author: Thorsten Glaser <tg at mirbsd.de>
+Date:   Mon Sep 8 12:49:50 2014 -0700
+
+    debian: only B-R yasm on amd64
+
+    Make yasm dependency amd64 only, it isn?t used elsewhere
+    but breaks x32 (which is mis-detected as amd64)
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9ab46dc5b49219aa6194861c393c938f23001c52)
+
+commit f19162adc241e627ce20140360352ac96f809a6e
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 26 17:43:10 2014 -0700
+
+    osd: fix osd_tp shutdown
+
+    We need to clear the queue, not just drain the currently executing jobs.
+
+    Fixes: #9218
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c2f21c04207b9a2a65e514994a775632b36d6874)
+
+    Conflicts:
+
+	src/osd/OSD.cc
+
+commit 598cde42e7f57fd0b294f70c0a930f94fd361fb3
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 27 06:19:12 2014 -0700
+
+    osd/PG: fix crash from second backfill reservation rejection
+
+    If we get more than one reservation rejection we should ignore them; when
+    we got the first we already sent out cancellations.  More importantly, we
+    should not crash.
+
+    Fixes: #8863
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2b13de16c522754e30a0a55fb9d072082dac455e)
+
+commit 0a9d49e5b5867c58ca1f5c6b9a4c5106639a8d01
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 8 06:58:45 2014 -0700
+
+    mon/Paxos: don't spam log with is_readable at dout level 1
+
+    Backport: firefly, dumpling
+    Reported-by: Aanchal Agrawal <Aanchal.Agrawal at sandisk.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 62ca27d0b119b597ebad40dde64c4d86599e466d)
+
+commit 1660503ffafd69fac3722aea9915008113906e05
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Thu Sep 4 13:58:14 2014 -0400
+
+    doc: add note on soft JS dependency for navigating docs
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 657be818375bea2d8b5998ea1e5505eedc2f294d)
+
+commit 2f075d442f58e9cfefdbc421b9b20f2034a56314
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Sep 3 21:21:45 2014 -0400
+
+    doc: fix missing bracket
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 69638dfaeb0dcd96dac4b5f5c00ed08042432487)
+
+commit 4dacb593e830f42cd0394486333315f1709b502f
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Sep 3 20:47:54 2014 -0400
+
+    doc: attempt to get the ayni JS into all head tags
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 35663fa55ac1579a3b0c8b67028a3a8dfea87b48)
+
+commit 275df4407b37923cb47510890a686ed370e2f39e
+Author: Dmitry Smirnov <onlyjob at member.fsf.org>
+Date:   Sat Aug 23 22:41:30 2014 +1000
+
+    Fix FTBFS on alpha due to incorrect check on BLKGETSIZE
+
+    Ceph FTBFS on Alpha with:
+
+    ~~~~
+    libtool: compile:  g++ -DHAVE_CONFIG_H -I. -D__CEPH__ -D_FILE_OFFSET_BITS=64 -D_REENTRANT -D_THREAD_SAFE -D__STDC_FORMAT_MACROS -D_GNU_SOURCE -DCEPH_LIBDIR=\"/usr/lib/alpha-linux-gnu\" -DCEPH_PKGLIBDIR=\"/usr/lib/alpha-linux-gnu/ceph\" -DGTEST_HAS_TR1_TUPLE=0 -D_FORTIFY_SOURCE=2 -I/usr/include/nss -I/usr/include/nspr -Wall -Wtype-limits -Wignored-qualifiers -Winit-self -Wpointer-arith -Werror=format-security -fno-strict-aliasing -fsigned-char -rdynamic -ftemplate-depth-1024 -Wnon-vir [...]
+    In file included from /usr/include/alpha-linux-gnu/asm/ioctls.h:4:0,
+                     from /usr/include/alpha-linux-gnu/bits/ioctls.h:23,
+                     from /usr/include/alpha-linux-gnu/sys/ioctl.h:26,
+                     from common/blkdev.cc:3:
+    common/blkdev.cc:13:7: error: missing binary operator before token "int"
+     #elif BLKGETSIZE
+           ^
+    ~~~~
+
+    This error occurs because the value of BLKGETSIZE is tested in a
+    c-preprocessor conditional compilation test whereas the test should
+    be for existence.
+
+    From: Michael Cree <mcree at orcon.net.nz>
+    Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=756892
+    Signed-off-by: Dmitry Smirnov <onlyjob at member.fsf.org>
+    (cherry picked from commit 6ad8e61a428cfc9fc60ccdb9bce812e1f49822ac)
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit fbbdc31a8cd4c6457e06570ddeb9b2021563498e
+Merge: 46d9611 895bddc
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 29 17:31:29 2014 -0700
+
+    Merge pull request #2356 from dachary/wip-9273-mon-preload-erasure-code-firefly
+
+    erasure-code: preload the default plugins in the mon (firefly)
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 46d9611aedd3194cfd55a338e5f94011e6e70668
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Aug 29 20:21:25 2014 +0100
+
+    osd: OSDMap: ordered blacklist on non-classic encode function
+
+    Fixes: #9211
+    Backport: firefly
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 81102044f417bd99ca570d9234b1df5195e9a8c9)
+
+commit 994a9e35e96984c0806261f7eb349d95c0fb4873
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 26 08:16:29 2014 -0700
+
+    osd/OSDMap: encode blacklist in deterministic order
+
+    When we use an unordered_map the encoding order is non-deterministic,
+    which is problematic for OSDMap.  Construct an ordered map<> on encode
+    and use that.  This lets us keep the hash table for lookups in the general
+    case.
+
+    Fixes: #9211
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 4672e50922b75d642056020b9745a3a5844424d3)
+
+commit 895bddc5d4dabd2f05c13c343eb0d7457d6f132f
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Aug 29 18:13:08 2014 +0200
+
+    erasure-code: preload the default plugins in the mon
+
+    The commit 164f1a1959a863848319585fa752250c7b261381 preloads the
+    jerasure plugin in the OSD. They must also be preloaded in the mon for
+    the same reasons.
+
+    http://tracker.ceph.com/issues/9273 Fixes: #9273
+
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit db8d6e6e190de964ec3d5d1bbc87da2dcb3213f5
+Author: John Spray <john.spray at redhat.com>
+Date:   Tue Aug 26 17:36:16 2014 +0100
+
+    mds: fix FP error in ROUND_UP_TO
+
+    Explicitly handle case where denominator is 0, instead of
+    passing into ROUND_UP_TO.
+
+    Regression from 9449520b121fc6ce0c64948386d4ff77f46f4f5f
+
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit bf3e4835dabc057982def1b5c9a6499c04ac5312)
+
+commit 8e3120fcb379a00d370e4c04d34af35e596e2de9
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 21 11:14:39 2014 -0700
+
+    mon: generate cluster_fingerprint if null
+
+    This triggers after an upgrade of a legacy cluster that has no fingerprint.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b245d600163f6337af15aedd1fea68f4e2a668a8)
+
+commit ebcdeb4cfe201dd0c630386226f9970650689ccf
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 20 08:59:46 2014 -0700
+
+    mon: add a cluster fingerprint
+
+    Generate it on cluster creations with the initial monmap.  Include it in
+    the report.  Provide no way for this uuid to be fed in to the cluster
+    (intentionally or not) so that it can be assumed to be a truly unique
+    identifier for the cluster.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 675b0042eff0ad5e1453838410210b1206c39004)
+
+commit b3b029165d4ac0af3f2143fad205f4e8ab08a30f
+Merge: 21e1faa 07e1ceb
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 26 13:13:08 2014 -0700
+
+    Merge pull request #2244 from dachary/wip-9044-use-ruleset-firefly
+
+    erasure-code: OSDMonitor::crush_ruleset_create_erasure needs ruleset (firefly)
+
+commit 21e1faa75da4e9cab8e139a8e2a1c4fc0ee30867
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 12 16:41:38 2014 -0700
+
+    ReplicatedPG::cancel_copy: clear cop->obc
+
+    Otherwise, an objecter callback might still be hanging
+    onto this reference until after the flush.
+
+    Fixes: #8894
+    Introduced: 589b639af7c8834a1e6293d58d77a9c440107bc3
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 5040413054e923d6d5a2b4928162dba140d980e0)
+
+commit e6da7323655f3bfa4f669fb8361fcaa96f633456
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 26 12:02:52 2014 -0700
+
+    PG: recover from each osd at most once
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 8a1723f67f995253c9e6da95ab433743ef23f61c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 26 11:38:53 2014 -0700
+
+    PG: make the reservation sets more descriptively named
+
+    These sets won't precisely be the backfill_targets or actingbackfill
+    shortly.
+
+    %s/sorted_backfill_set/remote_shards_to_reserve_backfill/g
+    %s/acting_osd_it/remote_recovery_reservation_it/g
+    %s/sorted_actingbackfill_set/remote_shards_to_reserve_recovery/g
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 938d735697e2af0b01dd2613a9152b3caef5db57
+Merge: 2f11631 9ca451a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Aug 26 10:30:14 2014 -0700
+
+    Merge pull request #2203 from ceph/wip-scrub-firefly
+
+    backport scrub throttling to firefly
+
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit 2f11631f3144f2cc0e04d718e40e716540c8af19
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Aug 16 12:42:33 2014 -0700
+
+    os/FileStore: fix mount/remount force_sync race
+
+    Consider:
+
+     - mount
+     - sync_entry is doing some work
+     - umount
+       - set force_sync = true
+       - set done = true
+     - sync_entry exits (due to done)
+       - ..but does not set force_sync = false
+     - mount
+     - journal replay starts
+     - sync_entry sees force_sync and does a commit while op_seq == 0
+     ...crash...
+
+    Fixes: #9144
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit dd11042f969b94f7a461d02e1475794031c79f61)
+
+    Conflicts:
+	src/os/FileStore.cc
+
+commit a38cf1bd503a09843d439f65937e7d60aed163e2
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Thu Jul 10 10:32:17 2014 +0800
+
+    Add random_cache.hpp to Makefile.am
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit a3e5c6d632119febd2150944a6f2cbce33cfda3a)
+
+commit a2c1532b5610207eccd24b8253643eec6bb05294
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 26 06:42:12 2014 -0700
+
+    os/KeyValueStore, MemStore: fix warning
+
+    os/MemStore.cc: In member function 'void MemStore::_do_transaction(ObjectStore::Transaction&)':
+    os/MemStore.cc:956:18: warning: unused variable 'expected_object_size' [-Wunused-variable]
+    os/MemStore.cc:957:18: warning: unused variable 'expected_write_size' [-Wunused-variable]
+    os/KeyValueStore.cc: In member function 'unsigned int KeyValueStore::_do_transaction(ObjectStore::Transaction&, KeyValueStore::BufferTransaction&, ThreadPool::TPHandle*)':
+    os/KeyValueStore.cc:1426:18: warning: unused variable 'expected_object_size' [-Wunused-variable]
+    os/KeyValueStore.cc:1427:18: warning: unused variable 'expected_write_size' [-Wunused-variable]
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 2b86bf4f4c1be2603368d5031ee7d706056e2d1e
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Apr 29 11:23:58 2014 -0700
+
+    osd: automatically scrub PGs with invalid stats
+
+    If a PG has recnetly split and has invalid stats, scrub it now, even if
+    it has scrubbed recently.  This helps the stats become valid again soon.
+
+    Fixes: #8147
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 68b440d66539e820c9ce86a6942c3188be4ee1ec)
+
+commit 271ca7d9bc41e3a2ac387b05ca9f30d8a250fb62
+Merge: 54333a4 87cd3a8
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 26 06:38:34 2014 -0700
+
+    Merge pull request #2328 from dachary/wip-9209-round-up-to-firefly
+
+    common: ROUND_UP_TO accepts any rounding factor (firefly)
+
+commit 54333a49c9e99a398bf3695845b248ba76ee3930
+Merge: 4bff6f3 58d0871
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 26 06:09:17 2014 -0700
+
+    Merge pull request #2326 from yuyuyu101/wip-kvstore-firefly
+
+    Backport from master to Firefly(KeyValueStore)
+
+commit 87cd3a8f6e190aed06e361595afc4ec83148da98
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Mon Aug 25 17:05:04 2014 +0200
+
+    common: ROUND_UP_TO accepts any rounding factor
+
+    The ROUND_UP_TO function was limited to rounding factors that are powers
+    of two. This saves a modulo but it is not used where it would make a
+    difference. The implementation is changed so it is generic.
+
+    http://tracker.ceph.com/issues/9209 Fixes: #9209
+
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 9449520b121fc6ce0c64948386d4ff77f46f4f5f)
+
+commit 58d08714340049a5165ad682ec5b54292525b45d
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Thu Mar 20 14:09:49 2014 +0800
+
+    Remove exclusive lock on GenericObjectMap
+
+    Now most of GenericObjectMap interfaces use header as argument not the union of
+    coll_t and ghobject_t. So caller should be responsible for maintain the
+    exclusive header.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+commit 98df982a6f830154ff6880f5ee00350ba3375b6b
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Wed Jul 23 11:26:18 2014 +0800
+
+    common/RandomCache: Fix inconsistence between contents and count
+
+    The add/clear method may cause count inconsistent with the real size of
+    contents.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+commit c8ec7721526ccf4bfd91a220fee0dd75bef8fb21
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Tue Aug 26 04:41:28 2014 +0000
+
+    Add random cache and replace SharedLRU in KeyValueStore
+
+    SharedLRU plays pool performance in KeyValueStore with large header cache size,
+    so a performance optimized RandomCache could improve it.
+
+    RandomCache will record the lookup frequency of key. When evictint element,
+    it will randomly compare several elements's frequency and evict the least
+    one.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+    Conflicts:
+
+	src/common/config_opts.h
+	src/os/KeyValueStore.cc
+
+commit 33ca26a103a0d99627fddc30f2916c5aeb37c691
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Tue Aug 26 04:40:16 2014 +0000
+
+    Add Header cache to KeyValueStore
+
+    In the performance statistic recently, the header lookup becomes the main time
+    consuming for the read/write operations. Most of time it occur 50% to deal with
+    header lookup, decode/encode logics.
+
+    Now adding header cache using SharedLRU structure which will maintain the header
+    cache and caller will get the pointer to the real header. It also avoid too much
+    header copy operations overhead.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+    Conflicts:
+
+	src/os/KeyValueStore.cc
+	src/os/KeyValueStore.h
+
+commit e8dcb8cc603cff64bafc11ee42c5c04a9cf85d12
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Wed Feb 26 17:46:07 2014 +0800
+
+    Fix write operation on a deleted object in the same transaction
+
+    If the following op happened:
+    touch obj
+    delete obj
+    write obj
+
+    KeyValueStore will fail at "write" operation.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+commit e0ae6f9de685b60eee5efa5ca960c7a15481e41a
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Tue Aug 26 04:35:57 2014 +0000
+
+    Remove SequencerPosition from KeyValueStore
+
+    Now KeyValueStore expects kv backend to ensure consistency and there is unusable
+    for KeyValueStore to store a SequencerPosition.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+    Conflicts:
+
+	src/os/KeyValueStore.cc
+	src/os/KeyValueStore.h
+
+commit 44721f71266e3098169ed00f1ca7e86496b76b07
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Wed Jun 4 12:58:07 2014 +0800
+
+    Fix keyvaluestore fiemap bug
+
+    The result of fiemap is wrong and the offset get from
+    "StripObjectMap::file_to_extents" need to multiply by sequence number
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+
+commit 4bff6f3476e5df400db3dc1f0ad7b35a2a41830e
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 21 13:05:35 2014 -0700
+
+    mon: fix occasional message leak after session reset
+
+    Consider:
+
+     - we get a message, put it on a wait list
+     - the client session resets
+     - we go back to process the message later and discard
+       - _ms_dispatch returns false, but nobody drops the msg ref
+
+    Since we call _ms_dispatch() a lot internally, we need to always return
+    true when we are an internal caller.
+
+    Fixes: #9176
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 19df386b2d36d716be2e6d02de0386fac9e7bc1f)
+
+commit ca3ac907aa73c5d77760e12da6f1509ea860e894
+Merge: fdbab46 8d7e77b
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 21 10:14:18 2014 -0700
+
+    Merge pull request #2298 from dachary/wip-9153-jerasure-upgrade-firefly
+
+    erasure-code: preload the jerasure plugin variant (sse4,sse3,generic)
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 8d7e77b9747f1b3dc3c10d1b0877a4b9c899ba86
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Aug 21 14:41:55 2014 +0200
+
+    erasure-code: preload the jerasure plugin variant (sse4,sse3,generic)
+
+    The preloading of the jerasure plugin ldopen the plugin that is in
+    charge of selecting the variant optimized for the
+    CPU (sse4,sse3,generic). The variant plugin itself is not loaded because
+    it does not happen at load() but when the factory() method is called.
+
+    The JerasurePlugin::preload method is modified to call the factory()
+    method to load jerasure_sse4 or jerasure_sse3 or jerasure_generic as a
+    side effect.
+
+    Indirectly loading another plugin in the factory() method is error prone
+    and should be moved to the load() method instead. This change should be
+    done in a separate commit.
+
+    http://tracker.ceph.com/issues/9153 Fixes: #9153
+
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit fdbab46852e74d405b5c747da98564a5866ec8a7
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Tue May 20 14:32:18 2014 +0800
+
+    Fix set_alloc_hint op cause KeyValueStore crash problem
+
+    Now KeyValueStore doesn't support set_alloc_hit op, the implementation of
+    _do_transaction need to consider decoding the arguments. Otherwise, the
+    arguments will be regarded as the next op.
+
+    Fix the same problem for MemStore.
+
+    Fix #8381
+
+    Reported-by: Xinxin Shu <xinxin.shu5040 at gmail.com>
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit c08adbc98ff5f380ecd215f8bd9cf3cab214913c)
+
+commit 922e24e658f09a8a772309f18a8d54c560fad653
+Merge: ae787cf 164f1a1
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 20 10:10:08 2014 -0700
+
+    Merge pull request #2286 from dachary/wip-9153-jerasure-upgrade-firefly
+
+    erasure-code: preload the jerasure plugin (firefly)
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 164f1a1959a863848319585fa752250c7b261381
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Aug 19 01:30:15 2014 +0200
+
+    erasure-code: preload the jerasure plugin
+
+    Load the jerasure plugin when ceph-osd starts to avoid the following
+    scenario:
+
+    * ceph-osd-v1 is running but did not load jerasure
+
+    * ceph-osd-v2 is installed being installed but takes time : the files
+      are installed before ceph-osd is restarted
+
+    * ceph-osd-v1 is required to handle an erasure coded placement group and
+      loads jerasure (the v2 version which is not API compatible)
+
+    * ceph-osd-v1 calls the v2 jerasure plugin and does not reference the
+      expected part of the code and crashes
+
+    Although this problem shows in the context of teuthology, it is unlikely
+    to happen on a real cluster because it involves upgrading immediately
+    after installing and running an OSD. Once it is backported to firefly,
+    it will not even happen in teuthology tests because the upgrade from
+    firefly to master will use the firefly version including this fix.
+
+    While it would be possible to walk the plugin directory and preload
+    whatever it contains, that would not work for plugins such as jerasure
+    that load other plugins depending on the CPU features, or even plugins
+    such as isa which only work on specific CPU.
+
+    http://tracker.ceph.com/issues/9153 Fixes: #9153
+
+    Backport: firefly
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 9b802701f78288ba4f706c65b853415c69002d27)
+
+    Conflicts:
+	src/test/erasure-code/test-erasure-code.sh
+	src/common/config_opts.h
+
+commit ae787cfa88dfd0f5add5932b297258c46af4e333
+Author: Matt Benjamin <matt at linuxbox.com>
+Date:   Thu May 29 10:34:20 2014 -0400
+
+    Work around an apparent binding bug (GCC 4.8).
+
+    A reference to h->seq passed to std::pair ostensibly could not bind
+    because the header structure is packed.  At first this looked like
+    a more general unaligned access problem, but the only location the
+    compiler rejects is a false positive.
+
+    Signed-off-by: Matt Benjamin <matt at linuxbox.com>
+    (cherry picked from commit c930a1f119069a424af28a618b0abff4947c221f)
+
+commit 486deefdc1496b72cc680e432a61d71e5fa265c9
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 17 20:54:28 2014 -0700
+
+    qa/workunits/rbd/qemu-iotests: touch common.env
+
+    This seems to be necessary on trusty.
+
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 055be68cf8e1b84287ab3631a02e89a9f3ae6cca)
+
+commit cc4e6258d67fb16d4a92c25078a0822a9849cd77
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri May 23 16:52:08 2014 +0100
+
+    unittest_strtol: fix compilation warning
+
+    Was fixed in master by a4923f5bc373d530d1ffdf6c58a4d88139daedd2
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 7f9fe22a1c73d5f2783c3303fb9f3a7cfcea61c5
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Tue Jun 17 13:12:58 2014 +0800
+
+      Fix EINVAL err when use "ceph tell osd.* bench"
+
+      Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    (cherry picked from commit 7dc93a9651f602d9c46311524fc6b54c2f1ac595)
+
+commit 14607fc045aa169f1e8fa6872b412fba8f09d645
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Wed Jul 16 17:48:34 2014 -0700
+
+    qa/workunits/cephtool/test.sh: fix get erasure_code_profile test
+
+    Manual backport of 4d6899c7560e990650959b442980a7249f0ba4c1
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 068b906ee396f1ad717968f214610ea86dd8d6b4
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Jun 27 21:41:18 2014 +0100
+
+    mon: OSDMonitor: add 'osd pool get-quota' command
+
+    Enables us to obtain current quotas for a given pool.
+
+    Fixes: #8523
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 714a9bb5a058b2553f3be3e4cfb7e7f30150e75a)
+
+commit 2ed0fa034aa8e49ab703bdb798bd6211a83e3a9d
+Author: John Spray <jspray at redhat.com>
+Date:   Tue Jun 3 10:12:41 2014 +0100
+
+    mon: name instead of id in "has tiers" message
+
+    Instead of "Pool foo has tiers 1 2" print
+    "Pool foo has tiers bar baz".
+
+    Signed-off-by: John Spray <jspray at redhat.com>
+    (cherry picked from commit 97772c2f53f726bd71710d0d3e34159d2679390a)
+
+commit 7e509b1b8b5a3679094f794cd9334598aef4441e
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri May 23 17:01:38 2014 +0100
+
+    common/config.cc: allow integer values to be parsed as SI units
+
+    We are allowing this for all and any integer values; that is, OPT_INT,
+    OPT_LONGLONG, OPT_U32 and OPT_U64.
+
+    It's on the user to use appropriate units.  For instance, the user should
+    not use 'E(xabyte)' when setting a signed int, and use his best judgment
+    when setting options that, for instance, ought to receive seconds.
+
+    Fixes: 8265
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 5500437e064cd6b4b45d63ee9396193df87f4d44)
+
+commit 4e34d83e337d0febf20c86b051721878feef49a8
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri May 23 16:52:08 2014 +0100
+
+    test/strtol.cc: Test 'strict_strtosi()'
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 40587d4792fd55db72d33870aae8b6a806c9baaf)
+
+commit 3b06b8f4893bd18440ecb9705414831a827cef90
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri May 23 16:51:37 2014 +0100
+
+    common/strtol.cc: strict_strtosi() converts str with SI units to uint64_t
+
+    Accepts values with a suffix (B, K, M, G, T, P, E) and returns the
+    appropriate byte value.
+
+    E.g., 10B = 10, while 10K = 10240.
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 67dc5751ba9a4e527ff12ea65000d1ba45d956f6)
+
+commit 92ab6ecf321ab68ea8fe3e8c2b310303a5726af3
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Aug 13 15:50:20 2014 -0400
+
+    ceph-disk: linter cleanup
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit d74ed9d53fab95f27a9ad8e9f5dab7192993f6a3)
+
+commit 08772fd888fb0eca4570bd6b4bb25f8122691cb4
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 12:00:50 2014 -0700
+
+    ceph-disk: warn about falling back to sgdisk (once)
+
+    This way the user knows something funny might be up if dmcrypt is in use.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6f7798e37e098de38fbc73f86c4c6ee705abbe38)
+
+commit 50166efd205f46fa325dec9636d817387e5d4d3b
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 11:40:34 2014 -0700
+
+    ceph-disk: only fall back to sgdisk for 'list' if blkid seems old
+
+    If the blkid doesn't show us any ID_PART_ENTRY_* fields but we know it is
+    a GPT partition, *then* fallback.  Otherwise, don't bother.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b1651afb34d9d2c324db3bf5f54ac9ce001c6af9)
+
+commit a45e815cb00f1a807691cbf687990839995f7629
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 11:39:47 2014 -0700
+
+    ceph-disk: add get_partition_base() helper
+
+    Return the base devices/disk for a partition device.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b75e8a340c49cbc067baa19790b994a5f904bb4f)
+
+commit 8c04e475efb4471c605e3c921ec8a03b67934899
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 17:26:07 2014 -0700
+
+    ceph-disk: display information about dmcrypted data and journal volumes
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c7a1ceba441fa99a82e19ed2cd3c6782a5d77636)
+
+commit b09e659226b26002b58c7697f8c600d06fe78c58
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 17:25:42 2014 -0700
+
+    ceph-disk: move fs mount probe into a helper
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f80ed26d2403ba12e80da6459fc45c22584f72de)
+
+commit 6775f46e4a5862ddbf81bef11016bc036222fda9
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 17:25:10 2014 -0700
+
+    ceph-disk: use partition type UUIDs, and blkid
+
+    Use blkid to give us the GPT partition type.  This lets us distinguish
+    between dmcrypt and non-dmcrypt partitions.  Fake it if blkid doesn't
+    give us what we want and try with sgdisk.  This isn't perfect (it can't
+    tell between dmcrypt and not dmcrypt), but such is life, and we are better
+    off than before.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6c77f5f2f994c881232d76ce9c69af80d10772bd)
+
+commit 1804a83400b7c3dc07650e09da5224bb999d0940
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 13:53:16 2014 -0700
+
+    ceph-disk: fix log syntax error
+
+      File "/usr/sbin/ceph-disk", line 303, in command_check_call
+        LOG.info('Running command: %s' % ' '.join(arguments))
+    TypeError: sequence item 2: expected string, NoneType found
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1088d6cd11b476cd67ed30e07edd363c4057a003)
+
+commit 8a8a9c35349d3f58d899afa1a9e219b99586bc9f
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Aug 11 15:58:15 2014 -0700
+
+    Revert "Fix for bug #6700"
+
+    This reverts commit 673394702b725ff3f26d13b54d909208daa56d89.
+
+    This appears to break things when the journal and data disk are *not* the same.
+    And I can't seem to reproduce the original failure...
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2edf01ffa4a7425af2691b4e94bc5fd0bfab1e5b)
+
+commit 50b700fadf6ce6e0bf14b5daa2288786426d7359
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Aug 11 15:57:52 2014 -0700
+
+    ceph-disk: fix verify_no_in_use check
+
+    We only need to verify that partitions aren't in use when we want to
+    consume the whole device (osd data), not when we want to create an
+    additional partition for ourselves (osd journal).
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d6e6ba198efc4b3afff0c70af53497a70c6b3f19)
+
+commit c9847ef059f182ad15ef027c8bdfae6c99d91867
+Author: Alfredo Deza <alfredo at deza.pe>
+Date:   Thu May 22 17:04:28 2014 -0400
+
+    better error reporting on incompatible device requirements
+
+    Signed-off-by: Alfredo Deza <alfredo at deza.pe>
+    (cherry picked from commit 1ac3a503a15ddf7f7c1a33310a468fac10a1b7b6)
+
+commit 40649902891244242d5861ccd9538aec026cae3a
+Author: Stuart Longland <stuartl at vrt.com.au>
+Date:   Tue May 6 14:06:36 2014 -0700
+
+    ceph-disk: fix list for encrypted or corrupt volume
+
+    Continue gracefully if an fs type is not detected, either because it is
+    encrypted or because it is corrupted.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 09beebe3f1fd1b179547743648049b891cb8bc56)
+
+commit 80896dcf2c3ccba0b9b0b1bd9f6e075585e3d502
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Fri Jun 13 09:37:33 2014 -0400
+
+    support dmcrypt partitions when activating
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit ef8a1281512c4ee70a3764b28891da691a183804)
+
+commit 1b0da81d733a36de4a9dc80263058a6cdf05c745
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 15 16:41:43 2014 -0700
+
+    init-ceph: don't use bashism
+
+           -z STRING
+                  the length of STRING is zero
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 0d6d1aa7e0c5e0b5f99c9b548a1f890c511b4299)
+
+commit 9005f33d0d80d6d2b93493b38866b7f74f87d1eb
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 15 14:28:57 2014 -0700
+
+    osd: fix feature requirement for mons
+
+    These features should be set on the client_messenger, not
+    cluster_messenger.
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ae0b9f17760eda9a7e09a6babac50bfe8ebb4b36)
+
+commit 9e46c5ad7dadd1c342c82629577b5a1bf037fe75
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 15 13:54:11 2014 -0700
+
+    unittest_osdmap: test EC rule and pool features
+
+    TODO: tiering feature bits.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2f0e2951d773b6acce781b4b991d6d8e817ee2f9)
+
+commit dbbe0c627bcd4a60c1346bb120698b5a0c2192c2
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 15 14:04:05 2014 -0700
+
+    unittest_osdmap: create an ec pool in test osdmap
+
+    This is part of 7294e8c4df6df9d0898f82bb6e0839ed98149310.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit c2aa74a22718d9a59d60201d71213aaff2492ff8
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 15 08:55:10 2014 -0700
+
+    osd: only require crush features for rules that are actually used
+
+    Often there will be a CRUSH rule present for erasure coding that uses the
+    new CRUSH steps or indep mode.  If these rules are not referenced by any
+    pool, we do not need clients to support the mapping behavior.  This is true
+    because the encoding has not changed; only the expected CRUSH output.
+
+    Fixes: #8963
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 16dadb86e02108e11a970252411855d84ab0a4a2)
+
+commit 12430fed85b2cfeaeb33a443e6a4c6538d0833f8
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 15 08:52:37 2014 -0700
+
+    crush: add is_v[23]_rule(ruleid) methods
+
+    Add methods to check if a *specific* rule uses v2 or v3 features.  Refactor
+    the existing checks to use these.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1d95486780a54c85a5c88936a4da4bdc3576a7b8)
+
+commit 2427ea8f153caf55b3bce77cd2fc88935563c7b3
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jun 30 13:40:07 2014 -0700
+
+    PGLog: fix clear() to avoid the IndexLog::zero() asserts
+
+    Introduced in:
+      c5b8d8105d965da852c79add607b69d5ae79a4d4
+      ac11ca40b4f4525cbe9b1778b1c5d9472ecb9efa
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+    (cherry picked from commit 959f2b25910360b930183fbf469ce984a48542dd)
+
+commit 9ca451a6bf2f29e75f72cbd3dbcff0bf8986e462
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jun 19 12:34:36 2014 -0700
+
+    osd: allow io priority to be set for the disk_tp
+
+    The disk_tp covers scrubbing, pg deletion, and snap trimming
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit d9073f486527ca13cdb2774745c4c63c218333ad)
+
+commit 11858d7e7a493c9493f7039b7e45dc03fc4feb90
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:02:09 2014 -0700
+
+    common/WorkQueue: allow io priority to be set for wq
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit dd6badcb5eedfec6748b3e6ca4d46e3b266038f6)
+
+    Conflicts:
+
+	src/common/WorkQueue.cc
+
+commit b75f85a2c4dd9807947862f7b89a5f25dfa1defe
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:01:42 2014 -0700
+
+    common/Thread: allow io priority to be set for a Thread
+
+    Ideally, set this before starting the thread.  If you set it after, we
+    could potentially race with create() itself.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1b8741022c5a2ebae38905215dadee696433e931)
+
+commit 9f29788fbc19aea341b4fe997a567aa3054b9d1c
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 18 11:01:09 2014 -0700
+
+    common/io_priority: wrap ioprio_set() and gettid()
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit a2b49110ef65efd526c3430ad03c988ca9dde768)
+
+commit fac5bfafef1eb82f8cf23c369fb5f50502e2e6f3
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Jun 17 10:47:24 2014 -0700
+
+    osd: introduce simple sleep during scrub
+
+    This option is similar to osd_snap_trim_sleep: simply inject an optional
+    sleep in the thread that is doing scrub work.  This is a very kludgey and
+    coarse knob for limiting the impact of scrub on the cluster, but can help
+    until we have a more robust and elegant solution.
+
+    Only sleep if we are in the NEW_CHUNK state to avoid delaying processing of
+    an in-progress chunk.  In this state nothing is blocked on anything.
+    Conveniently, chunky_scrub() requeues itself for each new chunk.
+
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit c4e8451cc5b4ec5ed07e09c08fb13221e31a7ac6)
+
+commit ad82f28122dc41095d5e703279a8a5c494d35913
+Author: Sage Weil <sage at inktank.com>
+Date:   Sat Jun 14 10:30:50 2014 -0700
+
+    osd: add sanity check/warning on a few key configs
+
+    Warn when certain config values are set to bad values.
+
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit f3ec7d0b23fdee39a34bda7595cd2a79c08daf8a)
+
+commit 289360c5dc57a4788289472f90d63781143539be
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 1 17:24:48 2014 -0700
+
+    osd: prevent pgs from getting too far ahead of the min pg epoch
+
+    Bound the range of PG epochs between the slowest and fastest pg
+    (epoch-wise) with 'osd map max advance'.  This value should be set to
+    something less than 'osd map cache size' so that the maps we are
+    processing will be in memory as many PGs advance forward in time in
+    loose synchrony.
+
+    This is part of the solution to #7576.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cf25bdf6b0090379903981fe8cee5ea75efd7ba0)
+
+commit 662af7ac83b67af8c9edc554bbd505de717f9709
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 7 17:42:06 2014 -0700
+
+    osd: fix pg epoch floor tracking
+
+    If you call erase() on a multiset it will delete all instances of a value;
+    we only want to delete one of them.  Fix this by passing an iterator.
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a52a855f6c92b03dd84cd0cc1759084f070a98c2)
+
+commit 229a346d824d84c361d7963a356af5251adc9e2e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Apr 2 14:29:08 2014 -0700
+
+    osd: track per-pg epochs, min
+
+    Add some simple tracking so that we can quickly determine what the min
+    pg osdmap epoch is.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 81e4c47722255ac3d46f701a80e104cc390e766c)
+
+commit 38c3a3c0b0d1903aea2fdc6224fc4f70bbc39329
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 13:31:10 2014 -0700
+
+    mon: fix divide by zero when pg_num adjusted and no osds
+
+    Fixes: #9052
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 239401db7b51541a57c59a261b89e0f05347c32d)
+
+commit 87bf00a2cb93ce2dc904a42c45cc9f43023725c3
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 10 12:48:29 2014 -0700
+
+    ceph_test_rados_api_tier: fix cache cleanup (ec too)
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d7fb7bf5f2059f411633751e376c2270e6040fba)
+
+commit 3be0d731cbe158d837d05c907aefe16aa95977be
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 10 12:15:38 2014 -0700
+
+    ceph_test_rados_api: fix cleanup of cache pool
+
+    We can't simply try to delete everything in there because some items may
+    be whiteouts.  Instead, flush+evict everything, then remove overlay, and
+    *then* delete what remains.
+
+    Fixes: #9055
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ebbe8aab17cfa2281902f167a706639535da4010)
+
+commit 7f511ef7fd55cca8f1babaf696ca0faa0e1e411d
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 10 11:41:23 2014 -0700
+
+    librados/TestCase: inheret cleanup_default_namespace
+
+    No need to duplicate this code.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1d199fb1173dc9685dba96c22b83e4e9edf51a11)
+
+commit 4a5c93a90986de4510c50f0fba72ae7d5aed8a15
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 10:34:53 2014 -0700
+
+    osd/ReplicatedPG: only do agent mode calculations for positive values
+
+    After a split we can get negative values here.  Only do the arithmetic if
+    we have a valid (positive) value that won't through the floating point
+    unit for a loop.
+
+    Fixes: #9082
+    Tested-by: Karan Singh <karan.singh at csc.fi>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 5be56ff86d9f3ab2407a258a5285d0b8f52f041e)
+
+commit 39bcafa6f2b14e4e11e1541cf01f24525e2b6449
+Merge: 7da121d cb48cd4
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue Aug 12 21:15:26 2014 -0700
+
+    Merge pull request #2231 from ceph/wip-8944-firefly
+
+    Wip 8944 firefly
+
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 7da121d2aa1ea5c5c8accef92d7304912d4b2eb3
+Author: Greg Farnum <greg at inktank.com>
+Date:   Mon Jul 28 18:33:56 2014 -0700
+
+    OSD: add require_same_peer_inst(OpRequestRef&,OSDMap&) helper
+
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit e99acf9810976b1fc74b84ad289773af43be973f)
+
+    Conflicts:
+
+	src/osd/OSD.cc
+
+commit 8595e9bed3689933c03a8f3443052a36ff1d62f5
+Author: Greg Farnum <greg at inktank.com>
+Date:   Mon Jul 28 14:19:59 2014 -0700
+
+    OSD: introduce require_self_aliveness(OpRequestRef&,epoch_t) function
+
+    Take the self-aliveness checks out of require_same_or_newer_map() and use
+    the new function for that and for require_up_osd_peer().
+
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit e179e9227b4a4482d8359682092fd7f426b9a919)
+
+    Conflicts:
+
+	src/osd/OSD.cc
+
+commit d0f2c4891bbcc1938bee15b3fc0bfb796ce4c7de
+Author: Greg Farnum <greg at inktank.com>
+Date:   Mon Jul 28 14:08:30 2014 -0700
+
+    OSD: use OpRequestRef& for a few require_* functions
+
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit eb2f1ea2c33647934af878b504383829f5a198ce)
+
+commit 8d395f1cbbc63f4cd5d166fd0a667938c83f303c
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Jul 22 16:57:00 2014 -0700
+
+    OSD: introduce require_up_osd_peer() function for gating replica ops
+
+    This checks both that a Message originates from an OSD, and that the OSD
+    is up in the given map epoch.
+    We use it in handle_replica_op so that we don't inadvertently add operations
+    from down peers, who might or might not know it.
+
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit ccd0eec50103b919b3eb6eea96f7dc6438520ed3)
+
+commit 72c2474e05b918535047181d876678a6a077aa1d
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Fri Aug 8 10:16:20 2014 -0400
+
+    init-ceph: conditionally update  after argparsing
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 44ed1885fb588aad7e4729373e06c5933178b5e5)
+
+commit 8d7fb538e0163f828289d7da719692bd36a66f83
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Thu Aug 7 11:11:57 2014 -0400
+
+    make ceph-disk use the new init flag for cluster
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit d0ccb1cbef86b8ccd8967af892e3582ee80edd55)
+
+commit 260a9c84630ca6956eb772d87abdc3bd4c4bb8fc
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Thu Aug 7 10:48:09 2014 -0400
+
+    allow passing a --cluster flag to the init script
+
+    It will fallback to looking at /etc/ceph/$cluster.conf
+    otherwise.
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 23b4915fa252852cf02cc42a1b6143e2cd61b445)
+
+commit cb5ecdce68dcd4e4bc32b5c7c029cfd7ffe7c80e
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Aug 6 15:30:30 2014 -0400
+
+    use cluster name when checking the host
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit bdf5f30010117c71a227855a47fe22ab55b3e0b8)
+
+commit 79452540826d0aed7b94d374cc61b5002e89e4a4
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Aug 6 15:30:09 2014 -0400
+
+    use  name in /var/lib/ceph paths
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 3fb25c28e8e3cc62bc541538cc11f5ed41471611)
+
+commit 92755d1060ea06f13577cd2fffda6c7984a610b2
+Author: Alfredo Deza <alfredo.deza at inktank.com>
+Date:   Wed Aug 6 15:29:42 2014 -0400
+
+    when starting an OSD, pass in the cluster name
+
+    Signed-off-by: Alfredo Deza <alfredo.deza at inktank.com>
+    (cherry picked from commit 9e08e3a7794ce007c80c8fdb56e96900eb5240a3)
+
+commit 272b26f5aab71c22a1954ff92548b535a1f018d8
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Aug 1 14:04:35 2014 -0700
+
+    osd_types: s/stashed/rollback_info_completed and set on create
+
+    Originally, this flag indicated that the object had already been stashed and
+    that therefore recording subsequent changes is unecessary.  We want to set it
+    on create() as well since operations like [create, writefull] should not need
+    to stash the object.
+
+    Fixes: #8625
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 4260767973d96978e808cb87ef6ae991104b4f8d)
+
+commit 7b5bcb943578b99f5a2aeeae0bbc67f371c30233
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Jun 19 18:27:49 2014 +0100
+
+    osd: use appropriate json types instead of stream when dumping info
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 363496ad878c685008ccd87f26f121d62a48c24c)
+
+commit daec3226e073b8d6047eb9111f3deb39b1001647
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Jun 19 16:52:06 2014 +0100
+
+    osd: have 'tid' dumped as a json unsigned int where appropriate
+
+    Most of the places dumping it would dump it as a string. Others as an int.
+    Just a couple would dump it as an unsigned int.
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 3f0ea9512be78d10ac0bc605a38e83cfbab7ffee)
+
+commit 439bce34bc25cd7c8eba7ffc124185d810d3711f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Sat Aug 2 13:01:05 2014 -0700
+
+    rgw: need to pass need_to_wait for throttle_data()
+
+    need_to_wait wasn't passed into processor->throttle_data(). This was
+    broken in fix for #8937.
+
+    CID 1229541:    (PW.PARAM_SET_BUT_NOT_USED)
+
+    Backport: firefly
+
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit e93818df33286a2a7f73b593dc20da412db4e0a6)
+    (cherry picked from commit 8519e9ab06caf6999e1243514a93eaffb155ab2e)
+
+commit fc1a4b5fdce7b92ba1b321dec37c4c75501e3521
+Author: Sylvain Munaut <s.munaut at whatever-company.com>
+Date:   Thu Jun 5 11:28:27 2014 +0200
+
+    rgw: Don't send error body when it's a HEAD request
+
+    The main 'operation' know not to send any body for HEAD requests.
+
+    However for errors, this was not the case, the formatter would be
+    flushed and would send the error 'message' in the body in all cases.
+
+    For the FastCGI case it doesn't seem to be an issue, it's possible
+    that the webserver (apache/lighttpd/...) cleans up the response
+    into shape.
+
+    But when using the new civetweb frontend this cause invalid HTTP.
+
+    Backport: firefly
+    Fixes #8539
+
+    Reviewed-by: Yehuda Sadeh <yehuda at inktank.com>
+    Signed-off-by: Sylvain Munaut <s.munaut at whatever-company.com>
+    (cherry picked from commit 0a2b4c25541bbd15776d3d35986518e37166910f)
+
+commit e3bc15343720d0455e32e429e7cf865037bd90d7
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 30 13:57:34 2014 -0700
+
+    osd: prevent old clients from using tiered pools
+
+    If the client is old and doesn't understand tiering, don't let them use a
+    tiered pool.  Reply with EOPNOTSUPP.
+
+    Fixes: #8714
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 0190df53056834f219e33ada2af3a79e8c4dfb77)
+
+commit f3113e9adde54fa50a64010381f5b6c113f5cda0
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 31 11:02:55 2014 -0700
+
+    mon/OSDMonitor: warn when cache pools do not have hit_sets configured
+
+    Give users a clue when cache pools are enabled but the hit_set is not
+    configured.  Note that technically this will work, but not well, so for
+    now let's just steer them away.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 383536a2ef2506c5591b25c0fd61dc8c181fdab9)
+
+    NOTE: removed readforward state for backport
+
+commit aaf732f7475c075f8bf8e79bc08b11a020e5fadf
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 31 09:28:12 2014 -0700
+
+    osd/ReplicatedPG: improve agent_choose_mode args
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit caf554bf2f752b50670d118c99843b7c4a2967b4)
+
+commit 76a519b215e591e0948d627fb1de826ed0bf415d
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 31 09:26:03 2014 -0700
+
+    osd/ReplicatedPG: evict blindly if there is no hit_set
+
+    If there is no hit set for a PG, blindly evict objects.  This avoids an
+    assert(hit_set) in agent_estimate_atime_temp().
+
+    Fixes: #8982
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ea4996d3ef15c5d5a776d162b08d9fad6859c976)
+
+commit 8ff48d79697e98dca04799ee5982a5308a4efc92
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 31 09:13:11 2014 -0700
+
+    osd/ReplicatedPG: check agent_mode if agent is enabled but hit_sets aren't
+
+    It is probably not a good idea to try to run the tiering agent without a
+    hit_set to inform its actions, but it is technically possible.  For
+    example, one could simply blindly evict when we reach the full point.
+    However, this doesn't work because the agent mode is guarded by a hit_set
+    check, even though agent_setup() is not.  Fix that.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 5d1c76f641310f5f65600f70ae76945b2aa472d7)
+
+commit f98a6194a9a9f5794c38814c1c33d13b7fcea538
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 07:05:34 2014 -0700
+
+    common/LogClient: fix sending dup log items
+
+    We need to skip even the most recently sent item in order to get to the
+    ones we haven't sent yet.
+
+    Fixes: #9080
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 057c6808be5bc61c3f1ac2b956c1522f18411245)
+
+commit bbb1e6a3a84b2d853f935687f01016e7c6a67951
+Author: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+Date:   Wed Aug 6 15:10:14 2014 +0530
+
+    RadosClient: Fixing potential lock leaks.
+
+    In lookup_pool and pool_delete, a lock is taken
+    before invoking wait_for_osdmap, but is not
+    released for the failure case of the call. Fixing the same.
+
+    Fixes: #9022
+    Signed-off-by: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+    (cherry picked from commit f1aad8bcfc53f982130dbb3243660c3c546c3523)
+
+commit e767254ce9a1610f3d640d8157fcb0d1fdf8edf2
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Aug 11 16:41:26 2014 -0700
+
+    librbd: fix error path cleanup for opening an image
+
+    If the image doesn't exist and caching is enabled, the ObjectCacher
+    was not being shutdown, and the ImageCtx was leaked. The IoCtx could
+    later be closed while the ObjectCacher was still running, resulting in
+    a segfault. Simply use the usual cleanup path in open_image(), which
+    works fine here.
+
+    Fixes: #8912
+    Backport: dumpling, firefly
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 3dfa72d5b9a1f54934dc8289592556d30430959d)
+
+commit dec028d113ab4bcc7106fea0bf413b54829f67e7
+Merge: e087862 c7fbf27
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 12 14:38:33 2014 -0700
+
+    Merge remote-tracking branch 'gh/firefly-next' into firefly
+
+commit 07e1ceb55ac3cf0bea58cec27737e45391de9106
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 10 17:10:04 2014 +0200
+
+    erasure-code: ErasureCodeJerasure::create_ruleset must return a ruleset
+
+    CrushWrapper::add_simple_ruleset does not return a ruleset, it returns
+    a ruleid that must be converted into a ruleset before being returned.
+
+    http://tracker.ceph.com/issues/9044 Fixes: #9044
+
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 0029a35872d3fc15f9a0d60d095b2e111d6e98a6)
+
+commit 96047f1de4e0591a294e31ed6af6edfb3b2357e4
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 10 17:06:33 2014 +0200
+
+    erasure-code: OSDMonitor::crush_ruleset_create_erasure needs ruleset
+
+    When OSDMonitor::crush_ruleset_create_erasure checks the ruleset for
+    existence, it must convert the ruleid into a ruleset before assigning it
+    back to the *ruleset parameter.
+
+    http://tracker.ceph.com/issues/9044 Fixes: #9044
+
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 04a484a4d5800c9bcf9805d3e87ed0c8dee01c9a)
+
+commit e087862d5bd894572a6c223b45f4275cadd4b480
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Mon Jul 14 14:27:17 2014 +0800
+
+    Add rbdcache max dirty object option
+
+    Librbd will calculate max dirty object according to rbd_cache_max_size, it
+    doesn't suitable for every case. If user set image order 24, the calculating
+    result is too small for reality. It will increase the overhead of trim call
+    which is called each read/write op.
+
+    Now we make it as option for tunning, by default this value is calculated.
+
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 3c7229a2fea98b30627878c86b1410c8eef2b5d7)
+
+commit 5f74fb294a0cd9b973aae45de17f38436bac6d61
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Jun 4 23:22:18 2014 +0200
+
+    librbd/internal.cc: check earlier for null pointer
+
+    Fix potential null ponter deref, move check for 'order != NULL'
+    to the beginning of the function to prevent a) deref in ldout() call
+    and b) to leave function as early as possible if check fails.
+
+    [src/librbd/internal.cc:843] -> [src/librbd/internal.cc:865]: (warning)
+     Possible null pointer dereference: order - otherwise it is redundant
+     to check it against null.
+
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 3ee3e66a9520a5fcafa7d8c632586642f7bdbd29)
+
+commit b2189465f36fc375b864f88a47d25c7808c08901
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Apr 24 14:47:24 2014 -0700
+
+    librbd: add an interface to invalidate cached data
+
+    This is useful for qemu to guarantee live migration with caching is
+    safe, by invalidating the cache on the destination before starting it.
+
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 5d340d26dd70192eb0e4f3f240e3433fb9a24154)
+
+commit f7dc58552a9ee228b7fa2a10094e962ed66fe8fd
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Thu Apr 24 14:43:35 2014 -0700
+
+    librbd: check return code and error out if invalidate_cache fails
+
+    This will only happen when shrinking or rolling back an image is done
+    while other I/O is in flight to the same ImageCtx. This is unsafe, so
+    return an error before performing the resize or rollback.
+
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e08b8b66c77be3a3d7f79d91c20b1619571149ee)
+
+commit c7fbf272a202cd8a72d91b7a55e53fbb5cbbbadd
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Aug 9 13:23:06 2014 -0700
+
+    os/FileStore: dump open fds before asserting
+
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 4e8de1792731cf30f2744ab0659d036adc0565a3)
+
+commit 978f5749f3d08bb4c96529ca2d1b10760ee2606d
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 25 13:51:45 2014 -0700
+
+    ceph_test_rados_api_tier: do fewer writes in HitSetWrite
+
+    We don't need to do quite so many writes.  It can be slow when we are
+    thrashing and aren't doing anything in parallel.
+
+    Fixes: #8932
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c5f766bb16c0ab3c3554e73791ad0b74077ad35c)
+
+commit 22aa81413e7db43418e613aea037e978031f5b8a
+Merge: b65cef6 7025075
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 8 19:05:37 2014 -0700
+
+    Merge remote-tracking branch 'gh/firefly-next' into firefly
+
+commit cb48cd47a26d27869884af83012d6a8a684abf25
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jul 30 14:50:37 2014 -0700
+
+    qa/workunits/cephtool/test_daemon.sh: verify ceph -c works with daemon
+
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit aa9ae1f270293778aa937e7f7e4bcaee3099b9b2)
+
+commit 1ac0e5436da68e441f42a1016b12481046147850
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jul 30 14:49:02 2014 -0700
+
+    qa/workunits/cephtool/test_daemon.sh: typo
+
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 22d20f39b7355966554319d5a1aa888967607569)
+
+commit a144950624208d8ed2901fd7421060a706ac2016
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jul 30 14:48:28 2014 -0700
+
+    qa/workunits/cephtool/test_daemon.sh: allow local ceph command
+
+    (cherry picked from commit 97a8d5a9fdbd3a25cc922c242ee57da58c57d0bc)
+
+commit 76b593f6268d77e6cf5a9931f6f3524b3f574c09
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Jul 28 21:28:42 2014 -0700
+
+    ceph.in: Pass global args to ceph-conf for proper lookup
+
+    Fixes: #8944
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 6d89a99648630f81b85ad115fe7662dba6b08a55)
+
+commit b65cef678777c1b87d25385595bf0df96168703e
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jul 14 08:04:16 2014 -0700
+
+    ceph_test_rados_api_tier: fix [EC] HitSet{Read,Write,Trim} tests
+
+    The hit_set_ fields can only be set on tier pools as of
+    f131dfbaedf6f451572e7aa3a83f653912122953.
+
+    Fixes: #8823
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e17e9d857722ee478abda10adb32e15b11fff2ff)
+
+commit 70250755e4b2c114f1f0f463b42930dd99751d81
+Merge: 6f1a544 f8494c8
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Aug 3 12:47:23 2014 -0700
+
+    Merge branch 'wip-8701-firefly' into firefly-next
+
+commit f8494c87e5276f0587c3341ddef9d7a933dfea11
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 22 06:53:41 2014 -0700
+
+    ceph_test_objectstore: clean up on finish of MoveRename
+
+    Otherwise, we leave collections around, and the next test fails.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d4faf747b73e70dff9cb5c98ee6aaa4ecec215fc)
+
+commit 94fee997204d439abfd642be20a7e33df5979342
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jul 21 13:45:21 2014 -0700
+
+    os/LFNIndex: use FDCloser for fsync_dir
+
+    This prevents an fd leak when maybe_inject_failure() throws an exception.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3ec9a42b470422b1fe72b6294d82d9efcaca7f53)
+
+commit b213866eac422a6ac6aeacd3ab4741a6421ce20c
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 23:16:09 2014 -0700
+
+    os/LFNIndex: only consider alt xattr if nlink > 1
+
+    If we are doing a lookup, the main xattr fails, we'll check if there is an
+    alt xattr.  If it exists, but the nlink on the inode is only 1, we will
+    kill the xattr.  This cleans up the mess left over by an incomplete
+    lfn_unlink operation.
+
+    This resolves the problem with an lfn_link to a second long name that
+    hashes to the same short_name: we will ignore the old name the moment the
+    old link goes away.
+
+    Fixes: #8701
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6fb3260d59faab1e20ebf1e44f850f85f6b8342a)
+
+commit 4fc72d8d936ac499fbb53a1d73a3f7c05ebe596a
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 17:28:18 2014 -0700
+
+    os/LFNIndex: remove alt xattr after unlink
+
+    After we unlink, if the nlink on the inode is still non-zero, remove the
+    alt xattr.  We can *only* do this after the rename or unlink operation
+    because we don't want to leave a file system link in place without the
+    matching xattr; hence the fsync_dir() call.
+
+    Note that this might leak an alt xattr if we happen to fail after the
+    rename/unlink but before the removexattr is committed.  We'll fix that
+    next.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ec36f0a130d67df6cbeefcc9c2d83eb703b6b28c)
+
+commit 816ed7e951b32bb9ac57466c0affaec9781ac7f4
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jul 21 13:43:42 2014 -0700
+
+    os/LFNIndex: FDCloser helper
+
+    Add a helper to close fd's when we leave scope.  This is important when
+    injecting failures by throwing exceptions.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a320c260a9e088ab0a4ea3d5298c06a2d077de37)
+
+commit cbfbe637851c7ebe4a9ec1fd6e429cdf85aef608
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 17:09:07 2014 -0700
+
+    os/LFNIndex: handle long object names with multiple links (i.e., rename)
+
+    When we rename an object (collection_move_rename) to a different name, and
+    the name is long, we run into problems because the lfn xattr can only track
+    a single long name linking to the inode.  For example, suppose we have
+
+    foobar -> foo_123_0 (attr: foobar) where foobar hashes to 123.
+
+    At first, collection_add could only link a file to another file in a
+    different collection with the same name. Allowing collection_move_rename
+    to rename the file, however, means that we have to convert:
+
+    col1/foobar -> foo_123_0 (attr: foobar)
+
+    to
+
+    col1/foobaz -> foo_234_0 (attr: foobaz)
+
+    This is a problem because if we link, reset xattr, unlink we end up with
+
+    col1/foobar -> foo_123_0 (attr: foobaz)
+
+    if we restart after we reset the attr.  This will cause the initial foobar
+    lookup to since the attr doesn't match, and the file won't be able to be
+    looked up.
+
+    Fix this by allow *two* (long) names to link to the same inode.  If we
+    lfn_link a second (different) name, move the previous name to the "alt"
+    xattr and set the new name.  (This works because link is always followed
+    by unlink.)  On lookup, check either xattr.
+
+    Don't even bother to remove the alt xattr on unlink.  This works as long
+    as the old name and new name don't hash to the same shortname and end up
+    in the same LFN chain.  (Don't worry, we'll fix that next.)
+
+    Fixes part of #8701
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+    (cherry picked from commit b2cdfce6461b81f4926602a8c63b54aa92684e6c)
+
+commit 5db6c12b61e00b0bc8084ead5976a912ece0fc65
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 18 15:46:58 2014 -0700
+
+    ceph_test_objectstore: fix warning
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit cf98805c09a38cce78ac08317899dc4152ae55a5)
+
+commit e18777ed6eb492e8421d53090b3c9af6e75bd792
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Jul 15 14:50:33 2014 -0700
+
+    store_test: add long name collection_move_rename tests
+
+    Currently fails.
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 6aa48a485e03ca100f3d9ebec77cc06f99756cd7)
+
+    Conflicts:
+	src/test/objectstore/store_test.cc
+
+commit 4e03d5b512c8d2f7fa51dda95c6132e676529f9b
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 3 08:40:57 2014 -0700
+
+    Revert "enforce rados put aligment"
+
+    This reverts commit 7a58da53ebfcaaf385c21403b654d1d2f1508e1a.
+
+    This was alread backported in dece65064d949b5afcc359cd408615883b5e002a.
+
+    Fixes: #8996
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 6f1a54436c63a4cb63712936fccade3267d03db8
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Jul 29 15:25:47 2014 -0700
+
+    rgw: fix crash in swift CORS preflight request
+
+    Fixes: #8586
+
+    This fixes error handling, in accordance with commit 6af5a537 that fixed
+    the same issue for the S3 case.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 18ea2a869791b4894f93fdafde140285f2e4fb65)
+
+commit dfcd99567e925bd6565ef4676c560f6c8c89e683
+Author: devicenull <dn at devicenull.org>
+Date:   Fri Jul 18 10:25:51 2014 -0400
+
+    rgw: fix decoding + characters in URL
+
+    Fixes: #8702
+    Backport: firefly
+
+    Only decode + characters to spaces if we're in a query argument. The +
+    query argument.  The + => ' ' translation is not correct for
+    file/directory names.
+
+    Resolves http://tracker.ceph.com/issues/8702
+
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+    Signed-off-by: Brian Rak <dn at devicenull.org>
+    (cherry picked from commit 4a63396ba1611ed36cccc8c6d0f5e6e3e13d83ee)
+
+commit f9716214a35e3cddd3006f3839f9688c41f0c7ca
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jul 25 20:33:52 2014 -0700
+
+    rgw: call processor->handle_data() again if needed
+
+    Fixes: #8937
+
+    Following the fix to #8928 we end up accumulating pending data that
+    needs to be written. Beforehand it was working fine because we were
+    feeding it with the exact amount of bytes we were writing.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 0553890e79b43414cc0ef97ceb694c1cb5f06bbb)
+
+    Conflicts:
+	src/rgw/rgw_rados.h
+
+commit 4cd1b60c043089358ea8e70a51310005d5b68383
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jul 24 15:30:27 2014 -0700
+
+    rgw: object write should not exceed part size
+
+    Fixes: #8928
+
+    This can happen if the stripe size is not a multiple of the chunk size.
+
+    Backport: firefly
+
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 14cad5ece7d1de9d93e72acca6d4c3b4a9cfcfa2)
+
+commit f68720a6a61364f72f4e0c62aabea65eabe33f98
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Jul 22 15:30:11 2014 -0700
+
+    rgw: align object chunk size with pool alignment
+
+    Fixes: #8442
+    Backport: firefly
+    Data pools might have strict write alignment requirements. Use pool
+    alignment info when setting the max_chunk_size for the write.
+
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fc83e197ab85355e385c13f2a64957cad7481298)
+
+    Conflicts:
+	src/rgw/rgw_rados.cc
+
+commit 67d73451c893b58634f06ed141792da1bf0fa77c
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jul 30 11:53:16 2014 -0700
+
+    cls_rgw: fix object name of objects removed on object creation
+
+    Fixes: #8972
+    Backport: firefly, dumpling
+
+    Reported-by: Patrycja Szabłowska <szablowska.patrycja at gmail.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 0f8929a68aed9bc3e50cf15765143a9c55826cd2)
+
+commit d90148da293b4a3e2a44d4486a6b48e27d35b79b
+Merge: 223a0a9 d48a737
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sat Aug 2 11:28:14 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-8438' into firefly-next
+
+    Backport of c5b8d8105d965da852c79add607b69d5ae79a4d4
+
+commit 223a0a9e7ed76fbc114c2f058d3aff93556244e9
+Merge: 84bd3cd d72eec0
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sat Aug 2 11:22:47 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-7999' into firefly-next
+
+    Backport of 830940bf242a73403ec1882a489e31f7694b7f7e
+
+commit 84bd3cd79961d1ddce12048f9ae980fc197e6be4
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jul 28 17:17:23 2014 -0700
+
+    unittest_crush_wrapper: fix build
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f36cffc986c973014c89aa37ca73740b2fc194ca)
+
+commit 4983aa32fe8c64c78957b921f5d31ab07be9f850
+Merge: a2681c9 b6d8fea
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Aug 1 19:26:44 2014 -0700
+
+    Merge pull request #2178 from dachary/wip-erasure-code-profile-default-firefly
+
+    erasure-code: create default profile if necessary (firefly)
+
+commit d89a5a37f2515cc9af1322fd18357e445b94256f
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 30 12:26:44 2014 -0700
+
+    mon: s/%%/%/
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d700076a42a5a5ebe769a8311fd3b52bf2e98cd2)
+
+commit da0de4ee973d9a9c8ee6f9a5c12eb37c83b4d453
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 30 14:52:06 2014 -0700
+
+    atomic: fix read() on i386, clean up types
+
+    Among other things, fixes #8969
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 96863128e6668257f435c6962263caae0d7d10dd)
+
+commit 1e3b927731104629cae9682b55b8d540ef8af12f
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu Jun 5 10:43:16 2014 -0700
+
+    include/atomic: make 32-bit atomic64_t unsigned
+
+    This fixes
+
+    In file included from test/perf_counters.cc:19:0:
+    ./common/perf_counters.h: In member function ‘std::pair PerfCounters::perf_counter_data_any_d::read_avg() const’:
+    warning: ./common/perf_counters.h:156:36: comparison between signed and unsigned integer expressions [-Wsign-compare]
+    } while (avgcount2.read() != count);
+    ^
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2081c992bbe3a83d711f465634d19c011d28ea3e)
+
+commit 34ac3060d408604c7082c583641b90f330f12663
+Author: Dmitry Smirnov <onlyjob at member.fsf.org>
+Date:   Wed May 21 07:56:43 2014 +1000
+
+    Define AO_REQUIRE_CAS (fixes FTBFS on 'hppa')
+
+     to fix FTBFS due to undeclared atomic functions.
+
+    As reported
+
+        https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=748571
+
+    by John David Anglin <dave.anglin at bell.net>
+
+    ~~~~
+    ./include/atomic.h: In member function 'size_t ceph::atomic_t::inc()':
+    ./include/atomic.h:42:36: error: 'AO_fetch_and_add1' was not declared in this scope
+           return AO_fetch_and_add1(&val) + 1;
+                                        ^
+    ./include/atomic.h: In member function 'size_t ceph::atomic_t::dec()':
+    ./include/atomic.h:45:42: error: 'AO_fetch_and_sub1_write' was not declared in this scope
+           return AO_fetch_and_sub1_write(&val) - 1;
+                                              ^
+    ./include/atomic.h: In member function 'void ceph::atomic_t::add(size_t)':
+    ./include/atomic.h:48:36: error: 'AO_fetch_and_add' was not declared in this scope
+           AO_fetch_and_add(&val, add_me);
+                                        ^
+    ./include/atomic.h: In member function 'void ceph::atomic_t::sub(int)':
+    ./include/atomic.h:52:48: error: 'AO_fetch_and_add_write' was not declared in this scope
+           AO_fetch_and_add_write(&val, (AO_t)negsub);
+                                                    ^
+    ./include/atomic.h: In member function 'size_t ceph::atomic_t::dec()':
+    ./include/atomic.h:46:5: warning: control reaches end of non-void function [-Wreturn-type]
+         }
+         ^
+    make[5]: *** [cls/user/cls_user_client.o] Error 1
+    ~~~~
+
+    Signed-off-by: Dmitry Smirnov <onlyjob at member.fsf.org>
+    (cherry picked from commit 74218f3d6ca8ca9943ff9d08b7926e38fb13b329)
+
+commit a0c12b70d93604cde59fc21b4d42cae6bd0f4f26
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Mon Mar 31 14:49:50 2014 -0700
+
+    atomic_t: add atomic64_t
+
+    Signed-off-by: Yehuda Sadeh <yehuda at inktank.com>
+    (cherry picked from commit bf3ba6001c7b4cf37edfe6551d3ef298ebcbf421)
+
+commit 5a8c8c01cac7f8ef8b898a88cac96af973350a3d
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 30 13:40:33 2014 -0700
+
+    test/cli-integration/rbd: fix trailing space
+
+    Newer versions of json.tool remove the trailing ' ' after the comma.  Add
+    it back in with sed so that the .t works on both old and new versions, and
+    so that we don't have to remove the trailing spaces from all of the test
+    cases.
+
+    Backport: firefly
+    Fixes: #8920
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 605064dc685aa25cc7d58ec18b6449a3ce476d01)
+
+    Conflicts:
+	src/test/cli-integration/rbd/defaults.t
+
+commit 234b2d1933f7f403c094a3c65bf912fcee688181
+Author: John Spray <jspray at redhat.com>
+Date:   Mon Jul 7 15:45:54 2014 +0100
+
+    tests: don't depend on 'data' pool in rbd test
+
+    Since we removed the default 'data' and 'metadata' pools,
+    tests which need a pool should create it themselves.
+
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit a7a631d1e284f151e305f770cef2042a1b9f86c0)
+
+commit 751258db76d9f5288ff42e8e961a9ffea1d226de
+Author: Xiaoxi Chen <xiaoxi.chen at intel.com>
+Date:   Mon Jul 28 16:54:48 2014 +0800
+
+    PGMonitor: fix bug in caculating pool avail space
+
+    Currently for pools with different rules, "ceph df" cannot report
+    right available space for them, respectively. For detail assisment
+    of the bug ,pls refer to bug report #8943
+
+    This patch fix this bug and make ceph df works correctlly.
+
+    Fixes Bug #8943
+
+    Signed-off-by: Xiaoxi Chen <xiaoxi.chen at intel.com>
+    (cherry picked from commit 04d0526718ccfc220b4fe0c9046ac58899d9dafc)
+
+commit 7b1546cc5c361a1af7f724e3c3b7ca9436bad76f
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 28 13:59:47 2014 -0700
+
+    mon: set min_size to data chunk count for erasure pools
+
+    Make the min_size value meaningful for erasure pools.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e06c58c9b8f585d2fe7c97d010aa0aa61c09d609)
+
+commit e859587911edddd3a5b7fd96ee2f6a7ed77478dc
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun May 11 13:36:03 2014 -0700
+
+    mon: include 'max avail' in df output
+
+    Include an estimate of the maximum writeable space for each pool.  Note
+    that this value is a conservative estimate for that pool based on the
+    most-full OSD.  It is also potentially misleading as it is the available
+    space if *all* new data were written to this pool; one cannot (generally)
+    add up the available space for all pools.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 7a9652b58ea70f9a484a135bde20d872616c5947)
+
+commit a5e0ebc36ccbdf36e733e5eab926e4446a48fbd8
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun May 11 13:31:14 2014 -0700
+
+    mon: right justify df values
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 2f63a309df4b7086725949bc0a532595cf927edf)
+
+commit 3d578479420f4b0c153dffe96605bf413070ad45
+Author: John Spray <john.spray at inktank.com>
+Date:   Thu May 8 11:04:46 2014 +0100
+
+    mon: Fix % escaping (\% should be %%)
+
+    Clang's -Wpedantic points this out.
+
+    Signed-off-by: John Spray <john.spray at inktank.com>
+    (cherry picked from commit f0231ef364d531eb60351598c4a0f5fa6efad23c)
+
+    Conflicts:
+	src/mon/DataHealthService.cc
+
+commit 6164c3ef8d9ced38d878c191e4de3d84a8bda45e
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed May 28 13:49:52 2014 -0700
+
+    crush: add get_rule_weight_map
+
+    Calculate a weight map of OSDs for a given rule.
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 297f6169feecd20e121d102e1b63a505c8b3e74a)
+
+commit 2f90bfdb854750990881f2f53492687a07b19546
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Wed Jul 9 11:20:36 2014 +0000
+
+    Fix the PG listing issue which could miss objects for EC pool (where there is object shard and generation).
+    Backport: firefly
+    Signed-off-by: Guang Yang (yguang at yahoo-inc.com)
+
+    (cherry picked from commit 228760ce3a7109f50fc0f8e3c4a5697a423cb08f)
+
+commit 61c90252c3a496e09962cfda2eb11e6bd112af8a
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 25 14:48:10 2014 -0700
+
+    osd/ReplicatedPG: requeue cache full waiters if no longer writeback
+
+    If the cache is full, we block some requests, and then we change the
+    cache_mode to something else (say, forward), the full waiters don't get
+    requeued until the cache becomes un-full.  In the meantime, however, later
+    requests will get processed and redirected, breaking the op ordering.
+
+    Fix this by requeueing any full waiters if we see that the cache_mode is
+    not writeback.
+
+    Fixes: #8931
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8fb761b660c268e2264d375a4db2f659a5c3a107)
+
+commit f701688a360fd977b5e1f59518622ab6d2299a08
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 25 14:43:48 2014 -0700
+
+    osd/ReplicatedPG: fix cache full -> not full requeueing when !active
+
+    We only want to do this if is_active().  Otherwise, the normal
+    requeueing code will do its thing, taking care to get the queue orders
+    correct.
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 36aaab9eee7ed41a46a4ac27376d630a29de5eb9)
+
+commit a1ddce36ebf1ce479129def364328486fbcc5c86
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jul 30 14:50:37 2014 -0700
+
+    qa/workunits/cephtool/test_daemon.sh: verify ceph -c works with daemon
+
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit aa9ae1f270293778aa937e7f7e4bcaee3099b9b2)
+
+commit 50a1c08e46eaedd3d81a52f64923228bc8a81c26
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jul 30 14:49:02 2014 -0700
+
+    qa/workunits/cephtool/test_daemon.sh: typo
+
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 22d20f39b7355966554319d5a1aa888967607569)
+
+commit 4cfb7dbc5c8fe1a28fb945fa12d9795943db1db5
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Jul 30 14:48:28 2014 -0700
+
+    qa/workunits/cephtool/test_daemon.sh: allow local ceph command
+
+    (cherry picked from commit 97a8d5a9fdbd3a25cc922c242ee57da58c57d0bc)
+
+commit 120b5d5ad51fa47a2bb0a144821635f5f81b5a2e
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Mon Jul 28 21:28:42 2014 -0700
+
+    ceph.in: Pass global args to ceph-conf for proper lookup
+
+    Fixes: #8944
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 6d89a99648630f81b85ad115fe7662dba6b08a55)
+
+commit e0c27cd7fde84944fd350f7df89e79d9a39ace98
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 16 17:55:36 2014 -0700
+
+    qa/workunits/cephtool/test.sh: test osd pool get erasure_code_profile
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit ce9f12d7a2202948532fed9da4d763ed03f6b8fa)
+
+    Conflicts:
+	qa/workunits/cephtool/test.sh
+
+commit cf22759cdf1c0a6d258e5c0a2d32268ce051c742
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Wed Jul 16 17:48:34 2014 -0700
+
+    mon: OSDMonitor: add "osd pool get <pool> erasure_code_profile" command
+
+    Enable us to obtain the erasure-code-profile for a given erasure-pool.
+
+    Signed-off-by: Ma Jianpeng <jianpeng.ma at intel.com>
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit e8ebcb79a462de29bcbabe40ac855634753bb2be)
+
+commit b94d2f142db63bdf395d8288f8dcef1558d30eaf
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 23 18:25:53 2014 -0700
+
+    osd/ReplicatedPG: observe INCOMPLETE_CLONES in is_present_clone()
+
+    We cannot assume that just because cache_mode is NONE that we will have
+    all clones present; check for the absense of the INCOMPLETE_CLONES flag
+    here too.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 63abf11390bb9b8dd604aae2b3e90596f9ab65ac)
+
+commit 22cc1b643f83edbfc0475f6da89cf4bd4c89aae1
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 23 18:24:51 2014 -0700
+
+    osd/ReplicatedPG: observed INCOMPLETE_CLONES when doing clone subsets
+
+    During recovery, we can clone subsets if we know that all clones will be
+    present.  We skip this on caching pools because they may not be; do the
+    same when INCOMPLETE_CLONES is set.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 41364711a66c89ce2e94435fe0d54eeda6092614)
+
+commit c42232e3539fc4682e8fec3e064b21acbcc996ed
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 23 18:23:56 2014 -0700
+
+    osd/ReplicatedPG: do not complain about missing clones when INCOMPLETE_CLONES is set
+
+    When scrubbing, do not complain about missing cloens when we are in a
+    caching mode *or* when the INCOMPLETE_CLONES flag is set.  Both are
+    indicators that we may be missing clones and that that is okay.
+
+    Fixes: #8882
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 956f28721dd98c5fb9eb410f4fe9e320b3f3eed3)
+
+commit bde3a9f0f610e6af30066dd77949a1249cd658bf
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jul 23 18:21:38 2014 -0700
+
+    osd/osd_types: add pg_pool_t FLAG_COMPLETE_CLONES
+
+    Set a flag on the pg_pool_t when we change cache_mode NONE.  This
+    is because object promotion may promote heads without all of the clones,
+    and when we switch the cache_mode back those objects may remain.  Do
+    this on any cache_mode change (to or from NONE) to capture legacy
+    pools that were set up before this flag existed.
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 54bf055c5dadc55acf5731e08712d529b180ffc5)
+
+commit f19aa8ef0a2cbad7af3135defc1fe3485d377409
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Jul 11 00:40:47 2014 +0100
+
+    qa/workunits: cephtool: adjust pool name where missing as it has changed
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 50e93c2138978f7f7c2fbafacc1611c8705a8eab)
+
+commit 163440a764a6fac8f2efbee6a8aee5cbc460dfe6
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Jul 11 00:41:01 2014 +0100
+
+    qa/workunits: cephtool: cleanup after pool creation
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 6cd345732b15e84de17d743e06bc4d85569b79d4)
+
+commit c71c99ff21063e26ebfef431f916463f5606aae2
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 8 19:22:49 2014 +0100
+
+    qa/workunits: cephtool: pool needs to be a tier to be used as such
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 704b0a33f2071eabeb8c5b000a6805ef6d498961)
+
+commit ba0a9bf013e8d056a4126b6840621e5a3a8b37fc
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jul 8 19:22:01 2014 +0100
+
+    qa/workunits: cephtool: test erroneous 'tier remove'
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 49db6767152092d503ccf8ead6f7cb069e152a22)
+
+commit ffec081a551817288303cf3fa00c016bbffe114a
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Jul 3 15:32:46 2014 +0100
+
+    qa/workunits: cephtool: test get/set on both tier and non-tier pools
+
+    Make sure gets and sets of tiering-specific variables succeed on tier
+    pools and fail on non-tier pools.
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 9fea033f30aec44a3273c623ec6c93eb1d7dd26b)
+
+commit 55166c3a098d8751ed6dafb3541e45a6439c5491
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Jul 3 15:24:51 2014 +0100
+
+    qa/workunits: cephtool: split get/set on tier pools from get/set tests
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit df5944955d96c041e65964a13b802028e9700904)
+
+commit 0425eb1dbd156d03a51e91c6f3079b8a687d62f3
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri Jun 27 22:20:51 2014 +0100
+
+    qa/workunits: cephtool: test for 'osd pool {get,set}-quota'
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit b927c0de7d5c7a78bf3c133be52cbc1d769974bb)
+
+commit 68197bc28c8960db67c4246d50eb5146659593bd
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Mon Jun 30 17:51:47 2014 +0100
+
+    mon: OSDMonitor: 'osd pool' - if we can set it, we must be able to get it
+
+    Add support to get the values for the following variables:
+     - target_max_objects
+     - target_max_bytes
+     - cache_target_dirty_ratio
+     - cache_target_full_ratio
+     - cache_min_flush_age
+     - cache_min_evict_age
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit ddc04c83ff6842ca0b2f804b46099ea729b9fb6b)
+
+commit 01498ce8c897f7e3b66c8054a8b144a505a33010
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 1 08:42:58 2014 +0200
+
+    qa: support running under non privileged user
+
+    If the test is run against a cluster started with vstart.sh (which is
+    the case for make check), the --asok-does-not-need-root disables the use
+    of sudo and allows the test to run without requiring privileged user
+    permissions.
+
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 522174b066044e51a7019bd6cad81117e83c394e)
+
+commit 99259dff5bad93dce928c1ec07a16b34e3dac3dc
+Author: Sage Weil <sage at inktank.com>
+Date:   Mon Jun 30 16:38:10 2014 -0700
+
+    qa/workunits/cephtool/test.sh: sudo ceph daemon
+
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bcc09f93761d46202742ca85cce498a352edd494)
+
+commit 4f911d45632fd23c4124bf6b29287ece473d33b4
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 25 21:25:29 2014 +0100
+
+    qa/workunits: cephtool: fix 'osd bench' test
+
+    Commit 7dc93a9651f602d9c46311524fc6b54c2f1ac595 fixed an incorrect
+    behavior with the OSD's 'osd bench' value hard-caps.  The test wasn't
+    appropriately modified unfortunately.
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 48e38ac6323f4a0e06b0dedd37ecd10dc339b1e3)
+
+commit bad2f513c5bed4602005eaedff9384012103aaee
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 25 01:48:24 2014 +0100
+
+    qa/workunits: cephtool: only run heap profiler test if tcmalloc enabled
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 4b0809a13eb363a15e52a6a57372a0a31a64cef8)
+
+commit 26f9860d19c38595bfced76fce864fe9ad9f3a27
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jun 24 23:16:17 2014 +0100
+
+    qa/workunits: cephtool: set +e for the tcmalloc tests
+
+    Avoids failing the tests when tcmalloc is not present
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 5c4616e100297ba8639919aca7a9cb59e4bda54a)
+
+commit a0720b608db208ac766df8eea53bdbba31d79492
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jun 24 22:47:31 2014 +0100
+
+    qa/workunits: cephtool: delete unnecessary function calls
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 67255435151627314cc2fc38732d4fb5efddc3cc)
+
+commit 373224729e9ab2a46afb43b1388d37ff951cc42e
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jun 24 22:46:44 2014 +0100
+
+    qa/workunits: cephtool: disable bash debug when not running tests
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 946bd0dad4b027326b03c13405782b99ef0f91b2)
+
+commit 52d733c7202b393b3b7da48e3aa6db275946757a
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jun 24 22:39:34 2014 +0100
+
+    qa/workunits: cephtool: allow running individual tests
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 5d26575ef2d31d745ec4aa69ca1501cd76e5e8db)
+
+commit 96e58d6d38969ba8b47b1924205eb34850a24ed6
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Jun 24 20:55:27 2014 +0100
+
+    qa/workunits: cephtool: cleanup state after erasure-code-profile test
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit f4184086d0d647e064e34308f678ef889e13c373)
+
+commit 4cd5d179375c06a25f04ef8150e2a53aabf7427e
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 25 01:17:58 2014 +0100
+
+    qa/workunits: cephtool: add/remove comments
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 780424df3a107c7da57fc28d64f9e7a4bb47f8e8)
+
+commit 5bcf690b1dbf5a2e4388661f9d280b5934db1c9c
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Thu Jun 26 00:55:46 2014 +0100
+
+    qa/workunits: cephtool: split into properly indented functions
+
+    The test was a big sequence of commands being run and it has been growing
+    organically for a while, even though it has maintained a sense of
+    locality with regard to the portions being tested.
+
+    This patch intends to split the commands into functions, allowing for a
+    better semantic context and easier expansion.  On the other hand, this
+    will also allow us to implement mechanisms to run specific portions of
+    the test instead of always having to run the whole thing just to test a
+    couple of lines down at the bottom (or have to creatively edit the test).
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 3d14a96f4b2b7094d05ead1dec7547d165857e31)
+
+    Conflicts:
+	qa/workunits/cephtool/test.sh
+
+commit 2af751807d1b51348302734c46d506db294303fd
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 25 01:12:55 2014 +0100
+
+    qa/workunits: cephtool: move test line to where it's more appropriate
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 04658b7b2b5f98ae81ffb3f77303745e6d46eb81)
+
+commit 5bf9e3c7b59d7ce5996d4d05312b4a92f34bbcb6
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jun 25 01:11:52 2014 +0100
+
+    qa/workunits: cephtool: split into functions
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit db6cc133ba4bb38b3c11eb835fd3983dc2f6b00e)
+
+    Conflicts:
+	qa/workunits/cephtool/test.sh
+
+commit c898c9736950437256b8c261106f2827fc160e01
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jun 20 09:38:39 2014 +0200
+
+    mon: test that pools used in tiers cannot be removed
+
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 39a4b78177cb9896ff35ab05bcf8774bfc934f3a)
+
+commit 5b72674238db80e62cf3d5cec1d94be5c0102388
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Fri May 23 17:02:23 2014 +0100
+
+    qa/workunits/cephtool: test setting options using SI units
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 38405d3554dfb0caf2b0a2c010b95a61bdb99349)
+
+    Conflicts:
+	qa/workunits/cephtool/test.sh
+
+commit aacf67d13f81fcc88881091d175fee9ecb0f8954
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jul 2 20:19:19 2014 +0100
+
+    mon: OSDMonitor: be scary about inconsistent pool tier ids
+
+    We may not crash your cluster, but you'll know that this is not something
+    that should have happened.  Big letters makes it obvious.  We'd make them
+    red too if we bothered to look for the ANSI code.
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 8e5a8daf98052954f3880d2d3516841b5062466b)
+
+commit af59cbf5854bd0fabeb0ef394d7d5b1207bbd6d3
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jul 2 19:47:52 2014 +0100
+
+    osd: pg_pool_t: clear tunables on clear_tier()
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 64bdf6c92bc44adad5a49b9dc4f674789cee80b0)
+
+commit 8f788e14d22c913479630bce9f9c502ac900328c
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Wed Jul 2 19:46:48 2014 +0100
+
+    mon: OSDMonitor: limit tier-specific pool set/get on non-tier pools
+
+    Fixes: 8696
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit f131dfbaedf6f451572e7aa3a83f653912122953)
+
+commit 4b768a8fe9146e6ec033d4f6780e0ef373fcfd7a
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 24 10:06:31 2014 -0700
+
+    mon/OSDMonitor: improve no-op cache_mode set check
+
+    If we have a pending pool value but the cache_mode hasn't changed, this is
+    still a no-op (and we don't need to block).
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 67d13d76f5692fa20649ea877f254c34094c11f6)
+
+commit c3f403293c7f8d946f66a871aa015a558120ce78
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Sat May 3 03:42:19 2014 +0100
+
+    mon: OSDMonitor: disallow nonsensical cache-mode transitions
+
+    Fixes: 8155
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit fd970bbc95d89bf66c9551feca17ac0afbf4d1e2)
+
+commit d9aacd96acfe24b15c4e3b2441838945de1ab720
+Author: Joao Eduardo Luis <joao.luis at inktank.com>
+Date:   Tue Apr 29 18:03:56 2014 +0100
+
+    mon: OSDMonitor: return immediately if 'osd tier cache-mode' is a no-op
+
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit d01aa5bff30441eec1ffaa3e59a21187f8478475)
+
+commit 981add9cad5f2db06a4932be228eb0ff30254a9b
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 22 18:01:14 2014 -0700
+
+    osd/ReplicatedPG: debug obc locks
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 356af4bf46d6387e2f1a59646548f9a77e49e5f8)
+
+commit e32e2559c8ff408fff81cce0f15d6601dcd4a2f7
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 22 13:16:11 2014 -0700
+
+    osd/ReplicatedPG: greedily take write_lock for copyfrom finish, snapdir
+
+    In the cases where we are taking a write lock and are careful
+    enough that we know we should succeed (i.e, we assert(got)),
+    use the get_write_greedy() variant that skips the checks for
+    waiters (be they ops or backfill) that are normally necessary
+    to avoid starvation.  We don't care about staration here
+    because our op is already in-progress and can't easily be
+    aborted, and new ops won't start because they do make those
+    checks.
+
+    Fixes: #8889
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6fe27823b8459271bf0c0e807493bb7cf1e4559b)
+
+commit 68651e9137df2b1034a5b470bbb2fc1d19d8debb
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jul 22 13:11:42 2014 -0700
+
+    osd: allow greedy get_write() for ObjectContext locks
+
+    There are several lockers that need to take a write lock
+    because there is an operation that is already in progress and
+    know it is safe to do so.  In particular, they need to skip
+    the starvation checks (op waiters, backfill waiting).
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 09626501d7a0ff964027fd7a534465b76bad23cb)
+
+commit a2681c93fb30b912f653b596e27eb8b1bc5c6b78
+Author: Sage Weil <sage at inktank.com>
+Date:   Wed Jul 2 10:38:43 2014 -0700
+
+    qa/workunits/rest/test.py: make osd create test idempotent
+
+    Avoid possibility that we create multiple OSDs do to retries by passing in
+    the optional uuid arg.  (A stray osd id will make the osd tell tests a
+    few lines down fail.)
+
+    Fixes: #8728
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit bb3e1c92b6682ed39968dc5085b69c117f43cbb0)
+
+commit 7a58da53ebfcaaf385c21403b654d1d2f1508e1a
+Author: Lluis Pamies-Juarez <lluis at pamies.cat>
+Date:   Wed Jun 18 10:00:09 2014 -0700
+
+    enforce rados put aligment
+
+    Signed-off-by: Lluis Pamies-Juarez <lluis.pamies-juarez at hgst.com>
+    (cherry picked from commit 304b08a23a3db57010078046955a786fe3589ef8)
+    (cherry picked from commit dece65064d949b5afcc359cd408615883b5e002a)
+
+commit 7ae15549a795ffd9ffcd34ea1d5c101b90eee26d
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 31 15:39:40 2014 -0700
+
+    use llrintl when converting double to micro
+
+    This avoids rounding error (noticeable on i386).
+
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 80911736bd61b6b88eac0974d24f21c15c5385a4)
+
+    Conflicts:
+	src/mon/OSDMonitor.cc
+
+commit f5fc24368756c794d186a0990241e0dc0adfc03c
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 24 18:22:22 2014 -0700
+
+    msg/SimpleMessenger: drop local_conneciton priv link on shutdwon
+
+    This breaks ref cycles between the local_connection and session, and let's
+    us drop the explicit set_priv() calls in OSD::shutdown().
+
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 63c1711a9e237c14d137131f56751970ad1567b1)
+
+commit b6d8feab85fda97bf3a68980249a71846778a157
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jun 19 00:49:13 2014 +0200
+
+    erasure-code: create default profile if necessary
+
+    After an upgrade to firefly, the existing Ceph clusters do not have the
+    default erasure code profile. Although it may be created with
+
+       ceph osd erasure-code-profile set default
+
+    it was not included in the release notes and is confusing for the
+    administrator.
+
+    The *osd pool create* and *osd crush rule create-erasure* commands are
+    modified to implicitly create the default erasure code profile if it is
+    not found.
+
+    In order to avoid code duplication, the default erasure code profile
+    code creation that happens when a new firefly ceph cluster is created is
+    encapsulated in the OSDMap::get_erasure_code_profile_default method.
+
+    Conversely, handling the pending change in OSDMonitor is not
+    encapsulated in a function but duplicated instead. If it was a function
+    the caller would need a switch to distinguish between the case when goto
+    wait is needed, or goto reply or proceed because nothing needs to be
+    done. It is unclear if having a function would lead to smaller or more
+    maintainable code.
+
+    http://tracker.ceph.com/issues/8601 Fixes: #8601
+
+    Backport: firefly
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 4e1405e7720eda71a872c991045ac8ead6f3e7d8)
+
+commit 2fff5f031b2cc00b55bd1ada4f83e4838fe59ddd
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Jan 13 17:54:08 2014 +0100
+
+    common: s/stringstream/ostream/ in str_map
+
+    There is no need to specialize more than ostream : it only makes it
+    impossible to use cerr or cout as a parameter to str_map.
+
+    Reviewed-By: Christophe Courtaut <christophe.courtaut at gmail.com>
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 6aa45b133956b974a992b372496b90c908d94f12)
+
+commit d48a737a6f8daa463ddf82106455b2efe7715a33
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jun 2 13:44:49 2014 -0700
+
+    osd/: in scrub, check for and remove obsolete rollback objs
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 953c33edb640f6eb0c3f3a0d07c061c0d324242b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 30 16:53:37 2014 -0700
+
+    osd/: plumb rollback_trim_to through interfaces and messages
+
+    We simply trim the roll back info up to min_last_complete_ondisk
+    since we cannot correctly rollback past that point anyway!
+
+    ReplicatedPG
+    -> PGBackend::submit_transaction
+    -> Backend messages
+    -> PGBackend::Listener::log_operation
+    -> append_log
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit ac11ca40b4f4525cbe9b1778b1c5d9472ecb9efa
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 30 16:27:32 2014 -0700
+
+    PGLog: add rollback_info_trimmed_to_riter to IndexedLog and use in PG
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 2207ed12fa544afc48d6d28f199381ccf0367292
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 30 15:40:15 2014 -0700
+
+    PGLog: fix logging whitespace in trim
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit d72eec0341e02881229d0e4ffeafcae92eb33fb6
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jun 27 10:51:13 2014 -0700
+
+    PG: block outgoing peering messages until the last interval is durable
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit f9f89be38333d3817a0eafc52a961365e21e1f3a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed May 21 13:09:33 2014 -0700
+
+    PG: add machinery to temporarily buffer outgoing recovery messages
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit f7498124325fe2269c33e45fae4c8181c8f7be14
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Jun 9 11:00:32 2014 -0700
+
+    os/: add async flush_commit() method to Sequencer and implementations
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 669b60571d6db9a9f74020e6a43b12b82edee41e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri May 30 15:18:53 2014 -0700
+
+    PGLog: initialize complete_to
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 8679cdbeea6350fd860a9419f54578a90482895c
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu May 29 12:10:31 2014 -0700
+
+    osd_types: add pg_log_t::rollback_info_trimmed_to
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 3bbe29eb5cca7cc42266a6c5561ce68feb4072de
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue May 20 16:05:01 2014 -0700
+
+    common/Finisher: add queue(list<Context*>&)
+
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
diff --git a/doc/changelog/v0.80.7.txt b/doc/changelog/v0.80.7.txt
new file mode 100644
index 0000000..fd49a5b
--- /dev/null
+++ b/doc/changelog/v0.80.7.txt
@@ -0,0 +1,70 @@
+commit 6c0127fcb58008793d3c8b62d925bc91963672a3 (tag: refs/tags/v0.80.7, refs/remotes/gh/firefly)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Tue Oct 14 12:10:38 2014 -0700
+
+    0.80.7
+
+commit fa599aad2d79e0bbc19e4f6a2ac6771b37bf6beb
+Merge: 805a4ff b8d2fc7
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Oct 13 10:34:47 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-7588-firefly' into firefly
+
+commit 805a4ff3f32c60798d01beef80e0702a4e9d82ee
+Merge: 4a3bc78 c5fd2d0
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Oct 13 10:34:34 2014 -0700
+
+    Merge remote-tracking branch 'upstream/wip-9696-firefly' into firefly
+
+commit b8d2fc72ea54eb17611d7ac90be4da6c4e4e7485
+Author: Sage Weil <sage at inktank.com>
+Date:   Thu May 8 14:19:22 2014 -0700
+
+    osd/ReplicatedPG: carry CopyOpRef in copy_from completion
+
+    There is a race with copy_from cancellation.  The internal Objecter
+    completion decodes a bunch of data and copies it into pointers provided
+    when the op is queued.  When we cancel, we need to ensure that we can cope
+    until control passes back to our provided completion.
+
+    Once we *do* get into the (ReplicatedPG) callbacks, we will bail out
+    because the tid in the CopyOp or FlushOp no longer matches.
+
+    Fix this by carrying a ref to keep the copy-from targets alive, and
+    clearing out the tids that we cancel.
+
+    Note that previously, the trigger for this was that the tid changes when
+    we handle a redirect, which made the op_cancel() call fail.  With the
+    coming Objecter changes, this will no longer be the case.  However, there
+    are also locking and threading changes that will make cancellation racy,
+    so we will not be able to rely on it always preventing the callback.
+    Either way, this will avoid the problem.
+
+    Fixes: #7588
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 589b639af7c8834a1e6293d58d77a9c440107bc3)
+
+commit c5fd2d043ed4aa4fdb60fc19a284f51a86cef408 (refs/remotes/gh/wip-9696-firefly)
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Oct 9 16:21:18 2014 -0700
+
+    PG::choose_acting: in mixed cluster case, acting may include backfill
+
+    Fixes: 9696
+    Backport: firefly, giant
+    Introduced: 92cfd370395385ca5537b5bc72220934c9f09026
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 9b18d99817c8b54e30dff45047dfe1b29871d659)
+
+commit 4a3bc78c033ed68183f91824c7942dc54afb8797 (refs/remotes/gh/wip-9731-firefly)
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Oct 10 13:53:29 2014 -0700
+
+    PGLog::IndexedLog::trim(): rollback_info_trimmed_to_riter may be log.rend()
+
+    Fixes: #9731
+    Backport: giant, firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit d458b4f0f31161f561ff98e58ed979cf20c6f588)
diff --git a/doc/changelog/v0.80.8.txt b/doc/changelog/v0.80.8.txt
new file mode 100644
index 0000000..849e933
--- /dev/null
+++ b/doc/changelog/v0.80.8.txt
@@ -0,0 +1,2547 @@
+commit 69eaad7f8308f21573c604f121956e64679a52a7 (tag: refs/tags/v0.80.8)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Tue Jan 13 06:28:08 2015 -0800
+
+    0.80.8
+
+commit 3c7cacf00b66a0e17272cf67fe0823ee863dfa7c
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 19 16:43:02 2014 -0700
+
+    mon/OSDMonitor: fix double-free on old MOSDBoot
+    
+    send_latest() does an m->put().
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 97f9b6df668315fba6a5924b79024c7a986f4110)
+
+commit 852d7b5b3c019c02c042b767fc88916088e1a94d
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 8 11:17:03 2015 -0800
+
+    osd: requeue PG when we skip handling a peering event
+    
+    If we don't handle the event, we need to put the PG back into the peering
+    queue or else the event won't get processed until the next event is
+    queued, at which point we'll be processing events with a delay.
+    
+    The queue_null is not necessary (and is a waste of effort) because the
+    event is still in pg->peering_queue and the PG is queued.
+    
+    This is a firefly-specific patch; a (very) similar one will appear in master
+    in 492ccc900c3358f36b6b14a207beec071eb06707.
+    
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit c26ebd38335bb361aade5aacd05ba3217e602b9c
+Merge: b67b7e7 96ba529
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 8 18:31:26 2015 -0800
+
+    Merge pull request #3217 from boydc2014/firefly
+    
+    clear data and payload after removed from ops_in_flight
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit b67b7e7ad72a1af96f9fb26ade815e65f72b4cb0
+Merge: db92718 7faae89
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jan 9 01:32:17 2015 +0100
+
+    Merge pull request #3127 from ktdreyer/firefly-no-epoch
+    
+    Revert "ceph.spec.: add epoch"
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit db927186288cd4c63a3483b42e9eb9e016c96156
+Merge: 0d4abda 820dbfd
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jan 9 01:31:29 2015 +0100
+
+    Merge pull request #3128 from dachary/wip-10281-make-check-fedora-20
+    
+    tests: fixes to run make check on fedora 20
+    
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 0d4abdaf80f1fedff7975d595abaac0a620c8035
+Merge: 1fdcb52 11995b3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jan 9 01:30:59 2015 +0100
+
+    Merge pull request #3169 from ceph/wip-8797-firefly
+    
+    Wip 8797 firefly
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1fdcb524411a02b5627be66d9fd821a473223e9d
+Merge: 4b7b1b0 465eede
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jan 9 01:28:49 2015 +0100
+
+    Merge pull request #3179 from dachary/wip-9998-crush-underfloat-firefly
+    
+    crush: fix weight underfloat issue (firefly)
+    
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4b7b1b03bfcb7cb056783555884f211009ea5d46
+Merge: 4897ba4 f55b097
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jan 9 01:28:11 2015 +0100
+
+    Merge pull request #3220 from ceph/wip-mon-backports.firefly
+    
+    mon: backports for #9987 against firefly
+    
+    Reviewed-by: Joao Eduardo Luis <joao at redhat.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4897ba4a304bcac548b2121312cd7235c34dd5aa
+Merge: efe801f f20225c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jan 9 01:26:30 2015 +0100
+
+    Merge pull request #3258 from ceph/wip-10372-firefly
+    
+    osd: fix librados pool deletion race on firefly
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit efe801ff3a0d25243da18937c07b89227edbaac4
+Author: Warren Usui <warren.usui at inktank.com>
+Date:   Thu Dec 18 20:00:28 2014 -0800
+
+    If trusty, use older version of qemu
+    
+    Fixes #10319
+    Signed-off-by: Warren Usui <warren.usui at inktank.com>
+    (cherry-picked from 46a1a4cb670d30397979cd89808a2e420cef2c11)
+
+commit 96ba529ef8ce76e07b8444c94883afb3468d6762
+Author: Lei Dong <leidong at yahoo-inc.com>
+Date:   Tue Dec 30 21:02:45 2014 +0800
+
+    clear data and payload inside ops_in_flight_lock
+    
+    http://tracker.ceph.com/issues/9916 Fixes: #9916
+    Signed-off-by: Dong Lei <leidong at yahoo-inc.com>
+
+commit e0648e3d30de504b096c4ae3bbe7d9c17652bdb5
+Merge: 455f940 3624006
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 29 14:31:23 2014 -0800
+
+    Merge pull request #3264 from dachary/wip-jerasure-firefly
+    
+    erasure-code: update links to jerasure upstream
+
+commit 455f940908f242b1e34983af61351fd3045ce8ab
+Merge: b1ab685 aa95a2d
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 29 10:55:39 2014 -0800
+
+    Merge pull request #3268 from ceph/firefly-10415
+    
+    libcephfs/test.cc: close fd before umount
+
+commit 362400667aad0b5098fbe8dbec1b0bde059f84a6
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Dec 28 10:29:54 2014 +0100
+
+    erasure-code: update links to jerasure upstream
+    
+    It moved from bitbucket to jerasure.org
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 8e86f901939f16cc9c8ad7a4108ac4bcf3916d2c)
+
+commit aa95a2d20dbba2f3a775f709493c987d0d001e9c
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue Dec 23 10:22:00 2014 +0800
+
+    libcephfs/test.cc: close fd before umount
+    
+    Fixes: #10415
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit d3fb563cee4c4cf08ff4ee01782e52a100462429)
+
+commit f20225cb99a0d2d08fccfdf88dc89d758ecba077 (refs/remotes/gh/wip-10372-firefly)
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 23 15:49:26 2014 -0800
+
+    osdc/Objecter: handle reply race with pool deletion
+    
+    We need to handle this scenario:
+    
+     - send request in epoch X
+     - osd replies
+     - pool is deleted in epoch X+1
+     - client gets map X+1, sends a map check
+     - client handles reply
+       -> asserts that no map checks are in flight
+    
+    This isn't the best solution.  We could infer that a map check isn't needed
+    since the pool existed earlier and doesn't now.  But this is firefly and
+    the fix is no more expensive than the old assert.
+    
+    Fixes: #10372
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 820dbfd9947455d07426981b7152861c3c216080
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 5 15:11:18 2014 -0700
+
+    test/ceph-disk.sh: mkdir -p
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c2f58e6694a2457200ab3d59e037ad17b9c82028)
+
+commit 77d393024f9d867b574b8ec8e15ec48a1a291511
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Thu Sep 4 12:23:27 2014 +0200
+
+    test/ceph-disk.sh: resolve symlinks before check
+    
+    Make sure symlinks are resolved in command_fixture()
+    before compare result of which command and the current
+    path.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 8ea86dfa7c4a3d7e089cf9d4e49586657875f851)
+
+commit ed6ec2936513d7dd6c45bccd8edf69a12c71dc7b
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Tue Jun 24 19:54:17 2014 +0200
+
+    test/ceph-disk.sh: fix for SUSE
+    
+    On SUSE 'which' returns always the full path of (shell) commands and
+    not e.g. './ceph-conf' as on Debian. Add check also for full
+    path returned by which.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 39530536ff923b91899f6303507c283b78040a20)
+
+commit 754363f4563e7dbda1ef23fadc8d6ef1a3fdd0af
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jun 13 14:41:39 2014 +0200
+
+    tests: prevent kill race condition
+    
+    When trying to kill a daemon, keep its pid in a variable instead of
+    retrieving it from the pidfile multiple times. It prevents the following
+    race condition:
+    
+      * try to kill ceph-mon
+      * ceph-mon is in the process of dying and removed its pidfile
+      * try to kill ceph-mon fails because the pidfile is not found
+      * another ceph-mon is spawned and fails to bind the port
+        because the previous ceph-mon is still holding it
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit a1c13c57ba20fc329d943ea57523913e11067dc7)
+
+commit 5be6f2f60e3225bf3d214432044721fe474d55d7
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Wed Jun 25 00:31:48 2014 +0200
+
+    osd/OSD.cc: parse lsb release data via lsb_release
+    
+    Use lsb_release tool to be portable since parsing /etc/lsb-release
+    is not the same between different distributions. The old code failed
+    e.g. for SUSE products to parse LSB information.
+    
+    Fixes: #8654
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 0b3a3987d382ff33fdf892f189b30df22be80e59)
+
+commit b62187c52324a4489c2fc1385b1d6574a058f7e8
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Aug 26 21:59:39 2014 +0200
+
+    tests: histogram prevent re-use of local variables
+    
+    By moving the tests to separate functions.
+    
+    http://tracker.ceph.com/issues/9235 Fixes: #9235
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 4b8b25ecd128c34a386ad7c4cc89f323c4d384e1)
+
+commit e2741c8f1d42cfe91b18201a6a49005d90d85d98
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Aug 26 21:59:39 2014 +0200
+
+    tests: histogram prevent re-use of local variables
+    
+    By moving the test to a separate function.
+    
+    http://tracker.ceph.com/issues/9235 Fixes: #9235
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit ee02293ad2ef050672fa8c164ba17b10e8d4ceeb)
+
+commit cf102df7a3f3b38824c26b9e44a21664fcf979a7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 10 00:08:57 2014 +0100
+
+    tests: avoid tab interpretation problem on fedora 20
+    
+    Use . instead of tab in echo to avoid variations in how escape sequences
+    are interpreted by the shell.
+    
+    http://tracker.ceph.com/issues/10281 Fixes: #10281
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+
+commit f55b097764beb973c12866f2d7161c6bd870aa07 (refs/remotes/gh/wip-mon-backports.firefly)
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 2 08:50:59 2014 -0800
+
+    mon/PGMap and PGMonitor: update last_epoch_clean cache from new osd keys
+    
+    We were only invalidating the cached value from apply_incremental, which
+    is no longer called on modern clusters.
+    
+    Fix this by storing the update epoch in the key as well (it is not part
+    of osd_stat_t).
+    
+    Backport: giant, firefly, dumpling(?)
+    Fixes: #9987
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 093c5f0cabeb552b90d944da2c50de48fcf6f564)
+
+commit 1d314e7a9ab7af5b693583cf2faa5db54f6beb69
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 2 08:49:48 2014 -0800
+
+    mon/PGMap: invalidate cached min_last_epoch_clean from new-style pg keys
+    
+    We were only invalidating the cache from the legacy apply_incremental(),
+    which is no longer called on modern clusters.
+    
+    Fixes: #9987
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3fb731b722c50672a5a9de0c86a621f5f50f2d06)
+
+commit 465eedea9f7411b1e352dc3ccee60a3f1221541d
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 23 18:50:51 2014 -0800
+
+    crush/CrushWrapper: fix create_or_move_item when name exists but item does not
+    
+    We were using item_exists(), which simply checks if we have a name defined
+    for the item.  Instead, use _search_item_exists(), which looks for an
+    instance of the item somewhere in the hierarchy.  This matches what
+    get_item_weightf() is doing, which ensures we get a non-negative weight
+    that converts properly to floating point.
+    
+    Backport: giant, firefly
+    Fixes: #9998
+    Reported-by: Pawel Sadowski <ceph at sadziu.pl>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9902383c690dca9ed5ba667800413daa8332157e)
+
+commit cee51af9c1dbde550177c95caf6c93f612442300
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Nov 21 17:47:56 2014 -0800
+
+    crush/builder: prevent bucket weight underflow on item removal
+    
+    It is possible to set a bucket weight that is not the sum of the item
+    weights if you manually modify/build the CRUSH map.  Protect against any
+    underflow on the bucket weight when removing items.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8c87e9502142d5b4a282b94f929ae776a49be1dc)
+
+commit 7ccd5eec11e8cd945d24bf9f6390d6c3fa4a06de
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Nov 21 17:37:03 2014 -0800
+
+    crush/CrushWrapper: fix _search_item_exists
+    
+    Reported-by: Pawel Sadowski <ceph at sadziu.pl>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit eeadd60714d908a3a033aeb7fd542c511e63122b)
+
+commit b1ab685e00034751a161a3d5e0325c6581999c75
+Merge: dd7c8c2 ef3773a
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 12 06:19:50 2014 -0800
+
+    Merge pull request #3124 from ceph/wip-10194-firefly
+    
+    rgw: optionally call FCGX_Free() on the fcgi connection
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 11995b329045341c17553269267cfd3688a51b0f
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Wed Dec 10 13:19:53 2014 -0800
+
+    Call Rados.shutdown() explicitly before exit
+    
+    This is mostly a demonstration of good behavior, as the resources will
+    be reclaimed on exit anyway.
+    
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit b038e8fbf9103cc42a4cde734b3ee601af6019ea)
+
+commit e00270b51896f168d5013b7dc92ec7f8b9e19da3
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Wed Dec 10 13:19:16 2014 -0800
+
+    rados.py: remove Rados.__del__(); it just causes problems
+    
+    Recent versions of Python contain a change to thread shutdown that
+    causes ceph to hang on exit; see http://bugs.python.org/issue21963.
+    As it turns out, this is relatively easy to avoid by not spawning
+    threads on exit, as Rados.__del__() will certainly do by calling
+    shutdown(); I suspect, but haven't proven, that the problem is
+    that shutdown() tries to start() a threading.Thread() that never
+    makes it all the way back to signal start().
+    
+    Also add a PendingReleaseNote and extra doc comments to clarify.
+    
+    Fixes: #8797
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit 5ba9b8f21f8010c59dd84a0ef2acfec99e4b048f)
+    
+    Conflicts:
+    	PendingReleaseNotes
+
+commit 7faae891aefa4c21c50430fa03d9204a86d082f8
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Tue Dec 9 14:52:19 2014 -0700
+
+    Revert "ceph.spec.: add epoch"
+    
+    If ICE ships 0.80.8, then it will be newer than what RHCEPH ships
+    (0.80.7), and users won't be able to seamlessly upgrade via Yum.
+    
+    We have three options:
+    A) Revert the "Epoch: 1" change on the Firefly branch.
+    B) Revert the "Epoch: 1" change in the ICE packages.
+    C) Bump the Epoch to "2" in Red Hat's packages.
+    
+    This commit does Option A.
+    
+    Option B may or may not be feasible - it would require a "downstream"
+    change in ICE, and we haven't done that sort of thing before.
+    
+    Due to the RHEL release schedule, Option C is not available to us at
+    this point.
+    
+    This reverts commit b890c1e4706d7cfef7ed24c9df65b439b4f7ff1d.
+
+commit ef3773ac93413c644e056babce1971f846bbc276
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 26 15:18:07 2014 -0800
+
+    rgw: optionally call FCGX_Free() on the fcgi connection
+    
+    Fixes: #10194
+    
+    A new configurable controls this behavior. This forces disconnection of
+    the fcgi connection when done with the request.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit dd7c8c2bc6b2810ff7f483af940fa09dbe74e83a
+Merge: d759467 a597096
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Mon Dec 8 15:02:52 2014 -0800
+
+    Merge pull request #3109 from ceph/firefly-10263
+    
+    mds: store backtrace for straydir
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit d7594672b673796901961cc684c9e7de8dc2c95d
+Merge: adf9a75 73b47db
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Dec 8 13:19:44 2014 -0800
+
+    Merge pull request #3009 from dachary/wip-10018-primary-erasure-code-hinfo-firefly
+    
+    osd: deep scrub must not abort if hinfo is missing (firefly)
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit a5970963a2148697fc6da64facfbf6ab6686b9cd
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Nov 7 11:38:37 2014 +0800
+
+    mds: store backtrace for straydir
+    
+    Backport: giant, firefly, emperor, dumpling
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 0d89db5d3e5ae5d552d4058a88a4e186748ab1d2)
+
+commit adf9a758000182d27a6582d516356730d02e4099
+Merge: dea38a7 b4a4b75
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Dec 6 11:06:02 2014 -0800
+
+    Merge pull request #3089 from dachary/wip-10063-hobject-shard-firefly
+    
+    common: do not omit shard when ghobject NO_GEN is set (firefly)
+
+commit dea38a7af638c833304272c324ed2bc386a40f8f
+Merge: ccc8b46 5138091
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Dec 6 10:59:44 2014 -0800
+
+    Merge pull request #2480 from dachary/wip-9420-erasure-code-non-regression-firefly
+    
+    erasure-code: store and compare encoded contents (firefly)
+
+commit ccc8b46b2cdc55c1a861f092259ef36a1296f073
+Merge: bef363c cd3447d
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 17:33:05 2014 -0800
+
+    Merge pull request #3096 from dachary/wip-9785-dmcrypt-keys-permissions-firefly
+    
+    ceph-disk: dmcrypt file permissions (firefly)
+
+commit cd3447d04cabf6745001afeef69f25a92400cd0e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Dec 4 22:21:32 2014 +0100
+
+    ceph-disk: dmcrypt file permissions
+    
+    The directory in which key files are stored for dmcrypt must be 700 and
+    the file 600.
+    
+    http://tracker.ceph.com/issues/9785 Fixes: #9785
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 58682d1776ab1fd4daddd887d921ca9cc312bf50)
+
+commit bef363c1d1fc06fbb315024145a97a809a2471cd
+Merge: cb2c83b 9f3b21d
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 09:04:00 2014 -0800
+
+    Merge pull request #3086 from dachary/wip-10125-radosgw-init-firefly
+    
+    rgw: run radosgw as apache with systemd (firefly)
+
+commit b4a4b75e6d4deb6818681902f85baa9f63acdb4f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Nov 14 01:16:10 2014 +0100
+
+    common: do not omit shard when ghobject NO_GEN is set
+    
+    Do not silence the display of shard_id when generation is NO_GEN.
+    Erasure coded objects JSON representation used by ceph_objectstore_tool
+    need the shard_id to find the file containing the chunk.
+    
+    Minimal testing is added to ceph_objectstore_tool.py
+    
+    http://tracker.ceph.com/issues/10063 Fixes: #10063
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit dcf09aed121f566221f539106d10283a09f15cf5)
+    
+    Conflicts:
+    	src/test/ceph_objectstore_tool.py
+
+commit 9f3b21d1b70be591d68bfa57c3393e8f9af8e7df
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 2 18:10:48 2014 +0100
+
+    rgw: run radosgw as apache with systemd
+    
+    Same as sysv.
+    
+    http://tracker.ceph.com/issues/10125 Fixes: #10125
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 7b621f4abf63456272dec3449aa108c89504a7a5)
+    
+    Conflicts:
+    	src/init-radosgw.sysv
+
+commit cb2c83b2f216e503f7a52115f775bda1dbfe0c6a
+Merge: e2ec37b 02d4685
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Dec 4 11:32:18 2014 -0800
+
+    Merge pull request #3078 from ceph/wip-10030-firefly
+    
+    librbd: don't close an already closed parent image upon failure
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit e2ec37bf45fa5e7f5e787db9b67dbb2a98f2fbb7
+Merge: c4c63e8 af12194
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Dec 3 23:01:44 2014 -0800
+
+    Merge pull request #3063 from ceph/wip-10123-firefly
+    
+    librbd: protect list_children from invalid child pool IoCtxs
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c4c63e82cd7e4716315ca81208293a2567026c72
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 23 15:52:08 2014 -0700
+
+    ReplicatedPG: don't move on to the next snap immediately
+    
+    If we have a bunch of trimmed snaps for which we have no
+    objects, we'll spin for a long time.  Instead, requeue.
+    
+    Fixes: #9487
+    Backport: dumpling, firefly, giant
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit c17ac03a50da523f250eb6394c89cc7e93cb4659)
+
+commit 1b656450ca75b12fb98dee82bace914ef5f45c44
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Sep 23 16:21:33 2014 -0700
+
+    osd: initialize purged_snap on backfill start; restart backfill if change
+    
+    If we backfill a PG to a new OSD, we currently neglect to initialize
+    purged_snaps.  As a result, the first time the snaptrimmer runs it has to
+    churn through every deleted snap for all time, and to make matters worse
+    does so in one go with the PG lock held.  This leads to badness on any
+    cluster with a significant number of removed snaps that experiences
+    backfill.
+    
+    Resolve this by initializing purged_snaps when we finish backfill.  The
+    backfill itself will clear out any stray snaps and ensure the object set
+    is in sync with purged_snaps.  Note that purged_snaps on the primary
+    that is driving backfill will not change during this period as the
+    snaptrimmer is not scheduled unless the PG is clean (which it won't be
+    during backfill).
+    
+    If we by chance to interrupt backfill, go clean with other OSDs,
+    purge snaps, and then let this OSD rejoin, we will either restart
+    backfill (non-contiguous log) or the log will include the result of
+    the snap trim (the events that remove the trimmed snap).
+    
+    Fixes: #9487
+    Backfill: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 255b430a87201c7d0cf8f10a3c1e62cbe8dd2d93)
+
+commit 02d4685c56e129cb179a5ddfb8e87aefc2fce0b5
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Nov 6 05:01:38 2014 -0500
+
+    librbd: don't close an already closed parent image upon failure
+    
+    If librbd is not able to open a child's parent image, it will
+    incorrectly close the parent image twice, resulting in a crash.
+    
+    Fixes: #10030
+    Backport: firefly, giant
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 61ebfebd59b61ffdc203dfeca01ee1a02315133e)
+
+commit af121942d7bdfc59fcfae0429ffb12993e7e019d
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 17 21:49:26 2014 -0500
+
+    librbd: protect list_children from invalid child pool IoCtxs
+    
+    While listing child images, don't ignore error codes returned
+    from librados when creating an IoCtx. This will prevent seg
+    faults from occurring when an invalid IoCtx is used.
+    
+    Fixes: #10123
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0d350b6817d7905908a4e432cd359ca1d36bab50)
+
+commit c982da44e0e9e0be3c3d4e8f5e0a186fb2fcebb3
+Merge: 4a148df c4e4a31
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 30 10:12:04 2014 -0800
+
+    Merge pull request #3014 from dachary/wip-9665-ceph-disk-partprobe-firefly
+    
+    ceph disk zap must call partprobe
+
+commit c4e4a310f14ca3049ac90422aea95051fe0d4b15
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 10 10:26:31 2014 +0200
+
+    ceph-disk: use update_partition in prepare_dev and main_prepare
+    
+    In the case of prepare_dev the partx alternative was missing and is not
+    added because update_partition does it.
+    
+    http://tracker.ceph.com/issues/9721 Fixes: #9721
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 23e71b1ee816c0ec8bd65891998657c46e364fbe)
+    
+    Conflicts:
+    	src/ceph-disk
+
+commit e70a81464b906b9a304c29f474e6726762b63a7c
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Oct 9 18:52:17 2014 +0200
+
+    ceph-disk: run partprobe after zap
+    
+    Not running partprobe after zapping a device can lead to the following:
+    
+    * ceph-disk prepare /dev/loop2
+    * links are created in /dev/disk/by-partuuid
+    * ceph-disk zap /dev/loop2
+    * links are not removed from /dev/disk/by-partuuid
+    * ceph-disk prepare /dev/loop2
+    * some links are not created in /dev/disk/by-partuuid
+    
+    This is assuming there is a bug in the way udev events are handled by
+    the operating system.
+    
+    http://tracker.ceph.com/issues/9665 Fixes: #9665
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit fed3b06c47a5ef22cb3514c7647544120086d1e7)
+
+commit 5a5f427bc09076ef3fb13a710dede1b47bb232e0
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 10 10:23:34 2014 +0200
+
+    ceph-disk: encapsulate partprobe / partx calls
+    
+    Add the update_partition function to reduce code duplication.
+    The action is made an argument although it always is -a because it will
+    be -d when deleting a partition.
+    
+    Use the update_partition function in prepare_journal_dev
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 922a15ea6865ef915bbdec2597433da6792c1cb2)
+    
+    Conflicts:
+    	src/ceph-disk
+
+commit 73b47dbee8858f182fd2b4fd8eb5f3c786877bf4
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Nov 6 17:11:20 2014 +0100
+
+    osd: deep scrub must not abort if hinfo is missing
+    
+    Instead it should set read_error.
+    
+    http://tracker.ceph.com/issues/10018 Fixes: #10018
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 9d84d2e8309d26e39ca849a75166d2d7f2dec9ea)
+
+commit 5138091a4073d966a65f537280f89372e801d019
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Sep 23 11:38:09 2014 +0200
+
+    erasure-code: add corpus verification to make check
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit 8d3d6bf59aec3877c0231e637270e371d9ed3b8c
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 13 13:36:09 2014 +0200
+
+    erasure-code: workunit to check for encoding regression
+    
+    Clone the archive of encoded objects and decode all archived objects, up
+    to and including the current ceph version.
+    
+    http://tracker.ceph.com/issues/9420 Refs: #9420
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit 4f4358708ed3c261ca4027cc9c3dc3f952a99470
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 13 10:16:31 2014 +0200
+
+    erasure-code: store and compare encoded contents
+    
+    Introduce ceph_erasure_code_non_regression to check and compare how an
+    erasure code plugin encodes and decodes content with a given set of
+    parameters. For instance:
+    
+    ./ceph_erasure_code_non_regression \
+          --plugin jerasure \
+          --parameter technique=reed_sol_van \
+          --parameter k=2 \
+          --parameter m=2 \
+          --stripe-width 3181 \
+          --create \
+          --check
+    
+    Will create an encoded object (--create) and store it into a directory
+    along with the chunks, one chunk per file. The directory name is derived
+    from the parameters. The content of the object is a random pattern of 31
+    bytes repeated to fill the object size specified with --stripe-width.
+    
+    The check function (--check) reads the object back from the file,
+    encodes it and compares the result with the content of the chunks read
+    from the files. It also attempts recover from one or two erasures.
+    
+    Chunks encoded by a given version of Ceph are expected to be encoded
+    exactly in the same way by all Ceph versions going forward.
+    
+    http://tracker.ceph.com/issues/9420 Refs: #9420
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit 4a148df544978383c1ed7cd8b90f590adb563f3d
+Merge: c069bce 01faf13
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Wed Nov 19 02:45:26 2014 +0100
+
+    Merge pull request #2961 from ceph/wip-10114-firefly
+    
+    Add annotation to all assembly files to turn off stack-execute bit
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 01faf1356f648ded9acda02e7cc67c1adb9e9ee3
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Fri Nov 14 17:59:57 2014 -0800
+
+    Add annotation to all assembly files to turn off stack-execute bit
+    
+    See discussion in http://tracker.ceph.com/issues/10114
+    
+    Building with these changes allows output from readelf like this:
+    
+     $ readelf -lW src/.libs/librados.so.2 | grep GNU_STACK
+      GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000
+    0x000000 RW  0x8
+    
+    (note the absence of 'X' in 'RW')
+    
+    Fixes: #10114
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit 06a245a9845c0c126fb3106b41b2fd2bc4bc4df3)
+    (not-yet-present-in-firefly files in isa-l manually removed)
+
+commit c069bce4e8180da3c0ca4951365032a45df76468
+Merge: 0d8ad6a fac1654
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 13 10:36:12 2014 -0800
+
+    Merge pull request #2760 from ceph/wip-9835-firefly
+    
+    osd: fix erasure hung op bug (9835)
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit fac165475031efdebbb88898ca5c12cd307a5bc3
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Nov 5 12:12:14 2014 -0800
+
+    osd: use OSDMap helper to tell if ops are misdirected
+    
+    calc_pg_role doesn't actually take into account primary affinity.
+    
+    Fixes: #9835
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 588602bf0095de5b59064123ca01345f1364bdde
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Oct 20 13:55:33 2014 -0700
+
+    osd: discard rank > 0 ops on erasure pools
+    
+    Erasure pools do not support read from replica, so we should drop
+    any rank > 0 requests.
+    
+    This fixes a bug where an erasure pool maps to [1,2,3], temporarily maps
+    to [-1,2,3], sends a request to osd.2, and then remaps back to [1,2,3].
+    Because the 0 shard never appears on osd.2, the request sits in the
+    waiting_for_pg map indefinitely and cases slow request warnings.
+    This problem does not come up on replicated pools because all instances of
+    the PG are created equal.
+    
+    Fix by only considering role == 0 for erasure pools as a correct mapping.
+    
+    Fixes: #9835
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 0c1c4152e6f402af7612c8c8d4719ab0f4cc6ad9
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Nov 12 17:04:35 2014 -0800
+
+    osd/OSDMap: add osd_is_valid_op_target()
+    
+    Helper to check whether an osd is a given op target for a pg.  This
+    assumes that for EC we always send ops to the primary, while for
+    replicated we may target any replica.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 89c02637914ac7332e9dbdbfefc2049b2b6c127d)
+
+commit 0d8ad6ad3c376bcab981bea9a49e1924d7eddb68
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Tue Nov 11 18:16:02 2014 -0800
+
+    qa: allow small allocation diffs for exported rbds
+    
+    The local filesytem may behave slightly differently. This isn't
+    foolproof, but seems to be reliable enough on rhel7 rootfs, where
+    exact comparison was failing.
+    
+    Fixes: #10002
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit e94d3c11edb9c9cbcf108463fdff8404df79be33)
+
+commit 0804deeab293e09123d1b58825051ccc4dddbc0e
+Author: Sage Weil <sage at inktank.com>
+Date:   Sun May 25 08:38:38 2014 -0700
+
+    osd: fix map advance limit to handle map gaps
+    
+    The recent change in cf25bdf6b0090379903981fe8cee5ea75efd7ba0 would stop
+    advancing after some number of epochs, but did not take into consideration
+    the possibilty that there are missing maps.  In that case, it is impossible
+    to advance past the gap.
+    
+    Fix this by increasing the max epoch as we go so that we can always get
+    beyond the gap.
+    
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 1e0a82fd55dede473c0af32924f4bcb5bb697a2b)
+
+commit d30d6b986433eaef920b3703cf5af3c030f8dcf4
+Merge: d241aa7 d548431
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Fri Nov 7 14:10:18 2014 -0800
+
+    Merge pull request #2880 from ceph/wip-10025-firefly
+    
+    #10025/firefly -- tools: fix MDS journal import
+    
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+
+commit d548431a388da1130564d710e1f006772934224b
+Author: John Spray <john.spray at redhat.com>
+Date:   Fri Nov 7 11:34:43 2014 +0000
+
+    tools: fix MDS journal import
+    
+    Previously it only worked on fresh filesystems which
+    hadn't been trimmed yet, and resulted in an invalid
+    trimmed_pos when expire_pos wasn't on an object
+    boundary.
+    
+    Fixes: #10025
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit fb29e71f9a97c12354045ad2e128156e503be696)
+
+commit d241aa7a347655242cc71b8fa3d778df6948c494
+Merge: 2c85b5d 4afb542
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 6 10:37:42 2014 -0800
+
+    Merge remote-tracking branch 'origin/wip-sam-firefly-backports' into firefly
+
+commit 2c85b5d72953d01296213185382707122e06415c
+Merge: 23cbffa 1228658
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 6 10:30:20 2014 -0800
+
+    Merge pull request #2737 from ceph/wip-9629-firefly
+    
+    osd: do not clone/preserve snapdir on cache-evict (firefly backport)
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 23cbffaa2936dc2707b5b42f8c0e7ce804324ae2
+Merge: 3bba938 e296685
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 6 10:26:21 2014 -0800
+
+    Merge pull request #2657 from ceph/wip-9053-9301-firefly
+    
+    mon: backport two paxos fixes to firefly
+    
+    Reviewed-by: Joao Luis <joao at redhat.com>
+
+commit 3bba9387eb123c6cf055e874db2925b998dc406c
+Merge: 3f9bf73 835f8c6
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 6 10:21:12 2014 -0800
+
+    Merge pull request #2656 from ceph/wip-9502-firefly
+    
+    mon: backport mon disk full check to firefly
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 3f9bf738daf47ff4ff56c9f76d1487a5afc5e30a
+Merge: a340e6d 3e17a08
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 6 10:18:27 2014 -0800
+
+    Merge pull request #2764 from ceph/wip-9851
+    
+    osd: bring FileJournal in sync with giant
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit a340e6d0b166019f58dca0703faf30dd3178c14f
+Merge: b7d5f99 b9450b5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Nov 6 10:12:17 2014 -0800
+
+    Merge pull request #2776 from ceph/wip-9675.firefly
+    
+    CrushWrapper: pick a ruleset same as rule_id
+    
+    Reviewed-by: Samuel Just <sam.just at inktank.com>
+
+commit b7d5f99c8f4d751e83dc29305649d7a465c657b1
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 15 15:29:08 2014 -0700
+
+    ceph-disk: mount xfs with inode64 by default
+    
+    We did this forever ago with mkcephfs, but ceph-disk didn't.  Note that for
+    modern XFS this option is obsolete, but for older kernels it was not the
+    default.
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 11496399ef318498c11e551f139d96db52d3309c)
+
+commit 1a9d000bb679a7392b9dd115373c3827c9626694
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Oct 9 10:20:27 2014 -0700
+
+    rgw: set length for keystone token validation request
+    
+    Fixes: #7796
+    Backport: giany, firefly
+    Need to set content length to this request, as the server might not
+    handle a chunked request (even though we don't send anything).
+    
+    Tested-by: Mark Kirkwood <mark.kirkwood at catalyst.net.nz>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 3dd4ccad7fe97fc16a3ee4130549b48600bc485c)
+
+commit 49d27efde2ce5d282c9ee6ca9c8ea9db8f609392
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Aug 19 13:15:46 2014 -0700
+
+    rgw: subuser creation fixes
+    
+    Fixes: #8587
+    There were a couple of issues, one when trying to identify whether swift
+    user exists, we weren't using the correct swift id. The second problem
+    is that we relied on the gen_access flag in the swift case, where it
+    doesn't really need to apply.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 1441ffe8103f03c6b2f625f37adbb2e1cfec66bb)
+
+commit 8db2f0969e1715f57088c311a33e7e3499933afb
+Merge: 9a15592 2a5d7f0
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 31 08:35:50 2014 -0700
+
+    Merge pull request #2847 from dachary/wip-9752-past-intervals-firefly
+    
+    osd: past_interval display bug on acting
+
+commit 2a5d7f08303eb8b1687c5b58426443b3d40e415c
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 31 00:49:21 2014 +0100
+
+    osd: past_interval display bug on acting
+    
+    The acting array was incorrectly including the primary and up_primary.
+    
+    http://tracker.ceph.com/issues/9752 Fixes: #9752
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit c5f8d6eded52da451fdd1d807bd4700221e4c41c)
+
+commit 9a15592eae6739183049f8376392c5577145871e
+Merge: 6fd8879 c20a242
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Thu Oct 30 17:01:24 2014 -0700
+
+    Merge pull request #2840 from ceph/firefly-9869
+    
+    Backport "client: cast m->get_client_tid() to compare to 16-bit Inode::flushing_cap_tid"
+
+commit c20a2421f4a5b33407d7f31806dd4587b4e9077c
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Oct 22 17:16:31 2014 -0700
+
+    client: cast m->get_client_tid() to compare to 16-bit Inode::flushing_cap_tid
+    
+    m->get_client_tid() is 64 bits (as it should be), but Inode::flushing_cap_tid
+    is only 16 bits. 16 bits should be plenty to let the cap flush updates
+    pipeline appropriately, but we need to cast in the proper direction when
+    comparing these differently-sized versions. So downcast the 64-bit one
+    to 16 bits.
+    
+    Fixes: #9869
+    Backport: giant, firefly, dumpling
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit a5184cf46a6e867287e24aeb731634828467cd98)
+
+commit 4afb54274bb2087da348103d0a7641b3a018d777
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Sep 11 13:46:51 2014 -0700
+
+    ReplicatedPG: cancel cb on blacklisted watcher
+    
+    Fixes: #8315
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 16bd45777166c29c433af3b59254a7169e512d98)
+
+commit 037aa342fa277351fc605da41489a6ceba81ab05
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Sun Sep 21 10:19:43 2014 -0700
+
+    ReplicatedPG::on_removal: clear rollback info
+    
+    Fixes: #9293
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 544b8c7ffb4af01765b87239f2d7ab88479ee779)
+
+commit 8978c8dc1f153a9052b5d967ceff11d4f08d51ea
+Merge: 8401e7f 4be53d5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Oct 30 13:48:18 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-9574' into wip-sam-firefly-backports
+
+commit 8401e7ffa1768770f451143b3c110d1deae1bd40
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Sep 29 15:01:25 2014 -0700
+
+    PG: release backfill reservations if a backfill peer rejects
+    
+    Also, the full peer will wait until the rejection from the primary
+    to do a state transition.
+    
+    Fixes: #9626
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 624aaf2a4ea9950153a89ff921e2adce683a6f51)
+
+commit 5df09fa1b5a42992f9e41aca09e86db0d03d9fbd
+Merge: a0937ef a1aa06b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Oct 30 13:47:22 2014 -0700
+
+    Merge remote-tracking branch 'origin/wip-9113' into wip-sam-firefly-backports
+
+commit a0937ef214b9221e7a5e69e7b0f0697471d56293
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Oct 12 10:05:51 2014 -0700
+
+    osd/osd_types: consider CRUSH_ITEM_NONE in check_new_interval() min_size check
+    
+    Fixes: #9718
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d947050c82a511f91c98e1c76e48ffa9e187eee7)
+    
+    Conflicts:
+    	src/osd/osd_types.cc
+
+commit 35e8e6b2c1733cd421bf6c3916553eea3786e76e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Oct 20 14:10:58 2014 -0700
+
+    PG:: reset_interval_flush and in set_last_peering_reset
+    
+    If we have a change in the prior set, but not in the up/acting set, we go back
+    through Reset in order to reset peering state.  Previously, we would reset
+    last_peering_reset in the Reset constructor.  This did not, however, reset the
+    flush_interval, which caused the eventual flush event to be ignored and the
+    peering messages to not be sent.
+    
+    Instead, we will always reset_interval_flush if we are actually changing the
+    last_peering_reset value.
+    
+    Fixes: #9821
+    Backport: firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit d9ff3a6b789c5b9c77aefa3751bd808f5d7b8ca7)
+
+commit 3f35db42977704a12ac4b5bcad6261aaf6b6a88d
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Oct 23 09:11:28 2014 -0700
+
+    ReplicatedPG: writeout hit_set object with correct prior_version
+    
+    Fixes: #9875
+    Backport: giant, firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+    (cherry picked from commit 1a3ad307f1a4c0a956d6fd31d13f01ffe411a09d)
+
+commit 6fd88792e77cdc7ad33ff0acf9b3189a7c525430
+Merge: 0975ec9 afe6bd8
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Oct 26 20:37:52 2014 -0700
+
+    Merge pull request #2717 from dachary/wip-9747-ceph-spec-firefly
+    
+    rpm: 95-ceph-osd-alt.rules is not needed for centos7 / rhel7 (firefly)
+
+commit b9450b532ab7ad23ec6e2c22ed7cf55e6e1cc4c0
+Author: Xiaoxi Chen <xiaoxi.chen at intel.com>
+Date:   Wed Aug 20 15:35:44 2014 +0800
+
+    CrushWrapper: pick a ruleset same as rule_id
+    
+    Originally in the add_simple_ruleset funtion, the ruleset_id
+    is not reused but rule_id is reused. So after some add/remove
+    against rules, the newly created rule likely to have
+    ruleset!=rule_id.
+    
+    We dont want this happen because we are trying to hold the constraint
+    that ruleset == rule_id.
+    
+    Signed-off-by: Xiaoxi Chen <xiaoxi.chen at intel.com>
+    (cherry picked from commit 78e84f34da83abf5a62ae97bb84ab70774b164a6)
+    
+    Conflicts:
+    	src/test/erasure-code/TestErasureCodeIsa.cc
+    
+    Fixes: #9675
+
+commit 3e17a0872a3864cb6aee46959afd955ef0cbafeb
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Mon Jul 21 15:08:55 2014 +0800
+
+    os/FileJournal: When dump journal, using correctly seq avoid misjudging joural corrupt.
+    
+    In func FileJournal::dump, it always using seq=0 as last-seq and it can
+    misjudge the journal corrupt.
+    
+    Signed-off-by: Ma Jianpeng <jianpeng.ma at intel.com>
+    (cherry picked from commit 5f65b4db6d1dad7c2c5a09eab42af63a82ea9e9b)
+
+commit 350da8c98bc1e90cd392992aba290c7478280d88
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Sep 26 01:15:53 2014 +0200
+
+    os: io_event.res is the size written
+    
+    And not an error code to be converted with cpp_strerror()
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 7827e0035e3350ad2d9230f27a1629545f53af5c)
+
+commit ecff3761f3d15061a2cbf0a595ca249a4c424f4c
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Thu Aug 21 15:10:46 2014 +0800
+
+    os/FileJournal: For journal-aio-mode, don't use aio when closing journal.
+    
+    For jouranl-aio-mode when closing journal, the write_finish_thread_entry may exit before
+    write_thread_entry. This cause no one wait last aios to complete.
+    On some platform, after that the journal-header on journal corrupted.
+    To avoid this, when closing jouranl we don't use aio.
+    
+    Fixes: 9073
+    Reported-by: Mark Kirkwood <mark.kirkwood at catalyst.net.nz>
+    Tested-by: Mark Kirkwood <mark.kirkwood at catalyst.net.nz>
+    Signed-off-by: Ma Jianpeng <jianpeng.ma at intel.com>
+    (cherry picked from commit e870fd09ce846e5642db268c33bbe8e2e17ffef2)
+
+commit dbc33fbab4b35e2ce1e46a881f6714262502c243
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Thu Aug 21 21:07:51 2014 +0800
+
+    os/FileJournal: Only using aio then alloc the related resources.
+    
+    If define HAVE_LIBAIO, it alloc related resouces. But itt don't check whether
+    using aio mode. Only using aio it alloc the related resources.
+    
+    Signed-off-by: Ma Jianpeng <jianpeng.ma at intel.com>
+    (cherry picked from commit a66a4931d5be9ee26c0983b3154fdbe37261a51c)
+
+commit 3312c6eeca21dcd566df9bdd8de7b3fe33356b57
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Thu Aug 21 15:49:44 2014 +0800
+
+    os/FileJournal: Tune the judge logic for read_header.
+    
+    When reading journal-header, it should firstly check the result of
+    pread and then do decoce operation.
+    
+    Signed-off-by: Ma Jianpeng <jianpeng.ma at intel.com>
+    (cherry picked from commit c8e2b89cf6bc36a0ff29887b9e76cbbeceef9f8f)
+
+commit b42107584449e1f85cbee97bfa486ebeb310e6a1
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 19 20:50:13 2014 -0700
+
+    os/FileJournal: signal aio_cond even if seq is 0
+    
+    This can happen if we write a journal but no events.
+    
+    Reported-by: Somnath Roy <somnath.roy at sandisk.com>
+    Reported-by: Ma, Jianpeng <jianpeng.ma at intel.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 57778e2c577c1e1bbf9525232720a2994fa36abc)
+
+commit 4a43ea171d84a9f3a13064030eb386fcfbe3bbb8
+Author: Ma Jianpeng <jianpeng.ma at intel.com>
+Date:   Wed Jul 23 10:10:38 2014 -0700
+
+    os/FileJournal: Update the journal header when closing journal
+    
+    When closing journal, it should check must_write_header and update
+    journal header if must_write_header alreay set.
+    It can reduce the nosense journal-replay after restarting osd.
+    
+    Signed-off-by: Ma Jianpeng <jianpeng.ma at intel.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 5bf472aefb7360a1fe17601b42e551df120badfb)
+
+commit 0975ec9cec1c466f7b15f5173541a7eab02dae18
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 21 06:53:36 2014 -0700
+
+    Revert "os/FileJournal: stop aio completion thread *after* writer thread"
+    
+    This reverts commit 334631ae4641824b3df49245f36a8fd4b143bf3f.
+
+commit 5a10b95f7968ecac1f2af4abf9fb91347a290544
+Merge: cc69c16 d5bac46
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Oct 17 10:47:22 2014 -0700
+
+    Merge pull request #2716 from ceph/wip-firefly-9419
+    
+    Backport fix for bug #9419
+
+commit cc69c16c2108cb231b2434a53e3eef51b597756b
+Merge: f9cdaab 334631a
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Oct 17 10:44:30 2014 -0700
+
+    Merge pull request #2724 from dachary/wip-9073-journal-aio-mode-firefly
+    
+    os/FileJournal: stop aio completion thread *after* writer thread
+
+commit f9cdaabe078415d7927e2618030996f2f24be2f1
+Merge: 0b4b34a 412c277
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 17 08:20:53 2014 -0700
+
+    Merge pull request #2742 from ceph/firefly-unknown-locktype
+    
+    mds: reply -EOPNOTSUPP for unknown lock type
+
+commit 412c2770c74abea73a94e10df7b83ebe11ac82ee
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue Oct 14 22:02:41 2014 +0800
+
+    mds: reply -EOPNOTSUPP for unknown lock type
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 675392335c53ff7879031fb9184e4f35bcc90fe2)
+
+commit 1228658871e53e350bdab3e72cdefd1caf33c291
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Sep 21 15:56:18 2014 -0700
+
+    osd/ReplicatedPG: do not clone or preserve snapdir on cache_evict
+    
+    If we cache_evict a head in a cache pool, we need to prevent
+    make_writeable() from cloning the head and finish_ctx() from
+    preserving the snapdir object.
+    
+    Fixes: #8629
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ce8eefca13008a9cce3aedd67b11537145e1fd77)
+
+commit 88e6014463e86e48d78ac419226644209f83f2a0
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Sep 21 15:54:15 2014 -0700
+
+    ceph_test_rados_api_tier: add EvictSnap2 test case
+    
+    Verify an evict doesn't create a snapdir object.  Reproduces #8629
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 398c74eacb1ce4e573aef0d24718a5925d90272b)
+
+commit 0b4b34aac497d17a6474c35891aab2bde962524b
+Merge: 322958a 0a72235
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Oct 16 06:09:51 2014 -0700
+
+    Merge pull request #2734 from ceph/wip-firefly-undump
+    
+    mds: fix --undump-journal
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 0a72235b0556752fadebc3e155ad41b13a0a15e9
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Oct 16 11:17:40 2014 +0100
+
+    mds: fix --undump-journal
+    
+    This hadn't worked for a long time.  This is a fix
+    for firefly only, as this code was refactored in giant.
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+
+commit 835f8c6f6121f3ebdec3a0d2d5cb1376301dc03a
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Tue Sep 23 14:02:55 2014 +0100
+
+    ceph-mon: check fs stats just before preforking
+    
+    Otherwise statfs may fail if mkfs hasn't been run yet or if the monitor
+    data directory does not exist.  There are checks to account for the mon
+    data dir not existing and we should wait for them to clear before we go
+    ahead and check the fs stats.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 7f71c11666b25e91dd612c58b4eda9ac0d4752f8)
+    
+    Conflicts:
+    	src/ceph_mon.cc
+
+commit 1ddf435464562f70f63cdb0032da3187f34ce853
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Thu Sep 18 16:53:43 2014 +0100
+
+    ceph_mon: check available storage space for mon data dir on start
+    
+    error out if available storage space is below 'mon data avail crit'
+    
+    Fixes: #9502
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 2da1a2914ac7df18ce842b0aac728fffb5bed2b6)
+    
+    Conflicts:
+    	src/ceph_mon.cc
+
+commit 112317791b744d9890a65adcc13554c85e90f3af
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Thu Sep 18 16:52:34 2014 +0100
+
+    mon: DataHealthService: use get_fs_stats() instead
+    
+    and relieve the DataStats struct from clutter by using
+    ceph_data_stats_t instead of multiple fields.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 9996d446988768658db751a7843b13cf3d194213)
+    
+    Conflicts:
+    	src/mon/DataHealthService.cc
+
+commit f0a92d72fd44542619338db7d6da98e147b6a9fc
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Thu Sep 18 16:32:20 2014 +0100
+
+    common: util: add get_fs_stats() function
+    
+    simplifies the task of obtaining available/used disk space, as well as
+    used available percentage.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 3d74230d1c0fbfa15487e2a90ac60b883476e840)
+
+commit a8fa009fbe5d5d4d9cfa134d5ecd05c92290a8eb
+Author: Joao Eduardo Luis <jeclui at gmail.com>
+Date:   Thu Sep 18 16:25:44 2014 +0100
+
+    include/util.h: prevent multiple inclusion of header
+    
+    Signed-off-by: Joao Eduardo Luis <joao.luis at inktank.com>
+    (cherry picked from commit 76eff9503493312cb97e4a2f9236f4dbcbf931df)
+
+commit e296685e8f3f5158238216eefb76482bd6d55134
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 18 14:23:36 2014 -0700
+
+    mon: re-bootstrap if we get probed by a mon that is way ahead
+    
+    During bootstrap we verify that our paxos commits overlap with the other
+    mons we will form a quorum with.  If they do not, we do a sync.
+    
+    However, it is possible we pass those checks, then fail to join a quorum
+    before the quorum moves ahead in time such that we no longer overlap.
+    Currently nothing kicks up back into a probing state to discover we need
+    to sync... we will just keep trying to call or join an election instead.
+    
+    Fix this by jumping back to bootstrap if we get a probe that is ahead of
+    us.  Only do this from non probe or sync states as these will be common;
+    it is only the active and electing states that matter (and probably just
+    electing!).
+    
+    Fixes: #9301
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c421b55e8e15ef04ca8aeb47f7d090375eaa8573)
+
+commit 0e57767d5fc524939e8968b506ce2fb3f4f80656
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 18 14:11:24 2014 -0700
+
+    mon/Paxos: fix off-by-one in last_ vs first_committed check
+    
+    peon last_committed + 1 == leader first_committed is okay.  Note that the
+    other check (where I clean up whitespace) gets this correct.
+    
+    Fixes: #9301 (partly)
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d81cd7f86695185dce31df76c33c9a02123f0e4a)
+
+commit 1f4aaf648f4aa6f6056d0e8ce629eeea05c5424d
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 16:17:02 2014 -0700
+
+    mon/Paxos: share state and verify contiguity early in collect phase
+    
+    We verify peons are contiguous and share new paxos states to catch peons
+    up at the end of the round.  Do this each time we (potentially) get new
+    states via a collect message.  This will allow peons to be pulled forward
+    and remain contiguous when they otherwise would not have been able to.
+    For example, if
+    
+      mon.0 (leader)  20..30
+      mon.1 (peon)    15..25
+      mon.2 (peon)    28..40
+    
+    If we got mon.1 first and then mon.2 second, we would store the new txns
+    and then boot mon.1 out at the end because 15..25 is not contiguous with
+    28..40.  However, with this change, we share 26..30 to mon.1 when we get
+    the collect, and then 31..40 when we get mon.2's collect, pulling them
+    both into the final quorum.
+    
+    It also breaks the 'catch-up' work into smaller pieces, which ought to
+    smooth out latency a bit.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c54f1e4d66b22bad715ac17e9baa72ab93e48c46)
+
+commit 6c5b9a666fcd94e175a8b9771368b55246957efe
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 14 16:55:58 2014 -0700
+
+    mon/Paxos: verify all new peons are still contiguous at end of round
+    
+    During the collect phase we verify that each peon has overlapping or
+    contiguous versions as us (and can therefore be caught up with some
+    series of transactions).  However, we *also* assimilate any new states we
+    get from those peers, and that may move our own first_committed forward
+    in time.  This means that an early responder might have originally been
+    contiguous, but a later one moved us forward, and when the round finished
+    they were not contiguous any more.  This leads to a crash on the peon
+    when they get our first begin message.
+    
+    For example:
+    
+     - we have 10..20
+     - first peon has 5..15
+       - ok!
+     - second peon has 18..30
+       - we apply this state
+     - we are now 18..30
+     - we finish the round
+       - send commit to first peon (empty.. we aren't contiguous)
+       - send no commit to second peon (we match)
+     - we send a begin for state 31
+       - first peon crashes (it's lc is still 15)
+    
+    Prevent this by checking at the end of the round if we are still
+    contiguous.  If not, bootstrap.  This is similar to the check we do above,
+    but reverse to make sure *we* aren't too far ahead of *them*.
+    
+    Fixes: #9053
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3e5ce5f0dcec9bbe9ed4a6b41758ab7802614810)
+
+commit 11d2c9dd4aeb835ca73bfb41fb15b1038547adf6
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 13 16:01:01 2014 -0700
+
+    mon/Paxos: put source mon id in a temp variable
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit bb046ed01ecf58b8c87eeeee2e00a476e6fba467)
+
+commit 322958a5aad82c031b54592b372aa053e8993be4
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Oct 15 12:26:00 2014 -0700
+
+    qa/workunits/rbd/import_export.sh: be case insensitive
+    
+    Stop tripping over this change (from dumpling).
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 5558afa03dbd1b20766b76e9410ef5bc3e73784f)
+
+commit 334631ae4641824b3df49245f36a8fd4b143bf3f
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 29 19:40:29 2014 -0700
+
+    os/FileJournal: stop aio completion thread *after* writer thread
+    
+    The writer thread may submit a new aio to update the header in its
+    final moments before shutting down.  Do not stop the aio thread until after
+    that has happened or else we may not wait for those aio completions.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c776a89880fdac270e6334ad8e49fa616d05d0d4)
+    
+    Conflicts:
+    	src/os/FileJournal.cc
+
+commit 111eec9ff6325a12fcbf066ae08f27919aeae5d8
+Merge: cf4e300 6c0127f
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 14 14:57:42 2014 -0700
+
+    Merge remote-tracking branch 'gh/firefly' into firefly-next
+
+commit cf4e30095e8149d1df0f2c9b4c93c9df0779ec84
+Author: Xiaoxi Chen <xiaoxi.chen at intel.com>
+Date:   Tue Aug 5 16:12:22 2014 +0800
+
+    mon/OSDMonitor : Use user provided ruleset for replicated pool
+    
+    When creating a replicated pool, currently ceph ignore the ruleset
+    name provided by user but use a global default ruleset.
+    
+    This patch fix this bug, so the rulset specified by
+    ceph osd pool create replicated
+    can be properly set.
+    
+    Signed-off-by: Xiaoxi Chen <xiaoxi.chen at intel.com>
+    (cherry picked from commit bf9726a294abd32b429170284ac328a592802648)
+
+commit bfd7da10e708a6eefc6d992b2b6337b7f06fd5ed
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jun 3 13:05:19 2014 +0200
+
+    documentation: update osd pool create erasure
+    
+    The properties are replaced with erasure code profiles. Remove the
+    reference to properties and the documentation of each erasure-code
+    related property.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 8ff4edda73abb920c91e1226a330e3659def1fbe)
+
+commit afe6bd89f8a1588fb67063d1a08a4be8c1ab2ce6
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Oct 11 18:20:36 2014 +0200
+
+    rpm: 95-ceph-osd-alt.rules is not needed for centos7 / rhel7
+    
+    The || instead of && had it always installed. That was fixed in EPEL
+    already.
+    
+    http://tracker.ceph.com/issues/9747 Fixes: #9747
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 5ff4a850a0d809b3f25988c6cceb82c35095ef84)
+
+commit d5bac46e06c5420f29a021b294e391b2c6694cbd
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Sep 24 16:02:21 2014 -0700
+
+    osd: Return EOPNOTSUPP if a set-alloc-hint occurs with OSDs that don't support
+    
+    Add CEPH_FEATURE_OSD_SET_ALLOC_HINT feature bit
+    Collect the intersection of all peer feature bits during peering
+    When handling CEPH_OSD_OP_SETALLOCHINT check that all OSDs support it
+    by checking for CEPH_FEATURE_OSD_SET_ALLOC_HINT feature bit.
+    
+    Fixes: #9419
+    Backport: firefly
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 9b39033f2b2bcdd2be0f6da4dff06023d0f77499)
+    
+    Conflicts:
+    
+    	src/include/ceph_features.h
+    	src/osd/PG.cc
+    	src/osd/PG.h
+    	src/osd/ReplicatedPG.cc
+
+commit de08802dcf35aea516d013d3d6116aaa7707b923
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Sep 19 15:12:55 2014 -0700
+
+    osd: Remove unused PG functions queue_notify(), queue_info(), queue_log()
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 70ef4c11cbae669799c30c7592073ad7aa11dcd6)
+
+commit 5b5aba73031e901457ca27cf15600ce1ca90e258
+Merge: 345714b a1ae7f4
+Author: Gregory Farnum <greg at inktank.com>
+Date:   Fri Oct 10 06:57:06 2014 -0700
+
+    Merge pull request #2691 from ceph/firefly-unused-variable
+    
+    Firefly unused variable
+
+commit a1ae7f471c809e69d363b9145e70160533bfa48c
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Oct 10 21:36:39 2014 +0800
+
+    mds: Locker: remove unused variable
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+
+commit 345714b6b4d004ad03cc7952dc56c6db87664ee4
+Merge: fd20a1d 2afb6fe
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Fri Oct 10 09:37:53 2014 +0800
+
+    Merge pull request #2681 from ceph/firefly-locker-null
+    
+    mds: Locker: fix a NULL deref in _update_cap_fields
+
+commit 2afb6febdd8482b8fec5890d79944d656faf1382
+Author: Greg Farnum <greg at inktank.com>
+Date:   Thu Oct 9 15:12:19 2014 -0700
+
+    mds: Locker: fix a NULL deref in _update_cap_fields
+    
+    The MClientCaps* is allowed to be NULL, so we can't deref it unless
+    the dirty param is non-zero. So don't do the ahead-of-time lookup;
+    just call it explicitly in the if block.
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit 3cd8a7fb9683577a7d6e934f18c29b7e84415be6)
+
+commit fd20a1d01bde67fb1edc6058e38435af9d5d6abc
+Merge: e1bd1b2 86926c6
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Wed Oct 8 08:44:46 2014 +0200
+
+    Merge pull request #2662 from dachary/wip-9677-ioprio-class-firefly
+    
+    common: ceph_ioprio_string_to_class always returns -EINVAL
+
+commit 86926c6089d63014dd770b4bb61fc7aca3998542
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Oct 7 14:06:38 2014 +0200
+
+    common: ceph_ioprio_string_to_class always returns -EINVAL
+    
+    The l string is always empty because std::transform needs a
+    pre-allocated string. Replace with the in-place version. Add unit tests.
+    
+    http://tracker.ceph.com/issues/9677 Fixes: #9677
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 3535b7aba3df8b54fa5117b8a9c2f52b8f0f118b)
+    
+    Conflicts:
+    	src/test/Makefile.am
+
+commit 5f2eec5036a2910aca1e8ce2d94444d3ed0477df
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Oct 7 14:05:08 2014 +0200
+
+    osd: log error if set_ioprio fails to parse class
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 5088e0d49332d579ba7e33c2c9baee3d5f701a3e)
+
+commit 2796d5151df4dcde324a4d09a83c9a779cece00e
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Oct 7 14:03:39 2014 +0200
+
+    common: set_ioprio debug message including pid
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 33339c7754875eb7e513345ee6b26a9b2b4d2707)
+
+commit d5ed6b0587b9999b2fd41377b0426e3b09ef8ab9
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Oct 7 14:02:09 2014 +0200
+
+    common: do not set ioprio if pid is not set
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit c7e4c0bfe70bf29d3b8fe4df4e4b934853e33d26)
+
+commit e1bd1b2774f4eae5444b5f7b984193cb91a2dd98
+Merge: 726c6a1 459dca1
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 7 09:58:03 2014 -0700
+
+    Merge pull request #2632 from ceph/wip-9039-firefly
+    
+    rgw: copy object data if target bucket is in a different pool
+
+commit 726c6a147a14c00cf12eb6c6561655475282419f
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Oct 6 15:50:51 2014 -0700
+
+    debian/control: fix python-ceph -> ceph file move to allow upgrades
+    
+    This is a backport of 5c6c366d2abe771c581690270c2d176ebb30c571 with the
+    version numbers changed, to compensate for the change in
+    fe3434f41cd09433975d7d0f9dbb2fae662e4a1b (backported in
+    bf1933e5c184476a354664c42fec834e9f59067c).
+    
+    Tested-by: Tamil Muthamizhan <tamil.muthamizhan at inktank.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 884f7c40c4a28d519847d3995c8d98e5837ceaf0
+Merge: 31d57c9 c8a8e47
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Oct 6 07:01:50 2014 -0700
+
+    Merge remote-tracking branch 'gh/wip-rpm-epoch-firefly' into firefly
+    
+    Reviewed-by: Boris Ranto <branto at redhat.com>
+
+commit 31d57c9a28502a4a72f8aa141f7ed63ffe1e0192
+Merge: 9a3bac0 548be0b
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Mon Oct 6 09:50:33 2014 +0200
+
+    Merge pull request #2643 from johnugeorge/wip-9492-crush-firefly
+    
+    Crush: Backporting fixes for #9492 to firefly
+    
+    Reviewed-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit 548be0b2aea18ed3196ef8f0ab5f58a66e3a9af4
+Author: Johnu George <johnugeo at cisco.com>
+Date:   Mon Sep 29 10:07:44 2014 -0700
+
+    Crush: Ensuring at most num-rep osds are selected
+    
+    Crush temporary buffers are allocated as per replica size configured
+    by the user.When there are more final osds (to be selected as per
+    rule) than the replicas, buffer overlaps and it causes crash.Now, it
+    ensures that at most num-rep osds are selected even if more number of
+    osds are allowed by indep rule. The fix for firstn rules is already
+    merged as part of bug #9492. Required test files are added.
+    
+    Fixes: #9492
+    
+    Signed-off-by: Johnu George johnugeo at cisco.com
+    (cherry picked from commit 234b066ba04976783d15ff2abc3e81b6cc06fb10)
+
+commit e30c570ce691a994898b4a933c57e7ae014cdc30
+Author: Johnu George <johnugeo at cisco.com>
+Date:   Wed Sep 24 09:32:50 2014 -0700
+
+    Crush: Ensuring at most num-rep osds are selected
+    
+    Crush temporary buffers are allocated as per replica size configured
+    by the user.When there are more final osds (to be selected as per
+    rule) than the replicas, buffer overlaps and it causes crash.Now, it
+    ensures that at most num-rep osds are selected even if more number of
+    osds are allowed by the rule.
+    
+    Fixes: #9492
+    
+    Signed-off-by: Johnu George <johnugeo at cisco.com>
+    (cherry picked from commit 6b4d1aa99718e3b367496326c1e64551330fabc0)
+
+commit 9a3bac0c1a7a42cdf7ba846c9ad0a3ae0f15b4bb
+Merge: 0b978fb 5a5e7e7
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 3 11:58:41 2014 -0700
+
+    Merge pull request #2634 from dachary/wip-9653-ceph-disk-bootstrap-osd-firefly
+    
+    ceph-disk: bootstrap-osd keyring ignores --statedir (firefly)
+
+commit c8a8e4763a55dec44836bc679254ee7dcc448567
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Oct 1 12:33:38 2014 -0700
+
+    ceph.spec: fix typo
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit da9ae5c92ecb4059e0ec6be5ce03af46430e76a5)
+
+commit b890c1e4706d7cfef7ed24c9df65b439b4f7ff1d
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Oct 1 06:02:02 2014 -0700
+
+    ceph.spec.: add epoch
+    
+    This is done in fedora packaging.  Do it here too so that you can move
+    between upstream packages (from ceph.com) and fedora and other derivatives
+    will builds.
+    
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 83888362089346e473d6fd6e1d366b826d7bd739)
+    
+    Conflicts:
+    
+    	ceph.spec.in
+
+commit d01db8080d97bfae34dcee3d153bf10e6f5327dd
+Author: Sage Weil <sage at inktank.com>
+Date:   Tue May 20 13:41:35 2014 -0700
+
+    ceph.spec.in: remove BuildRoot
+    
+    Deprecated
+    
+    Fixes: #8143
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit 401319a1527dd9cb5398916105d31e7ec065763d)
+
+commit 3c2b5c440863df548afc2bd8aa5440f15a44ac02
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Aug 12 16:31:22 2014 -0700
+
+    ceph.spec.in: tests for rhel or centos need to not include _version
+    
+    rhel_version and centos_version are apparently the OpenSUSE Build
+    names; the native macros are just "rhel" and "centos" (and contain
+    a version number, should it be necessary).
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 7474f720c2418cf3d52b755f2b60c524e413570a)
+
+commit c82c29d6174022be45929fe9ba8a84993eef974a
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Aug 12 14:46:52 2014 -0700
+
+    ceph.spec.in: Add a small comment on the empty %files section
+    
+    as suggested by Dan Mick.
+    
+    Signed-off-by: Erik Logtenberg <erik at logtenberg.eu>
+    (cherry picked from commit e37b262c7928934530c5bb09fe56f83eb61f4244)
+
+commit a4f748aa906fc65b14f65515721bc3a815c18fb8
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Aug 12 14:39:18 2014 -0700
+
+    ceph.spec.in: Obsolete all older versions.
+    
+    Now this changeset can be used on all current ceph releases that already
+    have the package split.
+    
+    Signed-off-by: Erik Logtenberg <erik at logtenberg.eu>
+    (cherry picked from commit 875a99e25f0ad2cb47149a3b5a28b4771a09125c)
+
+commit 74c7f3caec1cc7a5da89ef33de36a8b59249cfcd
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Tue Aug 12 14:09:43 2014 -0700
+
+    ceph.spec.in: No version on ceph-libs Obsoletes.
+    
+    If we are installing with the new package structure we don't ever want the
+    new package to co-exist with the old one; this includes the mistakenly-
+    released v0.81 on Fedora, which should be removed in favor of this
+    version.
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    Reviewed-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 8f95daf66b5fdb2a8141988480f984c1249599c5)
+
+commit 561261b6efb7ea442686bb8fce387c4de2482067
+Author: Sandon Van Ness <sandon at inktank.com>
+Date:   Fri Aug 8 18:01:30 2014 -0700
+
+    ceph.spec.in: Obselete ceph-libcephfs (not libcephfs)
+    
+    I am guessing that because it was a sub-package libcephfs was mistakenly
+    used instead of ceph-libcephfs.
+    
+    Signed-off-by: Sandon Van Ness <sandon at inktank.com>
+    (cherry picked from commit 75985024bd30ca6fbe4c61aa7f7cbe5306c9a988)
+
+commit 107bfd9ee7dbf360561187b9e0946964d40b9b1c
+Author: Erik Logtenberg <erik at logtenberg.eu>
+Date:   Fri Aug 1 14:20:18 2014 +0200
+
+    ceph.spec.in: We need those nice recent changes for rhel7 in Fedora too.
+    
+    Signed-off-by: Erik Logtenberg <erik at logtenberg.eu>
+    (cherry picked from commit 00877ae502ac52613bcd5c5c834d72787d668dca)
+
+commit 7946c5e5de8d6cd25d20beee15f3489113e51539
+Author: Dan Mick <dan.mick at inktank.com>
+Date:   Wed Aug 27 12:56:43 2014 -0700
+
+    Move fedora patch file (used by ceph.spec.in) to rpm/ subdir
+    
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>
+    (cherry picked from commit 06b92cee621cbe33a6f17e8c64169db4453a5160)
+
+commit cb2ae9afa611175226efb5544f7d2aa705d55ece
+Author: Erik Logtenberg <erik at logtenberg.eu>
+Date:   Fri Aug 1 00:13:50 2014 +0200
+
+    ceph.spec.in, init-ceph.in: Don't autostart ceph service on Fedora.
+    
+    This patch is taken from the current Fedora package and makes the upstream
+    ceph.spec compliant with Fedora policy. The goal is to be fully compliant
+    upstream so that we can replace current Fedora package with upstream
+    package to fix many bugs in Fedora.
+    
+    Addition from Dan Mick <dan.mick at inktank.com>:
+    Do this for RHEL and Centos as well, since they surely will benefit
+    from the same policy.   Note: this requires changes to
+    autobuild-ceph and ceph-build scripts, which currently copy
+    only the dist tarball to the rpmbuild/SOURCES dir.
+    
+    Signed-off-by: Erik Logtenberg <erik at logtenberg.eu>
+    Signed-off-by: Dan Mick <dan.mick at inktank.com>:
+    (cherry picked from commit 461523b06cdf93e32f1d8b354ac3799e73162d33)
+
+commit 2b11376f1ee8925ab16065ebda912b11d3d7be59
+Author: Erik Logtenberg <erik at logtenberg.eu>
+Date:   Thu Jul 31 23:54:03 2014 +0200
+
+    ceph.spec.in: Add obsoletes for libcephfs
+    
+    This fixes a bug for Fedora:
+    https://bugzilla.redhat.com/show_bug.cgi?id=1116614
+    
+    Signed-off-by: Erik Logtenberg <erik at logtenberg.eu>
+    (cherry picked from commit e9da2d8f2142771f206ef67f19e7f194855275d0)
+
+commit eefc62e3b85f402a7e1ae31c272c8a432d979379
+Author: Erik Logtenberg <erik at logtenberg.eu>
+Date:   Thu Jul 31 23:49:56 2014 +0200
+
+    ceph.spec.in: add ceph-libs-compat
+    
+    Added a ceph-libs-compat package in accordance with Fedora packaging
+    guidelines [1], to handle the recent package split more gracefully.
+    In Fedora this is necessary because there are already other packages
+    depending on ceph-libs, that need to be adjusted to depend on the new
+    split packages instead. In the mean time, ceph-libs-compat prevents
+    breakage.
+    
+    [1] http://fedoraproject.org/wiki/Upgrade_paths_%E2%80%94_renaming_or_splitting_packages
+    
+    Signed-off-by: Erik Logtenberg <erik at logtenberg.eu>
+    (cherry picked from commit 6c264f2204cbd54d90b02101e40ac9aa5aa72d7c)
+    
+    Conflicts:
+    
+    	ceph.spec.in
+
+commit 0b978fb15a1307644aba3119419bb7386f98ee04
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 10 14:41:19 2014 -0700
+
+    mon/Paxos: add perfcounters for most paxos operations
+    
+    I'm focusing primarily on the ones that result in IO here.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b09b8563d35dda23faed43afef2a983e93a879c5)
+
+commit 74aa7afc719e517dbed300f802c1bc2dafe43ee0
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 10 14:00:11 2014 -0700
+
+    mon/MonitorDBStore: add get_{keys,bytes}() accounting to Transaction
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit fd421b26748e872ddf8e0f068dda2106853edff1)
+
+commit 5a5e7e7bcedbccbe4ae8aab159af6d8615eb3887
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 3 14:08:57 2014 +0200
+
+    ceph-disk: bootstrap-osd keyring ignores --statedir
+    
+    The STATEDIR variable is used to initialize the bootstrap-osd keyring
+    before it gets a chance to be overriden by --statedir. Replace it with
+    {statedir} so that it can be substituted after all options have been
+    parsed.
+    
+    http://tracker.ceph.com/issues/9653 Fixes: #9653
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit fa0bd06b4657e5b84e237b76033ac3d3478b6a1f)
+
+commit 459dca1613a14cfad8d3afd7e3c783d825573a42
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Aug 12 13:36:11 2014 -0700
+
+    rgw: copy object data if target bucket is in a different pool
+    
+    Fixes: #9039
+    Backport: firefly
+    
+    The new manifest does not provide a way to put the head and the tail in
+    separate pools. In any case, if an object is copied between buckets in
+    different pools, we may really just want the object to be copied, rather
+    than reference counted.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5d3a7e595f47455896304bf358e5251915d0f16f)
+
+commit 711a7e6f81983ff2091caa0f232af914a04a041c
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Sep 15 00:53:50 2014 -0400
+
+    rbd: ObjectCacher reads can hang when reading sparse files
+    
+    The pending read list was not properly flushed when empty objects
+    were read from a space file.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit cdb7675a21c9107e3596c90c2b1598def3c6899f)
+
+commit b7784dc1baa47560a733fe9dcd2acec51bc93165
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Sat Sep 6 22:59:40 2014 -0400
+
+    Enforce cache size on read requests
+    
+    In-flight cache reads were not previously counted against
+    new cache read requests, which could result in very large
+    cache usage.  This effect is most noticeable when writing
+    small chunks to a cloned image since each write requires
+    a full object read from the parent.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4fc9fffc494abedac0a9b1ce44706343f18466f1)
+
+commit ac4fca065a12f3b00a47bf5ec37983696255174b
+Author: Alexandre Marangone <alexandre.marangone at inktank.com>
+Date:   Fri Sep 5 10:36:24 2014 -0700
+
+    rgw: add .log to default log path
+    
+    Fixes: #9353
+    Signed-off-by: Alexandre Marangone <alexandre.marangone at inktank.com>
+    (cherry picked from commit 46732420897a2619059050044f4980a4737df43e)
+
+commit f03ae7b00e5694f1670493396a1cee195fcc6b35
+Merge: 78c3ef9 ee02cfd
+Author: Yehuda Sadeh <yehuda at inktank.com>
+Date:   Thu Oct 2 15:28:40 2014 -0700
+
+    Merge pull request #2565 from ceph/wip-rgw-firefly-backports
+    
+    Wip rgw firefly backports
+
+commit 78c3ef90604ca117255cefe232771a7564fed8b1
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 25 13:16:52 2014 -0700
+
+    osdc/Objecter: only post_rx_buffer if no op timeout
+    
+    If we post an rx buffer and there is a timeout, the revocation can happen
+    while the reader has consumed the buffers but before it has decoded and
+    constructed the message.  In particular, we calculate a crc32c over the
+    data portion of the message after we've taken the buffers and dropped the
+    lock.
+    
+    Instead of fixing this race (for example, by reverifying rx_buffers under
+    the lock while calculating the crc.. bleh), just skip the rx buffer
+    optimization entirely when a timeout is present.
+    
+    Note that this doesn't cover the op_cancel() paths, but none of those users
+    provide static buffers to read into.
+    
+    Fixes: #9582
+    Backport: firefly, dumpling
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    
+    backport of 126d0b30e990519b8f845f99ba893fdcd56de447
+
+commit a261b4952056aab7b067453930342960bbe55089
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 29 14:28:32 2014 -0700
+
+    debian: move ceph_rest_api.py into ceph
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit fe3434f41cd09433975d7d0f9dbb2fae662e4a1b)
+
+commit eb0f6e347969b40c0655d3165a6c4531c6b595a3
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 29 14:24:01 2014 -0700
+
+    ceph.spec.in: move ceph_rest_api.py into ceph
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8cda623e0ba34a48a70e9ea988d619b15605c4fd)
+
+commit c4188e31f7bc8f3c337e637cd99c41d5ee4b6787
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 29 13:44:03 2014 -0700
+
+    ceph.spec: fix python-flask dependency
+    
+    This is needed by ceph-rest-api, which is in ceph.rpm; it's not related to
+    python-ceph (except that ceph-rest-api happens to require that too).
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b2416240b88b2e067dfc79a2723335f1584562d0)
+
+commit bf1933e5c184476a354664c42fec834e9f59067c
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 29 13:40:18 2014 -0700
+
+    debian: python-flask is needed by ceph, not python-ceph
+    
+    It's used by ceph-rest-api which is in the 'ceph' (server) package.
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e42424e777e4f7d8b03650482253734c1fa8709d)
+    
+    Conflicts:
+    
+    	debian/control
+
+commit 94a7fbaa11c51db294dce0dc1df728f69aef5bf8
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Fri Sep 19 12:25:07 2014 +0200
+
+    rgw_main.cc: add missing virtual destructor for RGWRequest
+    
+    CID 1160858 (#1 of 1): Non-virtual destructor (VIRTUAL_DTOR)
+     nonvirtual_dtor: Class RGWLoadGenRequest has a destructor
+     and a pointer to it is upcast to class RGWRequest which doesn't
+     have a virtual destructor.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit b82ceda7775ff85943d9143b73789eb37b09bfa9)
+
+commit 9fee8de25ab5c155cd6a3d32a71e45630a5ded15
+Author: Greg Farnum <greg at inktank.com>
+Date:   Mon Sep 29 16:10:36 2014 -0700
+
+    Locker: accept ctime updates from clients without dirty write caps
+    
+    The ctime changes any time the inode does. That can happen even without
+    the file itself having changed, so we'd better accept the update whenever
+    the auth caps have dirtied, without worrying about the file caps!
+    
+    Fixes: #9514
+    Backport: firefly
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 0ea20a668cf859881c49b33d1b6db4e636eda18a)
+
+commit 461ece5e9fb1d4994a6214a3b6bdae136773629d
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Oct 1 18:01:51 2014 -0700
+
+    doc/release-notes: fix attributions for 8702 fix
+    
+    Oops!
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 188370a94353e29fcb8981699022803e23f3fedd)
+
+commit 917529a78e5046f621df5c48fe5d50d2f7e56560
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Oct 1 17:48:12 2014 -0700
+
+    doc/release-notes: v0.80.6
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c0dc3a56974a469b61523b67cc032cc5726a3a5f)
+    
+    Conflicts:
+    
+    	doc/release-notes.rst
+
+commit 060a5b1422fcdfb8e84636579a2f0c2f1ec14300
+Author: Adam Crume <adamcrume at gmail.com>
+Date:   Thu Sep 18 16:57:27 2014 -0700
+
+    common: Add cctid meta variable
+    
+    Fixes: #6228
+    Signed-off-by: Adam Crume <adamcrume at gmail.com>
+    (cherry picked from commit bb45621cb117131707a85154292a3b3cdd1c662a)
+
+commit a1aa06b7fb30e509193e1b1bb7355b5f21aedc82
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Oct 1 14:30:59 2014 -0700
+
+    ReplicatedPG: dump snap_trimq on pg query
+    
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit 34f38b68d89baf1dcbb4571d4f4d3076dc354538
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Sep 29 16:26:54 2014 -0700
+
+    ReplicatedPG: do not queue the snap trimmer constantly
+    
+    Previously, we continuously requeued the snap trimmer while in
+    TrimmingObjects.  This is not a good idea now that we try to
+    limit the number of snap trimming repops in flight and requeue
+    the snap trimmer directly as those repops complete.
+    
+    Fixes: #9113
+    Backport: giant, dumpling, firefly
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit b29bf00f68cf133151c98db06e9498b3e8be22ed
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Wed Sep 24 13:55:47 2014 -0700
+
+    ReplicatedPG: clean out completed trimmed objects as we go
+    
+    Also, explicitely maintain a max number of concurrently trimming
+    objects.
+    
+    Fixes: 9113
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
+
+commit ee02cfd23facb3404fc377f643b213c2f498474d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Sep 18 20:53:10 2014 -0700
+
+    rgw: calculate hash after writing data
+    
+    Since data is written asynchronously, we should do the hash calculation
+    while it's pending.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5bb94ede19a50543a02a8019ed6c9680b3852d4e)
+
+commit 216730221575d88a72b06ed3d71c9a54cffc5719
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Sep 18 20:51:02 2014 -0700
+
+    crypto: don't hash zero sized buffer
+    
+    libnss returns an error and we assert in that case.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7b137246b49a9f0b4d8b8d5cebfa78cc1ebd14e7)
+
+commit dab7a4f6ad054b53cedca76ee329a6395918b1ab
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Sep 12 14:07:44 2014 -0700
+
+    rgw: push hash calculater deeper
+    
+    This might have been the culprit for #9307. Before we were calculating
+    the hash after the call to processor->handle_data(), however, that
+    method might have spliced the bufferlist, so we can't be sure that the
+    pointer that we were holding originally is still invalid. Instead, push
+    the hash calculation down. Added a new explicit complete_hash() call to
+    the processor, since when we're at complete() it's too late (we need to
+    have the hash at that point already).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d41c3e858c6f215792c67b8c2a42312cae07ece9)
+    
+    Conflicts:
+    	src/rgw/rgw_rados.h
+
+commit bd0a91343ce70d71acced753688a502b7e8b552e
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Aug 21 16:30:10 2014 -0700
+
+    rgw: separate civetweb log from rgw log
+    
+    The civetweb log now is independent from the rgw log.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 850242cad749e33e1e6bc008baa75c8ea7eda0c1)
+    
+    Conflicts:
+    	src/civetweb
+    	src/rgw/rgw_main.cc
+
+commit a777562b780e7ab312f881c38b1db26983a1ac47
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 23 13:40:39 2014 -0700
+
+    civetweb: update submodule
+    
+    Update submodule to include multiple fixes.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 1bdcc079d79d8211b44e2a46511cd2240f71744b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Aug 22 15:12:16 2014 -0700
+
+    rgw: convert header field underscores into dashes
+    
+    Fixes: 9206
+    Backport: firefly
+    
+    Certain web servers filter out underscores in the header field name.
+    Convert them into dashes.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 11acb7097ce21c6218dd48d0c21e0e04a361eb9a)
+
+commit b8fa2ed60b6cce51701df972dbb6f5e02e0d84ba
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Aug 25 10:38:42 2014 -0700
+
+    rgw: fix test to identify whether object has tail
+    
+    Fixes: #9226
+    Reported-by: Sylvain Munaut <s.munaut at whatever-company.com>
+    Backport: firefly
+    
+    We need to identify whether an object is just composed of a head, or
+    also has a tail. Test for pre-firefly objects ("explicit objs") was
+    broken as it was just looking at the number of explicit objs in the
+    manifest. However, this is insufficient, as we might have empty head,
+    and in this case it wouldn't appear, so we need to check whether the
+    sole object is actually pointing at the head.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 751b3e26532932a42ca34f9c062a0a3e29a58cff)
+
+commit 6fee71154d838868807fd9824d829c8250d9d2eb
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Aug 27 17:44:18 2014 -0700
+
+    rgw: don't try to authenticate a CORS preflight request
+    
+    Fixes: #8718
+    Backport: firefly
+    
+    CORS preflight requests don't need to be authenticated. Treat them as
+    coming from anonymous user.
+    
+    Reported-by: Robert Hubbard <bobby.hubbard at garmin.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 848fcf7871e07fc689bdcd18943ace36b2f4906e)
+
+commit c75a79cbac30cd14d37d89217113824d98693572
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Aug 14 13:35:12 2014 -0700
+
+    rgw: fix compilation
+    
+    RGWRadosPutObj couldn't refer to the ceph context.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 6a555434ee3edaf742ee7e5910bcba8dd0de46dd)
+
+commit b0d08aab837808f18708a4f8ced0503c0fce2fec
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Aug 12 11:17:47 2014 -0700
+
+    rgw: call throttle_data() even if renew_state() failed
+    
+    Otherwise we're going to leak the aio callback handle.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7998c322179dd69a1250937321c3c2bb023e0e57)
+
+commit a953b313f1e2f884be6ee2ce356780f4f70849dd
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jul 30 21:32:48 2014 -0700
+
+    rgw: disable civetweb url decoding
+    
+    Fixes: #8621
+    
+    We want to have the raw request uri, as we do the decoding ourselves.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit ffac52b316e7022796d44ae58804d9c20b9c3df9)
+
+commit ba5357714a19b8af989fef1c75ef775837c6a9d6
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Aug 12 14:23:46 2014 -0700
+
+    rgw: copy_obj_data() uses atomic processor
+    
+    Fixes: #9089
+    
+    copy_obj_data was not using the current object write infrastructure,
+    which means that the end objects weren't striped.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 800eff24824c0083b8e2441fc34e0bdca5da36dc)
+
+commit d73dbc3a39117eddaaabb2c25d9238cd7c51711b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Aug 21 21:53:38 2014 -0700
+
+    rgw: clear bufferlist if write_data() successful
+    
+    Fixes: #9201
+    Backport: firefly
+    
+    We sometimes need to call RGWPutObjProcessor::handle_data() again,
+    so that we send the pending data. However, we failed to clear the buffer
+    that was already sent, thus it was resent. This triggers when using non
+    default pool alignments.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 9181114d6f6062c55ee4b351fc3495345e545c36)
+
+commit 4be53d5eebbc294878ba38050d841359b6c8e19e
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Tue Sep 23 12:16:55 2014 -0700
+
+    PG: check full ratio again post-reservation
+    
+    Otherwise, we might queue 30 pgs for backfill at 0.80 fullness
+    and then never check again filling the osd after pg 11.
+    
+    Fixes: #9574
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Samuel Just <sam.just at inktank.com>
diff --git a/doc/changelog/v0.80.9.txt b/doc/changelog/v0.80.9.txt
new file mode 100644
index 0000000..aa274d1
--- /dev/null
+++ b/doc/changelog/v0.80.9.txt
@@ -0,0 +1,1148 @@
+commit b5a67f0e1d15385bc0d60a6da6e7fc810bde6047 (tag: refs/tags/v0.80.9, refs/remotes/gh/firefly)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon Mar 9 10:42:08 2015 -0700
+
+    0.80.9
+
+commit 37901afd1556257151c029395caa1143e84860f2
+Merge: 00e5947 3dac68a
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Mar 3 15:58:53 2015 +0100
+
+    Merge pull request #3852 from dachary/wip-10965-rgw-firefly
+    
+    rgw: enable ipv6 in civetweb
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 00e5947a28f7810a28329d2f4901aed09a289421
+Merge: 293222a b13f483
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Mar 3 15:58:39 2015 +0100
+
+    Merge pull request #3853 from dachary/wip-10907-rgw-firefly
+    
+    rgw: pass civetweb configurables to civetweb
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 293222a284c072a13950831205c106fec7a400df
+Merge: 6512b06 d57b38f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Mar 3 15:58:25 2015 +0100
+
+    Merge pull request #3851 from dachary/wip-10978-rgw-firefly
+    
+    rgw: don't overwrite bucket / object owner when setting acls
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d57b38f85b683dfb365c3cb98362d486594f9eb3
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Feb 27 15:32:50 2015 -0800
+
+    rgw: don't overwrite bucket / object owner when setting acls
+    
+    Fixes: #10978
+    Backport: hammer, firefly
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit eb13f2d4b60c031f16139f7cc4237c012644dd78)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc : trivial s/.empty()/== NULL/
+
+commit b13f483e51b37a768c7f4313b6933bf648950c7d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Feb 17 15:05:40 2015 -0800
+
+    rgw: pass civetweb configurables to civetweb
+    
+    Fixes: #10907
+    Backport: firefly
+    
+    Pass any configurables in the rgw frontends config line to civetweb.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 986d7554426764a149621ba733c5c075b94e0431)
+
+commit 3dac68a17a909b212a36b0a3c0ae2c47d323deee
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Feb 27 08:14:27 2015 -0800
+
+    civetweb: update submodule
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit f28fe744285117a1715eac0d08911cdb37285103)
+
+commit 14aca3af18119a76c1cdfa6d71e6085d360e45e2
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Feb 27 08:14:41 2015 -0800
+
+    rgw: update makefile to enable civetweb config
+    
+    Fixes: #10965
+    Backport: hammer, firefly
+    
+    Civetweb compilation now includes conf header to enable ipv6.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit caa90225bad9fe5e9c275e6189b3396b4d396e3f)
+    
+    Conflicts:
+    	src/rgw/Makefile.am
+               radosgw_CFLAGS = -Icivetweb/include
+            was not yet changed into
+               radosgw_CFLAGS = -I$(srcdir)/civetweb/include
+            in firefly
+
+commit 6512b06fc8a80e3befbe15b543f8850991f74e8a
+Merge: 7b748c6 555cc42
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sat Feb 28 16:47:55 2015 +0100
+
+    Merge pull request #3820 from tchaikov/firefly-pg-leak-10421
+    
+    osd: fix PG leak in SnapTrimWQ._clear()
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 7b748c62764311572342593820ce3f28f74fe9ca
+Merge: d971c95 da95149
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sat Feb 28 16:46:42 2015 +0100
+
+    Merge pull request #3772 from ceph/wip-10883-firefly
+    
+    osd: Fix FileJournal wrap to get header out first
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d971c95c3d8b48494d05b68f40c4c9a4cc6f87a8
+Merge: 0820041 e539971
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sat Feb 28 16:45:48 2015 +0100
+
+    Merge pull request #3521 from dzafman/wip-10676
+    
+    Backport doc fixes that appear to apply to firefly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 555cc42fc826fd801f0d45187429079d4072d129
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Feb 10 16:29:45 2015 +0800
+
+    osd: fix PG leak in SnapTrimWQ._clear()
+    
+    Fixes: #10421
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 01e154d592d6cdbf3f859cf1b4357e803536a6b4)
+
+commit 0820041e6515c82c41b81b9e6825e2dd5fcb8165
+Merge: 6565774 702dbc0
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Thu Feb 26 15:59:24 2015 -0800
+
+    Merge pull request #3730 from ceph/wip-firefly-flock
+    
+    backport ceph-fuse file locking patches to Firefly
+    
+    Reviewed-by: Yan, Zheng <zyan at redhat.com>
+
+commit 6565774d0356efc6225ad561bb13e7cf11da7b1e
+Merge: 7ab02ee 08c2fda
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Feb 26 14:18:10 2015 -0800
+
+    Merge pull request #3406 from ceph/wip-10299-firefly
+    
+    librbd: complete all pending aio ops prior to closing image
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 08c2fda12cf46937a09a59bb032379c3c5321292
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Dec 15 10:53:53 2014 -0500
+
+    librbd: complete all pending aio ops prior to closing image
+    
+    It was possible for an image to be closed while aio operations
+    were still outstanding.  Now all aio operations are tracked and
+    completed before the image is closed.
+    
+    Fixes: #10299
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 7ab02ee5afb3d017b94d58c3dfc7731f7a3866d9
+Merge: 0c0a552 c23e42e
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Feb 26 14:12:29 2015 -0800
+
+    Merge pull request #3404 from ceph/wip-10270-firefly
+    
+    librbd: gracefully handle deleted/renamed pools
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 0c0a5520b1b883bcdd5b865b217ba61e471e3ca2
+Merge: 9ef7743 836ab86
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Feb 26 13:31:37 2015 -0800
+
+    Merge pull request #3410 from ceph/wip-9854-firefly
+    
+    osdc: Constrain max number of in-flight read requests
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit da951497b7e5ec227aa6a5e459b0d04d8b88ef13 (refs/remotes/gh/wip-10883-firefly)
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Feb 18 16:21:12 2015 -0800
+
+    osd: Fix FileJournal wrap to get header out first
+    
+    Correct and restore assert that was removed
+    
+    Cause by f46b1b473fce0322a672b16c7739e569a45054b6
+    Fixes: #10883
+    Backport: dumpling, firefly, giant
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 970bb4901f93575709421b5b25c3eff213de61b8)
+
+commit 702dbc0a247c149d53b52d1929f9880bc99d0522
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Wed Oct 15 12:00:58 2014 +0800
+
+    qa/workunits/fs/misc: Add a workunit for file lock interruption
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit ac92c455a9aa19e4288acdf0c9a746e03a640efb)
+
+commit d2523b82c5c7b29293d70a66ba95493a1564a840
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Wed Oct 15 12:03:46 2014 +0800
+
+    mds: fix neighbor lock check
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit b0e6e85aa08ea74cd209aad04f3f0bf991761e12)
+
+commit f9b6b66b05ddadef043d81676728bf40730ea16c
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Mon Oct 13 11:34:18 2014 +0800
+
+    client: use finisher to abort MDS request
+    
+    When a request is interrupted, libfuse first locks an internal mutex,
+    then calls the interrupt callback. libfuse need to lock the same mutex
+    when unregistering interrupt callback. We unregister interrupt callback
+    while client_lock is locked, so we can't acquiring the client_lock in
+    the interrupt callback.
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 09699454e729592d426aeff5b578697e850af12e)
+    
+    Conflicts:
+    	src/client/Client.cc
+    	src/client/Client.h
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+
+commit ea355e9ca5203b77e6f74ca4a3e39ce23cc86f67
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Oct 9 13:16:18 2014 +0800
+
+    client: use atomic variable to track reference of MetaRequeset
+    
+    this allow us to increase reference count of MetaRequest while not holding
+    the client_lock
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit e464a7765230c504b3e3b88bcb1106f67b7c3eb9)
+
+commit ccbdf514717cb0e48d67b57197d6e538faeea415
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Mon Oct 13 10:44:46 2014 +0800
+
+    client: allow interrupting blocked file lock operation
+    
+    This commit introduce two new types of setfilelock request. Unlike
+    setfilelock (UNLOCK) request, these two new types of setfilelock request
+    do not drop locks that have alread been acquired, they only interrupt
+    blocked setfilelock request.
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 4134c149d3759dd6a3aaa1a353b77bbfe8e9491b)
+
+commit 875e2fcb060554941d94714ad48ebbc0cbbf8077
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Oct 9 09:42:08 2014 +0800
+
+    client: register callback for fuse interrupt
+    
+    libfuse allows program to reigster a callback for interrupt. When a file
+    system operation is interrupted, the fuse kernel driver sends interupt
+    request to libfuse. libfuse calls the interrupt callback when receiving
+    interrupt request.
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 289e8b4a7efa1ae6427115af9bbe541c9e1f0e90)
+
+commit c96aabbd54b24a0273af21a450cd6f517fe4ada0
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Sat Oct 4 09:14:44 2014 +0800
+
+    client: add helper function that updates lock state
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 6a2303a6b6d97f2a6d1422e42d3d88991857618f)
+    
+    Conflicts:
+    	src/client/Client.h
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+
+commit ebbd3ca66722cdc61b56d243baf8e63f7b8c1c1b
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Oct 2 20:21:36 2014 +0800
+
+    fuse: enable fuse_multithreaded by default
+    
+    GETFILELOCK MDS request may block for a long time, so we need to
+    use multithread event loop,
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit b17b43a8660ed0db29fbecf44798265e47712f85)
+
+commit 924e6f2b6b03456a8b18d8b158b8f325051f0519
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Oct 2 19:07:41 2014 +0800
+
+    client: posix file lock support
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit a1b2c8ff955b30807ac53ce6bdc97cf61a7262ca)
+    
+    Conflicts:
+    	src/client/Client.cc
+    	src/client/Client.h
+    	src/client/Inode.h
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 82994946bdcb95867a61e0acf443e30b13925a34
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Oct 2 18:02:50 2014 +0800
+
+    common: link mds/flock.o to libcommon
+    
+    later commit will use this code to track file locks held by cephfs
+    client.
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit e075c27c3554380c59dce0cc17ef0944eb415025)
+    
+    Conflicts:
+    	src/mds/Makefile.am
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 9ef77430f3d46789b0ba1a2afa42729627734500
+Merge: 1205867 b668566
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Feb 13 18:34:11 2015 +0100
+
+    Merge pull request #3684 from ceph/wip-crush-straw-firefly
+    
+    osd: backport straw bucket fixes and all other recent crush goodness to firefly
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit b668566fd8148414b8074f096b85b22c42ed3af9 (refs/remotes/gh/wip-crush-straw-firefly)
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 16 09:02:28 2015 -0800
+
+    crush/builder: fix warnings
+    
+    crush/builder.c: In function 'crush_remove_list_bucket_item':
+    crush/builder.c:977:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
+      if (weight < bucket->h.weight)
+                 ^
+    crush/builder.c: In function 'crush_remove_tree_bucket_item':
+    crush/builder.c:1031:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
+       if (weight < bucket->h.weight)
+                  ^
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 14eb1a73c71d81b7f193fce27c59cb3babf3e74a)
+
+commit 247afa4efe7d11b5ef06e094680b50ea30d7d5e3
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Wed Oct 15 17:02:58 2014 -0700
+
+    crush: improve constness of CrushWrapper methods
+    
+    A number of CrushWrapper get methods or predicates were not const
+    because they need to maintain transparently the rmaps. Make the rmaps
+    mutable and update the constness of the methods to match what the caller
+    would expect.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 236895eea65f8706baa5fdef96fb00ad5b82218c)
+
+commit c59279a25b6c53e0ab3988b0f00ae3cce94f33d7
+Author: Xiaoxi Chen <xiaoxi.chen at intel.com>
+Date:   Fri Sep 5 10:56:36 2014 +0800
+
+    Change CrushWrapper::crush to private
+    
+    Currently in CrushWrapper, the member "struct crush_map *crush"  is a public member,
+    so people can break the encapsulation and manipulate directly to the crush structure.
+    
+    This is not a good practice for encapsulation and will lead to inconsistent if code
+    mix use the CrushWrapper API and crush C API.A simple example could be:
+    1.some code use crush_add_rule(C-API) to add a rule, which will not set the have_rmap flag to false in CrushWrapper
+    2.another code using CrushWrapper trying to look up the newly added rule by name will get a -ENOENT.
+    
+    This patch move CrushWrapper::crush to private, together with three reverse map(type_rmap, name_rmap, rule_name_rmap)
+    and also change codes accessing the CrushWrapper::crush to make it compile.
+    
+    Signed-off-by: Xiaoxi Chen <xiaoxi.chen at intel.com>
+    (cherry picked from commit d734600f9251b52f525faa35441e2b5dd660161b)
+
+commit 9fc2fd50aec94233528870aaa371347238a6ea75
+Author: Sage Weil <sage at inktank.com>
+Date:   Fri Jul 11 06:58:57 2014 -0700
+
+    crush: include CRUSH_V3, v2/v3 rules checks in dump_tunables()
+    
+    Backport: firefly
+    Signed-off-by: Sage Weil <sage at inktank.com>
+    (cherry picked from commit cf94cf3531a349bbd1fc6ee56c3fc260110a252a)
+
+commit f6009a614a3689cc9a96f55b35e70362be4ec64b
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 15:58:03 2014 -0800
+
+    mon: 'osd crush reweight-all'
+    
+    This corresponds to the crushtool --reweight command.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 89b2feea8d53b9dc15ab5ae7f5920ad19c8bba18)
+
+commit d5d7495432dd023ed8c9ba2ac08222f06afee48f
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 15:55:24 2014 -0800
+
+    crush: set straw_calc_version=1 for default+optimal; do not touch for presets
+    
+    When using the presets for compatibility (i.e., based on version), do not
+    touch the straw behavior, as it does not affect mapping or compatibility.
+    However, make a point of setting it by default and for optimal.
+    
+    For most users, this means that they will not see any change unless they
+    explicitly enable the new behavior, or switch to default or optimal
+    tunables.  The idea is that if they touched it, they shouldn't be
+    too surprised by the subsequent data movement.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit dd7b58f3b1aa1febfc6dc227937df93ee6e284eb)
+    
+    (Note: differs from original in that the hammer tunable profile is not
+    present)
+
+commit 5b7b7599123a9d7a837ded52946bd553b09b1ac7
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Dec 3 22:30:00 2014 -0800
+
+    crush/builder: a note about the original crush_calc_straw()
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit adf5c6de0aca24a53d3c7b4e7eeb0a5dce9db0f1)
+
+commit 3ab835b059fd74a525cc2a8ebe8b6a1453e0cc87
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 16:43:16 2014 -0800
+
+    mon: add 'osd crush {get,set}-tunable <name> [value]' commands
+    
+    For now, just add the straw_calc_version tunable.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9000068ae45a8b89315c152b7d5509ac873f2957)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc
+
+commit 884414c5788bac9a269f01b26cbc0c55850c34f6
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 16:33:11 2014 -0800
+
+    crush: fix crush_calc_straw() scalers when there are duplicate weights
+    
+    The straw bucket was originally tested with uniform weights and with a
+    few more complicated patterns, like a stair step (1,2,3,4,5,6,7,8,9).  And
+    it worked!
+    
+    However, it does not behave with a pattern like
+     1, 2, 2, 3, 3, 4, 4
+    
+    Strangely, it does behave with
+     1, 1, 2, 2, 3, 3, 4, 4
+    
+    and more usefully it does behave with
+     1, 2, 2.001, 3, 3.001, 4, 4.001
+    
+    That is, the logic that explicitly copes with weights that are duplicates
+    is broken.
+    
+    The fix is to simply remove the special handling for duplicate weights --
+    it isn't necessary and doesn't work correctly anyway.
+    
+    Add a test that compares the mapping result of  [1, 2, 2, 3, 3, ...] with
+    [1, 2, 2.001, 3, 3.001, ...] and verifies that the difference is small.
+    With the fix, we get .00012, whereas the original implementation gets
+    .015.
+    
+    Note that this changes the straw bucket scalar *precalculated* values that
+    are encoded with the map, and only when the admin opts into the new behavior.
+    
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 43d5c7caa7ce478477bde1bbd4f0649b5159cdcf)
+
+commit bf677093302f475a23de541471ddde6a7c7153b6
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 14:50:21 2014 -0800
+
+    crush: fix distortion of straw scalers by 0-weight items
+    
+    The presence of a 0-weight item in a straw bucket should have no effect
+    on the placement of other items.  Add a test validating that and fix
+    crush_calc_straw() to fix the distortion.
+    
+    Note that this effects the *precalculation* of the straw bucket inputs and
+    does not effect the actually mapping process given a compiled or encoded
+    CRUSH map, and only when straw_calc_version == 1 (i.e., the admin opted in
+    to the new behavior).
+    
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 85498bc8f62ca56506b33f3c5ec4fc4b111ed73d)
+
+commit e02574ef5d3b66e73424a16460366de2d36eded3
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 14:49:42 2014 -0800
+
+    crush/builder: break out new version 1 of crush_calc_straw
+    
+    No change, yet.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 7c1203635f2b5911f281ce3a441905df6e9bd103)
+
+commit c7312a47865c758e67852999803d8aa90ff809c1
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 14:45:04 2014 -0800
+
+    crush: pass crush_map * to various builder methods
+    
+    In particular, we will need it for crush_calc_straw().
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f35a3d88cb944c292e966f679ac7a8d7a1cd3093)
+    
+    Conflicts:
+    	src/crush/CrushWrapper.cc
+
+commit 5137cc656548d942d0f21ba3ef28a5b7d4d21831
+Author: Rongze Zhu <zrzhit at gmail.com>
+Date:   Fri Oct 10 19:18:00 2014 +0800
+
+    crush: fix incorrect use of adjust_item_weight method
+    
+    adjust_item_weight method will adjust all buckets which the item
+    inside. If the osd.0 in host=fake01 and host=fake02, we execute
+    "ceph osd crush osd.0 10 host=fake01", it not only will adjust fake01's
+    weight, but also will adjust fake02's weight.
+    
+    the patch add adjust_item_weightf_in_loc method and fix remove_item,
+    _remove_item_under, update_item, insert_item, detach_bucket methods.
+    
+    Signed-off-by: Rongze Zhu <zrzhit at gmail.com>
+    (cherry picked from commit 9850227d2f0ca2f692a154de2c14a0a08e751f08)
+    
+    Conflicts:
+    	src/crush/CrushWrapper.cc
+
+commit 80ec22014deb8536b9c34e8d57b286052898d05a
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Nov 13 10:59:22 2014 -0800
+
+    crush/CrushWrapper: fix detach_bucket
+    
+    In commit 9850227d2f0ca2f692a154de2c14a0a08e751f08 we changed the call that
+    changed the weight of all instances of item to one that explicitly
+    changes it in the parent bucket, but parent_id may not be valid at the
+    call site.  Move this into the conditional block to fix.
+    
+    Fixes: #10095
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6f8b96a9fe4793906c74a571109a457aca7ca220)
+
+commit 5bc554ac5a7a4cd86b873bfc4f4313c91287b52c
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 14:10:49 2014 -0800
+
+    crush: default to straw_calc_version 1
+    
+    Stick with bobtail tunables where it affects compatibility.  Use v1 of
+    straw_calc, though, since that does not, and we want the best for new
+    clusters.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9565621d6007302fdd68ba27b6aef22e487f0985)
+
+commit cfc718a5a1fec937cf00e6c2b55f66d4390088bb
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Feb 13 08:30:35 2015 -0800
+
+    crush: add straw_calc_version tunable
+    
+    It doesn't do anything, yet.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 50e2ceefee6a5dfbecbe54890139b1fa80a313c8)
+    
+    (Modified from original to not create the 'hammer' tunable profile, which
+    we will not backport in its entirety.)
+
+commit 1205867d3afe6d457483f9f51aaee79cca74e040
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Feb 2 16:43:35 2015 +0100
+
+    qa: use correct binary path on rpm-based systems
+    
+    Fixes: #10715
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 05ce2aa1bf030ea225300b48e7914577a412b38c)
+
+commit da4146a5e03503083e6bc5c12984c06f41a3b4be
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Thu Feb 5 21:12:17 2015 -0800
+
+    fsync-tester: print info about PATH and locations of lsof lookup
+    
+    We're seeing the lsof invocation fail (as not found) in testing and nobody can
+    identify why. Since attempting to reproduce the issue has not worked, this
+    patch will gather data from a genuinely in-vitro location.
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit a85051483874ff5b8b0fb50426a3577040457596)
+
+commit 61b4f09848796faeacf7eb78dd6dc06513beb737
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 14:04:34 2014 -0800
+
+    crush/CrushWrapper: dump chooseleaf_vary_r with other tunables
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c133a83fe7b77e2a7e7c711cb8ab943c59ff0885)
+
+commit e4939ed5535cc4678cf1d1ae80906290448e6590
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 10:12:25 2014 -0800
+
+    crush/CrushTester: add new --show-mappings option
+    
+    This makes --show-utilization and --show-statistics usable.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3877f00877f53e9f86630c2d89e81ab9cff729ec)
+
+commit 8c48ebbf13e6bdb689b4b8ae58ac811653ad2acc
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 10:11:57 2014 -0800
+
+    crushtool/CrushTester: output utilization even with 1 batch
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 294b06c6424f4cb69394976add826d9725073b50)
+
+commit e9faab9f296af9cf26b9475afd3562c3f3b9236b
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 10:08:18 2014 -0800
+
+    crush: recalculate straw scalers during a reweight
+    
+    The crushtool --reweight function triggers a fresh calculation of bucket
+    weights so that they are always the sum of the item weights.  In the
+    straw bucket case, the weights were updated but the corresponding straw
+    scalers were not being recalculated.  The result is that there was not
+    effect on placement in adjusted buckets until the next time a bucket item's
+    weight was adjusted.
+    
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 35062937f174a45fb13d9c177eaa1fe4ed5ff4c2)
+
+commit 4c951e9dc1ca31429119de15755caf3d73f6ffce
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 08:36:41 2014 -0800
+
+    osdmaptool: --test-map-pgs-dump
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 7a99b489909b368bade36d8cc9722ad33d03a2e8)
+
+commit 3cb5d08feee4811624dd495f74912824203edf00
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 2 06:53:20 2014 -0800
+
+    crush: add dprintk's for crush_calc_straw
+    
+    These are compiled out by default.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 946bebd94b109642f95710802e892c59eb4f0b76)
+
+commit ca8471d65fb2cf7d2247d823c5436faa273efda5
+Author: Rongze Zhu <zrzhit at gmail.com>
+Date:   Tue Nov 11 00:13:42 2014 +0800
+
+    crush: fix tree bucket functions
+    
+    There are incorrect nodes' weight in tree bucket when construct tree
+    bucket. The tree bucket don't store item id in items array, so the tree
+    bucket will not work correctly. The patch fix above bugs and add a
+    simple test for tree bucket.
+    
+    Signed-off-by: Rongze Zhu <zrzhit at gmail.com>
+    (cherry picked from commit 13425488882d360fa740613dfcfd0d098c1b7616)
+
+commit af502f25b04cd0758b753941ecf0b1b59d33ea9e
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Nov 11 11:16:58 2014 -0800
+
+    crush/builder: replace printf with an empty dprintk macro
+    
+    This mirrors mapper.c.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e444b221733360cdea4f4bbdbbbfbf2b6ee30ff5)
+
+commit 26966c4aa9cd79cb53db052553a5fc5653f2591b
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Thu Nov 6 17:48:01 2014 -0800
+
+    qa: use sudo even more when rsyncing /usr
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 3aa7797741f9cff06053a2f31550fe6929039692)
+
+commit 6af48421c0ba6195e9a1607053c42eeb62b14ccb
+Author: Greg Farnum <greg at inktank.com>
+Date:   Tue Oct 21 10:55:06 2014 -0700
+
+    qa: use sudo when rsyncing /usr so we can read everything
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit fa07c04231db2d130de54647957ffab4a7a53733)
+
+commit 861a18b1f7dd5bdcbb85bc3fa15d1719bb4b2813
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jan 15 16:31:22 2015 -0800
+
+    rgw: fix partial GET in swift
+    
+    Fixes: #10553
+    backport: firefly, giant
+    
+    Don't set the ret code to reflect partial download, just set the
+    response status when needed.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7e1553cedff90fa0fefded65cde87ad068eb5f0c)
+
+commit e539971e2d528b4de6009ea44565f037acb2be66 (refs/remotes/gh/wip-10676)
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Thu Dec 18 17:13:27 2014 +0530
+
+    doc: Adds updated man page for ceph under man/
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 8de9a0f437822c770600c19a9f61977745b7e530)
+
+commit 15596ffe388147b7984457041a38cbb9f472556c
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Sat Dec 13 02:27:45 2014 +0530
+
+    doc: Adds man page for ceph under man/.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit ffd6c7e49686f8f92ddb400ffdec62520708e64b)
+
+commit 893e5cd1f4fd5ea77d65f0e78cc8cff88eb19c1a
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Sat Dec 13 02:24:41 2014 +0530
+
+    doc: Adds man page for ceph.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 76da87a64ca6b3cc0ceeaf63e19a9f440d6f4161)
+
+commit 8d29a4a231666830914903b95599d80da7b97def
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 15 17:04:32 2014 -0800
+
+    osd: handle no-op write with snapshot case
+    
+    If we have a transaction that does something to the object but it !exists
+    both before and after, we will continue through the write path.  If the
+    snapdir object already exists, and we try to create it again, we will
+    leak a snapdir obc and lock and later crash on an assert when the obc
+    is destroyed:
+    
+    0> 2014-12-06 01:49:51.750163 7f08d6ade700 -1 osd/osd_types.h: In function 'ObjectContext::~ObjectContext()' thread 7f08d6ade700 time 2014-12-06 01:49:51.605411
+    osd/osd_types.h: 2944: FAILED assert(rwstate.empty())
+    
+    Fix is to not recreated the snapdir if it already exists.
+    
+    Fixes: #10262
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 02fae9fc54c10b5a932102bac43f32199d4cb612)
+
+commit 8ba48d10c252b28cde5b4da1286421db12b57cc2
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jan 19 18:28:20 2015 -0800
+
+    ceph_test_rados_api_misc: do not assert rbd feature match
+    
+    This test fails on upgrades when we (or the server) have new
+    features.  Make it less fragile.
+    
+    Fixes: #10576
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9147c62989871cea8b3a85b02c53017825efb55b)
+
+commit 836ab86d89ae15ed5b228ff656bc81c7cc3495aa
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Oct 27 14:47:19 2014 -0400
+
+    osdc: Constrain max number of in-flight read requests
+    
+    Constrain the number of in-flight RADOS read requests to the
+    cache size.  This reduces the chance of the cache memory
+    ballooning during certain scenarios like copy-up which can
+    invoke many concurrent read requests.
+    
+    Fixes: #9854
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 068d68850d09dfcaccc5a3ce85c80b2f6d808ea9)
+
+commit 2964efaf327cf798f892a6722eb4e24f2ffa0fde
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jan 19 12:46:00 2015 -0500
+
+    Revert "Enforce cache size on read requests"
+    
+    This reverts commit b7784dc1baa47560a733fe9dcd2acec51bc93165.
+
+commit e4c5b153735aba3f84554a50243f779f36568373
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jan 19 12:45:25 2015 -0500
+
+    Revert "rbd: ObjectCacher reads can hang when reading sparse files"
+    
+    This reverts commit 711a7e6f81983ff2091caa0f232af914a04a041c.
+
+commit c23e42e78ea3ba44706951a728e2ccb74cac7b33
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jan 19 10:28:56 2015 -0500
+
+    librbd: gracefully handle deleted/renamed pools
+    
+    snap_unprotect and list_children both attempt to scan all
+    pools. If a pool is deleted or renamed during the scan,
+    the methods would previously return -ENOENT. Both methods
+    have been modified to more gracefully handle this condition.
+    
+    Fixes: #10270
+    Backport: giant, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 436923c68b77c900b7774fbef918c0d6e1614a36)
+
+commit 24c13d87039d4f61df0bcabdb8862e0e94fe575d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 05:24:01 2014 -0800
+
+    rgw: change multipart upload id magic
+    
+    Fixes: #10271
+    Backport: firefly, giant
+    
+    Some clients can't sign requests correctly with the original magic
+    prefix.
+    
+    Reported-by: Georgios Dimitrakakis <giorgis at acmac.uoc.gr>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5fc7a0be67a03ed63fcc8408f8d71a31a1841076)
+
+commit 617002d3ff469ef409a83e35d4f4fd6a0b5b1278
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Dec 11 09:07:10 2014 -0800
+
+    rgw: url decode http query params correctly
+    
+    Fixes: #10271
+    Backport: firefly
+    
+    This got broken by the fix for #8702. Since we now only url_decode if
+    we're in query, we need to specify that we're in query when decoding
+    these args.
+    
+    Reported-by: Georgios Dimitrakakis <giorgis at acmac.uoc.gr>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 21e07eb6abacb085f81b65acd706b46af29ffc03)
+
+commit d7ccf71d962cec1571f53c9392f9b58350569062
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Jan 14 15:01:38 2015 -0800
+
+    qa: ignore duplicates in rados ls
+    
+    These can happen with split or with state changes due to reordering
+    results within the hash range requested. It's easy enough to filter
+    them out at this stage.
+    
+    Backport: giant, firefly
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit e7cc6117adf653a4915fb7a75fac68f8fa0239ec)
+
+commit aef69572588a0dfad58df94cb0d0980d0590d8e4
+Merge: 69eaad7 534624b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jan 15 16:40:48 2015 -0800
+
+    Merge branch 'wip-firefly-rgw-backports' into firefly
+
+commit 534624b7e9decc880e88496355a6fbbe008ede5f
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 21 17:59:30 2014 -0700
+
+    init-radosgw.sysv: set ulimit -n before starting daemon
+    
+    If we do the ulimit inside the daemon command we will have already
+    dropped privs and will fail.
+    
+    Fixes: #9587
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9803cedf54a7baff45ccd0e0f65d2bc220958a46)
+
+commit fd49cbc535d0d7fa64ebfa458386b47c8ec8616e
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 17:07:30 2014 -0800
+
+    rgw: use s->bucket_attrs instead of trying to read obj attrs
+    
+    Fixes: #10307
+    Backport: firefly, giant
+    
+    This is needed, since we can't really read the bucket attrs by trying to
+    read the bucket entry point attrs. We already have the bucket attrs
+    anyway, use these.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5cf193c8686196d5235889e68cb5ea8f1fc8e556)
+
+commit 79bfffb55a0b3a302368e34417d62f74b82dc224
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 13:40:55 2014 -0800
+
+    rgw: remove swift user manifest (DLO) hash calculation
+    
+    Fixes: #9973
+    Backport: firefly, giant
+    
+    Previously we were iterating through the parts, creating hash of the
+    parts etags (as S3 does for multipart uploads). However, swift just
+    calculates the etag for the empty manifest object.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit ef6d3ad964d34bc526dc4435486bd5c8cdc3b230)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
+
+commit ac799f0834783590cbb6eb91784c8e0753cb1e03
+Author: Lei Dong <leidong at yahoo-inc.com>
+Date:   Mon Oct 27 10:29:48 2014 +0800
+
+    fix can not disable max_size quota
+    
+    Currently if we enable quota and set max_size = -1, it doesn’t
+    mean max_size is unlimited as expected. Instead, it means object
+    with any size is not allowed to upload because of “QuotaExceeded”.
+    The root cause is the function rgw_rounded_kb which convert max_size
+    to max_size_kb returns 0 for -1 because it takes an unsigned int
+    but we pass an int to it. A simple fix is check max_size before
+    it’s rounded to max_size_kb.
+    
+    Test case:
+    1 enable and set quota:
+    radosgw-admin quota enable --uid={user_id} --quota-scope=user
+    radosgw-admin quota set --quota-scope=user --uid={user_id}\
+     --max-objects=100 --max-size=-1
+    2 upload any object with non-zero length
+    it will return 403 with “QuotaExceeded” and return 200 if you apply the fix.
+    
+    Fixes: #9907
+    Backport: giant, firefly
+    Signed-off-by: Dong Lei leidong at yahoo-inc.com
+    (cherry picked from commit abd3fd3ef9ee9999b99811937af60b7a5e673e35)
+
+commit 30963fdc98f5650a68b5737729920d43459b5899
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 23 12:43:55 2014 -0700
+
+    rgw: rados->set_attrs() updates bucket index
+    
+    Fixes: #5595
+    Backport: dumpling, firefly
+    We need to update the bucket index when updating object attrs, otherwise
+    we're missing meta changes that need to be registered. It also
+    solves issue of bucket index not knowing about object acl changes,
+    although this one still requires some more work.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit f833f12a200ecc2c4f74ddb443d6fa61b7ad14db)
+
+commit 31f5e332c616dbb7f7338af3ab37ac65ff66f733
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Nov 4 22:05:03 2014 -0800
+
+    rgw: RGWRados::get_obj() returns wrong len if len == 0
+    
+    Fixes: #9877
+    We only updated if len was > 0, should update it if r >= 0. This was the
+    culprit for issue #9877.
+    Backport: giant, firefly
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fe7bf06366adaf787816d1e68f5e3f68e8c91134)
+
+commit 8682d1b15e097ececd927dfbd096dbb46403afca
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 13:28:02 2014 -0800
+
+    rgw: send back ETag on S3 object copy
+    
+    Fixes: #9479
+    Backport: firefly, giant
+    We didn't send the etag back correctly. Original code assumed the etag
+    resided in the attrs, but attrs only contained request attrs.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit b1bfc3a7e0c9088f01f8ff770ae14f569fbc570d)
+    
+    Conflicts:
+    	src/rgw/rgw_rados.cc
+
+commit 2d61fc76e97e5e28cf24cc6e341d49a8fe47059c
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 12:35:42 2014 -0800
+
+    rgw: S3 object copy content type fix
+    
+    Fixes: #9478
+    Backport: firefly, giant
+    Content type for S3 object copy response should be set to
+    application/xml.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 31963459a0a869c4d32f55baa629f36df33eaa90)
+
+commit 011a8c3bd621337e5a1746f18882be20d3854b14
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 11:20:26 2014 -0800
+
+    rgw: http headers need to end with \r\n
+    
+    Fixes: #9254
+    Backport: firefly, giant
+    
+    Reported-by: Benedikt Fraunhofer <fraunhofer at traced.net>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7409ab3df18fb312dd6c9f79084f889c523afdce)
+    
+    Conflicts:
+    	src/rgw/rgw_civetweb.cc
+    	src/rgw/rgw_fcgi.cc
+
+commit 71d119f2952716aa1f75817e1daaf5fb67ecde94
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jan 7 13:56:14 2015 -0800
+
+    rgw: index swift keys appropriately
+    
+    Fixes: #10471
+    Backport: firefly, giant
+    
+    We need to index the swift keys by the full uid:subuser when decoding
+    the json representation, to keep it in line with how we store it when
+    creating it through other mechanism.
+    
+    Reported-by: hemant burman <hemant.burman at gmail.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 478629bd2f3f32afbe6e93eaebb8a8fa01af356f)
+
+commit 7b89a827a063acf78a848a34c1c3298db213950f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Nov 20 10:36:05 2014 -0800
+
+    rgw-admin: create subuser if needed when creating user
+    
+    Fixes: #10103
+    Backport: firefly, giant
+    This turned up after fixing #9973. Earlier we also didn't create the
+    subuser in this case, but we didn't really read the subuser info when it
+    was authenticating. Now we do that as required, so we end up failing the
+    authentication. This only applies to cases where a subuser was created
+    using 'user create', and not the 'subuser create' command.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 9ba17a321db06d3d76c9295e411c76842194b25c)
+
+commit 9ee29b5355e9ffeac76707e8d4070bfff5dc99d5
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 14:38:46 2014 -0800
+
+    rgw: update swift subuser perm masks when authenticating
+    
+    Fixes: #9918
+    Backport: firefly, giant
+    It seems that we weren't setting the swift perm mask correctly.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5d9f36f757a7272c24d2c9adc31db1ed5e712992)
+
+commit d298fdda2aa177e1a4b43ca94a2292435a50dea4
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Oct 23 17:39:42 2014 -0700
+
+    rgw: send http status reason explicitly in fastcgi
+    
+    There are issues in certain versions of apache 2.4, where the reason is
+    not sent back. Instead, just provide the reason explicitly.
+    
+    Backport: firefly, giant
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit a9dd4af401328e8f9071dee52470a0685ceb296b)
diff --git a/doc/changelog/v0.87.1.txt b/doc/changelog/v0.87.1.txt
new file mode 100644
index 0000000..cf0eeca
--- /dev/null
+++ b/doc/changelog/v0.87.1.txt
@@ -0,0 +1,2151 @@
+commit 283c2e7cfa2457799f534744d7d549f83ea1335e (tag: refs/tags/v0.87.1, refs/remotes/gh/giant)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Mon Feb 23 12:02:04 2015 -0800
+
+    0.87.1
+
+commit 4178e32dd085adeead84fb168ab8a8a121256259
+Merge: ccb0914 734e9af
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 17 01:09:54 2015 +0100
+
+    Merge pull request #3731 from liewegas/wip-10834-giant
+    
+    osd: tolerate sessionless con in fast dispatch path
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 734e9af5df4ae419ded108f5036bee068a9bc2b2
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 1 18:15:59 2014 -0800
+
+    osd: tolerate sessionless con in fast dispatch path
+    
+    We can now get a session cleared from a Connection at any time.  Change
+    the assert to an if in ms_fast_dispatch to cope.  It's pretty rare, but it
+    can happen, especially with delay injection.  In particular, a racing
+    thread can call mark_down() on us.
+    
+    Fixes: #10209
+    Backport: giant
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 01df2227125abf94571b4b0c7bccca57098ed2dc)
+
+commit ccb0914f76da23acdd7374233cd1939ab80ef3c8
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Feb 2 16:43:35 2015 +0100
+
+    qa: use correct binary path on rpm-based systems
+    
+    Fixes: #10715
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 05ce2aa1bf030ea225300b48e7914577a412b38c)
+
+commit 78c71b9200da5e7d832ec58765478404d31ae6b5
+Merge: 222aa22 91515e7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Feb 11 00:11:57 2015 +0100
+
+    Merge pull request #3407 from ceph/wip-9854-giant
+    
+    osdc: Constrain max number of in-flight read requests
+
+commit 222aa22ebc0ccb1b04156e0c9d05f4e4733ec290
+Merge: b9ff170 a5cb39c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 22:01:21 2015 +0100
+
+    Merge pull request #3568 from dachary/wip-10471-rgw-giant
+    
+    rgw: use s->bucket_attrs instead of trying to read obj attrs
+
+commit b9ff1708ad85ca5aeb10b4202bcbe197251e3bd8
+Merge: 34103b6 b1e4882
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:59:40 2015 +0100
+
+    Merge pull request #3263 from dachary/wip-jerasure-giant
+    
+    erasure-code: update links to jerasure upstream (giant)
+
+commit 34103b6355881820aa10b354c2427654bf229e8f
+Merge: 94889cf d125743
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:59:17 2015 +0100
+
+    Merge pull request #3191 from ceph/giant-10277
+    
+    Giant 10277
+
+commit 94889cf6bef5a542e51bf8434dbe7c68f64604ce
+Merge: d7b10d8 d28c8e0
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:58:52 2015 +0100
+
+    Merge pull request #3186 from ceph/wip-giant-mon-backports
+    
+    mon: backports for #9987 against giant
+
+commit d7b10d897e17bc3fa690c8484ad2d6f233896237
+Merge: 11f7d06 16c6d0d
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:58:29 2015 +0100
+
+    Merge pull request #3185 from dachary/wip-10325-cauchy-giant
+    
+    erasure-code: relax cauchy w restrictions (giant)
+
+commit 11f7d064e5d93bc0ed8896750344c6cf6b37aeab
+Merge: 975be75 636b98f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:58:05 2015 +0100
+
+    Merge pull request #3178 from dachary/wip-9998-crush-underfloat-giant
+    
+    crush: fix weight underfloat issue (giant)
+
+commit 975be75f4bcea88b232ea76087b49e288d7c29f7
+Merge: 51fe79d d759e71
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:57:50 2015 +0100
+
+    Merge pull request #3579 from dachary/wip-9877-rgw-giant
+    
+    rgw: RGWRados::get_obj() returns wrong len if len == 0
+
+commit 51fe79d9e63c7df4da547a0ba7a12aa9c6cd7ab2
+Merge: fca9ead 319f9c9
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:57:18 2015 +0100
+
+    Merge pull request #3168 from ceph/wip-8797-giant
+    
+    Wip 8797 giant
+
+commit fca9eadaf3fcef77e269d4936d4eea86ab6c3faf
+Merge: 317532b 9886620
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:56:53 2015 +0100
+
+    Merge pull request #3582 from dachary/wip-10062-rgw-giant
+    
+    rgw: s3 keystone auth fixes
+
+commit 317532b70383762f473a910e043c889574eb6087
+Merge: 3e8f3e3 debc0c5
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:56:37 2015 +0100
+
+    Merge pull request #3581 from dachary/wip-9918-rgw-giant
+    
+    rgw: update swift subuser perm masks when authenticating
+
+commit 3e8f3e38af76fa2cba86aedf962d3230d7979f63
+Merge: 1d77591 76f9de3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:56:17 2015 +0100
+
+    Merge pull request #3580 from dachary/wip-9907-rgw-giant
+    
+    fix can not disable max_size quota
+
+commit 1d7759149697242192be05decf7ffafb17b24cbe
+Merge: b016863 ad04a67
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:55:56 2015 +0100
+
+    Merge pull request #3083 from dachary/wip-10211-erasure-code-buffer-alignement-giant
+    
+    erasure-code: enforce chunk size alignment (giant)
+
+commit b016863ad243388e7571da9ffca3013c8f99237a
+Merge: bdcc9dc d21f4e3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:55:23 2015 +0100
+
+    Merge pull request #3577 from dachary/wip-9587-rgw-giant
+    
+    init-radosgw.sysv: set ulimit -n before starting daemon
+
+commit bdcc9dcb8586c91b432c7087e33a2b52ef467b54
+Merge: df475f9 7b5f746
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:54:58 2015 +0100
+
+    Merge pull request #3576 from dachary/wip-5595-9576-rgw-giant
+    
+    update object content-length doesn't work correctly
+
+commit df475f92a41e3bd5a022335b2c9023ad40c3b47b
+Merge: db7adf8 b2f6f7f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:54:13 2015 +0100
+
+    Merge pull request #3575 from dachary/wip-9479-rgw-giant
+    
+    rgw: send back ETag on S3 object copy
+
+commit db7adf8d8ca225fea2d0277ced614e936df086c9
+Merge: 9b50db9 67ba4d3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:53:55 2015 +0100
+
+    Merge pull request #3574 from dachary/wip-9478-rgw-giant
+    
+    rgw: S3 object copy content type fix
+
+commit 9b50db97a9552841ed143588e2f63bab56d0aecb
+Merge: 583fe31 84e9b6c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:53:33 2015 +0100
+
+    Merge pull request #3573 from dachary/wip-9254-rgw-giant
+    
+    rgw: http headers need to end with \r\n
+
+commit 583fe31681c4eea8b85b413674074445e2b424a6
+Merge: 5240db5 1cb0955
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:53:15 2015 +0100
+
+    Merge pull request #3572 from dachary/wip-9973-rgw-giant
+    
+    rgw: remove swift user manifest (DLO) hash calculation
+
+commit 5240db588e9017dd8a487b7a9ee16f171fdda1ff
+Merge: 62e1552 e230fab
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:52:54 2015 +0100
+
+    Merge pull request #3571 from dachary/wip-8911-rgw-giant
+    
+    rgw: swift GET / HEAD object returns X-Timestamp field
+
+commit 62e15528dda20b5419e39744fa9e0c9c4cae053c
+Merge: 16cd892 c24fab3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:52:36 2015 +0100
+
+    Merge pull request #3570 from dachary/wip-10701-rgw-giant
+    
+    rgw: use strict_strtoll() for content length
+
+commit 16cd892aab4ffb1dc15b93a4101d9bc209591c94
+Merge: 028904c 6aef29e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:52:00 2015 +0100
+
+    Merge pull request #3569 from dachary/wip-10103-rgw-giant
+    
+    rgw-admin: create subuser if needed when creating user
+
+commit 028904cf7c36a1d5342cf29c115bc0437e9b2d74
+Merge: 520dcf8 425ee8a
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:51:06 2015 +0100
+
+    Merge pull request #3567 from dachary/wip-10307-rgw-giant
+    
+    rgw: use s->bucket_attrs instead of trying to read obj attrs
+
+commit 520dcf8624eeafd694115b382616be83f9b344d3
+Merge: cae1de2 14cdb9b
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:50:34 2015 +0100
+
+    Merge pull request #3443 from ceph/wip-10590-giant
+    
+    rbd: ensure aio_write buffer isn't invalidated during image import
+
+commit cae1de29922c2183eff021c6fe2b921a87b5f5b2
+Merge: b346ad3 83a0a2e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:50:14 2015 +0100
+
+    Merge pull request #3557 from dachary/wip-10688-boost-157-giant
+    
+    support Boost 1.57.0
+
+commit b346ad37a84b7cfd0bae84528f2533a8cc4a8e3d
+Merge: aacd51c 13bb880
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:49:47 2015 +0100
+
+    Merge pull request #2954 from sponce/giant
+    
+    Fixed trivial locking issue in the trunc method of libradosstriper - Giant branch
+
+commit aacd51c74c102d44982421b9bc384d12fc160e3c
+Merge: 1d97c7c 081f49b
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:49:20 2015 +0100
+
+    Merge pull request #3405 from ceph/wip-10299-giant
+    
+    librbd: complete all pending aio ops prior to closing image
+
+commit 1d97c7c9a3087e7bc98774d9fe2882bdc4a84531
+Merge: 53dec0e 436923c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:48:49 2015 +0100
+
+    Merge pull request #3403 from ceph/wip-10270-giant
+    
+    librbd: gracefully handle deleted/renamed pools
+
+commit 53dec0eeee60b315e88acb4ba05666857ae3e0eb
+Merge: df8285c 1261bf2
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Feb 10 21:48:20 2015 +0100
+
+    Merge pull request #3356 from liewegas/wip-msgr-giant
+    
+    msgr: fast dispatch backports for giant
+
+commit df8285c5e5b14d9a4cd42fb9be8e18fe6cdf6f83
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Thu Feb 5 21:12:17 2015 -0800
+
+    fsync-tester: print info about PATH and locations of lsof lookup
+    
+    We're seeing the lsof invocation fail (as not found) in testing and nobody can
+    identify why. Since attempting to reproduce the issue has not worked, this
+    patch will gather data from a genuinely in-vitro location.
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit a85051483874ff5b8b0fb50426a3577040457596)
+
+commit 91515e750bfe2453ce8ac9ec568b0e314823dd82
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Oct 27 14:47:19 2014 -0400
+
+    osdc: Constrain max number of in-flight read requests
+    
+    Constrain the number of in-flight RADOS read requests to the
+    cache size.  This reduces the chance of the cache memory
+    ballooning during certain scenarios like copy-up which can
+    invoke many concurrent read requests.
+    
+    Fixes: #9854
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 98866208c64348ca885335d95a1c737071a17004
+Author: Abhishek Lekshmanan <abhishek.lekshmanan at gmail.com>
+Date:   Mon Dec 22 19:57:19 2014 +0530
+
+    rgw: check keystone auth also for s3 post requests
+    
+    This patch adds keystone auth for s3 post requests, once a user fails in
+    cephx authentication, they are checked for keystone if configured.
+    
+    Fixes #10062
+    Signed-off-by: Abhishek Lekshmanan <abhishek.lekshmanan at gmail.com>
+    
+    (cherry picked from commit 8b3dfc9472022ea45ad24e02e0aa21dfdad798f8)
+
+commit 4e4372b8e551bb1b974f08dc69f5b27bdd22bb4b
+Author: Abhishek Lekshmanan <abhishek.lekshmanan at gmail.com>
+Date:   Mon Nov 17 17:37:00 2014 +0530
+
+    rgw: check for timestamp for s3 keystone auth
+    
+    This commit ensures that we check for timestamp of s3 request is within
+    acceptable grace time of radosgw
+    Addresses some failures in #10062
+    Fixes: #10062
+    Signed-off-by: Abhishek Lekshmanan <abhishek.lekshmanan at gmail.com>
+    
+    (cherry picked from commit 4b35ae067fef9f97b886afe112d662c61c564365)
+
+commit debc0c593fb7401d07a34f7916380092ad7285f9
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 14:38:46 2014 -0800
+
+    rgw: update swift subuser perm masks when authenticating
+    
+    Fixes: #9918
+    Backport: firefly, giant
+    It seems that we weren't setting the swift perm mask correctly.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5d9f36f757a7272c24d2c9adc31db1ed5e712992)
+
+commit 76f9de330deaa4fafb86d3f6f2754f0d419306b1
+Author: Lei Dong <leidong at yahoo-inc.com>
+Date:   Mon Oct 27 10:29:48 2014 +0800
+
+    fix can not disable max_size quota
+    
+    Currently if we enable quota and set max_size = -1, it doesn’t
+    mean max_size is unlimited as expected. Instead, it means object
+    with any size is not allowed to upload because of “QuotaExceeded”.
+    The root cause is the function rgw_rounded_kb which convert max_size
+    to max_size_kb returns 0 for -1 because it takes an unsigned int
+    but we pass an int to it. A simple fix is check max_size before
+    it’s rounded to max_size_kb.
+    
+    Test case:
+    1 enable and set quota:
+    radosgw-admin quota enable --uid={user_id} --quota-scope=user
+    radosgw-admin quota set --quota-scope=user --uid={user_id}\
+     --max-objects=100 --max-size=-1
+    2 upload any object with non-zero length
+    it will return 403 with “QuotaExceeded” and return 200 if you apply the fix.
+    
+    Fixes: #9907
+    Backport: giant, firefly
+    Signed-off-by: Dong Lei leidong at yahoo-inc.com
+    (cherry picked from commit abd3fd3ef9ee9999b99811937af60b7a5e673e35)
+
+commit d759e71c8167ea29c8fda9483039a3e491083da5
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Nov 4 22:05:03 2014 -0800
+
+    rgw: RGWRados::get_obj() returns wrong len if len == 0
+    
+    Fixes: #9877
+    We only updated if len was > 0, should update it if r >= 0. This was the
+    culprit for issue #9877.
+    Backport: giant, firefly
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fe7bf06366adaf787816d1e68f5e3f68e8c91134)
+
+commit d21f4e326eb4821cc9bd38a1b62a0210272277d4
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 21 17:59:30 2014 -0700
+
+    init-radosgw.sysv: set ulimit -n before starting daemon
+    
+    If we do the ulimit inside the daemon command we will have already
+    dropped privs and will fail.
+    
+    Fixes: #9587
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9803cedf54a7baff45ccd0e0f65d2bc220958a46)
+
+commit 7b5f746d2f97c7139f9c31962c107a074bfd1863
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 23 12:42:10 2014 -0700
+
+    rgw: PutObjMetadata, clear bufferlist before appending into it
+    
+    Fixes: #9576
+    Backport: firefly, dumpling
+    
+    We need to completely rewrite the bufferlist, not append into it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 44cfd88dc65d30f4295743c5834768bb13f7b805)
+
+commit e24f27b7b2e2aeb84b14788e8bf2757ecdf8f0c0
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 23 12:43:55 2014 -0700
+
+    rgw: rados->set_attrs() updates bucket index
+    
+    Fixes: #5595
+    Backport: dumpling, firefly
+    We need to update the bucket index when updating object attrs, otherwise
+    we're missing meta changes that need to be registered. It also
+    solves issue of bucket index not knowing about object acl changes,
+    although this one still requires some more work.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit f833f12a200ecc2c4f74ddb443d6fa61b7ad14db)
+
+commit b2f6f7f6205682aeb09c0785e373ddf5d89c6d04
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 13:28:02 2014 -0800
+
+    rgw: send back ETag on S3 object copy
+    
+    Fixes: #9479
+    Backport: firefly, giant
+    We didn't send the etag back correctly. Original code assumed the etag
+    resided in the attrs, but attrs only contained request attrs.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit b1bfc3a7e0c9088f01f8ff770ae14f569fbc570d)
+
+commit 67ba4d3444f0f64dae6286be28276ba85376ecf6
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 12:35:42 2014 -0800
+
+    rgw: S3 object copy content type fix
+    
+    Fixes: #9478
+    Backport: firefly, giant
+    Content type for S3 object copy response should be set to
+    application/xml.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 31963459a0a869c4d32f55baa629f36df33eaa90)
+
+commit 84e9b6c32c6fdc38e2c64f3360c185332e691bf4
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 11:20:26 2014 -0800
+
+    rgw: http headers need to end with \r\n
+    
+    Fixes: #9254
+    Backport: firefly, giant
+    
+    Reported-by: Benedikt Fraunhofer <fraunhofer at traced.net>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7409ab3df18fb312dd6c9f79084f889c523afdce)
+
+commit 1cb09555d3fdb568296797cd83eb5557552f056c
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Nov 5 13:40:55 2014 -0800
+
+    rgw: remove swift user manifest (DLO) hash calculation
+    
+    Fixes: #9973
+    Backport: firefly, giant
+    
+    Previously we were iterating through the parts, creating hash of the
+    parts etags (as S3 does for multipart uploads). However, swift just
+    calculates the etag for the empty manifest object.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit ef6d3ad964d34bc526dc4435486bd5c8cdc3b230)
+
+commit e230fabf29c4660594d19027af49810e57b82e35
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 30 14:15:47 2014 -0700
+
+    rgw: swift GET / HEAD object returns X-Timestamp field
+    
+    Fixes: #8911
+    Backport: giant, firefly, dumpling
+    Swift clients expect X-Timestamp header, dump it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5b41d80b7fb9ed96c26801fc42c044191bb18d84)
+
+commit c24fab3065ba6d81435981b609f2b69c3d98d21d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jan 30 10:51:52 2015 -0800
+
+    rgw: use strict_strtoll() for content length
+    
+    instead of strict_strtol().
+    
+    Backport: giant, firefly
+    Fixes: #10701
+    
+    Reported-by: Axel Dunkel <ad at dunkel.de>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 1c25dbafb45caf1b261cfcec15b868a2ba6b5fef)
+
+commit 6aef29e31e9c7c7ccf8e95d573700c08218b2b45
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Nov 20 10:36:05 2014 -0800
+
+    rgw-admin: create subuser if needed when creating user
+    
+    Fixes: #10103
+    Backport: firefly, giant
+    This turned up after fixing #9973. Earlier we also didn't create the
+    subuser in this case, but we didn't really read the subuser info when it
+    was authenticating. Now we do that as required, so we end up failing the
+    authentication. This only applies to cases where a subuser was created
+    using 'user create', and not the 'subuser create' command.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 9ba17a321db06d3d76c9295e411c76842194b25c)
+
+commit a5cb39cbb6aee869b92ac20975b5c80a01210b63
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 17:07:30 2014 -0800
+
+    rgw: use s->bucket_attrs instead of trying to read obj attrs
+    
+    Fixes: #10307
+    Backport: firefly, giant
+    
+    This is needed, since we can't really read the bucket attrs by trying to
+    read the bucket entry point attrs. We already have the bucket attrs
+    anyway, use these.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5cf193c8686196d5235889e68cb5ea8f1fc8e556)
+
+commit 425ee8a07bb8ce12eee124b3c374031f644aa32b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 17:07:30 2014 -0800
+
+    rgw: use s->bucket_attrs instead of trying to read obj attrs
+    
+    Fixes: #10307
+    Backport: firefly, giant
+    
+    This is needed, since we can't really read the bucket attrs by trying to
+    read the bucket entry point attrs. We already have the bucket attrs
+    anyway, use these.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5cf193c8686196d5235889e68cb5ea8f1fc8e556)
+
+commit 83a0a2e5b52b18a25009faaf09fa4f48af3c52ee
+Author: William A. Kennington III <william at wkennington.com>
+Date:   Sat Sep 20 22:52:31 2014 -0700
+
+    osd: Cleanup boost optionals
+    
+    Signed-off-by: William A. Kennington III <william at wkennington.com>
+    (cherry picked from commit a53ead14c113047567177630b4906136a2109b65)
+
+commit eb30631ec3d081fd1bc2cdbd4812a334de9e1282
+Author: Petr Machata <pmachata at redhat.com>
+Date:   Thu Jan 29 10:15:02 2015 -0700
+
+    support Boost 1.57.0
+    
+    Sometime after 1.55, boost introduced a forward declaration of
+    operator<< in optional.hpp. In 1.55 and earlier, when << was used
+    without the _io having been included, what got dumped was an implicit
+    bool conversion.
+    
+    http://tracker.ceph.com/issues/10688 Refs: #10688
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 85717394c33137eb703a7b88608ec9cf3287f67a)
+    
+    Conflicts:
+    	src/include/encoding.h
+            trivial conflict
+
+commit 1ccd73a16e1829b5519ec5b83b2554af173ad052
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Oct 23 17:39:42 2014 -0700
+
+    rgw: send http status reason explicitly in fastcgi
+    
+    There are issues in certain versions of apache 2.4, where the reason is
+    not sent back. Instead, just provide the reason explicitly.
+    
+    Backport: firefly, giant
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit a9dd4af401328e8f9071dee52470a0685ceb296b)
+
+commit 3bf42af2e932a473b19cb54637e8543a666a4a28
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jan 15 16:31:22 2015 -0800
+
+    rgw: fix partial GET in swift
+    
+    Fixes: #10553
+    backport: firefly, giant
+    
+    Don't set the ret code to reflect partial download, just set the
+    response status when needed.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7e1553cedff90fa0fefded65cde87ad068eb5f0c)
+
+commit aa038684dce1964d5d23802d23f2bd772458ea11
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 15 17:04:32 2014 -0800
+
+    osd: handle no-op write with snapshot case
+    
+    If we have a transaction that does something to the object but it !exists
+    both before and after, we will continue through the write path.  If the
+    snapdir object already exists, and we try to create it again, we will
+    leak a snapdir obc and lock and later crash on an assert when the obc
+    is destroyed:
+    
+    0> 2014-12-06 01:49:51.750163 7f08d6ade700 -1 osd/osd_types.h: In function 'ObjectContext::~ObjectContext()' thread 7f08d6ade700 time 2014-12-06 01:49:51.605411
+    osd/osd_types.h: 2944: FAILED assert(rwstate.empty())
+    
+    Fix is to not recreated the snapdir if it already exists.
+    
+    Fixes: #10262
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 02fae9fc54c10b5a932102bac43f32199d4cb612)
+
+commit e045ad4a39076547209ac1dc298df5ebffb76669
+Merge: a463b92 9f865fa
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Tue Jan 27 09:40:16 2015 -0800
+
+    Merge pull request #3502 from ceph/wip-10382-giant
+    
+    [giant backport] mds: handle heartbeat_reset during shutdown
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 9f865fae095a1fe8a26acb50667f1d774d6020b6
+Author: John Spray <john.spray at redhat.com>
+Date:   Wed Jan 14 10:35:53 2015 +0000
+
+    mds: handle heartbeat_reset during shutdown
+    
+    Because any thread might grab mds_lock and call heartbeat_reset
+    immediately after a call to suicide() completes, this needs
+    to be handled as a special case where we tolerate MDS::hb having
+    already been destroyed.
+    
+    Fixes: #10382
+    Signed-off-by: John Spray <john.spray at redhat.com>
+
+commit a463b92e475cd1f4cdb963e402033ebc9d37dbdc
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jan 19 18:28:20 2015 -0800
+
+    ceph_test_rados_api_misc: do not assert rbd feature match
+    
+    This test fails on upgrades when we (or the server) have new
+    features.  Make it less fragile.
+    
+    Fixes: #10576
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9147c62989871cea8b3a85b02c53017825efb55b)
+
+commit 14cdb9bb6d27f2017a3a8e6c1f274b9f40fb7456
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Jan 21 14:55:02 2015 -0500
+
+    rbd: ensure aio_write buffer isn't invalidated during image import
+    
+    The buffer provided to aio_write shouldn't be invalidated until
+    after aio_write has indicated that the operation has completed.
+    
+    Fixes: #10590
+    Backport: giant
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 4d3b49e9d62bc1040356ca3ebe7f90c181734eb6)
+
+commit 081f49b47ca8d7583211f546ab5699b14f773bfc
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Dec 15 10:53:53 2014 -0500
+
+    librbd: complete all pending aio ops prior to closing image
+    
+    It was possible for an image to be closed while aio operations
+    were still outstanding.  Now all aio operations are tracked and
+    completed before the image is closed.
+    
+    Fixes: #10299
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 436923c68b77c900b7774fbef918c0d6e1614a36
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jan 19 10:28:56 2015 -0500
+
+    librbd: gracefully handle deleted/renamed pools
+    
+    snap_unprotect and list_children both attempt to scan all
+    pools. If a pool is deleted or renamed during the scan,
+    the methods would previously return -ENOENT. Both methods
+    have been modified to more gracefully handle this condition.
+    
+    Fixes: #10270
+    Backport: giant, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 4c8a5cedcb7942e1e01ab4cedfbf03e4c56cc1e4
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Dec 12 05:24:01 2014 -0800
+
+    rgw: change multipart upload id magic
+    
+    Fixes: #10271
+    Backport: firefly, giant
+    
+    Some clients can't sign requests correctly with the original magic
+    prefix.
+    
+    Reported-by: Georgios Dimitrakakis <giorgis at acmac.uoc.gr>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5fc7a0be67a03ed63fcc8408f8d71a31a1841076)
+
+commit b10c0d5110547586b2edac53c267391d3d42f974
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Dec 11 09:07:10 2014 -0800
+
+    rgw: url decode http query params correctly
+    
+    Fixes: #10271
+    Backport: firefly
+    
+    This got broken by the fix for #8702. Since we now only url_decode if
+    we're in query, we need to specify that we're in query when decoding
+    these args.
+    
+    Reported-by: Georgios Dimitrakakis <giorgis at acmac.uoc.gr>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 21e07eb6abacb085f81b65acd706b46af29ffc03)
+
+commit 65bf3b08b572b9b25ad064fb784742e5d6456f06
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Jan 14 15:01:38 2015 -0800
+
+    qa: ignore duplicates in rados ls
+    
+    These can happen with split or with state changes due to reordering
+    results within the hash range requested. It's easy enough to filter
+    them out at this stage.
+    
+    Backport: giant, firefly
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit e7cc6117adf653a4915fb7a75fac68f8fa0239ec)
+
+commit 1261bf24624f871672002ab0915e23f1c95b0aa5
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 14 12:42:40 2014 -0700
+
+    Revert "Objecter: disable fast dispatch of CEPH_MSG_OSD_OPREPLY messages"
+    
+    This reverts commit 3f23709c474292f9239f77a6cce26309fc86ce29.
+    
+    We have changed mark_down() behavior so that it no longer blocks on
+    fast dispatch.  This makes the objecter reply handler safe again.
+    
+    Fixes: #9598
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c9f9e72e558521cb90f90538bc27f995f82d76c2)
+
+commit 300d4c6ff7e998dba0c67f6dde746dc23d681397
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 14 12:41:48 2014 -0700
+
+    msg/simple: do not stop_and_wait on mark_down
+    
+    We originally blocked in mark_down for fast dispatch threads
+    to complete to avoid various races in the code.  Most of these
+    were in the OSD itself, where we were not prepared to get
+    messges on connections that had no attached session.  Since
+    then, the OSD checks have been cleaned up to handle this.
+    There were other races we were worried about too, but the
+    details have been lost in the depths of time.
+    
+    Instead, take the other route: make mark_down never block on
+    dispatch.  This lets us remove the special case that
+    was added in order to cope with fast dispatch calling
+    mark_down on itself.
+    
+    Now, the only stop_and_wait() user is the shutdown sequence.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 00907e032011b9d2acd16ea588555cf379830814)
+
+commit c3335c7aa6c1e6c3f1879c0cd3cd2f13091221be
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 31 16:25:09 2014 -0700
+
+    msg/Pipe: inject delay in stop_and_wait
+    
+    Inject a delay in stop_and_wait.  This will mostly affect the connection
+    race Pipe takeover code which currently calls stop_and_wait while holding
+    the msgr->lock.  This should make it easier for a racing fast_dispatch
+    method to get stuck on a call that (indirectly) needs the msgr lock.
+    See #9921.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2fe5c4c305218fdb1771857e4e0ef7c98a8d0fb6)
+
+commit 1dbe8f5a6f7bf2b7c86d24f27d569d71e0076ee9
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Tue Oct 28 16:45:43 2014 -0700
+
+    SimpleMessenger: Pipe: do not block on takeover while holding global lock
+    
+    We previously were able to cause deadlocks:
+    1) Existing pipe is fast_dispatching
+    2) Replacement incoming pipe is accepted
+      *) blocks on stop_and_wait() of existing Pipe
+    3) External things are blocked on SimpleMessenger::lock() while
+      blocking completion of the fast dispatch.
+    
+    To resolve this, if we detect that an existing Pipe we want to take over is
+    in the process of fast dispatching, we unlock our locks and wait on it to
+    finish. Then we go back to the lookup step and retry.
+    
+    The effect of this should be safe:
+    1) We are not making any changes to the existing Pipe in new ways
+    2) We have not registered the new Pipe anywhere
+    3) We have not sent back any replies based on Messenger state to
+       the remote endpoint.
+    
+    Backport: giant
+    Fixes: #9921
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 2d6980570af2226fdee0edfcfe5a8e7f60fae615)
+
+commit 16c023d8fa5575d4dd138aeee4d4fd9b8f32c0f6
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 8 13:34:52 2015 -0800
+
+    osd: requeue PG when we skip handling a peering event
+    
+    If we don't handle the event, we need to put the PG back into the peering
+    queue or else the event won't get processed until the next event is
+    queued, at which point we'll be processing events with a delay.
+    
+    The queue_null is not necessary (and is a waste of effort) because the
+    event is still in pg->peering_queue and the PG is queued.
+    
+    Note that this only triggers when we exceeed osd_map_max_advance, usually
+    when there is a lot of peering and recovery activity going on.  A
+    workaround is to increase that value, but if you exceed osd_map_cache_size
+    you expose yourself to crache thrashing by the peering work queue, which
+    can cause serious problems with heavily degraded clusters and bit lots of
+    people on dumpling.
+    
+    Backport: giant, firefly
+    Fixes: #10431
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 492ccc900c3358f36b6b14a207beec071eb06707)
+
+commit 16c6d0d589d53aad7bb2cd0e104300fb920d5caf
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 16 13:31:30 2014 +0100
+
+    erasure-code: relax cauchy w restrictions
+    
+    A restriction that the w parameter of the cauchy technique is limited to
+    8, 16 or 32 was added incorrectly while refactoring parameter parsing in
+    the jerasure plugin and must be relaxed.
+    
+    http://tracker.ceph.com/issues/10325 Fixes: #10325
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit bb80437f247345502203ad87a7e7bbb5b5602b9a)
+
+commit 636b98faa6b1c9fd6de1b8653d1d282577b54684
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 23 18:50:51 2014 -0800
+
+    crush/CrushWrapper: fix create_or_move_item when name exists but item does not
+    
+    We were using item_exists(), which simply checks if we have a name defined
+    for the item.  Instead, use _search_item_exists(), which looks for an
+    instance of the item somewhere in the hierarchy.  This matches what
+    get_item_weightf() is doing, which ensures we get a non-negative weight
+    that converts properly to floating point.
+    
+    Backport: giant, firefly
+    Fixes: #9998
+    Reported-by: Pawel Sadowski <ceph at sadziu.pl>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9902383c690dca9ed5ba667800413daa8332157e)
+
+commit ced2472664fab06d03de03d7b23325f9319163b7
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Nov 21 17:47:56 2014 -0800
+
+    crush/builder: prevent bucket weight underflow on item removal
+    
+    It is possible to set a bucket weight that is not the sum of the item
+    weights if you manually modify/build the CRUSH map.  Protect against any
+    underflow on the bucket weight when removing items.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8c87e9502142d5b4a282b94f929ae776a49be1dc)
+
+commit adf8798dabb679110c6815af5d73ab6ff20a1af8
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Nov 21 17:37:03 2014 -0800
+
+    crush/CrushWrapper: fix _search_item_exists
+    
+    Reported-by: Pawel Sadowski <ceph at sadziu.pl>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit eeadd60714d908a3a033aeb7fd542c511e63122b)
+
+commit 6caa4fa42c6eaa76b3b9caf37e4ee09844f017a7
+Author: Warren Usui <warren.usui at inktank.com>
+Date:   Thu Dec 18 20:00:28 2014 -0800
+
+    If trusty, use older version of qemu
+    
+    Fixes #10319
+    Signed-off-by: Warren Usui <warren.usui at inktank.com>
+    (cherry-picked from 46a1a4cb670d30397979cd89808a2e420cef2c11)
+
+commit 44c944e96440bd338d22533779e0650b99115a16
+Merge: abdbbd6 910ec62
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 29 10:55:22 2014 -0800
+
+    Merge pull request #3266 from ceph/giant-10415
+    
+    libcephfs/test.cc: close fd before umount
+
+commit b1e48820785a1d3153fc926ad21355b3927b44e9
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Dec 28 10:29:54 2014 +0100
+
+    erasure-code: update links to jerasure upstream
+    
+    It moved from bitbucket to jerasure.org
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 8e86f901939f16cc9c8ad7a4108ac4bcf3916d2c)
+
+commit 910ec624156d26a1830078161f47328a950a4eee
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue Dec 23 10:22:00 2014 +0800
+
+    libcephfs/test.cc: close fd before umount
+    
+    Fixes: #10415
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit d3fb563cee4c4cf08ff4ee01782e52a100462429)
+
+commit abdbbd6e846727385cf0a1412393bc9759dc0244
+Author: Warren Usui <warren.usui at inktank.com>
+Date:   Tue Dec 16 22:01:26 2014 -0800
+
+    Remove sepia dependency (use fqdn)
+    
+    Fixes: #10255
+    Signed-off-by: Warren Usui <warren.usui at inktank.com>
+    (cherry picked from commit 19dafe164833705225e168a686696fb4e170aba7)
+
+commit d1257436fdf79bad5fe0719a6be71e2abb2d2462 (refs/remotes/gh/giant-10277)
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Wed Dec 17 15:59:44 2014 +0800
+
+    client: use remount to trim kernel dcache
+    
+    when remounting a file system, linux kernel trims all unused dentry
+    in the file system.
+    
+    Fixes: #10277
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+
+commit 9de9901cacd2ed2c8c5f65a938fb6a996efab4cd
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Wed Dec 17 15:46:49 2014 +0800
+
+    client: cleanup client callback registration
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+
+commit d28c8e0fb924fbf36e4e15e19554ad30da3ff8f2 (refs/remotes/gh/wip-giant-mon-backports)
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 2 08:50:59 2014 -0800
+
+    mon/PGMap and PGMonitor: update last_epoch_clean cache from new osd keys
+    
+    We were only invalidating the cached value from apply_incremental, which
+    is no longer called on modern clusters.
+    
+    Fix this by storing the update epoch in the key as well (it is not part
+    of osd_stat_t).
+    
+    Backport: giant, firefly, dumpling(?)
+    Fixes: #9987
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 093c5f0cabeb552b90d944da2c50de48fcf6f564)
+
+commit 7646f239476609c96b6baf94dfd5f727fff49502
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Nov 2 08:49:48 2014 -0800
+
+    mon/PGMap: invalidate cached min_last_epoch_clean from new-style pg keys
+    
+    We were only invalidating the cache from the legacy apply_incremental(),
+    which is no longer called on modern clusters.
+    
+    Fixes: #9987
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3fb731b722c50672a5a9de0c86a621f5f50f2d06)
+
+commit 6ec14b07940ff64d6a121e21a730f691a1a71546
+Merge: 758d9cf 7bbf80f
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Thu Dec 11 17:03:07 2014 -0800
+
+    Merge pull request #3159 from ceph/wip-10229-giant
+    
+    osdc/Filer: use finisher to execute C_Probe and C_PurgeRange [giant backport]
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 7bbf80ff7388f104cf318dd5ac61ca7d35274694
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Dec 4 12:18:47 2014 +0800
+
+    osdc/Filer: use finisher to execute C_Probe and C_PurgeRange
+    
+    Currently contexts C_Probe/C_PurgeRange are executed while holding
+    OSDSession::completion_lock. C_Probe and C_PurgeRange may call
+    Objecter::stat() and Objecter::remove() respectively, which acquire
+    Objecter::rwlock. This can cause deadlock because there is intermediate
+    dependency between Objecter::rwlock and OSDSession::completion_lock:
+    
+     Objecter::rwlock -> OSDSession::lock -> OSDSession::completion_lock
+    
+    The fix is exexcute C_Probe/C_PurgeRange in finisher thread.
+    
+    Fixes: #10229
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit d3ee89ace660161df7796affbf9a70f3d0dedce1)
+
+commit 758d9cf30bfc7736cc297ba3b047756f7eb8183e
+Merge: a8e5638 994dcbb
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Thu Dec 11 10:47:38 2014 -0800
+
+    Merge pull request #3151 from ceph/wip-10288-giant
+    
+    mon: fix `fs ls` on peons [giant backport]
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 994dcbbef4bea532aea4143c3ac1372ca14d2aea
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Dec 11 14:00:57 2014 +0000
+
+    mon: fix `fs ls` on peons
+    
+    This was incorrectly using pending_mdsmap instead
+    of mdsmap.  We didn't notice in test because of
+    single-mon configurations.
+    
+    Fixes: #10288
+    Backport: giant
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 5559e6aea9e9374ecdac0351777dfd6f5f5d1e67)
+
+commit 319f9c9352bfd1b95bd685500922e6cee2199b34 (refs/remotes/gh/wip-8797-giant)
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Wed Dec 10 13:19:53 2014 -0800
+
+    Call Rados.shutdown() explicitly before exit
+    
+    This is mostly a demonstration of good behavior, as the resources will
+    be reclaimed on exit anyway.
+    
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit b038e8fbf9103cc42a4cde734b3ee601af6019ea)
+
+commit ed8c9af3376aeb6f245cbab694fdbc0ce95634a8
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Wed Dec 10 13:19:16 2014 -0800
+
+    rados.py: remove Rados.__del__(); it just causes problems
+    
+    Recent versions of Python contain a change to thread shutdown that
+    causes ceph to hang on exit; see http://bugs.python.org/issue21963.
+    As it turns out, this is relatively easy to avoid by not spawning
+    threads on exit, as Rados.__del__() will certainly do by calling
+    shutdown(); I suspect, but haven't proven, that the problem is
+    that shutdown() tries to start() a threading.Thread() that never
+    makes it all the way back to signal start().
+    
+    Also add a PendingReleaseNote and extra doc comments to clarify.
+    
+    Fixes: #8797
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit 5ba9b8f21f8010c59dd84a0ef2acfec99e4b048f)
+    
+    Conflicts:
+    	PendingReleaseNotes
+
+commit a8e56380f08cd5940def4cc47cadba699a8ba45d
+Merge: 247a6fa e7faed5
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Mon Dec 8 13:19:20 2014 -0800
+
+    Merge pull request #3010 from dachary/wip-10018-primary-erasure-code-hinfo-giant
+    
+    osd: deep scrub must not abort if hinfo is missing (giant)
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 247a6fac54854e92a7df0e651e248a262d3efa05
+Merge: 3372060 309fd5f
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Mon Dec 8 12:36:48 2014 -0800
+
+    Merge pull request #3110 from ceph/giant-10263
+    
+    mds: store backtrace for straydir
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 309fd5f56ef5ea76ffd525fdde6e6fbbc9ef6ef1
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Nov 7 11:38:37 2014 +0800
+
+    mds: store backtrace for straydir
+    
+    Backport: giant, firefly, emperor, dumpling
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 0d89db5d3e5ae5d552d4058a88a4e186748ab1d2)
+
+commit 3372060894a1da0adef6d36380a131902ca05c5f
+Merge: 1f00420 bff6747
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Dec 6 11:06:20 2014 -0800
+
+    Merge pull request #3088 from dachary/wip-10063-hobject-shard-giant
+    
+    common: do not omit shard when ghobject NO_GEN is set (giant)
+
+commit 1f004209434570337a3f90d7f89741f80dcc7075
+Merge: 3b65226 1ec557c
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 17:33:12 2014 -0800
+
+    Merge pull request #3095 from dachary/wip-9785-dmcrypt-keys-permissions-giant
+    
+    ceph-disk: dmcrypt file permissions (giant)
+
+commit 3b65226df806958f6a2f24df6099ee3a86d2a71f
+Merge: 691f011 36c7484
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 17:30:31 2014 -0800
+
+    Merge pull request #3006 from dachary/wip-9420-erasure-code-non-regression-giant
+    
+     erasure-code: store and compare encoded contents (giant)
+
+commit 1ec557c0eab94cb898ad3f5448482bd7afc53e09
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Dec 4 22:21:32 2014 +0100
+
+    ceph-disk: dmcrypt file permissions
+    
+    The directory in which key files are stored for dmcrypt must be 700 and
+    the file 600.
+    
+    http://tracker.ceph.com/issues/9785 Fixes: #9785
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 58682d1776ab1fd4daddd887d921ca9cc312bf50)
+
+commit 691f0118ecd051d5f3f61fc696280e3c482de3de
+Merge: 81295c5 dabf6f5
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Dec 5 09:03:54 2014 -0800
+
+    Merge pull request #3085 from dachary/wip-10125-radosgw-init-giant
+    
+    rgw: run radosgw as apache with systemd (giant)
+
+commit bff67475c775914237604ed3374c8ccfe74d0ffd
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Nov 14 01:16:10 2014 +0100
+
+    common: do not omit shard when ghobject NO_GEN is set
+    
+    Do not silence the display of shard_id when generation is NO_GEN.
+    Erasure coded objects JSON representation used by ceph_objectstore_tool
+    need the shard_id to find the file containing the chunk.
+    
+    Minimal testing is added to ceph_objectstore_tool.py
+    
+    http://tracker.ceph.com/issues/10063 Fixes: #10063
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit dcf09aed121f566221f539106d10283a09f15cf5)
+
+commit dabf6f5f43b53a588bd9fa0cc5aa617ae8128735
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 2 18:10:48 2014 +0100
+
+    rgw: run radosgw as apache with systemd
+    
+    Same as sysv.
+    
+    http://tracker.ceph.com/issues/10125 Fixes: #10125
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 7b621f4abf63456272dec3449aa108c89504a7a5)
+    
+    Conflicts:
+    	src/init-radosgw.sysv
+
+commit 81295c5ad2befced2e308c1cfb4e036cd5a825a9
+Merge: 8046359 3ff94ed
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Dec 4 11:32:01 2014 -0800
+
+    Merge pull request #3077 from ceph/wip-10030-giant
+    
+    librbd: don't close an already closed parent image upon failure
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit ad04a677cefc1f0a02fbff0c68409fda6874fdc7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 2 00:59:08 2014 +0100
+
+    common: add bufferlist::rebuild_aligned_size_and_memory
+    
+    The function bufferlist::rebuild_aligned checks memory and size
+    alignment with the same variable. It is however useful to separate
+    memory alignment constraints from size alignment constraints. For
+    instance rebuild_aligned could be called to allocate an erasure coded
+    buffer where each 2048 bytes chunk needs to start on a memory address
+    aligned on 32 bytes.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 9ade88e8dacc9b96c042bb668f4452447139a544)
+
+commit cc469b238f42ce989d0efa49154b95612e3d4111
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 2 01:07:34 2014 +0100
+
+    erasure-code: enforce chunk size alignment
+    
+    Let say the ErasureCode::encode function is given a 4096 bytes
+    bufferlist made of a 1249 bytes bufferptr followed by a 2847 bytes
+    bufferptr, both properly starting on SIMD_ALIGN address. As a result the
+    second 2048 had to be reallocated when bufferlist::substr_of gets the
+    second 2048 buffer, the address starts at 799 bytes after the beginning
+    of the 2847 buffer ptr and is not SIMD_ALIGN'ed.
+    
+    The ErasureCode::encode must enforce a size alignment based on the chunk
+    size in addition to the memory alignment required by SIMD operations,
+    using the bufferlist::rebuild_aligned_size_and_memory function instead of
+    bufferlist::rebuild_aligned.
+    
+    http://tracker.ceph.com/issues/10211 Fixes: #10211
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 4e955f41297283798236c505c3d21bdcabb5caa0)
+
+commit 5205d4dacf7ebe2e42d2294bc30cb27f226c8d22
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 2 02:04:14 2014 +0100
+
+    common: allow size alignment that is not a power of two
+    
+    Do not assume the alignment is a power of two in the is_n_align_sized()
+    predicate. When used in the context of erasure code it is common
+    for chunks to not be powers of two.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 73ad2d63d479b09037d50246106bbd4075fbce80)
+
+commit 80463596919d28f58010d16ad017b3c5ae6e558c
+Merge: 26e8cf1 3dc6298
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Dec 3 23:02:43 2014 -0800
+
+    Merge pull request #3062 from ceph/wip-10123-giant
+    
+    librbd: protect list_children from invalid child pool IoCtxs
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 26e8cf174b8e76b4282ce9d9c1af6ff12f5565a9
+Merge: aac7946 7cd8c3f
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Wed Dec 3 06:44:56 2014 -0800
+
+    Merge pull request #3055 from ceph/wip-10135-giant
+    
+    mon: OSDMonitor: allow adding tiers to FS pools
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 7cd8c3f8a5afa9481b6f6a78d5fb8c04784ef4ca (refs/remotes/gh/wip-10135-giant)
+Author: John Spray <john.spray at redhat.com>
+Date:   Tue Nov 25 16:54:42 2014 +0000
+
+    mon: OSDMonitor: allow adding tiers to FS pools
+    
+    This was an overly-strict check.  In fact it is perfectly
+    fine to set an overlay on a pool that is already in use
+    as a filesystem data or metadata pool.
+    
+    Fixes: #10135
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 17b5fc9a40440e76dd1fa64f7fc19577ae3b58ce)
+
+commit 3ff94ed73ff27af2c8ea215ab693d815e285a27f
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Nov 6 05:01:38 2014 -0500
+
+    librbd: don't close an already closed parent image upon failure
+    
+    If librbd is not able to open a child's parent image, it will
+    incorrectly close the parent image twice, resulting in a crash.
+    
+    Fixes: #10030
+    Backport: firefly, giant
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 61ebfebd59b61ffdc203dfeca01ee1a02315133e)
+
+commit aac794616580ed0bb00608c5867199b12d4e1d94
+Merge: 65f6814 c8b46d6
+Author: John Spray <jcspray at gmail.com>
+Date:   Tue Dec 2 11:35:59 2014 +0000
+
+    Merge pull request #2990 from ceph/wip-10151-giant
+    
+    mon: fix MDS health status from peons
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 3dc629822adeee961d78208b46b9bd7ef1200890
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 17 21:49:26 2014 -0500
+
+    librbd: protect list_children from invalid child pool IoCtxs
+    
+    While listing child images, don't ignore error codes returned
+    from librados when creating an IoCtx. This will prevent seg
+    faults from occurring when an invalid IoCtx is used.
+    
+    Fixes: #10123
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0d350b6817d7905908a4e432cd359ca1d36bab50)
+
+commit 65f6814847fe8644f5d77a9021fbf13043b76dbe
+Merge: 28e2708 9158326
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Mon Dec 1 17:59:19 2014 -0800
+
+    Merge pull request #3047 from ceph/wip-10011-giant
+    
+    osdc: fix Journaler write error handling [giant backport]
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 9158326eeb69312283a6e8174352f36ea30d0cbf
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Nov 6 11:46:29 2014 +0000
+
+    osdc: fix Journaler write error handling
+    
+    Since we started wrapping the write error
+    handler in a finisher, multiple calls to
+    handle_write_error would hit the assert()
+    on the second call before the actual
+    handler had been called (at the other end
+    of the finisher) from the first call.
+    
+    The symptom was that the MDS was intermittently
+    failing to respawn on blacklist, seen in #10011.
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 762eda88a18ba707bd5410f38e21e95c4a6b3a46)
+
+commit 28e27080e25f95851039a0cc4e1c1d06b2cd597d
+Merge: 37ffccb cb1d681
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Nov 25 21:18:59 2014 -0800
+
+    Merge pull request #3005 from dachary/wip-9665-ceph-disk-partprobe-giant
+    
+    ceph disk zap must call partprobe
+
+commit e7faed5d903cf7681d77a6af53cf8137eeb2fc69
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Nov 6 17:11:20 2014 +0100
+
+    osd: deep scrub must not abort if hinfo is missing
+    
+    Instead it should set read_error.
+    
+    http://tracker.ceph.com/issues/10018 Fixes: #10018
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 9d84d2e8309d26e39ca849a75166d2d7f2dec9ea)
+
+commit 36c7484c18fd072ba2f7b176403414dd32fbe92b
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Sep 25 14:46:07 2014 +0200
+
+    erasure-code: erasure_code_benchmark exhaustive erasure exploration
+    
+    Add the --erasure-generation exhaustive flag to try all combinations of
+    erasures, not just one at random.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 2d7adb23bc52e7c0753f4571fecd8eefa209ef02)
+    
+    Conflicts:
+    	src/test/erasure-code/ceph_erasure_code_benchmark.h
+
+commit 32daa9b0f4d39f8a49512b18d5c19437aca5fec6
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Mon Sep 29 11:17:13 2014 +0200
+
+    erasure-code: add erasure_code_benchmark --verbose
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 3ff2816b3eecfb7277295583387549dac5429628)
+    
+    Conflicts:
+    	src/test/erasure-code/ceph_erasure_code_benchmark.cc
+    	src/test/erasure-code/ceph_erasure_code_benchmark.h
+
+commit da9a7f07787d7f8c20b0c3e7a53fcaf95ed7ca20
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Sep 23 14:37:57 2014 +0200
+
+    erasure_code: implement ceph_erasure_code to assert the existence of a plugin
+    
+    This is handy when scripting in the context of teuthology and only
+    conditionally run tests for the isa plugin, for instance.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit efe121d9f2028c312eef2650d32ccf0cbc828edb)
+
+commit c855f3958fb8c10bd824075c1739f40799f6d74b
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Sep 23 14:36:08 2014 +0200
+
+    erasure-code: ceph_erasure_code does not need to avoid dlclose
+    
+    The only reason for not dlclosing plugins at exit is for callgrind but
+    ceph_erasure_code has no workload that would require callgrind.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 49613cb2aab6e73e3ea50fa164735b55e80121cd)
+
+commit ba8ceb1f067e0f9f6419358435ed0008b61fa438
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Tue Sep 23 11:38:09 2014 +0200
+
+    erasure-code: add corpus verification to make check
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 6fdbdff2ad1b55d4a37dcb95cfbb06c4454cdaf2)
+
+commit ca4c2702139cc7fd8f2e3fa2ee5cda4094ecad79
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 13 12:58:27 2014 +0200
+
+    erasure-code: Makefile.am cosmetics
+    
+    Cluster benchmark related lines together.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 10c88c8f27080a8e25f128b7065cee5c2f68e91b)
+
+commit 208a5ee1c9975adaa8b09b1bf541aff0d8551c63
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 13 12:55:26 2014 +0200
+
+    erasure-code: s/alignement/alignment/ typos in jerasure
+    
+    The jerasure-per-chunk-alignment prameter was mispelled and while
+    useable that would lead to confusion.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 2c84d0b1db57d918840e669a17bbd8c5ddca9747)
+
+commit 1def82d530965bd0441e4f7f6aa032666984f17d
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 13 13:36:09 2014 +0200
+
+    erasure-code: workunit to check for encoding regression
+    
+    Clone the archive of encoded objects and decode all archived objects, up
+    to and including the current ceph version.
+    
+    http://tracker.ceph.com/issues/9420 Refs: #9420
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 7638b15f23976c3265cf766e16cf93af1a7e0091)
+
+commit 1b7fc7e49e6edf0d0f7d1d6d9f9447c42067d8b8
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Sat Sep 13 10:16:31 2014 +0200
+
+    erasure-code: store and compare encoded contents
+    
+    Introduce ceph_erasure_code_non_regression to check and compare how an
+    erasure code plugin encodes and decodes content with a given set of
+    parameters. For instance:
+    
+    ./ceph_erasure_code_non_regression \
+          --plugin jerasure \
+          --parameter technique=reed_sol_van \
+          --parameter k=2 \
+          --parameter m=2 \
+          --stripe-width 3181 \
+          --create \
+          --check
+    
+    Will create an encoded object (--create) and store it into a directory
+    along with the chunks, one chunk per file. The directory name is derived
+    from the parameters. The content of the object is a random pattern of 31
+    bytes repeated to fill the object size specified with --stripe-width.
+    
+    The check function (--check) reads the object back from the file,
+    encodes it and compares the result with the content of the chunks read
+    from the files. It also attempts recover from one or two erasures.
+    
+    Chunks encoded by a given version of Ceph are expected to be encoded
+    exactly in the same way by all Ceph versions going forward.
+    
+    http://tracker.ceph.com/issues/9420 Refs: #9420
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit f5901303dbf50e9d08f2f1e510a1936a20037909)
+
+commit cb1d68113477cf9c2028a65372d2d4a3e6a8bdc1
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Oct 9 18:52:17 2014 +0200
+
+    ceph-disk: run partprobe after zap
+    
+    Not running partprobe after zapping a device can lead to the following:
+    
+    * ceph-disk prepare /dev/loop2
+    * links are created in /dev/disk/by-partuuid
+    * ceph-disk zap /dev/loop2
+    * links are not removed from /dev/disk/by-partuuid
+    * ceph-disk prepare /dev/loop2
+    * some links are not created in /dev/disk/by-partuuid
+    
+    This is assuming there is a bug in the way udev events are handled by
+    the operating system.
+    
+    http://tracker.ceph.com/issues/9665 Fixes: #9665
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit fed3b06c47a5ef22cb3514c7647544120086d1e7)
+
+commit d9c04b880d8bf867aa454132117119be5bd550ad
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 10 10:26:31 2014 +0200
+
+    ceph-disk: use update_partition in prepare_dev and main_prepare
+    
+    In the case of prepare_dev the partx alternative was missing and is not
+    added because update_partition does it.
+    
+    http://tracker.ceph.com/issues/9721 Fixes: #9721
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 23e71b1ee816c0ec8bd65891998657c46e364fbe)
+
+commit 5c9cd3c2a292ae540fd0a487defaf4d712e41e62
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 10 10:23:34 2014 +0200
+
+    ceph-disk: encapsulate partprobe / partx calls
+    
+    Add the update_partition function to reduce code duplication.
+    The action is made an argument although it always is -a because it will
+    be -d when deleting a partition.
+    
+    Use the update_partition function in prepare_journal_dev
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 922a15ea6865ef915bbdec2597433da6792c1cb2)
+
+commit c8b46d68c71f66d4abbda1230741cc4c7284193b
+Author: John Spray <john.spray at redhat.com>
+Date:   Mon Nov 24 11:00:25 2014 +0000
+
+    mon: fix MDS health status from peons
+    
+    The health data was there, but we were attempting
+    to enumerate MDS GIDs from pending_mdsmap (empty on
+    peons) instead of mdsmap (populated from paxos updates)
+    
+    Fixes: #10151
+    Backport: giant
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 0c33930e3a90f3873b7c7b18ff70dec2894fce29)
+    
+    Conflicts:
+    	src/mon/MDSMonitor.cc
+
+commit 37ffccbd57e7e441e0eb1499e5c173aa9c375d35
+Merge: b13a56a 65c5657
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Nov 20 13:13:33 2014 -0800
+
+    Merge pull request #2975 from ceph/wip-9936-giant
+    
+    rbd: Fix the rbd export when image size more than 2G
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit b13a56afe99c091600392a2fc15befa9438d59c9
+Merge: 828c1a2 46bd344
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Wed Nov 19 02:40:47 2014 +0100
+
+    Merge pull request #2963 from ceph/wip-10114-giant
+    
+    Wip 10114 giant
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 828c1a2bcd81a49264f8a81ca7f1070169037820
+Merge: ccfd241 6cb9a24
+Author: David Zafman <david.zafman at inktank.com>
+Date:   Tue Nov 18 15:48:16 2014 -0800
+
+    Merge pull request #2958 from ceph/wip-10128-giant
+    
+    ceph_objectstore_tool: When exporting to stdout, don't cout messages
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 46bd3441b00c22ba78f04617fd77f0231ccc698d
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Tue Nov 18 15:21:30 2014 -0800
+
+    erasure-code isa-l: remove duplicated lines (fix warning)
+    
+    06a245a added a section def to assembly files; I added it twice to
+    this file.  There's no damage, but a compiler warning (on machines with
+    yasm installed)
+    
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit 10f6ef185a9d09e396e94036ec90bfe8a0738ce9)
+
+commit 1bba3887038aade137a808d751561cc02002f4bf
+Author: Dan Mick <dan.mick at redhat.com>
+Date:   Fri Nov 14 17:59:57 2014 -0800
+
+    Add annotation to all assembly files to turn off stack-execute bit
+    
+    See discussion in http://tracker.ceph.com/issues/10114
+    
+    Building with these changes allows output from readelf like this:
+    
+     $ readelf -lW src/.libs/librados.so.2 | grep GNU_STACK
+      GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000
+    0x000000 RW  0x8
+    
+    (note the absence of 'X' in 'RW')
+    
+    Fixes: #10114
+    Signed-off-by: Dan Mick <dan.mick at redhat.com>
+    (cherry picked from commit 06a245a9845c0c126fb3106b41b2fd2bc4bc4df3)
+
+commit 6cb9a2499cac2645e2cc6903ab29dfd95aac26c7
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Nov 17 23:02:50 2014 -0800
+
+    ceph_objectstore_tool: When exporting to stdout, don't cout messages
+    
+    Fixes: #10128
+    Caused by a2bd2aa7
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0d5262ac2f69ed3996af76a72894b1722a27b37d)
+
+commit 13bb880b2a04ab354506eb183d2907b9054bf937
+Author: Sebastien Ponce <sebastien.ponce at cern.ch>
+Date:   Tue Nov 18 10:30:36 2014 +0100
+
+    Fixed locking issue in the trun method of libradosstriper leading to potential race conditions - Fixes: #10129
+    
+    Signed-off-by: Sebastien Ponce <sebastien.ponce at cern.ch>
+    (cherry picked from commit 8613984373de946e1815cc84d50bbd4437a3f7a7)
+
+commit 65c565701eb6851f4ed4d2dbc1c7136dfaad6bcb
+Author: Vicente Cheng <freeze.bilsted at gmail.com>
+Date:   Wed Oct 29 12:21:11 2014 +0800
+
+    rbd: Fix the rbd export when image size more than 2G
+    
+    When using export <image-name> <path> and the size of image is more
+    than 2G, the previous version about finish() could not handle in
+    seeking the offset in image and return error.
+    
+    This is caused by the incorrect variable type. Try to use the correct
+    variable type to fixed it.
+    
+    I use another variable which type is uint64_t for confirming seeking
+    and still use the previous r for return error.
+    
+    uint64_t is more better than type int for handle lseek64().
+    
+    Signed-off-by: Vicente Cheng <freeze.bilsted at gmail.com>
+    (cherry picked from commit 4b87a81c86db06f6fe2bee440c65fc05cd4c23ce)
+
+commit ccfd2414c68afda55bf4cefa2441ea6d53d87cc6
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Nov 12 17:11:10 2014 -0800
+
+    osd/OSD: use OSDMap helper to determine if we are correct op target
+    
+    Use the new helper.  This fixes our behavior for EC pools where targetting
+    a different shard is not correct, while for replicated pools it may be. In
+    the EC case, it leaves the op hanging indefinitely in the OpTracker because
+    the pgid exists but as a different shard.
+    
+    Fixes: #9835
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9e05ba086a36ae9a04b347153b685c2b8adac2c3)
+
+commit 963947718a954f63f351ce4034bf97380421ab7c
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Nov 12 17:04:35 2014 -0800
+
+    osd/OSDMap: add osd_is_valid_op_target()
+    
+    Helper to check whether an osd is a given op target for a pg.  This
+    assumes that for EC we always send ops to the primary, while for
+    replicated we may target any replica.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 89c02637914ac7332e9dbdbfefc2049b2b6c127d)
+
+commit 0cb32c157c6c11b26607521a20c6f320c5170516
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Tue Nov 11 18:16:02 2014 -0800
+
+    qa: allow small allocation diffs for exported rbds
+    
+    The local filesytem may behave slightly differently. This isn't
+    foolproof, but seems to be reliable enough on rhel7 rootfs, where
+    exact comparison was failing.
+    
+    Fixes: #10002
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit e94d3c11edb9c9cbcf108463fdff8404df79be33)
+
+commit fe705c8fdef2371d3f5b11eb73f87a0cf6ef0f9e
+Author: Adam Crume <adamcrume at gmail.com>
+Date:   Thu Sep 18 16:57:27 2014 -0700
+
+    common: Add cctid meta variable
+    
+    Fixes: #6228
+    Signed-off-by: Adam Crume <adamcrume at gmail.com>
+    (cherry picked from commit bb45621cb117131707a85154292a3b3cdd1c662a)
+
+commit 5fc659a0d52094a4c595ca8b33b407ecdefc180a
+Merge: b27f5db a6c02a1
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Nov 11 08:28:19 2014 -0800
+
+    Merge pull request #2804 from ceph/wip-9301-giant
+    
+    mon: backport paxos off-by-one bug (9301) to giant
+
+commit b27f5dba8677ca48c9819980e3c90b76f5f04267
+Merge: 97e423f fc5354d
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Mon Nov 10 22:41:19 2014 -0800
+
+    Merge pull request #2887 from ceph/wip-9977-backport
+    
+    tools: skip up to expire_pos in journal-tool
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 97e423f52155e2902bf265bac0b1b9ed137f8aa0
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Thu Sep 11 09:36:44 2014 +0800
+
+    client: trim unused inodes before reconnecting to recovering MDS
+    
+    So the recovering MDS does not need to fetch these ununsed inodes during
+    cache rejoin. This may reduce MDS recovery time.
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 2bd7ceeff53ad0f49d5825b6e7f378683616dffb)
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 387efc5fe1fb148ec135a6d8585a3b8f8d97dbf8
+Author: John Spray <john.spray at redhat.com>
+Date:   Mon Oct 27 12:02:17 2014 +0000
+
+    client: allow xattr caps in inject_release_failure
+    
+    Because some test environments generate spurious
+    rmxattr operations, allow the client to release
+    'X' caps.  Allows xattr operations to proceed
+    while still preventing client releasing other caps.
+    
+    Fixes: #9800
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 5691c68a0a44eb2cdf0afb3f39a540f5d42a5c0c)
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit fc5354dec55248724f8f6b795e3a96882c33b490 (refs/remotes/gh/wip-9977-backport)
+Author: John Spray <john.spray at redhat.com>
+Date:   Mon Nov 3 19:19:45 2014 +0000
+
+    tools: skip up to expire_pos in journal-tool
+    
+    Previously worked for journals starting from an
+    object boundary (i.e. freshly created filesystems)
+    
+    Fixes: #9977
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 65c33503c83ff8d88781c5c3ae81d88d84c8b3e4)
+    
+    Conflicts:
+    	src/tools/cephfs/JournalScanner.cc
+
+commit 9680613141b3eef62f35a6728e654efa5f6ba8e8
+Merge: fd4363d a5984ba
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Fri Nov 7 16:26:54 2014 -0800
+
+    Merge pull request #2876 from ceph/giant-readdir-fix
+    
+    Giant readdir fix
+
+commit fd4363d1bd49f73e1b3c22516686c7b7e1745b57
+Merge: f66bf31 7166ff8
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Fri Nov 7 14:10:40 2014 -0800
+
+    Merge pull request #2879 from ceph/wip-10025-giant
+    
+    #10025/giant -- tools: fix MDS journal import
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 7166ff83f6343d31d52a58363e2767434554505c
+Author: John Spray <john.spray at redhat.com>
+Date:   Fri Nov 7 11:34:43 2014 +0000
+
+    tools: fix MDS journal import
+    
+    Previously it only worked on fresh filesystems which
+    hadn't been trimmed yet, and resulted in an invalid
+    trimmed_pos when expire_pos wasn't on an object
+    boundary.
+    
+    Fixes: #10025
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit fb29e71f9a97c12354045ad2e128156e503be696)
+
+commit a5984ba34cb684dae623df22e338f350c8765ba5
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Mon Oct 27 13:57:16 2014 -0700
+
+    client: fix I_COMPLETE_ORDERED checking
+    
+    Current code marks a directory inode as complete and ordered when readdir
+    finishes, but it does not check if the directory was modified in the middle
+    of readdir. This is wrong, directory inode should not be marked as ordered
+    if it was modified during readddir
+    
+    The fix is introduce a new counter to the inode data struct, we increase
+    the counter each time the directory is modified. When readdir finishes, we
+    check the counter to decide if the directory should be marked as ordered.
+    
+    Fixes: #9894
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit a4caed8a53d011b214ab516090676641f7c4699d)
+
+commit b5ff4e99c87958211e4b7716b59084fc3417ec17
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Tue Sep 9 17:34:46 2014 +0800
+
+    client: preserve ordering of readdir result in cache
+    
+    Preserve ordering of readdir result in a list, so that the result of cached
+    readdir is consistant with uncached readdir.
+    
+    As a side effect, this commit also removes the code that removes stale dentries.
+    This is OK because stale dentries does not have valid lease, they will be
+    filter out by the shared gen check in Client::_readdir_cache_cb()
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 346c06c1647658768e927a47768a0bc74de17b53)
+
+commit 0671c1127015311d9894f15e2493805f93432910
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Tue Sep 9 14:06:06 2014 +0800
+
+    client: introduce a new flag indicating if dentries in directory are sorted
+    
+    When creating a file, Client::insert_dentry_inode() set the dentry's offset
+    based on directory's max offset. The offset does not reflect the real
+    postion of the dentry in directory. Later readdir reply from real postion
+    of the dentry in directory. Later readdir reply from MDS may change the
+    dentry's position/offset. This inconsistency can cause missing/duplicate
+    entries in readdir result if readdir is partly satisfied by dcache_readdir().
+    
+    The fix is introduce a new flag indicating if dentries in directory are
+    sorted. We use _readdir_cache_cb() to handle readdir only when the flag is
+    set, clear the flag after creating/deleting/renaming file.
+    
+    Fixes: #9178
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 600af25493947871c38214aa370e2544a7fea399)
+
+commit f66bf31b6743246fb1c88238cf18101238dee3a4
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Thu Nov 6 17:48:01 2014 -0800
+
+    qa: use sudo even more when rsyncing /usr
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 3aa7797741f9cff06053a2f31550fe6929039692)
+
+commit f7ec448d6579f965eec184416a97b47ae27ab47a
+Merge: f410d76 f111bc8
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Wed Nov 5 08:51:18 2014 +0100
+
+    Merge pull request #2858 from ceph/wip-9909
+    
+    tools: rados put /dev/null should write() and not create()
+    
+    Reviewed-by: Loic Dachary <loic-201408 at dachary.org>
+
+commit f111bc8eac8a521b13340f4a75418d839725e010
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Thu Oct 2 09:23:55 2014 +0200
+
+    tools: rados put /dev/null should write() and not create()
+    
+    In the rados.cc special case to handle put an empty objects, use
+    write_full() instead of create().
+    
+    A special case was introduced 6843a0b81f10125842c90bc63eccc4fd873b58f2
+    to create() an object if the rados put file is empty. Prior to this fix
+    an attempt to rados put an empty file was a noop. The problem with this
+    fix is that it is not idempotent. rados put an empty file twice would
+    fail the second time and rados put a file with one byte would succeed as
+    expected.
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit 50e80407f3c2f74d77ba876d01e7313c3544ea4d)
+
+commit f410d764d2e6795389cb320b4436cff3607927bd
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Oct 9 10:20:27 2014 -0700
+
+    rgw: set length for keystone token validation request
+    
+    Fixes: #7796
+    Backport: giany, firefly
+    Need to set content length to this request, as the server might not
+    handle a chunked request (even though we don't send anything).
+    
+    Tested-by: Mark Kirkwood <mark.kirkwood at catalyst.net.nz>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 3dd4ccad7fe97fc16a3ee4130549b48600bc485c)
+
+commit dba7defc623474ad17263c9fccfec60fe7a439f0
+Merge: 6a201f8 e0b0441
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 31 08:35:42 2014 -0700
+
+    Merge pull request #2846 from dachary/wip-9752-past-intervals-giant
+    
+    osd: past_interval display bug on acting
+
+commit e0b04414b92018277a0d3b9d82e72ea7529f4ef5
+Author: Loic Dachary <loic-201408 at dachary.org>
+Date:   Fri Oct 31 00:49:21 2014 +0100
+
+    osd: past_interval display bug on acting
+    
+    The acting array was incorrectly including the primary and up_primary.
+    
+    http://tracker.ceph.com/issues/9752 Fixes: #9752
+    
+    Signed-off-by: Loic Dachary <loic-201408 at dachary.org>
+    (cherry picked from commit c5f8d6eded52da451fdd1d807bd4700221e4c41c)
+
+commit 6a201f89b1aa6c2197383c29919cdeb4a8353d1b
+Merge: ebe1637 905aba2
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Thu Oct 30 17:01:12 2014 -0700
+
+    Merge pull request #2841 from ceph/giant-9869
+    
+    Backport "client: cast m->get_client_tid() to compare to 16-bit Inode::flushing_cap_tid"
+
+commit 905aba2f3d847933f98124f3ea8d1d76d644edb4
+Author: Greg Farnum <greg at inktank.com>
+Date:   Wed Oct 22 17:16:31 2014 -0700
+
+    client: cast m->get_client_tid() to compare to 16-bit Inode::flushing_cap_tid
+    
+    m->get_client_tid() is 64 bits (as it should be), but Inode::flushing_cap_tid
+    is only 16 bits. 16 bits should be plenty to let the cap flush updates
+    pipeline appropriately, but we need to cast in the proper direction when
+    comparing these differently-sized versions. So downcast the 64-bit one
+    to 16 bits.
+    
+    Fixes: #9869
+    Backport: giant, firefly, dumpling
+    
+    Signed-off-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit a5184cf46a6e867287e24aeb731634828467cd98)
+
+commit ebe16373e966917ca8cb03ebeac974bdff7b7685
+Merge: c51c8f9 b704f0d
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Oct 30 10:05:22 2014 -0700
+
+    Merge pull request #2838 from ceph/wip-9945-giant
+    
+    messages: fix COMPAT_VERSION on MClientSession
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit b704f0dd888aacb10c32cdb63cdbf9f06296fc18
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Oct 30 16:43:21 2014 +0000
+
+    messages: fix COMPAT_VERSION on MClientSession
+    
+    This was incorrectly incremented to 2 by omission
+    of an explicit COMPAT_VERSION value.
+    
+    Fixes: #9945
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 1eb9bcb1d36014293efc687b4331be8c4d208d8e)
+
+commit a6c02a18d6249ea62cf7a74710c8d0192b6eecaa
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 18 14:23:36 2014 -0700
+
+    mon: re-bootstrap if we get probed by a mon that is way ahead
+    
+    During bootstrap we verify that our paxos commits overlap with the other
+    mons we will form a quorum with.  If they do not, we do a sync.
+    
+    However, it is possible we pass those checks, then fail to join a quorum
+    before the quorum moves ahead in time such that we no longer overlap.
+    Currently nothing kicks up back into a probing state to discover we need
+    to sync... we will just keep trying to call or join an election instead.
+    
+    Fix this by jumping back to bootstrap if we get a probe that is ahead of
+    us.  Only do this from non probe or sync states as these will be common;
+    it is only the active and electing states that matter (and probably just
+    electing!).
+    
+    Fixes: #9301
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c421b55e8e15ef04ca8aeb47f7d090375eaa8573)
+
+commit 92d2a38efd458f9e8f4da228ea1e94df08dc8222
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 18 14:11:24 2014 -0700
+
+    mon/Paxos: fix off-by-one in last_ vs first_committed check
+    
+    peon last_committed + 1 == leader first_committed is okay.  Note that the
+    other check (where I clean up whitespace) gets this correct.
+    
+    Fixes: #9301 (partly)
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d81cd7f86695185dce31df76c33c9a02123f0e4a)
diff --git a/doc/changelog/v0.87.2.txt b/doc/changelog/v0.87.2.txt
new file mode 100644
index 0000000..98cf117
--- /dev/null
+++ b/doc/changelog/v0.87.2.txt
@@ -0,0 +1,1413 @@
+commit 87a7cec9ab11c677de2ab23a7668a77d2f5b955e (tag: refs/tags/v0.87.2, refs/remotes/gh/giant)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Fri Apr 24 12:31:27 2015 -0700
+
+    0.87.2
+
+commit c1301e84aee0f399db85e2d37818a66147a0ce78
+Merge: 1a13e10 9e9c3c6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Apr 7 21:08:24 2015 +0200
+
+    Merge pull request #4214 from dachary/wip-10430-giant
+    
+    osd/osd_types.cc: 456: FAILED assert(m_seed < old_pg_num)
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit 1a13e1065829c59987c2f57a13eaa03de31df4ed
+Merge: 1fb08d3 5f4e62f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Apr 7 16:39:28 2015 +0200
+
+    Merge pull request #4258 from ceph/wip-10643-v2
+    
+    mon: MDSMonitor: additional backports for #10643
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1fb08d3066b14b178a8912ffb3c9f50d2333738c
+Merge: 90b37d9 7684ee2
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Thu Apr 2 08:55:48 2015 -0700
+
+    Merge pull request #4261 from ceph/wip-11303-giant
+    
+    allow -L to disable lttng. Enable it by default
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 7684ee25ac21810153a44bdc4fc00b36e39eb12f
+Author: Alfredo Deza <adeza at redhat.com>
+Date:   Thu Apr 2 10:34:02 2015 -0400
+
+    allow -L to disable lttng. Enable it by default
+    
+    Signed-off-by: Alfredo Deza <adeza at redhat.com>
+
+commit 5f4e62f382767ee69e5b0c701b1a01d9e4132237
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Oct 17 19:08:20 2014 +0100
+
+    mon: MDSMonitor: wait for osdmon to be writable when requesting proposal
+    
+    Otherwise we may end up requesting the osdmon to propose while it is
+    mid-proposal.  We can't simply return EAGAIN to the user either because
+    then we would have to expect the user to be able to successfully race
+    with the whole cluster in finding a window in which 'mds fs new' command
+    would succeed -- which is not a realistic expectation.  Having the
+    command to osdmon()->wait_for_writable() guarantees that the command
+    will be added to a queue and that we will, eventually, tend to it.
+    
+    Fixes: #9794
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 2ae1cba595d9c56a0a4c534b34fe25250e7eb2d5)
+
+commit 257bd17db6470ca050403b1c8ff8daa94a4b80b5
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Oct 17 18:59:51 2014 +0100
+
+    mon: MDSMonitor: have management_command() returning int instead of bool
+    
+    We can more easily differentiate between errors we get out of this
+    function, which makes the code a bit more versatile and readable.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 0dd473cbad4f9ea403fe60badffdc6da4dd3aa3c)
+
+commit 9e9c3c652339d85863af01cac621228f04eb4f18
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Oct 9 11:20:13 2014 -0700
+
+    osd: Get pgid ancestor from last_map when building past intervals
+    
+    Fixed OSD::build_past_intervals_parallel() and PG::generate_past_intervals()
+    
+    Fixes: #10430
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0c5b66da7a9ba516340d06d9e806beb9d1040d0e)
+
+commit 90b37d9bdcc044e26f978632cd68f19ece82d19a
+Merge: 2ccbc14 9f1f355
+Author: Loic Dachary <loic-redhat at dachary.org>
+Date:   Thu Mar 26 07:58:14 2015 +0100
+
+    Merge pull request #4175 from wonzhq/objecter-timer-2
+    
+    Objecter: failed assert(tick_event==NULL) at osdc/Objecter.cc
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 9f1f35546e00e8f1ecbce0697d59b64f3537facf
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Wed Mar 25 16:32:44 2015 +0800
+
+    Objecter: failed assert(tick_event==NULL) at osdc/Objecter.cc
+    
+    When the Objecter timer erases the tick_event from its events queue and
+    calls tick() to dispatch it, if the Objecter::rwlock is held by shutdown(),
+    it waits there to get the rwlock. However, inside the shutdown function,
+    it checks the tick_event and tries to cancel it. The cancel_event function
+    returns false since tick_event is already removed from the events queue. Thus
+    tick_event is not set to NULL in shutdown(). Later the tick function return
+    ealier and doesn't set tick_event to NULL as well. This leads to the assertion
+    failure.
+    
+    This is a regression introduced by an incorrect conflict resolution when
+    d790833 was backported.
+    
+    Fixes: #11183
+    
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+
+commit 2ccbc14d17b54ea4fd4126cb04a7b83cd64c7f1e
+Merge: 02f9cdb de4b087
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 23 20:39:26 2015 +0100
+
+    Merge pull request #4127 from dzafman/wip-11176-giant
+    
+    ceph-objectstore-tool: Output only unsupported features when incomatible
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 02f9cdbf889071ca6fe3811d9b9a92a0b630fa55
+Merge: 83bcc51 fc43d8c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:11:46 2015 +0100
+
+    Merge pull request #4097 from dachary/wip-10497-giant
+    
+    librados: c api does not translate op flag
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 83bcc516743e426c7a8c6f6401721bffbbec4fc0
+Merge: ebab2bd d790833
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:11:26 2015 +0100
+
+    Merge pull request #4096 from dachary/wip-9617-giant
+    
+    objecter shutdown races with msg dispatch
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit ebab2bd5f36205d666673600624aaa3e5e06c405
+Merge: e31c92d 970a797
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:11:03 2015 +0100
+
+    Merge pull request #4095 from dachary/wip-9675-giant
+    
+    splitting a pool doesn't start when rule_id != ruleset_id
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit e31c92d8dd814d276357e431ed87b93d75933f77
+Merge: f0ec5e3 7653511
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:10:42 2015 +0100
+
+    Merge pull request #4094 from dachary/wip-9891-giant
+    
+    Assertion: os/DBObjectMap.cc: 1214: FAILED assert(0)
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit f0ec5e3b3ed58af65323bcc494e589935147aa45
+Merge: dd7c15b 13b0147
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:10:25 2015 +0100
+
+    Merge pull request #4093 from dachary/wip-9915-giant
+    
+    osd: eviction logic reversed
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit dd7c15b2b24027a7cc5fa4bff21222c5a4606e60
+Merge: 33b09e1 13b8364
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:09:28 2015 +0100
+
+    Merge pull request #4092 from dachary/wip-9985-giant
+    
+    osd: incorrect atime calculation
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 33b09e18aa78252d94cbec8bf94ec97ed5bb1573
+Merge: 950123e 5550cdd
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:08:41 2015 +0100
+
+    Merge pull request #4091 from dachary/wip-9986-giant
+    
+    objecter: map epoch skipping broken
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 950123e4daa85562b2f52e0e12e0bae07f444095
+Merge: abdc065 21f81b8
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:08:16 2015 +0100
+
+    Merge pull request #4090 from dachary/wip-10059-giant
+    
+    osd/ECBackend.cc: 876: FAILED assert(0)
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit abdc065acd6cafa6439e9c1724cc87de02352bd7
+Merge: aee2825 1ccf583
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:07:52 2015 +0100
+
+    Merge pull request #4089 from dachary/wip-10080-giant
+    
+    Pipe::connect() cause osd crash when osd reconnect to its peer
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit aee28250fee66bca08d91e56ce47ec46c2e9fc24
+Merge: 6582253 3e875ab
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:07:20 2015 +0100
+
+    Merge pull request #4088 from dachary/wip-6003-giant
+    
+    journal Unable to read past sequence 406 ...
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 65822530ebfdea2feb9192c6eb6e3b8b9d60fe33
+Merge: 4b20f2d 96a5c67
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:06:51 2015 +0100
+
+    Merge pull request #4082 from dachary/wip-10106-giant
+    
+    rgw acl response should start with <?xml version=1.0 ?>
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 4b20f2d2d1ee52deed33617f000fa342ebce2e49
+Merge: 7ff3a67 c7b02f5
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:06:23 2015 +0100
+
+    Merge pull request #4078 from dachary/wip-11157-giant
+    
+    doc,tests: force checkout of submodules
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 7ff3a67c44ba3dc20a663a7dc6ba28c25714f063
+Merge: 440e706 4d4eb9f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:05:20 2015 +0100
+
+    Merge pull request #4077 from dachary/wip-10150-giant
+    
+    osd/ReplicatedPG.cc: 10853: FAILED assert(r >= 0) (in _scan_range)
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 440e70607e7e3cd1d8ca33843c626109431caf8d
+Merge: 66f639b 499d94f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:04:51 2015 +0100
+
+    Merge pull request #4076 from dachary/wip-10153-giant
+    
+    Rados.shutdown() dies with Illegal instruction (core dumped)
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 66f639b30ce6c74caae9397f20053761203f8e87
+Merge: 43b45df b79852f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:04:25 2015 +0100
+
+    Merge pull request #4074 from dachary/wip-10220-giant
+    
+    mon/Paxos.cc: 1033: FAILED assert(mon->is_leader())
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 43b45dfacd598bab51fa06c5d0e2d0605d6e83d6
+Merge: d282cfd b318e2f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 23:03:35 2015 +0100
+
+    Merge pull request #3548 from ceph/wip-10643
+    
+    mon: MDSMonitor: missing backports for giant
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d282cfd5ae3e65b74801cd27480ce8c0bd72d9a7
+Merge: 3f3b981 681c99f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:12:58 2015 +0100
+
+    Merge pull request #4053 from dachary/wip-8011-giant
+    
+    osd/ReplicatedPG.cc: 5244: FAILED assert(soid < scrubber.start || soid >= scrubber.end)
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 3f3b98123cb46080068c1c73f4be41acbe18bd0d
+Merge: 6919eb1 4427358
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:12:40 2015 +0100
+
+    Merge pull request #4052 from dachary/wip-10844-giant
+    
+    mon: caps validation should rely on EntityName instead of entity_name_t
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 6919eb1684e34a6395963be6cc65215a51f5ba13
+Merge: 8876585 1d4ffbe
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:12:15 2015 +0100
+
+    Merge pull request #4050 from dachary/wip-10817-giant
+    
+    WorkQueue: make timeout when calling WaitInterval configurable
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 88765851bd56a6a526f6ab724920c8858ec4956c
+Merge: 6da3171 92c352d
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:11:43 2015 +0100
+
+    Merge pull request #4049 from dachary/wip-10787-giant
+    
+    mon: OSDMonitor::map_cache is buggy, send_incremental is not conservative
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 6da3171f21b8e1a56fe941a5028f2ccfdccee18a
+Merge: 5a6eefc 25fcaca
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:09:28 2015 +0100
+
+    Merge pull request #4048 from dachary/wip-10770-giant
+    
+    rgw: pending bucket index operations are not cancelled correctly
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 5a6eefcb40c94da9a900d9893ecb6eaaf8fd0cea
+Merge: c67a7a5 2858327
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:09:06 2015 +0100
+
+    Merge pull request #4046 from dachary/wip-10723-giant
+    
+    rados python binding leaks Ioctx objects
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit c67a7a52dc96f176431125921e36e4a2b8a30f1c
+Merge: 41dcd2d d5b1b7e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:08:45 2015 +0100
+
+    Merge pull request #4044 from dachary/wip-10617-giant
+    
+    osd: pgs for deleted pools don't finish getting removed if osd restarts
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 41dcd2d9c307dd0b25d27bd6673943f3fdaaa28b
+Merge: 42e7413 c3d998e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:08:20 2015 +0100
+
+    Merge pull request #4034 from dachary/wip-10475-giant
+    
+    rgw: Swift API. Support for X-Remove-Container-Meta-{key} header.
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit 42e741339913990521c4509f4e266921f8dbe007
+Merge: ffb76d1 fa8d454
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 22 22:07:53 2015 +0100
+
+    Merge pull request #4033 from dachary/wip-10471-giant
+    
+    rgw: index swift keys appropriately
+    
+    Reviewed-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+
+commit de4b08704172ac31b511dde50e5c11d58d811ca2
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Mar 20 16:57:40 2015 -0700
+
+    ceph-objectstore-tool: Output only unsupported features when incomatible
+    
+    Fixes: #11176
+    Backport: firefly, giant
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 5b23f5b5892b36fb7d06efc0d77e64a24ef6e8c9)
+
+commit ffb76d16c5d9d65ac94d21b4e8fc1fdf86441977
+Merge: fea29b1 61d6006
+Author: John Spray <jcspray at gmail.com>
+Date:   Thu Mar 19 22:07:58 2015 +0000
+
+    Merge pull request #3971 from ceph/giant-11053
+    
+    mds: fix assertion caused by system clock backwards
+    
+    Reviewed-by: John Spray <john.spray at redhat.com>
+
+commit c3d998e4c3c9d90b50c3f6c0af7d48785616e032
+Author: Dmytro Iurchenko <diurchenko at mirantis.com>
+Date:   Tue Feb 3 17:54:38 2015 +0200
+
+    rgw: Swift API. Support for X-Remove-Container-Meta-{key} header.
+    
+    Fixes: #10475
+    Backport: hammer, firefly
+    Reported-by: Josh Durgin <jdurgin at redhat.com>
+    Signed-off-by: Dmytro Iurchenko <diurchenko at mirantis.com>
+    (cherry picked from commit f67bfa24fd6f69c2fcc0987eba8b6b426dd78320)
+    
+    Conflicts:
+    	src/rgw/rgw_rest.h
+            trivial merge: prototype of an unrelated function changed
+            src/rgw/rgw_op.cc
+            s/is_object_op/!(s->object == NULL)/
+
+commit fc43d8c2c54ec9e9cb6ef4d19cca695eb2fb3aab
+Author: Matt Richards <mattjrichards at gmail.com>
+Date:   Thu Jan 8 13:16:17 2015 -0800
+
+    librados: Translate operation flags from C APIs
+    
+    The operation flags in the public C API are a distinct enum
+    and need to be translated to Ceph OSD flags, like as happens in
+    the C++ API. It seems like the C enum and the C++ enum consciously
+    use the same values, so I reused the C++ translation function.
+    
+    Signed-off-by: Matthew Richards <mattjrichards at gmail.com>
+    (cherry picked from commit 49d114f1fff90e5c0f206725a5eb82c0ba329376)
+
+commit d790833cb84d6f6349146e4f9abdcdffb4db2ee0
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Sep 29 18:17:29 2014 -0700
+
+    Objecter: check the 'initialized' atomic_t safely
+    
+    shutdown() resets initialized to 0, but we can still receive messages
+    after this point, so fix message handlers to skip messages in this
+    case instead of asserting.
+    
+    Also read initialized while holding Objecter::rwlock to avoid races
+    where e.g. handle_osd_map() checks initialized -> 1, continues,
+    shutdown() is called, sets initialized to 0, then handle_osd_map()
+    goes about its business and calls op_submit(), which would fail the
+    assert(initialized.read()) check. Similar races existed in other
+    message handlers which change Objecter state.
+    
+    The Objecter is not destroyed until after its Messenger in
+    the MDS, OSD, and librados, so this should be safe.
+    
+    Fixes: #9617
+    Backport: giant
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit e506f896a9217324ab7a7865989f4454562aed5f)
+    
+    Conflicts:
+    	src/osdc/Objecter.cc
+            context changed: Objecter::tick() did not have
+            assert(initialized.read())
+
+commit ce436a33e0f720ea4b8cf0363bcac1126be3c28b
+Author: Josh Durgin <josh.durgin at inktank.com>
+Date:   Mon Sep 29 18:12:50 2014 -0700
+
+    Objecter: init with a constant of the correct type
+    
+    Just a tiny cleanup.
+    
+    Signed-off-by: Josh Durgin <josh.durgin at inktank.com>
+    (cherry picked from commit 1feba200aae7d9a042cda705c3de8fba2fc82331)
+
+commit 970a79753dc52d82d2abf29ffe6f88adac678eb0
+Author: Xiaoxi Chen <xiaoxi.chen at intel.com>
+Date:   Wed Aug 20 15:35:44 2014 +0800
+
+    CrushWrapper: pick a ruleset same as rule_id
+    
+    Originally in the add_simple_ruleset funtion, the ruleset_id
+    is not reused but rule_id is reused. So after some add/remove
+    against rules, the newly created rule likely to have
+    ruleset!=rule_id.
+    
+    We dont want this happen because we are trying to hold the constraint
+    that ruleset == rule_id.
+    
+    Signed-off-by: Xiaoxi Chen <xiaoxi.chen at intel.com>
+    (cherry picked from commit 78e84f34da83abf5a62ae97bb84ab70774b164a6)
+
+commit 76535116823f02f0392226e5725fbfef14c277ba
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Feb 20 13:43:46 2015 -0800
+
+    DBObjectMap: lock header_lock on sync()
+    
+    Otherwise, we can race with another thread updating state.seq
+    resulting in the old, smaller value getting persisted.  If there
+    is a crash at that time, we will reuse a sequence number, resulting
+    in an inconsistent node tree and bug #9891.
+    
+    Fixes: 9891
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 2b63dd25fc1c73fa42e52e9ea4ab5a45dd9422a0)
+    
+    Conflicts:
+    	src/os/DBObjectMap.cc
+            because we have state.v = 1; instead of state.v = 2;
+
+commit 13b01473c5c1a116d6cd6acbbb6cbe08ee6e9433
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Tue Oct 28 09:37:11 2014 +0800
+
+    osd: cache tiering: fix the atime logic of the eviction
+    
+    Reported-by: Xinze Chi <xmdxcxz at gmail.com>
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+    (cherry picked from commit 622c5ac41707069ef8db92cb67c9185acf125d40)
+
+commit 13b8364dc869b2eefcb6646cff1e18c31126ce7d
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Oct 31 19:33:59 2014 -0700
+
+    osd/ReplicatedPG: fix compile error
+    
+    From 1fef4c3d541cba360738437420ebfa2447d5802e.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 4a9ad7dc2da6f4fa6a64235776a3f1d2799aef60)
+
+commit 55541b90db0a6d6c26c1fae6a4958fa5a320f82c
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Wed Oct 29 07:11:11 2014 +0000
+
+    Get the currently atime of the object in cache pool for eviction
+    
+    Because if there are mutiple atime in agent_state for the same object, we should use the recently one.
+    
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 1fef4c3d541cba360738437420ebfa2447d5802e)
+
+commit 5550cdd876db913b152edad17a4de16bded31627
+Author: Ding Dinghua <dingdinghua85 at gmail.com>
+Date:   Thu Oct 30 14:58:42 2014 +0800
+
+    osdc/Objecter: Fix a bug of dead looping in Objecter::handle_osd_map
+    
+    If current map epoch is less than oldest epoch, current map epoch
+    should step up to oldest epoch.
+    
+    Fixes: #9986
+    Signed-off-by: Ding Dinghua <dingdinghua85 at gmail.com>
+    (cherry picked from commit e0166a23c2cf655bfb4cf873be021a14d9b9be27)
+
+commit 7c5056f5cf77065e0e5a920f525f0a3be6b4b299
+Author: Ding Dinghua <dingdinghua85 at gmail.com>
+Date:   Thu Oct 30 14:58:05 2014 +0800
+
+    osdc/Objecter: e shouldn't be zero in Objecter::handle_osd_map
+    
+    Signed-off-by: Ding Dinghua <dingdinghua85 at gmail.com>
+    (cherry picked from commit 31c584c8ba022cd44fe2872d221f3026618cefab)
+
+commit 21f81b85de652aede51e88b87bdff71f2e411da3
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed Nov 19 08:20:16 2014 -0800
+
+    PG: always clear_primary_state on new interval, but only clear pg temp if not primary
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit f692bfe076b8ddb679c6d1a6ea78cc47f0876326)
+
+commit 0c3f7637d8cf2146a4268330d8c0506ad38c354d
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Nov 14 15:44:20 2014 -0800
+
+    PG: always clear_primary_state when leaving Primary
+    
+    Otherwise, entries from the log collection process might leak into the next
+    epoch, where we might end up choosing a different authoritative log.  In this
+    case, it resulted in us not rolling back to log entries on one of the replicas
+    prior to trying to recover from an affected object due to the peer_missing not
+    being cleared.
+    
+    Fixes: #10059
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit c87bde64dfccb5d6ee2877cc74c66fc064b1bcd7)
+
+commit 1ccf58355d0796172935938572cf68ceb31a6801
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Tue Dec 2 15:17:57 2014 -0800
+
+    SimpleMessenger: allow RESETSESSION whenever we forget an endpoint
+    
+    In the past (e229f8451d37913225c49481b2ce2896ca6788a2) we decided to disable
+    reset of lossless Pipes, because lossless peers resetting caused trouble and
+    they can't forget about each other. But they actually can: if mark_down()
+    is called.
+    
+    I can't figure out how else we could forget about a remote endpoint, so I think
+    it's okay if we tell them we reset in order to clean up state. That's desirable
+    so that we don't get into strange situations with out-of-whack counters.
+    
+    Fixes: #10080
+    Backport: giant, firefly, dumpling
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 8cd1fdd7a778eb84cb4d7161f73bc621cc394261)
+
+commit 3e875ab108de8d2aa3717f76a3fe48ede286abb7
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Feb 6 09:52:29 2015 -0800
+
+    FileJournal: fix journalq population in do_read_entry()
+    
+    Fixes: 6003
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit bae1f3eaa09c4747b8bfc6fb5dc673aa6989b695)
+    
+    Conflicts:
+    	src/os/FileJournal.cc
+            because reinterpret_cast was added near two hunks after firefly
+
+commit 96a5c67121dde0d4d4cd13793bb131414b64cc28
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jan 30 18:42:40 2015 -0800
+
+    rgw: flush xml header on get acl request
+    
+    Fixes: #10106
+    Backport: firefly, giant
+    
+    dump_start() updates the formatter with the appropriate prefix, however,
+    we never flushed the formatter.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit eb45f861343162e018968b8c56693a8c6f5b2cab)
+
+commit c7b02f5a7347ea8688c5214f85bb9f612925a586
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Mar 19 00:32:39 2015 +0100
+
+    doc,tests: force checkout of submodules
+    
+    When updating submodules, always checkout even if the HEAD is the
+    desired commit hash (update --force) to avoid the following:
+    
+        * a directory gmock exists in hammer
+        * a submodule gmock replaces the directory gmock in master
+        * checkout master + submodule update : gmock/.git is created
+        * checkout hammer : the gmock directory still contains the .git from
+          master because it did not exist at the time and checkout won't
+          remove untracked directories
+        * checkout master + submodule update : git rev-parse HEAD is
+          at the desired commit although the content of the gmock directory
+          is from hammer
+    
+    http://tracker.ceph.com/issues/11157 Fixes: #11157
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4d4eb9faf1871c4469b78a7ee75d527ce5cc67ad
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Dec 11 13:05:54 2014 -0800
+
+    ReplicatedPG::scan_range: an object can disappear between the list and the attr get
+    
+    The first item in the range is often last_backfill, upon which writes
+    can be occuring.  It's trimmed off on the primary side anyway.
+    
+    Fixes: 10150
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit dce6f288ad541fe7f0ef8374301cd712dd3bfa39)
+
+commit 499d94f573e78f6545bd5a12ade6b5ba5a75bbca
+Author: Federico Simoncelli <fsimonce at redhat.com>
+Date:   Sat Nov 15 14:14:04 2014 +0000
+
+    common: do not unlock rwlock on destruction
+    
+    According to pthread_rwlock_unlock(3p):
+    
+     Results are undefined if the read-write lock rwlock is not held
+     by the calling thread.
+    
+    and:
+    
+     https://sourceware.org/bugzilla/show_bug.cgi?id=17561
+    
+     Calling pthread_rwlock_unlock on an rwlock which is not locked
+     is undefined.
+    
+    calling pthread_rwlock_unlock on RWLock destruction could cause
+    an unknown behavior for two reasons:
+    
+    - the lock is acquired by another thread (undefined)
+    - the lock is not acquired (undefined)
+    
+    Moreover since glibc-2.20 calling pthread_rwlock_unlock on a
+    rwlock that is not locked results in a SIGILL that kills the
+    application.
+    
+    This patch removes the pthread_rwlock_unlock call on destruction
+    and replaces it with an assertion to check that the RWLock is
+    not in use.
+    
+    Any code that relied on the implicit release is now going to
+    break the assertion, e.g.:
+    
+     {
+       RWLock l;
+       l.get(for_write);
+     } // implicit release, wrong.
+    
+    Signed-off-by: Federico Simoncelli <fsimonce at redhat.com>
+    (cherry picked from commit cf2104d4d991361c53f6e2fea93b69de10cd654b)
+
+commit b79852f3ab0643bbb3f6b71a56b15e5a4b5fc1f5
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Wed Dec 10 17:46:35 2014 +0000
+
+    mon: Paxos: reset accept timeout before submiting work to the store
+    
+    Otherwise we may trigger the timeout while waiting for the work to be
+    committed to the store -- and it would only take the write to take a bit
+    longer than 10 seconds (default accept timeout).
+    
+    We do wait for the work to be properly committed to the store before
+    extending the lease though.
+    
+    Fixes: #10220
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 18534615f184ba56b441fd1d4242eb06debdfe13)
+
+commit e997c9fed5feb3e877dfe07ffac1327b85d09ea2
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Tue Dec 9 17:35:47 2014 +0000
+
+    mon: MonitorDBStore: allow randomly injecting random delays on writes
+    
+    Adds two new config options:
+    
+    mon_inject_transaction_delay_probability : DOUBLE (0.0-1.0, default: 0.0)
+    mon_inject_transaction_delay_max : DOUBLE (seconds, default: 10.0)
+    
+    If probability is set to a value greater than 0, just before applying
+    the transaction, the store will decide whether to inject a delay,
+    randomly choosing a value between 0 and the max.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit beaa04e4119765d5775a6c48fd072dd95c984e3b)
+
+commit 1d4ffbe1d233de555c1ecb0a33eebe2391b29f33
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Feb 9 17:41:19 2015 -0800
+
+    ShardedThreadPool: make wait timeout on empty queue configurable
+    
+    Fixes: 10818
+    Backport: giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 7002f934e6664daa995ca0629c0ea3bae1c6bddf)
+
+commit 292c4339c064968c2aa05eec701fbc2a8d82dab0
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Feb 9 17:11:38 2015 -0800
+
+    WorkQueue: make wait timeout on empty queue configurable
+    
+    Fixes: 10817
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 5aa6f910843e98a05bfcabe6f29d612cf335edbf)
+
+commit fea29b1bcbd17b3d1f642398ec70dbe258bbc98f
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Nov 20 15:15:08 2014 -0800
+
+    PGLog: include rollback_info_trimmed_to in (read|write)_log
+    
+    Fixes: #10157
+    Backport: firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1fe8b846641486cc294fe7e1d2450132c38d2dba)
+
+commit 4427358bb556d902b01df27fd097cc3eefa561da
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Wed Feb 11 23:36:01 2015 +0000
+
+    mon: MonCap: take EntityName instead when expanding profiles
+    
+    entity_name_t is tightly coupled to the messenger, while EntityName is
+    tied to auth.  When expanding profiles we want to tie the profile
+    expansion to the entity that was authenticated.  Otherwise we may incur
+    in weird behavior such as having caps validation failing because a given
+    client messenger inst does not match the auth entity it used.
+    
+    e.g., running
+    
+    ceph --name osd.0 config-key exists foo daemon-private/osd.X/foo
+    
+    has entity_name_t 'client.12345' and EntityName 'osd.0'.  Using
+    entity_name_t during profile expansion would not allow the client access
+    to daemon-private/osd.X/foo (client.12345 != osd.X).
+    
+    Fixes: #10844
+    Backport: firefly,giant
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 87544f68b88fb3dd17c519de3119a9ad9ab21dfb)
+
+commit 8902279dd4b52516d59db712bd59e8d9372611a6
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Nov 14 21:03:54 2014 +0000
+
+    mon: Monitor: stash auth entity name in session
+    
+    Backport: giant
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit ca8e1efc0be9bffcfbdce5593526d257aa498062)
+
+commit 681c99fe12cfa6318f8cf06f4e825805635bcc07
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Nov 20 14:27:39 2014 -0800
+
+    ReplicatedPG: fail a non-blocking flush if the object is being scrubbed
+    
+    Fixes: #8011
+    Backport: firefly, giant
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 9b26de3f3653d38dcdfc5b97874089f19d2a59d7)
+
+commit 1f58a0adc3b23785fac00083d721b62f6a4c44a1
+Merge: 9fee7ba fe7d4ca
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:52:01 2015 -0700
+
+    Merge pull request #4042 from dachary/wip-10546-giant
+    
+    ceph time check start round bug in monitor.cc
+
+commit 9fee7ba9d7343bda29bc5113f8db5cdd9c09d71a
+Merge: ca635ce e7af52a
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:50:26 2015 -0700
+
+    Merge pull request #4047 from dachary/wip-10762-giant
+    
+    mon: osd gets marked down twice
+
+commit ca635ce3eb21135b08613b97ce0c56977de44351
+Merge: 9094185 5771f57
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:49:53 2015 -0700
+
+    Merge pull request #4041 from dachary/wip-10512-giant
+    
+    osd: cancel_flush requeues blocked events after blocking event
+
+commit 90941850ceb2c080ac72c67fed991c951b13f449
+Merge: bc1b9d2 5fca232
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:47:26 2015 -0700
+
+    Merge pull request #4031 from dachary/wip-10353-giant
+    
+    crush: set_choose_tries = 100 for erasure code rulesets
+
+commit bc1b9d22d29a74e6853834fb0430e8803710bbbf
+Merge: bd69cfc 30a1744
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:47:08 2015 -0700
+
+    Merge pull request #4029 from dachary/wip-9910-giant
+    
+    msg/Pipe: discard delay queue before incoming queue
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit bd69cfcbd58103843fbc42c4e55d43c2bafe54ff
+Merge: 30f7df2 4bd5237
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:44:53 2015 -0700
+
+    Merge pull request #4030 from dachary/wip-10351-giant
+    
+    mount.ceph: avoid spurious error message
+    
+    Reviewed-by: John Spray <john.spray at redhat.com>
+
+commit 30f7df2b110f73477354fbfa607b4777317dddfa
+Merge: e5a50c3 8307318
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:44:00 2015 -0700
+
+    Merge pull request #4028 from dachary/wip-10259-giant
+    
+    osd_types: op_queue_age_hist and fs_perf_stat should be in osd_stat_t::o...
+
+commit e5a50c3ae42c8b9d16a19a13e10fc35b91149e73
+Merge: ba1d55d a5a76f8
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:42:10 2015 -0700
+
+    Merge pull request #4027 from dachary/wip-10257-giant
+    
+      mon: PGMonitor: several stats output error fixes
+
+commit ba1d55de1e92a0143702e9e3fbbb1820db17d6c3
+Merge: 530fce4 640986f
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:41:56 2015 -0700
+
+    Merge pull request #3998 from dzafman/wip-10677
+    
+    Fix ceph command manpage to match ceph -h (giant)
+    
+    Reviewed-by: Xinxin Shu <xinxin.shu at intel.com>
+
+commit 530fce4d7cf51f4a4ac1e70ebe20b2795a30010e
+Merge: a2a3dad 8a5a3c7
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:40:02 2015 -0700
+
+    Merge pull request #3921 from sponce/wip-11078-giant
+    
+    Fix libstriprados::stat, use strtoll insdead of strtol
+
+commit a2a3dad8ec00434b99d6d538615bf8ff9eada217
+Merge: 0f57188 984df3b
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:36:28 2015 -0700
+
+    Merge pull request #3819 from tchaikov/giant-pg-leak-10421
+    
+    osd: fix PG leak in SnapTrimWQ._clear()
+
+commit 0f5718822793074ffab45124afb3bf3160e92004
+Merge: 776c82c c5c6fcd
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:35:37 2015 -0700
+
+    Merge pull request #3771 from ceph/wip-10883-giant
+    
+    osd: Fix FileJournal wrap to get header out first
+
+commit 776c82caac36de14a5f895688f81c88a883fca3e
+Merge: 938e036 37f196e
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Mar 17 10:35:29 2015 -0700
+
+    Merge pull request #3637 from sponce/wip-10758-giant
+    
+    Backport of pull request 3633 to giant : Fixed write_full behavior in libradosstriper
+
+commit 92c352d047c84035478e71828e32f554d9f507fc
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Feb 12 13:49:50 2015 -0800
+
+    mon/OSDMonitor: do not trust small values in osd epoch cache
+    
+    If the epoch cache says the osd has epoch 100 and the osd is asking for
+    epoch 200+, do not send it 100+.
+    
+    Fixes: #10787
+    Backport: giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a5759e9b97107488a8508f36adf9ca1aba3fae07)
+
+commit 25fcaca19c76765284787c61584d25efd105a0ca
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Feb 5 09:33:26 2015 -0800
+
+    rgw: send appropriate op to cancel bucket index pending operation
+    
+    Fixes: #10770
+    Backport: firefly, giant
+    
+    Reported-by: baijiaruo <baijiaruo at 126.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit dfee96e3aebcaeef18c721ab73f0460eba69f1c7)
+    
+    Conflicts:
+    	src/rgw/rgw_rados.cc
+            resolved by manual s/ADD/CANCEL/
+
+commit e7af52a147cc6e1a578d51193a2d5a425cee8a20
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Feb 5 03:07:50 2015 -0800
+
+    mon: ignore osd failures from before up_from
+    
+    If the failure was generated for an instance of the OSD prior to when
+    it came up, ignore it.
+    
+    This probably causes a fair bit of unnecessary flapping in the wild...
+    
+    Backport: giant, firefly
+    Fixes: #10762
+    Reported-by: Dan van der Ster <dan at vanderster.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 400ac237d35d0d1d53f240fea87e8483c0e2a7f5)
+
+commit 28583276254ba6121b93688a6c6d8fab6588c864
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Feb 9 20:50:23 2015 -0800
+
+    rados.py: keep reference to python callbacks
+    
+    If we don't keep a reference to these, the librados aio calls will
+    segfault since the python-level callbacks will have been garbage
+    collected. Passing them to aio_create_completion() does not take a
+    reference to them. Keep a reference in the python Completion object
+    associated with the request, since they need the same lifetime.
+    
+    This fixes a regression from 60b019f69aa0e39d276c669698c92fc890599f50.
+    
+    Fixes: #10775
+    Backport: dumpling, firefly, giant
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 36d37aadbbbece28d70e827511f1a473d851463d)
+    (cherry picked from commit 5f1245e131e33a98572408c8223deed2c7cf7b75)
+
+commit 1b5fb51a995d5d672a46176240d5887354c12967
+Author: Billy Olsen <billy.olsen at gmail.com>
+Date:   Mon Feb 2 16:24:59 2015 -0700
+
+    Fix memory leak in python rados bindings
+    
+    A circular reference was inadvertently created when using the
+    CFUNCTYPE binding for callbacks for the asynchronous i/o callbacks.
+    This commit refactors the usage of the callbacks such that the
+    Ioctx object does not have a class reference to the callbacks.
+    
+    Fixes: #10723
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Billy Olsen <billy.olsen at gmail.com>
+    Reviewed-by: Dan Mick <dmick at redhat.com>
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 60b019f69aa0e39d276c669698c92fc890599f50)
+
+commit d5b1b7e52242e082820e0cdd76dc59e9aea7f284
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 23 10:47:44 2015 -0800
+
+    osd: do not ignore deleted pgs on startup
+    
+    These need to get instantiated so that we can complete the removal process.
+    
+    Fixes: #10617
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 879fd0c192f5d3c6afd36c2df359806ea95827b8)
+
+commit fe7d4ca17dacf4419be7bdc50010115cee36517b
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Jan 30 11:37:28 2015 +0000
+
+    mon: Monitor: fix timecheck rounds period
+    
+    Fixes: #10546
+    Backports: dumpling?,firefly,giant
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 2e749599ac6e1060cf553b521761a93fafbf65bb)
+
+commit 5771f57af731e61bf70f630cf85f5b94dcfd1edb
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Jan 11 17:28:04 2015 -0800
+
+    osd: requeue blocked op before flush it was blocked on
+    
+    If we have request A (say, cache-flush) that blocks things, and then
+    request B that gets blocked on it, and we have an interval change, then we
+    need to requeue B first, then A, so that the resulting queue will keep
+    A before B and preserve the order.
+    
+    This was observed on this firefly run:
+    
+      ubuntu at teuthology:/a/sage-2015-01-09_21:43:43-rados-firefly-distro-basic-multi/694675
+    
+    Backport: giant, firefly
+    Fixes: #10512
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 11bdfb4131ecac16d4a364d651c6cf5d1d28c702)
+
+commit fa8d45423e22f7b916a345024a9f70283fc3097d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jan 7 13:56:14 2015 -0800
+
+    rgw: index swift keys appropriately
+    
+    Fixes: #10471
+    Backport: firefly, giant
+    
+    We need to index the swift keys by the full uid:subuser when decoding
+    the json representation, to keep it in line with how we store it when
+    creating it through other mechanism.
+    
+    Reported-by: hemant burman <hemant.burman at gmail.com>
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 478629bd2f3f32afbe6e93eaebb8a8fa01af356f)
+
+commit 5fca232080c0bde50b5c65c60c133bf81311e8d3
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 17 16:06:55 2014 +0100
+
+    crush: set_choose_tries = 100 for erasure code rulesets
+    
+    It is common for people to try to map 9 OSDs out of a 9 OSDs total ceph
+    cluster. The default tries (50) will frequently lead to bad mappings for
+    this use case. Changing it to 100 makes no significant CPU performance
+    difference, as tested manually by running crushtool on one million
+    mappings.
+    
+    http://tracker.ceph.com/issues/10353 Fixes: #10353
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 2f87ac807f3cc7ac55d9677d2051645bf5396a62)
+
+commit 4bd523744cefb4a5e6b0d4440b9829b0e19dc012
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Sat Jan 3 15:29:29 2015 +0800
+
+    mount.ceph: avoid spurious error message
+    
+    /etc/mtab in most modern distributions is a symbol link to
+    /proc/self/mounts.
+    
+    Fixes: #10351
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit bdd0e3c4bda97fe18487a58dd173a7dff752e1a2)
+
+commit 30a17441f5030ac5c1227a9672811f88e580b4b2
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Oct 29 14:45:11 2014 -0700
+
+    msg/Pipe: discard delay queue before incoming queue
+    
+    Shutdown the delayed delivery before the incoming queue in case the
+    DelayedDelivery thread is busy queuing messages.
+    
+    Fixes: #9910
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Greg Farnum <greg at inktank.com>
+    (cherry picked from commit f7431cc3c25878057482007beb874c9d4473883e)
+
+commit 8307318cdf9487dde3231aa4a00fca6079379738
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Dec 5 15:29:52 2014 -0800
+
+    osd_types: op_queue_age_hist and fs_perf_stat should be in osd_stat_t::operator==
+    
+    Fixes: 10259
+    Backport: giant, firefly, dumpling
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1ac17c0a662e6079c2c57edde2b4dc947f547f57)
+
+commit a5a76f81ae9242a54d6ef150fa0ac32b31e90c25
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Mon Jan 19 18:49:15 2015 +0000
+
+    mon: PGMonitor: skip zeroed osd stats on get_rule_avail()
+    
+    Fixes: #10257
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit b311e7c36273efae39aa2602c1f8bd90d39e5975)
+
+commit 95ec68505ce4a26ea707716791cfb1e46a75ed25
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Jan 16 18:13:05 2015 +0000
+
+    mon: PGMonitor: available size 0 if no osds on pool's ruleset
+    
+    get_rule_avail() may return < 0, which we were using blindly assuming it
+    would always return an unsigned value.  We would end up with weird
+    values if the ruleset had no osds.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 8be6a6ab2aa5a000a39c73a98b11a0ab32fffa1c)
+
+commit 1c480b39acc184018d976beddc55187f86dfff1a
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Jan 16 18:12:42 2015 +0000
+
+    mon: PGMonitor: fix division by zero on stats dump
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 50547dc3c00b7556e26b9a44ec68640c5c3a2384)
+
+commit 640986fdef3543c7469e43853900b63d7b2f6f36
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Mar 13 19:16:47 2015 -0700
+
+    doc: Fix ceph command manpage to match ceph -h (giant)
+    
+    Fixes: #10677
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+
+commit ec4c8997a67397e3ba5f335e444586f6f1a7864c
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Mar 13 16:50:13 2015 -0700
+
+    doc: Minor fixes to ceph command manpage
+    
+    Fixes: #10676
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 7e85722fd4c89715fc2ed79697c82d65d7ebf287)
+
+commit 15e1c6fb3a0e2e191025f96df33feaf115c1411d
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Mar 12 11:39:52 2015 -0700
+
+    doc: Fix ceph command manpage to match ceph -h (firefly)
+    
+    Improve synopsis section
+    Fixes: #10676
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 9ac488c1eb0e30511079ba05aaf11c79615b3940)
+    
+    Conflicts:
+    
+    	man/ceph.8 (took incoming version)
+
+commit 17d03e8e8b055ed50b1abb679a0dd1edf4ec3f30
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Thu Dec 18 17:11:22 2014 +0530
+
+    doc: Changes format style in ceph to improve readability as html.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 8b796173063ac9af8c21364521fc5ee23d901196)
+
+commit 61d600687ae6887a2edea0e79d582b1353558a83
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue Mar 10 19:55:57 2015 +0800
+
+    mds: fix assertion caused by system clock backwards
+    
+    Fixes: #11053
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+
+commit f1c9c71fd6d566687db05e1d8f15b04a9f793005
+Author: Nilamdyuti Goswami <ngoswami at redhat.com>
+Date:   Sat Dec 13 02:24:41 2014 +0530
+
+    doc: Adds man page for ceph.
+    
+    Signed-off-by: Nilamdyuti Goswami <ngoswami at redhat.com>
+    (cherry picked from commit 76da87a64ca6b3cc0ceeaf63e19a9f440d6f4161)
+
+commit 8a5a3c7a20517c7482dc9f5f2783a3da54bd4f23
+Author: Dongmao Zhang <deanraccoon at gmail.com>
+Date:   Fri Nov 14 18:48:58 2014 +0800
+
+    Fix libstriprados::stat, use strtoll insdead of strtol
+    
+    The return value(long int) of strict_strtol is too small for unstriped
+    object.
+    
+    Signed-off-by: Dongmao Zhang <deanraccoon at gmail.com>
+    (cherry picked from commit fe6679dca479fc24806d7e57ab0108a516cd6d55)
+
+commit 5d423a5188c62650eaa39077eb99a84085f5f3e2
+Author: Dongmao Zhang <deanraccoon at gmail.com>
+Date:   Wed Dec 10 18:55:28 2014 +0800
+
+    Fix libstriprados::remove, use strtoll insdead of strtol
+    
+    Signed-off-by: Dongmao Zhang <deanraccoon at gmail.com>
+    (cherry picked from commit 78a15ee4c61fdadccb1921e861748400cc651862)
+
+commit 938e03630e075af03780da139ae879b5b0377734
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Feb 2 13:57:00 2015 -0800
+
+    Objecter::_op_submit_with_budget: add timeout before call
+    
+    Objecter::_send_op depends on the ontimeout field being filled in
+    to avoid 10340 and 9582.
+    
+    Fixes: 10340
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit cfcfafcb0f33994dbda1efe478ef3ab822ff50d4)
+
+commit 984df3b865f295ecf77b041a69d1d59384d80671
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Feb 10 16:29:45 2015 +0800
+
+    osd: fix PG leak in SnapTrimWQ._clear()
+    
+    Fixes: #10421
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 01e154d592d6cdbf3f859cf1b4357e803536a6b4)
+
+commit c5c6fcd6ad7a0317301970bc25419727ee3192fa
+Author: David Zafman <dzafman at redhat.com>
+Date:   Wed Feb 18 16:21:12 2015 -0800
+
+    osd: Fix FileJournal wrap to get header out first
+    
+    Correct and restore assert that was removed
+    
+    Cause by f46b1b473fce0322a672b16c7739e569a45054b6
+    Fixes: #10883
+    Backport: dumpling, firefly, giant
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 970bb4901f93575709421b5b25c3eff213de61b8)
+
+commit 37f196e80906d6b855ca0a7ce7344d1f8f50ae7f
+Author: Sebastien Ponce <Sebastien.Ponce at cern.ch>
+Date:   Thu Feb 5 10:46:37 2015 +0100
+
+    libradosstriper: fixed write_full when ENOENT
+    
+    Fixes: #10758
+    write_full was returning ENOENT when the file did not exists, while it should just have created it without complaining.
+    
+    Signed-off-by: Sebastien Ponce <sebastien.ponce at cern.ch>
+    (cherry picked from commit 6a91f2bb82035b3c8021a7dc7b23548ce3d61eb6)
+
+commit b318e2ffc3faedf6b02908429eb4ce79147d3471 (refs/remotes/gh/wip-10643)
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Oct 17 18:01:05 2014 +0100
+
+    mon: MDSMonitor: don't return -EINVAL if function is bool
+    
+    Returning -EINVAL on a function that expects bool and the error code to
+    be in a variable 'r' can only achieve one thing: if this path is ever
+    touched, instead of returning an error as it was supposed to, we're
+    returning 'true' with 'r = 0' and, for no apparent reason, the user will
+    think everything went smoothly but with no new fs created.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 91b2a2b69b198567d42f45f75b7f7ea559f89150)
+
+commit a1a7d856f5409280b6345afbbd961bcd8ee8d046
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Oct 17 17:43:33 2014 +0100
+
+    mon: MDSMonitor: check all conditions are met *before* osdmon proposal
+    
+    We should not allow ourselves to request the osdmon to propose before we
+    know for sure that we meet the required conditions to go through with
+    our own state change.  Even if we still can't guarantee that our
+    proposal is going to be committed, we shouldn't just change the osdmon's
+    state just because we can.  This way, at least, we make sure that our
+    checks hold up before doing anything with side-effects.
+    
+    Fixes: #10643
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 1d1ae413e9f0aafa314af903bcf6b815f6558082)
+
+commit 0df7cf1e58bc4d77c69354f2a7160e3d9e6d1fc1
+Author: Joao Eduardo Luis <joao at redhat.com>
+Date:   Fri Oct 17 17:37:03 2014 +0100
+
+    mon: MDSMonitor: return if fs exists on 'fs new'
+    
+    We were just setting return code to -EINVAL, while allowing the logic to
+    continue regardless.  If we are to return error, then we should abort
+    the operation as well and let the user know it went wrong instead of
+    continuing as if nothing had happened.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at redhat.com>
+    (cherry picked from commit 07b7f101057a80d1356bd20040180e94cd20c211)
diff --git a/doc/changelog/v0.94.1.txt b/doc/changelog/v0.94.1.txt
new file mode 100644
index 0000000..227267d
--- /dev/null
+++ b/doc/changelog/v0.94.1.txt
@@ -0,0 +1,74 @@
+commit e4bfad3a3c51054df7e537a724c8d0bf9be972ff (tag: refs/tags/v0.94.1, refs/remotes/gh/hammer)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Fri Apr 10 12:04:50 2015 -0700
+
+    0.94.1
+
+commit 733864738fa93979727e480e403293e079bb51e9
+Merge: b5921d5 5ca771a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Apr 10 17:51:38 2015 +0200
+
+    Merge pull request #4328 from dachary/wip-11364-hammer
+    
+    v4 bucket feature detection
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 5ca771a7d1df8e78ee503a7063068cf744d5efcc
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Apr 10 08:43:45 2015 -0700
+
+    crush: fix has_v4_buckets()
+    
+    alg, not type!
+    
+    This bug made us incorrectly think we were using v4 features when user type
+    5 was being used.  That's currently 'rack' with recent crush maps, but
+    was other types for clusters that were created with older versions.  This
+    is clearly problematic as it will lock out non-hammer clients incorrectly,
+    breaking deployments on upgrade.
+    
+    Fixes: #11364
+    Backport: hammer
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 38b35ab9d17eb84ac178c4cd3ebcf2ec0f66d8b6)
+
+commit 33e79ab7aa0b5428e8fb82a90eea17d31d363a88
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Apr 9 17:17:59 2015 -0700
+
+    crush: fix dump of has_v4_buckets
+    
+    Backport: hammer
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d6e23413017fb8f5d7f18d74e993ceeedb82d8bc)
+
+commit b5921d55d16796e12d66ad2c4add7305f9ce2353
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Apr 9 14:42:34 2015 -0700
+
+    crush/mapper: fix divide-by-0 in straw2
+    
+    If the item weight is 0 we don't want to divide; instead draw a minimal
+    value.
+    
+    Fixes: #11357
+    Reported-by: Yann Dupont <yd at objoo.org>
+    Tested-by: Yann Dupont <yd at objoo.org>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 64d1e900ec4f5831972ec80e8d0129604669f5bb)
+
+commit 93c8f436a4f84ac8088e1a1de82350dd33c68d64
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Thu Feb 26 08:13:12 2015 +0000
+
+    osd: fix negative degraded objects during backfilling
+    
+    When there is deleting requests during backfilling, the reported number of degraded
+    objects could be negative, as the primary's num_objects is the latest (locally) but
+    the number for replicas might not reflect the deletings. A simple fix is to ignore
+    the negative subtracted value.
+    
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit 14d7e36d3c978844da73d0e1c8a3a1ec863bac15)
diff --git a/doc/changelog/v0.94.2.txt b/doc/changelog/v0.94.2.txt
new file mode 100644
index 0000000..f8113af
--- /dev/null
+++ b/doc/changelog/v0.94.2.txt
@@ -0,0 +1,1563 @@
+commit 5fb85614ca8f354284c713a2f9c610860720bbf3 (tag: refs/tags/v0.94.2, refs/remotes/gh/hammer)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Tue Jun 9 12:32:34 2015 -0700
+
+    0.94.2
+
+commit d967cecf0a5d7fbf992a0195341cbd893a358264
+Merge: eb69cf7 968573b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri May 29 09:49:43 2015 +0200
+
+    Merge pull request #4795 from dachary/wip-11806-hammer
+    
+    ceph / ceph-dbg steal ceph-objecstore-tool from ceph-test / ceph-test-dbg
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 968573b8930a7c8485bf53e3a989ce2f7d0a2fff
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu May 28 10:35:51 2015 +0200
+
+    debian: ceph-dbg steals ceph-objectstore-tool from ceph-test-dbg
+    
+    When ceph-objectstore-tool was moved from ceph-test to
+    ceph by 61cf5da0b51e2d9578c7b4bca85184317e30f4ca, the ceph package in
+    debian/control was updated accordingly, as recommended by
+    https://www.debian.org/doc/debian-policy/ch-relationships.html#s-replaces
+    
+    The same must be done for the ceph-dbg package because
+    /usr/lib/debug/usr/bin/ceph-objectstore-too is no longer in
+    ceph-test-dbg.
+    
+    Although the change was merged may 6th, 2015
+    8f23382064c189b657564d58c3f9d17720e891ed, teuthology jobs were not
+    always failing because packages were not systematically upgraded during
+    the installation. The missing dependencies that were responsible for
+    this upgrade problem were fixed by
+    f898ec1e4e3472b0202280f09653a769fc62c8d3 on may 18th, 2015 and all
+    upgrade tests relying on ceph-*-dbg packages started to fail
+    systematically after this date.
+    
+    http://tracker.ceph.com/issues/11546 Fixes: #11546
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 6f11fbf41fab10924b1e0e41fcf27864779d4073)
+
+commit eb69cf758eb25e7ac71e36c754b9b959edb67cee
+Merge: 63832d4 344328d
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Tue May 26 19:52:59 2015 -0600
+
+    Merge pull request #4773 from dachary/wip-11733-hammer
+    
+    Debian: ceph-test and rest-bench debug packages should require their respective binary packages
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 344328de584ac707b59ab857f1f3dd4165adfcf5
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Mon May 18 10:50:58 2015 -0600
+
+    debian: set rest-bench-dbg ceph-test-dbg dependencies
+    
+    Debian's debug packages ought to depend on their respective binary
+    packages. This was the case for many of our ceph packages, but it was
+    not the case for ceph-test-dbg or rest-bench-dbg.
+    
+    Add the dependencies on the relevant binary packages, pinned to
+    "= ${binary:Version}" per convention.
+    
+    http://tracker.ceph.com/issues/11673 Fixes: #11673
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit f898ec1e4e3472b0202280f09653a769fc62c8d3)
+
+commit 63832d4039889b6b704b88b86eaba4aadcfceb2e
+Merge: 195884e 293affe
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 18 14:26:16 2015 +0200
+
+    Merge pull request #4696 from ceph/wip-11622-hammer
+    
+    Wip 11622 hammer
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 195884e21760f4948f7d1df8b65788514f918054
+Merge: b69fb89 95818da
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri May 15 13:47:04 2015 -0700
+
+    Merge pull request #4649 from ceph/wip-hammer-package-perf-objectstore
+    
+    packaging: include ceph_perf_objectstore
+
+commit 293affe992118ed6e04f685030b2d83a794ca624 (refs/remotes/gh/wip-11622-hammer)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed May 13 17:05:22 2015 -0700
+
+    rgw: merge manifests correctly when there's prefix override
+    
+    Fixes: #11622
+    Backport: hammer, firefly
+    
+    Prefix override happens in a manifest when a rados object does not
+    conform to the generic prefix set on the manifest. When merging
+    manifests (specifically being used in multipart objects upload), we need
+    to check if the rule that we try to merge has a prefix that is the same
+    as the previous rule. Beforehand we checked if both had the same
+    override_prefix setting, but that might not apply as both manifests
+    might have different prefixes.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 389ae6739ddc6239a4dd7c5f7f9bfc9b645b8577)
+
+commit a43d24861089a02f3b42061e482e05016a0021f6
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue May 12 16:40:10 2015 -0700
+
+    rgw: restore buffer of multipart upload after EEXIST
+    
+    Fixes #11604
+    Backport: hammer, firefly
+    
+    When we need to restart a write of part data, we need to revert to
+    buffer to before the write, otherwise we're going to skip some data.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 580ccaec12daae64c38a1616d0be907bdd70a888)
+
+commit 95818dac1522c218662ec12bd42c470d8394b3b9
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Fri Mar 13 16:08:35 2015 -0600
+
+    packaging: include ceph_perf_objectstore
+    
+    The /usr/bin/ceph_perf_objectstore file is installed by default. Prior
+    to this commit it was missing from the packaging. This caused the RPM to
+    fail to build in mock.
+    
+    Add ceph_perf_objectstore to the "ceph-test" RPM and Debian package.
+    
+    If we end up developing further ceph_perf_* utilities, it would make
+    sense to glob them all with a wildcard, similar to what we are doing
+    with all the ceph_test_* utilities in ceph-test.
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 338b44bc74bc4597939c5c58f2a6f2cb08de7d9c)
+
+commit b69fb89122d6f989152a29124cc7ed54b5e4d43b
+Merge: 0f02512 efbfe6f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon May 11 10:27:02 2015 -0700
+
+    Merge pull request #4568 from dachary/wip-10662-10663-hammer
+    
+    RGW swift API: Response header of COPY request for object does not
+    
+    contain x-copied-from, custom metadata, x-copied-from-last-modified, X-Copied-From-Account headers
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 0f025122fe574b99504a630e3d489c3449cbbe46
+Merge: 7df3eb5 6e2dd40
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 11 14:08:53 2015 +0200
+
+    Merge pull request #4629 from ceph/hammer-uclient-checking
+    
+    Hammer uclient checking
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 6e2dd408be95644ee5bceb556a90483f882fe51c
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu May 7 18:42:01 2015 +0100
+
+    client: fix error handling in check_pool_perm
+    
+    Previously, on an error such as a pool not existing,
+    the caller doing the check would error out, but
+    anyone waiting on waiting_for_pool_perm would
+    block indefinitely (symptom was that reads on a
+    file with a bogus layout would block forever).
+    
+    Fix by triggering the wait list on errors and
+    clear the CHECKING state so that the other callers
+    also perform the check and find the error.
+    
+    Additionally, don't return the RADOS error code
+    up to filesystem users, because it can be
+    misleading.  For example, nonexistent pool is
+    ENOENT, but we shouldn't give ENOENT on IO
+    to a file which does exist, we should give EIO.
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit e08cf25cafef5752877439c18cc584b0a75eca08)
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 3c2e6ae97d6129cb8f5befb3e7bf4be16373f6a5
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu May 7 18:17:37 2015 +0100
+
+    client: use SaferCond in check_pool_perm
+    
+    Just because it's easier to read.
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 289ee3b80ccce6bab2966f513a37332280d04a06)
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 79b2ac215187402a99594424944db4169f2b2cdf
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Apr 24 15:23:21 2015 +0800
+
+    client: check OSD caps before read/write
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 3c4028ec21e3ef9e8801c4570420c88722651cc7)
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 7df3eb5e548f7b95ec53d3b9d0e43a863d6fe682
+Merge: 6a7fa83 2f86995
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 11:07:07 2015 -0700
+
+    Merge pull request #4567 from dachary/wip-10938-hammer
+    
+    RGW Swift API: response for GET/HEAD on container does not contain the X-Timestamp header
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 6a7fa83b3e72b85f92d003a5bbb03a301354a657
+Merge: 553f0db 3edb196
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 11:05:59 2015 -0700
+
+    Merge pull request #4570 from dachary/wip-10243-hammer
+    
+    civetweb is hitting a limit (number of threads 1024)
+
+commit 553f0db9a1fcff2601a8791af1d2bb6975d2821d
+Merge: 3fe1f2b 3aef0f2
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 11:05:41 2015 -0700
+
+    Merge pull request #4573 from dachary/wip-11125-hammer
+    
+    rgw: keystone token cache does not work correctly
+
+commit 3fe1f2b8ab3d0d3943a312e90f6a3de99c36beb4
+Merge: e0ed459 4d1f3f0
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 11:05:22 2015 -0700
+
+    Merge pull request #4574 from dachary/wip-11160-hammer
+    
+    rgw: shouldn't need to disable rgw_socket_path if frontend is configured
+
+commit e0ed459442b1e9053e29e345cd0f30d1b4b4b994
+Merge: d6de3fa d2043a5
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 11:04:36 2015 -0700
+
+    Merge pull request #4575 from dachary/wip-10650-hammer
+    
+    Response header of swift API PUT /container/object returned by RGW
+    
+    does not contain last-modified, content-length, x-trans-id headers. But Swift returns these headers.
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit d6de3fa0b55918bc2ac2d65ee8308f04d3605dfd
+Merge: 96dc624 2cb5d60
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 11:03:37 2015 -0700
+
+    Merge pull request #4576 from dachary/wip-10661-hammer
+    
+    RGW swift API: Response header of POST request for object does not contain content-length and x-trans-id headers
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 96dc624ee1f593f817055d3426054ef2e05cbf92
+Merge: ae61aee f4a0dab
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 10:59:15 2015 -0700
+
+    Merge pull request #4579 from dachary/wip-11036-hammer
+    
+    RGW Swift API: response for PUT on /container does not contain the mandatory Content-Length header when FCGI is used
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit ae61aee99bee9185af22424ec8019e0308828bf5
+Merge: 593d07f 7f2a9ed
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 10:57:47 2015 -0700
+
+    Merge pull request #4580 from dachary/wip-11088-hammer
+    
+    RGW Swift API: wrong handling of empty metadata on Swift container
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 593d07f29df8584629936051be4458b00f8a8f1f
+Merge: 4f2b41c d164d80
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 8 10:57:12 2015 -0700
+
+    Merge pull request #4581 from dachary/wip-11323-hammer
+    
+    rgw: quota not respected in POST object
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 4f2b41c4c803786c49cd2d2806d82e9223ab96a9
+Merge: 92e7a7f 893ffd3
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Fri May 8 09:15:41 2015 -0700
+
+    Merge pull request #4566 from dachary/wip-11478-hammer
+    
+    Queued AIO reference counters not properly updated
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 92e7a7f057dd9aabb4f66965c412135d05f6812f
+Merge: 2fbf171 0944051
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Fri May 8 09:15:19 2015 -0700
+
+    Merge pull request #4564 from dachary/wip-11369-hammer
+    
+    Periodic failure of TestLibRBD.DiffIterateStress
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 2fbf1712d1e190774ada0af5094134369effb3ac
+Merge: 9d97946 02a3813
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri May 8 17:32:35 2015 +0200
+
+    Merge pull request #4585 from ceph/wip-11370-hammer
+    
+    A retransmit of proxied flatten request can result in -EINVAL
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 9d97946a8908e48849355a410415e09914ef3948
+Merge: fb10594 c548d8d
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Fri May 8 20:39:29 2015 +0800
+
+    Merge pull request #4618 from dachary/wip-11398-kill-daemons-hammer
+    
+    tests: ceph-helpers kill_daemons fails when kill fails
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit c548d8d44baae78b868391e3c6fb7294f024b082
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed May 6 20:14:37 2015 +0200
+
+    tests: ceph-helpers kill_daemons fails when kill fails
+    
+    Instead of silently leaving the daemons running, it returns failure so
+    the caller can decide what to do with this situation. The timeout is
+    also extended to minutes instead of seconds to gracefully handle the
+    rare situations when a machine is extra slow for some reason.
+    
+    http://tracker.ceph.com/issues/11398 Fixes: #11398
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 0e26e9f72bc14417266b87ac1159607e1b109303)
+
+commit fb10594f2ab2427a2bf1d2f2b164a3a0928e3335
+Author: Yuri Weinstein <yuri.weinstein at inktank.com>
+Date:   Thu May 7 17:12:35 2015 -0700
+
+    Added a "ceph hello world" for a simple check for ceph-deploy qa suite
+    
+    Signed-off-by: Yuri Weinstein <yweinste at redhat.com>
+    (cherry picked from commit 13abae186357f4e9bb40990a7a212f93ec2e1e79)
+    
+    Signed-off-by: Yuri Weinstein <yweinste at redhat.com>
+
+commit 6cfae7f074462498e82cfeeddbc2fe8d302c7aa0
+Merge: 736cdf4 8d9f4d4
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu May 7 13:29:57 2015 -0700
+
+    Merge pull request #4502 from dachary/wip-11026-hammer
+    
+    objecter: can get stuck in redirect loop if osdmap epoch == last_force_op_resend
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 736cdf450caa0b22cbfc54f4497717cf63d5bda7
+Merge: 3bd8e4f 46a4e8a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu May 7 21:45:53 2015 +0200
+
+    Merge pull request #4562 from dachary/wip-11376-hammer
+    
+    ceph-objectstore-tool should be in the ceph server package
+    
+    
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 46a4e8af5be54d8348a920c4a3a58e24dbf35988
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Thu Apr 30 15:53:22 2015 -0600
+
+    packaging: mv ceph-objectstore-tool to main ceph pkg
+    
+    This change ensures that the ceph-objectstore-tool utility is present on
+    all OSDs.  This makes it easier for users to run this tool to do manual
+    debugging/recovery in some scenarios.
+    
+    http://tracker.ceph.com/issues/11376 Refs: #11376
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 61cf5da0b51e2d9578c7b4bca85184317e30f4ca)
+        Conflicts:
+                debian/control
+                because file layout changes from ceph-test and ceph << 0.94.1-46
+
+commit 3bd8e4fa17d8acfd645b8a553bf58de48d59d648
+Merge: 76f6db2 6a04b55
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu May 7 19:05:48 2015 +0200
+
+    Merge pull request #4561 from dachary/wip-11143-hammer
+    
+    src/ceph-disk : disk zap sgdisk invocation
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 76f6db24e09a4bfc55cbfb7075104f20653263cc
+Merge: e5a20f8 8996907
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu May 7 19:03:53 2015 +0200
+
+    Merge pull request #4560 from dachary/wip-11507-hammer
+    
+    object creation by write cannot use an offset on an erasure coded pool
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit e5a20f83ed6d8d3d09827343d757318026f6a690
+Merge: e7671a5 8a6e6e4
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu May 7 19:03:16 2015 +0200
+
+    Merge pull request #4559 from dachary/wip-11429-hammer
+    
+    OSD::load_pgs: we need to handle the case where an upgrade from earlier versions which ignored non-existent pgs resurrects a pg with a prehistoric osdmap
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit e7671a58939f6e2e37f9f6df0f039f485ad4ca16
+Merge: 126a372 113f3b1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu May 7 18:48:56 2015 +0200
+
+    Merge pull request #4563 from tchaikov/wip-hammer-11534
+    
+    mon: Total size of OSDs is a maginitude less than it is supposed to be.
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 126a37212550a4a59beaa80e0579098198f74db5
+Merge: 58b30d5 c87aa11
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu May 7 18:18:17 2015 +0200
+
+    Merge pull request #4577 from dachary/wip-10666-hammer
+    
+    RGW swift API: Response header of GET request for container does not contain X-Container-Object-Count, X-Container-Bytes-Used and x-trans-id headers
+    
+    Reviewed-by: Dmytro Iurchenko <diurchenko at mirantis.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit f4a0dabfe8debc7b54afa5da179d51db891f5bc0
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Sun Mar 8 22:45:34 2015 +0100
+
+    rgw: send Content-Length in response for HEAD on Swift account.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 29073d84640b61d0221b2d2ab73c271d60fd13ba)
+
+commit 32f4a7439d1e0ce6aab1c1e39407b14e124d03bf
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 6 13:18:19 2015 +0100
+
+    rgw: send Content-Length in response for DELETE on Swift container.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit d260a93405a7a34a899f716bd9c4e731baa9ffd0)
+
+commit d39a66007fa7211c00a67f9cd898e55551f5ae62
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 6 13:14:26 2015 +0100
+
+    rgw: send Content-Length in response for PUT on Swift container.
+    
+    Fixes: #11036
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 10c1f1aa1e09df5edf5d2f9f9b0273ddbcb384fa)
+
+commit 02a3813a6a4f9c8ce14f64fc7f378030e7ea6f93
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Apr 27 01:03:52 2015 -0400
+
+    librbd: flatten should return -EROFS if image is read-only
+    
+    Fixes: #11475
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f141e02ab719df830648318f4c1d9ca286071ed3)
+
+commit af8939be80310e234745fe81e67244ab52c6add5
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Apr 27 01:00:38 2015 -0400
+
+    librbd: allow snapshots to be created when snapshot is active
+    
+    The librbd API previously permitted the creation of snapshots while
+    the image context was associated to another snapshot.  A recent code
+    cleanup broke that ability, so this re-introduces it.  The code change
+    also allows minor cleanup with rebuild_object_map.
+    
+    Fixes: #11475
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 594a6610802f2cadb62200815bd8b9860809e759)
+    
+    Conflicts:
+    	src/librbd/internal.cc
+
+commit d21c0c00d2bed282677d2063a3fb6f5346641286
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Apr 21 12:59:33 2015 -0400
+
+    librbd: better handling for duplicate flatten requests
+    
+    A proxied flatten request could be replayed, resulting in a
+    -EINVAL error code being generated on the second attempt. Filter
+    out that error if it is known the parent did exist before the
+    op started.
+    
+    Fixes: #11370
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit ef7e210c3f747bc4c3c8768c7b6407cc91c5c319)
+
+commit ec0bd1dea526e04333d8059421666dcd2a59044e
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Mar 18 11:51:47 2015 -0400
+
+    librbd: use generic helper for issuing async requests
+    
+    resize, flatten, and rebuild object map now use the same
+    bootstrap code for sending the request to the remote lock owner
+    or executing the request locally.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 18fd6ca7f59d5545f0bb0b0e899d0739639ce104)
+    
+    Conflicts:
+    	src/librbd/internal.cc
+
+commit 8a6e6e4c107b03563b2e38aa24cc2067ce6a7350
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Apr 20 23:45:57 2015 -0700
+
+    OSD: handle the case where we resurrected an old, deleted pg
+    
+    Prior to giant, we would skip pgs in load_pgs which were not present in
+    the current osdmap.  Those pgs would eventually refer to very old
+    osdmaps, which we no longer have causing the assertion failure in 11429
+    once the osd is finally upgraded to a version which does not skip the
+    pgs.  Instead, if we do not have the map for the pg epoch, complain to
+    the osd log and skip the pg.
+    
+    Fixes: 11429
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit fbfd50de5b9b40d71d2e768418a8eca28b1afaca)
+
+commit efbfe6fced72d07309ccf1f1a219c037b7f535fa
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Sat Mar 21 15:53:08 2015 +0100
+
+    rgw: improve metadata handling on copy operation of Swift API.
+    
+    Fixes: #10645
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit a00cb31cc52e91bfacdd15e0af60be74e66c1996)
+
+commit d164d8004feddb3e2238b26e3360a905e209d117
+Author: 9seconds <nineseconds at yandex.ru>
+Date:   Wed Apr 1 09:12:06 2015 +0300
+
+    rgw: quota not respected in POST object
+    
+    Signed-off-by: Sergey Arkhipov <nineseconds at yandex.ru>
+    Backport: hammer, firefly
+    Fixes: #11323
+    (cherry picked from commit e76f84e179d2ba8bfc0dc5abf4e620fef14bc8a0)
+    
+    Conflicts:
+    	src/rgw/rgw_op.cc
+            discard the whitespace modification hunk that were creating
+    	conflict and ignore the conflict due to an unrelated cast
+            modification in the context
+
+commit 7f2a9ed7a986145d4b34517a1a1bb44799ebf621
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Tue Mar 10 19:36:59 2015 +0100
+
+    rgw: fix handling empty metadata items on Swift container.
+    
+    Fixes: #11088
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 1660d8625212f7b5fb30568ed640f467297e36cb)
+
+commit 8e6efdbcb0f820b2ab3728662efbfb4bc45495af
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Feb 27 15:23:16 2015 +0100
+
+    rgw: send Content-Length in response for GET on Swift container.
+    
+    Fixes: #10971
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 5a64fb5430b6b42174bf53a5910d9435043c1380)
+
+commit 54b62904a4cc3913be23803734fa68741a3c33cc
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 6 12:42:52 2015 +0100
+
+    rgw: enable end_header() to handle proposal of Content-Length.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit f98fd4dfda7a105d621f99c2b48eb9ab9b45d979)
+
+commit c87aa110bd224ae3220c5486fbd2486ebdfb8b8e
+Author: Dmytro Iurchenko <diurchenko at mirantis.com>
+Date:   Mon Feb 16 18:47:59 2015 +0200
+
+    rgw: Swift API. Complement the response to "show container details"
+    
+    OpenStack Object Storage API v1 states that X-Container-Object-Count, X-Container-Bytes-Used and user-defined metadata headers should be included in a response.
+    
+    Fixes: #10666
+    Backport: hammer
+    Reported-by: Ahmad Faheem <ahmad.faheem at ril.com>
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+    Signed-off-by: Dmytro Iurchenko <diurchenko at mirantis.com>
+    (cherry picked from commit d3a3d5ae5859cd7f2eed307e8f942f9a9fd75f35)
+
+commit 2cb5d600699085fe0e996b91cf85603be3da230e
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Thu Feb 26 19:21:03 2015 +0100
+
+    rgw: enforce Content-Length in response for POST on Swift cont/obj.
+    
+    Fixes: #10661
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit fd0c612cf867d2e99e74820130357e63305970fb)
+
+commit d2043a5f3b8d7a3ce50c4e84aa88481c8912ae25
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 13 21:41:45 2015 +0100
+
+    rgw: send Last-Modified header in response for PUT on Swift object.
+    
+    Fixes: #10650
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 9a22acc57684534a245f25848c23d1db21f16653)
+
+commit 4d1f3f03ef8809693c8ea2bcbc4d24fd41ae1842
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Mar 18 20:49:13 2015 -0700
+
+    rgw: don't use rgw_socket_path if frontend is configured
+    
+    Fixes: #11160
+    Backport: hammer, firefly
+    
+    Previously if we wanted to use the tcp fcgi socket, we needed to clear
+    rgw_socket_path.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 36d6eea3caa79fcb4e08bdd340ccda2474b9e5ea)
+
+commit 3aef0f2bb6f88bb17c460a3cef0d3503550f716c
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Mar 3 11:03:35 2015 -0800
+
+    rgw: update keystone cache with token info
+    
+    Fixes: #11125
+    Backport: hammer, firefly
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 6616294aa140ceb83cc61c6ab6f9947636f5e67d)
+
+commit 3edb1964fe9e8574aafcb758d170007f0e43a324
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Apr 21 11:08:45 2015 -0700
+
+    civetweb: update max num of threads
+    
+    Fixes: #10243
+    cherry-picked upstream fixed into submodule
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7a432f7bdfbbc51518fb63d7f2ecab401e8a8d4f)
+
+commit bc6eb8d5f0a66aec3fbda0b794d008a3157a8154
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Tue Apr 7 14:09:57 2015 +0200
+
+    rgw: improve code formatting ONLY.
+    
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 214c8b32b1b04885005e929a7ed2d4354b3ea20b)
+
+commit 7aa1ae60cea17e0bd140c0cf2313d82f2f64554f
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Tue Mar 17 14:07:34 2015 +0100
+
+    rgw: send X-Copied-From-Last-Modified header of Swift API.
+    
+    Fixes: #10663
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit e7724a1d8c0872362c19f578fe30ac2cf3dada90)
+
+commit 150b9e2b85a72dc247da4ba1ab770e6af053acb7
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Tue Mar 17 14:06:37 2015 +0100
+
+    rgw: dump object metadata in response for COPY request of Swift API.
+    
+    Fixes: #10663
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit c52b75edeaeef19471b9aca772bf08055bf04031)
+
+commit e749701be5368a22cad1630f8202e48f5d980409
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 13 17:59:01 2015 +0100
+
+    rgw: refactor dumping metadata of Swift objects.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit ccf6eaac6f7068289c4a4ffd3f0481d497ba7c87)
+
+commit b034511fa79996415640b4aca3e8747340f2a127
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Fri Mar 13 18:37:39 2015 +0100
+
+    rgw: add support for X-Copied-From{-Account} headers of Swift API.
+    
+    Fixes: #10663
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 94f1375ccb9df02cdd8f6828153ae2e3a7ad36b1)
+
+commit c9e6a0bf8c601c4fd9065c1f3a8ea445bd652a52
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Wed Mar 11 14:08:03 2015 +0100
+
+    rgw: send ETag, Last-Modified in response for copying Swift cobject.
+    
+    Fixes: #11087
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 385fe4b4bbbd4a9aab92abf2a813090deeaa037e)
+
+commit 7f41ff0a6577b0784c6719b9d705f32921b1c40e
+Author: Dmytro Iurchenko <diurchenko at mirantis.com>
+Date:   Fri Feb 20 18:31:03 2015 +0200
+
+    rgw: Swift API. Allows setting attributes with COPY object operation.
+    
+    http://developer.openstack.org/api-ref-objectstorage-v1.html says: "With COPY, you can add additional metadata to the object."
+    
+    Fixes: #10662
+    Backport: hammer
+    Reported-by: Ahmad Faheem <ahmad.faheem at ril.com>
+    Signed-off-by: Dmytro Iurchenko <diurchenko at mirantis.com>
+    (cherry picked from commit 1b722bbcd691e0a4a39ea77cd28e309fd723ec88)
+
+commit 2f869959ffe1adbcfef7d26ae2d022d23d982673
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Wed Feb 25 16:12:58 2015 +0100
+
+    rgw: improve format of X-Timestamp on Swift objects.
+    
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit e54fef9542bc2b5db192308728a99df139a4b6cf)
+
+commit 48b19810a9860f6fccbf8d9b8a2fadfb37f598dd
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Wed Feb 25 14:11:40 2015 +0100
+
+    rgw: add support for X-Timestamp on Swift containers.
+    
+    Fixes: #10938
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit b7e9bf6b98ee48d1977d907a9e5130c0ce073c54)
+
+commit 893ffd3767678ab881c4bc44ecfe1801cb9f9704
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Apr 27 03:43:10 2015 -0400
+
+    tests: AioCompletion incorrectly freed
+    
+    The AioCompletion should be released instead of directly
+    deleted.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 387a09eeeaf0b66b3a2ddc36388da27d5804a4c7)
+
+commit 96b0db5decfad452964750cff92a63007433e519
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Apr 27 03:42:24 2015 -0400
+
+    librbd: update ref count when queueing AioCompletion
+    
+    If the client releases the AioCompletion while librbd is waiting
+    to acquire the exclusive lock, the memory associated with the
+    completion will be freed too early.
+    
+    Fixes: #11478
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit fd7723a1e62e682ac5a5279231a9fd6f5682bf94)
+
+commit 094405171bdead0ce09055d4acc6445274992a01
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Apr 10 12:37:05 2015 -0400
+
+    librbd: failure to update the object map should always return success
+    
+    If an object map update fails, the object map will be flagged as
+    invalid.  However, if a subsequent update failure occurs, the error
+    code will propagate back to the caller.
+    
+    Fixes: #11369
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 99f5a7d595c653447b351898192410c9cb773770)
+
+commit 7ee7dcfd609731d3c7f51b74c1d99fb3fa51c413
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Mar 6 15:40:48 2015 -0500
+
+    tests: librados_test_stub reads should deep-copy
+    
+    If a client of librados_test_stub modified a bufferlist
+    retrieved via a read call, the client will actually be
+    changing the contents of the file.  Therefore, read calls
+    should deep-copy the contents of the buffer::ptrs.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 76fe8d73ff79da2d734f70680208a2c188b58671)
+
+commit 113f3b14ec8631d57bbbc2931e242ac96cf9e6fc
+Author: Zhe Zhang <zzxuanyuan at gmail.com>
+Date:   Tue May 5 18:08:48 2015 -0500
+
+    mon: Total size of OSDs is a maginitude less than it is supposed to be.
+    
+    When dumping statistics of OSDs such as running command "ceph osd df",
+    the sum of OSDs' size is 2^10 times less than their real size.
+    
+    Fixes: #11534
+    Signed-off-by: Zhe Zhang <zzxuanyuan at gmail.com>
+    (cherry picked from commit 73d16f69d6f58fe8be262b0fb8db28c94605ea7d)
+
+commit 6a04b55df76faad9b1b0770fbe6038b3b8c7d645
+Author: Owen Synge <osynge at suse.com>
+Date:   Tue Mar 17 15:41:33 2015 +0100
+
+    Fix "disk zap" sgdisk invocation
+    
+    Fixes #11143
+    
+    If the metadata on the disk is truly invalid, sgdisk would fail to zero
+    it in one go, because --mbrtogpt apparently tried to operate on the
+    metadata it read before executing --zap-all.
+    
+    Splitting this up into two separate invocations to first zap everything
+    and then clear it properly fixes this issue.
+    
+    Based on patch by Lars Marowsky-Bree <lmb at suse.com> in ceph-deploy.
+    Created by Vincent Untz <vuntz at suse.com>
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit fdd7f8d83afa25c4e09aaedd90ab93f3b64a677b)
+
+commit 8996907e0a777320b505e74754f48a1a82308166
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Fri Mar 6 15:54:07 2015 +0800
+
+    osd: refuse to write a new erasure coded object with an offset > 0
+    
+    Even if the offset is properly aligned.
+    
+    http://tracker.ceph.com/issues/11507 Fixes: #11507
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit a4f1256c214ee0e7ebb91ac4ea8655f5d9642dc8)
+
+commit 58b30d5426998bf7eab4a773f1a04e5bcfbf9b93
+Merge: bc51476 3a58e30
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Wed May 6 16:01:57 2015 +0800
+
+    Merge pull request #4481 from ceph/hammer-11482
+    
+    mds: remove caps from revoking list when caps are voluntarily released
+
+commit bc51476181429d7d95d2bba5f774d8b60c47fb1f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Apr 13 16:33:17 2015 -0700
+
+    ceph_json: add decode / encoder for multimap
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 55594623e2a478c3c023336b924bfdef0017d97f)
+
+commit 7c7e651a0ae8bbcebe136da74b7dbe3a3e9edcc8
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Mar 30 17:34:57 2015 -0700
+
+    cls_rgw: use multimap to keep pending operations in bucket index
+    
+    Fixes: #11256
+    Multiple concurrent requests might be sent using the same tag, need the
+    entry map to be able to hold multiple entries.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 4e6a66b55e73c01347fc3330faa5c1307d29e9d3)
+
+commit cb7571375377295d0aff791a03b22da6eb26109d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Mar 27 16:32:48 2015 -0700
+
+    rgw: generate new tag for object when setting object attrs
+    
+    Fixes: #11256
+    Backport: firefly, hammer
+    
+    Beforehand we were reusing the object's tag, which is problematic as
+    this tag is used for bucket index updates, and we might be clobbering a
+    racing update (like object removal).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit edc0627a1dbeb66ea2f5f177f6ceca64559ff3d8)
+
+commit 7387c43382e7f114c43db3cc26ca77d081749d8e
+Author: Noah Watkins <noahwatkins at gmail.com>
+Date:   Fri Mar 27 19:34:12 2015 -0700
+
+    java: libcephfs_jni.so is in /usr/lib64 on rhel
+    
+    Signed-off-by: Noah Watkins <noahwatkins at gmail.com>
+    (cherry picked from commit aed3434dc7c5161c72c7d5655faa3bc693fc9777)
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 5cc0f20ba00080881aff460fab2110cb7eaba279
+Merge: f7bcb2d 0e6a032
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 23:58:37 2015 +0200
+
+    Merge pull request #4498 from dachary/wip-11342-hammer
+    
+    librbd notification race condition on snap_create
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit f7bcb2dc6043501d478c9d7664bf39f34d5ad6d8
+Merge: 4d95929 2864da8
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 23:58:18 2015 +0200
+
+    Merge pull request #4497 from dachary/wip-7385-hammer
+    
+    Objectcacher setting max object counts too low
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 4d95929c3129028de2d48efdef71fba2b949edd9
+Merge: 16c2f4c c615972
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 23:57:48 2015 +0200
+
+    Merge pull request #4499 from dachary/wip-11363-hammer
+    
+    ImageWatcher should cancel in-flight ops on watch error
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 16c2f4c9e0428bda5d784c6c82929f748ec6cb4a
+Merge: addb0ec 0cdc93f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 23:57:17 2015 +0200
+
+    Merge pull request #4496 from dachary/wip-5488-hammer
+    
+    librbd: deadlock in image refresh
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit addb0ec950e3a3b1150f927f028d2260c1cd0615
+Merge: c0782ed 379ef71
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 16:31:24 2015 +0200
+
+    Merge pull request #4505 from dachary/wip-11322-hammer
+    
+    rgw - improve performance for large object (multiple chunks) GET
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit c0782ed9ab1e59f39d3a30496214971d4cc509d9
+Merge: e074695 2f34d2e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 16:24:53 2015 +0200
+
+    Merge pull request #4501 from dachary/wip-11001-hammer
+    
+    Improve rgw HEAD request by avoiding read the body of the first chunk
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit e074695e003f891e9c52e19a1679809155364d32
+Merge: 7f9d78d c6edc16
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 16:23:28 2015 +0200
+
+    Merge pull request #4500 from dachary/wip-11047-hammer
+    
+    rgw : make quota/gc thread configurable for starting
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 7f9d78d4f12ff3feaee519dd319426650ca0ff88
+Merge: 11b1ccd 4789686
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 11:46:13 2015 +0200
+
+    Merge pull request #4504 from dachary/wip-10691-hammer
+    
+    ceph-dencoder links to libtcmalloc, and shouldn't
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 11b1ccdb6502406456905d05624f0600ef9df893
+Merge: 7c050ec 8709e34
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 11:44:11 2015 +0200
+
+    Merge pull request #4503 from dachary/wip-10983-hammer
+    
+    use a new disk as journal disk,ceph-disk prepare fail
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 7c050ecab2ccc29b03bab2c4ad67c22e9736bb9c
+Merge: c5e0b61 da7f683
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon May 4 11:43:23 2015 +0200
+
+    Merge pull request #4507 from dachary/wip-11432-hammer
+    
+    compilation error: No high-precision counter available (armhf, powerpc..)
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit c5e0b615d7c98ef700ebe8048ed038f1ff036ff4
+Merge: ee61a61 856b2fa
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Apr 30 17:10:29 2015 -0700
+
+    Merge pull request #4515 from ceph/hammer-next
+    
+    rgw: critical fixes for hammer
+
+commit ee61a61face479d9895a5cd08ebc8aa93c8bb6ce
+Merge: abc0741 0ee022b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Apr 30 09:23:53 2015 -0700
+
+    Merge pull request #4462 from liewegas/wip-11211-hammer
+    
+    osd/ReplicatedPG: don't check order in finish_proxy_read
+
+commit 856b2fa1fc72916349e484bf3615860392b74100
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Apr 22 15:39:05 2015 -0700
+
+    rgw-admin: a tool to fix object locator issue
+    
+    Objects that start with underscore need to have an object locator,
+    this is due to an old behavior that we need to retain. Some objects
+    might have been created without the locator. This tool creates a new
+    rados object with the appropriate locator.
+    
+    Syntax:
+    
+    $ ./radosgw-admin bucket check --check-head-obj-locator \
+                                   --bucket=<bucket> [--fix]
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit be4355ad8ed622734172fdce77ca71fb2635b36c)
+
+commit 512ae4cb3e182ce79aca7354c66d2f2a662555da
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Apr 21 17:31:41 2015 -0700
+
+    rgw: set a special object locator if object starts with underscore
+    
+    Fixes: #11442
+    Backport: hammer
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 3d4a1d20b86a5a00556df3d6a8dba096509274b7)
+
+commit da4d2274b5d83a116e767f3063752624d1719c32
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Apr 23 15:33:03 2015 -0700
+
+    rgw: use correct oid when creating gc chains
+    
+    Fixes: #11447
+    Backport: hammer
+    
+    When creating gc chain, use the appropriate oid, otherwise objects will
+    leak.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit cc5d34678c6d4bdcd552e6334a383c4df9797f46)
+
+commit 4e84f318de97e592e16493c67491ba0d7f8103a8
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Apr 23 17:36:47 2015 +0200
+
+    rgw: civetweb should use unique request id
+    
+    max_req_id was moved to RGWRados and changed to atomic64_t.
+    
+    The same request id resulted in gc giving the same idtag to all objects
+    resulting in a leakage of rados objects. It only kept the last deleted object in
+    it's queue, the previous objects were never freed.
+    
+    Fixes: 10295
+    Backport: Hammer, Firefly
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit c26225980c2fd018e70033a453d635533fcdefec)
+
+commit abc0741d57f30a39a18106bf03576e980ad89177
+Merge: 74c2dc1 3001fad
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Wed Apr 29 15:02:56 2015 -0700
+
+    Merge pull request #4506 from dachary/wip-11381-hammer
+    
+    messenger: double clear of pipe in reaper
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 478968670caecd67f7995a09b60f6208729e3de3
+Author: Boris Ranto <branto at redhat.com>
+Date:   Mon Apr 13 12:38:58 2015 +0200
+
+    Move ceph-dencoder build to client
+    
+    The patch simply moves the ceph-dencoder build from server part of the
+    Makefiles to client part of the Makefiles.
+    
+    Refs: #10691
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit ef2164725f0b55ffa4b609d407eed5f3f3048b46)
+
+commit 7eabb70b906e50901551ab96453f05fe662a8876
+Author: Boris Ranto <branto at redhat.com>
+Date:   Mon Apr 13 15:07:03 2015 +0200
+
+    Rework mds/Makefile.am to support a dencoder client build
+    
+    The patch adds all the mds sources to DENCODER_SOURCES to allow a
+    dencoder client build. The patch also splits the Makefile.am file to
+    better accomodate the change.
+    
+    Refs: #10691
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit c2b3a35fb3cbf28d46a5427f32fbaff142c85f2a)
+    
+    Conflicts:
+            src/mds/Makefile-server.am
+    	src/mds/Makefile.am
+            because the mds/StrayManager.h file was added after hammer
+
+commit da7f6835b15370ce0120a64f7ac3359f3ba4729b
+Author: James Page <james.page at ubuntu.com>
+Date:   Fri Mar 13 19:46:04 2015 +0000
+
+    Add support for PPC architecture, provide fallback
+    
+    Add high precision cpu cycles support for powerpc and powerpc64.
+    
+    Provide a fallback for other architectures and warn during
+    compilation.
+    
+    Signed-off-by: James Page <james.page at ubuntu.com>
+    (cherry picked from commit b2781fb5638afae7438b983a912ede126a8c5b85)
+
+commit 3001fad4b6d7e692f6070ef166ed4a3e4849760f
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Fri Apr 17 22:07:00 2015 +0800
+
+    Fix clear_pipe after reaping progress
+    
+    In pipe.cc:1353 we stop this connection and we will let reader and write threads stop. If now reader and writer quit ASAP and we call queue_reap to trigger the reap progress. Now we haven't call "connection_state->clear_pipe(this)" in pipe.cc:1379, so we may assert failure  here.
+    
+    Fixes: #11381
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 0ea0e011a6a6c6d6b40f5d97328bbad0e4568dd7)
+
+commit 379ef714f7149a748891dafd41db80c247d35975
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Fri Apr 3 12:27:04 2015 +0000
+
+    rgw : Issue AIO for next chunk first before flush the (cached) data.
+    
+    When handling GET request for large object (with multiple chunks), currently it will first flush the
+    cached data, and then issue AIO request for next chunk, this has the potential issue to make the retriving
+    from OSD and sending to client serialized. This patch switch the two operations.
+    
+    Fixes: 11322
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit 366e8a85c0e9f00eed364eaebbfb6b672852eae9)
+
+commit b903ad28a68772fa0b7a88b4db2724f4d07565d5
+Author: Boris Ranto <branto at redhat.com>
+Date:   Mon Apr 13 12:33:00 2015 +0200
+
+    rgw/Makefile.am: Populate DENCODER_SOURCES properly
+    
+    Dencoder is built if ENABLE_CLIENT is set. However, the rgw/Makefile.am
+    populated DENCODER_SOURCES only if WITH_RADOSGW was set. The patch fixes
+    this and populates DENCODER_SOURES if ENABLE_CLIENT is set.
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit 0b264331f57b64880ce05fe3bd752e8df226d00c)
+
+commit f994483c0e3a60226c8fb6983380ef8400b0160e
+Author: Boris Ranto <branto at redhat.com>
+Date:   Mon Apr 13 12:32:30 2015 +0200
+
+    Dencoder should never be built with tcmalloc
+    
+    The patch adds disabled perfglue stubs to DENCODER sources in order to
+    avoid tcmalloc-enabled ceph-dencoder builds.
+    
+    Refs: #10691
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit fb11c74d1dc3843f2f5b6dca9c76278c5ceeca1c)
+
+commit 8709e34f931809f7129cdac1203ec4e774e3eb4c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Mar 8 15:15:35 2015 +0100
+
+    ceph-disk: more robust parted output parser
+    
+    In some cases, depending on the implementation or the operating system,
+    
+       parted --machine -- /dev/sdh print
+    
+    may contain empty lines. The current parsing code is fragile and highly
+    depends on output details. Replace it with code that basically does the
+    same sanity checks (output not empty, existence of units, existence of
+    the dev entry) but handles the entire output instead of checking line by
+    line.
+    
+    http://tracker.ceph.com/issues/10983 Fixes: #10983
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit f5acf6bb6a342b05897605703d7d9cb7c09714fd)
+
+commit 8d9f4d4eb546e26eeb3911811bdeb166d06cb1d1
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Fri Mar 6 11:26:31 2015 +0800
+
+    osdc: add epoch_t last_force_resend in Op/LingerOp.
+    
+    Using this field record the pg_poo_t::last_force_op_resend to avoid op
+    endless when osd reply with redirect.
+    
+    Fixes: #11026
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit def4fc4ae51174ae92ac1fb606427f4f6f00743e)
+
+commit 2f34d2e73bb4bded4779af15a337c75eb2d1497f
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Tue Mar 3 09:46:52 2015 +0000
+
+    rgw: do not pre-fetch data for HEAD requests
+    
+    Backport: hammer
+    
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit e32da3e7c880eaf7cb84d1c078447b28e1d8052b)
+
+commit c6edc16fee027f6cdefacba08f1edc436a7406c5
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Wed Feb 4 03:21:52 2015 +0000
+
+    rgw - make starting quota/gc threads configurable
+    
+    Fixes: 11047
+    Backport: hammer
+    
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit a88712aeb4e7cd4208b9a707aa3bd4d03340c3ff)
+
+commit c6159724f065731c41b2d29a48d0f0a3dc82340b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Mar 20 11:56:55 2015 -0400
+
+    librbd: ImageWatcher should cancel in-flight ops on watch error
+    
+    Upon an watch error notification from librados, pending requests
+    should be canceled and in-flight IO should be flushed prior to
+    unlocking the image.
+    
+    Fixes: #11363
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit fc2e511b2aed4d40eff5101a4c9e513b34e5e58e)
+
+commit 0e6a032c9e6ddae20be82df7500a0758d2cd8e74
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Apr 7 15:39:13 2015 -0400
+
+    librbd: moved snap_create header update notification to initiator
+    
+    When handling a proxied snap_create operation, the client which
+    invoked the snap_create should send the header update notification
+    to avoid a possible race condition where snap_create completes but
+    the client doesn't see the new snapshot (since it didn't yet receive
+    the notification).
+    
+    Fixes: #11342
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6e20ed6834912ccd979d16e3f3b340c239e05288)
+
+commit 2864da86ca689472341e8a80f7ad6fcc5eb8321a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 22 11:27:35 2015 -0400
+
+    librbd: updated cache max objects calculation
+    
+    The previous calculation was based upon the image's object size.
+    Since the cache stores smaller bufferheads, the object size is not
+    a good indicator of cache usage and was resulting in objects being
+    evicted from the cache too often.  Instead, base the max number of
+    objects on the memory load required to store the extra metadata
+    for the objects.
+    
+    Fixes: #7385
+    Backport: firefly, hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0b378942c4f1b79cb65967f2d3466728ca1c8d5b)
+    
+    Conflicts:
+    	src/librbd/ImageCtx.cc
+            because hammer has cct->_conf->rbd_cache_size
+            instead of cache_size
+
+commit 0cdc93fbdcf68a31e6aada38b0cb9d66efdc512d
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Mar 16 11:04:22 2015 -0400
+
+    librbd: acquire cache_lock before refreshing parent
+    
+    cache_lock needs to be acquired before snap_lock to avoid
+    the potential for deadlock.
+    
+    Fixes: #5488
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 703ba377e3de4007920f2ed7d8a0780f68676fe2)
+    
+    Conflicts:
+    	src/librbd/internal.cc
+            resolved by moving int r; in the scope of the block
+
+commit a1b4aeb8e8c3a8d5c8284dcee8e03f501a77928c
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Mar 13 18:08:47 2015 -0400
+
+    librados_test_stub: AIO operation callbacks should be via Finisher
+    
+    librados will execute all AIO callbacks via a single finisher to
+    prevent blocking the Objecter.  Reproduce this behavior to avoid
+    deadlocks that only exist when using the test stub.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b38c96f2c1747a6d864e7aaa2e9858139ce9d1fd)
+
+commit 3a58e30dc6563197f0effeabbd2fbf804403ad34
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue Apr 28 15:45:32 2015 +0800
+
+    mds: remove caps from revoking list when caps are voluntarily released
+    
+    Fixes: #11482
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 86788c4ea4155f0388b7ebaf475a3d3c37d39331)
+
+commit 74c2dc1f3924fa05e2c40f4cceb2ab060493bdfb
+Merge: 8a58d83 f30fa4a
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Apr 24 16:13:56 2015 -0700
+
+    Merge pull request #4463 from ceph/wip-11453-hammer-rgw-init-as-root
+    
+    rgw: init-radosgw: run RGW as root
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit f30fa4a364602fb9412babf7319140eca4c64995
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Wed Apr 22 16:36:42 2015 -0600
+
+    init-radosgw: run RGW as root
+    
+    The ceph-radosgw service fails to start if the httpd package is not
+    installed. This is because the init.d file attempts to start the RGW
+    process with the "apache" UID. If a user is running civetweb, there is
+    no reason for the httpd or apache2 package to be present on the system.
+    
+    Switch the init scripts to use "root" as is done on Ubuntu.
+    
+    http://tracker.ceph.com/issues/11453 Refs: #11453
+    
+    Reported-by: Vickey Singh <vickey.singh22693 at gmail.com>
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 47339c5ac352d305e68a58f3d744c3ce0fd3a2ac)
+
+commit 0ee022b1ae832c70a80e9d2cdf32403039f3f125 (refs/remotes/me/wip-11211-hammer)
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Tue Mar 24 16:00:16 2015 +0800
+
+    osd/ReplicatedPG: don't check order in finish_proxy_read
+    
+    Read doesn't need to be ordered. So when proxy read comes back from base
+    tier, it's not necessarily at the front of the in progress list.
+    
+    Fixes: #11211
+    
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+    (cherry picked from commit 560a5839c0d1852b5816937b845b60390777636c)
+
+commit 8a58d83b0d039d2c2be353fee9c57c4e6181b662
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Sun Mar 22 23:59:19 2015 +0800
+
+    Fix ceph_test_async_driver failed
+    
+    This test will create 10000 sockets which will failed because of limited system fd. Actually we only need to create several hundreds sockets and it's enough to get the test's goal.
+    
+    Fix bug #11198(cherry picked from commit cd11daa2d21b7b059df9877cad38432678bb6161)
+
+commit 85a68f9a8237f7e74f44a1d1fbbd6cb4ac50f8e8
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Fri Apr 3 13:43:31 2015 +0200
+
+    rgw: remove meta file after deleting bucket
+    The meta file is deleted only if the bucket meta data is not synced
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    
+    Fixes: #11149
+    Backport: hammer, firefly
+    (cherry picked from commit dfdc7afb59cc8e32cf8bff55faa09076c853de06)
+
+commit b01e68fae2f8235b7a813188b664d3ec7bd1fa09
+Merge: addc7e2 bd0ec49
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Apr 14 20:58:40 2015 +0200
+
+    Merge pull request #4332 from dachary/wip-11217-hammer
+    
+    tests: TestFlatIndex.cc races with TestLFNIndex.cc
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit addc7e2c6a4973cbcb5f02635be01a446cb223f0
+Merge: e4bfad3 51f5763
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Apr 14 09:05:53 2015 -0700
+
+    Merge pull request #4357 from dachary/wip-release-notes-hammer
+    
+    release-notes: backport Hammer release notes
+
+commit 51f57632f6d463e5f702bdb4e12c1914ec76d2b5
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Apr 14 11:30:43 2015 +0200
+
+    release-notes: backport Hammer release notes
+    
+    Include the Hammer release notes in Hammer.
+    
+    Cherry picking the Hammer release notes cannot be done cleanly, they are
+    copy/pasted instead. This will allow cherry-picking the release notes
+    for the next point releases. It should be undisturbed by the release
+    notes for other point releases because they modify parts of the file
+    that will not generate cherry-pick conflicts.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+
+commit bd0ec494739308dc33e6b042ae3e1aafd53c634c
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Tue Mar 24 18:42:04 2015 +0800
+
+    bug fix: test case for lfn index
+    
+    tests: TestFlatIndex.cc races with TestLFNIndex.cc
+    Both use the same PATH and when run in parallel they sometime conflict.
+    
+    Fixes: #11217
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 791c3879d62b848616972f9c6d921aac30ac4925)
diff --git a/doc/changelog/v0.94.3.txt b/doc/changelog/v0.94.3.txt
new file mode 100644
index 0000000..6078325
--- /dev/null
+++ b/doc/changelog/v0.94.3.txt
@@ -0,0 +1,2660 @@
+commit 95cefea9fd9ab740263bf8bb4796fd864d9afe2b (tag: refs/tags/v0.94.3, refs/remotes/gh/hammer)
+Author: Jenkins <jenkins at inktank.com>
+Date:   Wed Aug 26 10:39:37 2015 -0700
+
+    0.94.3
+
+commit 697101e4dfd9822050ce401b5f6212bfd81fea89
+Merge: 88e7ee7 81a311a
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Tue Aug 18 12:43:57 2015 +0100
+
+    Merge pull request #5589 from ceph/hammer-12709
+    
+    Workunits : fs/misc/chmod.sh : Include ACL characters in permission check
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 81a311a744987564b70852fdacfd915523c73b5d
+Author: Yazen Ghannam <yazen.ghannam at linaro.org>
+Date:   Mon May 4 12:33:16 2015 -0400
+
+    Workunits : fs/misc/chmod.sh : Include ACL characters in permission check.
+    
+    Signed-off-by: Yazen Ghannam <yazen.ghannam at linaro.org>
+    (cherry picked from commit d3dbfffefb0ae53583350f53258dc902670da659)
+
+commit 88e7ee716fdd7bcf81845087021a677de5a50da8
+Merge: bb12f92 1a32379
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Aug 4 13:02:17 2015 +0200
+
+    Merge pull request #5160 from theanalyst/wip-11910-hammer
+    
+    mon: pg ls is broken
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit bb12f925cf0d78f97eefc2e271e73596050b9919
+Merge: e801d4c e19f928
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Aug 4 12:34:18 2015 +0200
+
+    Merge pull request #5384 from dachary/wip-12502-hammer
+    
+    rgw: need conversion tool to handle fixes following #11974
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit e801d4c943b8004ef613345505df91057913cd39
+Merge: 78a4024 154f18c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Aug 4 11:22:08 2015 +0200
+
+    Merge pull request #5405 from ceph/wip-12465-hammer
+    
+    Log::reopen_log_file: take m_flush_mutex
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 78a4024c14253503b770070aa36a090c6b8f1eaf
+Merge: a451e88 7034720
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 31 15:18:52 2015 -0400
+
+    Merge pull request #5121 from theanalyst/wip-11983-hammer
+    
+    FAILED assert(!old_value.deleted()) in upgrade:giant-x-hammer-distro-basic-multi run
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a451e882ab9a929d240747b4b09786ca4b4ce377
+Merge: 218f537 1063f52
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jul 31 15:17:00 2015 -0400
+
+    Merge pull request #5269 from dachary/wip-12362-hammer
+    
+    stuck incomplete
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 218f537491a46a0251bef7690a7f5a86b988ee63
+Merge: 07fa83a 8abc46a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:55:48 2015 +0200
+
+    Merge pull request #5117 from theanalyst/wip-12099-hammer
+    
+    rgw: rados objects wronly deleted
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 07fa83aefc9bd4ea1495fa1e117a438b2c460e46
+Merge: a69d431 56c2688
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:55:29 2015 +0200
+
+    Merge pull request #5118 from theanalyst/wip-12042-hammer
+    
+    DragonDisk fails to create directories via S3: MissingContentLength
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit a69d431ea52b5de7fc5cfe142ff3b69ff64e8048
+Merge: 5353480 c78cc00
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:55:14 2015 +0200
+
+    Merge pull request #5214 from SUSE/wip-12299-hammer
+    
+    RGW Swift API: support for 202 Accepted response code on container creation
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 5353480f1df297ad9dd1bd3154887ed2564f0280
+Merge: fb9156f a5dbcbb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:54:57 2015 +0200
+
+    Merge pull request #5226 from SUSE/wip-12322-hammer
+    
+    rgw: keystone does not support chunked input
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit fb9156f412f83c0ce1fe4c5c9ccd57fd79f0c992
+Merge: 7193c16 b1618a9
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:54:41 2015 +0200
+
+    Merge pull request #5227 from SUSE/wip-12323-hammer
+    
+    RGW Swift API: XML document generated in response for GET on account does not contain account name
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 7193c16b65fdc1694b968899d23eae0638d89f11
+Merge: ac86490 e39dce7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:54:26 2015 +0200
+
+    Merge pull request #5228 from theanalyst/wip-11872-hammer
+    
+    RGW does not send Date HTTP header when civetweb frontend is used
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit ac86490821336ce024940d48d82f7a5ff7a302b1
+Merge: 33dbfc6 557865c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:54:02 2015 +0200
+
+    Merge pull request #5229 from theanalyst/wip-12242-hammer
+    
+    Fix tool for #11442 does not correctly fix objects created via multipart uploads
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 33dbfc6919840882c6cbc10dad2fc24cf0720bf9
+Merge: 99ca62f e50caab
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:53:41 2015 +0200
+
+    Merge pull request #5237 from theanalyst/wip-12245-hammer
+    
+    rgw: empty json response when getting user quota
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 99ca62f2bf1e21a41cb7b6ecdb8a8731a18de195
+Merge: 1f5f319 2357b6c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:53:18 2015 +0200
+
+    Merge pull request #5284 from SUSE/wip-12398-hammer
+    
+    rgw: Properly respond to the Connection header with Civetweb
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 1f5f31905bb5f499a2db4a02993dbc6efa1c4251
+Merge: 5cbb6cf 9458b84
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:53:04 2015 +0200
+
+    Merge pull request #5285 from SUSE/wip-12399-hammer
+    
+    rgw: multipart list part response returns incorrect field
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 5cbb6cfb69aad0db470f99e39e33f4b4b1abfb95
+Merge: 1df93e1 e4b55b3
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 31 20:52:43 2015 +0200
+
+    Merge pull request #5286 from SUSE/wip-12400-hammer
+    
+    rgw: radosgw-admin dumps user info twice
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 1df93e19a0275ed218c8f83bc674f16d1856f241
+Merge: a48cbc0 2ecb3b7
+Author: Yan, Zheng <ukernel at gmail.com>
+Date:   Fri Jul 31 09:50:22 2015 +0800
+
+    Merge pull request #5427 from dachary/wip-12088-hammer-part-2
+    
+    Fh ref count will leak if readahead does not need to do read from osd
+
+commit 2ecb3b7f4a49c574bc178a106c6bf0d8247f2a5e
+Author: Zhi Zhang <zhangz.david at outlook.com>
+Date:   Wed Jul 22 10:54:53 2015 +0800
+
+    Fh ref count will leak if readahead does not need to do read from osd
+    
+    The 3c8cdeacf46ae4031189d2ef6948aa3b6ab4ae43 backport introduced a leak.
+    
+    http://tracker.ceph.com/issues/12319 Fixes: #12319
+    
+    Signed-off-by: Zhi Zhang <zhangz.david at outlook.com>
+
+commit a48cbc0a847f19ea613b76a479acc831e9316c62
+Merge: 06c27cd 5ef0846
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jul 30 21:43:48 2015 +0200
+
+    Merge pull request #5120 from theanalyst/wip-11999-hammer
+    
+    cephfs Dumper tries to load whole journal into memory at once
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 06c27cdd420598c497766ee5879335942a0acc09
+Merge: 19abe5e 408880b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jul 30 21:43:21 2015 +0200
+
+    Merge pull request #5119 from theanalyst/wip-12098-hammer
+    
+    kernel_untar_build fails on EL7
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 19abe5ee35c099c67b56ac268710fcd20bec60d3
+Merge: e3d17e4 4c199bf
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jul 30 17:00:14 2015 +0200
+
+    Merge pull request #5417 from dachary/wip-11998-hammer
+    
+    debian/control: ceph-common (>> 0.94.2) must be >= 0.94.2-2
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 4c199bf57dc54dc5e5f45cd9b34878a8459d434e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Jul 30 09:43:20 2015 +0200
+
+    debian/control: ceph-common (>> 0.94.2) must be >= 0.94.2-2
+    
+    The d8733be2ef8874b9a858a7ffddfb81b9b656e9a6 backport introduced a
+    regression by adding an incorrect Depends / Break combo supposed to
+    reflect the fact that ceph_argparse moved from ceph to ceph-common after
+    v0.94.2. It assumed the package is released under the 0.94.2 version
+    where in reality it is released under the 0.94.2-1xxx version (where xxx
+    is trusty, jessie etc.).
+    
+    The Depends / Break combo is changed to use 0.94.2-2 instead.
+    
+    See also http://tracker.ceph.com/issues/12529 for a larger discussion.
+    
+    http://tracker.ceph.com/issues/11998 Fixes: #11998
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+
+commit e3d17e49731569ea92917f574d42d93258c77189
+Merge: cbba706 89aa8ff
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 29 16:22:36 2015 +0200
+
+    Merge pull request #5248 from ceph/wip-11833-hammer
+    
+    mon: add an "osd crush tree" command
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit cbba7064c6cc4cde3e8a49c25ce671e91d31b9c7
+Merge: 8355bda 3c8cdea
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 29 10:49:08 2015 +0200
+
+    Merge pull request #5222 from ceph/hammer-12088
+    
+    client: reference counting 'struct Fh'
+    
+    Reviewed-by: John Spray <john.spray at redhat.com>
+
+commit 8355bdab56bc4e5ce4d20ba3486c082f06d8dcd1
+Merge: 52d0e5d ec70533
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Tue Jul 28 23:33:18 2015 +0200
+
+    Merge pull request #5231 from theanalyst/wip-12243-hammer
+    
+    Civetweb RGW appears to report full size of object as downloaded when only partially downloaded
+
+commit 52d0e5da5ebad7fe42c2e469cea9773c7714c2b5
+Merge: 7fd31b1 03c07d7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 22:40:23 2015 +0200
+
+    Merge pull request #5243 from theanalyst/wip-12239-hammer
+    
+    librbd/internal.cc: 1967: FAILED assert(watchers.size() == 1)
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 7fd31b1b3c2c8e9dd3d9e5464775422215f7a4bc
+Merge: 7230de3 5c812c1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 22:40:03 2015 +0200
+
+    Merge pull request #5241 from theanalyst/wip-12238-hammer
+    
+    [  FAILED  ] TestLibRBD.ExclusiveLockTransition
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 7230de317736a71a5764cf224bd1309da1c7b3c6
+Merge: 6b6228f 7132277
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 22:30:23 2015 +0200
+
+    Merge pull request #5265 from SUSE/wip-12368-hammer
+    
+    linking ceph to tcmalloc causes segfault on SUSE SLE11-SP3
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 6b6228f8949e975cac763513898ea9704cb8baf1
+Merge: d62c3ea f99f312
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 22:27:40 2015 +0200
+
+    Merge pull request #5280 from ceph/wip-12384-hammer
+    
+    librbd: add valgrind memory checks for unit tests
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d62c3ea344d9e49e9586867e872e8d5b3f019948
+Merge: 7b57ff8 b872882
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 22:26:25 2015 +0200
+
+    Merge pull request #5279 from ceph/wip-12237-hammer
+    
+    A client opening an image mid-resize can result in the object map being invalidated
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 7b57ff8a9ced6c2f22456ed034cc83d07f82fbb3
+Merge: 481728a f819332
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 22:10:03 2015 +0200
+
+    Merge pull request #5283 from SUSE/wip-12397-hammer
+    
+    ceph.spec.in: 95-ceph-osd.rules, mount.ceph, and mount.fuse.ceph not installed properly on SUSE
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 481728a04dd2c85096c3bc01cc37da9642b038ca
+Merge: 54bb924 d8733be
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:54:33 2015 +0200
+
+    Merge pull request #5206 from SUSE/wip-11998-hammer
+    
+    /usr/bin/ceph from ceph-common is broken without installing ceph
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 54bb924e68ae2b4df65576a5d788d593b9d9e722
+Merge: e099058 c5c627f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:47:29 2015 +0200
+
+    Merge pull request #5055 from SUSE/wip-12044-hammer
+    
+    rgw/logrotate.conf calls service with wrong init script name
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit e0990583298277f1c631f7c2d2260d6c3fa64c9f
+Merge: 8b93978 e149916
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:46:11 2015 +0200
+
+    Merge pull request #5040 from SUSE/wip-11964-hammer
+    
+    systemd: Increase max files open limit for OSD daemon
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 8b93978881375d063fe2df8f40406ea650dda766
+Merge: 5a7cab2 22f58ce
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:45:44 2015 +0200
+
+    Merge pull request #5038 from SUSE/wip-11876-hammer
+    
+    ceph-post-file fails on rhel7
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 5a7cab205bb1b3fdbf49a852cb978fc28eba8212
+Merge: 5218eff 38d36b1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:45:25 2015 +0200
+
+    Merge pull request #5030 from SUSE/wip-12092-hammer
+    
+    packaging: add SuSEfirewall2 service files
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 5218eff07c303fb2762ea9f38b9a9c23c24efcae
+Merge: 0b54d50 8acfb99
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:38:14 2015 +0200
+
+    Merge pull request #5028 from SUSE/wip-12090-hammer
+    
+    rcceph script is buggy
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 0b54d50ecd1445dfc1a46552adb83b9dae9210d9
+Merge: 45beb86 37d77d3
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 28 21:37:44 2015 +0200
+
+    Merge pull request #5026 from SUSE/wip-12087-hammer
+    
+    max files open limit for OSD daemon is too low
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit e19f928bd770a37f2f631c4cd796e2e30a494234
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jun 26 16:56:28 2015 -0700
+
+    rgw: conversion tool to fix broken multipart objects
+    
+    Fixes: #12079
+    
+    Broken multipart objects: multipart objects that created on 0.94.2
+    and that start with underscore have a bad locator on their tail objects.
+    This extends the tool that was needed for older issue we've had with
+    hammer multipart objects (that start with underscore). The same usage
+    applies:
+    
+    $ radosgw-admin bucket check --check-head-obj-locator \
+                                 --bucket=<bucket> [--fix]
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit f02ca6107172cecd80a490df9f0d66204e62326c)
+
+commit 28d32f6090724d62b6168d64031454f44eb4cc88
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jun 26 13:49:55 2015 -0700
+
+    rgw: only scan for objects not in namespace
+    
+    Fixes: #11984
+    The tool should only work on the head objects, and these are not inside
+    any namespace.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 8103908548bf7d6c9fa47fb181cd450670bae8d6)
+
+commit e22e2b43b4039a44f5f8fbbe59edc21fbe118bdc
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Apr 22 16:04:35 2015 -0700
+
+    rgw_admin: add --remove-bad flag to bucket check
+    
+    Add this flag so that the bad object will be removed (should be called
+    only after user has verified that objects content is correct).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 06d67d9139a95b704b80de527381fd1bbf7981ce)
+
+commit 154f18ce3e52094fe84b058565a865ed97b079d6 (refs/remotes/gh/wip-12465-hammer)
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Jul 24 15:38:18 2015 -0700
+
+    Log::reopen_log_file: take m_flush_mutex
+    
+    Otherwise, _flush() might continue to write to m_fd after it's closed.
+    This might cause log data to go to a data object if the filestore then
+    reuses the fd during that time.
+    
+    Fixes: #12465
+    Backport: firefly, hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 8778ab3a1ced7fab07662248af0c773df759653d)
+
+commit b8728823493b9dfde0333fb41725002fc50e4d9b (refs/remotes/gh/wip-12237-hammer)
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Sun Jul 5 10:47:38 2015 -0400
+
+    librados_test_stub: read op should return number of bytes read
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f8a7b507983e31399831e802e99429b95386ed41)
+
+commit 7d9fce3aa3832a1b8bd7f18abd4745dbc0033582
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Sun Jul 5 10:35:28 2015 -0400
+
+    tests: fixed TestObjectMap.InvalidateFlagInMemoryOnly
+    
+    librados and librados_test_stub return different result codes
+    for a read full object operation.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 2ace2b77f8ed83e753fe4a48bcc997f5d1dd465f)
+
+commit 4a77be0a65c8b4ec3dc437721f8c321737b260de
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Sun Jul 5 11:09:09 2015 -0400
+
+    librbd: don't attempt to invalidate an object map in R/O mode
+    
+    The ImageWatcher is not initialized when in R/O mode, which
+    resulted in a NULL pointer dereference.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 64d740f8fa10ba872e324ec2580a4d8c3f99a9ce)
+
+commit 0aea70f68b299441e692efdce6d5e7ff18b78c39
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 23 11:17:12 2015 -0400
+
+    tests: add new unit tests for object map invalidation
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0215e9753c09460f6fc84ded9397e36a209f2e32)
+
+commit c732cb889b4a61254d06703bf032082e56b196de
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Mar 25 09:41:13 2015 -0400
+
+    librbd: move object map codes to common location
+    
+    These codes will need to be accessible from cls_rbd and librbd.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4ac584c34d576b489ed4c4862703b8fb427b3bc2)
+
+commit 27c99ea972a7b218ea591b208d0d1dd51eef6f95
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 23 11:14:51 2015 -0400
+
+    librbd: only update image flags when holding exclusive lock
+    
+    It was possible for a client to open an image while another client
+    was shrinking an image.  This would result in the former invalidating
+    the object map on-disk if it openned the image between updating the
+    image header and resizing the object map.
+    
+    Fixes: #11791
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit eb81a6a7e391327ac993fd406443b206a7f7bffc)
+
+commit ef453630200ab72373f08357ca6b5ac5c5bbb397
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Jul 17 12:43:46 2015 -0400
+
+    librbd: new ImageWatcher::is_lock_supported method
+    
+    The new version does not attempt to acquire the snap_lock, to avoid
+    cases where a recursive lock would result.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit e4b55b398e68e870a7cf21276e63da2c4c6e3faa
+Author: guce <guce at h3c.com>
+Date:   Sat Jul 11 14:08:33 2015 +0800
+
+    Fixes: #12286 radosgw-admin: after subuser modify print only once user info.
+    
+    remove rgw_admin.cc OPT_SUBUSER_MODIFY, show_user_info code block.
+    
+    switch (opt_cmd) {
+    ...
+    case OPT_SUBUSER_MODIFY:
+    show_user_info(info, formatter);       //show first time (remove this)
+    break;
+    ...
+    }
+    
+    // output the result of a user operation
+    if (output_user_info) {
+    ...
+    show_user_info(info, formatter);       //show second time
+    }
+    
+    test fix:
+    before: after subuser modify print twice user info.
+    after changes, do the same procedure, print only once user info.
+    
+    Signed-off-by: guce guce at h3c.com
+    (cherry picked from commit c604dd97fc179e5c2f640818c0f6e7cf99701947)
+
+commit 9458b845bf863ccf878873c4f0b089ddf84c7203
+Author: Henry Chang <henry at bigtera.com>
+Date:   Wed Apr 22 18:26:45 2015 +0800
+
+    rgw: fix ListParts response
+    
+    The response XML element name should be 'ListPartsResult'.
+    
+    Fixes: #11494
+    
+    Signed-off-by: Henry Chang <henry at bigtera.com>
+    (cherry picked from commit caa9f0e461f1eed526fc43ee74699a7243aef9b8)
+
+commit 2357b6c808f4f7c5997af48149585a6051c04b8f
+Author: Wido den Hollander <wido at 42on.com>
+Date:   Sat Jul 11 00:01:52 2015 +0200
+
+    rgw: If the client sends a Connection: close header respond accordingly.
+    
+    HTTP/1.1 assumes Keep-Alive by default, but if a Connection: close header is send
+    the server should respond with it as well.
+    
+    This makes the client close the connection after the request.
+    
+    Fixes: #12298
+    (cherry picked from commit 79197d3711edc4b04a7ea4335b6e1b65754996d5)
+
+commit f819332e2826eae14849c5e68a380d1d87039d22
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jul 9 21:38:46 2015 +0200
+
+    ceph.spec.in: install 95-ceph-osd.rules, mount.ceph, and mount.fuse.ceph properly on SUSE
+    
+    http://tracker.ceph.com/issues/12261 Fixes: #12261
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 5ce38b9536efabf99a236c7a9d15c149fa4c16a6)
+
+commit d8733be2ef8874b9a858a7ffddfb81b9b656e9a6
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Tue Apr 14 07:58:17 2015 -0600
+
+    debian: move ceph_argparse into ceph-common
+    
+    Prior to this commit, if a user installed the "ceph-common" Debian
+    package without installing "ceph", then /usr/bin/ceph would crash
+    because it was missing the ceph_argparse library.
+    
+    Ship the ceph_argparse library in "ceph-common" instead of "ceph". (This
+    was the intention of the original commit that moved argparse to "ceph",
+    2a23eac54957e596d99985bb9e187a668251a9ec)
+    
+    http://tracker.ceph.com/issues/11388 Refs: #11388
+    
+    Reported-by: Jens Rosenboom <j.rosenboom at x-ion.de>
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 110608e5bdd9e2f03020ad41f0c2d756684d4417)
+    
+    Conflicts:
+    	debian/ceph.install
+                There is no ceph_daemon.py in hammer
+            debian/control
+                Depends/Replaces/Breaks version adapted (from 9.0.0 to 0.94.2)
+                also adapted ceph-dbg Replaces/Breaks
+
+commit f99f3125ff76628e2525dca00bb7b983f941a08b (refs/remotes/gh/wip-12384-hammer)
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Fri Mar 20 16:15:42 2015 +0800
+
+    test: potential memory leak in FlushAioPP
+    
+    Should call the release function instead of deleting it to free
+    librbd::RBD::AioCompletion and librbd::AioCompletion. Otherwise there is
+    a potential memory leak.
+    
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+    (cherry picked from commit ada7ec860cb7901c560c12a5af36dc7c23051b76)
+
+commit a4fc63af630e77586e3ba2f17df3b6be4a1e2055
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Apr 28 15:25:49 2015 -0400
+
+    pybind: fix valgrind warning on rbd_get_parent_info call
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 2586e3ba1e20603a87c833513e09dae9281beb4d)
+
+commit aa3eb28f6be62991bc790de5c19cb7b6e30fa189
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Apr 28 11:12:00 2015 -0400
+
+    osdc: invalid read of freed memory
+    
+    The bytes not in cache stat was potentially reading the bh length
+    from a deleted bufferhead.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 5ccc4422d6172376bd6f1be8d3a99c0a54eab807)
+
+commit 18ede754388372cf210d7db87fa46f3536cf0e44
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Apr 28 10:56:15 2015 -0400
+
+    krbd: fix incorrect types in the krbd API
+    
+    The C API functions were referencing the C++ CephContext
+    instead of the C rados_config_t.  Additionally, the ceph
+    namespace was missing on the Formatter class.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 740fd275a60630e60b3bcf41637a2ca486885d9c)
+
+commit 488578c1d557ebec7e50d53e45ed46f42984f4f8
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Apr 28 10:54:47 2015 -0400
+
+    fsx: cleanup crypto library at exit
+    
+    Also made small tweaks so that it can be compiled under
+    a C++ compiler.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c44f8e7fbc19924a9453d8c032c624ebb6c0296f)
+
+commit 97ff6cb2f8fdd4d946eeab338ec225450e3ad8f3
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Apr 24 14:29:59 2015 -0400
+
+    tests: add run-rbd-valgrind-unit-tests.sh
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 5534faaa469b8a6a4c9687aad1a6723f3e859353)
+
+commit e690907cbb3b229f84f1e996d58636d00f823e8f
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Apr 24 00:23:03 2015 -0400
+
+    valgrind: update valgrind suppressions for lttng-ust
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 8d87bdf597aad3d6be47aedd216a673bd9093a24)
+
+commit fe013e0a813c5697e917da642143388de60e8528
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Apr 24 00:21:15 2015 -0400
+
+    librbd: TaskFinisher should finish all queued tasks
+    
+    The destructor wasn't waiting for all Finisher tasks
+    to complete before stopping the thread.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 8e20240e4155e2f0398e79f4c0095d2d6ba1d4cb)
+
+commit 43cd3ac923c9accfb81acf41f5bd12b8a05322c7
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 23 23:10:23 2015 -0400
+
+    tests: fix valgrind errors with librbd unit test
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit ed5472a10eb515e2a177a640c3f6ed929db9ee4f)
+
+commit 5d8d6a1a776f833847edc80d2a9b31ecb440ade5
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 23 23:09:45 2015 -0400
+
+    tests: librbd should release global data before exit
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6ab1bb5614a5d257a82cf8ea280eef5c90cf765b)
+
+commit 13f926e4e96d0b7178a9762bbbf589961dba47b7
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 23 23:08:51 2015 -0400
+
+    librados_test_stub: cleanup singleton memory allocation
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 54c88255b74741d882b88f791497862635357634)
+
+commit 45beb86423c3bd74dbafd36c6822e71ad9680e17
+Merge: 5e399b0 582cf73
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 17 19:48:05 2015 +0200
+
+    Merge pull request #5046 from ceph/wip-12109-hammer
+    
+    librbd: new QA client upgrade tests
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1063f5275d1031812d564a1bd8ada64bed561026
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 20 12:08:15 2015 -0700
+
+    PG::find_best_info: ignore info.les for incomplete peer
+    
+    See included update to doc/dev/osd_internals/last_epoch_started.rst
+    
+    Fixes: 11687
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 371d9baa120dc0302e9e61d3bc0e309dfaa773a0)
+
+commit 5e399b035d7cf861cf66a8ead00b388c4857cbb6
+Merge: 706b1c7 ad5745b
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Thu Jul 16 14:58:49 2015 -0700
+
+    Merge pull request #5159 from theanalyst/wip-11701-hammer
+    
+    make the all osd/filestore thread pool suicide timeouts separately configurable
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 713227791ab28c5e09073acb7b2c3c83ca0f0d6a
+Author: Thorsten Behrens <tbehrens at suse.com>
+Date:   Mon Mar 16 00:13:38 2015 +0100
+
+    Conditional-compile against minimal tcmalloc.
+    
+    Certain older systems (SLE11 in this case) do not provide the full
+    tcmalloc functionality, due to e.g. incomplete libunwind
+    pieces. Use --with-tcmalloc-minimal to enable the cut-down
+    version.
+    
+    Here's how the various mem allocator switches interact now:
+    
+    --with-jemalloc: overrides --with-tcmalloc & --with-tcmalloc-minimal
+    --with-tcmalloc-minimal: overrides --with-tcmalloc
+    --with-tcmalloc: the default. use --without-tcmalloc to disable
+    
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit c6f1c07113ca19547fdac10cd9b817a60142aee2)
+
+commit 706b1c7c5bcaaff96aa6950302b7aef097918d30
+Merge: daf5450 5e72479
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jul 16 11:04:52 2015 -0400
+
+    Merge pull request #5252 from ceph/wip-12021-hammer
+    
+    OSDMonitor: allow addition of cache pool with non-empty snaps with co…
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit daf5450765684b0b2ed049320d7463b637321e5a
+Merge: d20f513 bd91fb0
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jul 16 01:15:51 2015 +0200
+
+    Merge pull request #4891 from theanalyst/wip-11740-hammer
+    
+    crush: take crashes due to invalid arg
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit ad5745bfd768b52ae6a766391232becad8587641
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:49:00 2015 -0700
+
+    OSD: add command_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit df4e5de819c30003cfbe50a071c49039cf534419)
+    
+    Conflicts:
+    	src/common/config_opts.h
+    Trivial merge conflict
+
+commit 059a579c02b312bbd32fa41485c361ae3847a3ba
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:54:31 2015 -0700
+
+    OSD: add remove_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit f2fbfa32a16666be46359f0eab7b04ca80a753f5)
+
+commit b8826bc4e3da6fcb9338ad6c01af1a88e6585a4d
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:52:40 2015 -0700
+
+    OSD: add scrub_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 547a7041edc833f3cc8e04d388574809e30a8af6)
+
+commit 878dd403930a2058656a99c14b465358e134843c
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:51:28 2015 -0700
+
+    OSD: add snap_trim_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit e1073a4a577211672148a4112bd633831552d66f)
+
+commit 11575832a37ea247a8febe912b3058f51a464ab6
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 10:50:19 2015 -0700
+
+    OSD: add recovery_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 85311b656852af75bfbbc6699f92fc6aa233c316)
+    
+    Conflicts: src/common/config_opts.h
+    
+    There was a merge conflict due to introduction of `osd_recovery_sleep`
+    which was introduced in #3829
+
+commit a82b4505848c09ad0094768c886f2015bdaa1148
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 6 11:02:19 2015 -0700
+
+    OSD: add op_wq suicide timeout
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+
+commit 89aa8ff9855ae868d59bd10fe3a3aab8517e90fc
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 23:52:22 2015 +0800
+
+    mon: add an "osd crush tree" command
+    
+    * to print crush buckets/items in a tree
+    
+    Fixes: #11833
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 5436c290f3622feb8d4b279ed6552b2510e0cee9)
+    
+    Conflicts:
+    	src/test/mon/osd-crush.sh:
+    		do not start mon as run() takes care of it already
+
+commit d20f513d9b185eff82bee2ca719b5453358e740b
+Merge: 8753b2b 3d74164
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 14 20:43:02 2015 +0200
+
+    Merge pull request #4899 from theanalyst/wip-11911-hammer
+    
+    start_flush: filter out removed snaps before determining snapc's
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 8753b2b14536c34a7b6dec927c7a5b8100de7f68
+Merge: 3d72652 ecac1a4
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 14 20:42:45 2015 +0200
+
+    Merge pull request #4868 from SUSE/wip-11879-hammer
+    
+    Clock skew causes missing summary and confuses Calamari
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 3d72652d7ba6b2fff3d39ea7965c3c61d5fa0a04
+Merge: 9a79e8e fdb43eb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jul 14 16:42:12 2015 +0200
+
+    Merge pull request #4883 from SUSE/wip-11638-hammer
+    
+    ceph.spec.in: ceph-common subpackage def needs tweaking for SUSE/openSUSE
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 03c07d76ac8361ddd302f5bc0575aee7fb5edc99
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Jun 26 09:59:36 2015 -0400
+
+    librbd: assertion failure race condition if watch disconnected
+    
+    It's possible for librbd's watch of the header object to be reset by
+    connection issues just prior to the image being removed.  This will
+    causes an assertion failure which assumes at least one watcher on the
+    image.
+    
+    Fixes: #12176
+    Backport: hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit af276de4f299960e43761904c043924cec5fef11)
+
+commit 5c812c1552d954f2c91c000332ddc74c9e91825a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jun 25 16:51:31 2015 -0400
+
+    librbd: prevent object map updates from being interrupted
+    
+    Object map updates were being canceled in-flight when the exclusive lock
+    is released.  This resulted in an ERESTART error code bubbling up to
+    AioRequest.
+    
+    Fixes: 12165
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 590cdc90edaf4f4ff06c97eb2f43b92ab9b60084)
+    
+    Conflicts:
+    	src/librbd/ObjectMap.h
+    conflict due to a variable `m_snap_id' which was introduced in PR #4140
+    which is dropped as we are not backporting that feature
+
+commit e50caab2251bb68fea1adbd17acc43aa98ab1206
+Author: wuxingyi <wuxingyi at letv.com>
+Date:   Tue Jun 23 01:46:48 2015 +0000
+
+    rgw: fix empty json response when getting user quota
+    
+    Fixes: #12117
+    Signed-off-by: wuxingyi <wuxingyi at letv.com>
+    (cherry picked from commit 64fceed2202c94edf28b8315fe14c9affa8c0116)
+
+commit ec705336551436517c16bffdc6bf5467899ae4bb
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jun 25 14:31:03 2015 -0700
+
+    rgw: error out if frontend did not send all data
+    
+    Fixes: #11851
+    The civetweb mg_write() doesn't return error when it can't flush all data
+    to the user, it just sends the total number of bytes written. Modified the
+    client io to return total number of bytes and return an error if didn't
+    send anything.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit daa679c3dd3770a6d5421e2cc9a36924f4550439)
+
+commit 557865c85bb907fe69248c4f1acb88320a7c1bb5
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jun 17 15:11:28 2015 -0700
+
+    rgw: fix reset_loc()
+    
+    Fixes: #11974
+    
+    Only need to set locator for underscore if namespace is empty
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d3bd27f4855df6bb207b656527138026af1a36a2)
+
+commit b1618a97fef644dc3dced502d600de6a5d55d085
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Mon Apr 20 14:55:00 2015 +0200
+
+    rgw: fix lack of account name in XML listing of Swift account.
+    
+    Fixes: #11431
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 837388bbc39a1bf9019302c3a4d3a3fe22caeeb4)
+
+commit e39dce7935dd513b77ce34bc79d70a2c23437cbb
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Wed Feb 18 15:48:43 2015 +0100
+
+    rgw: generate the "Date" HTTP header for civetweb.
+    
+    Fixes: #10873
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit ea384f83b601f60e135c3d3f960fdb75a919dd84)
+
+commit a5dbcbbdddce6cdeccb1e6f5641601d673cd1896
+Author: Hervé Rousseau <hroussea at cern.ch>
+Date:   Mon Apr 27 17:54:30 2015 +0200
+
+    Swift: Set Content-Length when requesting/checking Keystone tokens
+    
+    Running Keystone with WSGIChunkedRequest=On is not supported.
+    
+    We have to make sure that we set the Content-Length header when getting
+    an admin token and checking revoked tokens, otherwise Keystone returns
+    a HTTP 411 error.
+    
+    Same applies when checking revoked tickets.
+    
+    Fixes: #11473
+    Backport: Hammer, Firefly
+    Signed-off-by: Hervé Rousseau <hroussea at cern.ch>
+    (cherry picked from commit 24f477417fdac9d68902fa211c8edf92a2e8729f)
+
+commit 3c8cdeacf46ae4031189d2ef6948aa3b6ab4ae43
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Wed Jul 8 10:11:43 2015 +0800
+
+    client: reference counting 'struct Fh'
+    
+    The async readahead finisher needs to reference 'struct Fh'. But
+    it's possible user closes FD and free the corresponding 'struct Fh'
+    before async readahead finishes.
+    
+    Fixes: #12088
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 34b939a81d38173b882c429b28dedce778504ba8)
+
+commit c78cc00afb6deb8022db60dbe8649335f61bd345
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Thu Mar 19 14:52:18 2015 +0100
+
+    rgw: rectify 202 Accepted in response for PUT on existing bucket.
+    
+    Fixes: #11148
+    Backport: hammer
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 3998fe7e02a6c25a3302c80a9c9907357fd3a23e)
+
+commit 9a79e8e7da5f34f1adaf6137e01bcd42766ae677
+Merge: 5527720 7f1c0cc
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Sun Jul 12 02:19:57 2015 +0800
+
+    Merge pull request #5208 from tchaikov/wip-11975-hammer
+    
+    tests: TEST_crush_reject_empty must not run a mon
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 7f1c0cc9cd3deab925440b56d82c3e61a8ba5ab1
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Sat Jul 11 23:04:33 2015 +0800
+
+    crush/CrushTester: return EINVAL if crushtool returns non-zero
+    
+    this backports a tiny part of ec02441, otherwise
+    CrushTester will return 1, and "ceph" cli will take it
+    as EPERM, which is miss leading, and fails
+    osd-crush.sh:TEST_crush_reject_empty.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+
+commit 2aaeea145b24b972a0b98549c3527ccf98f4c96f
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Jul 10 16:23:47 2015 +0200
+
+    tests: TEST_crush_reject_empty must not run a mon
+    
+    * Back in Hammer, the osd-crush.sh individual tests did not run the
+      monitor, it was taken care of by the run() function. An attempt to run
+      another mon fails with:
+    
+      error: IO lock testdir/osd-crush/a/store.db/LOCK: Resource temporarily
+      unavailable
+    
+      This problem was introduced by cc1cc033930e8690a57674e842a003f6bbc7a242
+      from https://github.com/ceph/ceph/pull/4936
+    * replace test/mon/mon-test-helpers.sh with test/ceph-helpers.sh as
+      we need run_osd() in this newly added test
+    * update the run-dir of commands: ceph-helpers.sh use the different
+      convention for the run-dir of daemons.
+    
+    http://tracker.ceph.com/issues/11975 Refs: #11975
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+
+commit 80afb81124a0d2ef25a23a12c86617ab1da3a4bd
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Apr 21 16:11:33 2015 +0200
+
+    ceph-helpers: implement test_expect_failure
+    
+    To display the output in case the command did not fail with the expected
+    output.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 5871781b10ff0b26c731b70d1898c474006cbee3)
+
+commit 6b5e9a1df7dfb3a971e40aec35119ec019515b69
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Jun 10 23:16:01 2015 +0200
+
+    tests: display the output of failed make check runs
+    
+    After a make check fails, it shows a summary but not the output of the
+    failed tests although they contain information to diagnose the problem.
+    
+    Set the VERBOSE=true automake variable which is documented to collect
+    and display the failed script output at the end of a run (the content of
+    the test-suite.log file (valid from automake-1.11 up).
+    
+    http://www.gnu.org/software/automake/manual/automake.html#index-VERBOSE
+    
+    Also remove the run-make-check.sh that did the same in a way that is not
+    compatible with automake-1.11.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 3a55cb029bb7db9542d2b14f2deda90feb0ae0f6)
+
+commit 552772025cb8d5f51ffb3a069d1bd93bc73f1123
+Merge: f4d77c2 1440122
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 10 10:17:24 2015 +0200
+
+    Merge pull request #4889 from theanalyst/wip-11484-hammer
+    
+    OPT_INT option interprets 3221225472 as -1073741824, and crashes in Throttle::Throttle()
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit f4d77c22aa51edb45211e080f3fdf28a7a0cfdd4
+Merge: 5088105 a62c3aa
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 10 10:16:25 2015 +0200
+
+    Merge pull request #4776 from tchaikov/wip-11279-hammer
+    
+    ceph: cli interactive mode does not understand quotes
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 5088105300c013b1b804c938a30ac63ba710556d
+Merge: e3b1f7b 0b6d442
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 10 10:14:42 2015 +0200
+
+    Merge pull request #4657 from ceph/wip-hammer-11535-admin-socket
+    
+    common/admin_socket: close socket descriptor in destructor
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit e3b1f7be9e8474fbec98076790ff683bccd44ce9
+Merge: dd29a86 558d639
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Fri Jul 10 16:07:48 2015 +0800
+
+    Merge pull request #4687 from SUSE/wip-7387-hammer
+    
+    utf8 and old gcc breakage on RHEL6.5
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit dd29a869db5503fc9e2c6d1d44ee4311d95af20c
+Merge: 7f1fb57 0e5e7e1
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Fri Jul 10 16:00:00 2015 +0800
+
+    Merge pull request #5122 from theanalyst/wip-11982-hammer
+    
+    ceph fails to compile with boost 1.58
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 7f1fb574608800c3e6aa12df6c7888acbf397a52
+Merge: adc7016 5141301
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Fri Jul 10 15:59:35 2015 +0800
+
+    Merge pull request #4936 from ceph/wip-11975-hammer
+    
+    mon crashes when "ceph osd tree 85 --format json"
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit adc70161d14fc2b51e6c6f38580f76ff0067717a
+Merge: 2d68db8 82988d6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 10 09:48:44 2015 +0200
+
+    Merge pull request #4892 from theanalyst/wip-11760-hammer
+    
+    ceph-disk: get_partition_type fails on /dev/cciss...
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 2d68db8371263645642cf28473deea4456ca7021
+Merge: 1cffe8c ba1a016
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 10 09:43:57 2015 +0200
+
+    Merge pull request #4877 from SUSE/wip-11902-hammer
+    
+    admin/build-doc: script fails silently under certain circumstances
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 51413011417b76f5ad2830d9f93fbfe78c77e467
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 18:11:59 2015 +0800
+
+    mon: add "--check" to CrushTester::test_with_crushtool()
+    
+    so we don't need to call CrushTester::check_name_maps() in OSDMonitor.cc
+    anymore.
+    
+    Fixes: #11680
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit c6e634875316cf17368d497e6dc4f6f4b5dd65d2)
+
+commit 5ec27cf589b4535f07e28a86bd304f7a46427ac4
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 17:51:50 2015 +0800
+
+    crushtool: rename "--check-names" to "--check"
+    
+    * because "--check" also checks for the max_id
+    
+    Note: edited since we do not have the fix introduced in 46103b2 in
+          hammer.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 9381d53acdce85fcbff828926b911e050ba36e51)
+
+commit 2a8fe8862a15342cc5716c146487d0b42af0fbf6
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 16:58:23 2015 +0800
+
+    mon: check the new crush map against osdmap.max_osd
+    
+    Fixes: #11680
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 22e6bd6e01d5df3f3e897562597e22ca1737f8c8)
+
+commit c0b0f52ddbd4e22998a36addfb32f27614183e19
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 15:35:10 2015 +0800
+
+    crushtool: enable check against max_id
+    
+    add an argument "max_id" for "--check-names" to check if any item
+    has an id greater or equal to given "max_id" in crush map.
+    
+    Note: edited since we do not have the fix introduced in 46103b2 in
+          hammer.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit d0658dd3cdf072b2a7c2a1986f8785a697c591ee)
+
+commit f041bbebf98a2aff2ad542e8d0c12c46af427573
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 15:34:33 2015 +0800
+
+    crush/CrushTester: check if any item id is too large
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit e640d89240017956b8c7411babb86be0f1e2b172)
+
+commit cc1cc033930e8690a57674e842a003f6bbc7a242
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon May 25 20:14:32 2015 +0800
+
+    mon: validate new crush for unknown names
+    
+    * the "osd tree dump" command enumerates all buckets/osds found in either the
+      crush map or the osd map. but the newly set crushmap is not validated for
+      the dangling references, so we need to check to see if any item in new crush
+      map is referencing unknown type/name when a new crush map is sent to
+      monitor, reject it if any.
+    
+    Fixes: #11680
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit a955f36a509e5412b1f72632a1a956d99e768e35)
+
+commit ff29a7f9dd21505c681881e609183aed9ac3250e
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 12:08:36 2015 +0800
+
+    crushtool: add the "--check-names" option
+    
+    * so one is able to verify that the "ceph osd tree" won't chock on the
+      new crush map because of dangling name/type references
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit d6b46d4c7b722945ce24ac2930381a109b1e3dda)
+
+commit 960ea49699f421ceb89c9e0c9430378a35f09a9a
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 26 12:08:09 2015 +0800
+
+    crush/CrushTester: add check_name_maps() method
+    
+    * check for dangling bucket name or type names referenced by the
+      buckets/items in the crush map.
+    * also check for the references from Item(0, 0, 0) which does not
+      necessarily exist in the crush map under testing. the rationale
+      behind this is: the "ceph osd tree" will also print stray OSDs
+      whose id is greater or equal to 0. so it would be useful to
+      check if the crush map offers the type name indexed by "0"
+      (the name of OSDs is always "OSD.{id}", so we don't need to
+      look up the name of an OSD item in the crushmap).
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit b75384d73958faf81d45847a7dfa56f4fa347e6f)
+
+commit 1cffe8c46a39142ee0da4e2279eda7276df262e1
+Merge: 6ffb1c4 ef6641c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jul 10 09:39:15 2015 +0200
+
+    Merge pull request #4667 from SUSE/wip-11611-hammer
+    
+    ceph.spec: update OpenSUSE BuildRequires
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 5e72479b0882ac13597d7a613698e583dcb2b932
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Jul 7 11:43:01 2015 -0700
+
+    OSDMonitor: allow addition of cache pool with non-empty snaps with config
+    
+    We need to be able to allow the version of ceph_test_* from earlier
+    versions of ceph to continue to work.  This patch also adjusts the
+    work unit to use a single rados snap to test the condition without
+    --force-nonempty to ensure that we don't need to be careful about
+    the config value when running that script.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+
+commit 6ffb1c4ae43bcde9f5fde40dd97959399135ed86
+Merge: c7ebf96 524f4a5
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Wed Jul 8 16:52:12 2015 +0100
+
+    Merge pull request #5123 from theanalyst/wip-11979-hammer
+    
+    MDSMonitor: handle MDSBeacon messages properly
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit ecac1a458bc7331ed8d667f20ba31995d74892d3
+Author: Thorsten Behrens <tbehrens at suse.com>
+Date:   Fri Feb 6 01:26:40 2015 +0100
+
+    Always provide summary for non-healthy cluster
+    
+    This fixes a problem, wherein calamari does not provide
+    popup drill-downs for warnings or errors, should the summary
+    be missing.
+    
+    Calamari gets health info from /api/v1/cluster/$FSID/health.
+    If the data here has a summary field, this summary is provided
+    in a popup window:
+    
+      /api/v1/cluster/$FSID/health is populated (ultimately) with
+      status obtained via librados python bindings from the ceph
+      cluster. In the case where there's clock skew, the summary
+      field supplied by the ceph cluster is empty.
+    
+    No summary field, no popup window with more health details.
+    
+    Signed-off-by: Thorsten Behrens <tbehrens at suse.com>
+    (cherry picked from commit eaf6e0cf48488fe604d0ef0db164d44948d4e8d4)
+
+commit c7ebf96a9a4a6143b112c8606d5ee346fb800cec
+Merge: b163728 1a321e4
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 8 15:36:38 2015 +0200
+
+    Merge pull request #4862 from SUSE/wip-11874-hammer
+    
+    Bucket header is enclosed by quotes
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit b1637289ec4ff99d923457577893b4c4a8d2e9fe
+Merge: e33af22 54f4e7d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 8 15:35:53 2015 +0200
+
+    Merge pull request #4885 from theanalyst/wip-11755-hammer
+    
+    Object copy bug
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit e33af22dec32467f229ca2dc1dc9668702a44ce8
+Merge: 5696b0f 9dfef60
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 8 15:34:45 2015 +0200
+
+    Merge pull request #4884 from theanalyst/wip-11722-hammer
+    
+    Keystone PKI token expiration is not enforced
+    
+    Reviewed-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 5696b0ff2a981ae8afe72df796ba7d7da47bb7d1
+Merge: 72ecd52 ed5442b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Jul 8 15:30:48 2015 +0200
+
+    Merge pull request #4875 from ceph/wip-11770-hammer
+    
+    librbd: aio calls may block
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1a32379dd6cb56ed69b8f448d3612506c8131fbe
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon May 11 19:30:30 2015 +0800
+
+    mon/PGMap: add more constness
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit e1f1c56ce88ef3ad05e881d650fac637931ce3fe)
+
+commit 84ebc3d320bdf871ccf85e555951cea421b56021
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon May 11 19:29:13 2015 +0800
+
+    mon/PGMap: sort pg states by the states in "pg ls" spec
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 990dfb6cd45438bc8293ac37882daa413860a2f8)
+
+commit e310461aecc667cf26806bc5a3bbabb05696bdfc
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon May 11 17:02:41 2015 +0800
+
+    mon: s/recovery/recoverying/ in "pg ls*" commands' spec
+    
+    * also translate "repair" if specified as "states"
+    * update test_mon_pg in cephtool-test-mon.sh
+    
+    Fixes: #11569
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 89f89ca3477eddcae11a05fbd58a8f3658eb1fc1)
+
+commit 524f4a52d115ecda8cd7793d0f8bea148eff92af
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri May 15 22:50:36 2015 +0800
+
+    mon: always reply mdsbeacon
+    
+    the MDS (Beacon) is always expecting the reply for the mdsbeacon messages from
+    the lead mon, and it uses the delay as a metric for the laggy-ness of the
+    Beacon. when it comes to the MDSMonitor on a peon, it will remove the route
+    session at seeing a reply (route message) from leader, so a reply to
+    mdsbeacon will stop the peon from resending the mdsbeacon request to the
+    leader.
+    
+    if the MDSMonitor re-forwards the unreplied requests after they are
+    outdated, there are chances that the requests reflecting old and even wrong
+    state of the MDSs mislead the lead monitor. for example, the MDSs which sent
+    the outdated messages could be dead.
+    
+    Fixes: #11590
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit b3555e9c328633c9e1fbc27d652c004b30535e5b)
+
+commit 413e407dea446bebb9c36abb3025ada450dd4fe9
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 23:20:21 2015 -0700
+
+    mon/MDSMonitor: rename labels to a better name
+    
+    * s/ignore/reply/
+    * s/out/ignore/
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit f00ecb8b3df73ce6337985bc6d43bce5143ee537)
+
+commit a03968ad584a3ff8e351cc5dce053e535fcdc454
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 12:55:06 2015 +0800
+
+    mon: send no_reply() to peon to drop ignored mdsbeacon
+    
+    so the peon can remove the ignored mdsbeacon request from the
+    routed_requets at seeing this reply, and hence no longer resend the
+    request.
+    
+    Fixes: #11590
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 72a37b3a8e145d8522ea67fc14ce2c5510b6852b)
+
+commit 39f34596b0ec6f769f507e2b372204f8551f7ee0
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jun 2 12:22:26 2015 +0800
+
+    mon: remove unnecessary error handling
+    
+    msg.get_session() should always return a non-zero pointer in
+    Monitor.dispatch()
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 16e8e2cc82a90c49cd8aa3d0e3acc4694ba659a0)
+
+commit 0e5e7e1d259579571c1fc05660f6af8e295e733b
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri May 8 15:21:20 2015 +0800
+
+    mon: remove unused variable
+    
+    * as a side effect, this change silences
+      http://tracker.ceph.com/issues/11576
+    
+    Fixes: #11576
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit e7b196a4a091c0ea258866559ba06e7ed0cc4247)
+
+commit 70347209260688f1a067354c744569499adb6920
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed Apr 1 16:37:51 2015 -0700
+
+    ReplicatedPG::finish_promote: handle results->snaps is empty case
+    
+    If results->snaps winds up empty after filtering removed snaps,
+    we need to treat the object as if we had gotten an ENOENT.
+    
+    PartialFix: #11296
+    Backport: firefly, hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 6150757dbe0fa11cceb14460865b859a7c8164c7)
+
+commit 3e44dc16ed3fbda053996e44826aa3d90042a234
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed Apr 1 16:25:22 2015 -0700
+
+    ReplicatedPG::finish_promote: fix snap promote head snaps
+    
+    If the snaps vector is: 10=[9,5,2]:[4]+head, the backing pool's snaps
+    vector is 3=[2]:[]+head, and we request clone 4 from the backing pool,
+    the backing pool will send us head with an empty results->snaps vector.
+    Actually, clone 4 should be trimmed, but the cache pool does not know
+    that.  Thus, we should construct an empty snaps vector for that clone.
+    
+    PartialFix: #11296
+    Backport: firefly, hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit a45a698372def1623323470c6a1c4eb70e0bb79f)
+
+commit 5ef08466abf1b3934fcad0a0ca46f3a4380d6dbd
+Author: John Spray <john.spray at redhat.com>
+Date:   Wed Jun 3 10:04:26 2015 +0100
+
+    tools: chunk reads in Dumper
+    
+    Previously tried to read entire journal
+    into memory in one go, which was problematic
+    for large journals.
+    
+    Fixes: #11746
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit e3ddcb894ad09326698999d42de0ce3feb69f28e)
+
+commit 408880bed296e5cbf05864fa6744a5b00a245272
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Tue Jun 16 08:13:41 2015 -0700
+
+    qa: update to newer Linux tarball
+    
+    This should make newer gcc releases happier in their default configuration.
+    kernel.org is now distributing tarballs as .xz files so we change to that
+    as well when decompressing (it is supported by Ubuntu Precise so we should
+    be all good).
+    
+    Fixes: #11758
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 1ea3f47ab806d48ca7b045c2731d344eae3900e1)
+
+commit 56c2688b87d7d78831f8e147fc67cc0651ab644c
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Apr 24 14:45:40 2015 -0700
+
+    rgw: simplify content length handling
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit e97fd5052cab83c5f699531a8c960b93437a8f9f)
+
+commit d9bbef3e470c6406bb65dc40e7e9c08c5d599f73
+Author: Robin H. Johnson <robbat2 at gentoo.org>
+Date:   Fri Apr 24 10:49:16 2015 -0700
+
+    rgw: make compatability deconfliction optional.
+    
+    Per request from Yehuda, the deconfliction for having both
+    HTTP_CONTENT_LENGTH and CONTENT_LENGTH set is now optional, and
+    controlled by new configuration boolean, which defaults to false.
+    rgw content length compat
+    
+    X-URL: https://github.com/ceph/ceph/pull/4436#issuecomment-95994887
+    Signed-off-by: Robin H. Johnson <robbat2 at gentoo.org>
+    (cherry picked from commit 79d17af1a1ec0659884f768945a7bac6282b5e0b)
+
+commit 0260abd5d265bd63ea9c89f4082c31ba1c5ae8fa
+Author: Robin H. Johnson <robbat2 at gentoo.org>
+Date:   Wed Apr 22 12:53:06 2015 -0700
+
+    rgw: improve content-length env var handling
+    
+    The FastCGI specification, section 6.3 on Authorizers, describes a case
+    where HTTP_CONTENT_LENGTH will be set in the environment and
+    CONTENT_LENGTH will NOT be set.
+    
+    Further documention in the code.
+    
+    Fixes: #11419
+    Signed-off-by: Robin H. Johnson <robbat2 at gentoo.org>
+    (cherry picked from commit 3e38eab44bfb082fdd2b6f29b8b0357f8f5c11bb)
+
+commit 8abc46a157e4c1431a92a1e52ab694dccff5d514
+Author: wuxingyi <wuxingyi at letv.com>
+Date:   Wed Jun 10 06:57:57 2015 +0000
+
+    rgw: fix data corruption when race condition
+    
+    We should delete the object in the multipart namespace lastly to prevent a previous upload
+    wrongly deleting objects belong to the following upload.
+    
+    Fixes: #11749
+    Signed-off-by: wuxingyi <wuxingyi at letv.com>
+    (cherry picked from commit ac1e729a75b5d995028bbc223bcf5ecce0d112cc)
+
+commit 72ecd522941156c8a7e5303531944b0735dcbeb8
+Merge: 59f37a9 d723e11
+Author: Abhishek L <abhishekl.2006 at gmail.com>
+Date:   Wed Jul 1 18:09:46 2015 +0530
+
+    Merge pull request #4886 from theanalyst/wip-11737-hammer
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 59f37a9bafc095181b3f41ec5d93ac58e2cda604
+Merge: 53a2143 89d0266
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Sat Jun 27 17:11:11 2015 +0800
+
+    Merge pull request #5095 from ceph/wip-fix-doc-hammer
+    
+    doc: fix doc build
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 89d0266a60729d5d9747867e8c30abf71a891231
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Sat Jun 27 14:44:55 2015 +0800
+
+    doc: add the corresponding @endcond command for @cond
+    
+    * they are used to applease asphyxiate, as it
+      is not able to handle "enum" sections
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+
+commit 2aa77b33a97e5a3ca134c9c555aa6e7a69ef50f7
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Sat Jun 27 14:43:01 2015 +0800
+
+    doc: remove orphan: directive in ceph-create-keys.rst
+    
+    * it is used to silence the sphinx warning, but conf.py
+      does not like it.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+
+commit ad66e40e8bd598da7c9738cb44abb543008c90a3
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Sat Jun 27 14:41:59 2015 +0800
+
+    doc: let doxygen ignore src/tracing
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+
+commit 53a2143eb7e549de1185b01ed0bde841ffa5235a
+Merge: 6f7cd04 bfb1442
+Author: Samuel Just <sam.just at inktank.com>
+Date:   Fri Jun 26 14:19:40 2015 -0700
+
+    Merge pull request #4902 from theanalyst/wip-11908-hammer
+    
+    Fixes for rados ops with snaps
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 6f7cd0460d5729c15966119e0177ddc56a361d8e
+Merge: 78d894a 356bd2c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jun 25 20:03:42 2015 -0400
+
+    Merge pull request #5069 from dachary/wip-11806-hammer
+    
+    ceph / ceph-dbg steal ceph-objecstore-tool from ceph-test / ceph-test-dbg
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 356bd2c68ca730e766d06c46a0364784f5d72275
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Jun 24 14:58:47 2015 -0400
+
+    debian: ceph-dbg steals ceph-objectstore-tool from ceph-test-dbg (take 2)
+    
+    968573b8930a7c8485bf53e3a989ce2f7d0a2fff incorrectly backported
+    6f11fbf41fab10924b1e0e41fcf27864779d4073. It should instead reflect that
+    ceph-dbg in 0.94.2 and above will break ceph-test-dbg in all versions
+    prior to 0.94.2.
+    
+    In other words, 0.94-XXXX being lower than 0.94.1, upgrading from
+    0.94.1 to 0.94.2 will not notice that ceph-dbg breaks ceph-test-dbg.
+    
+    $ dpkg --compare-versions 0.94-XXXX lt 0.94.1 && echo yes || echo no
+    yes
+    $ dpkg --compare-versions 0.94.2 lt 0.94.1-xxx && echo yes || echo no
+    no
+    
+    http://tracker.ceph.com/issues/11806 Fixes: #11806
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+
+commit c5c627fdd3de669ee94ab7ecd6939c29a4a68011
+Author: wuxingyi <wuxingyi2015 at outlook.com>
+Date:   Wed Mar 11 17:34:40 2015 +0800
+
+    rgw/logrotate.conf: Rename service name
+    
+    The service name for ceph rados gateway was changed to "ceph-radosgw",
+    the previous version of service name "radosgw" would cause a failed reload,
+    and finally make it impossible to write any log data to the log file.
+    
+    Signed-off-by: wuxingyi <wuxingyi2015 at outlook.com>
+    (cherry picked from commit 9df3f798179481fe8ae6ae873dcb793de7d8f367)
+
+commit 582cf731e05baabd2cd79567af89d7f005c24925 (refs/remotes/gh/wip-12109-hammer)
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue May 5 13:08:21 2015 -0400
+
+    tests: add librbd watch/notify version compatibility test
+    
+    Fixes: #11405
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 41e4cbe032e32762e3a9e8bc3eff8ece19f91a54)
+
+commit 43b9aef11c1281d8b83b659a523dba365d79add4
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue May 5 11:22:55 2015 -0400
+
+    qa/workunits/rbd: add notify_master/slave bootstrap scripts
+    
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 124b1d3d2d0dbd685bbd717856d29b316e62e660)
+
+commit f995fb50d3d7734161fa498db9e204eaded651b6
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue May 5 10:34:48 2015 -0400
+
+    qa/workunits/rbd: add new test_librbd_api workunit
+    
+    This only tests the public librbd API for use during upgrade tests.
+    
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 9039955f42d01044cfcf20c56ca2181e51c317ee)
+
+commit a09da2a2c6c12c6bf2f8e17f2096b3ab24587007
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue May 5 10:27:38 2015 -0400
+
+    tests: create librbd API-only integration test suite
+    
+    The QA client-upgrade test suite requires a librbd test
+    that is dynamically linked to librbd.  Since the current
+    ceph_test_librbd includes tests against the non-public API,
+    it is statically linked against librbd and thus cannot be
+    used to test a client upgrade scenario.
+    
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6fe94c8cbb924c31c1007e2d0c76f28ce9dbca57)
+
+commit e149916cd40a58ce5db5f63a2b4efd82a8c4e1ba
+Author: Owen Synge <osynge at suse.com>
+Date:   Tue Apr 21 11:31:24 2015 +0200
+
+    Increase max files open limit for OSD daemon.
+    
+    Under heavy load the number of file descriptors opened
+    by the OSD can go beyond the 64K file limit. This patch
+    increases the default to 128K.
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit ebda4ba1c67172852587e47a8e6fb538809a1b1c)
+
+commit 22f58ce2665f1ea6b38f6016dc585202a4595322
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jun 1 15:10:14 2015 -0700
+
+    Makefile: install ceph-post-file keys with mode 600
+    
+    Otherwise ssh (may) prompt for a password.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 106a1c3081d02446aa3d8e13865da0c3393bae90)
+
+commit 3e65a10bd2351744da199a4b076659191b4378a2
+Author: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+Date:   Mon Jun 1 15:05:32 2015 -0700
+
+    ceph-post-file: improve check for a source install
+    
+    Signed-off-by: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+    (cherry picked from commit ee170eadcdcb4b54d36a7d474558484de9d917eb)
+
+commit c1f6743940250b04ae6dbea30d8805571add39b6
+Author: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+Date:   Mon Jun 1 15:00:39 2015 -0700
+
+    ceph-post-file: behave when sftp doesn't take -i
+    
+    Fixes: #11836
+    Signed-off-by: Joseph McDonald <joseph.mcdonald at alcatel-lucent.com>
+    (cherry picked from commit b84031ed5eaace1222e14d3c4076a3ab1155da96)
+
+commit 38d36b1174160ad104704aaa7ff5290d1ec3e782
+Author: Tim Serong <tserong at suse.com>
+Date:   Thu Apr 30 10:55:38 2015 +1000
+
+    packaging: move SuSEfirewall2 templates out of src
+    
+    Better to have static config like this that needs to be installed in
+    /etc in a separate subdirectory of the project.
+    
+    Signed-off-by: Tim Serong <tserong at suse.com>
+    (cherry picked from commit 70292658d5febb6c5f94af4df9c3e93551772d12)
+
+commit 24bc9f2c58ca78c8023935b8b69f8b01adbc11af
+Author: Tim Serong <tserong at suse.com>
+Date:   Wed Apr 29 13:12:38 2015 +1000
+
+    packaging: add SuSEfirewall2 service files
+    
+    This adds SuSEfirewall2 service files for Ceph MON, OSD and MDS, for use
+    on SLES and openSUSE.  The MON template opens port 6789 and the OSD/MDS
+    template opens the range 6800-7300 as per
+    http://ceph.com/docs/master/rados/configuration/network-config-ref/
+    
+    Signed-off-by: Tim Serong <tserong at suse.com>
+    (cherry picked from commit 77685f5b787c56bcb1c4d9f1e058e25312fa62fe)
+
+commit 8acfb994f22efa07beeecccda300cbd50d683566
+Author: Owen Synge <osynge at suse.com>
+Date:   Thu May 7 12:02:41 2015 +0200
+
+    Bug fix to ceph systemV compatability script.
+    
+    Was failing with more than one OSD / MON deamon on a single node.
+    Fixes suse bugzilla #927862
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit dfda3ff8741fcdbac3150456ca7614cf75ef1776)
+
+commit bd3fd929e6f95e6d9840317aa3ac02f52711c94b
+Author: Owen Synge <osynge at suse.com>
+Date:   Thu Jun 18 14:16:03 2015 +0200
+
+    Fixes to rcceph script
+    
+     - only start OSDs if mon daemons are also present
+     - adds support for mask and unmask
+     - removes support for cluster with non default cluster name,
+       as this was very limited and inconsistent
+     - Reapplied from a patch as could not cherry-pick
+       66cb46c411d874be009c225450eea5021cf1219b from Mon Jan 12
+       as this produced issues with src/gmock
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit bfa0c4a626fdbb2bf978ccfab783ac428156144b)
+
+commit 37d77d3680d2c8adda35eddf9625a331a45ece11
+Author: Owen Synge <osynge at suse.com>
+Date:   Tue Apr 21 11:31:24 2015 +0200
+
+    Increase max files open limit for OSD daemon.
+    
+    Under heavy load the number of file descriptors opened
+    by the OSD can go beyond the 64K file limit. This patch
+    increases the default to 128K.
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit ebda4ba1c67172852587e47a8e6fb538809a1b1c)
+
+commit 78d894a634d727a9367f809a1f57234e5e6935be
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 17 09:35:28 2015 -0700
+
+    qa/workunits/rados/test-upgarde-v9.0.1: fix exclude syntax
+    
+    It's -, then a list of all exclusions separated by :.  There are just 2.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 3e8d60a80ce31860eac76a1f6489a35e1795a0c0
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jun 16 21:05:29 2015 -0700
+
+    qa/workunits/rados/test-upgrade-v9.0.1: skip one more evict test
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 348a3d3c9880e7d022e71a2faafe51c8f771406e
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Jun 15 15:12:43 2015 -0700
+
+    qa: add compatibility filtered rados api tests for upgrades
+    
+    Post-9.0.1, the evict op returns success when an object doesn't exist
+    in the cache tier. Skip the tests that are incompatible across
+    versions.
+    
+    Fixes: #11548
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+
+commit d2b80966b8f74de818a671c90b4c821a4b0782db
+Merge: 70bba62 f68bf94
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Jun 15 12:38:57 2015 -0700
+
+    Merge pull request #4961 from ceph/wip-11493-hammer
+    
+    backport 11493 fixes, and test, prevetning ec cache pools
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f68bf94e370fb11a3047ec2762a972a0b7a7c0bb
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri May 15 13:05:40 2015 -0700
+
+    OSDMonitor: disallow ec pools as tiers
+    
+    Fixes: 11650
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 11b7801bb57cb25cd2d26d58722d49691747725b)
+
+commit 13c8d58da1303cc68d99da19f79d625f91f99d43
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Apr 29 12:34:25 2015 -0700
+
+    mon: prevent pool with snapshot state from being used as a tier
+    
+    If we add a pool with snap state as a tier the snap state gets clobbered
+    by OSDMap::Incremental::propogate_snaps_to_tiers(), and may prevent OSDs
+    from starting.  Disallow this.
+    
+    Include a test.
+    
+    Fixes: #11493
+    Backport: hammer, giant, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit bbec53edf9e585af4e20bbc9ba9057d6fdfda342)
+
+commit 58e62662f6ef04ac76470090d1d958467e34194a
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri May 8 10:26:48 2015 -0700
+
+    test/librados/tier.cc: destroy and recreate cache pool on every test
+    
+    Namespaces are not sufficient with the checks for 11493 in the mon.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit bef09e0cdb274cb1c87335a2af9ee532d14a4596)
+
+commit 70bba6226a64090dcf41cd90b23fdf5aed8cd0ca (refs/remotes/jashan/hammer)
+Merge: 3b6977b 5a60a03
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Jun 15 17:26:07 2015 +0200
+
+    Merge pull request #4846 from SUSE/wip-11862-hammer
+    
+    missing man pages for ceph-create-keys, ceph-disk-*
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 3b6977b706dbc99cac25bec1b71a628c398c6ff1
+Merge: 5fb8561 3db1026
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jun 11 13:54:35 2015 -0700
+
+    Merge pull request #4934 from dachary/wip-releases-hammer
+    
+    doc/release-notes: v0.94.2
+
+commit 3db1026f3706e6f5a5c25013cb6646a0298057d8
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 10 12:48:41 2015 -0700
+
+    doc/release-notes: v0.94.2
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 306345b29c259ab04a58ed5d40f801645485b29d)
+    
+    Conflicts:
+    	doc/release-notes.rst
+
+commit ed5442b1057dcc4fb1f9404c805dabe2bbde2252 (refs/remotes/jashan/wip-11770-hammer, refs/remotes/gh/wip-11770-hammer)
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 2 10:33:35 2015 -0400
+
+    tests: verify librbd blocking aio code path
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4cf41486e9c9e1efcb863960a8f3e0326ffca7e5)
+    
+    Conflicts:
+    	src/test/librbd/test_librbd.cc: trival resolution
+
+commit 20e104869f3d17ce672438144700a4d984d487b4
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jun 1 22:56:11 2015 -0400
+
+    librbd: new rbd_non_blocking_aio config option
+    
+    Setting this option to false reverts librbd to legacy behavior
+    where AIO operations could potentially block.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 769cad12716b85d87eacc1069dd9f5c21cad3915)
+
+commit b4571b3e238efc39767f753e0ec1622c8bd6d6e6
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 9 20:34:28 2015 -0400
+
+    PendingReleaseNotes: document changes to librbd's aio_read methods
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 9ea1edd0ca9e385f823ad04b05bc887d77aa5136
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 9 13:33:09 2015 -0400
+
+    librbd: AioRequest::send no longer returns a result
+    
+    The librados calls used by AioRequest::send should always return
+    zero unless there is a bug.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c77bce3311ab62892eb8c1d883263ba7ed663b20)
+    
+    Conflicts:
+    	src/librbd/AioRequest.cc: trivial resolution
+    	src/librbd/AsyncFlattenRequest.cc: trivial resolution
+
+commit 272df2aed79a95dd9c45db4e0953e9b321f7b0f5
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 21:55:36 2015 -0400
+
+    tests: update librbd AIO tests to remove result code
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 948b15eb52fd5d9ce842fa12ee0cecda17353b01)
+    
+    Conflicts:
+    	src/test/librbd/test_internal.cc: trivial resolution
+    	src/test/librbd/test_librbd.cc: trivial resolution
+
+commit dd2e4c13ff6d88edb25f90af62af16ba825c15c9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 21:37:50 2015 -0400
+
+    librbd: internal AIO methods no longer return result
+    
+    All failures should be returned via the AioCompletion.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 9ab42d613128ab08c688ddbea93df4c95068b9cd)
+    
+    Conflicts:
+    	src/librbd/AioRequest.cc: trivial resolution
+    	src/librbd/internal.cc: trivial resolution
+
+commit dbd4e293d7124c89a22148e8fa5f425a995c900c
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 21:48:21 2015 -0400
+
+    Throttle: added pending_error method to SimpleThrottle
+    
+    Allow the client of SimpleThrottle to detect an async error
+    so that it can exit early.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b88b88c5df91325fb713c2031a56bffe421268e0)
+
+commit 7df6091a30b1b94d764240262195e971175554b3
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 20:18:50 2015 -0400
+
+    librbd: add new fail method to AioCompletion
+    
+    Helper method to handle passing fatal errors generated within
+    librbd (not from the OSDs) back to the client.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6d1d0c867855a96bee4c13a0c0a39a0e002ccd12)
+
+commit cf6e1f50ea7b5c2fd6298be77c06ed4765d66611
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 19:06:52 2015 -0400
+
+    librbd: avoid blocking AIO API methods
+    
+    Enqueue all AIO API methods within the new librbd thread pool to
+    reduce the possibility of any blocking operations. To maintain
+    backwards compatibility with the legacy return codes of the API's
+    AIO methods, it's still possible to block attempting to acquire
+    the snap_lock.
+    
+    Fixes: #11056
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3a7b5e30efdb21aa1a0aeb68a5d02a1ac2a5faf3)
+
+commit e61974aed09a3f81e1f65a4bbaed43e3f22b27b4
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 17:24:08 2015 -0400
+
+    librbd: add task pool / work queue for requests
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit afb896d91f886b647baf38f7ec94cc3739f6d2a9)
+    
+    Conflicts:
+    	src/librbd/ImageCtx.cc: trivial resolution
+    	src/librbd/ImageCtx.h: trivial resolution
+
+commit bfb144268b803340efad29cd6c627b170ea32402
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 20 16:10:02 2015 -0700
+
+    ReplicatedPG::release_op_ctx_locks: requeue in scrub queue if blocked
+    
+    Otherwise we can reorder an op around another op which got blocked by a
+    scrub which started after the first blocked on an obc.
+    
+    Fixes: #11691
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit be873eb8da7b29ecefaa5a99b88de7ddcca711ee)
+
+commit c7b6a6370a69149ea94f9e35d536aa90f06e7659
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue May 19 10:56:11 2015 -0700
+
+    ReplicatedPG::finish_ctx: take excl lock if operation is rw
+    
+    Fixes: #11677
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 5c2b795724423ed484ab451de855ddcfc085342b)
+
+commit 1550a569dab120ce28396fe365565e8e4acd9801
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu May 21 12:13:43 2015 -0700
+
+    RadosModel: randomly prefix delete with assert_exists
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 4fe7d2abdff2fce359e5e992206644cc03825ee0)
+
+commit 4cdc5f7d6b3ec488c79c09cb44a43d4d9398b74c
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu May 21 11:36:42 2015 -0700
+
+    RadosModel: assert exists on subsequent writes
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 121aa3bc612b86281535ac3bcfe98bc99bc99ace)
+
+commit 25c730bda74b94f2c894c508ab09988dbd528c4e
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue May 19 10:23:01 2015 -0700
+
+    test/librados/snapshots.cc: add test for 11677
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit c2d17b927f8a222164b3bf2922a4ff337696f566)
+
+commit 3d74164d3d6caaa5099abd9a1d1920482d3e05c2
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 27 11:14:15 2015 -0700
+
+    ReplicatedPG::trim_object: write filtered snapset while we're at it
+    
+    If we trimmed an object, we might as well remove the obsolete snaps
+    as well.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 90eb7768f99ea249952df195a844a3a7c9a59b78)
+
+commit a1161540bc0094a951021d4ca651b95ec045213e
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed May 27 11:00:54 2015 -0700
+
+    ReplicatedPG: start_flush: use filtered snapset
+    
+    Otherwise, we might send our deletes based on deleted snaps.  This is
+    problematic since we may have trimmed the clones to which those snaps
+    belong, causing us to send them at an earlier snap than we used before.
+    
+    The specific situation was
+    
+    78:[78, 70, 63, 5a, 58, 57]:[64(63), 58(58, 57)]
+    
+    with 58 already clean.  To flush 64, we send:
+    
+    delete at 58
+    delete at 59
+    copyfrom at 62
+    
+    Then, snap 63 is trimmed leaving us with a snapset of:
+    
+    78:[78, 70, 63, 5a, 58, 57]:[58(58, 57)]
+    
+    since trim_object doesn't filter the head object snapset snaps.  This
+    isn't really a bug since in general all snapset users must be aware
+    that there may be trimmed snaps in snapset::snaps.  However, here
+    it becomes a problem when we go to flush head:
+    
+    delete at 58 -- ignored due to snapc
+    delete at 59 -- ignored due to snapc
+    copyfrom at 78 -- not ignored
+    
+    The base pool head is at snap seq 62, so it clones that value into
+    clone 78(78, 70) instead of forgetting it.  What should have happened
+    is that we should have based our flushes on filtered snapset:
+    
+    78:[78, 70, 58, 57]:[58(58, 57)]
+    
+    Causing us to instead send:
+    
+    delete at 58 -- ignored due to snapc
+    delete at 69 -- not ignored, causes no clone to be made
+    copyfrom at 78 -- not ignored, updates head such that a subsequent clone
+    will leave 70 out of the clone snaps vector.
+    
+    Fixes: 11787
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 6051e255ac062985ada1989edb7f23cd750915e2)
+
+commit 82988d611bad6226138b94590275faadbca3554a
+Author: islepnev <islepnev at gmail.com>
+Date:   Fri Apr 17 22:33:01 2015 +0300
+
+    ceph-disk: support NVMe device partitions
+    
+    Linux nvme kernel module v0.9 enumerate devices as following:
+    
+    /dev/nvme0 - characted revice
+    /dev/nvme0n1 - whole block device
+    /dev/nvme0n1p1 - first partition
+    /dev/nvme0n1p2 - second partition
+    
+    http://tracker.ceph.com/issues/11612 Fixes: #11612
+    
+    Signed-off-by: Ilja Slepnev <islepnev at gmail.com>
+    (cherry picked from commit 9b62cf254d02d30609793be8b1cb8a94f38891f1)
+
+commit bd91fb027ab91d487b1d61d25516c13590735d89
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue May 12 16:37:56 2015 -0700
+
+    mon: prevent bucket deletion when referenced by a rule
+    
+    If a rule references a bucket with 'take', prevent deletion.
+    
+    Fixes: #11602
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 3d591afef90b0601572c748f13faac029d05f5a0)
+
+commit 56565ee1cdb06a7705d1c3f26f5592b10399324a
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue May 12 14:03:49 2015 -0700
+
+    crush: fix crash from invalid 'take' argument
+    
+    Verify that the 'take' argument is a valid device or bucket.  Otherwise,
+    ignore it (do not add the value to the working vector).
+    
+    Backport: hammer, firefly
+    Fixes: #11602
+    Reported-by: shiva rkreddy <shiva.rkreddy at gmail.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9324d0a1af61e1c234cc48e2175b4e6320fff8f4)
+
+commit 1440122d61d5b0a3f8360f4e2101db1018109799
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Apr 29 03:28:18 2015 -0700
+
+    common/config: detect overflow of float values
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 1ff409ef8d022a1a84d034bd3db976c4d769e993)
+
+commit 9b947fa320b77e0055a581005353c2561a12a198
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Apr 29 15:41:08 2015 +0800
+
+    common/config: detect overflow of int values
+    
+    * #include "strtol.h" in strtol.cc, to ensure the function defintions
+      are consistent.
+    * add a test accordingly
+    * fix the testcase of converting 1024E.
+    * do not accept integers overflow after adding SI suffix
+    * do not accept integers underflow (i.e. negative values)
+    
+    Fixes: #11484
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit d62f80dc7b25d312ff05b65b7be854aae15b66a8)
+
+commit d723e1156e70a492d633e43b86e7c373e5750065
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue May 12 14:52:30 2015 +0800
+
+    mds: clear CDir::STATE_REJOINUNDEF after fetching dirfrag
+    
+    Fixes: #11541
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit ab1e5394dc778f6799472bd79a4d9ba7197107c2)
+
+commit 54f4e7d4a534448293c74612f8140cf34b9cf9f8
+Author: Javier M. Mellid <jmunhoz at igalia.com>
+Date:   Fri May 15 14:22:29 2015 +0200
+
+    rgw: Use attrs from source bucket on copy
+    
+    On copy objects, when bucket source is the same as the destination, use attrs
+    from source bucket.
+    
+    Fixes: #11639
+    
+    Signed-off-by: Javier M. Mellid <jmunhoz at igalia.com>
+    (cherry picked from commit 1dac80df1d4a2364154ed8b404d13609936c257b)
+
+commit 9dfef6004d208af3730634796aad199391707826
+Author: Anton Aksola <anton.aksola at nebula.fi>
+Date:   Fri Apr 10 13:25:21 2015 +0300
+
+    rgw: always check if token is expired
+    
+    Fixes: #11367
+    
+    Currently token expiration is only checked by the token cache. With PKI
+    tokens no expiration check is done after decoding the token. This causes
+    PKI tokens to be valid indefinitely. UUID tokens are validated by
+    keystone after cache miss so they are not affected by this bug.
+    
+    This commit adds explicit token expiration check to
+    RGWSwift::validate_keystone_token()
+    
+    Signed-off-by: Anton Aksola <anton.aksola at nebula.fi>
+    Reported-by: Riku Lehto <riku.lehto at nexetic.com>
+    (cherry picked from commit 2df069390ea3bbcfbab5022750e89f51d197cc11)
+
+commit fdb43ebe2b1211acdb454836a64dbd589feeef45
+Author: Nathan Cutler <ncutler at suse.cz>
+Date:   Fri May 15 21:43:34 2015 +0200
+
+    ceph.spec.in: tweak ceph-common for SUSE/openSUSE
+    
+    ceph-common needs python-argparse in SUSE/openSUSE and
+    needs redhat-lsb-core only in RHEL/CentOS/Fedora.
+    
+    http://tracker.ceph.com/issues/11638 Fixes: #11638
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.cz>
+    (cherry picked from commit 363d957d8fdd15a1674befbd8e485fd89b76d716)
+
+commit ba1a0167cc809081eda7e6cc9ecfb971e439d696
+Author: John Spray <john.spray at redhat.com>
+Date:   Wed Jun 3 10:09:09 2015 +0100
+
+    admin/build-doc: fix dependency checks
+    
+    http://tracker.ceph.com/issues/11857 Fixes: #11857
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 539c1ba7211f579bad4f59ae824f1e68e620ecbd)
+    
+    Conflicts:
+    	admin/build-doc
+                Insert lines at appropriate spot
+
+commit 5a60a034bf3015eaf468e5e3f9d8feb08b8fdd95
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Wed Jun 3 10:41:27 2015 +0200
+
+    man/ceph-create-keys.8: add missing file
+    
+    This is the generated manpage, taken from a local build of master
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit bcda61fcbe07ee36cd5172d80018f287591660ec)
+
+commit 19305b897ac147602049752a2dfbe1fd39ba562c
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Apr 21 14:59:32 2015 +0800
+
+    doc: add ceph-create-keys.8
+    
+    Fixes: #10725
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 27cee2f1f46a9f47cda9dfeb56ff1259e982960c)
+    
+    Conflicts:
+        doc/man/8/ceph-create-keys.rst
+        Includes fixes from https://github.com/ceph/ceph/pull/4855
+
+commit ffd0933dcc790d7cedc1048b664bf4e8c40464a3
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon May 11 17:05:49 2015 -0400
+
+    WorkQueue: added virtual destructor
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b3f5a75332c058816dc39b71e9d2b36e752159f4)
+
+commit a28adfbdd8abc86e7766c303bc610c0c252910f7
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 16:46:34 2015 -0400
+
+    WorkQueue: add new ContextWQ work queue
+    
+    The queue holds a collection of Context pointers that will
+    be completed by the thread pool.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 24a33e977f7b71962adeeb48f75d488a76e70fa9)
+
+commit 1a321e477effa23bffbb6cb057aa955586197345
+Author: Wido den Hollander <wido at 42on.com>
+Date:   Wed Jun 3 13:13:33 2015 +0200
+
+    rgw: Do not enclose the Bucket header in quotes
+    
+    Fixes: #11860
+    Signed-off-by: Wido den Hollander <wido at 42on.com>
+    (cherry picked from commit 8af25faed93fe02d3dad585b8579ce8b041cc4e6)
+
+commit a62c3aa1df9e0f79ac75d94083d10b902dbba382
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Apr 24 14:04:30 2015 +0800
+
+    ceph.in: handle unknown Exception correctly
+    
+    * in case parse_cmdargs() throws
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 7789eefc01deb9ca7fe90f5521aece3e36c3c350)
+
+commit cc7f7441c1d0457e840bfdc3413f9bc6d5f5134a
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Apr 24 01:27:44 2015 +0800
+
+    ceph.in: improve the interactive mode
+    
+    * if ceph is not reading from a tty, expect EOF instead of "quit"
+      as the end of input.
+    * do not panic at seeing the EOF
+    * update the test case test_mon_injectargs_SI(). since we disables
+      "ceph injectargs <args,...>" in a458bd83, in which the arguments
+      of "injectargs" are supposed to be consumed by "tell" instead.
+      so "ceph injectargs ..." is taken as an incomplete command, and
+      this command will bring ceph cli into the interactive mode,
+      redirecting its stdin to /dev/null helps ceph cli quit the loop,
+      but in a way of throwing EOFError exception. this change handles
+      the EOF, so the "ceph injectargs ..." does not throws anymore.
+      but the side effect is that the test fails since it expects a
+      non-zero return code. so replace it with an equivalent "tell"
+      command which also fails but due to the non-SI postfix.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit da9d2b4077ab1dceeed979ab71f0d9ed59b14266)
+
+commit eb26388cb985456e8f6e07a52a20fa912cf4efaa
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Apr 24 00:50:37 2015 +0800
+
+    ceph.in: parse quote correctly in interactive mode
+    
+    Fixes: #11279
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit bc7d8c99d2e16a141a8b575281ba12c67628dac3)
+
+commit 558d6391ecdfd5d716558341ce5d84ce1f7ec9c3
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri May 8 12:01:16 2015 +0800
+
+    json_sprit: fix the FTBFS on old gcc
+    
+    Fixes: #11574
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 6b68b27146852f057a3373cd04b08cd6917f3eea)
+
+commit 678b3e6082729698ce3575ba70313dd8399b1aed
+Author: Tim Serong <tserong at suse.com>
+Date:   Sat May 2 01:59:53 2015 +1000
+
+    json_spirit: use utf8 intenally when parsing \uHHHH
+    
+    When the python CLI is given non-ASCII characters, it converts them to
+    \uHHHH escapes in JSON.  json_spirit parses these internally into 16 bit
+    characters, which could only work if json_spirit were built to use
+    std::wstring, which it isn't; it's using std::string, so the high byte
+    ends up being zero'd, leaving the low byte which is effectively garbage.
+    
+    This hack^H^H^H^H change makes json_spirit convert to utf8 internally
+    instead, which can be stored just fine inside a std::string.
+    
+    Note that this implementation still assumes \uHHHH escapes are four hex
+    digits, so it'll only cope with characters in the Basic Multilingual
+    Plane.  Still, that's rather a lot more characters than it could cope
+    with before ;)
+    
+    (For characters outside the BMP, Python seems to generate escapes in the
+    form \uHHHHHHHH, i.e. 8 hex digits, which the current implementation
+    doesn't expect to see)
+    
+    Fixes: #7387
+    
+    Signed-off-by: Tim Serong <tserong at suse.com>
+    (cherry picked from commit 8add15b86e7aaef41397ab8fa9e77ee7957eb607)
+
+commit ef6641c0aa47c7f559aa56d7c35a5815afc2ba49
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Mar 23 21:26:23 2015 +0100
+
+    ceph.spec: update OpenSUSE BuildRequires
+    
+    OpenSUSE 13.2 needs libsnappy-devel but not bzip2-devel.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit bdac3dc3fb189688af52f60b0b34339dd8fea251)
+
+commit 0b6d4427ac7234fd509a9541adf45e303e40cb16 (refs/remotes/jashan/wip-hammer-11535-admin-socket, refs/remotes/gh/wip-hammer-11535-admin-socket)
+Author: Jon Bernard <jbernard at tuxion.com>
+Date:   Fri May 8 11:54:06 2015 -0400
+
+    common/admin_socket: close socket descriptor in destructor
+    
+    Long-running processes that do not reuse a single client connection will
+    see accumulating file descriptors as a result of not closing the
+    listening socket.  In this case, eventually the system will reach
+    file-max and subsequent connections will fail.
+    
+    Fixes: #11535
+    
+    Signed-off-by: Jon Bernard <jbernard at tuxion.com>
+    (cherry picked from commit 88fabb1ee6cd3c7d211ca46919055195e32245db)
diff --git a/doc/changelog/v0.94.4.txt b/doc/changelog/v0.94.4.txt
new file mode 100644
index 0000000..a99f871
--- /dev/null
+++ b/doc/changelog/v0.94.4.txt
@@ -0,0 +1,3576 @@
+commit 95292699291242794510b39ffde3f4df67898d3a (tag: refs/tags/v0.94.4, refs/remotes/gh/hammer)
+Author: Jenkins <jenkins at ceph.com>
+Date:   Mon Oct 19 07:43:50 2015 -0700
+
+    0.94.4
+
+commit 5764e233e56be08a59ffe6292f6fba9a76288aee
+Merge: 7f485ed b203979
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Oct 15 16:35:10 2015 -0400
+
+    Merge pull request #6287 from jcsp/wip-test-fixes
+    
+    git path backports for hammer
+
+commit b2039797638057dd74a8a47c99091c2c892b042e
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Apr 16 08:29:41 2015 -0700
+
+    use git://git.ceph.com
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 34c467ba06345eacd2fd0e79c162dfd0b22f0486)
+
+commit 0f4ef19047c58aacfb359bdd9d104f059aa2f5b4
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 24 18:10:46 2015 -0400
+
+    qa: http://ceph.com/qa -> http://download.ceph.com/qa
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d4d65fbd6ad15320339751c604613ac63511e645)
+
+commit 7f485ed5aa620fe982561663bf64356b7e2c38f2
+Merge: 3dc1de2 294f016
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Oct 13 00:28:52 2015 +0200
+
+    Merge pull request #6161 from dachary/wip-13227-hammer
+    
+    With root as default user, unable to have multiple RGW instances running
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 294f016ff84c7efef36ca94daef39fe2686df690
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu May 7 15:40:05 2015 -0700
+
+    init-radosgw.sysv: remove
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 9d8c115b0ab05cfc1db6670d1d367737e61fe0ea)
+
+commit 3dc1de22552065bd930cc3e42a486e29639927ba
+Merge: aa74de9 7de65e7
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:16:17 2015 -0700
+
+    Merge pull request #6166 from dachary/wip-13046-hammer
+    
+    RGW : setting max number of buckets for user via ceph.conf option
+
+commit aa74de9d34801552d7d3e0aced07b6bc5bd129b9
+Merge: d3e49eb 77cb503
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:15:21 2015 -0700
+
+    Merge pull request #6039 from ceph/wip-13015-hammer
+    
+    rgw: don't preserve acls when copying object
+
+commit d3e49ebce00d749c36fe8dc46a5c432b1b907126
+Merge: 417e948 424fc1c
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:14:47 2015 -0700
+
+    Merge pull request #6042 from dreamhost/wip-hammer-crossftp
+    
+    rgw: remove trailing :port from host for purposes of subdomain matching
+
+commit 417e948898d260a1ad6354244f9967ccbd75d768
+Merge: b5badcb 9ab9c44
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:14:09 2015 -0700
+
+    Merge pull request #6160 from dachary/wip-13228-hammer
+    
+    rgw: segments are read during HEAD on Swift DLO
+
+commit b5badcb47e565cd17145adca49abf07e167963e0
+Merge: e3f8df9 6119b15
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:13:25 2015 -0700
+
+    Merge pull request #6162 from dachary/wip-13226-hammer
+    
+    Keystone Fernet tokens break auth
+
+commit e3f8df9e12b434714b67036838f37b75ed1f9a25
+Merge: 8078233 ad83304
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:12:26 2015 -0700
+
+    Merge pull request #6163 from dachary/wip-13054-hammer
+    
+    rgw: region data still exist in region-map after region-map update
+
+commit 8078233ca1dda8eef3c59d6a92760365634cf41a
+Merge: dd64c78 4b0686f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:12:07 2015 -0700
+
+    Merge pull request #6164 from dachary/wip-13053-hammer
+    
+    rgw: GWWatcher::handle_error -> common/Mutex.cc: 95: FAILED assert(r == 0)
+
+commit dd64c7813bbdd2a6a4ffde6767c5d060ee1b9290
+Merge: 135c112 e80bd0a
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:11:16 2015 -0700
+
+    Merge pull request #5718 from dachary/wip-12859-hammer
+    
+    testGetContentType and testHead failed
+
+commit 135c112789d4925a735229394c0ec9e2b728d3ca
+Merge: fd17f3c 3b2affc
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:10:55 2015 -0700
+
+    Merge pull request #5860 from lebauce/wip-12960-hammer
+    
+    rgw: add delimiter to prefix only when path is specified
+
+commit fd17f3ccbf98832098bd1cd35fe2a5d567b51f4c
+Merge: 036c718 297c04d
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 08:08:59 2015 -0700
+
+    Merge pull request #6165 from dachary/wip-13052-hammer
+    
+    rgw: init_rados failed leads to repeated delete
+
+commit 036c7186f9304e4e48ecf50a4299cf74d55875fe
+Merge: 629b631 698d75c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Oct 9 09:17:19 2015 +0200
+
+    Merge pull request #6201 from dachary/wip-13410-hammer
+    
+    TEST_crush_rule_create_erasure consistently fails on i386 builder
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 629b631488f044150422371ac77dfc005f3de1bc
+Merge: 70e612a 0a5b856
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Oct 8 12:18:49 2015 -0400
+
+    Merge pull request #5885 from Abhishekvrshny/wip-13034-hammer
+    
+    osd: copy-from doesn't preserve truncate_{seq,size}
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 698d75c11fa116d6546b09d14484d094fae8f6d7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Jul 22 10:42:32 2015 +0200
+
+    tests: robust test for the pool create crushmap test
+    
+    The test that goes with f1e86be589803596e86acc964ac5c5c03b4038d8 to
+    verify that a bugous crush ruleset will prevent the creation of a pool
+    trying to use it was fragile. I depends on the implementation of the
+    erasure code lrc plugin and turns out to not work on i386.
+    
+    The test is modified to use a fake crushtool that always returns false
+    and validate that it prevents the creation of a pool, which demonstrate
+    it is used for crushmap validation prior to the pool creation.
+    
+    http://tracker.ceph.com/issues/12419 Fixes: #12419
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit e47903727b5d53f795014bf29b417d357f2bd65a)
+
+commit 70e612a395f7f5daf2fa289d8ae522824ef7a38f
+Merge: 0650862 2a28114
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Oct 8 00:09:24 2015 +0200
+
+    Merge pull request #6192 from dachary/wip-13401-hammer
+    
+    mon: fix crush testing for new pools
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 2a28114053fbf4ceee09558790ad3cf755270d5f
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Aug 21 16:40:34 2015 -0400
+
+    crush/CrushTester: test fewer inputs when running crushtool
+    
+    If there are a lot of crush rules (say, 100) then the test can
+    take a long time.  100 values per rule should be enough to catch
+    most issues.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 0f82f461b33d93d868e185912a2c7e4074d06900)
+    
+    Conflicts:
+    	src/crush/CrushTester.cc
+    	  in hammer the crushtool validation is via a shell
+        	  and not via an internal subprocess utility
+
+commit abc5b5f139b05da0be0fbaa99282be16386980db
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun Sep 20 23:42:45 2015 +0200
+
+    tests: update to match crushmap validation message
+    
+    http://tracker.ceph.com/issues/13182 Fixes: #13182
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 21a1e75d8a7bad89a48cd9d36902c5d609be5015)
+    
+    Conflicts:
+    	qa/workunits/cephtool/test.sh
+    	  the test structure in hammer is different, adapt
+    	  the relevant test.
+
+commit 25bd2778f8b7f5eb5245efebca56a7348dd064eb
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 18 09:42:47 2015 -0400
+
+    mon/OSDMonitor: fix crush injection error message
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1b3090d50e5bd5ca3e6e396b23d2d9826896c718)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc
+    	  hammer has a separate error message for EINTR
+    	  which is in the context of the fix for error message
+
+commit 6635530aa94b1f21c3052e64d4dfe3952f98fe83
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 18 09:41:25 2015 -0400
+
+    mon/OSDMonitor: only test crush ruleset for the newly created pool
+    
+    Otherwise, we test *all* crush rules.. which might be a lot, and
+    which is a big waste of time and effort.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 524b0bdcc45c2f4b95f2239c988e93250f337f3d)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc : trivial resolution
+
+commit cc1fedda02fbf3c95d7a00f0b395db5439e96f90
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 18 09:40:13 2015 -0400
+
+    crush/CrushTester: allow testing by ruleset
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit aa238e5ed50f44a94caf84567267e4f6be8732a2)
+    
+    Conflicts:
+    	src/crush/CrushTester.cc
+              in hammer the crushtool validation is via a shell
+    	  and not via an internal subprocess utility
+    	src/tools/crushtool.cc
+    	  ceph_argparse_withint is preferred to ceph_argparse_witharg
+
+commit 065086246290cfa02f67c37c95a2ccdb05872f21
+Merge: 79385a8 3a50b90
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 6 11:11:14 2015 -0400
+
+    Merge pull request #5887 from Abhishekvrshny/wip-13044-hammer
+    
+    LibCephFS.GetPoolId failure
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 79385a85beea9bccd82c99b6bda653f0224c4fcd
+Merge: 5b25fc9 3228161
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Oct 4 15:33:49 2015 +0200
+
+    Merge pull request #6172 from dachary/wip-13354-hammer
+    
+    qa/workunits/cephtool/test.sh: don't assume crash_replay_interval=45
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 322816116ea14a8fd79616b1c55545ae7c62e7f6
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 28 13:13:40 2015 -0400
+
+    qa/workunits/cephtool/test.sh: don't assume crash_replay_interval=45
+    
+    e.g., it's 5 in teuthology's ceph.conf.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 80b7237e5e74d12b9d8b1f96ea535c96bdff9c6f)
+
+commit ad833044dee4208625213bc83c7847ce9d1a73aa
+Author: dwj192 <duanweijun at h3c.com>
+Date:   Wed Sep 9 09:48:16 2015 +0800
+
+    rgw:add --reset-regions for regionmap update
+    
+    Fixes: #12964
+    
+    Signed-off-by: Weijun Duan <duanweijun at h3c.com>
+    (cherry picked from commit 95685c19d6f1eab50b903e61273b5351bedc2980)
+    
+    Conflicts:
+    	src/rgw/rgw_admin.cc: usage is on cerr in hammer, not cout
+            src/test/cli/radosgw-admin/help.t: remove extra empty line
+
+commit 5b25fc9c8431423c6239da2eafcf7e8863d2262f
+Merge: e72bdc3 9026c4a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Oct 3 09:39:12 2015 +0200
+
+    Merge pull request #6156 from dachary/wip-13170-hammer
+    
+    doc: update docs to point to download.ceph.com
+    
+    Reviewed-by: Abhishek Varshney <abhishek.varshney at flipkart.com>
+
+commit 7de65e7ede52f3e417c354f180cfd80f1407c6cb
+Author: Vikhyat Umrao <vumrao at redhat.com>
+Date:   Thu Sep 3 12:02:05 2015 +0530
+
+    rgw : setting max number of buckets for users via ceph.conf option
+    
+    This patch adds a new option "rgw_user_max_buckets" for setting
+    max number of buckets for users via ceph.conf.
+    
+    Fixes #12714
+    
+    Signed-off-by: Vikhyat Umrao <vumrao at redhat.com>
+    (cherry picked from commit f65267c96cbd4cd25036b6bf399692e77bbb9436)
+    
+    Conflicts:
+    	src/rgw/rgw_admin.cc: usage is on cerr in hammer, not cout
+
+commit 297c04d856c4864d21b2241ad01560afa61dde40
+Author: Xiaowei Chen <cxwshawn at gmail.com>
+Date:   Tue Sep 8 06:58:57 2015 -0400
+
+    rgw: init_rados failed leads to repeated delete
+    
+    Fixes: #12978
+    
+    Signed-off-by: Xiaowei Chen <chen.xiaowei at h3c.com>
+    (cherry picked from commit ab4232baa7bcc86e90746e13312ac9bda1772872)
+
+commit 4b0686f18f323b95adb1fc5cffe7c1e55e8f1c63
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Aug 26 15:08:18 2015 -0700
+
+    rgw: delete finisher only after finalizing watches
+    
+    Fixes: #12208
+    
+    The watch error path might try to schedule a finisher work, delete finisher
+    only after watch destruction.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 97aed59fb9e865d30d31d2b7f4e93fc9727c96fa)
+
+commit 6119b152412ddfa2a614c1862aad52a123a4fe8e
+Author: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+Date:   Mon Aug 24 23:11:35 2015 +0530
+
+    rgw: be more flexible with iso8601 timestamps
+    
+    make parsing 8601 more flexible by not restricting the length of seconds
+    to 5, this allows timestamp to be specified both as ms or us. Newer
+    keystone backends such as fernet token backend default to microseconds
+    when publishing iso8601 timestamps, so this allows these timestamps to
+    be allowed when specifying the token expiry time.
+    
+    Fixes: #12761
+    Reported-by: Ian Unruh <ianunruh at gmail.com>
+    Signed-off-by: Abhishek Lekshmanan <abhishek.lekshmanan at ril.com>
+    (cherry picked from commit 136242b5612b8bbf260910b1678389361e86d22a)
+
+commit 607904e8d5616bd7df20e1e387a14d55e4ca43b6
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Sep 22 14:12:02 2015 -0400
+
+    init-radosgw: specify pid file to start-stop-daemon
+    
+    This fixes restart when multiple instances are running.
+    
+    Fixes: #12407
+    Tested-by: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e17c8e1a7a06db0e2680dedc7e954021610320d1)
+
+commit f51ab26d8721bde6852e5c169869d7ae16bd0574
+Author: Vikhyat Umrao <vumrao at redhat.com>
+Date:   Thu Jul 23 18:10:06 2015 +0530
+
+    rgw: fix radosgw start-up script.
+    
+    radosgw init script is unable to start radosgw daemon.
+    as it is relies on requiretty being disabled.
+    once init script start this daemon with sudo it fails
+    to start the daemon.
+    
+    changing 'sudo' to 'su', it will fix this issue and
+    will also help running radosgw daemon with our new
+    "ceph" UID project.
+    
+    Fixes: #10927
+    
+    Signed-off-by: Vikhyat Umrao <vumrao at redhat.com>
+    (cherry picked from commit c83542296aeb8f5dd96f5d9e09327e7a89370742)
+
+commit 544a98fa9dd47d02778f622de5f7ebe1acccc12f
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu May 7 15:39:22 2015 -0700
+
+    init-radosgw: unify init-radosgw[.sysv]
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1c45f512a91ee49e9253ba6fd3857af9bd2ae57a)
+
+commit 2a733e9e720bcdb8ea342a96be679d6f9efa3b2b
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu May 7 15:29:11 2015 -0700
+
+    init-radosgw: look in /var/lib/ceph/radosgw
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a4bb992426b39188e750fce9198052ca0d510117)
+
+commit d00c52b874ddc74aa5f4c2e07b70b881ce963114
+Author: Nathan Cutler <ncutler at suse.cz>
+Date:   Sun May 10 18:17:53 2015 +0200
+
+    doc: rgw: fix typo in comments
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.cz>
+    (cherry picked from commit 05cf0db22dc3a9cb2bf4b86b8f240683c23f41ac)
+
+commit eb001d3a7275cc040bea716b8bdb0cf8b97efbc9
+Author: Dmitry Yatsushkevich <dyatsushkevich at mirantis.com>
+Date:   Tue Mar 17 15:44:52 2015 -0700
+
+    rgw: init script waits until the radosgw stops
+    
+    Fixes: #11140
+    Init script waits in stop action until the radowgw daemons stop.
+    
+    Signed-off-by: Dmitry Yatsushkevich <dyatsushkevich at mirantis.com>
+    (cherry picked from commit 1cca0c1e91a1e18f82f4d22855e96b2fc947f5ea)
+
+commit 9ab9c44583c96f1679db3dbcef322a706548a7dd
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Sep 17 09:10:39 2015 -0700
+
+    rgw: don't read actual data on user manifest HEAD
+    
+    Fixes: #12780
+    We unconditionally read all the data, which is not needed
+    when doing HEAD operation on user manifest objects.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 4a8b08d1dd2511e28e999f1625103fb919fb5465)
+
+commit 9026c4a7c7699a9a013d4fe207e6681403f934a6
+Author: Alfredo Deza <adeza at redhat.com>
+Date:   Fri Sep 18 14:20:12 2015 -0400
+
+    doc: remove mention of ceph-extra as a requirement
+    
+    Signed-off-by: Alfredo Deza <adeza at redhat.com>
+    (cherry picked from commit a6f07e9fa3bd5e50a2d8cfa387b44a39d383fa65)
+
+commit 45ed24da879fe12b921cf03e4a921ccc0582b8d2
+Author: Alfredo Deza <adeza at redhat.com>
+Date:   Fri Sep 18 14:13:21 2015 -0400
+
+    doc: remove ceph-extras
+    
+    Signed-off-by: Alfredo Deza <adeza at redhat.com>
+    (cherry picked from commit c0ef84fd22aac58b6ec8e58eb4f8dffed306d39e)
+
+commit faccdce79e003318c751dd9203773af7ed31d052
+Author: Alfredo Deza <adeza at redhat.com>
+Date:   Fri Sep 18 14:13:02 2015 -0400
+
+    doc: correct links to download.ceph.com
+    
+    Signed-off-by: Alfredo Deza <adeza at redhat.com>
+    (cherry picked from commit 387d7800359154950431d0984c756f43f21dd9b4)
+
+commit e9f4aecf3f406b42b74f840edb398be9243da85a
+Author: ritz303 <ritz_303 at yahoo.com>
+Date:   Tue Aug 25 10:02:49 2015 -0500
+
+    doc: Added "Hammer" in the list of major releases.
+    
+    Fixes: #12771
+    
+    Signed-off-by: ritz303 <ritz_303 at yahoo.com>
+    (cherry picked from commit 582f0f64455079290ad3b4ae7338b716e170911f)
+
+commit 424fc1ccb244f5084f94904cb20cbf88a1bd4638
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Sep 25 10:44:40 2015 -0700
+
+    rgw: set default value for env->get() call
+    
+    Fixes: #13239
+    
+    This fixes a regression introduced at commit abe4ec293d08b0314bf5c081ace2456073f3a22c.
+    The host var is a string, env->get() returns a char pointer, shouldn't
+    pass in NULL.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 0d5730efc0054334897315dc23ba04f30548e36e)
+    Signed-off-by: Robin H. Johnson <robin.johnson at dreamhost.com>
+
+commit e72bdc3bf1541e445f74def70b5aa185f1757468
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Sep 21 11:41:03 2015 -0400
+
+    osd/ReplicatedPG: tolerate promotion completion with stopped agent
+    
+    We may start a promotion, then get a pool update that disables the
+    agent, and then complete it.  We should not segfault in this case.
+    
+    Fixes: #13190
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit fd9ce66e8b76787f69c5e337332d57aa72c8b8d5)
+
+commit a3afb3f59435050efa711436134b4abe63a8f5cf
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jun 9 14:15:10 2015 -0400
+
+    rgw: remove trailing :port from host for purposes of subdomain matching
+    
+    Some clients (ahem, CrossFTP) include the :port in the HTTP_HOST header.
+    Strip it out.
+    
+    Switch req_info field to a std::string and avoid copying it in preprocess.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit abe4ec293d08b0314bf5c081ace2456073f3a22c)
+
+commit fe0fc4f18f6f275b34e8bbfa868a7310ecc3842f
+Merge: e26f8bc 8ba6b2f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Sep 24 14:01:26 2015 -0700
+
+    Merge pull request #5715 from dachary/wip-12592-hammer
+    
+    RGW returns requested bucket name raw in Bucket response header
+
+commit e26f8bc2dbc82b6ff31d2bd2d5c890aa12da9f4a
+Merge: 19e549e 6acf36f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Sep 24 14:00:55 2015 -0700
+
+    Merge pull request #5719 from dachary/wip-12855-hammer
+    
+    segmentation fault when rgw_gc_max_objs > HASH_PRIME
+
+commit 19e549e9c2fbacdbf747344c1dafcc6b66902339
+Merge: 2b11a4c a13c7fd
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Sep 24 14:00:09 2015 -0700
+
+    Merge pull request #5720 from dachary/wip-12854-hammer
+    
+    the arguments 'domain' should not be assigned when return false
+
+commit 77cb503ba057f033825aa40d57dee42e838c67ac (refs/remotes/gh/wip-13015-hammer)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Sep 9 15:41:02 2015 -0700
+
+    rgw: preserve all attrs if intra-zone copy
+    
+    Fixes: #13015
+    Intra zone copy requires that all objects' attributes are preserved.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit b9f2ed303eedfa0b747884f8e66fbe97cfeeb0d5
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Aug 13 10:59:32 2015 -0700
+
+    rgw: don't preserve acls when copying object
+    
+    Fixes: #12370
+    
+    When copying an object we need to use the acls we calculated earlier,
+    and not the source acls.
+    This was broken at e41d97c8e38bb60d7e09e9801c0179efe7af1734.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fb020247449d3daf033885bab5b3a10c0e5df4a5)
+
+commit 2b11a4c07a9416a2f75c8ce62a923994977d799c
+Merge: 0022c03 b3822f1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Sep 15 10:23:49 2015 +0200
+
+    Merge pull request #5930 from liewegas/wip-11798-hammer
+    
+    upstart: limit respawn to 3 in 30 mins (instead of 5 in 30s)
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 0022c035476eff471a777b23a619d024f632a1bf
+Merge: 23fb811 0d6a8c6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 14 23:57:13 2015 +0200
+
+    Merge pull request #5908 from liewegas/wip-simple-connect-hammer
+    
+    Pipe: Drop connect_seq increase line
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit b3822f113e07547194b844f647bcb7d45513b25f (refs/remotes/me/wip-11798-hammer)
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jun 3 14:57:34 2015 -0400
+
+    upstart: limit respawn to 3 in 30 mins (instead of 5 in 30s)
+    
+    It may take tens of seconds to restart each time, so 5 in 30s does not stop
+    the crash on startup respawn loop in many cases.  In particular, we'd like
+    to catch the case where the internal heartbeats fail.
+    
+    This should be enough for all but the most sluggish of OSDs and capture
+    many cases of failure shortly after startup.
+    
+    Fixes: #11798
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit eaff6cb24ef052c54dfa2131811758e335f19939)
+
+commit 0d6a8c631f55367ac4f6f792a10ba62cd97e9fed (refs/remotes/me/wip-simple-connect-hammer)
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Wed Feb 25 23:38:54 2015 +0800
+
+    Pipe: Drop connect_seq increase line
+    
+    Revert commit 0fc47e267b6f8dcd4511d887d5ad37d460374c25.
+    
+    When accepting and "connect.connect_seq == existing->connect_seq",
+    existing->state maybe STATE_OPEN, STATE_STANDBY or STANDY_CONNECTING.
+    This commit only fix partial problem and want to assert
+    "(existing->state == STATE_CONNECTING)".
+    
+    So later we added codes to catch
+    "(existing->state == STATE_OPEN || existing->state == STATE_STANDBY)"
+    before asserting.
+    
+    Backport: dumpling, firefly, giant
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 67225cb3ee1f6d274a02293724942bdb25cec8ca)
+
+commit 23fb811303971152f1c348e2a02de4e2bc6ed53d
+Merge: c1849ec 6c4ccc8
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Sep 13 14:10:23 2015 +0200
+
+    Merge pull request #5767 from dachary/wip-12597-hammer
+    
+    Crash during shutdown after writeback blocked by IO errors
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit c1849ecfb2ae55b99b6db75ee49af19886c246b2
+Merge: f35c53d f028389
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Sep 13 07:42:36 2015 -0400
+
+    Merge pull request #5687 from liewegas/wip-hammer-feature-hammer
+    
+    include/ceph_features: define HAMMER_0_94_4 feature
+
+commit f35c53df7c155d7ff4a316a0817b11bc018c57ca
+Merge: 6e22620 4be8a28
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Sep 12 09:23:13 2015 -0400
+
+    Merge pull request #5892 from ceph/wip-13060-hammer
+    
+    osd: allow peek_map_epoch to return an error
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit 4be8a28d5b5ba868d100300ab64ebb82b188222b
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 11 11:00:38 2015 -0400
+
+    osd/PG: peek_map_epoch: skip legacy PGs if infos object is missing
+    
+    - pg is removed
+    - osd is stopped before pg is fully removed
+    - on restart, we ignore/skip the pg because its epoch is too old
+    - we upgrade to hammer and convert other pgs, skipping this one, and then
+      remove the legacy infos object
+    - hammer starts, tries to parse the legacy pg, and fails because the infos
+      object is gone, crashing.
+    
+    The fix is to continue ignoring the zombie pg.
+    
+    Fixes: #16030
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit f237ed97228839a1b412ad213945f0343df05bf5
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Sep 11 17:41:01 2015 -0400
+
+    osd: allow peek_map_epoch to return an error
+    
+    Allow PG::peek_map_epoch to return an error indicating the PG
+    should be skipped.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f15d9585edc5a12ac2d076951076247253b897c2)
+    
+    [fixed *pepoch default of 0]
+    [fixed other return paths in peek_map_epoch]
+
+commit 3a50b904a2ffd613b695ead1b26c93278044d7df
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Wed Aug 5 15:19:13 2015 +0800
+
+    crypto: fix unbalanced ceph::crypto::init/ceph::crypto:shutdown
+    
+    we may create a CephContext without calling common_init_finish(), then
+    delete the CephContext. In this case, ceph::crypto:init() is not called,
+    so CephContext::~CephContext() should not call ceph::crypto::shutdown().
+    
+    Fixes: #12598
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 98a85ec6464d8ec3fc7f0c647ac97c8cf002ebe2)
+
+commit 0a5b8569ecc6efa42b3d4fa7a58c155b3c2dbbe8
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Jul 30 16:59:32 2015 -0700
+
+    ReplicatedPG,Objecter: copy_get should include truncate_seq and size
+    
+    Otherwise, we break CephFS over cache tiers.
+    
+    Fixes: #12551
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 6f9ee7961eee9ee3a61a07cbe0d8d289ee98fa9a)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc
+
+commit 6e22620165872a88ab4b75ed2fb93f61beb65d12
+Merge: 508733f 00e73ad
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Sep 9 19:44:09 2015 -0400
+
+    Merge pull request #5769 from dachary/wip-12850-hammer
+    
+    Crash during TestInternal.MultipleResize
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 508733fd48f2c704b79ad36841346965f4d0429b
+Merge: 69a320e dc693fc
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Sep 9 19:44:01 2015 -0400
+
+    Merge pull request #5768 from dachary/wip-12849-hammer
+    
+    [  FAILED  ] TestLibRBD.BlockingAIO
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 82ea02ab8d886c16c511c4bd7d03d826158f954b
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jun 17 11:35:18 2015 -0700
+
+    rgw: fix assignment of copy obj attributes
+    
+    Fixes: #11563
+    Clarify the confusing usage of set_copy_attrs() by switching the source and
+    destinatiion params (attrs, src_attrs). Switch to use attrs instead of
+    src_attrs afterwards. In one of the cases we originally used the wrong
+    variable.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit e41d97c8e38bb60d7e09e9801c0179efe7af1734)
+
+commit 3b2affce1a229cead3e0ffacfdfde69258a267cb
+Author: Sylvain Baubeau <sbaubeau at redhat.com>
+Date:   Fri Sep 4 22:51:44 2015 +0200
+
+    rgw: add delimiter to prefix only when path is specified
+    
+    http://tracker.ceph.com/issues/12960
+    Fixes: #12960
+    
+    Signed-off-by: Sylvain Baubeau <sbaubeau at redhat.com>
+    (cherry picked from commit 27cf257248ea55f8f4bc7851c3956611828bcae2)
+
+commit 69a320e185f20da0824d0a62d3de77578c431a7a
+Merge: 8039375 0bc909e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 9 16:58:56 2015 +0200
+
+    Merge pull request #5697 from tchaikov/wip-12638-hammer
+    
+    mon: add a cache layer over MonitorDBStore
+    
+    Reviewed-by: Joao Eduardo Luis <joao at suse.de>
+
+commit 8039375327b5074a700193aae2d8b1922ca85398
+Merge: 19ff928 256620e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 9 14:52:54 2015 +0200
+
+    Merge pull request #5381 from dachary/wip-12499-hammer
+    
+    ceph-fuse 0.94.2-1trusty segfaults / aborts
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 19ff92806fd1e0fb866737f58e379aa8078b8017
+Merge: 7614bf7 059bf98
+Author: David Zafman <dzafman at redhat.com>
+Date:   Tue Sep 8 14:58:16 2015 -0700
+
+    Merge pull request #5757 from dachary/wip-12836-hammer
+    
+    WBThrottle::clear_object: signal on cond when we reduce throttle values
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit 7614bf7d117fdd476931cdd8825265321cef3c4c
+Merge: 2100631 bf72785
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:06:30 2015 +0200
+
+    Merge pull request #5759 from dachary/wip-12841-hammer
+    
+    recursive lock of md_config_t (0)
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 210063120708a7d6502c2b8d3e8c61731e37de5b
+Merge: a2e1fe2 836f763
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:05:41 2015 +0200
+
+    Merge pull request #5761 from dachary/wip-12843-hammer
+    
+    long standing slow requests: connection->session->waiting_for_map->connection ref cycle
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a2e1fe26f602d0165999dfb72b97985f9bfe38ce
+Merge: 8ccb771 2348a5b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:04:51 2015 +0200
+
+    Merge pull request #5762 from dachary/wip-12844-hammer
+    
+    osd suicide timeout during peering - search for missing objects
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 8ccb7711d68dd3b95d2522c6e46f5021362c9088
+Merge: e9db807 77624af
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:04:03 2015 +0200
+
+    Merge pull request #5763 from dachary/wip-12846-hammer
+    
+    osd/PGLog.cc: 732: FAILED assert(log.log.size() == log_keys_debug.size())
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit e9db8075034dc4ac0ffe5d8dd9dd2153509237fa
+Merge: 5ef999e aa00373
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:03:10 2015 +0200
+
+    Merge pull request #5764 from dachary/wip-12847-hammer
+    
+    common: do not insert emtpy ptr when rebuild emtpy bufferlist
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 5ef999e4a1dc04d7b7e58b1a61f85511099fd6d4
+Merge: c243f7a cd11b88
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:02:14 2015 +0200
+
+    Merge pull request #5373 from dachary/wip-12489-hammer
+    
+    pg_interval_t::check_new_interval - for ec pool, should not rely on min_size to determine if the PG was active at the interval
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c243f7a33b0fff261bb92595a3cc7abf12b7e56d
+Merge: e61fdc6 7bddf5d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 10:00:32 2015 +0200
+
+    Merge pull request #5383 from dachary/wip-12504-hammer
+    
+    rest-bench common/WorkQueue.cc: 54: FAILED assert(_threads.empty())
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit e61fdc67031b0358800335b638c96d22ecb85bd6
+Merge: 62f543b 9f69660
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 09:54:07 2015 +0200
+
+    Merge pull request #5765 from dachary/wip-12883-hammer
+    
+    cache agent is idle although one object is left in the cache
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 62f543bbb092554746d3b89aab4b1ea75a5cdbf1
+Merge: f25315c e471c5d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 09:53:14 2015 +0200
+
+    Merge pull request #5754 from dachary/wip-12588-hammer
+    
+    Change radosgw pools default crush ruleset
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit f25315c1e7e6e4700c2f39ba849dbcb25b0f1f89
+Merge: 021abe7 43a72e4
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Sep 7 09:51:50 2015 +0200
+
+    Merge pull request #5377 from dachary/wip-12396-hammer
+    
+    register_new_pgs() should check ruleno instead of its index
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 021abe742ccec876497468ac556b9dfaf6c9503d
+Merge: 4125196 c94fd92
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Sep 6 21:07:38 2015 -0400
+
+    Merge pull request #5758 from dachary/wip-12839-hammer
+    
+    Mutex Assert from PipeConnection::try_get_pipe
+
+commit 9f69660133f9534722589801a6fc827b74bead44
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Aug 13 19:41:47 2015 +0200
+
+    tests: tiering agent and proxy read
+    
+    Verify that an object promoted to a cache tier because of a proxy read
+    is evicted as expected.
+    
+    http://tracker.ceph.com/issues/12673 Refs: #12673
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 7924231930732bd297d3bd034c8295e96cb81088)
+
+commit 5656eec0000e95ea790c796a9f572c7261163cfa
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Aug 13 13:47:24 2015 +0200
+
+    osd: trigger the cache agent after a promotion
+    
+    When a proxy read happens, the object promotion is done in parallel. The
+    agent_choose_mode function must be called to reconsider the situation
+    to protect against the following scenario:
+    
+      * proxy read
+      * agent_choose_mode finds no object exists and the agent
+        goes idle
+      * object promotion happens
+      * the agent does not reconsider and eviction does not happen
+        although it should
+    
+    http://tracker.ceph.com/issues/12673 Fixes: #12673
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit e1f58feb9b1d20b72f2eb2eefdea5982e0cddccd)
+
+commit 4125196d31de8933656561b2f860e16a546ec4b9
+Merge: 47af509 f47ba4b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Sep 6 23:17:22 2015 +0200
+
+    Merge pull request #5276 from dachary/wip-11824-hammer
+    
+    implicit erasure code crush ruleset is not validated
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 47af509003e551238702858ccd845b930e5ef1ed
+Merge: 2fd8ec8 1e05578
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Sep 6 17:24:43 2015 +0200
+
+    Merge pull request #5382 from dachary/wip-12500-hammer
+    
+    segfault launching ceph-fuse with bad --name
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 2fd8ec8385a90daaa1bdb9de189ec73c7ba49c6c
+Merge: e6bdae9 fa19474
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Sep 6 17:23:19 2015 +0200
+
+    Merge pull request #5367 from dachary/wip-12311-hammer
+    
+    read on chunk-aligned xattr not handled
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit dc693fcaf2c596087b434f9e90fbc553394b9a14
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Jul 29 12:46:24 2015 -0400
+
+    lockdep: allow lockdep to be dynamically enabled/disabled
+    
+    librbd test cases attempt to enable lockdep coverage via the librados
+    API.  Use a configuration observer to register/unregister lockdep
+    support.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit af0cade0293be22e74a3293765676c7b227b06c4)
+
+commit 805732b143fd28603238969ba784adb57eff1a12
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jul 28 14:23:14 2015 -0400
+
+    tests: librbd API test cannot use private md_config_t struct
+    
+    Remove all depencencies on md_config_t and instead use librados API
+    methods to get/set configuration values.
+    
+    Fixes: #12479
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 2c51aadb447d3447b5dace19c5cb6268e94247c8)
+
+commit 7ac01731bcb0f1d46cf98ecf623c7e8e6cb1a38e
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 9 15:06:27 2015 -0400
+
+    tests: ensure old-format RBD tests still work
+    
+    Override the RBD default image format back to version 1
+    to ensure tests properly cover the old format.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3b95edb5bd373bd05f83516eccfd30a6b5cf4693)
+
+commit b68d7574d12944589b246281474bcad01f5347be
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jul 30 09:00:57 2015 -0400
+
+    librados_test_stub: implement conf get/set API methods
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4d03c664f2a9362009c7e3077ed65e2989f0f21b)
+
+commit f0fa637e4a91a93a326ba303bc22101fadcc787d
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jul 28 13:14:29 2015 -0400
+
+    crypto: use NSS_InitContext/NSS_ShutdownContex to avoid memory leak
+    
+    Switched to context-aware NSS init/shutdown functions to avoid conflicts
+    with parent application.  Use a reference counter to properly shutdown the
+    NSS crypto library when the last CephContext is destroyed.  This avoids
+    memory leaks with the NSS library from users of librados.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 9fa0112dd9286178da1d76020158503b2062d252)
+
+commit 3f542aa2410139bece0f4192079e4e34260da782
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Sat Mar 21 07:13:51 2015 +0800
+
+    auth: use crypto_init_mutex to protect NSS_Shutdown()
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit cf058174fe6be26129eb52f4fb24d0f7146ef7af)
+
+commit e487e8e3d84c7845ce7824ace3e375c6c389ba20
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Sat Mar 21 01:02:42 2015 +0800
+
+    auth: reinitialize NSS modules after fork()
+    
+    Fixes: #11128
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 4c24d0cc074462ae258b5cf901cd884bb4f50a53)
+
+commit 00e73adb03ef4453599268779fe354e4e8513e54
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Aug 11 09:26:33 2015 -0400
+
+    librbd: prevent race condition between resize requests
+    
+    It was possible that the same resize request could be sent twice
+    if a completed resize op started a newly created resize op while
+    it was also being concurrently started by another thread.
+    
+    Fixes: #12664
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6ec431bac1cf9446f3af90209d193dfcf003f2c5)
+
+commit 6c4ccc854fa8a8403b03785b06cb35a7174f4f42
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Mon Mar 9 14:23:23 2015 +0800
+
+    librbd: Add a paramter:purge_on_error in ImageCtx::invalidate_cache().
+    
+    If bh_write met error, it will try again. For closing image, if met this
+    issue, it will trigger a assert:
+    >>2015-02-03 15:22:49.198292 7ff62d537800 -1 osdc/ObjectCacher.cc: In
+    function 'ObjectCacher::~ObjectCacher()' thread 7ff62d537800 time
+    >>2015-02-03 15:22:49.195927osdc/ObjectCacher.cc: 551: FAILED
+    >>assert(i->empty())
+    
+    Now add purge_on_error, when shutdown_cache it set true.
+    In ImageCtx::invalidate_cache, if met error and purge_on_error is true,
+    purge the dirty bh.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 35def5c81f7fc83d55d18320e4860c6a63d4c7f5)
+    
+    Conflicts:
+    	src/librbd/ImageCtx.cc : trivial resolution
+
+commit 05734916ab119c6d3879c2ce2bc9f9581907861a
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Thu Feb 5 11:28:50 2015 +0800
+
+    librbd: Remvoe unused func ImageCtx::read_from_cache.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 101440a41253680770f94bc380af7072c7adaebf)
+
+commit 28838f20a722b72a6e926e53f104342d3b9f4791
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Thu Feb 5 11:03:10 2015 +0800
+
+    osdc: clean up code in ObjectCacher::Object::map_write
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 9f80c2909ace09cd51c24b49c98a093e0e864dca)
+
+commit 5c4f152efa8e8f57c59ea7decc05ae1a34f2a9ee
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Thu Feb 5 10:13:06 2015 +0800
+
+    osdc: Don't pass mutex into ObjectCacher::_wait_for_write.
+    
+    Because the mutex is the same as ObjectCacher::lock.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit d7cf7aeea5cba1ffa8e51ff1ad2424b1ec161a12)
+
+commit 86e7698a19745c26b9d3e7a12a16c87ea9a5d565
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Mon Mar 2 11:23:44 2015 +0800
+
+    osdc: After write try merge bh.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 1a48a8a2b222e41236341cb1241f0885a1b0b9d8)
+
+commit c96541ad19fb142ed31ff3006f1dc25e0c1de86c
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Mon Mar 2 11:36:24 2015 +0800
+
+    osdc: Make last missing bh to wake up the reader.
+    
+    Avoid wakeup early and wait again.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit d582bda090b3339d03e25b0e6d0971ad0267f476)
+
+commit 4135b9a2d199583685a1bae3713347dcc1b872e6
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Fri Feb 6 09:53:36 2015 +0800
+
+    osdc: For trust_enoent is true, there is only one extent.
+    
+    Now the judgement only in conditon which will return -ENOENT.
+    But o->exists don't depend on the extent size. It only depend on
+    trust_enoent. So move this judgement at the first of _readx().
+    Make this bug ASAP occur.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 2449fddc13b5ce8bbf1bb4ecaa5d6937f54e54d1)
+
+commit 81376b6a1a5db9f8b45c58ea318ec924e932d990
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Tue Feb 3 14:46:39 2015 +0800
+
+    osdc: In _readx() only no error can tidy read result.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 540346d4a901d8041c9fd74641c98cdfd2e1ab32)
+
+commit e6bdae903cdd2f702829adc31fa9a31c239a3b87
+Merge: 317770d cdde626
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Fri Sep 4 15:38:43 2015 -0600
+
+    Merge pull request #5223 from SUSE/wip-12305-hammer
+    
+    ceph.spec.in: running fdupes unnecessarily
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit e80bd0a2a39afdabcb134100e0cc8fa74cbd14c2
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Thu Jun 25 18:28:50 2015 +0200
+
+    rgw: send Content-Length in response for GET on Swift account.
+    
+    Fixes: #12158
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 5f47b11791cd46ce2771046e4888575869cc9685)
+    Conflicts:
+    	src/rgw/rgw_rest_swift.cc
+
+commit 2e542456dee6c30b3200e9830d4ccae4b0325388
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Mon Jun 22 13:51:49 2015 +0200
+
+    rgw: force content_type for swift bucket stats request
+    
+    Fixes: 12095
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit da259e4da1329e1e448d75c48c6ee3d1318e19b2)
+
+commit 5d57b63c32e43000ff95c2d8ce34347ed0579a8a
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Aug 13 15:02:03 2015 +0200
+
+    rgw: we should not overide Swift sent content type
+    
+    Fixes: #12363
+    backport: hammer
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit 423cf136f15df3099c9266f55932542d303c2713)
+
+commit b8aafbc6f9f80f029606a577d73f8685a80225b8
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Tue Jun 23 11:54:09 2015 +0200
+
+    rgw: enforce Content-Type in Swift responses.
+    
+    Swift sends Content-Type HTTP header even if the response
+    doesn't contain body. We have this behaviour implemented
+    until applying some changes in end_header() function.
+    Unfortunately, lack of Content-Type causes early exits in
+    many Tempest's tests for Swift API verification.
+    
+    Fixes: #12157
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 106aeba206736d4080326f9bc191876bed63370b)
+
+commit 143cfc331efcc7bed8b1cf90d7e3188d0ac7604b
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Tue Apr 21 12:31:19 2015 +0200
+
+    rgw: force content-type header for swift account responses without body
+    
+    This regression was introduced in commit 4cfeca03ade21861ab70ca759f94eb244c16cb39
+    
+    Fixes: #11438
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit 009664e560ee37ef6dc170a0155d6c749e151b06)
+
+commit b5420d6f1a6a1da34c7bba339e6763c4b369d349
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Thu Apr 9 20:04:59 2015 +0200
+
+    rgw: shouldn't return content-type: application/xml if content length is 0
+    
+    Fixed: #11091
+    
+    Signed-off-by: Orit Wasserman <owasserm at redhat.com>
+    (cherry picked from commit 5cc92bb27cfbaee4af24dc312c9b98331f899794)
+
+commit 317770dd39510221cbc0fc7ee50960992137eaaf
+Merge: 6b02be7 6b36514
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Sep 3 12:20:38 2015 +0200
+
+    Merge pull request #5716 from dachary/wip-12851-hammer
+    
+    Ensure that swift keys don't include backslashes
+    
+    Reviewed-by: Orit Wasserman <owasserm at redhat.com>
+
+commit 6b02be7395ad8f41f70458e7bd11630ddd498cc5
+Merge: fa74ea1 f1c7c62
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Sep 3 12:11:24 2015 +0200
+
+    Merge pull request #5717 from dachary/wip-12591-hammer
+    
+    rgw: create a tool for orphaned objects cleanup
+    
+    Reviewed-by: Orit Wasserman <owasserm at redhat.com>
+
+commit fa74ea10ac25fe93f359ccf0fd036d567e9610fe
+Merge: 011e4c5 a478385
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 23:35:58 2015 +0200
+
+    Merge pull request #5755 from dachary/wip-12589-hammer
+    
+    ceph-disk zap should ensure block device
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 011e4c58ffb41aa5ae3240a40cbeba8266b89001
+Merge: e7c2269 b80859e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 23:22:59 2015 +0200
+
+    Merge pull request #5732 from ceph/wip-11455-hammer
+    
+    rgw: init some manifest fields when handling explicit objs
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit e7c2269dbebd5337ae5aad127d6ddaa4260a8f53
+Merge: 92b641f da00bed
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 23:19:02 2015 +0200
+
+    Merge pull request #5721 from dachary/wip-12853-hammer
+    
+    RGW Swift API: X-Trans-Id header is wrongly formatted
+    
+    Reviewed-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+
+commit 92b641f301df33a38ccfcf018c5f7657db8548ae
+Merge: 845d2ae 3ab5d82
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 23:08:24 2015 +0200
+
+    Merge pull request #5498 from ceph/wip-12432-hammer
+    
+    rgw: HTTP return code is not being logged by CivetWeb
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 836f7636f76b2778812e4fa055206a887fd27dad
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Jul 21 11:31:12 2015 -0700
+
+    OSD: break connection->session->waiting message->connection cycle
+    
+    Fixes: #12338
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 7f15e22be291df139c85909b96b2366f6dbadf37)
+
+commit 77624aff03a8df7805ac0c1c6a7a2085f41fb6a3
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 9 10:46:10 2015 -0400
+
+    osd/PGLog: dirty_to is inclusive
+    
+    There are only two callers of mark_dirty_to who do not pass max,
+    and they are both in the merge_log extending tail path.  In that
+    case, we want to include the last version specified in the log
+    writeout.  Fix the tail extending code to always specify the
+    last entry added, inclusive.
+    
+    Fixes: #12652
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f0ca14df0641daa04eee39d98d8bd0faf46e4e6d)
+
+commit aa003736d2aeea937ce0d8663b159cf06b2dda3e
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Mon Aug 24 23:02:10 2015 +0800
+
+    common: fix code format
+    
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 15e5ebe14787bbbc6b906d72ccd2d418d762cfad)
+
+commit aab35da90d7d50750fda6355d5a124a45d66f1c5
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Mon Aug 24 22:59:40 2015 +0800
+
+    test: add test case for insert empty ptr when buffer rebuild
+    
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 2d2f0eb338906742d516a2f8e6d5d05505be8f47)
+
+commit 2b0b7ae6443eeca271813415a91ab749c886fdf0
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Mon Aug 24 23:01:27 2015 +0800
+
+    common: fix insert empty ptr when bufferlist rebuild
+    
+    Fixes: #12775
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit fb1b6ddd7bfe40d4a38d5ec59b1c3f59f2a83f23)
+    
+    Conflicts:
+    	src/common/buffer.cc : because invalidate_crc did not exist
+            in hammer
+
+commit 845d2aed9e9a9893678226b8661fbd8ff87c090f
+Merge: a6517d2 3396a96
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 12:00:11 2015 +0200
+
+    Merge pull request #5527 from SUSE/wip-12585-hammer
+    
+    OSD crash creating/deleting pools
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 2348a5b5c96d065fbc2188bd9e8e7ff20c75ecaa
+Author: Guang G Yang <yguang at renownedground.corp.gq1.yahoo.com>
+Date:   Wed Jul 29 21:47:17 2015 +0000
+
+    osd: copy the RecoveryCtx::handle when creating a new RecoveryCtx instance from another one
+    
+    Fixes: 12523
+    
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit 6ab9efe799b947f2ef6113df8cc542c73760107d)
+
+commit bf72785e1e11b18df9a03ebfa7c284fe4f43eaa0
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Aug 24 15:40:39 2015 -0700
+
+    config: skip lockdep for intentionally recursive md_config_t lock
+    
+    lockdep can't handle recursive locks, resulting in false positive
+    reports for certain set_val_or_die() calls, like via
+    md_config_t::parse_argv() passed "-m".
+    
+    Fixes: #12614
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit 415226995ebe841cc9e8639a3233150a75aecaed)
+
+commit c94fd926239a31dea1389a760f55f332a9b6814a
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Jul 23 16:36:19 2015 -0700
+
+    osd: Keep a reference count on Connection while calling send_message()
+    
+    Fixes: #12437
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit a140085f467889f2743294a3c150f13b62fcdf51)
+
+commit 059bf98d40fa7e1eddb7aef2ecfdfb6bc96c14fb
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Jul 7 08:49:54 2015 -0700
+
+    WBThrottle::clear_object: signal if we cleared an object
+    
+    Fixes: #12223
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 8447b08d60d5cf7dce20f8b839cc2cb5a93782de)
+
+commit a478385334323071b5cfa4d546eef5b0ef43dce7
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sun May 31 19:42:45 2015 +0200
+
+    ceph-disk: always check zap is applied on a full device
+    
+    zap only makes sense on a full device and this is verified for
+    
+        ceph-disk prepare --zap-disk
+    
+    but not for
+    
+        ceph-disk zap
+    
+    Unify the two and add a test to check that it fails as expected when
+    trying to zap a directory.
+    
+    http://tracker.ceph.com/issues/11272 Fixes: #11272
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 8e1bcf21f090fc98ac9b495d76614e3012f5872a)
+    
+    Conflicts:
+    	src/test/ceph-disk.sh : trivial resolution
+
+commit e471c5dc16847ba35d3c3c8c74da1bf7c4c946e0
+Author: Yuan Zhou <yuan.zhou at intel.com>
+Date:   Wed Jul 8 10:35:49 2015 +0800
+
+    librados: Make librados pool_create respect default_crush_ruleset
+    
+    Make pool_create in librados use the osd_pool_default_crush_replicated_ruleset
+    
+    Fixes: #11640
+    
+    Signed-off-by: Yuan Zhou <yuan.zhou at intel.com>
+    (cherry picked from commit da96a89033590277460aef1c80f385bd93d625e1)
+
+commit a6517d286b59eac283d7bfd04b620f5b859657b6
+Merge: a89c173 35fa47a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Sep 2 02:19:26 2015 +0200
+
+    Merge pull request #5551 from ceph/wip-corpus-hammer
+    
+    ceph-object-corpus: add 0.94.2-207-g88e7ee7 hammer objects
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 35fa47a117a3e8d185f7ebe02eea5671f8229427 (refs/remotes/me/wip-corpus-hammer, refs/remotes/gh/wip-corpus-hammer)
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Sep 1 17:44:06 2015 -0400
+
+    ceph-object-corpus: add 0.94.2-207-g88e7ee7 hammer objects
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit b80859e2b2efc2402dc62aa319e40319863586f7 (refs/remotes/gh/wip-11455-hammer)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Aug 26 14:34:30 2015 -0700
+
+    rgw: init some manifest fields when handling explicit objs
+    
+    Fixes: #11455
+    When dealing with old manifest that has explicit objs, we also
+    need to set the head size and head object correctly so that
+    code that relies on this info doesn't break.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d7bf8cb594e5276d1c80544f5ec954d52b159750)
+
+commit f47ba4b1a1029a55f8bc4ab393a7fa3712cd4e00
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Jul 16 18:02:02 2015 +0200
+
+    mon: test the crush ruleset when creating a pool
+    
+    We want to fix the following scenario:
+    
+     * an erasure code plugin (or another part of the code) creates a
+       ruleset
+     * the ruleset crashes during mapping (for whatever reason)
+     * ceph osd pool create uses the bugous ruleset
+     * the monitors try to do mapping a crash
+    
+    Having a bugous ruleset in the crush map is very difficult prevent. The
+    catastrophic event of using it with a newly created pool can however be
+    prevented by calling the CrushTester just before creating the pool and
+    after all implicit or explicit crush ruleset creation happened.
+    
+    http://tracker.ceph.com/issues/11814 Fixes: #11814
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit f1e86be589803596e86acc964ac5c5c03b4038d8)
+    
+    Conflicts:
+    	src/test/mon/osd-crush.sh
+              removed the run_mon because in hammer it is shared
+              between all tests
+            src/mon/OSDMonitor.cc
+              prepare_new_pool changed stringstream to *ostream
+
+commit b58cbbab4f74e352c3d4a61190cea2731057b3c9
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sat May 30 12:40:26 2015 +0200
+
+    erasure-code: set max_size to chunk_count() instead of 20 for shec
+    
+    See 8b64fe93b088a3a33d357869c47e6bf928c3f0e4 for a detailed explanation.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit a44499f7e6609d9a32254dc6f4303122de74db31)
+
+commit 6f0af185ad7cf9640557efb7f61a7ea521871b5b
+Author: Mykola Golub <mgolub at mirantis.com>
+Date:   Thu Feb 26 21:22:31 2015 +0200
+
+    vstart.sh: set PATH to include pwd
+    
+    ceph-mon needs crushtool to be in PATH. Don't set if it is run
+    from ceph_vstart_wrapper, which already sets it as it needs.
+    
+    Signed-off-by: Mykola Golub <mgolub at mirantis.com>
+    (cherry picked from commit e08bccf377292d72463796ae1dff5d8be40d88e9)
+
+commit a89c1731e0e327acdb876d39df574e27379aaa1e
+Merge: c3a2bf3 0fde3a2
+Author: Gregory Farnum <greg at gregs42.com>
+Date:   Mon Aug 31 09:41:33 2015 +0100
+
+    Merge pull request #5365 from dachary/wip-12491-hammer
+    
+    buffer: critical bufferlist::zero bug
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit c3a2bf3f6b1d1bf416fa04df1629630abe2fe563
+Merge: 0a44eb1 4457d3e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 19:58:25 2015 +0200
+
+    Merge pull request #5369 from dachary/wip-12498-hammer
+    
+    get pools health'info have error
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 0a44eb12fc7d2ef902f1999e37abae0f11511d66
+Merge: dfcdba7 9916d37
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 19:52:52 2015 +0200
+
+    Merge pull request #5370 from dachary/wip-12496-hammer
+    
+    pgmonitor: wrong at/near target max“ reporting
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit dfcdba75f310eaa2cfc5ae97ba3093afe1198737
+Merge: 69a9a4c b8176d0
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 19:44:56 2015 +0200
+
+    Merge pull request #5378 from dachary/wip-12394-hammer
+    
+    Memory leak in Mutex.cc, pthread_mutexattr_init without pthread_mutexattr_destroy
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 69a9a4cbf28c87fcd68f6c6c0c09f7a6d95ab003
+Merge: d3b160e 42bff0b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 19:44:26 2015 +0200
+
+    Merge pull request #5372 from dachary/wip-12493-hammer
+    
+    the output is wrong when runing ceph osd reweight
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit da00bedbc2f5d2facb9472078fd6cdd7260492ac
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Thu Aug 6 15:52:58 2015 +0200
+
+    rgw: rework X-Trans-Id header to be conform with Swift API.
+    
+    Fixes: #12108
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit d1735a4e8ea2056d333a5001a7a410fc03fe1b9e)
+
+commit 9937c818f1073bceffcf5811c7cc543b9043e646
+Author: Abhishek Dixit <dixitabhi at gmail.com>
+Date:   Mon Jun 8 22:59:54 2015 +0530
+
+    Transaction Id added in response
+    
+    Signed-off-by: Abhishek Dixit dixitabhi at gmail.com
+    
+    (cherry picked from commit b711e3124f8f73c17ebd19b38807a1b77f201e44)
+    
+    Conflicts:
+    	src/rgw/rgw_rest.cc
+                 the prototype of the end_header( function
+                 in the context of the diff changed
+
+commit f1c7c629f2a7baf87a3d25d68b7a40fb3b2f6c49
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Jun 29 15:35:04 2015 -0700
+
+    rgw: api adjustment following a rebase
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7cf1f376e7dbc98a44f4a8e78bfa11f84291a941)
+
+commit 85911df5226dccfd2f1806a204a23eae3966eee7
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Jun 29 15:34:44 2015 -0700
+
+    rgw: orphans, fix check on number of shards
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 47edec359be2a4d230a4a54c0c670d0aa711fa1e)
+
+commit c1cf7dfb672032012889840fb4462b1a076f34c0
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Jun 29 15:34:11 2015 -0700
+
+    rgw: orphans, change default number of shards
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 5528f21d0861d42378a8eb10759a1e55ddd66c09)
+
+commit bb1d4cc3a3e9af3bf8cd8fd80085fbbbaeb8b89f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue May 5 14:43:05 2015 -0700
+
+    rgw: change error output related to orphans
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit cac57caf639236adc9a641a85352eb729b58725a)
+
+commit 2e0f6fe98787e1f3ea7d107a814caadce7ee5f23
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon May 4 17:02:29 2015 -0700
+
+    rgw: orphan, fix truncated detection
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d8ce04db8542dae0027423f3c50355e5de74dc9a)
+
+commit 1bfebefba2e09448d28853b34415d3f65e323c76
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon May 4 16:32:57 2015 -0700
+
+    radosgw-admin: simplify orphan command
+    
+    No need for --init-search
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 4980cbd04ff650d79a033bc5298e6c1abe985133)
+
+commit f244b159ac8793c11a5707ea0b104b3180efb58f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon May 4 15:24:00 2015 -0700
+
+    radosgw-admin: stat orphan objects before reporting leakage
+    
+    We don't want to report new objects as leaked, because they might just
+    be written, and waiting to be linked to a new object. The number of
+    seconds prior to the job initialization can be cofigured through
+    --orphan-stale-secs (by default it's 24h).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 66b0090023859d97da2bbaca698b6a50c225abd0)
+
+commit f80e2b2bc8879d1cc40338816196f51378aaa785
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon May 4 14:39:20 2015 -0700
+
+    radosgw-admin: orphans finish command
+    
+    A command to remove orphans data
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 55d6f5ecf18f532c7f056f8b60c101843594b00c)
+
+commit 88d32c641a06823df93f0e3fae640a880778e1e4
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Sat May 2 17:28:30 2015 -0700
+
+    rgw: cannot re-init an orphan scan job
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit f8993102731518153bb18eb74c3e6e4943a5dbac)
+
+commit 80a40342b6a0d9e7a47ca4b672901315246385df
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Sat May 2 16:38:08 2015 -0700
+
+    rgw: stat_async() sets the object locator appropriately
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit d7d117121858155acc8548908e9459a48c676dd1)
+
+commit 0082036348e0463e42520504466961eb2bd77602
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Sat May 2 16:34:09 2015 -0700
+
+    rgw: list_objects() sets namespace appropriately
+    
+    list_objects() now uses parse_raw_oid(), so that it can set the correct
+    namespace. It only affects users of the function that want to get all
+    objects in bucket, regardless to the namespace associated with it. This
+    makes it so that the orphan code actually works now with namespaced
+    objects, and with special named objects (namely, start with underscore).
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 20bd490bebf9be3553d4e25322c9544b0b090086)
+
+commit 1c3707291e83771ca1d5cd24ce445f723006b744
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 1 17:23:44 2015 -0700
+
+    rgw: modify orphan search fingerprints
+    
+    Now works with multipart uploads.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit fa61ea2ccc94f04afb39868ac34abc264806d8d4)
+
+commit ef81367a1eaeb7778dc60a668b9fe2f6a77e06ff
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri May 1 15:17:10 2015 -0700
+
+    rgw: compare oids and dump leaked objects
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 1bc63d98ff8a3aa180065153690b4f8a73658b79)
+
+commit f4d0544e63f68fa94b21fda71c0b78edd05038a1
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Apr 30 16:17:54 2015 -0700
+
+    rgw: keep accurate state for linked objects orphan scan
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit f19b2f087cfb5a89edf3b19487c0df3a214e350f)
+
+commit 748ea57cfeca7b295afca5b8126d454eb85550c7
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Apr 29 17:12:34 2015 -0700
+
+    rgw: iterate over linked objects, store them
+    
+    only keep part of the oid name if it is in a namespace.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 75902fdb12ce0413d3beb455df47134f3d7386e7)
+
+commit 6c6aa5ddf38102012e61f79f5234b9647d42b461
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Apr 29 17:12:00 2015 -0700
+
+    rgw: add rgw_obj::parse_raw_oid()
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 7c1aa8373a090d5c1b2aa121582547723120a079)
+
+commit 62d562d76e0456cc3c735c6708531c7deb2874da
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Apr 29 14:50:15 2015 -0700
+
+    rgw: iterate asynchronously over linked objects
+    
+    Read objects manifest. So that we could keep the relevant info later.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 05a953d965a0a6a0e9feddaa62f7429e154e828e)
+
+commit 00ecf2d0a895407bc8ec0e55e1b1b0f47a1aa96f
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Apr 29 14:15:33 2015 -0700
+
+    rgw: async object stat functionality
+    
+    An async functionality that stats object.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 13adf3cf4f5fd8a0feb7cc1d7a4ee4ded9f573db)
+
+commit 7d1cc48ba32e8bc732c43ecb539312c6bfcc0f80
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Apr 28 16:45:49 2015 -0700
+
+    rgw-admin: build index of bucket indexes
+    
+    for the orphan search tool
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 16a2dbd838b69fb445c06122a68fc65ec3a7b3de)
+
+commit c1b0e7a985cc9e742dcef4c8c427c57a2f58fa43
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Sat Apr 25 09:37:53 2015 -0700
+
+    rgw: initial work of orphan detection tool implementation
+    
+    So far doesn't do much, iterate through all objects in a specific pool
+    data, store it in a sharded index.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 767fc29aa62a0a4e4dd8a78785576e8f1b44ee5b)
+
+commit b16129c3393d6e301b4af5203ffa1c6d8dfdda38
+Author: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+Date:   Wed Apr 29 13:35:29 2015 +0530
+
+    Avoid an extra read on the atomic variable
+    
+    Signed-off-by: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+    (cherry picked from commit 7476e944af049aefdb8871cce62883b86f6b6f8d)
+
+commit 1f6916d5a9b0ebe5181b801c4c381a699883bb09
+Author: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+Date:   Wed Apr 8 18:53:14 2015 +0530
+
+    RGW: Make RADOS handles in RGW to be a configurable option
+    
+    Having a configurable number of RADOS handles is resulting
+    in significant performance boost for all types of workloads.
+    Each RGW worker thread would now get to pick a RADOS handle
+    for its lifetime, from the available bunch.
+    
+    Signed-off-by: Pavan Rallabhandi <pavan.rallabhandi at sandisk.com>
+    (cherry picked from commit b3c3a24fe9c0fbb2bdbbccb08b40efc1dca207cc)
+
+commit d3b160ecbe181c2b969a14825cf314a056630188
+Merge: 7357659 695f782
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 15:50:03 2015 +0200
+
+    Merge pull request #5374 from dachary/wip-12487-hammer
+    
+    ceph osd crush reweight-subtree does not reweight parent node
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 7357659b59d9bf3522bf664f1a3da7475a7c8a49
+Merge: 8f559d5 8a2ad05
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 15:49:41 2015 +0200
+
+    Merge pull request #5380 from dachary/wip-12390-hammer
+    
+    PGLog::proc_replica_log: correctly handle case where entries between olog.head and log.tail were split out
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a13c7fd7c39e83072f2975477e1cdcfe079fb041
+Author: Ruifeng Yang <149233652 at qq.com>
+Date:   Sat Aug 1 17:39:17 2015 +0800
+
+    rgw:the arguments 'domain' should not be assigned when return false
+    
+        Hostnames: [B.A]
+        Inputs: [X.BB.A]
+        Return: [false]
+        Output: [B.A] it is wrong.
+    
+    Fixes: #12629
+    Signed-off-by: Ruifeng Yang <149233652 at qq.com>
+    (cherry picked from commit 9420d24c21b4e06d62f356637599c6ec8e7e3e4d)
+
+commit 6acf36f8851b8a369949f0fad9d0156af7dde20f
+Author: Ruifeng Yang <149233652 at qq.com>
+Date:   Sun Aug 2 16:16:05 2015 +0800
+
+    rgw:segmentation fault when rgw_gc_max_objs > HASH_PRIME
+    
+    obj_names[] is index out of bounds when rgw_gc_max_objs > HASH_PRIME
+    
+    Fixes: #12630
+    Signed-off-by: Ruifeng Yang <149233652 at qq.com>
+    (cherry picked from commit e3147b8ddcaafafde9ce2029f7af5062e22076d3)
+
+commit 6b365144862cbd387d8b931939a3dc2cfe17bbbd
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Jul 20 20:27:33 2015 -0700
+
+    rgw: avoid using slashes for generated secret keys
+    
+    Just use plain alphanumeric characterset.
+    
+    Fixes: #7647
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 3f04a6126fdbfb93304f798da3775c0eec9b7d44)
+
+commit 8f559d58b42b91f070bfa590d9c33e9a156e0066
+Merge: d94e764 931ffe3
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Aug 30 08:36:37 2015 -0400
+
+    Merge pull request #5366 from dachary/wip-12303-hammer
+    
+    arm: all programs that link to librados2 hang forever on startup
+
+commit 8ba6b2f628a0f80964afbf4a83b61c4eee9c78ce
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Thu Jul 30 14:47:15 2015 -0700
+
+    rgw: url encode exposed bucket
+    
+    Fixes: #12537
+    Don't send the bucket name back without url encoding it.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit ad5507fe0bf72ed5bdf8353e315cc9092c740144)
+
+commit d94e7642d0b0213a4b650a5acffa050d042087eb
+Merge: 11a80d8 6417e8e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:41:01 2015 +0200
+
+    Merge pull request #5202 from SUSE/wip-12293-hammer
+    
+    ceph.spec.in: rpm: cephfs_java not fully conditionalized
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 11a80d8bec6ff704e794a2995d653cd5d5c1c979
+Merge: a792ae6 3728477
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:40:48 2015 +0200
+
+    Merge pull request #5203 from SUSE/wip-11997-hammer
+    
+     ceph.spec.in: rpm: not possible to turn off Java
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a792ae65e2e03e1ca8804380cdbbfa1aec7a2123
+Merge: f7e76d2 8f78001
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:40:30 2015 +0200
+
+    Merge pull request #5204 from SUSE/wip-11629-hammer
+    
+    ceph.spec.in: SUSE/openSUSE builds need libbz2-devel
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit f7e76d2c9e681b3c5775f74c582830f546359703
+Merge: d1feb04 4eb58ad
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:40:09 2015 +0200
+
+    Merge pull request #5207 from SUSE/wip-12267-hammer
+    
+    ceph.spec.in: 50-rbd.rules conditional is wrong
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d1feb0415b3b3dc9c5b003d8528079ccccd0729f
+Merge: 2dca2ec 8b576bd
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:39:57 2015 +0200
+
+    Merge pull request #5216 from SUSE/wip-12269-hammer
+    
+    ceph.spec.in: ceph-common needs python-argparse on older distros, but doesn't require it
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 2dca2ece0478972e89ed6611a15892ad9e449cc8
+Merge: 64fafc9 0818e9f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:39:31 2015 +0200
+
+    Merge pull request #5264 from SUSE/wip-12361-hammer
+    
+    ceph.spec.in: snappy-devel for all supported distros
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 64fafc95785024421cbb7ccae41ed4276eeb8fe9
+Merge: 4675971 add0f1e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:39:14 2015 +0200
+
+    Merge pull request #5368 from dachary/wip-12331-hammer
+    
+    ceph: cli throws exception on unrecognized errno
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4675971ce3331f1285398d1556a594f671e489c0
+Merge: 53cdcf2 e004941
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:39:00 2015 +0200
+
+    Merge pull request #5371 from dachary/wip-12494-hammer
+    
+    ceph tell: broken error message / misleading hinting
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 53cdcf20482823cdb8682dde89706d6f21d8d0d2
+Merge: 362874c eccf369
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:38:43 2015 +0200
+
+    Merge pull request #5385 from dachary/wip-12501-hammer
+    
+    error in ext_mime_map_init() when /etc/mime.types is missing
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 362874ca39e32c3bc5ee13b13f905fd7693d9449
+Merge: 2044f3c 8804b3f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:38:29 2015 +0200
+
+    Merge pull request #5411 from SUSE/wip-12446-hammer
+    
+    ceph.spec.in: radosgw requires apache for SUSE only -- makes no sense
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 2044f3cd7b220cc642245e7ca93c21a17cc8c536
+Merge: 260e24b a785193
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:38:13 2015 +0200
+
+    Merge pull request #5412 from SUSE/wip-12448-hammer
+    
+    ceph.spec.in: useless %py_requires breaks SLE11-SP3 build
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 260e24bba0e83dfa61d25ac0489f656244211db4
+Merge: dc944fb b575ecc
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:30:18 2015 +0200
+
+    Merge pull request #5318 from ceph/wip-12236-hammer
+    
+    Possible crash while concurrently writing and shrinking an image
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit dc944fbbedcee56dfbd9d4f5ac3c38d15a6621ea
+Merge: a8c1b4e 92272dd
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:30:01 2015 +0200
+
+    Merge pull request #5319 from ceph/wip-12235-hammer
+    
+    librbd: deadlock during cooperative exclusive lock transition
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a8c1b4e7436832ed3040d5a90df713ef6029cb69
+Merge: a39aeee e971820
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 13:29:26 2015 +0200
+
+    Merge pull request #5296 from ceph/wip-12345-hammer
+    
+    librbd: correct issues discovered via lockdep / helgrind
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a39aeeedf07518d65c9944476b98a0788585f5c1
+Merge: 6a949e1 153744d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 12:14:22 2015 +0200
+
+    Merge pull request #5559 from ceph/wip-12682-hammer
+    
+    object_map_update fails with -EINVAL return code
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 6a949e10198a1787f2008b6c537b7060d191d236
+Merge: 1e423af 4faa8e0
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 12:11:10 2015 +0200
+
+    Merge pull request #5468 from ceph/wip-12577-hammer
+    
+    osd: fix repair when recorded digest is wrong
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1e423afd3c7e534e302dbea0798a47f82acec141
+Merge: 574932b 0ca93db
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 12:06:59 2015 +0200
+
+    Merge pull request #5376 from dachary/wip-12433-hammer
+    
+    Show osd as NONE in ceph osd map <pool> <object>  output
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 574932b2f438787f1a330a271644d9787eecbb63
+Merge: ed162d4 d08db7a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sun Aug 30 11:54:55 2015 +0200
+
+    Merge pull request #5359 from ceph/wip-11470.hammer
+    
+    mon: PaxosService: call post_refresh() instead of post_paxos_update()
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit ed162d498051ac237be33ac6a6764ae0c61d57a6
+Merge: 41a245a bee8666
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Fri Aug 28 14:43:31 2015 -0400
+
+    Merge pull request #5691 from jdurgin/wip-10399-hammer
+    
+    is_new_interval() fixes
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 0bc909e54b0edd8a32a3e7db16877f1d875c3186
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon Aug 10 04:25:03 2015 -0700
+
+    mon: add a cache layer over MonitorDBStore
+    
+    the cache of of leveldb does not perform well under some condition,
+    so we need a cache in our own stack.
+    
+    * add an option "mon_osd_cache_size" to control the size of cache size
+      of MonitorDBStore.
+    
+    Fixes: #12638
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 5e99a578050976ca22b549812ac80d494fe7041d)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.h
+    minor differences in OSDMonitor ctor
+
+commit bee86660377cfaa74f7ed668dd02492f25553ff9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Aug 21 11:32:39 2015 -0400
+
+    Objecter: pg_interval_t::is_new_interval needs pgid from previous pool
+    
+    When increasing the pg_num of a pool, an assert would fail since the
+    calculated pgid seed would be for the pool's new pg_num value instead
+    of the previous pg_num value.
+    
+    Fixes: #10399
+    Backport: infernalis, hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f20f7a23e913d09cc7fc22fb3df07f9938ddc144)
+    
+    Conflicts: (hobject_t sort order not backported, trivial resolution)
+    	src/osdc/Objecter.cc
+    	src/osdc/Objecter.h
+
+commit b5418b9a7138b45b5fe4f24cfb679c2abb30ab71
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue May 26 12:35:11 2015 -0700
+
+    osd_types::is_new_interval: size change triggers new interval
+    
+    Fixes: 11771
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit ff79959c037a7145f7104b06d9e6a64492fdb95f)
+
+commit f0283890d22e8d5c2210d565077ad3af1921f098 (refs/remotes/gh/liewegas-wip-hammer-feature-hammer)
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 27 14:09:50 2015 -0400
+
+    include/ceph_features: define HAMMER_0_94_4 feature
+    
+    This is to constrain upgrades past hammer to version that include
+    the appropriate compatibility fixes (e.g., hobject_t encoding).
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2868b49c0e39fdc7ae72af81962370c4f95a859e)
+    
+    # Conflicts:
+    #	src/include/ceph_features.h
+
+commit 41a245aff77dde8a2ab212f9c91a73a23a77c40d
+Merge: 95cefea 65b380f
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Aug 27 13:07:29 2015 -0400
+
+    Merge remote-tracking branch 'gh/wip-12536-hammer' into hammer
+    
+    This includes wip-osd-compat-hammer.
+
+commit 65b380f7f28a36bb51a6771a2fd9b657ea2848ba (refs/remotes/gh/wip-12536-hammer)
+Merge: 00d802d 9b91adc
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Aug 19 09:52:02 2015 -0400
+
+    Merge remote-tracking branch 'gh/wip-osd-compat-hammer' into wip-12536-hammer
+
+commit 153744d7c596705c4f92bee5e827846b46c80141
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Aug 10 09:39:50 2015 -0400
+
+    tests: increase test coverage for partial encodes/decodes
+    
+    Multiple combinations of offsets/lengths are now tested when
+    performing partial encodes/decodes of the bit vector.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3e145f714ac9b2d599b45a058c6b93595e38f424)
+
+commit fca78765366f3ac365cfa98224aca5fb79b2a7fe
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Aug 10 09:34:42 2015 -0400
+
+    common: bit_vector extent calculation incorrect for last page
+    
+    It's highly probable that the last page in the bit vector will not
+    be a full page size.  As a result, the computed extents will extend
+    beyond the data portion of the bit vector, resulting in a end_of_buffer
+    exception.
+    
+    Fixes: #12611
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c6d98992691683524d3d96def83a90a6f5fe7f93)
+
+commit 3396a969741f74e5b1f55d8d7af258493ca26478
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Jul 30 14:20:56 2015 +0100
+
+    osd/OSDMap: handle incrementals that modify+del pool
+    
+    Because new_pools was processed after old_pools, if something
+    was modified and then deleted in the same incremental
+    map, then the resulting state would be a pool in the map
+    that had no entry in pool_name.
+    
+    Fixes: #12429
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 8d4932e721e32a33c1bada54e11d4ecccd868618)
+
+commit 3ab5d82a1c09142267c27156b69a3117d30c5b7d (refs/remotes/gh/wip-12432-hammer)
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Wed Jul 22 10:01:00 2015 -0700
+
+    rgw: set http status in civetweb
+    
+    Need to set the http status in civetweb so that we report it correctly.
+    Fixes: #12432
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit b8e28ab9f914bf48c9ba4f0def9a0deb9dbb93bc)
+
+commit 10a03839853246c535e639b6dc6cea45b8673642
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Fri Jul 31 11:03:29 2015 -0700
+
+    civetweb: update submodule to support setting of http status
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+
+commit 00d802d97ba5e1a8bde2414f8710494f15807fcd
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Dec 23 11:03:17 2014 -0800
+
+    hobject_t: fix get_boundary to work with new sorting regime
+    
+    The hash is no longer the most significant field; set everything that is
+    more significant, too.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 45281efad1ae6b2b5ddd5549c56dbdd46671e5c5)
+
+commit 9b91adc560c8dffc1f5f7470d28c25f448b2b619 (refs/remotes/gh/wip-osd-compat-hammer)
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 4 13:21:50 2015 -0400
+
+    mon: disallow post-hammer OSDs if there are up pre-hammer OSDs
+    
+    Force *all* OSDs to upgrade to hammer before allowing post-hammer
+    OSDs to join.  This prevents any pre-hammer OSDs from running at
+    the same time as a post-hammer OSD.
+    
+    This commit, as well as the definition of the sentinal post-hammer
+    feature, should get backported to hammer stable series.
+    
+    Backport: hammer
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e38d60e94503c7e8511a60a8dceceb3cd39c2bd8)
+    
+    # Conflicts:
+    #	src/mon/OSDMonitor.cc
+
+commit 8a559c1e80bb7c70e13c46f1900896c9b8fcd9a9
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 4 13:16:11 2015 -0400
+
+    include/ceph_features: define MON_METADATA feature
+    
+    This was added in master in 40307748b9b8f84c98354a7141da645a3c556ba9.  We
+    define it but notably do not support it!
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 4faa8e04069417a6e2a6c4ea5c10b54d76aa00c4 (refs/remotes/gh/wip-12577-hammer)
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Mar 27 10:17:12 2015 -0700
+
+    osd: include newlines in scrub errors
+    
+    We may log more than one of these in a scrubmap; make sure they are
+    not concatenated.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2b3dd1bb7ab360e8f467a47b7ce3a0e4d3a979b2)
+
+commit 455eb2a89197e9609c5bb510112d661d388b4c85
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Mar 27 10:04:00 2015 -0700
+
+    osd: fix condition for loggin scrub errors
+    
+    We may have an error to log even though the authoritative map is empty:
+    when we have a digest that doesn't match all replicas.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d23766be902080ffb29528acb5a00d70beb97a9f)
+
+commit 67e7946ce8e28f00db9588bed670ef5141268f41
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Mar 27 10:03:22 2015 -0700
+
+    osd: fix fallback logic; move into be_select_auth_object
+    
+    The fallback behavior was printing a promising message but then doing
+    a 'continue' and not actually scrubbing the object.  Instead, fall back to
+    a less-bad auth inside be_select_auth_object.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b597db59fedc9a96dbe4b37f03b819dcf8fdb1bb)
+
+commit 0f57c7017a98f7e416a160375b8b80355b8e0fc3
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Mar 27 09:34:44 2015 -0700
+
+    osd: log a scrub error when we can't pick an auth object
+    
+    If we really can't find a suitable auth, log an error.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a476d8f3903ca78b5cf36d63059f13cb5268efe5)
+
+commit d4f4c5c4334add6acfc66407c2383d01094d384d
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Mar 27 10:20:23 2015 -0700
+
+    osd: repair record digest if all replicas match but do not match
+    
+    If the recorded digest does not match the replicas, and all replicas
+    match, then (on repair) fix the recorded digest.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit f581fecd8a16b9250fa96beec5aa26074f401028)
+
+commit acfed6b5eae764d381c88ed7d3f4942c61191127
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Mar 26 13:52:20 2015 -0700
+
+    osd: move recorded vs on disk digest warning into be_compare_scrubmaps
+    
+    This is a better place for it.  While we are here, change the wording to
+    clearly call out the 'recorded' digest (from object_info_t) vs the 'on
+    disk' digest (what we observed during scrub).
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit cf349ff35e9111ca52db1b0aad3753d0680b486d)
+
+commit 674029bc6c519e82011d1429ab5eddff9720c2dc
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Mar 26 13:46:22 2015 -0700
+
+    osd: be slightly paranoid about value of okseed
+    
+    The scrubber.seed value is set based on the peer feature; check for that
+    too explicitly, and assert the scrubber.seed value matches.
+    
+    No change in behavior here.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e34d31b7a9a71132a17b95cf5ad60255ece60243)
+
+commit f2002b7fa2af2db52037da4c1cf66d405a4941e7
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Mar 26 13:44:25 2015 -0700
+
+    osd: be precise about "known" vs "best guess"
+    
+    We cannot assume that the auth info has the "known" digest; all replicas
+    may have a matching digest that does not match the oi, or we may choose
+    a different auth info for some other reason.  Verify that the digest
+    matches the oi before calling it "known".
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 546d1c7b8224d96d0cc93dc3c96f52787cd69413)
+
+commit 4e5d146ad36ef0380eb72e45dca651494658aeeb
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Mar 26 13:24:11 2015 -0700
+
+    osd: record digest if object is clean (vs entire scrub chunk)
+    
+    If an individual object is clean, record it in the missing_digest map.
+    If not, leave it out.  This lets us drop the old condition that only
+    recorded any digests if the entire scrub chunk was clean.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c39e0e5f126028f552d410ab6924cac6e1f714fb)
+
+commit 1357ed1bd0e250b942bcba0346c97c24bb79a5d1
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Aug 3 13:05:45 2015 -0400
+
+    hobject_t: decode future hobject_t::get_min() properly
+    
+    The post-hammer wip-temp branch changed hobject_t::get_min() so that pool
+    is INT64_MIN instead of -1 and neglected to deal with the encoding compat
+    with older versions.  Compensate on hammer by mapping INT64_MIN to -1
+    locally.  See commit ff99af38df830e215359bfb8837bf310a2023a4d.
+    
+    Note that this means upgrades from hammer to post-hammer *must* include
+    this fix prior to the upgrade.  This will need to be well-documented in the
+    release notes.
+    
+    Master gets a similar fix so that they map our min value to the new
+    INT64_MIN one on decode.
+    
+    Fixes: #12536 (for hammer)
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 6d01d6b700300841f49f288a89d514f26a4f94b1
+Author: Samuel Just <sjust at redhat.com>
+Date:   Wed Jul 29 11:49:57 2015 -0700
+
+    OSDMonitor::preprocess_get_osdmap: send the last map as well
+    
+    Fixes: #12410
+    Backport: hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1320e29dfaee9995409a6d99b9ccaa748dc67b90)
+
+commit a7851933033473d11e69fa1f237c0ad8bbbd4a13
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jul 9 11:51:13 2015 +0200
+
+    ceph.spec.in: drop SUSE-specific %py_requires macro
+    
+    %py_requires expands to
+    
+    BuildRequires: /usr/bin/python
+    PreReq: python = 2.7
+    
+    The BuildRequires: is already provided, and the PreReq is wrong because
+    e.g. SLE11-SP3 (a platform we are trying to support) has Python 2.6.
+    
+    http://tracker.ceph.com/issues/12351 Fixes: #12351
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit cbf6c7b46b42e163950bf7956e5b7565fca961c9)
+
+commit 8804b3f1ab5180c8a85b25b9b46b986fe7022868
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jul 16 15:16:22 2015 +0200
+
+    ceph.spec.in: remove SUSE-specific apache2-mod_fcgid dependency
+    
+    This package is no longer required for RGW to work in SUSE.
+    
+    http://tracker.ceph.com/issues/12358 Fixes: #12358
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit f3f8d3660d0ece3139e5f3dc7881ccceadcf648d)
+    
+    Conflicts:
+    	ceph.spec.in
+                In master, the "%if %else %endif" has been changed
+                into two "%if %endif"s
+
+commit b575ecca9743ab08439bfe0b5283e483e2a799ce
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 23 14:20:16 2015 -0400
+
+    tests: verify that image shrink properly handles flush op
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 8dfcc72071d63c7867a5a59abe871cf5db673a0a)
+
+commit d4eb7bd63a5e46b790bad7001d2873c5c238cc90
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 23 14:18:20 2015 -0400
+
+    librbd: invalidate cache outside cache callback context
+    
+    When shrinking an image, it's possible that the op flush callback
+    will be from within the cache callback context.  This would result
+    in a deadlock when attempting to re-lock the cache lock in order to
+    invalidate the cache.
+    
+    Fixes: #11743
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 726d699b7790c7e371279281ab32cd3aeb8ece7b)
+
+commit 92272dd676ebb67a3095ce3933cac24809b054da
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri May 15 11:18:29 2015 -0400
+
+    librbd: don't cancel request lock early
+    
+    It's possible that a stale notice is received and will
+    be discarded after the request lock has been canceled.
+    This will stale the client.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit d9dd5c5890029107df40ed438f23fb9865d7de29)
+
+commit 58ae92f1a716e1ffac6408793e19d47f99d63520
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 14 16:13:38 2015 -0400
+
+    tests: new test for transitioning exclusive lock
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f97ce46ea4c9c7cdc6e37e3759871d5b41b25769)
+
+commit 7b21ccba7c2885027b1d345baaad08a978fbc72f
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 7 13:31:50 2015 -0400
+
+    tests: verify that librbd will periodically resend lock request
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit d2a1c226ab3f7e202f62896f0c80c4cf3607cdaf)
+
+commit c95b37f48c129ef6780f67b326e97957f3771472
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri May 15 10:49:36 2015 -0400
+
+    common: Mutex shouldn't register w/ lockdep if disabled
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 879b8a73e2452332b26b8f3428ff5e3e0af8ddad)
+
+commit 117205af89398457e197793505381622705488b2
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri May 15 10:47:04 2015 -0400
+
+    librbd: improve debugging output for ImageWatcher
+    
+    Include the instance pointer so that different images
+    can be differentiated in the logs.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b951a7398e3e749cb64a3f6a604212a5627e82a0)
+
+commit 08ae01231754d3010c1ede762579cf75c1c7460d
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri May 15 10:45:04 2015 -0400
+
+    librados_test_stub: watcher id should be the instance id (gid)
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3e1e561cc29043eb64dff8afb3a2c1ed77788e93)
+
+commit 704c0e09479d435ecbb84693a786c60694732b19
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 7 12:51:49 2015 -0400
+
+    librbd: retry lock requests periodically until acquired
+    
+    If the exclusive lock owner acks the lock release request but crashes
+    before it actually releases the lock, the requestor will wait forever.
+    Therefore, after a certain timeout, retry the request again until it
+    succeeds.
+    
+    Fixes: #11537
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 37c74e6e5274208d1b6efaf315afec03ea7eaa82)
+
+commit dbaaed9cf99121d0c97c22a695a7a6e872a11f48
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 7 12:35:36 2015 -0400
+
+    librbd: don't hold owner_lock for write during flush
+    
+    The various IO callback codepaths will attempt to take
+    the lock, which will result in deadlock since the flush
+    cannot complete.
+    
+    Backport: hammer
+    Fixes: #11537
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    
+    (cherry picked from commit 2b6d0633d5c89de3a557cdd72621dfc19f0540de)
+
+commit e9718201c6ed785c61077797a74ffda7e0438fb9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jun 22 15:30:02 2015 -0400
+
+    lockdep: do not automatically collect all backtraces
+    
+    It is expensive to collect backtraces every time a lock is
+    checked in order to provide cycle backtraces.  The backtraces
+    can be forced on for specific locks or globally via the new
+    config option "lockdep_force_backtrace".
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 7354d25f56c5e004f288febdee2b6961c069163b)
+
+commit 27f7042e923366c31748c4cc9992c1a8cb37b457
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jun 9 13:20:54 2015 -0400
+
+    librbd: flush operations need to acquire owner lock
+    
+    Cache writeback operations will expect the owner lock to be held.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit adfa2e0070ccca7b6556d3bfc5fac7ce4d43a4d0)
+
+commit 5b39983025f510c3119ebb375870e7669be7ddd0
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 21 00:13:31 2015 -0400
+
+    librbd: avoid infinite loop if copyup fails
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 43e0e3cd63f0067217ed0811d73f6c546f3027be)
+
+commit 88b583b249a74a71bc87409015f7a8d85200e1bf
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue May 12 10:19:48 2015 -0400
+
+    librbd: flush pending ops while not holding lock
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3d5cef38c37e5dda6b23751ad560851f1304d86d)
+
+commit a88b180571cb481a31cb94c249a3b486220232fa
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue May 12 10:07:21 2015 -0400
+
+    tests: fix possible deadlock in librbd ImageWatcher tests
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 742a85d667b26b3490d96270b5c500b08f2a5283)
+
+commit 321eb8d1c3f7d553addb780928e201acf5091132
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon May 11 13:59:49 2015 -0400
+
+    tests: enable lockdep for librbd unit tests
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 45cb9cb5980e90235b8244d0d61ece40bde4784a)
+
+commit bfe5b90921a3faaad0533388cb150cea20f47ae9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 7 14:17:37 2015 -0400
+
+    librbd: owner_lock should be held during flush request
+    
+    Flush might result in the cache writing out dirty objects, which
+    would require that the owner_lock be held.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c9142fe35372cf69b7a56f334622a775a6b7c43f)
+
+commit 1e84fb05f48c146cc9d2d090be8c2d355326938b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 7 14:06:16 2015 -0400
+
+    osdc: ObjectCacher flusher might needs additional locks
+    
+    librbd requires the ObjectCacher flusher thread to acquire
+    an additional lock in order to maintain lock ordering
+    constraints.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit a38f9e5104a6e08e130dc4f15ad19a06d9e63719)
+
+commit 506a45a906024d4bb5d3d4d6cc6cbb9eec39c5f2
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 16:11:03 2015 -0400
+
+    librbd: fix recursive locking issues
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 1b57cc1da7a51e6f8ffea689b94ef843732c20a4)
+
+commit acf5125fe27fb3b9de8b97c4e44fa1f5c61147fd
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 16:04:28 2015 -0400
+
+    librbd: simplify state machine handling of exclusive lock
+    
+    It is expected that all IO is flushed and all async ops are cancelled
+    prior to releasing the exclusive lock.  Therefore, replace handling of
+    lost exclusive locks in state machines with an assertion.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit d6b733dbdd0aeb5d1e136dcbf30c58c80952651e)
+
+commit 9454f04e62ece39fdcdbb4eb5a83945f76bcc0a5
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 15:32:38 2015 -0400
+
+    librbd: ObjectMap::aio_update can acquire snap_lock out-of-order
+    
+    Detected during an fsx run where a refresh and CoR were occurring
+    concurrently.  The refresh held the snap_lock and was waiting on
+    the object_map_lock, while the CoR held object_map_lock and was
+    waiting for snap_lock.
+    
+    Fixes: #11577
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 8cbd92b1fe835b1eb3a898976f9507f51cc115b2)
+
+commit 3e0358e17e7ddb488109bce04bb08cd16fd5bb2f
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 16 14:15:10 2015 -0400
+
+    librbd: move copyup class method call to CopyupRequest
+    
+    Move AbstractWrite's invocation of copyup to the CopyupRequest
+    class.  The AioRequest write path will now always create a
+    CopyupRequest, which will now append the actual write ops to the
+    copyup.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 7be3df67809925164237cc185f9f29e145f45768)
+
+commit 2ee64a80794297d4fc5aeafbb185818f7f6a77b8
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Mar 31 12:28:11 2015 -0400
+
+    librbd: simplify AioRequest constructor parameters
+    
+    Moved all parent overlap computation to within AioRequest so that
+    callers don't need to independently compute the overlap.  Also
+    removed the need to pass the snap_id for write operations since
+    it can only be CEPH_NOSNAP.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 46515971edab8888284b1a8307ffca88a9c75f5c)
+
+commit 3e71a7554da05aee06d5a2227808c321a3e3f0f1
+Author: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+Date:   Sat Mar 14 01:16:31 2015 +0100
+
+    librbd/AioRequest.h: fix UNINIT_CTOR
+    
+    Fix for:
+    
+    CID 1274319: Uninitialized scalar field (UNINIT_CTOR)
+     uninit_member: Non-static class member m_object_state is not
+     initialized in this constructor nor in any functions that it calls.
+    
+    Signed-off-by: Danny Al-Gaaf <danny.al-gaaf at bisect.de>
+    (cherry picked from commit 48f18ea0e1c4c6de1921ea2359448deb761461e7)
+
+commit cb57fe581df7c14d174e6eaff382d6a28ab658d6
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Jul 17 15:04:10 2015 -0400
+
+    librbd: add object state accessor to ObjectMap
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 9249ab7dacd43e7a546656b99013a595381fd5fd
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 15:41:59 2015 -0400
+
+    librbd: AsyncObjectThrottle should always hold owner_lock
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c352bcdc0f63eea55677fe3c3b5f0c61347c0db3)
+
+commit 26902b94f97edb189ae620c86a8dda8166df471a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 15:34:43 2015 -0400
+
+    librbd: execute flush completion outside of cache_lock
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 5f157f20980de7e9a05fb933fb57efdc759da78b)
+
+commit 571220d6f4642dd3cd78988882645fdf647c150e
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 15:17:54 2015 -0400
+
+    librbd: add AsyncRequest task enqueue helper method
+    
+    In order to support the invariant that all state machine
+    callbacks occur without holding locks, transitions that
+    don't always involve a librados call should queue their
+    callback.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 218bc2d0f8d90c9c64408cb22e26680e88138844)
+
+commit 8e280f4cfef0d2fdc706d43bbee0c377d288a457
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu May 7 15:32:27 2015 -0400
+
+    librbd: disable lockdep on AioCompletion
+    
+    It is only used by clients and it causes a large slowdown
+    in performance due to the rate at which the lock is constructed/
+    destructed for each IO request.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 66e74641baeed9aadb7e474d6e6b142b7725722d)
+
+commit b38da48059792e9182fe2877786d9159007683d3
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:42:19 2015 -0400
+
+    librbd: AioCompletion shouldn't hold its lock during callback
+    
+    The callback routine most likely will attempt to retrieve the result
+    code, which will result in a recursive lock attempt.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3ad19ae349ebb27ff6027e40883735240fa97a3c)
+
+commit 6fdd3f1ce69fa2e00c6f1bedd5f72352953e1e44
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:51:03 2015 -0400
+
+    librbd: give locks unique names to prevent false lockdep failures
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c474ee42b87975c04eeb2b40b976deb5a5e2d518)
+
+commit 70041499f99cad551b3aab16f086f725b33b25e2
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:40:16 2015 -0400
+
+    librbd: complete cache read in a new thread context
+    
+    The ObjectCacher complete the read callback while still holding
+    the cache lock.  This introduces lock ordering issues which are
+    resolved by queuing the completion to execute in a clean (unlocked)
+    context.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0024677dc8adfd610418ca47599dd95d3a5a6612)
+
+commit 65ef695eba0f5b5d87347ffb3407bb5d6d75b402
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Mar 19 15:35:59 2015 -0400
+
+    librbd: require callers to ObjectMap::aio_update to acquire lock
+    
+    This is needed to allow an atomic compare and update operation
+    from the rebuild object map utility.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 2db758cb4cb6d88cbaf9842b1e5d0872a185d8df)
+
+commit 58b8fafb87b18f2a4d8c38f77ecf81ff58452409
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:38:29 2015 -0400
+
+    log: fix helgrind warnings regarding possible data race
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c1e14451775049bbd95bcb19a0b62ab5e2c0a7bb)
+
+commit a5203d32544d40cb51eb60fc906cc3ceaacbfe96
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:37:56 2015 -0400
+
+    librados_test_stub: fix helgrind warnings
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b65ae4bc26f2dcaaa9518d5cce0e8b83ea310de8)
+
+commit b73e87eb307137786e0f0d89362ef0e92e2670b8
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:36:26 2015 -0400
+
+    librados_test_stub: add support for flushing watches
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6e400b9049ede5870e40e4dd2cb41874550eac25)
+
+commit 2fa35b1c5ca8e33959fff8c84eaa4feca0f67df3
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:29:12 2015 -0400
+
+    common: lockdep now support unregistering once destructed
+    
+    librbd use of an image hierarchy resulted in lock names being
+    re-used and incorrectly analyzed.  librbd now uses unique lock
+    names per instance, but to prevent an unbounded growth of
+    tracked locks, we now remove lock tracking once a lock is
+    destructed.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 7c7df2ce9f837628535d21df61ae4f13d809c4fa)
+
+commit 7b85c7bfe599644eb29e6b1e03733da4774c2eac
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Apr 30 13:26:41 2015 -0400
+
+    common: add valgrind.h convenience wrapper
+    
+    Conditionally support helgrind annotations if valgrind support is
+    enabled during the build.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 650ad32d74a24d248dd8e19bff1bbd31f0bb224b)
+
+commit 6d3db5ffbef71c8927a9ffc68c5955dca0f5612c
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 17:24:08 2015 -0400
+
+    librbd: add work queue for op completions
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 21f990efe6c6d710376d5b1a49fc8cd53aa020e6)
+
+commit 64425e861400fde4703fb06529777c55650b6676
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Apr 8 16:46:34 2015 -0400
+
+    WorkQueue: ContextWQ can now accept a return code
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit e5ffae578e83c1e4fca3f328c937e7c9be8cc03c)
+
+commit eccf36980511de7ed122a38d426170496ffdea64
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Tue Jun 23 13:41:53 2015 -0600
+
+    packaging: RGW depends on /etc/mime.types
+    
+    If the mimecap RPM or mime-support DEB is not installed, then the
+    /etc/mime.types file is not present on the system. RGW attempts to read
+    this file during startup, and if the file is not present, RGW logs an
+    error:
+    
+      ext_mime_map_init(): failed to open file=/etc/mime.types ret=-2
+    
+    Make the radosgw package depend on the mailcap/mime-support packages so
+    that /etc/mime.types is always available on RGW systems.
+    
+    http://tracker.ceph.com/issues/11864 Fixes: #11864
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit c74a2f86a1f9b15aae0e723b410bedfc1d01a79b)
+
+commit 7bddf5d4dad09b1f6d3b4e80e4bdd895191560b0
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Thu Jul 16 09:42:55 2015 +0800
+
+      rest_bench: bucketname is not mandatory as we have a default name
+    
+      Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    
+    (cherry picked from commit bc56a87ea3b69b4856a2b9f9fb2a63dbfb1211c3)
+
+commit 6e7358b3958b7ee11ef612302b300d07f3982d54
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Thu Jul 16 09:17:59 2015 +0800
+
+      rest_bench: drain the work queue to fix a crash
+      Fixes: #3896
+      Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    
+    (cherry picked from commit f3d34d8ff921dbd2ff21f6b72af7c73bb9c6940e)
+
+commit 1e055782f5ade94c19c2614be0d61d797490701e
+Author: John Spray <john.spray at redhat.com>
+Date:   Tue Jul 21 16:09:32 2015 +0100
+
+    auth: check return value of keyring->get_secret
+    
+    get_secret can fail to populate the passed CryptoKey, for
+    example if the entity name is not found in the keyring.  In
+    this case, attempts to use the CryptoKey will lead to
+    segfaults.
+    
+    Fixes: #12417
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 64e5041008744362fdbb16e16bc3e049a2d426aa)
+
+commit 256620e37fd94ee4b3af338ea6955be55529d0d6
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Thu Jul 16 04:45:05 2015 -0700
+
+    Client: check dir is still complete after dropping locks in _readdir_cache_cb
+    
+    We drop the lock when invoking the callback, which means the directory
+    we're looking at might get dentries trimmed out of memory. Make sure that
+    hasn't happened after we get the lock back. If it *has* happened, fall back
+    to requesting the directory contents from the MDS. Update the dirp location
+    pointers after each entry to facilitate this.
+    Because this requires we update the dirp->at_cache_name value on every loop,
+    we rework the updating scheme a bit: to dereference the dn->name before
+    unlocking, so we know it's filled in; and since we update it on every loop
+    we don't need to refer to the previous dentry explicitly like we did before.
+    
+    This should also handle racing file deletes: we get back a trace on
+    the removed dentry and that will clear the COMPLETE|ORDERED flags.
+    
+    Fixes #12297
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 62dd63761701a7e0f7ce39f4071dcabc19bb1cf4)
+
+commit 8a2ad0540994efe530a1775ebd949aeaf6609e57
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 16:29:45 2015 -0700
+
+    TestPGLog: fix invalid proc_replica_log test caes
+    
+    If 1'3 is non-divergent, no osd could correctly have created 2'3.  Also,
+    proc_replica_log does not add the extra entries from the auth log to the
+    missing set, that happens later on in activate.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1333b676dba4ed4b5db854fe935bdadbf9f21d08)
+
+commit df71e6be7ccbe18d99200b2a5844a9f19ac70141
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 16:28:23 2015 -0700
+
+    TestPGLog: fix noop log proc_replica_log test case
+    
+    Need to fill in log.head, olog.head.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1e5b22053381580708af29a1536f1e106c9b479c)
+
+commit 549ff9a938c5126d4dcb15535845d5354cb44bb2
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 15:01:41 2015 -0700
+
+    TestPGLog: add test for 11358
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit b61e5aef15d7448d24b713d13dce77697bc0af74)
+
+commit c224fc70e14bd76494bc437595c8b0b0d275694e
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Apr 9 15:01:29 2015 -0700
+
+    PGLog::proc_replica_log: handle split out overlapping entries
+    
+    See the comment, if the overlapping entries between olog.head
+    and log.tail were split out, last_update should be log.tail.
+    
+    Fixes: 11358
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 6561e0d955c4563a8505b717de41f5bd89119f63)
+
+commit b8176d0f21ce80d2e5a92057ab85f7618504cd9f
+Author: Ketor Meng <d.ketor at gmail.com>
+Date:   Tue May 26 18:50:17 2015 +0800
+
+    Mutex: fix leak of pthread_mutexattr
+    
+    Need pthread_mutexattr_destroy after pthread_mutexattr_init
+    
+    Fixes: #111762
+    Signed-off-by: Ketor Meng <d.ketor at gmail.com>
+    (cherry picked from commit 2b23327b3aa8d96341d501a5555195ca1bc0de8f)
+
+commit 43a72e47c4adae674e02bb262645d88ac528e2be
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Fri Jul 3 18:27:13 2015 +0800
+
+    mon/PGMonitor: bug fix pg monitor get crush rule
+    
+    when some rules have been deleted before, the index in array of crush->rules
+    is not always equals to crush_ruleset of pool.
+    
+    Fixes: #12210
+    Reported-by: Ning Yao <zay11022 at gmail.com>
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 498793393c81c0a8e37911237969fba495a3a183)
+
+commit 0ca93db7d79f11e51af75e322941419b860bb2f8
+Author: Shylesh Kumar <shmohan at redhat.com>
+Date:   Wed Jul 22 18:47:20 2015 +0530
+
+    mon: ceph osd map shows NONE when an osd is missing
+    
+    Signed-off-by: Shylesh Kumar <shmohan at redhat.com>
+    (cherry picked from commit 4d030302ea3709eb021710e873f1ebe62f951cec)
+
+commit 695f782e59baffbe8429f9daa47a4f1476a02976
+Author: Sage Weil <sage at redhat.com>
+Date:   Sun Jun 7 20:05:58 2015 -0400
+
+    crush/CrushWrapper: fix adjust_subtree_weight debug
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 26be86f649a1e9846280204fe1e3f8344eb975ce)
+
+commit 0bd4c81ce41a22b22ca76e539de87260b140bbc4
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jun 5 12:15:45 2015 -0700
+
+    crush/CrushWrapper: return changed from adjust_subtree_weight
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 551ab2d69dd50a078d62340740d357d85ab8dcbb)
+
+commit 05fc59bee9138d04227255a2f31bd82efe94b1e9
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jun 5 12:15:22 2015 -0700
+
+    crush/CrushWrapper: adjust subtree base in adjust_subtree_weight
+    
+    We were correctly adjusting all the children, but the subtree root was
+    not being updated.
+    
+    Fixes: #11855
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 1da96ab8442522bda4fc39e05597f17b8ebddf89)
+
+commit d2f31adc49a7c6b8276dbf8773575e91ba5e18fa
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jun 5 12:12:41 2015 -0700
+
+    unittest_crush_wrapper: test adjust_subtree_weight
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b461dc2e970f139dcb25d93b32be6b4bb9f1c8eb)
+
+commit 0ccdf342e7cf0072d3c38c6e1a6cf3a87f154a28
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jun 5 12:17:26 2015 -0700
+
+    unittest_crush_wrapper: attach buckets to root in adjust_item_weight test
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a8351eb3de2b4069ffec9c4f561eb1519ea11aa2)
+
+commit 1e737532cfe1daf43bea3d9bd4e55faed560f0f2
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jun 5 12:12:32 2015 -0700
+
+    unittest_crush_wrapper: parse env
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 14c60b288b33e4cec9c9819d4668a5ff9855ccc1)
+
+commit cd11b887c6c586085a7014ba44123b115370a462
+Author: Guang G Yang <yguang at renownedground.corp.gq1.yahoo.com>
+Date:   Thu Jul 2 05:29:47 2015 +0000
+
+    osd: pg_interval_t::check_new_interval should not rely on pool.min_size to determine if the PG was active
+    
+    If the pool's min_size is set improperly, during peering, pg_interval_t::check_new_interval
+    might wrongly determine the PG's state and cause the PG to stuck at down+peering forever
+    
+    Fixes: #12162
+    Signed-off-by: Guang Yang yguang at yahoo-inc.com
+    (cherry picked from commit 684927442d81ea08f95878a8af69d08d3a14d973)
+    
+    Conflicts:
+    	src/osd/PG.cc
+               because PG::start_peering_interval has an assert
+               that is not found in hammer in the context
+    	src/test/osd/types.cc
+               because include/stringify.h is not included by
+               types.cc in hammer
+
+commit c5f0e2222cc55a92ebc46d12b618fadb3d2fb577
+Author: Guang G Yang <yguang at renownedground.corp.gq1.yahoo.com>
+Date:   Wed Jul 1 20:26:54 2015 +0000
+
+    osd: Move IsRecoverablePredicate/IsReadablePredicate to osd_types.h
+    
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit 466b083166231ec7e4c069fef8c9e07d38accab9)
+
+commit 42bff0b9e2f80e32001082a608d63719332677e3
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Tue Jul 21 11:20:53 2015 +0100
+
+    mon: OSDMonitor: fix hex output on 'osd reweight'
+    
+    Fixes: #12251
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 787fa80c2746fde44ac0583ff7995ec5be9a672d)
+
+commit e00494118ee42322784988fe56623cbc7aac4cc9
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Jul 15 19:03:33 2015 +0800
+
+    ceph.in: print more detailed warning for 'ceph <type> tell'
+    
+    put the full signature of "tell <target> <command> [options...]"
+    instead of "tell {0}.<id>", which could be misleading somehow.
+    
+    Fixes: 11101
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit aa1a5222eebd0256d4ecffb0eefeb0f78ecf0a1f)
+
+commit f18900f2eb724acd898e8b32fe75c0850d7cf94c
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Jul 15 18:01:52 2015 +0800
+
+    ceph.in: print more detailed error message for 'tell' command
+    
+    * we do not allow user specify a certain daemon when starting an
+      interactive session. the existing error message could lead to
+      some confusion. so put more details in it.
+    
+    Fixes: #11101
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 972dc9145235ff0f60663369ebcab8c16628b89f)
+
+commit 9916d37ead705d467b1d730adb15bb6974b3bf1b
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Mon Jul 20 10:50:20 2015 +0800
+
+      mon/PGMonitor: avoid uint64_t overflow when checking pool 'target/max' status.
+      Fixes: #12401
+    
+      Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    
+    (cherry picked from commit f84e6b8157e78fd05cd1c8ac957c92df17e6ba06)
+
+commit 4457d3eb70712ec3b7d8e98af973e099c8c7d258
+Author: renhwztetecs <rhwlyw at 163.com>
+Date:   Tue Jul 21 18:55:00 2015 +0800
+
+    Update OSDMonitor.cc
+    
+    OSDMonitor::get_pools_health(), s/objects/bytes/
+    
+    Fixes: #12402
+    Signed-off-by: ren.huanwen at zte.com.cn
+    (cherry picked from commit 7fc13c9d6b9a4962d7640240416105d8f558d600)
+
+commit add0f1e5e229c9ad66e8ef77ad59e0e390e20db6
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Thu Apr 16 18:29:00 2015 +0800
+
+    ceph.in: do not throw on unknown errno
+    
+    some of the errnos are not listed in errno.errorcode. if we happen
+    to run into them, print 'Unknown' instead.
+    
+    Fixes: #11354
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 53514ad97f6f75746613f09d464f69a7c31bed55)
+
+commit fa194744fdaed13949bffb6f2b8a0fc420006e0b
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Mar 18 13:49:20 2015 -0700
+
+    os/chain_xattr: handle read on chnk-aligned xattr
+    
+    If we wrote an xattr that was a multiple of a chunk, we will try to read
+    the next chunk and get ENODATA.  If that happens bail out of the loop and
+    assume we've read the whole thing.
+    
+    Backport: hammer, firefly
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 8614dcebf384b74b283cd352001a65fa26ba925c)
+
+commit 931ffe3b3a43157798717e64de8f46fadbcd9e9b
+Author: Boris Ranto <branto at redhat.com>
+Date:   Wed Jun 3 12:24:48 2015 +0200
+
+    common/Cycles.cc: skip initialization if rdtsc is not implemented
+    
+    The Cycles initialization gets stuck in infinite loop if rdtsc is not
+    implemented. This patch fixes the issue by quitting the initialization
+    if rtdsc fails.
+    
+    The patch was cherry-picked from ubuntu patch by James Page, see
+    
+    https://bugzilla.redhat.com/show_bug.cgi?id=1222286
+    
+    for more details on the patch.
+    
+    Signed-off-by: James Page <james.page at ubuntu.com>
+    (cherry picked from commit 35c5fd0091fc4d63b21207fb94e46b343519fd56)
+
+commit 0fde3a2465e156ebf9a5cdc6adc45d66d6d647fc
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Thu Jul 9 13:42:42 2015 +0800
+
+    buffer: Fix bufferlist::zero bug with special case
+    
+    Fixes: #12252
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 43f583d160ccaf879eaf0f3020e77860cf8d1df0)
+
+commit dabc61110a5773262614fc77d3653674aac421f7
+Author: Haomai Wang <haomaiwang at gmail.com>
+Date:   Thu Jul 9 13:32:03 2015 +0800
+
+    UnittestBuffer: Add bufferlist zero test case
+    
+    Signed-off-by: Haomai Wang <haomaiwang at gmail.com>
+    (cherry picked from commit 577acf665948e531e50d36f5780ea19351a5bf65)
+
+commit d08db7a0677412dbe590c850976fb4fe2f503a79 (refs/remotes/gh/wip-11470.hammer)
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Fri Jun 12 19:21:10 2015 +0100
+
+    mon: PaxosService: call post_refresh() instead of post_paxos_update()
+    
+    Whenever the monitor finishes committing a proposal, we call
+    Monitor::refresh_from_paxos() to nudge the services to refresh.  Once
+    all services have refreshed, we would then call each services
+    post_paxos_update().
+    
+    However, due to an unfortunate, non-critical bug, some services (mainly
+    the LogMonitor) could have messages pending in their
+    'waiting_for_finished_proposal' callback queue [1], and we need to nudge
+    those callbacks.
+    
+    This patch adds a new step during the refresh phase: instead of calling
+    directly the service's post_paxos_update(), we introduce a
+    PaxosService::post_refresh() which will call the services
+    post_paxos_update() function first and then nudge those callbacks when
+    appropriate.
+    
+    [1] - Given the monitor will send MLog messages to itself, and given the
+    service is not readable before its initial state is proposed and
+    committed, some of the initial MLog's would be stuck waiting for the
+    proposal to finish.  However, by design, we only nudge those message's
+    callbacks when an election finishes or, if the leader, when the proposal
+    finishes.  On peons, however, we would only nudge those callbacks if an
+    election happened to be triggered, hence the need for an alternate path
+    to retry any message waiting for the initial proposal to finish.
+    
+    Fixes: #11470
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 1551ebb63238073d2fd30201e6b656a8988e958c)
+
+commit 0818e9f78b11801aa619b9ec04eeffb2795c3f62
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jul 9 13:28:22 2015 +0200
+
+    ceph.spec.in: snappy-devel for all supported distros
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit e4634ddcc1c0a2abe51679425d15e6f693811e17)
+    
+    Conflicts:
+    	ceph.spec.in
+                minor difference
+
+commit 8b576bd529d7c1604f0a4cdf97ece64fc5d69447
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Tue Jun 16 18:27:20 2015 +0200
+
+    ceph.spec.in: python-argparse only in Python 2.6
+    
+    argparse is a widely-used Python module for parsing command-line arguments.
+    Ceph makes heavy use of Python scripts, both in the build environment and on
+    cluster nodes and clients.
+    
+    Until Python 2.6, argparse was distributed separately from Python proper.
+    As of 2.7 it is part of the Python standard library.
+    
+    Although the python package in a given distro may or may not Provide:
+    python-argparse, this cannot be relied upon.
+    
+    Therefore, this commit puts appropriate conditionals around Requires:
+    python-argparse and BuildRequires: python-argparse. It does so for Red
+    Hat/CentOS and SUSE only, because the last Fedora version with Python 2.6
+    was Fedora 13, which is EOL.
+    
+    argparse is required by both the ceph and ceph-common packages, but since ceph
+    requires ceph-common, the argparse Requires and BuildRequires need only appear
+    once, under ceph-common.
+    
+    http://tracker.ceph.com/issues/12034 Fixes: #12034
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 23171c952997d104cfa6b5700ec0bb658a8e0915)
+
+commit cdde626f6371e1da501306ed16bc450ee1ec0b91
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Mon Jul 13 18:12:01 2015 +0200
+
+    ceph.spec.in: do not run fdupes, even on SLE/openSUSE
+    
+    In openSUSE there is a policy to use %fdupes in the spec file if RPMLINT
+    complains about duplicate files wasting space in the filesystem.
+    
+    However, RPMLINT is not so complaining, so drop fdupes.
+    
+    http://tracker.ceph.com/issues/12301 Fixes: #12301
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 53072b9019caf72e0313b2804ea174237ed7da33)
+
+commit 6417e8eff942dbbf6cd231ffb73136b7bdcd837f
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Fri Jun 12 17:50:58 2015 +0200
+
+    rpm: add missing Java conditionals
+    
+    http://tracker.ceph.com/issues/11991 Fixes: #11991
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 04e91bbd929801de7f1d6a05086d47a781c2e361)
+
+commit 37284773a754ef4b91d2b5436d46a5fd2be4f67e
+Author: Owen Synge <osynge at suse.com>
+Date:   Fri May 29 13:28:24 2015 +0200
+
+    Add rpm conditionals : cephfs_java
+    
+    Extracted conditionals from SUSE rpm spec file to forward port.
+    Original work done by Thorsten Behrens <tbehrens at suse.com>
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit c65538f489897821877421043300d9c008224f02)
+
+commit 8f78001c2e09d483dcbcd33c24e2ef8043119773
+Author: Nathan Cutler <ncutler at suse.cz>
+Date:   Thu May 14 20:07:37 2015 +0200
+
+    ceph.spec.in: SUSE/openSUSE builds need libbz2-devel
+    
+    http://tracker.ceph.com/issues/11629 Fixes: #11629
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.cz>
+    (cherry picked from commit 584ed2e28b0a31821f29a99cf6078cfd76ee31fc)
+
+commit 4eb58ad2027148561d94bb43346b464b55d041a6
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jun 25 22:37:52 2015 +0200
+
+    ceph.spec.in: use _udevrulesdir to eliminate conditionals
+    
+    The conditionals governing where 50-rbd.rules is installed were not doing the
+    right thing on SUSE distros.
+    
+    Start using the %_udevrulesdir RPM macro, while taking care that it is defined
+    and set to the right value. Use it to eliminate some conditionals around other
+    udev rules files as well.
+    
+    http://tracker.ceph.com/issues/12166 Fixes: #12166
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 8aa758ee7a14e93ded1d55b4aca7a54aa47d7174)
+    
+    Conflicts:
+    	ceph.spec.in
+                hammer does not yet have _with_systemd or ceph_daemon.py
diff --git a/doc/changelog/v0.94.5.txt b/doc/changelog/v0.94.5.txt
new file mode 100644
index 0000000..56c9e50
--- /dev/null
+++ b/doc/changelog/v0.94.5.txt
@@ -0,0 +1,86 @@
+commit 9764da52395923e0b32908d83a9f7304401fee43 (tag: refs/tags/v0.94.5, refs/remotes/gh/hammer)
+Author: Jenkins <jenkins at ceph.com>
+Date:   Mon Oct 26 07:05:32 2015 -0700
+
+    0.94.5
+
+commit 1107f29224e24211860b719b82f9b85a022c25e3
+Merge: d86eab5 d3abcbe
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Oct 23 20:41:33 2015 +0200
+
+    Merge pull request #6348 from dillaman/wip-13567-hammer
+    
+    librbd: potential assertion failure during cache read
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit d86eab5b860186066c888208d92a42a748569d78
+Merge: 4ebfa1b 250dc07
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Oct 23 15:20:32 2015 +0200
+
+    Merge pull request #6362 from liewegas/wip-shut-up-osd-hammer
+    
+    osd/ReplicatedPG: remove stray debug line
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 250dc0722b9156fe1b8be81e09fb4ead699065f3 (refs/remotes/me/wip-shut-up-osd-hammer)
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Sep 12 08:33:44 2015 -0400
+
+    osd/ReplicatedPG: remove stray debug line
+    
+    This snuck in
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ff9600a6cef613d40e875597b6392778df1bb04c)
+
+commit d3abcbea1fdb04f0994f19584b93f6f1b1ff37ca
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Oct 21 13:12:48 2015 -0400
+
+    librbd: potential assertion failure during cache read
+    
+    It's possible for a cache read from a clone to trigger a writeback if a
+    previous read op determined the object doesn't exist in the clone,
+    followed by a cached write to the non-existent clone object, followed
+    by another read request to the same object.  This causes the cache to
+    flush the pending writeback ops while not holding the owner lock.
+    
+    Fixes: #13559
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4692c330bd992a06b97b5b8975ab71952b22477a)
+
+commit 991d0f0575411e2f2b53df35e36ff6170bcc9d8b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Oct 21 13:09:54 2015 -0400
+
+    tests: reproduce crash during read-induced CoW
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 382219b6bba09156f8cf3d420c6348738e7ed4c6)
+
+commit 4ebfa1bcc7e3b57c3c12000633654d36a005d512
+Merge: 9529269 51f3d6a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Oct 22 12:14:42 2015 -0400
+
+    Merge pull request #6330 from dachary/wip-13550-hammer
+    
+    qemu workunit refers to apt-mirror.front.sepia.ceph.com
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 51f3d6a489760dbcb931676396eea92159ca2ad9
+Author: Yuan Zhou <yuan.zhou at intel.com>
+Date:   Fri Jun 19 00:02:20 2015 +0800
+
+    qa: Use public qemu repo
+    
+    This would allow some external tests outside of sepia lab
+    
+    Signed-off-by: Yuan Zhou <yuan.zhou at intel.com>
+    (cherry picked from commit 4731c1e35539c9506ff3fe3141553fad099d0eee)
diff --git a/doc/changelog/v0.94.6.txt b/doc/changelog/v0.94.6.txt
new file mode 100644
index 0000000..7fc155b
--- /dev/null
+++ b/doc/changelog/v0.94.6.txt
@@ -0,0 +1,4027 @@
+commit e832001feaf8c176593e0325c8298e3f16dfb403 (tag: refs/tags/v0.94.6, refs/remotes/gh/hammer)
+Author: Jenkins Build Slave User <jenkins-build at jenkins-slave-wheezy.localdomain>
+Date:   Mon Feb 22 21:10:17 2016 +0000
+
+    0.94.6
+
+commit 7abb6ae8f3cba67009bd022aaeee0a87cdfc6477
+Merge: ceb6fcc a8fc6a9
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 14:19:57 2016 +0700
+
+    Merge pull request #7501 from SUSE/wip-14624-hammer
+    
+    hammer: fsx failed to compile
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit ceb6fcc5f2828995bfe59bfc4e206010a4fe3230
+Merge: 2f4e1d1 f2ca42b
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Feb 5 21:10:46 2016 -0500
+
+    Merge pull request #7524 from ktdreyer/wip-14637-hammer-man-radosgw-admin-orphans
+    
+    hammer: doc: regenerate man pages, add orphans commands to radosgw-admin(8)
+
+commit 2f4e1d1ff8e91fc2ee9c23d5a17c3174d15a7103
+Merge: 2ca3c3e 9ab5fd9
+Author: Orit Wasserman <owasserm at redhat.com>
+Date:   Fri Feb 5 10:30:22 2016 +0100
+
+    Merge pull request #7526 from ceph/wip-14516-hammer
+    
+    hammer: rgw-admin: document orphans commands in usage
+
+commit 2ca3c3e5683ef97902d0969e49980d69c81b4034
+Merge: 02353f6 5c8d1d7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Feb 5 12:47:33 2016 +0700
+
+    Merge pull request #7441 from odivlad/backport-pr-14569
+    
+    [backport] hammer: rgw: Make RGW_MAX_PUT_SIZE configurable
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 02353f6baa460949d7dd2738346d8d748401bc5b
+Merge: f3bab8c 0e1378e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Feb 5 12:46:54 2016 +0700
+
+    Merge pull request #7442 from odivlad/backport-pr-14570
+    
+    [backport] rgw: fix wrong etag calculation during POST on S3 bucket.
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 9ab5fd9d67da43e986489e4f580a597dd8cb551e
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Feb 1 16:33:55 2016 -0800
+
+    rgw-admin: document orphans commands in usage
+    
+    Fixes: #14516
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 105a76bf542e05b739d5a03ca8ae55432350f107)
+    
+    Conflicts:
+    	src/rgw/rgw_admin.cc (trivial resolution)
+
+commit 0e1378effdd1d0d70d3de05c79b208e9f8b8e328
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Mon Sep 21 20:32:29 2015 +0200
+
+    [backport] rgw: fix wrong etag calculation during POST on S3 bucket.
+    
+    Closes: #14570
+    (cherry picked from commit 742906a)
+    
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    Signed-off-by: Vladislav Odintsov <odivlad at gmail.com>
+    Tested-by: Vladislav Odintsov <odivlad at gmail.com>
+
+commit 5c8d1d74069f70b85bc4286e6d1136bce1dc593f
+Author: Yuan Zhou <yuan.zhou at intel.com>
+Date:   Thu Jul 9 16:56:07 2015 +0800
+
+    [backport] rgw: Make RGW_MAX_PUT_SIZE configurable
+    
+    The 5GB limit of a single operation uploading was part of S3 spec.
+    However some private setups may have some special requirements
+    on this limit. It's more convinent to have a configurable value.
+    
+    Closes: http://tracker.ceph.com/issues/14569
+    (cherry picked from commit df97f28)
+    
+    Signed-off-by: Yuan Zhou <yuan.zhou at intel.com>
+    Signed-off-by: Vladislav Odintsov <odivlad at gmail.com>
+    Tested-by: Vladislav Odintsov <odivlad at gmail.com>
+
+commit f2ca42b1218182f4bfa27718c9606705d8b9941f
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Wed Feb 3 19:51:58 2016 -0700
+
+    doc: add orphans commands to radosgw-admin(8)
+    
+    The --help text was added in 105a76bf542e05b739d5a03ca8ae55432350f107.
+    Add the corresponding entries to the man page.
+    
+    Fixes: #14637
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    
+    (cherry picked from commit ec162f068b40f594c321df5caa9fe2541551b89e)
+      Cherry-pick to hammer includes nroff source change (in master the
+      nroff sources are no longer present in Git.)
+
+commit e42ed6d6414ad55d671dd0f406b1dababd643af8
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Thu Feb 4 11:04:39 2016 -0700
+
+    man: rebuild manpages
+    
+    following the procedure in admin/manpage-howto.txt.
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit a8fc6a9ffb2f8021657ad412fd0aaaaf7f98bd53
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Wed Jan 13 13:17:53 2016 -0800
+
+    fsx: checkout old version until it compiles properly on miras
+    
+    I sent a patch to xfstests upstream at
+    http://article.gmane.org/gmane.comp.file-systems.fstests/1665, but
+    until that's fixed we need a version that works in our test lab.
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 7d52372ae74878ebd001036ff0a7aad525eb15b6)
+
+commit f3bab8c7bc6bba3c79329d7106684596634e17a6
+Merge: 31d86b1 1b02859
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 3 12:41:56 2016 +0700
+
+    Merge pull request #7454 from dachary/wip-14584-hammer
+    
+    hammer: fsstress.sh fails
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 31d86b1580d59581d130e7a5e84905a5b4d67666
+Merge: 2c8e579 2817ffc
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 3 11:38:57 2016 +0700
+
+    Merge pull request #6918 from asheplyakov/hammer-bug-12449
+    
+    osd: check for full before changing the cached obc (hammer)
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1b02859480677abbd8708650764ed6815917e0cd
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Tue Aug 18 15:22:55 2015 +0800
+
+    qa/fsstress.sh: fix 'cp not writing through dangling symlink'
+    
+    On some test machines, /usr/lib/ltp/testcases/bin/fsstress is
+    dangling symlink. 'cp -f' is impotent in this case.
+    
+    Fixes: #12710
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 479f2a760baf6af4714d3391a366a6b3acf1bcaf)
+
+commit 2c8e57934284dae0ae92d1aa0839a87092ec7c51
+Merge: 1cab151 700be56
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:42:29 2016 -0500
+
+    Merge pull request #7236 from athanatos/wip-14376
+    
+    config_opts: increase suicide timeout to 300 to match recovery
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1cab151a6cdc8a1b9b2f11518b77ea149c19d067
+Merge: a134c44 5105d50
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:42:12 2016 -0500
+
+    Merge pull request #6450 from dachary/wip-13672-hammer
+    
+    tests: testprofile must be removed before it is re-created
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a134c44d626ead3308464474d67604363bac6f5d
+Merge: 520792d 3f1292e
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:41:39 2016 -0500
+
+    Merge pull request #6680 from SUSE/wip-13859-hammer
+    
+    hammer: ceph.spec.in License line does not reflect COPYING
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+
+commit 520792d51e949c451767d116e267d86fee812ada
+Merge: 4d0fafb c2c6d02
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:41:18 2016 -0500
+
+    Merge pull request #6791 from branch-predictor/bp-5812-backport
+    
+    Race condition in rados bench
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+
+commit 4d0fafb289fc35f44e6e74bb974c402ba147d4d4
+Merge: 211a093 6379ff1
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:40:38 2016 -0500
+
+    Merge pull request #6973 from dreamhost/wip-configure-hammer
+    
+    configure.ac: no use to add "+" before ac_ext=c
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 211a093d4107c1806ad7e4876bc5c550a5b5b7d4
+Merge: 0c13656 53742bd
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:40:13 2016 -0500
+
+    Merge pull request #7206 from dzafman/wip-14292
+    
+    osd/PG.cc: 3837: FAILED assert(0 == "Running incompatible OSD")
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+
+commit 0c136561600e295ec48dcf29a77aa2cd293a7236
+Merge: 1ea14ba ae56de0
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:39:42 2016 -0500
+
+    Merge pull request #7207 from rldleblanc/recency_fix_for_hammer
+    
+    hammer: osd/ReplicatedPG: Recency fix for Hammer
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1ea14bae10930ed3e66b7b0140e359009a44275e
+Merge: 1740d8c 8d9e08c
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:39:11 2016 -0500
+
+    Merge pull request #7347 from tchaikov/wip-hammer-10093
+    
+    tools: ceph-monstore-tool must do out_store.close()
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1740d8ce8eb7e7debce1684a19736783489628c3
+Merge: 7848cdc c7252a3
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:38:35 2016 -0500
+
+    Merge pull request #7411 from dachary/wip-14467-hammer
+    
+    hammer: disable filestore_xfs_extsize by default
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 7848cdc4c8c3598cd291d26a2dd4d76abc4bcda9
+Merge: 57abeab 70f1ba3
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:38:13 2016 -0500
+
+    Merge pull request #7412 from dachary/wip-14470-hammer
+    
+    tools: tool for artificially inflate the leveldb of the mon store for testing purposes
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 57abeab1f2610d89f0ab2a028c8e093afde5e403
+Merge: 4d7d7c3 9109304
+Author: Sage Weil <sage at redhat.com>
+Date:   Sat Jan 30 21:37:46 2016 -0500
+
+    Merge pull request #7446 from liewegas/wip-14537-hammer
+    
+    mon: compact full epochs also
+    
+    http://pulpito.ceph.com/sage-2016-01-30_09:58:32-rados-wip-sage-testing-hammer---basic-mira/
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 4d7d7c33ff58ffeb27b47d379bf7dd4af90785b0
+Merge: 8360486 8c28f2f
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Sat Jan 30 11:45:31 2016 -0800
+
+    Merge pull request #7182 from dachary/wip-14143-hammer
+    
+    hammer: Verify self-managed snapshot functionality on image create
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 8360486764c3ab4e10a34f5bdf7555e4c3385977
+Merge: 501e01a b2961ce
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Sat Jan 30 11:45:20 2016 -0800
+
+    Merge pull request #7183 from dachary/wip-14283-hammer
+    
+    hammer: rbd: fix bench-write
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 501e01acc55f846cd3ad85e8294a9598c1c90907
+Merge: 97d4f6a 24c0b27
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Sat Jan 30 11:45:05 2016 -0800
+
+    Merge pull request #7416 from dachary/wip-14466-hammer
+    
+    hammer: rbd-replay does not check for EOF and goes to endless loop
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 97d4f6a7bed5a0d47f18b3a223a916aef355eaf9
+Merge: 51cc015 46d626d
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Sat Jan 30 11:44:50 2016 -0800
+
+    Merge pull request #7417 from dachary/wip-14553-hammer
+    
+    hammer: rbd: TaskFinisher::cancel should remove event from SafeTimer
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 51cc015c7e20d2ea9b9517238481fb80687be17c
+Merge: 23c24fc 73e03de
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Sat Jan 30 11:44:32 2016 -0800
+
+    Merge pull request #7407 from dillaman/wip-14543-hammer
+    
+    librbd: ImageWatcher shouldn't block the notification thread
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 23c24fc50d07a07db12239ac372bfce5a9fe2255
+Merge: 9513391 26e832e
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Sat Jan 30 11:44:12 2016 -0800
+
+    Merge pull request #6980 from dillaman/wip-14063-hammer
+    
+    librbd: fix merge-diff for >2GB diff-files
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 91093041a86fda40de08a366b5118e5e3ae275f0 (refs/remotes/me/wip-14537-hammer)
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Thu Jan 28 02:09:53 2016 -0800
+
+    mon: compact full epochs also
+    
+    by compacting the ${prefix}.${start}..${prefix}..${end} does not
+    necessary compact the range of ${prefix}."full_"${start}..
+    ${prefix}."full_"${end}. so when more and more epochs get trimmed
+    with out a full range compaction, the size of monitor store could
+    be very large.
+    
+    Fixes: #14537
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 93d633a25ad8c36c972bb766c38187e2612041e1)
+
+commit 2817ffcf4e57f92551b86388681fc0fe70c386ec
+Author: Alexey Sheplyakov <asheplyakov at mirantis.com>
+Date:   Wed Dec 16 15:31:52 2015 +0300
+
+    Check for full before changing the cached obc
+    
+    ReplicatedPG::prepare_transaction(): check if the pool is full before
+    updating the cached ObjectContext to avoid the discrepancy between
+    the cached and the actual object size (and other metadata).
+    While at it improve the check itself: consider cluster full flag,
+    not just the pool full flag, also consider object count changes too,
+    not just bytes.
+    
+    Based on commit a1eb380c3d5254f9f1fe34b4629e51d77fe010c1
+    
+    Fixes: #13335
+    
+    Signed-off-by: Alexey Sheplyakov <asheplyakov at mirantis.com>
+
+commit 951339103d35bc8ee2de880f77aada40d15b592a (refs/remotes/gh/wip-test-14716-4)
+Merge: e43aca5 5e5b512
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 29 23:31:47 2016 +0700
+
+    Merge pull request #6353 from theanalyst/wip-13513-hammer
+    
+    rgw: value of Swift API's X-Object-Manifest header is not url_decoded during segment look up
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit e43aca51d630274a57237b0f91a56df79ce8874a
+Merge: 7e20e6e 4420929
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 29 23:31:16 2016 +0700
+
+    Merge pull request #6620 from SUSE/wip-13820-hammer
+    
+    hammer: rgw: Setting ACL on Object removes ETag
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 7e20e6e9d6626c5ac8b1f479011ab77a9e87da23
+Merge: f1d5570 cbb5c1f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 29 23:30:57 2016 +0700
+
+    Merge pull request #7186 from dachary/wip-13888-hammer
+    
+    hammer: rgw: orphans finish segfaults
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit ae56de09fe1385958b5b600d1f0c91383989926f
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Nov 25 14:40:26 2015 -0500
+
+    osd: recency should look at newest (not oldest) hitsets
+    
+    Reported-by: xinxin shu <xinxin.shu at intel.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 528eae92d010ea34ae8cf0e8b2290aaa5e058d24)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc
+                        code section was moved to ReplicatedPG::maybe_promote
+                        in master.
+    Signed-off-by: Robert LeBlanc <robert.leblanc at endurance.com>
+
+commit 5cefcb975771f0c2efb7dfc77ce14a93a4ee7f1b
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Nov 25 14:39:08 2015 -0500
+
+    osd/ReplicatedPG: fix promotion recency logic
+    
+    Recency is defined as how many of the last N hitsets an object
+    must appear in in order to be promoted.  The previous logic did
+    nothing of the sort... it checked for the object in any one of
+    the last N hitsets, which led to way to many promotions and killed
+    any chance of the cache performing properly.
+    
+    While we are here, we can simplify the code to drop the max_in_*
+    fields (no longer necessary).
+    
+    Note that we may still want a notion of 'temperature' that does
+    tolerate the object missing in one of the recent hitsets.. but
+    that would be different than recency, and should probably be
+    modeled after the eviction temperature model.
+    
+    Backport: infernalis, hammer
+    Reported-by: Nick Fisk <nick at fisk.me.uk>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 180c8743addc5ae2f1db9c58cd2996ca6e7ac18b)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc
+                        code section was moved to ReplicatedPG::maybe_promote
+                        in master.
+    Signed-off-by: Robert LeBlanc <robert.leblanc at endurance.com>
+
+commit f1d5570beab0769b925b917e402d441ff053794c
+Merge: c4bb343 50c82f2
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 29 08:52:51 2016 -0500
+
+    Merge pull request #5789 from SUSE/wip-12928-hammer
+    
+    rpm: libcephfs_jni1 has no %post and %postun
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c4bb34320df8bfa734512a400fe8664c131363ff
+Merge: 86ba6ca a5e4f70
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 29 08:50:56 2016 -0500
+
+    Merge pull request #7434 from tchaikov/wip-14441-hammer
+    
+    man: document listwatchers cmd in "rados" manpage
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a5e4f70af422b05ece53f245bc15491bb1dd540d
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Dec 23 11:23:38 2015 +0800
+
+    man: document listwatchers cmd in "rados" manpage
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit c2e391301efc43f0b431e89737246b2c43bf10a9)
+    
+    man/rados.8: also added the rendered man.8 man page, as we don't
+                 put the generated man pages in master anymore. but
+                 they are still in the hammer's source repo.
+
+commit 46d626d92d7af218816d831cfcc1265b3ea31b72
+Author: Douglas Fuller <dfuller at redhat.com>
+Date:   Fri Jan 22 11:18:40 2016 -0800
+
+    rbd: remove canceled tasks from timer thread
+    
+    When canceling scheduled tasks using the timer thread, TaskFinisher::cancel
+    does not call SafeTimer::cancel_event, so events fire anyway. Add this call.
+    
+    Fixes: #14476
+    Signed-off-by: Douglas Fuller <dfuller at redhat.com>
+    (cherry picked from commit 2aa0f318c862dbe3027d74d345671506605778eb)
+
+commit 24c0b27c6f6a26c2b7bab5bcbc421a18592d026f
+Author: Mykola Golub <mgolub at mirantis.com>
+Date:   Thu Jan 21 13:45:42 2016 +0200
+
+    rbd-replay: handle EOF gracefully
+    
+    Fixes: #14452
+    Signed-off-by: Mykola Golub <mgolub at mirantis.com>
+    (cherry picked from commit c59b84c3e2c9bbda68219e4d2288a889dd9ca6cb)
+    
+    Conflicts:
+    	src/rbd_replay/BufferReader.cc: trivial resolution
+            caused by s/CEPH_PAGE_SIZE/CEPH_BUFFER_APPEND_SIZE/
+            in the context of one hunk.
+
+commit 70f1ba33fe1a81d2631d54429749433a6cbfca44
+Author: Cilang Zhao <zhao.cilang at h3c.com>
+Date:   Tue Jan 5 14:34:05 2016 +0800
+
+    tools: monstore: add 'show-versions' command.
+    
+    Using this tool, the first/last committed version of maps will be shown.
+    
+    Signed-off-by: Cilang Zhao <zhao.cilang at h3c.com>
+    (cherry picked from commit 21e6ba0c18428caff45733e6b43d197be38af8bb)
+
+commit 926017187910c9e6a3fb8babf9b498cf07941819
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Sep 16 18:28:52 2015 +0800
+
+    tools: ceph_monstore_tool: add inflate-pgmap command
+    
+    this command repeatly add the latest pgmap to the monstore in order
+    to inflate it. the command helps with the testing of some monstore
+    related performance issue of monitor
+    
+    Fixes: #14217
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit b0f6af814a58dd374ca95e84a4e381f8ef1368de)
+
+commit a1d5728c928eb7e6b8c655741a0db3398ced7d56
+Author: Bo Cai <cai.bo at h3c.com>
+Date:   Tue Oct 20 15:23:49 2015 +0800
+
+    tools:support printing the crushmap in readable fashion.
+    
+    Signed-off-by: Bo Cai <cai.bo at h3c.com>
+    (cherry picked from commit b7faf678ed0241abc7eb86b9baaa6db669a22d53)
+
+commit bd9484750f546974047dacd9176a8072be846596
+Author: Bo Cai <cai.bo at h3c.com>
+Date:   Mon Sep 14 19:50:47 2015 +0800
+
+    tools:print the map infomation in human readable format.
+    
+    Signed-off-by: Bo Cai <cai.bo at h3c.com>
+    (cherry picked from commit 5ed8cdc19150382c946a373ec940d76f98e6ecb7)
+
+commit fba65832aad8a46d94a9256a56997e9df9e62297
+Author: Bo Cai <cai.bo at h3c.com>
+Date:   Mon Sep 14 19:19:05 2015 +0800
+
+    tools:remove the local file when get map failed.
+    
+    Signed-off-by: Bo Cai <cai.bo at h3c.com>
+    (cherry picked from commit 0b03b32d8ba76fe9f6f1158e68eb440e3670393a)
+
+commit 1bb899a290b77188b44a53ef7c7a40910c9248b2
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Mon Jul 13 12:35:13 2015 +0100
+
+    tools: ceph_monstore_tool: describe behavior of rewrite command
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit a881f9385feb0f5a61fa22357984d6f291c08177)
+
+commit 9035c69481f4aa4786414ac41cbc36fb4a3ca51d
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Jun 19 22:57:57 2015 +0800
+
+    tools/ceph-monstore-tools: add rewrite command
+    
+    "rewrite" command will
+     - add a new osdmap version to update current osdmap held by OSDMonitor
+     - add a new paxos version, as a proposal it will
+       * rewrite all osdmap epochs from specified epoch to  the last_committed
+         one with the specified crush map.
+       * add the new osdmap which is added just now
+    so the leader monitor can trigger a recovery process to apply the transaction
+    to all monitors in quorum, and hence bring them back to normal after being
+    injected with a faulty crushmap.
+    
+    Fixes: #11815
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 306373427836ca0c2418dbe6caab26d74d94d12e)
+
+commit 90aaed744243dfc7c620f91e19fc0bfa233f711f
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Tue Apr 21 14:04:40 2015 +0800
+
+    tools: ceph-monstore-tool must do out_store.close()
+    
+    this change fixes the "store-copy" command.
+    Like the bug reported in http://tracker.ceph.com/issues/10093.
+    
+    Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    (cherry picked from commit d85e0f8c50fce62be012506f7ffcb1cdeb0c819c)
+
+commit c7252a3d54bae88f91c2b4e63fc9c27cfbb2423e
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Mon Jan 18 08:24:46 2016 -0700
+
+    osd: disable filestore_xfs_extsize by default
+    
+    This option involves a tradeoff: When disabled, fragmentation is worse,
+    but large sequential writes are faster. When enabled, large sequential
+    writes are slower, but fragmentation is reduced.
+    
+    Fixes: #14397
+    (cherry picked from commit aed85775bf53c273786ce4999320134822722af5)
+
+commit 86ba6caf992d2544cdd174e3b3f26a6099c91fc5
+Merge: b6b8ee4 0325f8a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 29 10:36:05 2016 +0700
+
+    Merge pull request #7316 from ceph/wip-deb-lttng-hammer
+    
+    deb: strip tracepoint libraries from Wheezy/Precise builds
+    
+    All other "modern" Debian-based OSes have a functional LTTng-UST. Since only hammer needs to build on these older distros, this fix only affects the deb building process for those two releases(since autoconf detects that LTTng is broken).
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit b6b8ee41fc77679e82304e79da6dbd0c35f5c067
+Merge: d54840b f96c812
+Author: Loic Dachary <loic at dachary.org>
+Date:   Fri Jan 29 10:21:43 2016 +0700
+
+    Merge pull request #7187 from dachary/wip-13831-hammer
+    
+    hammer: init script reload doesn't work on EL7
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 73e03def9271fb5d1739b195e428c3ebfcebd59b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 28 14:38:20 2016 -0500
+
+    librbd: ImageWatcher shouldn't block the notification thread
+    
+    Blocking the notification thread will also result in librados async
+    callbacks becoming blocked (since they use the same thread).
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 7e2019a72733dff43e55c9b22df12939d584f87d)
+    
+     Conflicts:
+    	src/librbd/ImageWatcher.[cc|h]: fewer RPC messages
+
+commit 5617166f78c1995436b4e0794dab2d8254331815
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 28 14:35:54 2016 -0500
+
+    librados_test_stub: watch/notify now behaves similar to librados
+    
+    Notifications are executed via the same librados AIO callback
+    thread, so it's now possible to catch deadlock.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 43722571838a2d78ca8583b5a1ea381cd988de0b)
+
+commit 8fc82b23304ef327933723373cd4d1090d04bfbc
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 28 12:40:18 2016 -0500
+
+    tests: simulate writeback flush during snap create
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit e9570fcf4be9cd5c06937769d074fa52ffb32e4b)
+
+commit d54840bf4a70fc65285bbfdff0c7bf8f579643b1
+Merge: 4051bc2 9f30fe1
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jan 26 10:12:29 2016 -0500
+
+    Merge pull request #7365 from liewegas/wip-tcmalloc-hammer
+    
+    osd: pass tcmalloc env through to ceph-osd
+    
+    Reviewed-by: Ken Dreyer <kdreyer at redhat.com>
+
+commit 9f30fe18e839f5846c90e3b5995171a0132d7f3a
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Jan 26 08:43:15 2016 -0500
+
+    upstart/ceph-osd.conf: pass TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES through
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit a95a3d34cccb9f9f0782a96ca05e5fe9c2b01772)
+
+commit a58873e213d7423d89c95db4e1710dc9631e3313
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Jan 20 18:36:08 2016 -0500
+
+    init-ceph: pass TCMALLOC_MAX_TOTAL_THREAD_CACHE_BYTES through
+    
+    ..when set in the sysconfig/default file.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 03e01ae263ef207046933890821ae75d5e60d9b8)
+    
+    [source default/sysconfig file too]
+
+commit 8d9e08c44150a4f3ad06ec1abc130b9aeaf479d9
+Author: huangjun <hjwsm1989 at gmail.com>
+Date:   Tue Apr 21 14:04:40 2015 +0800
+
+    tools: ceph-monstore-tool must do out_store.close()
+    
+    this change fixes the "store-copy" command.
+    Like the bug reported in http://tracker.ceph.com/issues/10093.
+    
+    Signed-off-by: huangjun <hjwsm1989 at gmail.com>
+    (cherry picked from commit d85e0f8c50fce62be012506f7ffcb1cdeb0c819c)
+
+commit 0325f8af5cbee3d74e9f363f61c2e2ababf501d9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 21 15:36:37 2016 -0500
+
+    deb: strip tracepoint libraries from Wheezy/Precise builds
+    
+    These releases do not (by default) have a sane LTTng-UST environment,
+    which results in autoconf disabling support for tracing.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 4051bc2a5e4313ac0f6236d7a34ed5fb4a1d9ea2
+Merge: 4e67418 e4d3e9b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jan 18 20:46:07 2016 -0500
+
+    Merge pull request #7252 from ceph/wip-13483-hammer
+    
+    qa: remove legacy OS support from rbd/qemu-iotests
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit e4d3e9b29aa6a5f9efff8b787949a5bbf48ad7de (refs/remotes/gh/wip-13483-hammer)
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Jan 18 15:57:43 2016 -0500
+
+    qa: disable rbd/qemu-iotests test case 055 on RHEL/CentOS
+    
+    Fixes: #14385
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit f7acd44c26310242b69ee50322bd6b43fdc774b9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Oct 15 12:44:06 2015 -0400
+
+    qa: remove legacy OS support from rbd/qemu-iotests
+    
+    RHEL7 derivatives were failing test 002 since they were using
+    legacy test cases for now unsupported OSes.
+    
+    Fixes: #13483
+    Signed-off-by: Vasu Kulkarni <vasu at redhat.com>
+
+commit 8c28f2f28d960d823ffd632671edaf029c30fb0f
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Dec 14 17:41:49 2015 -0500
+
+    librbd: optionally validate RBD pool configuration (snapshot support)
+    
+    Fixes: #13633
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 1fea4dadc60e13518e9ee55d136fbc4e9d3a621e)
+    
+    Conflicts:
+    	src/common/config_opts.h: trivial resolution
+
+commit 700be56c530879a72a628c62265d18f0a5d8fb3b
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Jan 14 08:35:23 2016 -0800
+
+    config_opts: increase suicide timeout to 300 to match recovery
+    
+    Fixes: 14376
+    Backport: hammer, firefly
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+
+commit 4e67418958e5caf5e4f81c4ed566e8c7269930fa
+Merge: 28e99a9 1ab2b48
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:21:50 2016 -0500
+
+    Merge pull request #7179 from dachary/wip-14287-hammer
+    
+    hammer: ReplicatedPG: wrong result code checking logic during sparse_read
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 28e99a90b38ce8c0285c1aec9c5524365385be00
+Merge: 17a2965 86f5cf6
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:20:53 2016 -0500
+
+    Merge pull request #7178 from dachary/wip-14285-hammer
+    
+    hammer: osd/OSD.cc: 2469: FAILED assert(pg_stat_queue.empty()) on shutdown
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 17a2965825494765249c244aef59ebd821711d42
+Merge: a1459ea b0856ee
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:20:34 2016 -0500
+
+    Merge pull request #7177 from dachary/wip-14043-hammer
+    
+    hammer: osd/PG.cc: 288: FAILED assert(info.last_epoch_started >= info.history.last_epoch_started)
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a1459eacd7cc0d064493d01f963b8c1231cd3518
+Merge: c9a13a1 9cee89b
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:20:10 2016 -0500
+
+    Merge pull request #7180 from dachary/wip-14288-hammer
+    
+    hammer: ceph osd pool stats broken in hammer
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c9a13a12e88c9a18bfb3cc99d4a7c103b4330426
+Merge: 174a1a9 4d0b9a1
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:19:18 2016 -0500
+
+    Merge pull request #6994 from badone/wip-13993-hammer
+    
+    log: Log.cc: Assign LOG_DEBUG priority to syslog calls
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 174a1a974725ce4025be4dfdf3b13df766dfac76
+Merge: cb167e9 6cf261c
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:18:55 2016 -0500
+
+    Merge pull request #6839 from SUSE/wip-13789-hammer
+    
+    Objecter: potential null pointer access when do pool_snap_list.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit cb167e998bbbdf1b9c273f6bc4f118796d396d37
+Merge: 1c4ba85 66ff0aa
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:18:23 2016 -0500
+
+    Merge pull request #6835 from SUSE/wip-13892-hammer
+    
+    hammer: auth/cephx: large amounts of log are produced by osd
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1c4ba855b34290069c7ce0fa990fe72b7a1b381e
+Merge: 72b6b68 61da13b
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:17:53 2016 -0500
+
+    Merge pull request #6834 from SUSE/wip-13930-hammer
+    
+    hammer: Ceph Pools' MAX AVAIL is 0 if some OSDs' weight is 0
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 72b6b68f43ffc953ca7f3056574bd68428a5abe8
+Merge: d064f9f 53e81aa
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:17:25 2016 -0500
+
+    Merge pull request #6832 from SUSE/wip-13936-hammer
+    
+    hammer: Ceph daemon failed to start, because the service name was already used.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit d064f9f6b3bc93fa5887304a9b9ab92d503ebd15
+Merge: 0ca6285 ac05617
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Jan 14 09:16:54 2016 -0500
+
+    Merge pull request #6755 from SUSE/wip-13870-hammer
+    
+    hammer: OSD: race condition detected during send_failures
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 0ca62855f22136c7042a5988366d46e59629f206
+Merge: e9f545b a81bcf7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jan 14 08:22:35 2016 +0100
+
+    Merge pull request #6415 from dillaman/wip-13541-hammer
+    
+    LTTng-UST tracing should be dynamically enabled
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit e9f545b4a44c91faf91a8ae3824b1b0d46909244
+Merge: 8521916 b2f1e76
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jan 14 08:15:02 2016 +0100
+
+    Merge pull request #7176 from dachary/wip-13440-hammer
+    
+    ceph-disk prepare fails if device is a symlink
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 85219163f9b78faa3c1fe96cad7129c6813550c0
+Merge: ebfb3fb 5264bc6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jan 14 08:14:31 2016 +0100
+
+    Merge pull request #7150 from jecluis/wip-14236
+    
+    mon: OSDMonitor: do not assume a session exists in send_incremental()
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit ebfb3fbe8a1920474941d4a95540cc4a53a747d4
+Merge: e1b9208 447ab1d
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Jan 13 17:15:32 2016 -0800
+
+    Merge pull request #7226 from dillaman/wip-13810-hammer
+    
+    tests: notification slave needs to wait for master
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 447ab1d70a63fceed39518d5714c138c54f6525e
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Jan 13 12:44:01 2016 -0500
+
+    tests: notification slave needs to wait for master
+    
+    If the slave instance starts before the master, race
+    conditions are possible.
+    
+    Fixes: #13810
+    Backport: infernalis, hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3992d6fe67bbf82322cedc1582406caaf6d4de60)
+
+commit 53742bdbc587747c93413f9db38f3eeb71487872
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Jun 15 17:55:41 2015 -0700
+
+    ceph_osd: Add required feature bits related to this branch to osd_required mask
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 0b2bab460c013ea5cece10ea028d26da3485eaf5)
+
+commit 3066231865e2fe56344de9db26024ac65e03053d
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Jun 4 18:47:42 2015 -0700
+
+    osd: CEPH_FEATURE_CHUNKY_SCRUB feature now required
+    
+    Feature present since at least the Dumpling release.
+    A later commit will add it to the osd_required mask
+    
+    Fixes: #11661
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 7a10a7e196efd0f59fa7adb87d0a120655b227d8)
+
+commit e1b92081c9e4b21eb30cc873c239083a08fce12f
+Merge: 9708e59 3d3595f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Jan 12 14:28:26 2016 +0100
+
+    Merge pull request #6530 from SUSE/wip-13760-hammer
+    
+    unknown argument --quiet in udevadm settle
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 6379ff16dbc7fdecccaa8874d978d1ab58ce44cf
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue May 5 15:07:33 2015 +0800
+
+    configure.ac: no use to add "+" before ac_ext=c
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 899dd23766c5ae6fef39bf24ef0692127d17deb3)
+    Signed-off-by: Robin H. Johnson <robin.johnson at dreamhost.com>
+
+commit f96c8125d423f24e52df0f8420b0b2748e34ca90
+Author: Herve Rousseau <hroussea at cern.ch>
+Date:   Fri Nov 6 09:52:28 2015 +0100
+
+    rgw: fix reload on non Debian systems.
+    
+    When using reload in non-debian systems, /bin/sh's kill is used to send the HUP signal to the radosgw process.
+    This kill version doesn't understand -SIGHUP as a valid signal, using -HUP does work.
+    
+    Fix: #13709
+    Backport: hammer
+    Signed-off-by: Hervé Rousseau <hroussea at cern.ch>
+    (cherry picked from commit 1b000abac3a02d1e788bf25eead4b6873133f5d2)
+
+commit cbb5c1fc2386205277ad22474c1f696a07fcb972
+Author: Igor Fedotov <ifedotov at mirantis.com>
+Date:   Thu Nov 19 13:38:40 2015 +0300
+
+    Fixing NULL pointer dereference
+    
+    Signed-off-by: Igor Fedotov <ifedotov at mirantis.com>
+    (cherry picked from commit 93d3dfe0441be50a6990d458ee0ee3289af39b20)
+
+commit b2961cef3d8e84d2302815e33eb7dc9033d2bb78
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Aug 18 16:05:29 2015 -0400
+
+    rbd: fix bench-write
+    
+    Make each IO get a unique offset!
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 333f3a01a9916c781f266078391c580efb81a0fc)
+
+commit 9cee89bbdd1d89d2fe72c8d73fc0c18db515198a
+Author: BJ Lougee <almightybeeij at gmail.com>
+Date:   Mon Apr 13 11:24:38 2015 -0500
+
+    Check that delta_sum.stats.sum.num_object_copies and delta_sum.stats.sum.num_object are greater than zero
+    
+    This fixes division by zero.
+    
+    Signed-off-by BJ Lougee <almightybeeij at gmail.com>
+    
+    (cherry picked from commit 27ed729c1088133400aa072eeca9e125942f2d94)
+
+commit 1ab2b481596ad5296e168bf8027e59d41190176e
+Author: xiexingguo <258156334 at qq.com>
+Date:   Tue Dec 22 17:05:06 2015 +0800
+
+    ReplicatedPG: fix sparse-read result code checking logic
+    
+    Move ahead the result code checking logic before we continue to verify the trailing hole, otherwise
+    the real result of non-hole reading may be overwritten and thus confuse caller.
+    
+    Fixes: #14151
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    (cherry picked from commit b3aa29e324cf0a96a1f2f5dcf1ba998219457bcd)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc: trivial resolution
+
+commit 86f5cf6caa36760802775df19cdabe55bcafa33e
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 1 09:32:04 2016 -0500
+
+    osd: clear pg_stat_queue after stopping pgs
+    
+    Fixes: #14212
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit c25ff9927febe77cda31b534971b62f75c196ca2)
+
+commit b0856ee67c0e7cf6ab6095d3f657c18014859526
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 3 14:52:24 2015 -0800
+
+    osd: Test osd_find_best_info_ignore_history_les config in another assert
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 02a9a41f151a3d968bf8066749658659dc6e3ac4)
+
+commit b2f1e76d8e95b6e2f88fa1c122ea8cd24532cd10
+Author: Joe Julian <jjulian at io.com>
+Date:   Fri Oct 9 12:57:06 2015 -0700
+
+    Compare parted output with the dereferenced path
+    
+    Compare parted output with the dereferenced path of the device as parted
+    prints that instead of the symlink we called it with.
+    
+    http://tracker.ceph.com/issues/13438 Fixes: #13438
+    
+    Signed-off-by: Joe Julian <jjulian at io.com>
+    (cherry picked from commit b3c7cb098195111b9c642e5a9b726b63717f2e0d)
+
+commit 9708e59a1fc2ae52cfae848ce585751bc9fbe572
+Merge: 9739d4d b62cac6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Jan 11 09:01:12 2016 +0100
+
+    Merge pull request #6512 from SUSE/wip-13734-hammer
+    
+    rgw: swift API returns more than real object count and bytes used when retrieving account metadata
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 5264bc677f0f612165987bf51fe7d7b4af32fa77
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Thu Jan 7 19:20:47 2016 +0000
+
+    mon: OSDMonitor: do not assume a session exists in send_incremental()
+    
+    We may not have an open session for a given osd. If we blindly assume we
+    do, we may end up trying to send incrementals we do not have to the osd.
+    
+    And then we will crash.
+    
+    This fixes a regression introduced by
+    
+      171fee1b82d2675e364da7f96dfb9dd286d9b6e6
+    
+    which is meant as a backport of
+    
+      de43a02e06650a552f048dc8acd17f255126fed9
+    
+    but so happens to intruduce a line that wasn't on the original patch. We
+    imagine it was meant to make the 's->osd_epoch' assignment work without
+    checking the session, as per the original patch, but the backporter must
+    have forgotten to also backport the assertion on the not-null session.
+    The unfortunate introduction of the check for a not-null session
+    triggered this regression.
+    
+    The regression itself is due to enforcing that a session exists for the
+    osd we are sending the incrementals to. However, if we come via the
+    OSDMonitor::process_failures() path, that may very well not be the case,
+    as we are handling potentially-old MOSDFailure messages that may no
+    longer have an associated session. By enforcing the not-null session, we
+    don't check whether we have the requested versions (i.e., if
+    our_earliest_version <= requested_version), and thus we end up on the
+    path that assumes that we DO HAVE all the necessary versions -- when we
+    may not, thus finally asserting because we are reading blank
+    incremental versions.
+    
+    Fixes: #14236
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+
+commit 4d0b9a1bbbabe7b27279a7b6e0a45f5b0d920c66
+Author: Brad Hubbard <bhubbard at redhat.com>
+Date:   Mon Dec 7 11:31:28 2015 +1000
+
+    log: Log.cc: Assign LOG_DEBUG priority to syslog calls
+    
+    Fixes: #13993
+    Signed-off-by: Brad Hubbard <bhubbard at redhat.com>
+    (cherry picked from commit 8e93f3f45db681f82633ca695a7dc4e7bd030584)
+
+commit 26e832e76de90e0a751868b044ea745a97a5af82
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Dec 18 15:22:13 2015 -0500
+
+    librbd: fix merge-diff for >2GB diff-files
+    
+    Fixes: #14063
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 9739d4de49f8167866eda556b2f1581c068ec8a7
+Merge: d064636 a9d3f07
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Dec 17 10:16:29 2015 -0500
+
+    Merge pull request #6544 from liewegas/wip-smaller-object-info
+    
+    osd: make encoded object_info_t smaller to fit inside the XFS inode
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit a9d3f078cb6cdaf7f8778ba1a07d333548a9d1a2
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 14 13:13:33 2015 -0500
+
+    osd/osd_types: skip encoding newer object_info_t fields if they are unused
+    
+    This reduces the size of the encoded object_info_t in most cases,
+    enough to get us under the 255 byte limit for a single inline
+    xattr in XFS.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 1548a3fda7dd63e28792140e7e8ad1ac9b706e49
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 14 13:00:27 2015 -0500
+
+    osd/ReplicatedPG: do not set local_mtime on non-tiered pool
+    
+    If a pool isn't tiered, don't bother with setting local_mtime.  The only
+    users are the tiering agent (which isn't needed if there is not tiering)
+    and scrub for deciding if an object should get its digest recorded (we can
+    use mtime instead).
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 98bdb09bb8d632b2df0b252b3d9676fd9511a1c8
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 14 12:59:29 2015 -0500
+
+    osd/PGBackend: use mtime for digest decision if local_mtime is empty
+    
+    If we don't have a local_mtime value, use mtime instead, for the purposes
+    of deciding if we should record a digest after scrub.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit fe1c28dea4e5607a0c72eab1f046074616cd55a7
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Dec 14 11:35:46 2015 -0500
+
+    osd/ReplicatedPG: do not set omap digest if there is no omap
+    
+    We want to avoid encoding it if we can.  And if the FLAG_OMAP is not set
+    we don't need to *also* store an empty crc.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+
+commit 6cf261cd2e80adbaf2898cb354c8159a57749e9d
+Author: xiexingguo <258156334 at qq.com>
+Date:   Mon Nov 2 21:46:11 2015 +0800
+
+    Objecter: remove redundant result-check of _calc_target in _map_session.
+    
+    Result-code check is currently redundant since _calc_target never returns a negative value.
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    
+    (cherry picked from commit 5a6117e667024f51e65847f73f7589467b6cb762)
+
+commit 5d0b5c1389d8c0baddb40cc5ff8f1d9cc6a4d315
+Author: xiexingguo <258156334 at qq.com>
+Date:   Thu Oct 29 17:32:50 2015 +0800
+
+    Objecter: potential null pointer access when do pool_snap_list.
+    
+    Objecter: potential null pointer access when do pool_snap_list. Shall check pool existence first.
+    Fixes: #13639
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    (cherry picked from commit 865541605b6c32f03e188ec33d079b44be42fa4a)
+
+commit 66ff0aa0130973aa2bea3a1a4ec8f4e3e6c19da8
+Author: qiankunzheng <zheng.qiankun at h3c.com>
+Date:   Thu Nov 5 07:29:49 2015 -0500
+
+    auth/cephx: large amounts of log are produced by osd
+    if the auth of osd is deleted when the osd is running, the osd will produce large amounts of log.
+    
+    Fixes:#13610
+    Signed-off-by: Qiankun Zheng <zheng.qiankun at h3c.com>
+    (cherry picked from commit 102f0b19326836e3b0754b4d32da89eb2bc0b03c)
+
+commit 61da13bbe271964c56116fb2bed51045290f951a
+Author: Chengyuan Li <chengyli at ebay.com>
+Date:   Thu Nov 19 22:29:39 2015 -0700
+
+    mon/PGMonitor: MAX AVAIL is 0 if some OSDs' weight is 0
+    
+    In get_rule_avail(), even p->second is 0, it's possible to be used
+    as divisor and quotient is infinity, then is converted to an integer
+    which is negative value.
+    So we should check p->second value before calculation.
+    
+    It fixes BUG #13840.
+    
+    Signed-off-by: Chengyuan Li <chengyli at ebay.com>
+    (cherry picked from commit 18713e60edd1fe16ab571f7c83e6de026db483ca)
+
+commit 53e81aab442855b34ee6e922f181bae3bf33e292
+Author: wangchaunhong <root at A22832429.(none)>
+Date:   Tue Oct 20 18:40:23 2015 +0800
+
+    init-ceph: fix systemd-run cant't start ceph daemon sometimes
+    
+    Fixes: #13474
+    Signed-off-by: Chuanhong Wang <wang.chuanhong at zte.com.cn>
+    (cherry picked from commit 2f36909e1e08bac993e77d1781a777b386335669)
+    
+    Conflicts:
+    	src/init-ceph.in
+                different content of cmd variable
+
+commit c2c6d02591519dfd15ddcb397ac440322a964deb
+Author: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+Date:   Mon Jul 6 09:56:11 2015 +0200
+
+    tools: fix race condition in seq/rand bench
+    
+    Under certain conditions (like bench seq/rand -b 1024 -t 128) it is
+    possible that aio_read reads data into destination buffers before or
+    during memcmp execution, resulting in "[..] is not correct!" errors
+    even if actual objects are perfectly fine.
+    Also, moved latencty calculation around, so it is no longer affeted
+    by memcmp.
+    
+    Signed-off-by: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+    
+    Conflicts:
+    	src/common/obj_bencher.cc
+
+commit a619b621b0a7c670eeaf163d9e2b742d13c9f517
+Author: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+Date:   Wed May 20 12:41:22 2015 +0200
+
+    tools: add --no-verify option to rados bench
+    
+    When doing seq and rand read benchmarks using rados bench, a quite large
+    portion of cpu time is consumed by doing object verification. This patch
+    adds an option to disable this verification when it's not needed, in turn
+    giving better cluster utilization. rados -p storage bench 600 rand scores
+    without --no-verification:
+    
+    Total time run:       600.228901
+    Total reads made:     144982
+    Read size:            4194304
+    Bandwidth (MB/sec):   966
+    Average IOPS:         241
+    Stddev IOPS:          38
+    Max IOPS:             909522486
+    Min IOPS:             0
+    Average Latency:      0.0662
+    Max latency:          1.51
+    Min latency:          0.004
+    
+    real    10m1.173s
+    user    5m41.162s
+    sys     11m42.961s
+    
+    Same command, but with --no-verify:
+    
+    Total time run:       600.161379
+    Total reads made:     174142
+    Read size:            4194304
+    Bandwidth (MB/sec):   1.16e+03
+    Average IOPS:         290
+    Stddev IOPS:          20
+    Max IOPS:             909522486
+    Min IOPS:             0
+    Average Latency:      0.0551
+    Max latency:          1.12
+    Min latency:          0.00343
+    
+    real    10m1.172s
+    user    4m13.792s
+    sys     13m38.556s
+    
+    Note the decreased latencies, increased bandwidth and more reads performed.
+    
+    Signed-off-by: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+    (cherry picked from commit ca6abca63de813c83a6960f83624be8e1a86a1f8)
+    
+    Conflicts:
+    	src/common/obj_bencher.cc
+    	src/common/obj_bencher.h
+
+commit d06463604cb8daeda288e824e8812352c0d6a7d9
+Merge: ec35347 609f256
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Dec 2 20:48:00 2015 +0100
+
+    Merge pull request #6527 from theanalyst/wip-12856-hammer
+    
+    rgw: missing handling of encoding-type=url when listing keys in bucket
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit ec35347d8fd7a0eb175710e6111a9196746e278c
+Merge: 487dc34 1b06f03
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Dec 2 20:47:43 2015 +0100
+
+    Merge pull request #6491 from SUSE/wip-13716-hammer
+    
+    rgw:swift use Civetweb ssl can not get right url
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 487dc3436a8fabd1b1a31563071c907bdf18f525
+Merge: 18d3ba3 99b4d1d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Dec 2 20:47:27 2015 +0100
+
+    Merge pull request #6351 from theanalyst/wip-13538-hammer
+    
+    rgw: orphan tool should be careful about removing head objects
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 18d3ba30323a44c1cc45bf4e870b8d9aeb5c3b0b
+Merge: 36e4db3 6d89f4b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Dec 2 20:47:09 2015 +0100
+
+    Merge pull request #6349 from theanalyst/wip-13540-hammer
+    
+    rgw: get bucket location returns region name, not region api name
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit 36e4db36f5ec9418672bbfe0dce6ae757f697efe
+Merge: 8c4145e db1cbe7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Dec 2 20:46:49 2015 +0100
+
+    Merge pull request #5910 from kmroz/wip-hammer-backport-content-type
+    
+    rgw: backport content-type casing
+    
+    Reviewed-by: Yehuda Sadeh <ysadehwe at redhat.com>
+
+commit ac05617b246d3c2a329b1b99b0371e3f6b8541e9
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 17 21:42:53 2015 -0400
+
+    osd: fix send_failures() locking
+    
+    It is unsafe to check failure_queue.empty() without the lock.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b3ca828ae8ebc9068073494c46faf3e8e1443ada)
+
+commit 8c4145ecc4a68accdb2120889fd933e8f6630dba
+Merge: 4804eec 112c686
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Nov 25 08:47:10 2015 -0800
+
+    Merge pull request #6587 from theanalyst/wip-13758-hammer
+    
+    common: pure virtual method called
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 4804eec095959c3747b13d29224b2cfa5b7d198d
+Merge: 9b97e4f e693755
+Author: Daniel Gryniewicz <dang at fprintf.net>
+Date:   Wed Nov 25 10:49:15 2015 -0500
+
+    Merge pull request #6352 from theanalyst/wip-13536-hammer
+    
+    rgw: bucket listing hangs on versioned buckets
+
+commit 9b97e4f6a41bb3fe7bae92b71ae266361022cf5c
+Merge: 5a9e0a7 0378445
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 25 16:48:09 2015 +0100
+
+    Merge pull request #6589 from theanalyst/wip-13693-hammer
+    
+    osd: bug with cache/tiering and snapshot reads
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 5a9e0a722c654b83fc483e083ddb3035281f5397
+Merge: 3047f2b a322317
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 25 16:22:10 2015 +0100
+
+    Merge pull request #6585 from theanalyst/wip-13753-hammer
+    
+    rbd: avoid re-writing old-format image header on resize
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 3047f2bc50d5d26e70e832bd427f15073bf7733c
+Merge: 407bd02 9c33dcc
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 23 19:57:03 2015 +0100
+
+    Merge pull request #6586 from theanalyst/wip-13755-hammer
+    
+    rbd: QEMU hangs after creating snapshot and stopping VM
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 407bd0281582ebb3b50ce51bdb48244e22463c8f
+Merge: c3c400f bddbda1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 23 17:32:21 2015 +0100
+
+    Merge pull request #6588 from theanalyst/wip-13770-hammer
+    
+    Objecter: pool op callback may hang forever.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c3c400f68d9c2593acd9485d1214d14af4e930d0
+Merge: d116959 a52f7cb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 23 15:13:24 2015 +0100
+
+    Merge pull request #6430 from SUSE/wip-13654-hammer
+    
+    crush: crash if we see CRUSH_ITEM_NONE in early rule step
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 3f1292e117ab1cdcaef3b24ee33854f7be142795
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Sep 3 20:30:50 2015 +0200
+
+    ceph.spec.in: fix License line
+    
+    This is closer to my reading of
+    https://github.com/ceph/ceph/blob/master/COPYING than the previous version.
+    
+    http://tracker.ceph.com/issues/12935 Fixes: #12935
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit ef7418421b3748c712019c8aedd02b8005c1e1ea)
+
+commit d116959442f67c8f36898ca989b490ca84a609c6
+Merge: 12be099 74203b8
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 23 09:28:09 2015 +0100
+
+    Merge pull request #6420 from SUSE/wip-13637-hammer
+    
+    FileStore: potential memory leak if getattrs fails.
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 12be099a7b0f2692c167af96928e939b2227160c
+Merge: 39c70d4 2052187
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Nov 21 09:10:27 2015 +0100
+
+    Merge pull request #6528 from theanalyst/wip-13695-hammer
+    
+    init-rbdmap uses distro-specific functions
+    
+    Reviewed-by: Boris Ranto <branto at redhat.com>
+
+commit 39c70d4364a1be39f7c393847417f44279b4364c
+Merge: 65aeba0 9643ee6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Nov 21 09:07:13 2015 +0100
+
+    Merge pull request #6499 from SUSE/wip-13692-hammer
+    
+    osd: do not cache unused memory in attrs
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 65aeba0b2f165d893d06df7e9bbe25f989edafe9
+Merge: 24d6698 394fbfc
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Nov 21 08:59:25 2015 +0100
+
+    Merge pull request #6143 from dachary/wip-13340-hammer
+    
+    small probability sigabrt when setting rados_osd_op_timeout
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 24d66981d351848c44ae9e0395dad392f852be2b
+Merge: 5d204db 171fee1
+Author: Loic Dachary <loic at dachary.org>
+Date:   Sat Nov 21 08:58:11 2015 +0100
+
+    Merge pull request #5773 from tchaikov/wip-12835-hammer
+    
+    mon: map_cache can become inaccurate if osd does not receive the osdmaps
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit a81bcf723c1099f2bea5daf8b01b7d9853de323a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Oct 15 00:15:54 2015 -0400
+
+    ceph_context: remove unsafe cast for singletons
+    
+    It was previously assumed that a CephContext singleton would
+    inherit from CephContext::AssociatedSingletonObject, but it was
+    not enforced.  This could result in unknown behavior when the
+    singleton is destroyed due to the implied virtual destructor.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit fb62c78637d7092f48871d943282f45029bd6d29)
+
+commit d50d7b2fa3751e8520694ee75eefe5ae56e57267
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Sep 30 22:53:28 2015 -0400
+
+    osd: conditionally initialize the tracepoint provider
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0009f343a5daf28358a669836d95660c0d9068d8)
+
+commit bf34b3657339dc40c7939fcdddaf2b7ae78c82ad
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Sep 30 22:37:05 2015 -0400
+
+    librados: conditionally initialize the tracepoint provider
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6368c281b53d6175a564725b85516de4b6ae54de)
+
+commit afc4f176f8371f0e61ce3463602f8a355b9283b9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Sep 30 22:10:10 2015 -0400
+
+    librbd: conditionally initialize the tracepoint provider
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 1a6eea95bd1ccef53f01cf53e493e652faa203ee)
+    
+    Conflicts:
+    	src/librbd/librbd.cc: trivial resolution
+
+commit c82f93915875875b21ed779e7aaf297b8fbcdca1
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Sep 30 19:17:08 2015 -0400
+
+    common: new tracing config options
+    
+    Config options to enable LTTng-UST tracepoint providers for
+    the OSD, OSD objectstore, librados, and librbd.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 2ccef89badb1f7a63721a0bf48d05eb4c2d0a97a)
+    
+    Conflicts:
+    	src/common/config_opts.h: trivial resolution
+
+commit 2168c151066e0cea86284ffdf947a353f3b323d5
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Sep 30 18:49:32 2015 -0400
+
+    tracing: merge tracepoint provider makefiles into main makefile
+    
+    This results in the tracepoint provider shared libraries being
+    placed in the library path for unittests.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit e11d8d68da27a1c224aa55fc40a72ac6aaa0441c)
+    
+    Conflicts:
+    	configure.ac: trivial resolution
+    	src/Makefile.am: trivial resolution
+
+commit d02beff1cf7650fe6e57cdafe64dcbee2631ed52
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Sep 30 15:13:24 2015 -0400
+
+    tracing: dynamic tracepoint provider helper
+    
+    The TracepointProvider class is a configuration observer.  When
+    tracing is enabled, it will dynamically load the associated
+    tracepoint provider.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b3d02cc21b4cc40a194f84a9bbbf82cf9e7956d1)
+    
+    Conflicts:
+    	src/common/Makefile.am: trivial resolution
+
+commit e53d66e42b1c3aea47832f7e8983284ec45d9efa
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Sep 29 14:33:48 2015 -0400
+
+    packaging: add new tracepoint probe shared libraries
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit a7ed8e161b27c7852bf0f3a23a977ebd39137943)
+
+commit bb7c0f501918b75dee97052faeafb1d6db61bd0a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Sep 29 14:30:43 2015 -0400
+
+    ceph.spec.in: add new tracepoint probe shared libraries
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f4feee2f9dcd7b94476701b66d1f0bdf6fb6e0c2)
+    
+     Conflicts:
+    	ceph.spec.in: trivial resolution
+
+commit e1da27134e4c9b4a2881aca664818598e5b2125b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Sep 29 14:13:46 2015 -0400
+
+    lttng: move tracepoint probes to dynamic libraries
+    
+    LTTng-UST initializes itself at program load, which means it is
+    currently always enabled.  This can lead to issues with SElinux
+    and AppArmor which might restrict access to the necessary device
+    files.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4a5305e41677885d45b2b74299113a3d00189c66)
+    
+     Conflicts:
+    	src/test/Makefile-client.am: trivial resolution
+    	src/tracing/Makefile.am: trivial resolution
+
+commit 5d204db85b2ed84411cfabea9eb73aa04c6ce05a
+Merge: 1dbd4c6 8378aaf
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Nov 19 19:45:25 2015 +0100
+
+    Merge pull request #6580 from dachary/wip-13786-hammer
+    
+    rbd-replay-* moved from ceph-test-dbg to ceph-common-dbg as well
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1dbd4c66307e615670c7569f107418876f8b977f
+Merge: 24a5dc0 634d7f6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Nov 19 19:45:03 2015 +0100
+
+    Merge pull request #6286 from dillaman/wip-13460-hammer
+    
+    rbd-replay-prep and rbd-replay improvements
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 24a5dc0a6b4f73c92c82e1933a1924db3f8e1090
+Merge: d27da2e 6a40e4f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Nov 19 19:41:20 2015 +0100
+
+    Merge pull request #5790 from SUSE/wip-12932-hammer
+    
+    Miscellaneous spec file fixes
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d27da2ee8fa3e074fdd91d414df2d59978db9497
+Merge: 7d21127 8358fb8
+Author: Kefu Chai <tchaikov at gmail.com>
+Date:   Thu Nov 19 19:13:11 2015 +0800
+
+    Merge pull request #6644 from dachary/wip-13812-upgrade
+    
+    revert: osd: use GMT time for hitsets
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 8358fb8946d8809d695092baa4a6abf5d5b5e265
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 18 18:08:58 2015 +0100
+
+    revert: osd: use GMT time for hitsets
+    
+    "Merge pull request #5825 from tchaikov/wip-12848-hammer"
+    
+    This reverts commit 39544718dc2f09bcfdc632ac72fd2a3cda87687e, reversing
+    changes made to 4ad97162026e1eb6e6e948ddf3eb39f711431e45.
+    
+    http://tracker.ceph.com/issues/13812 Fixes: #13812
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+
+commit 4420929eacb67d17635fed53f15471a28942f31d
+Author: brian <bjfelton at gmail.com>
+Date:   Wed Sep 23 09:49:36 2015 -0500
+
+    rgw: fix modification to index attrs when setting acls
+    
+    Fixes: #12955
+    
+     - add ACL change after initial population
+     - populate bufferlist with object attributes
+    
+    Signed-off-by: Brian Felton <bjfelton at gmail.com>
+    (cherry picked from commit 7496741ebbd75b74d5ffeca5341cccb2318176e6)
+
+commit 7d21127f433afa2d9172954e7b8ff47c40d2d62b
+Merge: 6930601 1448915
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 17 10:24:45 2015 +0100
+
+    Merge pull request #6402 from SUSE/wip-13621-hammer
+    
+    CephFS restriction on removing cache tiers is overly strict
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit 693060102594a2c505bed1e7e274731b554e9179
+Merge: c2daf09 3f33ce6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 16 22:06:51 2015 +0100
+
+    Merge pull request #6354 from theanalyst/wip-13387-hammer
+    
+    librbd: reads larger than cache size hang
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit c2daf09fc6b8802240e13367a0a2f3349a7cca56
+Merge: 1ca72fb af734e6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 16 19:48:07 2015 +0100
+
+    Merge pull request #6289 from dillaman/wip-13461-hammer
+    
+    librbd: invalidate object map on error even w/o holding lock
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1ca72fbe6be0d664a3cbbd4356a8547c3b749a03
+Merge: ca573fe 3e65730
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 16 18:06:25 2015 +0100
+
+    Merge pull request #6153 from dachary/wip-13205-hammer
+    
+    ReplicatedBackend: populate recovery_info.size for clone (bug symptom is size mismatch on replicated backend on a clone in scrub)
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit ca573fe7ac5a699b77cacb8fedfa50fffc77dd52
+Merge: fdb3446 7161a2c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 16 18:06:12 2015 +0100
+
+    Merge pull request #6158 from dachary/wip-13336-hammer
+    
+    osd: we do not ignore notify from down osds
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit fdb3446194743135b78a65c30a8285d001e563b6
+Merge: f017566 0ad9521
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 16 18:06:01 2015 +0100
+
+    Merge pull request #6335 from Abhishekvrshny/wip-13488-hammer
+    
+    object_info_t::decode() has wrong version
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit f017566823af70323b7d4cbe1f7b3b761378d07e
+Merge: a79acd4 9f3aebe
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 16 18:05:39 2015 +0100
+
+    Merge pull request #6401 from SUSE/wip-13620-hammer
+    
+    osd: pg stuck in replay
+    
+    Reviewed-by: Samuel Just <sjust at redhat.com>
+
+commit 8378aaf3f9d5463fb61a19d601201dd63a884419
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Nov 13 19:10:28 2015 +0100
+
+    build/ops: rbd-replay moved from ceph-test-dbg to ceph-common-dbg
+    
+    http://tracker.ceph.com/issues/13785 Fixes: #13785
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit a0204dc47acc0c50223e449fd23a2fc97bfd111a)
+    
+        Conflicts:
+        	debian/control: << 0.94.5-2 is appropriate for hammer
+
+commit 03784457ab77617ddafc048b01044858b1e65bd3
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Sep 29 22:26:48 2015 +0800
+
+    osd: fix the snapshot reads of evicted tiering pool
+    
+    reset ssc->exsits in finish_ctx() if the ctx->cache_evict is true, and
+    the head is removed.
+    
+    Fixes: #12748
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit b61f3e43f1c9d43daa0dedd7cbd0fe5787cbdfbb)
+
+commit bddbda121c8d52ba8e50abd0341f14e332c6af5a
+Author: xiexingguo <258156334 at qq.com>
+Date:   Thu Oct 29 20:04:11 2015 +0800
+
+    Objecter: pool_op callback may hang forever.
+    
+    pool_op callback may hang forever due to osdmap update during reply handling.
+    Fixes: #13642
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    
+    (cherry picked from commit 00c6fa9e31975a935ed2bb33a099e2b4f02ad7f2)
+
+commit 112c686ffc98e3739c9944635f4044e2b34f210a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jul 7 12:11:13 2015 -0400
+
+    WorkQueue: new PointerWQ base class for ContextWQ
+    
+    The existing work queues do not properly function if added to a running
+    thread pool.  librbd uses a singleton thread pool which requires
+    dynamically adding/removing work queues as images are opened and closed.
+    
+    Fixes: #13636
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3e78b18b09d75626ca2599bac3b9f9c9889507a5)
+    
+    Conflicts:
+    	src/common/WorkQueue.h
+    Trivial merge conflict at class `ContextWQ` initialization
+
+commit 9c33dccaad9a4cdd46e9ecfa1e3ba6c03d95885a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 9 11:22:24 2015 -0500
+
+    librbd: fixed deadlock while attempting to flush AIO requests
+    
+    In-flight AIO requests might force a flush if a snapshot was created
+    out-of-band.  The flush completion was previously invoked asynchronously,
+    potentially via the same thread worker handling the AIO request. This
+    resulted in the flush operation deadlocking since it can't complete.
+    
+    Fixes: #13726
+    Backport: infernalis, hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit bfeb90e5fe24347648c72345881fd3d932243c98)
+
+commit b3b7877f9b4b3f43acab09d0dd6ee971b6aa1c29
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 9 10:48:10 2015 -0500
+
+    tests: new test case to catch deadlock on RBD image refresh
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit a9729d9553e7fb925509cad8d388cf52a9fede9c)
+
+commit a3223173f85c42147ff4ced730beffe85146a4ed
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 2 16:50:19 2015 -0500
+
+    librbd: resize should only update image size within header
+    
+    Previously, the whole RBD image format 1 header struct was
+    re-written to disk on a resize operation.
+    
+    Fixes: #13674
+    Backport: infernalis, hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit d5be20b6d4646284571568ab28cbf45b0729390b)
+
+commit 6a40e4f19d7b4cd45a25161303c7363e96fe799e
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Tue Sep 29 10:39:16 2015 +0200
+
+    ceph.spec.in: lttng in SLES12 only
+    
+    Over in the SUSE sector, we are trying to enable the SLE_12 and openSUSE_13.2
+    build targets. The lttng/babeltrace stuff is currently available only in
+    SLE_12.
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit bf9ca1eb107c4462d8768faf3ff4db7972384ffd)
+    
+    Conflicts:
+    	ceph.spec.in
+                trivial resolution
+
+commit e508a44485366557ac8a280de35584f3b5edf720
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Wed Jul 15 12:54:20 2015 +0200
+
+    ceph.spec.in: fix lttng/babeltrace conditionals
+    
+    lttng and babeltrace are build dependencies for rbd-replay-prep. Make
+    sure the right package names are used. Enable for SLE12, as well as
+    for openSUSE 13.1 and higher.
+    
+    Move the BuildRequires out of the ceph-test subpackage and into the
+    distro-conditional dependencies section.
+    
+    Make ordering of BuildRequires a little more alphabetical.
+    
+    http://tracker.ceph.com/issues/12360 Fixes: #12360
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit e267128ce22d8b8cd83f6d6d82f24f496600e678)
+    
+    Conflicts:
+    	ceph.spec.in
+                Dropped Requires: xmlstarlet in ceph-test that had inadvertently
+                been grabbed from d2cc2b1
+
+commit 19c9546b79f506d0b4ee005a138a77f120c629e8
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Tue Sep 8 10:41:02 2015 -0600
+
+    packaging: move rbd-replay* to ceph-common
+    
+    The rbd-replay* utilities are useful for Ceph users with RBD clients.
+    Currently the rbd-replay* utilities ship in the "ceph-test" package, and
+    we intend this ceph-test package for Ceph developers and contributors,
+    not normal users.
+    
+    Move the rbd-replay* utilities to "ceph-common".
+    
+    http://tracker.ceph.com/issues/12994 Fixes: #12994
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 96486fd6f284ca3ab67f4f94631896d41c529e85)
+    
+    Conflicts:
+    	ceph.spec.in
+                50a33dea has not been backported to hammer
+    	debian/ceph-test.install
+                50a33dea has not been backported to hammer
+    	debian/control
+                different ceph-test Replaces: and Breaks: version
+
+commit a79acd41187e6b049432bdc314f192e3fbb560a3
+Merge: 3d61493 31b7864
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 11 11:59:36 2015 +0100
+
+    Merge pull request #6213 from SUSE/wip-13425-hammer
+    
+    wrong conditional for boolean function KeyServer::get_auth()
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 3d61493337d481dec5139ccb6172710a118b2009
+Merge: 147f437 7ffd072
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 11 06:59:55 2015 +0100
+
+    Merge pull request #6336 from Abhishekvrshny/wip-13535-hammer
+    
+    LibRadosWatchNotify.WatchNotify2Timeout
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 147f437279e72c0766a126653e3db53abb73a4ac
+Merge: 1970e61 9085c82
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 11 06:59:42 2015 +0100
+
+    Merge pull request #6391 from SUSE/wip-13590-hammer
+    
+    mon: should not set isvalid = true when cephx_verify_authorizer return false
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1970e618209a242fc0bd3c707dfdfb1a886d6a2c
+Merge: fb83704 ade0f1a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 11 06:58:55 2015 +0100
+
+    Merge pull request #6398 from SUSE/wip-13588-hammer
+    
+    OSD::build_past_intervals_parallel() shall reset primary and up_primary when begin a new past_interval.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 3d3595f86083a0f9847585eae4cffb8a82c816d4
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 27 10:13:27 2015 -0400
+
+    krbd: remove deprecated --quiet param from udevadm
+    
+    This parameter has been removed since systemd 213, so this
+    effects Fedora 21+, Debian Jessie, and potentially future
+    releases of RHEL 7.
+    
+    Fixes: #13560
+    Backport: hammer, infernalis
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4300f2a9fe29627eea580564ff2d576de3647467)
+
+commit 4d81cd19087e049bf3c2fe0d10de9215852ab51d
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 27 10:12:34 2015 -0400
+
+    run_cmd: close parent process console file descriptors
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f46f7dc94139c0bafe10361622416d7dc343d31f)
+
+commit fb83704d5db81aad95c61a61be52d07ce2d4d2b5
+Merge: 3954471 0742177
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 20:24:35 2015 +0100
+
+    Merge pull request #6199 from liewegas/wip-randomize-scrub-hammer
+    
+    osd: randomize scrub times
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 39544718dc2f09bcfdc632ac72fd2a3cda87687e
+Merge: 4ad9716 6a4734a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 20:23:23 2015 +0100
+
+    Merge pull request #5825 from tchaikov/wip-12848-hammer
+    
+    ReplicatedPG::hit_set_trim osd/ReplicatedPG.cc: 11006: FAILED assert(obc)
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 2052187929e059a25f6a3baf67329f7ce0bf6d8a
+Author: Boris Ranto <branto at redhat.com>
+Date:   Fri Oct 23 15:31:27 2015 +0200
+
+    init-rbdmap: Rewrite to use logger + clean-up
+    
+    This patch rewrites the init-rbdmap init script so that it uses logger
+    instead of the log_* functions. The patch also fixes various smaller
+    bugs like:
+    * MAP_RV was undefined if mapping already existed
+    * UMNT_RV and UMAP_RV were almost always empty (if they succeeded) ->
+      removed them
+    * use of continue instead RET_OP in various places (RET_OP was not being
+      checked after the switch to logger messages)
+    * removed use of DESC (used only twice and only one occurrence actually
+      made sense)
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit c567341e98fffbe39177f951511a7698f88abf5f)
+
+commit f972f38445bc7a6efe122a5f9fc2ba7658625e26
+Author: Boris Ranto <branto at redhat.com>
+Date:   Fri Oct 23 16:39:16 2015 +0200
+
+    ceph.spec.in: We no longer need redhat-lsb-core
+    
+    Drop the redhat-lsb-core dependency as it is no longer necessary on
+    fedora/rhel.
+    
+    The other two init scripts do not use redhat-lsb-core either. The
+    init-ceph.in conditionally requires /lib/lsb/init-functions and does not
+    use any of the functions defined in that file (at least not directly).
+    The init-radosgw file includes /etc/rc.d/init.d/functions on non-debian
+    platforms instead of /lib/lsb/init-functions file so it does not require
+    redhat-lsb-core either.
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit 15600572265bed397fbd80bdd2b7d83a0e9bd918)
+    
+    Conflicts:
+    	ceph.spec.in
+    Merge conflict because there were other commits that introduced systemd
+    & SUSE specific bits in the master which havent yet reached
+    hammer. Since this commit only removed redhat-lsb-core from *el distros
+    removing the specific lines
+
+commit 609f256a00f6ee18564ee055dd79f8293217940c
+Author: Jeff Weber <jweber at cofront.net>
+Date:   Wed Aug 5 19:06:46 2015 -0400
+
+    rgw: implement s3 encoding-type for get bucket
+    
+    This change introduces handling for the encoding-type request
+    parameter on the get bucket operation. An object key may contain
+    characters which are not supported in XML. Passing the value "url" for
+    the encoding-type parameter will cause the key to be urlencoded in the
+    response.
+    
+    Fixes: #12735
+    Signed-off-by: Jeff Weber <jweber at cofront.net>
+    (cherry picked from commit 180ca7b56ba91a3995c76dac698aa4ee31d9a2ce)
+
+commit 394fbfcc40d77ad6c8b3301c5ff2630c052107cd
+Author: Ruifeng Yang <yangruifeng.09209 at h3c.com>
+Date:   Fri Sep 25 10:18:11 2015 +0800
+
+    Objecter: maybe access wild pointer(op) in _op_submit_with_budget.
+    
+    look at "after giving up session lock it can be freed at any time by response handler" in _op_submit,
+    so the _op_submit_with_budget::op maybe is wild after call _op_submit.
+    
+    Fixes: #13208
+    Signed-off-by: Ruifeng Yang <yangruifeng.09209 at h3c.com>
+    (cherry picked from commit 0635b1358354b19ae44105576f730381f3b5b963)
+
+commit 84068f8cea0452333f00f8b65230c00caa2e52ff
+Author: Ruifeng Yang <yangruifeng.09209 at h3c.com>
+Date:   Fri Sep 25 12:42:28 2015 +0800
+
+    Objecter: repeated free op->ontimeout.
+    
+    repeated free op->ontimeout in SafeTimer::timer_thread::callback->complete
+    
+    Fixes: #13208
+    Signed-off-by: Ruifeng Yang <yangruifeng.09209 at h3c.com>
+    (cherry picked from commit f1d8a8f577cee6d66f4dcffac667675f18145ebb)
+
+commit 3e657304dc41facd40b8cab7531180083d14d22a
+Author: Samuel Just <sjust at redhat.com>
+Date:   Fri Aug 28 12:46:57 2015 -0700
+
+    ReplicatedBackend::prepare_pull: set recover_info.size for clones
+    
+    Fixes: #12828
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 1d3e46bedb9a8c0d2200e39f62f4e2c3337619f3)
+
+commit 4ad97162026e1eb6e6e948ddf3eb39f711431e45
+Merge: 92b2153 f1271ea
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:34:01 2015 +0100
+
+    Merge pull request #6157 from dachary/wip-13040-hammer
+    
+    common/Thread:pthread_attr_destroy(thread_attr) when done with it
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 92b21532f64792da023188d9aa620d900c0245ca
+Merge: 1f02886 a17f2a9
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:33:41 2015 +0100
+
+    Merge pull request #6155 from dachary/wip-13171-hammer
+    
+    objecter: cancellation bugs
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 1f02886d7edc10ff93074afc3d2bf4cf77c709d5
+Merge: 77df385 7d4b303
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:33:19 2015 +0100
+
+    Merge pull request #6152 from dachary/wip-13233-hammer
+    
+    mon: include min_last_epoch_clean as part of PGMap::print_summary and PGMap::dump
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 77df385e23452f401f3c0c269e220446d288fb8e
+Merge: 469398f d8ca88d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:33:01 2015 +0100
+
+    Merge pull request #6146 from dachary/wip-13337-hammer
+    
+    segfault in agent_work
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 469398f14b62af01068e65bcc5cc7c585a04e878
+Merge: d87d136 397042a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:32:53 2015 +0100
+
+    Merge pull request #6145 from dachary/wip-13338-hammer
+    
+    filestore: fix peek_queue for OpSequencer
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit d87d1364fb8e345a1f85b65c2d4c7c80596ba5f9
+Merge: 717eff9 d4e4d85
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:32:42 2015 +0100
+
+    Merge pull request #6144 from dachary/wip-13339-hammer
+    
+    mon: check for store writeablility before participating in election
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 717eff9a61818fde71ec5220998e9b5c14bbb3a9
+Merge: e133ddc e8cce08
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:30:54 2015 +0100
+
+    Merge pull request #5891 from Abhishekvrshny/wip-13035-hammer
+    
+    requeue_scrub when kick_object_context_blocked
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit e133ddc622d3532b0182c208f0ebb9956daab44f
+Merge: c72306a 8ee93d5
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:30:38 2015 +0100
+
+    Merge pull request #5890 from Abhishekvrshny/wip-13037-hammer
+    
+    hit set clear repops fired in same epoch as map change -- segfault since they fall into the new interval even though the repops are cleared
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit c72306a1dd3b193948d5df3371471797d4131cfe
+Merge: 5e8c9d9 2bd5d0b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Nov 10 10:21:07 2015 +0100
+
+    Merge pull request #6322 from sponce/WIP-13210-hammer
+    
+    tests : BACKPORT #13210 Fixed broken Makefiles after integration of ttng into rados
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit b62cac6c345df53bbda1c42a5336cffc8f0f9652
+Author: Sangdi Xu <xu.sangdi at h3c.com>
+Date:   Wed Sep 23 19:31:32 2015 +0800
+
+    rgw: fix swift API returning incorrect account metadata
+    
+    Fixes: #13140
+    
+    Fix the bug that swift account stat command returns doubled object count and bytes used
+    
+    Signed-off-by: Sangdi Xu <xu.sangdi at h3c.com>
+    (cherry picked from commit 66d19c78ba75b79190c81c95f94e7ef3084fda9e)
+
+commit 9643ee65a6e968e479ca33a102f5f575924a7ff0
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Sun Aug 2 18:36:40 2015 +0800
+
+    bug fix: osd: do not cache unused buffer in attrs
+    
+    attrs only reference the origin bufferlist (decode from MOSDPGPush or
+    ECSubReadReply message) whose size is much greater than attrs in recovery.
+    If obc cache it (get_obc maybe cache the attr), this causes the whole origin
+    bufferlist would not be free until obc is evicted from obc cache. So rebuild
+    the bufferlist before cache it.
+    
+    Fixes: #12565
+    Signed-off-by: Ning Yao <zay11022 at gmail.com>
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit c5895d3fad9da0ab7f05f134c49e22795d5c61f3)
+
+commit 5e8c9d967e0ade393e36893965ca8ddfaa317b48
+Merge: db0366d dba8b5b
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 9 08:38:31 2015 +0100
+
+    Merge pull request #5810 from Abhishekvrshny/wip-12948-hammer
+    
+    Heavy memory shuffling in rados bench
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 1b06f03b541983461469f8f53ef2a271b08d2f78
+Author: Weijun Duan <duanweijun at h3c.com>
+Date:   Thu Oct 29 21:46:02 2015 -0400
+
+    rgw:swift use Civetweb ssl can not get right url
+    
+    Fixes: #13628
+    
+    Signed-off-by: Weijun Duan <duanweijun at h3c.com>
+    (cherry picked from commit e0fd540bf441e2f8276cbd96c601a0539892efe2)
+
+commit db0366dd979cc0d401b1974c233e38dfe5b1b5d1
+Merge: 22dce75 a65c398
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Nov 5 13:12:11 2015 +0100
+
+    Merge pull request #5530 from SUSE/wip-12587-hammer
+    
+    FileStore calls syncfs(2) even it is not supported
+    
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit 22dce75181b254548226fc09decafac14dcf84a6
+Merge: ed153c1 d8ac510
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 19:38:53 2015 +0100
+
+    Merge pull request #5889 from Abhishekvrshny/wip-13042-hammer
+    
+    ThreadPool add/remove work queue methods not thread safe
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit ed153c13226138eec71e472d1e3c8481db9b9009
+Merge: ca8802f 8610de8
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 19:14:28 2015 +0100
+
+    Merge pull request #6151 from dachary/wip-13245-hammer
+    
+    client nonce collision due to unshared pid namespaces
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit ca8802fb0cb8603267ecfc7320fee7a679617b8b
+Merge: 19450b9 6e29e90
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:36:39 2015 +0100
+
+    Merge pull request #6159 from dachary/wip-13341-hammer
+    
+    ceph upstart script rbdmap.conf incorrectly processes parameters
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 19450b90e4c20556580d276bab7dafb23db1758f
+Merge: 18882c8 6849288
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:34:07 2015 +0100
+
+    Merge pull request #6154 from dachary/wip-13195-hammer
+    
+    should recalc the min_last_epoch_clean when decode PGMap
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 18882c81a71c4b517cb0eaa5a884637ea5cbe7a6
+Merge: de4f37b 3c1f7cb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:28:03 2015 +0100
+
+    Merge pull request #6132 from SUSE/wip-13307-hammer
+    
+    dumpling incrementals do not work properly on hammer and newer
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit de4f37bb0abc932c813983792e170de1bb40241b
+Merge: 1c632a7 24268cf
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:23:14 2015 +0100
+
+    Merge pull request #6097 from dillaman/wip-13045-hammer
+    
+    librbd: diff_iterate needs to handle holes in parent images
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 1c632a7ea7057522fb9df61994b5b3cf65416689
+Merge: bedb334 71a42f7
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:22:25 2015 +0100
+
+    Merge pull request #6060 from XinzeChi/wip-hammer-outdata-set
+    
+    bug fix: osd: avoid multi set osd_op.outdata in tier pool
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit bedb3344f6c802ea04a171dabd4fb596284af34a
+Merge: 0d3d819 cecd68d
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:20:50 2015 +0100
+
+    Merge pull request #5897 from tchaikov/wip-12940-hammer
+    
+    IO error on kvm/rbd with an erasure coded pool tier
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 0d3d81951db61a97f6cb26d9f75e80a3400a2a37
+Merge: 381cfcc 7475a8f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:11:00 2015 +0100
+
+    Merge pull request #5787 from SUSE/wip-12923-hammer
+    
+    logrotate reload error on Ubuntu 14.04
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 381cfccf38bade28a001f3f24392c61896b3c711
+Merge: cad1cfb 86f88df
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:10:26 2015 +0100
+
+    Merge pull request #5766 from dachary/wip-12590-hammer
+    
+    ceph mds add_data_pool check for EC pool is wrong
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit cad1cfb088b095e8333c4a7d79ccefc2b2c4d782
+Merge: 9764da5 e8d6d5a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Nov 4 11:06:18 2015 +0100
+
+    Merge pull request #5361 from ceph/wip-11786.hammer
+    
+    mon: MonitorDBStore: get_next_key() only if prefix matches
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 5105d50d1c20d465229189bbb24cdfb5d16cf7bc
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Nov 3 00:21:51 2015 +0100
+
+    tests: test/librados/test.cc must create profile
+    
+    Now that the create_one_ec_pool function removes the testprofile each
+    time it is called, it must create the testprofile erasure code profile
+    again for the test to use.
+    
+    http://tracker.ceph.com/issues/13664 Refs: #13664
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit a60342942b5a42ee04d59af77a6b904ce62eefc4)
+
+commit 302375068a59b86c50bda73ecefd99831ab52ea4
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Nov 2 20:24:51 2015 +0100
+
+    tests: destroy testprofile before creating one
+    
+    The testprofile erasure code profile is destroyed before creating a new
+    one so that it does not fail when another testprofile erasure code
+    profile already exists with different parameters.
+    
+    This must be done when creating erasure coded pools with the C++
+    interface, in the same way it's done with the C interface.
+    
+    http://tracker.ceph.com/issues/13664 Fixes: #13664
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 47abab9a6f182aa0abe5047c04402850379bcd6d)
+
+commit 3a7423dbe0a6af831d4c47acc98e6ced5ed5fe0c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Nov 2 20:23:52 2015 +0100
+
+    tests: add destroy_ec_profile{,_pp} helpers
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit ab46d79bc09fc711fa35302f49eecac81a98519b)
+
+commit a52f7cb372339dffbeed7dae8ce2680586760754
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 13 09:55:01 2015 -0400
+
+    crush/mapper: ensure take bucket value is valid
+    
+    Ensure that the take argument is a valid bucket ID before indexing the
+    buckets array.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 93ec538e8a667699876b72459b8ad78966d89c61)
+
+commit 81d8aa14f3f2b7bf4bdd0b4e53e3a653a600ef38
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 27 20:55:26 2015 -0400
+
+    crush/mapper: ensure bucket id is valid before indexing buckets array
+    
+    We were indexing the buckets array without verifying the index was within
+    the [0,max_buckets) range.  This could happen because a multistep rule
+    does not have enough buckets and has CRUSH_ITEM_NONE
+    for an intermediate result, which would feed in CRUSH_ITEM_NONE and
+    make us crash.
+    
+    Fixes: #13477
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 976a24a326da8931e689ee22fce35feab5b67b76)
+
+commit 74203b806e8c268aa3edac8cfc7c4b393f7b1f27
+Author: xiexingguo <258156334 at qq.com>
+Date:   Mon Oct 26 18:38:01 2015 +0800
+
+    FileStore: potential memory leak if _fgetattrs fails
+    
+    Memory leak happens if _fgetattrs encounters some error and simply returns.
+    Fixes: #13597
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    
+    (cherry picked from commit ace7dd096b58a88e25ce16f011aed09269f2a2b4)
+
+commit db1cbe700e41ee7a2db5ef10173c429283bc5a2a
+Author: Robin H. Johnson <robin.johnson at dreamhost.com>
+Date:   Fri Sep 4 01:07:48 2015 +0000
+
+    Fix casing of Content-Type header
+    
+    It turns out, despite the HTTP spec declaring that header field names
+    should be case-insensitive, some clients treat them wrongly, and
+    consider "Content-type" to not match "Content-Type".
+    
+    CyberDuck was one of those clients, now fixed upstream in
+    https://trac.cyberduck.io/ticket/8999
+    
+    To reduce future occurances of this bug, fix the casing of the
+    Content-Type header, to strictly comply with the HTTP specification (be
+    strict about what you send, and generous about what you receive).
+    
+    Fixes: #12939
+    Backport: infernalis, hammer, firefly
+    Signed-off-by: Robin H. Johnson <robin.johnson at dreamhost.com>
+    (cherry picked from commit 1b9fbffdc24160251b96cec820d62fb2a12b6eab)
+
+commit 1448915e49bb6c8abc192053e6f2e8a380c4e92a
+Author: John Spray <john.spray at redhat.com>
+Date:   Mon Jun 1 13:55:22 2015 +0100
+
+    qa: update cephtool test for CephFS tier cases
+    
+    1. Creating a filesystem using a
+       readonly tier on an EC pool (should be forbidden)
+    2. Removing a tier from a replicated base pool (should
+       be permitted)
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit f9b11b0abe7c2b0dcdfc5802336be8a0426ccb3a)
+
+commit 14c36f0ccf103dea39b63e0e1b03082b99c42cb1
+Author: John Spray <john.spray at redhat.com>
+Date:   Mon Jun 1 13:54:25 2015 +0100
+
+    mon: forbid readonly cache tiers for CephFS
+    
+    For EC pools, we need a tier that is not just forwarding
+    writes, in order to provide the ops required
+    by CephFS.
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 11e5faf3c1d4fa28a8b41e3a92f0f684a844e5f5)
+
+commit 31e59fbca0ba636fc57c208e612d7488a48a6287
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu May 7 14:23:37 2015 +0100
+
+    mon: refine check_remove_tier checks
+    
+    Fixes: #11504
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit a50c8f1f2ad8845c7f77110868f9376f2d1ff883)
+
+commit 9f3aebee16e256888b149fa770df845787b06b6e
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Sep 22 13:57:37 2015 -0400
+
+    osd: fix requeue of replay requests during activating
+    
+    If the replay period expires while we are still in the activating
+    state, we can simply insert our list of requests at the front of
+    the waiting_for_active list.
+    
+    Fixes: #13116
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit d18cf51d9419819cdda3782b188b010969288911)
+
+commit ade0f1a4285348c20fbae8e2a366fc332a7b7fbe
+Author: xiexingguo <258156334 at qq.com>
+Date:   Tue Oct 13 14:04:20 2015 +0800
+
+    OSD:shall reset primary and up_primary fields when beginning a new past_interval.
+    
+    Shall reset primary and up_primary fields when we start over a new past_interval in OSD::build_past_intervals_parallel().
+    Fixes: #13471
+    Signed-off-by: xie.xingguo at zte.com.cn
+    (cherry picked from commit 65064ca05bc7f8b6ef424806d1fd14b87add62a4)
+
+commit 9085c820491f25a04ec02accc5098c1ab9b57311
+Author: yangruifeng <yangruifeng.09209 at h3c.com>
+Date:   Mon Oct 19 08:08:12 2015 -0400
+
+    mon: should not set isvalid = true when cephx_verify_authorizer return false
+    
+    Fixes: #13525
+    Signed-off-by: Ruifeng Yang <yangruifeng.09209 at h3c.com>
+    (cherry picked from commit c7f75b8f7c0a773148ec16141941efd00ee76626)
+
+commit 4875d05a3e265e80463a2a33a2c922affb0dad66
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Mon Mar 16 10:02:35 2015 -0600
+
+    ceph.spec.in: rm EOL Fedoras; add OBS RHEL5 instead
+    
+    Fedora 12 has been EOL for a long time. Remove the reference in the
+    RPM .spec file.
+    
+    Since RHEL 5 support for Ceph is a work in progress, we won't remove
+    this entire python_sitelib / python_sitearch conditional for now, since
+    those are still needed on RHEL 5.
+    
+    Add the rhel_version macro to make the conditional compatible with
+    SUSE's OBS.
+    
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 353a3258968f76deaea4542d2165e9ab32b88de8)
+
+commit dfba6acce75eea02251e98e2d57e6fbb344241fa
+Author: Travis Rhoden <trhoden at redhat.com>
+Date:   Thu May 7 20:13:53 2015 -0400
+
+    packaging: Add rgw placeholder dirs in proper packages
+    
+    Automatically create /var/lib/ceph/radosgw with the
+    ceph-radosgw package, and /var/lib/ceph/bootstrap-rgw
+    via the ceph package.
+    
+    Signed-off-by: Travis Rhoden <trhoden at redhat.com>
+    (cherry picked from commit bf93128f664ac74383806530a1f974edde8df5b6)
+    
+    Conflicts:
+        ceph.spec.in
+            hammer uses %ghost
+
+commit 2387c8e0caef00e7181241e16549457d58a12192
+Author: Nathan Cutler <ncutler at suse.cz>
+Date:   Fri May 15 21:39:39 2015 +0200
+
+    ceph.spec.in: consolidate centos/rhel macros
+    
+    0%{?rhel} || 0%{?centos} can be simplified to just 0%{?rhel}, since
+    CentOS defines that macro for compatibility with RHEL.
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.cz>
+    (cherry picked from commit 46404dd381e240634d224e77adc69f0ba4807045)
+    
+    Conflicts:
+    	ceph.spec.in
+                https://github.com/ceph/ceph/pull/4068 has not been backported
+
+commit 7c58d312db2aa42088f419dbfa7e841d897fdad6
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jun 25 16:55:10 2015 +0200
+
+    packaging: make logrotate a hard dependency across all distros
+    
+    Given ceph's reputation for voluminous logs, it makes sense for
+    logrotate to be a hard dependency for all distros.
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 0734cd1ec3ca3bd012686dc1bdda675909224a49)
+
+commit 61acc4e20ca58e11b9aba1efcdca78d1d7ddd2f7
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jul 9 12:05:24 2015 +0200
+
+    ceph.spec.in: add missing -%{release}
+    
+    We have it everywhere else and I can't think of any reason why
+    it should be omitted here.
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit d952d59ae95d5f66aa4b98fd7aa4f4ecb36a4848)
+
+commit 20590d367226ea01c9d4d95de15cfd1aa354d02b
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Fri Jun 26 20:21:59 2015 +0200
+
+    ceph.spec.in: remove duplicate BuildRequires: sharutils
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit c418bd9615e6f23f3c14ae9e71003c66d31d4b78)
+
+commit 6b306eba829b1ec9822b24243ee7c021aab3d738
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Mon Jun 15 12:58:00 2015 +0200
+
+    ceph.spec.in: fix python-flask dependency for SUSE
+    
+    In SLE and openSUSE, the package is called python-Flask with an upper-case F.
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 39c28b9faf0fb069d91ac069a4d8df7bf03fb490)
+    
+    Conflicts:
+    	ceph.spec.in
+                add missing SUSE-specific build deps
+
+commit 7a2cbcb0a4efa365b6d92ec58d7acf4a66e9d2b1
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Thu Jun 25 18:55:39 2015 +0200
+
+    ceph.spec.in: clarify two important comments
+    
+    First, the terms "common" and "specific" are vague. Second,
+    "common" can easily be confused with the ceph-common subpackage.
+    
+    Fix this by rephrasing to "distro-unconditional dependencies" and
+    "distro-conditional dependencies", respectively.
+    
+    Third, move the "distro-unconditional dependencies" header so it
+    is above the part where these dependencies are actually defined.
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit dd212fd1d367f70c61f65a97599959668b44aa53)
+
+commit dfe27c6ba05d49bb73854754b9d5c02cf1c7b1ef
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Wed Jun 24 16:37:58 2015 -0600
+
+    ceph.spec.in: rm reference to EOL Fedoras (< 20)
+    
+    Fedora 19 is EOL, so there's no need to refer to Fedoras less than 20.
+    "%{fedora}" effectively implies "Fedora 20 and above".
+    
+    Reported-by: Ira Cooper <ira at samba.org>
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit f3e4a91c458ca7b11706fe4608cb739499f5d3cc)
+    
+    Conflicts:
+    	ceph.spec.in
+               added xmlstarlet dependency to ceph-test package
+
+commit 371b64ef4aa786db3fd29bc84ff98e63000a859b
+Author: Ken Dreyer <kdreyer at redhat.com>
+Date:   Wed Jun 24 16:39:30 2015 -0600
+
+    ceph.spec.in: package rbd-replay-prep on all Fedoras
+    
+    This reverts the change in commit
+    85517d611b7bf4cb6cbffcd2c65303be0d038264. Since we BuildRequire:
+    libbabeltrace-devel, autoconf will see that babeltrace is available
+    during the build, and make will build/install the rbd-replay-prep
+    utility.
+    
+    This change also simplifies Fedora selection logic, because Fedora 19 is
+    EOL, so "%{fedora}" implies "Fedora 20 and above".
+    
+    Reported-by: Ira Cooper <ira at samba.org>
+    Signed-off-by: Ken Dreyer <kdreyer at redhat.com>
+    (cherry picked from commit 2db9480fa2646de776f0076d82747e202e574ddd)
+
+commit 82425b33f712047442d9d29c5a4349818b44b40a
+Author: Boris Ranto <branto at redhat.com>
+Date:   Tue Jun 16 23:07:04 2015 +0200
+
+    ceph.spec.in: rbd-replay-prep is not being built on f21+
+    
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit 85517d611b7bf4cb6cbffcd2c65303be0d038264)
+
+commit 53e2f702681dc08ddd0414b116e51de6488f42ca
+Author: Owen Synge <osynge at suse.com>
+Date:   Mon Jun 8 17:48:55 2015 +0200
+
+    ceph.spec.in:BuildRequires sharutils
+    
+    The uudecode binary is used to build Java-related components, and
+    uudecode is provided by the sharutils package on all supported
+    RPM platforms. When building with "--without=cephfs_java",
+    sharutils is not needed.
+    
+    Thanks to Nathan Cutler <ncutler at suse.cz> for going into the
+    details with me.
+    
+    On OBS without this patch we get the error message:
+    
+    [  170s] -----------------------------------------------------------------
+    [  170s] ----- building ceph.spec (user abuild)
+    [  170s] -----------------------------------------------------------------
+    [  170s] -----------------------------------------------------------------
+    [  170s] + exec rpmbuild -ba --define '_srcdefattr (-,root,root)' --nosignature --define 'disturl obs://build.opensuse.org/home:osynge:ceph:wip:wip_obs_fedora/Fedora_20/c0bbbc1e62228ca956ac3d367edc4fba-master' /home/abuild/rpmbuild/SOURCES/ceph.spec
+    [  170s] error: Failed build dependencies:
+    [  170s]    sharutils is needed by ceph-1:2+git.1435043747.c1bd02c-1.1.x86_64
+    
+    With this patch we can build fedora 22 and fedora 20 rpms fine.
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit 43c1784640538b813f0575c50f721ac911a30b3e)
+    
+    Conflicts:
+    	ceph.spec.in
+                _with_systemd -> trivial resolution
+
+commit a84376c68499845de01f9e3b194b16a698125b6a
+Author: Owen Synge <osynge at suse.com>
+Date:   Wed Jun 10 12:11:50 2015 +0200
+
+    ceph.spec.in: fix:Add missing directories breaking build
+    
+    SUSE builds on OBS are failing with the missing dir entries:
+    
+        /usr/share/ceph
+        /usr/lib/ceph
+    
+    On suse these correspond to:
+    
+        %dir %{_datarootdir}/ceph/
+        %dir %{_libexecdir}/ceph/
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit f1ff3e4dcb5dd7eddd2c346a05cfa78d860a5ce6)
+
+commit 171fee1b82d2675e364da7f96dfb9dd286d9b6e6
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jul 21 00:33:19 2015 +0800
+
+    mon: track osd_epoch of all MonSessions
+    
+    previously, we only track the osd_epoch for OSD peers. but other
+    MonClients who receives osdmaps can also benefit from osd_epoch.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit de43a02e06650a552f048dc8acd17f255126fed9)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc:
+    		do not assume that the MonSession is always available when
+            OSDMonitor::send_incremental() is called. as when the
+            connection to the mon client is dropped, the Monitor is
+            aware of this, but not the OSDMonitor.
+
+commit cc7da674965c3f758469e18788dc0e106e54d5bc
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Jul 21 00:24:52 2015 +0800
+
+    mon: track osd_epoch in MonSession
+    
+    * remove osd_epoch<osd, epoch> from OSDMonitor
+    * add osd_epoch to MonSession to track the latest osdmap epoch
+      OSDMonitor sends to a mon client
+    * do not remove osd_epoch entries if an OSD is down, or
+      max_osd > osd_id
+    
+    Fixes: #10930
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit c05753eacc26e90b2e3b56e641a71bffd5b39bd0)
+
+commit 3f33ce6132d5ce8b3454f30fbe14471ece39951d
+Author: Lu Shi <shi.lu at h3c.com>
+Date:   Thu Sep 24 16:02:41 2015 +0800
+
+    librbd:reads larger than cache size hang.
+    
+    Fixes:#13164
+    
+    Signed-off-by: Lu Shi <shi.lu at h3c.com>
+    (cherry picked from commit 9c8200bb5d1ac9359803a182df03298b565b8479)
+
+commit 5e5b512189b809bef503c34b0a19e30ed81cfbfa
+Author: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+Date:   Wed Aug 19 20:32:39 2015 +0200
+
+    rgw: url_decode values from X-Object-Manifest during GET on Swift DLO.
+    
+    Fixes: #12728
+    Signed-off-by: Radoslaw Zarzynski <rzarzynski at mirantis.com>
+    (cherry picked from commit 69cf089596a0e5d4da2826b5c276306316a00690)
+
+commit e693755a55e4da681a1947b1e1eb3bb537436cc0
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 22 14:53:42 2015 -0700
+
+    cls_rgw: fix bucket listing when dealing with invisible entries
+    
+    Fixes: #12913
+    
+    The bucket listing logic was broken when dealing with invisible entries.
+    Need to read keys until we can fetch all the requested entries, or
+    determine that there are no more entries. Anything else requires
+    a change to the protocol.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit ef9730515e001d77637a77eb89950f70fd5e7f5a)
+
+commit 99b4d1df3f6867e5ff0dd74691203737f6de6974
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Tue Sep 22 15:49:27 2015 -0700
+
+    rgw: orphan tool shouldn't clean up head objects
+    
+    Fixes: #12958
+    
+    Head objects are mutable, so removing them can race with object removal
+    and a later recreation, so we might end up cleaning them up when we don't
+    need to.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 030f697d196df9963ecf4f05f727da4798c583dc)
+
+commit 6d89f4ba85063debe96734e9fdfcba247e770206
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Oct 12 11:55:40 2015 -0700
+
+    rgw: location constraints should return api name
+    
+    Fixes: #13458
+    The S3 location constraints request should return the api name,
+    not the region name.
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 03078bab6ee8c617025902dbe52ec19e64653c33)
+
+commit 2bd5d0b835b546c80b5af503d2b9538835c768fd
+Author: Sebastien Ponce <sebastien.ponce at cern.ch>
+Date:   Tue Oct 20 09:22:16 2015 +0200
+
+    radosstriper : Fixed broken Makefiles after integration of lttng
+    
+    Fixes: #13210, backport of #6322 into hammer
+    
+    Signed-off-by: Sebastien Ponce <sebastien.ponce at cern.ch>
+
+commit 7ffd072a8cc7e114d4d674d30333fea4db04dcdd
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Oct 1 14:50:34 2015 -0400
+
+    osdc/Objecter: distinguish between multiple notify completions
+    
+    We may send a notify to the cluster multiple times due to OSDMap
+    changes.  In some cases, earlier notify attempts may complete with
+    an error, while later attempts succeed.  We need to only pay
+    attention to the most-recently send notify's completion.
+    
+    Do this by making note of the notify_id in the initial ACK (only
+    present when talking to newer OSDs).  When we get a notify
+    completion, match it against our expected notify_id (if we have
+    one) or else discard it.
+    
+    This is important because in some cases an early notify completion
+    may be an error while a later one succeeds.
+    
+    Note that if we are talking to an old cluster we will simply not record a
+    notify_id and our behavior will be the same as before (we will trust any
+    notify completion we get).
+    
+    Fixes: #13114
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit e86d033854c76f344c678e92016c4e5c5e0385e2)
+    
+    Conflicts:
+    	src/osdc/Objecter.cc
+    		In Objecter::handle_watch_notify, a conflict was there due to a modified comment by commit 47277c51db7bb2725ea117e4e8834869ae93e006, which was not backported
+
+commit 647c91098e8517912c73e3f7d27954e6f340472c
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Oct 1 14:50:00 2015 -0400
+
+    osd: reply to notify request with our unique notify_id
+    
+    The OSD assigns a unique ID to each notify it queues for
+    processing.  Include this in the reply to the notifier so that
+    they can match it up with the eventual completions they receive.
+    
+    This is necessary to distinguish between multiple completions
+    they may receive if there is PG peering and the notify is resent.
+    In particular, an earlier notify may return an error when a later
+    attempt succeeds.
+    
+    This is forwards and backwards compatible: new clients will make use of
+    this reply payload but older clients ignore it.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 049ea702b9bf4a8a62ae2770d9ba55c0730b3eef)
+
+commit 0ad9521944e0de5c135a066b0cda07f8976bdae1
+Author: David Zafman <dzafman at redhat.com>
+Date:   Mon Oct 12 13:24:31 2015 -0700
+
+    osd: Correct the object_info_t::decode() version
+    
+    Caused by: 13b9dc70
+    
+    Fixes: #13462
+    Backport: Hammer, Firefly
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 2b7ddde685213f3908f2dd9545b35f1d97f35a79)
+
+commit af734e63f28ac5af414b6507c945ffd9e736d5cf
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 6 12:31:59 2015 -0400
+
+    librbd: invalidate object map on error even w/o holding lock
+    
+    If there is a deep bug that prevents the object map from owning
+    the lock before objects are updated, flag the object map as invalid
+    regardless.
+    
+    Fixes: #13372
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit e675400df7f8ba796d60e9bac4234857f0cb1392)
+    
+     Conflicts:
+    	src/librbd/ObjectMap.h/cc: hammer branch doesn't support rebuild
+
+commit 634d7f62486847846e3862091b8cb587d095cb52
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Oct 8 13:28:04 2015 -0400
+
+    tests: removed obsolete rbd_replay test cases
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit e0d8cb1283e4bdbfc770684b173e477c22558524)
+
+commit 5c63d3c614189381cc169c64a3138c7abcb368c6
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Oct 8 13:26:42 2015 -0400
+
+    ceph-dencoder: new rbd_replay trace file types
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit c2a83d0b518497dc8bcbbdea77b88febe52a3034)
+
+commit a145a1cd8e245505abae66f0497be0df0078cecb
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Oct 8 13:21:29 2015 -0400
+
+    rbd-replay: added version control to trace output file
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3ecdae8388d69123b937a40ce614a0b795a757f1)
+
+commit a30ed76c34ecca6278112908871126e1730a22bc
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Oct 7 15:39:18 2015 -0400
+
+    rbd-replay-prep: added --verbose command line option
+    
+    This new command-line will dump all the processed events as they
+    are extracted from the trace file.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 646e50a771c3089121ec2f4369d1a8188001a3eb)
+
+commit adf31c88d3ed95d0c29c649e2642ee3ae758743b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Oct 7 15:22:25 2015 -0400
+
+    rbd-replay-prep: stream events to the prep file
+    
+    Avoid building the entire prep event history in memory before
+    attempting to write the prepped trace file.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 98f513a113f4e8aff17c83991d2e6f0f3738a9c9)
+
+commit 8c9e67ad0b21629565a09f6b9b92723b98594f84
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Oct 7 14:56:22 2015 -0400
+
+    rbd-replay-prep: simplify IO dependency calculation
+    
+    Only track read-after-write and write-after-write IO dependencies
+    via the associated write completions.  All IO events after a write
+    completion are considered to be dependent and can be pruned down
+    to at most the number of concurrent IOs.  This reduces the prep
+    time from a simple 'rbd bench-write' from over 4 hrs down to seconds.
+    
+    Fixes: #13378, #13384
+    Backport: hammer
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 65fb1b86cbab65023f6207798c9e189bce55dcf6)
+
+commit e7406fcba86646a4c3fbac66ee54b52ce3d5a33d
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 6 13:16:51 2015 -0400
+
+    rbd-replay: improve error messages
+    
+    Fixes: #13221
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4f436e10802d7b3c3949b592fec238c189a02c50)
+
+commit 9f81d28107bd82b7118d1521ade982ab179c5a7a
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 6 12:48:50 2015 -0400
+
+    rbd-replay-prep: support new read/write APIs
+    
+    Added support for read2, write2, aio_read2, and aio_write2 APIs.
+    
+    Fixes: 13325
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b5b4a9dd6bfe10844327a457849a0dbf7ef597ea)
+
+commit a856bee2aa7e22f2bedf54b684c4d55452766b01
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Oct 5 17:30:54 2015 -0400
+
+    rbd-replay-prep: avoid using assert statements on user inputs
+    
+    Fixes: #13220
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit a1e99f06a78d7cf2ecc0c8e9fbc3331e4e4f18f7)
+
+commit 6a4734a7afecb359b8bc9c114332cd7321097c38
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Sep 21 11:16:49 2015 -0700
+
+    ReplicatedPG::hit_set_setup: fix hit_set_remove_all call
+    
+    We only want to do it if the pool config changed AND we are
+    primary && active.
+    
+    fd38902dd4693b9b72f7532833e78f5df2c9efa5 partially fixed a related
+    bug.  This should be backported along with it.
+    
+    Fixes: 13192
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 36e4a80c39f7daab2a35efc04650ae8b7b11c4e0)
+
+commit ab3877dd566f3951e76abaa6b7deeb5835a512b1
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Sep 22 11:13:44 2015 -0700
+
+    osd/: assert in HitSet constructor if type is TYPE_NONE as well
+    
+    Otherwise impl is unpopulated and we risk segfaults in several
+    methods.  It also seems like it would always indicate a bug.
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 8e5a801b43babf751b619ed9606d7be7e5b12837)
+
+commit 4fe07b7f69321535a985958fc761a54cb71136f6
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Thu Jul 23 09:26:44 2015 +0800
+
+    osd: only remove all the hit set objects on primary osd
+    
+    Only the primary PG is allowed to remove all the hit set objects. And
+    the PG should be in the active or peered states.
+    
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+    (cherry picked from commit fd38902dd4693b9b72f7532833e78f5df2c9efa5)
+
+commit 313a09b58b6aa6fe8999f4d5da07a04f00c64cd7
+Author: Zhiqiang Wang <zhiqiang.wang at intel.com>
+Date:   Thu Jun 18 09:05:28 2015 +0800
+
+    osd: implement hit_set_remove_all
+    
+    When hit set is not configured on startup or on a change, remove all
+    previous hitsets.
+    
+    Signed-off-by: Zhiqiang Wang <zhiqiang.wang at intel.com>
+    (cherry picked from commit be28319bf3dc54b4b6f400d83405a29facfe3bd4)
+    Conflicts:
+            src/osd/ReplicatedPG.cc
+              pass the new argument of `p->using_gmt` to get_hit_set_archive_object()
+
+commit b632254252f56d3b2c0c32803593ba765b45b222
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Sep 8 16:52:32 2015 +0800
+
+    mon: disable gmt_hitset if not supported
+    
+    the gmt_hitset is enabled by default in the ctor of pg_pool_t, this
+    is intentional. because we want to remove this setting and make
+    gmt_hitset=true as a default in future. but this forces us to
+    disable it explicitly when preparing a new pool if any OSD does
+    not support gmt hitset.
+    
+    Fixes: #12968
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit e48cec3dc93b3988dcd8924933deb1b3a43e1d0f)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc
+    		remove unrelated hunk
+
+commit 27fc9a3b2bd34bec8d5bb3954b873ce6344771f4
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Aug 28 00:32:38 2015 +0800
+
+    osd: do not let OSD_HITSET_GMT reuse the feature bit
+    
+    * to ease the backport to hammer
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 5a4f6a866bb675195ad83c38fd23238d078c78ed)
+    
+    Conflicts:
+    	src/include/ceph_features.h
+    		minor changes to resolve conflicts
+
+commit 7fcc61d26028eb417a0c224e8c9cd3cc95bc13d9
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Aug 27 11:24:25 2015 -0700
+
+    osd: Decode use_gmt_hitset with a unique version
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 2bc5a48f4c5d3667213be3a7b5a0e0f5ef9daf4f)
+    
+    Conflicts:
+    	src/osd/osd_types.cc
+    		minor changes to resolve conflicts
+
+commit 26c7e968523ac09f608c4ed7c50681fbb741ca1f
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Aug 18 16:53:50 2015 +0800
+
+    mon: print use_gmt_hitset in "ceph osd pool get"
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit cc2bcf760f2d2f20fc4a2fa78ba52475a23e55bf)
+    
+    Conflicts:
+    	src/mon/OSDMonitor.cc
+    		use the old way to dump pool info
+
+commit e8e00dab1b064e77a997504f385b5d60ee8aca25
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Tue Aug 18 00:04:23 2015 +0800
+
+    mon: add "ceph osd pool set $pool use_gmt_hitset true" cmd
+    
+    allow "ceph osd pool set $pool use_gmt_hitset <true|1>" as long as
+    the cluster supports gmt hitset.
+    
+    Fixes: #9732
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 03a1a3cf023a9aeb2fa26820e49e5efe3f3b3789)
+
+commit 040e390d29fc68dcefe48c59cccacf6258c6f690
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Jun 5 21:06:48 2015 +0800
+
+    osd: use GMT time for the object name of hitsets
+    
+    * bump the encoding version of pg_hit_set_info_t to 2, so we can
+      tell if the corresponding hit_set is named using localtime or
+      GMT
+    * bump the encoding version of pg_pool_t to 20, so we can know
+      if a pool is using GMT to name the hit_set archive or not. and
+      we can tell if current cluster allows OSDs not support GMT
+      mode or not.
+    * add an option named `osd_pool_use_gmt_hitset`. if enabled,
+      the cluster will try to use GMT mode when creating a new pool
+      if all the the up OSDs support GMT mode. if any of the
+      pools in the cluster is using GMT mode, then only OSDs
+      supporting GMT mode are allowed to join the cluster.
+    
+    Fixes: #9732
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 42f8c5daad16aa849a0b99871d50161673c0c370)
+    
+     Conflicts:
+    	src/include/ceph_features.h
+    	src/osd/ReplicatedPG.cc
+    	src/osd/osd_types.cc
+    	src/osd/osd_types.h
+    		fill pg_pool_t with default settings in master branch.
+
+commit 31b7864b4161221f6027c6cbe1e42ed598d42b6a
+Author: Nathan Cutler <ncutler at suse.com>
+Date:   Sun Sep 27 21:55:00 2015 +0200
+
+    CephxServiceHandler.cc: fix get_auth conditional
+    
+    The KeyServer class has a public method get_auth() that returns a boolean
+    value. This value is being checked here - fix the conditional so it triggers
+    when get_auth() returns false.
+    
+    http://tracker.ceph.com/issues/9756 References: #9756
+    
+    Signed-off-by: Nathan Cutler <ncutler at suse.com>
+    (cherry picked from commit 7250db62cb7ac1e9c0b1f5956d60b9d874496702)
+
+commit 0742177c767613d41bda0d260eebdd0087e3b392 (refs/remotes/me/wip-randomize-scrub-hammer)
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Sat May 16 00:07:27 2015 +0800
+
+    osd: use another name for randomize scrub option
+    
+    s/osd_scrub_interval_limit/osd_scrub_interval_randomize_ratio/
+    
+    Fixes: #10973
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+
+commit fad33861a87f2feb944ad5454775c95d09364b56
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon Mar 9 16:42:34 2015 +0800
+
+    osd: randomize scrub times to avoid scrub wave
+    
+    - to avoid the scrub wave when the osd_scrub_max_interval reaches in a
+      high-load OSD, the scrub time is randomized.
+    - extract scrub_load_below_threshold() out of scrub_should_schedule()
+    - schedule an automatic scrub job at a time which is uniformly distributed
+      over [now+osd_scrub_min_interval,
+            now+osd_scrub_min_interval*(1+osd_scrub_time_limit]. before
+      this change this sort of scrubs will be performed once the hard interval
+      is end or system load is below the threshold, but with this change, the
+      jobs will be performed as long as the load is low or the interval of
+      the scheduled scrubs is longer than conf.osd_scrub_max_interval. all
+      automatic jobs should be performed in the configured time period, otherwise
+      they are postponed.
+    - the requested scrub job will be scheduled right away, before this change
+      it is queued with the timestamp of `now` and postponed after
+      osd_scrub_min_interval.
+    
+    Fixes: #10973
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 5e44040e8528bff06cc0a5a3f3293ab146e0e4e1)
+    
+    Conflicts:
+    	src/osd/OSD.cc
+
+commit 9c130336a1a1dcf2338d202914aeacbc194af0b0
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Mon Mar 9 16:47:30 2015 +0800
+
+    osd: use __func__ in log messages
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 0f7f35670f03f3f58329c00d323963710e7e495d)
+
+commit 4a3dedff8693953944af3eeb40994f38befebf48
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Apr 15 12:04:05 2015 +0800
+
+    osd: simplify OSD::scrub_load_below_threshold() a little bit
+    
+    avoid unnecessary comparison
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 2ab0e606dfd2847e1918be9f21f572d91befbf7b)
+
+commit 24268cf4309267a0a1e32e28379cf7eafac00bca
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri May 1 14:21:35 2015 -0400
+
+    librbd: invoking RBD::open twice will leak memory
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit a5e88fcf11ebb16d4a1405b21cf6f895b37f185e)
+
+commit 8610de81c8eeae763354a4133e160ccb3faa8dad
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Sep 21 15:46:42 2015 -0700
+
+    use simplifed messenger constructor for clients
+    
+    This is all mechanical except the calculation of the nonce, which is
+    now always randomized for clients.
+    
+    Fixes: #13032
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit a3a8c85b79afef67681c32c57b591c0e0a87a349)
+
+commit 9d059c3f1b3aa0b1830b6f84694c850d36e8a77a
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Mon Sep 21 15:20:53 2015 -0700
+
+    msg: add simplified messenger constructor
+    
+    Several callers create messengers using exactly the same parameters:
+    
+    - reading the ms type from cct that is also passed in
+    - a default entity_name_t::CLIENT
+    - the default features
+    
+    Additionally, the nonce should be randomized and not depend on
+    e.g. pid, as it does in several callers now. Clients running in
+    containers can easily have pid collisions, leading to hangs, so
+    randomize the nonce in this simplified constructor rather than
+    duplicating that logic in every caller.
+    
+    Daemons have meaningful entity_name_ts, and monitors currently depend
+    on using 0 as a nonce, so make this simple constructer
+    client-specific.
+    
+    Related: #13032
+    Signed-off-by: Josh Durgin <jdurgin at redhat.com>
+    (cherry picked from commit e3785b0b5fbff870adbd5f121021b671912386cf)
+    
+    Conflicts:
+       src/msg/Messenger.cc: Messenger::create only has 5 arguments in
+       hammer. Since the last one is zero, it does not change the
+       semantic.
+
+commit 6e29e904ce8e7b3481fd3b318b070d326cd4a71a
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 30 08:29:05 2015 -0400
+
+    init-rbdmap: fix CMDPARAMS
+    
+    Fixes: #13214
+    Reported-by: Wyllys Ingersoll <wyllys.ingersoll at keepertech.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 02113ac449cd7631f1c9a3840c94bbf253c052bd)
+
+commit 7161a2c927a6ded0d6ffe7d7621b7abd7f18acc3
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Sep 21 12:00:49 2015 -0700
+
+    PG: ignore info from down osd
+    
+    Fixes: #12990
+    Backport: firefly, hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 930d8eb1fb0daacd692d2e80b5ff473448bd4e8d)
+
+commit 9753551f9f4ea9a1638dd469ef536d895ca9bc3b
+Author: Samuel Just <sjust at redhat.com>
+Date:   Mon Sep 21 12:01:03 2015 -0700
+
+    OSDMap.h: add has_been_up_since
+    
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 4b00350870e3a43aee5fff7982b3785fe1876634)
+
+commit f1271eae0decf4d1fd9cfd83e5e54d3be6abfb17
+Author: zqkkqz <zheng.qiankun at h3c.com>
+Date:   Fri Aug 7 10:49:45 2015 +0800
+
+    Common/Thread: pthread_attr_destroy(thread_attr) when done with it
+    When a thread attributes object is no longer required, it should be destroyed using the
+    pthread_attr_destroy() function. Destroying a thread attributes object has no effect on threads that were created using that object.
+    
+    Fixes: #12570
+    Signed-off-by: zqkqkz zheng.qiankun at h3c.com
+    (cherry picked from commit 9471bb838a420ef5f439191d87e5388fecccb9e6)
+
+commit 9581f9f4446ed5838bb3de6e1d7cf5faca85df90
+Author: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+Date:   Fri Jul 17 12:43:52 2015 +0200
+
+    Thread.cc: remove malloc/free pair
+    
+    There's no need for mallocing pthread_attr_t in Thread::try_create(),
+    it can be located on stack as it is freed in same function. This reduces
+    pressure put on memory manager.
+    
+    Signed-off-by: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+    (cherry picked from commit 614ac0f4e375f3dd008c8937d3f89f6005d6e0a0)
+
+commit a17f2a9a6600803a8b7f6dd306f7bafb6acc1af5
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Tue Sep 1 21:35:19 2015 +0800
+
+    osdc/Objecter: optimize Objecter::tick.
+    
+    Set bool value is better than insert same value into set<>.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit ee204044d9e69ea44b533c05cec154974039264c)
+
+commit f80d237decac775d82f1e276a1ea600a9f352ffe
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Tue Sep 1 19:32:32 2015 +0800
+
+    osdc/Objecter: remove the unuseful code.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 80f10e3e59dadda2dca4eb62c68af972b701b316)
+
+commit 8f76f4c467dc69cd2af75d9cbb134c26f2d04a84
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Tue Sep 1 15:39:29 2015 +0800
+
+    osdc/Objecter: Don't forget call _op_cancel_map_check when cancel linger op.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 7cc963b1c6ab37bf33638dc6eca7848d93f7908f)
+
+commit ba36caba5226a44c41fdd2b19074916b38af5fdf
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Tue Sep 1 15:12:02 2015 +0800
+
+    osdc/Objecter: In _cancel_linger_op, it should make num_unacked/num_committed decrease.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 36b62710ddef0ffaee25837a92ca1ac9b353ff05)
+
+commit 6ff7b02dc23b42a99c7136d1a55ead05c12e2b97
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Thu Aug 20 17:00:23 2015 +0800
+
+    osdc/Objeter: When cancel op, decrease num_unacked/num_uncommitted.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 064e8585a04edb3d87b38db6bed03e965cfcb359)
+
+commit d815e0aacb4a516f4bbbb59a2b2073b38759d9e8
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Thu Aug 20 15:38:58 2015 +0800
+
+    osdc/Objecter: For func op_cancel_writes it can directly call op_cancel.
+    
+    Becasue we get write-lock of rwlock, so it is safe to call op_cancel
+    rather than _op_canchel(homeless_session for this case don't met).
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit e4ce619fe17a7a9dfc18e6af0b84928aa2d88c00)
+    
+    Conflicts:
+          src/osdc/Objecter.cc: the last if (found) was incorrectly
+          implemented as if (to_cancel.size()) after hammer. The
+          conflict is because the patch tries to revert an incorrect
+          if (to_cancel.size()) which is not in hammer.
+
+commit 53316f3694c2a219541dcbdb0269ce97e2d2e9d7
+Author: Jianpeng Ma <jianpeng.ma at intel.com>
+Date:   Wed Aug 19 14:54:21 2015 +0800
+
+    Objecter: Take RLocker when call is_active.
+    
+    Signed-off-by: Jianpeng Ma <jianpeng.ma at intel.com>
+    (cherry picked from commit 89f0112e001a2561f9a5cd705898d43c8909501f)
+
+commit 684928883f5eaaec99a8cc8c43e81fae69f9fbfa
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Sep 16 15:08:17 2015 +0800
+
+    mon/PGMap: calc min_last_epoch_clean when decode
+    
+    Fixes: #13112
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit d0ac68bf1785b330f3202d924c2203ace9393fe6)
+
+commit 7d4b303b2d9649e2722a9b8f0be5c505776124df
+Author: Guang Yang <yguang at yahoo-inc.com>
+Date:   Wed Sep 23 15:58:02 2015 +0000
+
+    osd: print min_last_epoch_clean along with pg dump
+    
+    Fixes: 13198
+    Signed-off-by: Guang Yang <yguang at yahoo-inc.com>
+    (cherry picked from commit f5359f2314ce3e76ed446c01889dd23550c3ac36)
+
+commit d8ca88dd4b47b4956211d206b0d42112e5842d3f
+Author: Samuel Just <sjust at redhat.com>
+Date:   Tue Sep 22 11:44:18 2015 -0700
+
+    OSDService::agent_entry: don't use PG::operator<< without pg lock
+    
+    Fixes: #13199
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit d422f2820d5beee15117e166546a6386120e0349)
+    
+    Conflicts:
+    	src/osd/OSD.cc: trivial resolution
+
+commit 397042a0cb2f4c628dd722192fee284359d2cbb3
+Author: Xinze Chi <xinze at xksy.com>
+Date:   Wed Sep 23 19:26:00 2015 +0800
+
+    filestore: fix peek_queue for OpSequencer
+    
+    Fixes: #13209
+    Signed-off-by: Xinze Chi <xinze at xsky.com>
+    (cherry picked from commit 5f7b3f5cde779f1300a35a04df2cdb1299f55472)
+
+commit d4e4d85c005ff68cb0461e9d7f0cbe5e6cf2f073
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 23 10:58:01 2015 -0400
+
+    mon/Elector: do a trivial write on every election cycle
+    
+    Currently we already do a small write when the *first* election in
+    a round happens (to update the election epoch).  If the backend
+    happens to fail while we are already in the midst of elections,
+    however, we may continue to call elections without verifying we
+    are still writeable.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit ef909ccbdc303cce8a39edef255325127832ff16)
+
+commit 20a4c0c4831a9dcd49d8ad34b99369effbda9ab8
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 23 10:58:13 2015 -0400
+
+    mon/MonitorDBStore: assert/crash if there is a write error
+    
+    Do this globally intead of relying on teh zillion mon callers to
+    check the error code.  There are no cases where we want to
+    tolerate a commit failure.
+    
+    Fixes: #13089
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 2fb7b1f0e33ada7c9a1be3de2f7708eb0760fcef)
+
+commit 3c1f7cbc45c4744eea3c821f0343596756e05ab1
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Sep 24 18:35:39 2015 -0700
+
+    OSDMap: fill in known encode_features where possible
+    
+    Otherwise, if we get an incremental from hammer (struct_v = 6) we will
+    encode the full map as if it were before CEPH_FEATURE_PGID64, which
+    was actually pre-argonaut.  Similarly, if struct_v >= 7, we know it
+    was encoded with CEPH_FEATURE_OSDMAP_ENC.
+    
+    Fixes: #13234
+    Backport: hammer
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 04679c5451e353c966f6ed00b33fa97be8072a79)
+
+commit 93c523c65c1f0b6f9a76b1d71acf9e8df57c0fc9
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Sep 8 15:47:37 2015 -0400
+
+    librbd: diff_iterate needs to handle holes in parent images
+    
+    If a clone's parent image snapshot includes a discarded extent,
+    this was previously causing an assert failure.  Instead, ignore
+    any discard holes in the parent image.
+    
+    Fixes: #12885
+    Backport: hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3ccc3bb4bd35e57209852d460633e371b4d004e2)
+    
+     Conflicts:
+    	src/librbd/DiffIterate.cc : file doesn't exist in hammer, logic is in internal.cc
+
+commit 359b68447393980bb7cdd4acc23582e8046b186c
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Sep 28 10:25:07 2015 -0400
+
+    tests: new test case for librbd diff_iterate over discard extents
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit d5650c9cf85188efa73b279c8f4e4723fa475308)
+    
+    Conflicts:
+        src/test/librbd/test_librbd.cc : diff_iterate2 doesn't exist in hammer
+
+commit 71a42f7c3aa55de688ef16ea7e392573fa5a7e62
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Mon Jun 8 16:54:08 2015 +0800
+
+    bug fix: osd: avoid multi set osd_op.outdata in tier pool
+    
+    There are two read op on the same object for ec pool. First op read
+    miss happend, calling do_proxy_read and promote_object, The second op only
+    do_proxy_read. but before first op process_copy_chunk finish, the second op
+    finish_proxy_read. first op receive reply from base pool
+    first and then second received. so the second op set the field "outdata"
+    in m->ops first. And then first op requeue_ops in process_copy_chunk,
+    At last in do_osd_ops, it append outdata field.
+    
+    Fixes: 12540
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit 855ae1fd6e4557adba1cbd8ab532488b867cee2a)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc
+
+commit e8cce089102abd8ec1b8e916c6f2c4a5b339cbd3
+Author: Xinze Chi <xmdxcxz at gmail.com>
+Date:   Wed Jul 29 16:28:33 2015 +0800
+
+    bug fix: osd: requeue_scrub when kick_object_context_blocked
+    
+    when read miss in writeback cache pool, osd do_proxy_read first
+    and maybe promote it. but in this case, the op is not added to
+    waiting_for_blocked_object. pg scrub maybe block by this object
+    (_range_available_for_scrub). so after promote it, we should
+    requeue_scrub.
+    
+    Fixes: 12515
+    Signed-off-by: Xinze Chi <xmdxcxz at gmail.com>
+    (cherry picked from commit f77949fedce3449befd74efeb5270579f5085b16)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc
+    		in ReplicatedPG::kick_object_context_blocked, removed hobject_t::BitwiseComparator from map p
+
+commit 8ee93d5f661b303cafcb0134a0e9a1fce7b8e6b2
+Author: Samuel Just <sjust at redhat.com>
+Date:   Thu Aug 27 11:08:33 2015 -0700
+
+    PG::handle_advance_map: on_pool_change after handling the map change
+    
+    Otherwise, the is_active() checks in the hitset code can erroneously
+    return true firing off repops stamped with the new epoch which then get
+    cleared in the map change code.  The filestore callbacks then pass the
+    interval check and call into a destroyed repop structure.
+    
+    Fixes: 12809
+    Backport: hammer,firefly
+    Signed-off-by: Samuel Just <sjust at redhat.com>
+    (cherry picked from commit 14e02bc90a463805f4c3e2de210892067a52514b)
+
+commit cecd68d06d4d114b0b735155da5c2bac736714c3
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Aug 28 11:36:49 2015 +0800
+
+    ceph_test_rados_api_aio: add a test for aio_sparse_read
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 076bad955d374cbb37b77e2b0429f3c85f32abc0)
+
+commit 8849f9933fe0fc315da0981f9cd88ea108f686ed
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Thu Aug 27 22:57:16 2015 +0800
+
+    ceph_test_rados_api_io: add tests for sparse_read
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 4d4920610ebfcb516630ed15678979c9e9292f5a)
+    
+     Conflicts:
+    	src/test/librados/test.cc
+    		minor changes and remove C++11 stuff
+
+commit 64b22dcba316bf9ac5598c249e4fba47c157f588
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Aug 26 15:41:13 2015 +0800
+
+    ceph_test_rados: also send sparse_read in ReadOp
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 5ae2e7a185b5f95753a09a89d7110fc38848a083)
+    
+    Conflicts:
+    	src/test/osd/RadosModel.h
+    		remove the piped-read test
+
+commit 6ca593026f81580ecbd02ad6140347f31086a87d
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Fri Aug 28 14:27:53 2015 +0800
+
+    osd: should use ec_pool() when checking for an ecpool
+    
+    we were using pool.info.require_rollback() in do_osd_ops() when
+    handling OP_SPARSE_READ to tell if a pool is an ecpool. should
+    use pool.info.ec_pool() instead.
+    
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit a5bfde69a9d14de67da1e3354173ec70ba089b37)
+
+commit 318049911445a3cc257db2b3beb3ab53e6f1d64e
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Thu Aug 27 22:57:49 2015 +0800
+
+    osd: translate sparse_read to read for ecpool
+    
+    Fixes: #12012
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 700d42ef1c82f5602249b96690ae881c1d259d54)
+
+commit d8ac5103e433f6649e28392b365d2e02b4ba1ffe
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Aug 10 19:10:19 2015 -0400
+
+    WorkQueue: add/remove_work_queue methods now thread safe
+    
+    These methods were not acquiring the ThreadPool lock when
+    manipulating the work_queue collection.  This was causing
+    occasional crashes within librbd when opening and closing
+    images.
+    
+    Fixes: #12662
+    Backport: hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3e18449b01c1ab78d1bbfc1cf111aa9bdbef7b1f)
+
+commit e8d6d5a5f43b75f6aaec4c977221ad97d11e314c (refs/remotes/gh/wip-11786.hammer)
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Mon Sep 7 14:12:19 2015 +0100
+
+    mon: MonitorDBStore: make get_next_key() work properly
+    
+    We introduced a significant bug with 2cc7aee, when we fixed issue #11786.
+    Although that patch would fix the problem described in #11786, we
+    managed to not increment the iterator upon returning the current key.
+    This would have the iterator iterating over the same key, forever and
+    ever.
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 70d31082fd3dc8c7857994104577f1a3631c678c)
+
+commit dba8b5b113f585586fcbbc0acf05543262486328
+Author: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+Date:   Tue May 19 13:44:21 2015 +0200
+
+    tools: Don't delete, recreate and re-fill buffers in rados bench.
+    
+    Fixes the high CPU usage and corrects rados bench scores on fast SSDs
+    and ramdisks/memstore.
+    For bench run on SSD, on Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz
+    before this patch, times are:
+    write: real 5m0.169s, user 2m33.565s, sys 4m39.791s
+    seq: real 4m28.642s, user 1m35.250s, sys 6m42.948s
+    rand: real 5m0.258s, user 1m19.656s, sys 6m47.145s
+    
+    After this patch:
+    write: real 5m1.162s, user 0m27.788s, sys 3m11.707s
+    seq: real 5m1.149s, user 2m23.278s, sys 4m14.427s
+    rand: real 5m1.021s, user 2m30.514s, sys 4m20.347s
+    
+    Bench run: rados -p ssd bench 300 write|seq|read --no-cleanup
+    
+    Note the increase in user time cpu on seq/read tests,
+    along with decreased sys cpu time; this is because there's
+    additional memcmp() that compares read objects with expected
+    contents. With less time spent memory juggling, more time is
+    spent performing more reads per second, increasing memcmp call
+    count and increasing amount of user cpu time used.
+    
+    Signed-off-by: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+    (cherry picked from commit b894fc7acf7dee7f7ec8c5c280e7a6be41133328)
+    
+    Conflicts:
+    	src/common/obj_bencher.cc
+    		return -5 was replaced with return r
+
+commit fa72ecb509fa4ddd5f227b1e279eae390284a72c
+Author: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+Date:   Fri May 15 15:44:18 2015 +0200
+
+    bufferlist: implement bufferlist::invalidate_crc()
+    
+    This function iterates over all bufferlist internal buffers and calls
+    their invalidate_crc() method. Required for rados bench to work
+    correctly, because it modifies buffers outside buffer api, invalidating
+    internal CRC cache in the process - this method clears that cache, so
+    another call for buffer::get_crc() to return correct checksum.
+    
+    Signed-off-by: Piotr Dałek <piotr.dalek at ts.fujitsu.com>
+    (cherry picked from commit 55a6f9efbee041d041742810ca4fa8874b6191a7)
+
+commit 50c82f2095add5ad75200a62081fd2f5fea8d8d9
+Author: Owen Synge <osynge at suse.com>
+Date:   Mon Jun 1 15:57:03 2015 +0200
+
+    ceph.spec.in summary-ended-with-dot
+    
+    RPM spec files summary should not end with a dot.
+    This was inconsistent across the ceph rpm packages
+    and creates errors with rpm lint.
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit 042e8ff4dc71795d957bbfac12fade2bc0fc4674)
+
+commit 94699e724b45a9a6de84a943c5b834d2f20f85ef
+Author: Owen Synge <osynge at suse.com>
+Date:   Mon Jun 1 14:58:31 2015 +0200
+
+    ceph.spec.in libcephfs_jni1 has no %post and %postun
+    
+    /usr/lib64/libcephfs_jni.so.1.0.0 requires /sbin/ldconfig to be
+    run after installing and after removing.
+    
+    Signed-off-by: Owen Synge <osynge at suse.com>
+    (cherry picked from commit 0742d82b5561634a5f4ed73fc6cbe4d4f26b0d42)
+
+commit 7475a8fe3f31a46a949f051ded383cd6f396a0fa
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Apr 21 16:08:09 2015 -0700
+
+    logrotate.conf: prefer service over invoke-rc.d
+    
+    On trusty 14.04, service works but invoke-rc.d does not (but is present).
+    
+    Fixes: #11330
+    Reported-by: Wim Heirman <wim at heirman.net>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 6063a21f9edbbf80e44d45ff52a9f4ba1a1cb2c9)
+
+commit 86f88dfce3c0e785d0ff48ec8892e53e6a53b080
+Author: John Spray <john.spray at redhat.com>
+Date:   Thu Jul 23 10:15:56 2015 +0100
+
+    mon: fix checks on mds add_data_pool
+    
+    Use same _check_pool helper as during fs creation.
+    
+    Fixes: #12426
+    
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 329741ec238d6af4b69bc838ba667be232741b3d)
+
+commit a65c39852775b17323fa4efee54bde12ce22a512
+Author: Kefu Chai <kchai at redhat.com>
+Date:   Wed Jul 29 15:52:19 2015 +0800
+
+    common/syncfs: fall back to sync(2) if syncfs(2) not available
+    
+    Fixes: #12512
+    Signed-off-by: Kefu Chai <kchai at redhat.com>
+    (cherry picked from commit 08210d6a85527b0759f6dc4411f742bc13a4939f)
+    
+    Conflicts:
+    	src/common/sync_filesystem.h
+              - subtle difference in #if/#else/#endif structure
+
+commit e6eaa914d685f2a8f1f8cf3b01112a1b720e1358
+Author: Joao Eduardo Luis <joao at suse.de>
+Date:   Wed May 27 22:28:49 2015 +0100
+
+    mon: MonitorDBStore: get_next_key() only if prefix matches
+    
+    get_next_key() had a bug in which we would always return the first key
+    from the iterator, regardless of whether its prefix had been specified
+    to the iterator.
+    
+    Fixes: #11786
+    
+    Signed-off-by: Joao Eduardo Luis <joao at suse.de>
+    (cherry picked from commit 2cc7aee1abe40453093306c8fef2312b650dff5d)
diff --git a/doc/changelog/v9.2.1.txt b/doc/changelog/v9.2.1.txt
new file mode 100644
index 0000000..cdd9e95
--- /dev/null
+++ b/doc/changelog/v9.2.1.txt
@@ -0,0 +1,1637 @@
+commit 752b6a3020c3de74e07d2a8b4c5e48dab5a6b6fd (tag: refs/tags/v9.2.1)
+Author: Jenkins Build Slave User <jenkins-build at jenkins-slave-wheezy.localdomain>
+Date:   Wed Feb 24 22:07:26 2016 +0000
+
+    9.2.1
+
+commit 71f380a81c6870466e11a74a597f847494ba23e9
+Merge: 8350215 b0c9176
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Feb 11 22:32:53 2016 +0700
+
+    Merge pull request #7484 from dillaman/wip-14610-infernalis
+    
+    librbd: flattening an rbd image with active IO can lead to hang
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 83502159f5b94139784b908dd4e4bdf1d420e62a
+Merge: f5e33cd 46ed443
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Feb 11 22:32:41 2016 +0700
+
+    Merge pull request #7406 from dillaman/wip-14542-infernalis
+    
+    librbd: ImageWatcher shouldn't block the notification thread
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit f5e33cd348532b4ed911f49240a5da0c6859a9ad
+Merge: a474c09 389ed34
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Feb 11 22:32:25 2016 +0700
+
+    Merge pull request #6981 from dillaman/wip-14062-infernalis
+    
+    librbd: fix merge-diff for >2GB diff-files
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit b0c91768d4ac81baaf9b5edec92adad91ade9b64
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Dec 23 12:06:50 2015 -0500
+
+    librbd: ensure librados callbacks are flushed prior to destroying image
+    
+    Fixes: #14092
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 98157ab3274bd960e4487e34f5a83e9c921a6ac8)
+
+commit f3987367920368cbce865533cf11a1eb207fb9c7
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jul 30 22:31:55 2015 -0400
+
+    librbd: simplify IO flush handling
+    
+    Add a new convenience method to ImageCtx for handling flush
+    requests and cleanup flush handling with dealing with the cache.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (based on commit ee7c6f73992d3b09c6b401fbb782b2151f2399c7)
+
+commit da772fa88db47703d491ebaa9bd709e62858b3b0
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Aug 14 13:28:13 2015 -0400
+
+    WorkQueue: PointerWQ drain no longer waits for other queues
+    
+    If another (independent) queue was processing, drain could
+    block waiting.  Instead, allow drain to exit quickly if
+    no items are being processed and the queue is empty for
+    the current WQ.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit b118d7df1e34387b6e5649a5b205cf061598d0d4)
+
+commit 5593e57c1b1c198e95a636ffdda4922259582a5f
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Feb 2 10:54:53 2016 -0500
+
+    test: new librbd flatten test case
+    
+    AIO operations after a flatten operation were previously
+    hanging during the close of the parent image.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 5b3a4d2cbca51e5c6795ba7d1189920c7d9af806)
+
+commit 46ed443bf674c50a04705597f1caa4882c1ca5b3
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 28 14:38:20 2016 -0500
+
+    librbd: ImageWatcher shouldn't block the notification thread
+    
+    Blocking the notification thread will also result in librados async
+    callbacks becoming blocked (since they use the same thread).
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 6f94bde44500cc4592ac9a842cbb150b8cabf96b)
+    
+    Conflicts:
+        src/librbd/ImageWatcher.[cc|h]: fewer RPC messages and synchronous
+                                        snapshot actions
+
+commit 2be722a3e944436deff7a8ae513e22b02fd31237
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 28 14:35:54 2016 -0500
+
+    librados_test_stub: watch/notify now behaves similar to librados
+    
+    Notifications are executed via the same librados AIO callback
+    thread, so it's now possible to catch deadlock.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 0a3822f1559ba3fe3def6a65883b9c6c7c5a33fe)
+
+commit 8990ee87c9d943f01de68e772da213dc7aad9011
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Thu Jan 28 12:40:18 2016 -0500
+
+    tests: simulate writeback flush during snap create
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 5e564ea9f869b987f3ada2465edfbe5edf9f6435)
+
+commit 389ed3462f6377d48d87a0e0952061585b0ea106
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Dec 18 15:22:13 2015 -0500
+
+    librbd: fix merge-diff for >2GB diff-files
+    
+    Fixes: #14062
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (derived from commit 68125dd01349edf93cfa1af5028c2d438b5ae089)
+
+commit a474c096a3084ef9f8453e76cebff49e4649d4ea
+Merge: 4c04050 0f50439
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Feb 11 13:59:30 2016 +0700
+
+    Merge pull request #6629 from Abhishekvrshny/wip-13733-infernalis
+    
+    rbd: misdirected op in rbd balance-reads test
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 4c04050379e5d8d8512dc51df6b0ecbd1e37dcd7
+Merge: 1aa60f6 29d30ec
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 10 13:00:23 2016 +0700
+
+    Merge pull request #7431 from Abhishekvrshny/wip-14067-infernalis
+    
+    infernalis : Ceph file system is not freeing space
+    
+    Reviewed-by: Yan, Zheng <zyan at redhat.com>
+
+commit 1aa60f6680195a557ce81eeabc6794b4c84d87b1
+Merge: 4dc9791 7fd56ea
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 10 12:59:30 2016 +0700
+
+    Merge pull request #7429 from Abhishekvrshny/wip-14490-infernalis
+    
+    infernalis: fsx failed to compile
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 4dc97912b6003069bc1582caf18bbc702a8864be
+Merge: 2bfc75a a2644ed
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 10 12:57:48 2016 +0700
+
+    Merge pull request #6853 from Abhishekvrshny/wip-13889-infernalis
+    
+    infernalis: Segmentation fault accessing file using fuse mount
+    
+    Reviewed-by: Yan, Zheng <zyan at redhat.com>
+
+commit 2bfc75a0c32685f1151c923a2d84a29549b89ec9
+Merge: e71d062 6c68971
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 10 12:57:09 2016 +0700
+
+    Merge pull request #6752 from ukernel/infernalis-11482
+    
+    mds: fix client capabilities during reconnect (client.XXXX isn't responding to mclientcaps warning)
+    
+    Reviewed-by: Yan, Zheng <zyan at redhat.com>
+
+commit e71d0629caaf0d639efdc9f081bcc2aa8ce156e1
+Merge: 6552eeb 58b43e6
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Feb 10 12:53:34 2016 +0700
+
+    Merge pull request #6628 from Abhishekvrshny/wip-13792-infernalis
+    
+    rbd-replay-* moved from ceph-test-dbg to ceph-common-dbg as well
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 6552eeb2c687e5c7eb8ffbed942f6d99b1c969f9
+Merge: e507a5f 7a44714
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Feb 9 11:58:19 2016 +0700
+
+    Merge pull request #7079 from Abhishekvrshny/wip-14199-infernalis
+    
+    infernalis: [ FAILED ] TestLibRBD.SnapRemoveViaLockOwner
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit e507a5f90f5ec857359a985b28c64d3cb6366bc4
+Merge: 930ef94 83bba36
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Feb 9 11:58:01 2016 +0700
+
+    Merge pull request #7080 from Abhishekvrshny/wip-14142-infernalis
+    
+    infernalis: Verify self-managed snapshot functionality on image create
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 930ef9462ad1d5a92225f2b83ef797b37e22aeba
+Merge: 1061db6 8175e16
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Feb 9 11:57:37 2016 +0700
+
+    Merge pull request #7428 from Abhishekvrshny/wip-14321-infernalis
+    
+    infernalis: cls_rbd: object_map_save should enable checksums
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 1061db6ba16955ef2f3fa49dfed461872b970614
+Merge: 2de6016 2c5b90a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 22:23:18 2016 +0700
+
+    Merge pull request #7427 from Abhishekvrshny/wip-14465-infernalis
+    
+    infernalis: rbd-replay does not check for EOF and goes to endless loop
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 2de60165dd76ece7dc84326e2721d61cde05e004
+Merge: a8d147e f870ba9
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 22:23:01 2016 +0700
+
+    Merge pull request #7426 from Abhishekvrshny/wip-14552-infernalis
+    
+    infernalis: rbd: TaskFinisher::cancel should remove event from SafeTimer
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit a8d147e813d157855f65e271569cedb0ac95a72d
+Merge: 77a26d8 fde4ec6
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:49:41 2016 -0500
+
+    Merge pull request #6397 from SUSE/wip-13615-infernalis
+    
+    OSD::build_past_intervals_parallel() shall reset primary and up_primary when begin a new past_interval.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 77a26d8e7bdb4f351c90a61e8ac87b251294a461
+Merge: cea356a af2ced5
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:49:17 2016 -0500
+
+    Merge pull request #6840 from SUSE/wip-13791-infernalis
+    
+    Objecter: potential null pointer access when do pool_snap_list.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit cea356a959ed410a6094140c9d03852e968ab7a8
+Merge: 5469e99 5ef86d7
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:48:49 2016 -0500
+
+    Merge pull request #6851 from Abhishekvrshny/wip-14018-infernalis
+    
+    infernalis: osd/PG.cc: 288: FAILED assert(info.last_epoch_started >= info.history.last_epoch_started)
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 5469e9904ccc170d282d061308f6694e20ef8946
+Merge: ba4583f 7ac5b15
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:48:25 2016 -0500
+
+    Merge pull request #6849 from Abhishekvrshny/wip-13979-infernalis
+    
+    osd: call on_new_interval on newly split child PG
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit ba4583f3a25a0d01d31e82cdfcd2be414a5648ae
+Merge: fbd96c8 b211686
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:48:03 2016 -0500
+
+    Merge pull request #6907 from Abhishekvrshny/wip-13929-infernalis
+    
+    infernalis: Ceph Pools' MAX AVAIL is 0 if some OSDs' weight is 0
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit fbd96c8a49548a4cd6598c700111ac8b1be7b1d3
+Merge: cef8fc3 73564ac
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:47:36 2016 -0500
+
+    Merge pull request #7421 from Abhishekvrshny/wip-14494-infernalis
+    
+    infernalis: pgs stuck inconsistent after infernalis upgrade
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit cef8fc305e2c52a09b4af9e5a54c3c4117325453
+Merge: 15c27ce 2647c20
+Author: Sage Weil <sage at redhat.com>
+Date:   Mon Feb 8 08:46:25 2016 -0500
+
+    Merge pull request #6627 from Abhishekvrshny/wip-13771-infernalis
+    
+    Objecter: pool op callback may hang forever.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 15c27ce7328baf92ca904e1b92aa8e21b8452263
+Merge: d1da031 2b6d817
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 18:18:07 2016 +0700
+
+    Merge pull request #7543 from SUSE/wip-14676-infernalis
+    
+    infernalis: rgw: radosgw-admin --help doesn't show the orphans find command
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit d1da03131acf735946c3a0deab72d8f7da9e44d8
+Merge: 22e0c6a 1665f81
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:22:28 2016 +0700
+
+    Merge pull request #6993 from badone/wip-13993-infernalis
+    
+    log: Log.cc: Assign LOG_DEBUG priority to syslog calls
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 22e0c6a7388af5e3b3a085ef7f3e2ad162d2c0f8
+Merge: 489a13d e102e5a
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:21:11 2016 +0700
+
+    Merge pull request #6882 from dachary/wip-13988-reuse-osd-id-infernalis
+    
+    tests: verify it is possible to reuse an OSD id
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 489a13d4dd4483937dd7bd7798cb6e7d1dbd240c
+Merge: de01ba4 7d90c01
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:18:35 2016 +0700
+
+    Merge pull request #6852 from Abhishekvrshny/wip-14013-infernalis
+    
+    infernalis: systemd/ceph-disk at .service assumes /bin/flock
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit de01ba4ea2df67e5b732d6e71cdf324642becbd2
+Merge: b5427f4 5d1e6ae
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:16:23 2016 +0700
+
+    Merge pull request #6846 from Abhishekvrshny/wip-13638-infernalis
+    
+    FileStore: potential memory leak if getattrs fails.
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit b5427f466eb8507dc865d80d0e3293652452f558
+Merge: 5dbd998 ac31f7f
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:14:18 2016 +0700
+
+    Merge pull request #6836 from SUSE/wip-13891-infernalis
+    
+    infernalis: auth/cephx: large amounts of log are produced by osd
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 5dbd9984e09f3c520c69a406f98577bfdcd9b220
+Merge: 2016468 c968a40
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:12:47 2016 +0700
+
+    Merge pull request #6833 from SUSE/wip-13935-infernalis
+    
+    infernalis: Ceph daemon failed to start, because the service name was already used.
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 201646882e2c05d2e2436f62b7bfb50a6466aa54
+Merge: b09670f edde13c
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:12:00 2016 +0700
+
+    Merge pull request #6694 from xiexingguo/xxg-wip-13869
+    
+    osd: fix race condition during send_failures
+    
+    Reviewed-by: David Zafman <dzafman at redhat.com>
+    Reviewed-by: Sage Weil <sage at redhat.com>
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+    Reviewed-by: Kefu Chai <kchai at redhat.com>
+
+commit b09670fea2ff844333c654fb73046dd1596fb2e3
+Merge: 59df52d 4d2a135
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:09:30 2016 +0700
+
+    Merge pull request #6626 from Abhishekvrshny/wip-13655-infernalis
+    
+    crush: crash if we see CRUSH_ITEM_NONE in early rule step
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 59df52df1697ee8dccb39430940e683a7bdab275
+Merge: f8f36b6 0eb2ddb
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Feb 8 11:06:41 2016 +0700
+
+    Merge pull request #6449 from dachary/wip-13671-infernalis
+    
+    tests: testprofile must be removed before it is re-created
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit 2b6d817187265686d21de76db14870ff22d549de
+Author: Yehuda Sadeh <yehuda at redhat.com>
+Date:   Mon Feb 1 16:33:55 2016 -0800
+
+    rgw-admin: document orphans commands in usage
+    
+    Fixes: #14516
+    
+    Signed-off-by: Yehuda Sadeh <yehuda at redhat.com>
+    (cherry picked from commit 105a76bf542e05b739d5a03ca8ae55432350f107)
+
+commit f8f36b6877c0d0d356d1c53a171d5a1a0be423b0
+Merge: 7ffe6ff 399b7c5
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Feb 4 16:23:51 2016 -0500
+
+    Merge pull request #6880 from dachary/wip-14044-infernalis
+    
+    infernalis: ceph-disk list fails on /dev/cciss!c0d0
+
+commit 7ffe6ff4e26db538335b8069ce4fd14fe4cdd76c
+Merge: a8fd5ba 8707b0b
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 29 09:05:14 2016 -0500
+
+    Merge pull request #6392 from SUSE/wip-13589-infernalis
+    
+    mon: should not set isvalid = true when cephx_verify_authorizer retur…
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit a8fd5ba7764b941aeb8a8ec2867a7e212159c84d
+Merge: 1296c2b 1bfb6f7
+Author: Sage Weil <sage at redhat.com>
+Date:   Fri Jan 29 08:55:45 2016 -0500
+
+    Merge pull request #6500 from SUSE/wip-13678-infernalis
+    
+    systemd: no rbdmap systemd unit file
+
+commit 29d30ecd4667567a58a7f92641a8a7618e88fd44
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Thu Nov 12 21:57:27 2015 +0800
+
+    mds: properly set STATE_STRAY/STATE_ORPHAN for stray dentry/inode
+    
+    Fixes: #13777
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 460c74a0b872336a7279f0b40b17ed672b6e15a1)
+
+commit 5f54671e0715781146044e2d38ba79ad03634a64
+Author: John Spray <john.spray at redhat.com>
+Date:   Mon Nov 16 10:57:56 2015 +0000
+
+    mon: don't require OSD W for MRemoveSnaps
+    
+    Use ability to execute "osd pool rmsnap" command
+    as a signal that the client should be permitted
+    to send MRemoveSnaps too.
+    
+    Note that we don't also require the W ability,
+    unlike Monitor::_allowed_command -- this is slightly
+    more permissive handling, but anyone crafting caps
+    that explicitly permit "osd pool rmsnap" needs to
+    know what they are doing.
+    
+    Fixes: #13777
+    Signed-off-by: John Spray <john.spray at redhat.com>
+    (cherry picked from commit 0b474c52abd3d528c041544f73b1d27d7d1b1320)
+
+commit 7fd56eaf215753156bdb6481835f399ad303faf0
+Author: Greg Farnum <gfarnum at redhat.com>
+Date:   Wed Jan 13 13:17:53 2016 -0800
+
+    fsx: checkout old version until it compiles properly on miras
+    
+    I sent a patch to xfstests upstream at
+    http://article.gmane.org/gmane.comp.file-systems.fstests/1665, but
+    until that's fixed we need a version that works in our test lab.
+    
+    Signed-off-by: Greg Farnum <gfarnum at redhat.com>
+    (cherry picked from commit 7d52372ae74878ebd001036ff0a7aad525eb15b6)
+
+commit 8175e163fceb2bdc49ca291e183c08575e6c5d18
+Author: Douglas Fuller <dfuller at redhat.com>
+Date:   Thu Jan 7 11:01:19 2016 -0800
+
+    cls_rbd: enable object map checksums for object_map_save
+    
+    object_map_save disables CRCs when an object map footer isn't provided.
+    Unconditionally re-enable object map CRCs before re-encoding the new object
+    map.
+    
+    Fixes: #14280
+    Signed-off-by: Douglas Fuller <dfuller at redhat.com>
+    (cherry picked from commit d5c02f3ed26edec095d45d7a7f26ff26d1b5aacc)
+
+commit 2c5b90a268ebcdcd8c806ef72c08184cc4e0417a
+Author: Mykola Golub <mgolub at mirantis.com>
+Date:   Thu Jan 21 13:45:42 2016 +0200
+
+    rbd-replay: handle EOF gracefully
+    
+    Fixes: #14452
+    Signed-off-by: Mykola Golub <mgolub at mirantis.com>
+    (cherry picked from commit c59b84c3e2c9bbda68219e4d2288a889dd9ca6cb)
+
+commit f870ba9ab41cac127d182a52f435c7adc628de71
+Author: Douglas Fuller <dfuller at redhat.com>
+Date:   Fri Jan 22 11:18:40 2016 -0800
+
+    rbd: remove canceled tasks from timer thread
+    
+    When canceling scheduled tasks using the timer thread, TaskFinisher::cancel
+    does not call SafeTimer::cancel_event, so events fire anyway. Add this call.
+    
+    Fixes: #14476
+    Signed-off-by: Douglas Fuller <dfuller at redhat.com>
+    (cherry picked from commit 2aa0f318c862dbe3027d74d345671506605778eb)
+
+commit 73564ac22319d158d4bade9ab1a3832a9669d099
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Sep 24 11:38:41 2015 -0400
+
+    osd/PG: For performance start scrub scan at pool to skip temp objects
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 05d79faa512210b0f0a91640d18db33b887a6e73)
+
+commit 2480fca93beb700aa9a963f5b568ab6bf8915e0f
+Author: David Zafman <dzafman at redhat.com>
+Date:   Fri Dec 18 09:08:19 2015 -0800
+
+    osd/OSD: clear_temp_objects() include removal of Hammer temp objects
+    
+    Fixes: #13862
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 10b4a0825d9917b6fdd0d6450640238b78ba05d4)
+
+commit 9ff90acc3efdb1c5bdd23c8658e8692f2879231e
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 17 18:04:08 2015 -0800
+
+    osd: Improve log message which isn't about a particular shard
+    
+    Remove redundant dout()
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit e85907fcc582922925609f595f68c597a88c39dc)
+
+commit 1296c2baef3412f462ee2124af747a892ea8b7a9
+Merge: 9dc5e6c d4c41d0
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Jan 13 17:15:41 2016 -0800
+
+    Merge pull request #7225 from dillaman/wip-13810-infernalis
+    
+    tests: notification slave needs to wait for master
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit d4c41d041b7b176723ccd548102a9d2edf91956e
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Jan 13 12:44:01 2016 -0500
+
+    tests: notification slave needs to wait for master
+    
+    If the slave instance starts before the master, race
+    conditions are possible.
+    
+    Fixes: #13810
+    Backport: infernalis, hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3992d6fe67bbf82322cedc1582406caaf6d4de60)
+
+commit e102e5a0e261f407913c5d47991c2549f6664ffc
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Dec 10 15:20:32 2015 +0100
+
+    tests: verify it is possible to reuse an OSD id
+    
+    When an OSD id is removed via ceph osd rm, it will be reused by the next
+    ceph osd create command. Verify that and OSD reusing such an id
+    successfully comes up.
+    
+    http://tracker.ceph.com/issues/13988 Refs: #13988
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 7324615bdb829f77928fa10d4e988c6422945937)
+
+commit 399b7c5409d9801aa7f38533dd8b7c19c726a594
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Jan 5 17:33:45 2016 +0100
+
+    ceph-disk: list accepts absolute dev names
+    
+    The ceph-disk list subcommand now accepts /dev/sda as well as sda.
+    The filtering is done on the full list of devices instead of restricting
+    the number of devices explored. Always obtaining the full list of
+    devices makes things simpler when trying to match a dmcrypted device to
+    the corresponding raw device.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 591d581c84cfd72d7c655ac88b0911a318b96e95)
+    
+    Conflicts:
+    	src/ceph-disk: as part of the implementation of deactivate /
+    	destroy in master, the prototype of list_device was changed
+            to take a list of paths instead of the all arguments (args).
+
+commit e222d7bce218b732025ce094ed2d1bb31af0d6f6
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Jan 5 14:25:51 2016 +0100
+
+    ceph-disk: display OSD details when listing dmcrypt devices
+    
+    The details about a device that mapped via dmcrypt are directly
+    available. Do not try to fetch them from the device entry describing the
+    devicemapper entry.
+    
+    http://tracker.ceph.com/issues/14230 Fixes: #14230
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 7aab4ed6f108ddc7bc90300f1999a38f30da3a57)
+    
+    Conflicts:
+    	src/ceph-disk: an incorrect attempt was made to fix the same
+                           problem. It was not backported and does not
+                           need to be. It is entirely contained in the
+                           code block removed and is the reason for the
+                           conflict.
+
+commit 87db693eb7d52ad297e8d265ffffa0d7e1125478
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 9 16:52:10 2015 +0100
+
+    tests: limit ceph-disk unit tests to test dir
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 499c80db606fe3926a8a603e03fdba6967d66003)
+
+commit 2c0d7ef2c72b7570a1304cad927a0b612ea3d4a8
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Jan 5 17:38:59 2016 +0100
+
+    ceph-disk: factorize duplicated dmcrypt mapping
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 35a0c94c4cd3a57cfc382c64eaa9cfb9306dd2e6)
+
+commit 22881b1686dc040d8af01c66f59a935065bb680a
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Jan 5 17:42:11 2016 +0100
+
+    ceph-disk: fix regression in cciss devices names
+    
+    The cciss driver has device paths such as /dev/cciss/c0d1 with a
+    matching /sys/block/cciss!c0d1. The general case is that whenever a
+    device name is found in /sys/block, the / is replaced by the !.
+    
+    When refactoring the ceph-disk list subcommand, this conversion was
+    overlooked in a few places. All explicit concatenation of /dev with a
+    device name are replaced with a call to get_dev_name which does the same
+    but also converts all ! in /.
+    
+    http://tracker.ceph.com/issues/13970 Fixes: #13970
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit a2fd3a535e66b3a2b694cda9c6add33383ccfa4a)
+    
+    Conflicts:
+    	src/ceph-disk : trivial resolution
+
+commit 9dc5e6cbf85681d0fb9ab249c571672456eb6556
+Merge: 64fab4f 5798d1e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Thu Jan 7 15:06:32 2016 +0100
+
+    Merge pull request #7001 from dachary/wip-14145-infernalis
+    
+    infernalis: ceph-disk: use blkid instead of sgdisk -i
+    
+    
+    On CentOS 7.1 and other operating systems with a version of udev greater or equal to 214,
+    running ceph-disk prepare triggered unexpected removal and addition of partitions on
+    the disk being prepared. That created problems ranging from the OSD not being activated
+    to failures because /dev/sdb1 does not exist although it should.
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit 5798d1e76c380182472d08ec6f62ebe0f1a9897e
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Jan 6 23:36:57 2016 +0100
+
+    tests: ceph-disk cryptsetup close must try harder
+    
+    Similar to how it's done in dmcrpyt_unmap in master (
+    132e56615805cba0395898cf165b32b88600d633 ), the infernalis tests helper
+    that were deprecated by the addition of the deactivate / destroy
+    ceph-disk subcommand must try cryptsetup close a few times in some
+    contexts.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+
+commit 379bbe0613e8dbe2f4d38f4f9ee23a10ed39a64d
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Sat Dec 19 00:53:03 2015 +0100
+
+    ceph-disk: protect deactivate with activate lock
+    
+    When ceph-disk prepares the disk, it triggers udev events and each of
+    them ceph-disk activate. If systemctl stop ceph-osd at 2 happens while
+    there still are ceph-disk activate in flight, the systemctl stop may be
+    cancelled by the systemctl enable issued by one of the pending ceph-disk
+    activate.
+    
+    This only matters in a test environment where disks are destroyed
+    shortly after they are activated.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 6395bf856b4d4511f0758174ef915ebcafbe3777)
+    
+    Conflicts:
+    
+            src/ceph-disk: ceph-disk deactivate does not exist in ceph-disk
+                on infernalis. But the same feature is implemented in
+                ceph-test-disk.py for test purposes and has the same
+                problem. The patch is adapted to ceph-test-disk.py.
+
+commit 4da2f9494dbd72e84d381cc12125c61931a27628
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Jan 6 11:15:19 2016 +0100
+
+    ceph-disk: retry cryptsetup remove
+    
+    Retry a cryptsetup remove ten times. After the ceph-osd terminates, the
+    device is released asyncrhonously and an attempt to cryptsetup remove
+    will may fail because it is considered busy. Although a few attempts are
+    made before giving up, the number of attempts / the duration of the
+    attempts cannot be controlled with a cryptsetup option. The workaround
+    is to increase this by trying a few times.
+    
+    If cryptsetup remove fails for a reason that is unrelated to timeout,
+    the error will be repeated a few times. There is no undesirable side
+    effect. It will not hide a problem.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 132e56615805cba0395898cf165b32b88600d633)
+
+commit 676a4b42267133a9242a81503f7dd0eaeb0afd33
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Dec 18 17:03:21 2015 +0100
+
+    ceph-disk: use blkid instead of sgdisk -i
+    
+    sgdisk -i 1 /dev/vdb opens /dev/vdb in write mode which indirectly
+    triggers a BLKRRPART ioctl from udev (starting version 214 and up) when
+    the device is closed (see below for the udev release note). The
+    implementation of this ioctl by the kernel (even old kernels) removes
+    all partitions and adds them again (similar to what partprobe does
+    explicitly).
+    
+    The side effects of partitions disappearing while ceph-disk is running
+    are devastating.
+    
+    sgdisk is replaced by blkid which only opens the device in read mode and
+    will not trigger this unexpected behavior.
+    
+    The problem does not show on Ubuntu 14.04 because it is running udev <
+    214 but shows on CentOS 7 which is running udev > 214.
+    
+    git clone git://anonscm.debian.org/pkg-systemd/systemd.git
+    systemd/NEWS:
+    CHANGES WITH 214:
+    
+            * As an experimental feature, udev now tries to lock the
+              disk device node (flock(LOCK_SH|LOCK_NB)) while it
+              executes events for the disk or any of its partitions.
+              Applications like partitioning programs can lock the
+              disk device node (flock(LOCK_EX)) and claim temporary
+              device ownership that way; udev will entirely skip all event
+              handling for this disk and its partitions. If the disk
+              was opened for writing, the close will trigger a partition
+              table rescan in udev's "watch" facility, and if needed
+              synthesize "change" events for the disk and all its partitions.
+              This is now unconditionally enabled, and if it turns out to
+              cause major problems, we might turn it on only for specific
+              devices, or might need to disable it entirely. Device Mapper
+              devices are excluded from this logic.
+    
+    http://tracker.ceph.com/issues/14080 Fixes: #14080
+    
+    Signed-off-by: Ilya Dryomov <idryomov at redhat.com>
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 9dce05a8cdfc564c5162885bbb67a04ad7b95c5a)
+
+commit bb8d53636d3a433bb7752e3a291a86a8af058215
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 16 15:57:03 2015 +0100
+
+    ceph-disk: dereference symlinks in destroy and zap
+    
+    The behavior of partprobe or sgdisk may be subtly different if given a
+    symbolic link to a device instead of an actual device. The debug output
+    is also more confusing when the symlink shows instead of the device it
+    points to.
+    
+    Always dereference the symlink before running destroy and zap.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit fe71647bc9bd0f9ddc6d470ee7bee1e6b0983e2b)
+    
+    Conflicts:
+            src/ceph-disk
+              trivial, because destroy is not implemented
+              in infernalis
+
+commit 74c27423f4925c7a31d6675851ffa3d2f5265ef1
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 16 12:33:25 2015 +0100
+
+    ceph-disk: increase partprobe / udevadm settle timeouts
+    
+    The default of 120 seconds may be exceeded when the disk is very slow
+    which can happen in cloud environments. Increase it to 600 seconds
+    instead.
+    
+    The partprobe command may fail for the same reason but it does not have
+    a timeout parameter. Instead, try a few times before failing.
+    
+    The udevadm settle guarding partprobe are not necessary because
+    partprobe already does the same. However, partprobe does not provide a
+    way to control the timeout. Having a udevadm settle after another is
+    going to be a noop most of the time and not add any delay. It matters
+    when the udevadm settle run by partprobe fails with a timeout because
+    partprobe will silentely ignores the failure.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 730b5d62d3cda7de4076bafa6e9e35f1eb8e2190)
+
+commit 263eb579ac7179a19157004ed2de294085dc4a63
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 16 12:36:47 2015 +0100
+
+    tests: ceph-disk workunit increase verbosity
+    
+    So that reading the teuthology log is enough in most cases to figure out
+    the cause of the error.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit fd7fe8c4977658f66651dad5efb0d816ae71b38b)
+    
+    Conflicts:
+    	qa/workunits/ceph-disk/ceph-disk-test.py:
+              trivial, because destroy/deactivate are not implemented
+              in infernalis. The existing destroy_osd function
+              has to be modified so the id returned by sh() does
+              not have a trailing newline.
+
+commit 936dda76ce11baa9f2b7cce882b655550188a731
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 16 12:30:20 2015 +0100
+
+    ceph-disk: log parted output
+    
+    Should parted output fail to parse, it is useful to get the full output
+    when running in verbose mode.
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit f5d36b9ac299e9f6d52cc32d540cc1c3342de6e7)
+
+commit db26cc4b7fbd5b6f2a3da58fb7ac7736fc058065
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Wed Dec 16 12:29:17 2015 +0100
+
+    ceph-disk: do not discard stderr
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 5fa35ba10e10b56262757afc43929ab8ee4164f2)
+    
+    Conflicts:
+    	src/ceph-disk : trivial, because destroy/deactivate
+            are not implemented in infernalis
+
+commit 83bba36afbae58ebe7cea2b0fb8ff51edb475fff
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Dec 14 17:49:55 2015 -0500
+
+    tests: new integration test for validating new RBD pools
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 00cfe4efacd664032f700afe9701d41bacf8700a)
+
+commit 96cb5e2888e698879f3d3663dfa6f556e983a555
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Dec 14 17:41:49 2015 -0500
+
+    librbd: optionally validate RBD pool configuration (snapshot support)
+    
+    Fixes: #13633
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 1fea4dadc60e13518e9ee55d136fbc4e9d3a621e)
+
+commit 7a44714b66218cf39aa6e1673059a13729c7c39e
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Dec 23 13:26:39 2015 -0500
+
+    librbd: properly handle replay of snap remove RPC message
+    
+    Fixes: #14164
+    Backport: infernalis
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit bc309d9d7612f005a3d50ecf099ddf9b706a1bf6)
+
+commit 64fab4f080c5b7d79b51b8db8c71428b507efec5
+Merge: f480cea 7676343
+Author: Josh Durgin <jdurgin at redhat.com>
+Date:   Wed Dec 23 10:47:30 2015 -0800
+
+    Merge pull request #7038 from dillaman/wip-14121-infernalis
+    
+    tests: rebuild exclusive lock test should acquire exclusive lock
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 7676343c781e9c15e18c5960d221a29840835332
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Wed Dec 23 10:31:07 2015 -0500
+
+    tests: rebuild exclusive lock test should acquire exclusive lock
+    
+    Starting with Jewel, the object map will not be loaded until the
+    exclusive lock is acquired since it might be updated by the
+    lock owner.
+    
+    Fixes: #14121
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 1665f8187b16c9b47238743a7a94f0850160eb71
+Author: Brad Hubbard <bhubbard at redhat.com>
+Date:   Mon Dec 7 11:31:28 2015 +1000
+
+    log: Log.cc: Assign LOG_DEBUG priority to syslog calls
+    
+    Fixes: #13993
+    Signed-off-by: Brad Hubbard <bhubbard at redhat.com>
+    (cherry picked from commit 8e93f3f45db681f82633ca695a7dc4e7bd030584)
+
+commit b211686dddf35d990c07ea50b868b98ac3abf8d3
+Author: Chengyuan Li <chengyli at ebay.com>
+Date:   Thu Nov 19 22:29:39 2015 -0700
+
+    mon/PGMonitor: MAX AVAIL is 0 if some OSDs' weight is 0
+    
+    In get_rule_avail(), even p->second is 0, it's possible to be used
+    as divisor and quotient is infinity, then is converted to an integer
+    which is negative value.
+    So we should check p->second value before calculation.
+    
+    It fixes BUG #13840.
+    
+    Signed-off-by: Chengyuan Li <chengyli at ebay.com>
+    (cherry picked from commit 18713e60edd1fe16ab571f7c83e6de026db483ca)
+
+commit f480cea217008fa7b1e476d30dcb13023e6431d1
+Merge: d3aaeae 34d0b69
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Wed Dec 9 11:22:26 2015 +0530
+
+    Merge pull request #6395 from SUSE/wip-13593-infernalis
+    
+    Ceph-fuse won't start correctly when the option log_max_new in ceph.conf set to zero
+    
+    Reviewed-by: Greg Farnum <gfarnum at redhat.com>
+
+commit d3aaeae1884a26b6a069c6926ebe9cea62625850
+Merge: 476af49 ebc5e4e
+Author: Loic Dachary <loic at dachary.org>
+Date:   Wed Dec 9 00:06:33 2015 +0100
+
+    Merge pull request #6828 from dachary/wip-ceph-disk-augeas
+    
+    tests: ceph-disk workunit uses configobj
+    
+    Reviewed-by: Loic Dachary <ldachary at redhat.com>
+
+commit ebc5e4ee46dce9ab17208cdebc31ae5cc8c7e828
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Oct 22 01:48:31 2015 +0200
+
+    tests: ceph-disk workunit uses the ceph task
+    
+    The ceph-disk workunit deploy keys that are not deployed by default by
+    the ceph teuthology task.
+    
+    The OSD created by the ceph task are removed from the default
+    bucket (via osd rm) so they do not interfere with the tests.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 163de5b0f8f46695ab41b3f2288e9b5c1feaedab)
+
+commit 0afaeb243448819dfce0de2778c27015a46e195a
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Thu Oct 22 00:21:49 2015 +0200
+
+    tests: ceph-disk workunit uses configobj
+    
+    Instead of using augtool to modify the configuration file, use
+    configobj. It is also used by the install teuthology task. The .ini
+    lens (puppet lens really) is unable to read ini files created by
+    configobj.
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit f4906a124cc194dccd855679a04a5c7ffc125a44)
+
+commit a2644ed52c4b8a075919866af9d333fa1f703644
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Mon Nov 9 11:37:02 2015 +0800
+
+    client: use null snapc to check pool permission
+    
+    snap inodes' ->snaprealm can be NULL, so dereferencing it in
+    check_pool_perm() can cause segment fault. The pool permission
+    check does not write any data, so it's safe to use null snapc.
+    
+    Fixes: #13714
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit fad3772fb7731272d47cbfd9e81f22f5df3701a2)
+
+commit 476af491ba03843e953dd257ad972f09c64dd816
+Merge: af86215 54c8af8
+Author: Loic Dachary <loic at dachary.org>
+Date:   Tue Dec 8 09:34:39 2015 +0100
+
+    Merge pull request #6845 from dachary/wip-14019-infernalis
+    
+    infernalis: libunwind package missing on CentOS 7
+    
+    Reviewed-by: Brad Hubbard <bhubbard at redhat.com>
+
+commit 7d90c018e5cfec982f96ce6dd45b6f89218f441d
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Dec 4 21:11:09 2015 +0100
+
+    build/ops: systemd ceph-disk unit must not assume /bin/flock
+    
+    The flock command may be installed elsewhere, depending on the
+    system. Let the PATH search figure that out.
+    
+    http://tracker.ceph.com/issues/13975 Fixes: #13975
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit c8f7d44c935bd097db7d131b785bdab78a7a650c)
+
+commit 5ef86d78f86c8feeae5bade408ce03bd3b86573c
+Author: David Zafman <dzafman at redhat.com>
+Date:   Thu Dec 3 14:52:24 2015 -0800
+
+    osd: Test osd_find_best_info_ignore_history_les config in another assert
+    
+    Signed-off-by: David Zafman <dzafman at redhat.com>
+    (cherry picked from commit 02a9a41f151a3d968bf8066749658659dc6e3ac4)
+
+commit 7ac5b151224f618e2f81387f74b1b7c3159c2b43
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Dec 2 14:50:28 2015 -0500
+
+    osd: call on_new_interval on newly split child PG
+    
+    We must call on_new_interval() on any interval change *and* on the
+    creation of the PG.  Currently we call it from PG::init() and
+    PG::start_peering_interval().  However, PG::split_into() did not
+    do so for the child PG, which meant that the new child feature
+    bits were not properly initialized and the bitwise/nibblewise
+    debug bit was not correctly set.  That, in turn, could lead to
+    various misbehaviors, the most obvious of which is scrub errors
+    due to the sort order mismatch.
+    
+    Fixes: #13962
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit fb120d7b2da5715e7f7d1baa65bfa70d2e5d807a)
+
+commit 5d1e6ae408ee0d9e2972b3de9f81b6a95e86a0a3
+Author: xiexingguo <258156334 at qq.com>
+Date:   Mon Oct 26 18:38:01 2015 +0800
+
+    FileStore: potential memory leak if _fgetattrs fails
+    
+    Memory leak happens if _fgetattrs encounters some error and simply returns.
+    Fixes: #13597
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    
+    (cherry picked from commit ace7dd096b58a88e25ce16f011aed09269f2a2b4)
+
+commit 54c8af80c6e253d13993931d55720c8da99a2b2c
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Dec 8 08:02:56 2015 +0100
+
+    build/ops: enable CR in CentOS 7
+    
+    To get libunwind from the CR repositories until CentOS 7.2.1511 is released.
+    
+    http://tracker.ceph.com/issues/13997 Fixes: #13997
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit 247ee6084b58861da601d349bdba739b252d96de)
+
+commit af2ced594699f95f2dcafd82fa15ca480fa844eb
+Author: xiexingguo <258156334 at qq.com>
+Date:   Mon Nov 2 21:46:11 2015 +0800
+
+    Objecter: remove redundant result-check of _calc_target in _map_session.
+    
+    Result-code check is currently redundant since _calc_target never returns a negative value.
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    
+    (cherry picked from commit 5a6117e667024f51e65847f73f7589467b6cb762)
+
+commit 43dede3144f98de16f8373f376e716f2f73b6f82
+Author: xiexingguo <258156334 at qq.com>
+Date:   Thu Oct 29 17:32:50 2015 +0800
+
+    Objecter: potential null pointer access when do pool_snap_list.
+    
+    Objecter: potential null pointer access when do pool_snap_list. Shall check pool existence first.
+    Fixes: #13639
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    (cherry picked from commit 865541605b6c32f03e188ec33d079b44be42fa4a)
+
+commit ac31f7f8ac168e27b5a33093832aab3bfc97f667
+Author: qiankunzheng <zheng.qiankun at h3c.com>
+Date:   Thu Nov 5 07:29:49 2015 -0500
+
+    auth/cephx: large amounts of log are produced by osd
+    if the auth of osd is deleted when the osd is running, the osd will produce large amounts of log.
+    
+    Fixes:#13610
+    Signed-off-by: Qiankun Zheng <zheng.qiankun at h3c.com>
+    (cherry picked from commit 102f0b19326836e3b0754b4d32da89eb2bc0b03c)
+
+commit c968a40dfb0a0412d1feb7f8f085c8293b42bf4d
+Author: wangchaunhong <root at A22832429.(none)>
+Date:   Tue Oct 20 18:40:23 2015 +0800
+
+    init-ceph: fix systemd-run cant't start ceph daemon sometimes
+    
+    Fixes: #13474
+    Signed-off-by: Chuanhong Wang <wang.chuanhong at zte.com.cn>
+    (cherry picked from commit 2f36909e1e08bac993e77d1781a777b386335669)
+
+commit 0eb2ddb0adf39ef167012e85317e3cfdddf34598
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Tue Nov 3 00:21:51 2015 +0100
+
+    tests: test/librados/test.cc must create profile
+    
+    Now that the create_one_ec_pool function removes the testprofile each
+    time it is called, it must create the testprofile erasure code profile
+    again for the test to use.
+    
+    http://tracker.ceph.com/issues/13664 Refs: #13664
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit a60342942b5a42ee04d59af77a6b904ce62eefc4)
+
+commit 26adf7a3536d7fe5b3a04866e37a4e6afac08509
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Nov 2 20:24:51 2015 +0100
+
+    tests: destroy testprofile before creating one
+    
+    The testprofile erasure code profile is destroyed before creating a new
+    one so that it does not fail when another testprofile erasure code
+    profile already exists with different parameters.
+    
+    This must be done when creating erasure coded pools with the C++
+    interface, in the same way it's done with the C interface.
+    
+    http://tracker.ceph.com/issues/13664 Fixes: #13664
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit 47abab9a6f182aa0abe5047c04402850379bcd6d)
+
+commit c3619f4c1ba16e3d0959c78865ee4218e911da39
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Mon Nov 2 20:23:52 2015 +0100
+
+    tests: add destroy_ec_profile{,_pp} helpers
+    
+    Signed-off-by: Loic Dachary <ldachary at redhat.com>
+    (cherry picked from commit ab46d79bc09fc711fa35302f49eecac81a98519b)
+
+commit 1bfb6f767357fcd7ea424fc17b799fb2c171cf80
+Author: Boris Ranto <branto at redhat.com>
+Date:   Mon Nov 2 14:07:47 2015 +0100
+
+    rbdmap: systemd support
+    
+    Fixes: #13374
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit 9224ac2ad25f7d017916f58b642c0ea25305c3e5)
+
+commit 4eded389eea931fd9cdb0b9700c022088e8825ec
+Author: Boris Ranto <branto at redhat.com>
+Date:   Fri Oct 30 18:33:36 2015 +0100
+
+    rbdmap: Move do_map and do_unmap shell functions to rbdmap script
+    
+    This patch creates rbdmap shell script that is called from init-rbdmap
+    init script. The patch also renames src/rbdmap configuration file to
+    src/etc-rbdmap so that rbdmap shell script can be installed via build
+    system directly. Finally, the patch accomodates these changes in spec
+    file and build system.
+    
+    Fixes: #13374
+    Signed-off-by: Boris Ranto <branto at redhat.com>
+    (cherry picked from commit c0980af3c72f01e6f99fd1e7e91c446934d6d856)
+    
+    Conflicts:
+    	src/init-rbdmap
+                Trivial resolution.
+
+commit 6c68971d1cfc27d30f92a83119e922180b389b43
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Oct 30 21:04:04 2015 +0800
+
+    mds: consider client's flushing caps when choosing lock states
+    
+    Client may flush and drop caps at the same time. If client need to
+    send cap reconnect before the caps get flushed. The issued caps in
+    the cap reconnect does not include the flushing caps. When choosing
+    lock states, MDS only consider the issued caps in cap reconnect, it
+    may choose wrong states.
+    
+    Fixes: #11482
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit ce9a596dcaf95dd4af0a3a9e28871462a6bcb930)
+
+commit 3fcf905dd65d6db514d403e2829b039df7bd9645
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Oct 30 17:28:02 2015 +0800
+
+    client: cancel revoking caps when reconnecting the mds
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 9ab61b2779740d9038b169da0de616b89b07b813)
+
+commit 7e8706bada034ce428716963a5e3151723f83126
+Author: Yan, Zheng <zyan at redhat.com>
+Date:   Fri Oct 30 17:21:11 2015 +0800
+
+    mds: choose EXCL state for filelock when client has Fb capability
+    
+    Signed-off-by: Yan, Zheng <zyan at redhat.com>
+    (cherry picked from commit 655ae79dd266dfd488aff67642aceab4ab383d01)
+
+commit af86215e0b178340055ff6ec7c8ec3b3c0bd1acf
+Merge: 899ff61 497c1f0
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Tue Dec 1 17:44:24 2015 +0530
+
+    Merge pull request #6634 from Abhishekvrshny/wip-13761-infernalis
+    
+    unknown argument --quiet in udevadm settle
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 899ff6160a289dfeb5c287afa8d9b168e11382ed
+Merge: f2b323a fdb5dbd
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Mon Nov 30 21:56:40 2015 +0530
+
+    Merge pull request #6650 from Abhishekvrshny/wip-13830-infernalis
+    
+    init script reload doesn't work on EL7
+    
+    Reviewed-by: Boris Ranto <branto at redhat.com>
+
+commit f2b323a69bb54ee99743bf53043d6a4e21e2a0bb
+Merge: 5c02e2b effaf26
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Mon Nov 30 21:55:55 2015 +0530
+
+    Merge pull request #6477 from SUSE/wip-13705-infernalis
+    
+    rbd : enable feature objectmap
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit 5c02e2bd78782f1ea19836806d3773748be66ed1
+Merge: ed8ac03 c2e7fe9
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Mon Nov 30 21:55:22 2015 +0530
+
+    Merge pull request #6474 from SUSE/wip-13619-infernalis
+    
+    rbd clone issue
+    
+    Reviewed-by: Jason Dillaman <dillaman at redhat.com>
+
+commit ed8ac030a979ca9fb2cbf340c316c4432e54cd0d
+Merge: 1551c1b ad84753
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Mon Nov 30 21:54:44 2015 +0530
+
+    Merge pull request #6633 from Abhishekvrshny/wip-13759-infernalis
+    
+    rbd: pure virtual method called
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit 1551c1be297cfc73457819c7c983b113ac9c86f6
+Merge: b8000d6 83c3880
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Mon Nov 30 21:54:18 2015 +0530
+
+    Merge pull request #6632 from Abhishekvrshny/wip-13756-infernalis
+    
+    QEMU hangs after creating snapshot and stopping VM
+    
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit b8000d6f489af3e13c4996b46363c3884ccfd0de
+Merge: fc6f21a 74cb593
+Author: Abhishek Varshney <Abhishekvrshny at users.noreply.github.com>
+Date:   Mon Nov 30 21:50:40 2015 +0530
+
+    Merge pull request #6630 from Abhishekvrshny/wip-13754-infernalis
+    
+    Avoid re-writing old-format image header on resize
+    Reviewed-by: Josh Durgin <jdurgin at redhat.com>
+
+commit fc6f21a1d3ff34b4ff522ef03b368b3ad4570a1c
+Merge: bb2ecea a2c6a21
+Author: Loic Dachary <loic at dachary.org>
+Date:   Mon Nov 30 15:01:23 2015 +0100
+
+    Merge pull request #6396 from SUSE/wip-13342-infernalis
+    
+    ceph upstart script rbdmap.conf incorrectly processes parameters
+    
+    Reviewed-by: Sage Weil <sage at redhat.com>
+
+commit edde13ce55d0789523a3101e5f435fc61bef5d69
+Author: Sage Weil <sage at redhat.com>
+Date:   Thu Sep 17 21:42:53 2015 -0400
+
+    osd: fix send_failures() locking
+    
+    It is unsafe to check failure_queue.empty() without the lock.
+    Fixes: #13869
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit b3ca828ae8ebc9068073494c46faf3e8e1443ada)
+
+commit 0f5043975dbde75036b9f9e8be757494b8cdc73b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Oct 23 14:17:06 2015 -0400
+
+    osd: move misdirected op check from OSD thread to PG thread
+    
+    The op message isn't fully decoded until after the start of the PG
+    op handling.  Therefore, checking for misdirected ops needs to wait
+    until after the RWM flags have been initialized.
+    
+    Fixes: #13491
+    Backport: infernalis
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 56ba90f5e49d499ea9f6bda9665031ce90abdc32)
+    
+    Conflicts:
+    	src/osd/ReplicatedPG.cc
+    		In ReplicatedPG::do_op, resolved conflicts caused by afcfb050930e2e4086d631119022fd2dee9feb21 and 818d790f7d424520bc96c651571f2c86e94caf1e
+
+commit a2c6a212fbb8002fa95270c0f37c02496447624f
+Author: Sage Weil <sage at redhat.com>
+Date:   Wed Sep 30 08:29:05 2015 -0400
+
+    init-rbdmap: fix CMDPARAMS
+    
+    Fixes: #13214
+    Reported-by: Wyllys Ingersoll <wyllys.ingersoll at keepertech.com>
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 02113ac449cd7631f1c9a3840c94bbf253c052bd)
+
+commit fdb5dbd744a6cfa4f7497e3a98aed13ab8daf4d9
+Author: Herve Rousseau <hroussea at cern.ch>
+Date:   Fri Nov 6 09:52:28 2015 +0100
+
+    rgw: fix reload on non Debian systems.
+    
+    When using reload in non-debian systems, /bin/sh's kill is used to send the HUP signal to the radosgw process.
+    This kill version doesn't understand -SIGHUP as a valid signal, using -HUP does work.
+    
+    Fix: #13709
+    Backport: hammer
+    Signed-off-by: Hervé Rousseau <hroussea at cern.ch>
+    (cherry picked from commit 1b000abac3a02d1e788bf25eead4b6873133f5d2)
+
+commit 497c1f06a2e221631626ffb66bece310406a7491
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 27 10:13:27 2015 -0400
+
+    krbd: remove deprecated --quiet param from udevadm
+    
+    This parameter has been removed since systemd 213, so this
+    effects Fedora 21+, Debian Jessie, and potentially future
+    releases of RHEL 7.
+    
+    Fixes: #13560
+    Backport: hammer, infernalis
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 4300f2a9fe29627eea580564ff2d576de3647467)
+
+commit d0536f9d2f5f54791daa476a9b951fcef9488a50
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Oct 27 10:12:34 2015 -0400
+
+    run_cmd: close parent process console file descriptors
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit f46f7dc94139c0bafe10361622416d7dc343d31f)
+
+commit ad84753ad2d2bfb9ef572a7d21cacb47be6eec1b
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Tue Jul 7 12:11:13 2015 -0400
+
+    WorkQueue: new PointerWQ base class for ContextWQ
+    
+    The existing work queues do not properly function if added to a running
+    thread pool.  librbd uses a singleton thread pool which requires
+    dynamically adding/removing work queues as images are opened and closed.
+    
+    Fixes: #13636
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 3e78b18b09d75626ca2599bac3b9f9c9889507a5)
+
+commit 83c38802a2be16faf7be4ac5ac3c589de8b2dbb0
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 9 11:22:24 2015 -0500
+
+    librbd: fixed deadlock while attempting to flush AIO requests
+    
+    In-flight AIO requests might force a flush if a snapshot was created
+    out-of-band.  The flush completion was previously invoked asynchronously,
+    potentially via the same thread worker handling the AIO request. This
+    resulted in the flush operation deadlocking since it can't complete.
+    
+    Fixes: #13726
+    Backport: infernalis, hammer
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit bfeb90e5fe24347648c72345881fd3d932243c98)
+
+commit 0b21b3f0dc2a9676f3fb2b19141ce75324f53c72
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 9 10:48:10 2015 -0500
+
+    tests: new test case to catch deadlock on RBD image refresh
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit a9729d9553e7fb925509cad8d388cf52a9fede9c)
+
+commit 74cb593a3d29a5549cbe89a974aaa4814d35b8e0
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Mon Nov 2 16:50:19 2015 -0500
+
+    librbd: resize should only update image size within header
+    
+    Previously, the whole RBD image format 1 header struct was
+    re-written to disk on a resize operation.
+    
+    Fixes: #13674
+    Backport: infernalis, hammer, firefly
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit d5be20b6d4646284571568ab28cbf45b0729390b)
+
+commit 6750cab2d6f2c5f928f9c2d2c356047f93e9ce30
+Author: Jason Dillaman <dillaman at redhat.com>
+Date:   Fri Oct 23 14:15:54 2015 -0400
+
+    osd: ensure op rwm flags are checked before they are initialized
+    
+    These flags are now lazy-initialized within the PG thread at the
+    start of op processing instead of once the message is received.
+    
+    Signed-off-by: Jason Dillaman <dillaman at redhat.com>
+    (cherry picked from commit 652856321b0f14293cd885c865552d5b7e787f9a)
+
+commit 58b43e656cd9278667af2b7ac4fee72f50a03caa
+Author: Loic Dachary <ldachary at redhat.com>
+Date:   Fri Nov 13 19:10:28 2015 +0100
+
+    build/ops: rbd-replay moved from ceph-test-dbg to ceph-common-dbg
+    
+    http://tracker.ceph.com/issues/13785 Fixes: #13785
+    
+    Signed-off-by: Loic Dachary <loic at dachary.org>
+    (cherry picked from commit a0204dc47acc0c50223e449fd23a2fc97bfd111a)
+
+commit 2647c20cee7ed5738c711a0c435e35938c7739bd
+Author: xiexingguo <258156334 at qq.com>
+Date:   Thu Oct 29 20:04:11 2015 +0800
+
+    Objecter: pool_op callback may hang forever.
+    
+    pool_op callback may hang forever due to osdmap update during reply handling.
+    Fixes: #13642
+    Signed-off-by: xie xingguo <xie.xingguo at zte.com.cn>
+    
+    (cherry picked from commit 00c6fa9e31975a935ed2bb33a099e2b4f02ad7f2)
+
+commit 4d2a135c042039e0c48302ffd667dc88d024eed9
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 13 09:55:01 2015 -0400
+
+    crush/mapper: ensure take bucket value is valid
+    
+    Ensure that the take argument is a valid bucket ID before indexing the
+    buckets array.
+    
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 93ec538e8a667699876b72459b8ad78966d89c61)
+
+commit ecb6aa232180e3226d56bc8fe0cb643c90f5101b
+Author: Sage Weil <sage at redhat.com>
+Date:   Tue Oct 27 20:55:26 2015 -0400
+
+    crush/mapper: ensure bucket id is valid before indexing buckets array
+    
+    We were indexing the buckets array without verifying the index was within
+    the [0,max_buckets) range.  This could happen because a multistep rule
+    does not have enough buckets and has CRUSH_ITEM_NONE
+    for an intermediate result, which would feed in CRUSH_ITEM_NONE and
+    make us crash.
+    
+    Fixes: #13477
+    Signed-off-by: Sage Weil <sage at redhat.com>
+    (cherry picked from commit 976a24a326da8931e689ee22fce35feab5b67b76)
+
+commit effaf26acccf81675b74277eb0a75368668b0677
+Author: xinxin shu <xinxin.shu at intel.com>
+Date:   Wed Oct 21 19:01:21 2015 +0800
+
+    librbd : fix enable objectmap feature issue
+    
+    Fixes: #13558
+    
+    Signed-off-by: xinxin shu <xinxin.shu at intel.com>
+    (cherry picked from commit b0536ebab4e1f34e1ed87fe5efbb00d0f7b48abb)
+
+commit c2e7fe98738cd31c0886d594920c50a53cbf9bf4
+Author: xinxin shu <xinxin.shu at intel.com>
+Date:   Wed Oct 21 14:56:17 2015 +0800
+
+    rbd: fix clone issue when we specify image feature
+    
+    Fixes: #13553
+    
+    Signed-off-by: xinxin shu <xinxin.shu at intel.com>
+    (cherry picked from commit da48dbb8f8c9417343d2ca7819c58b7c46ef7ad0)
+
+commit fde4ec62888ba0aee97ce714bb15d191625b736f
+Author: xiexingguo <258156334 at qq.com>
+Date:   Tue Oct 13 14:04:20 2015 +0800
+
+    OSD:shall reset primary and up_primary fields when beginning a new past_interval.
+    
+    Shall reset primary and up_primary fields when we start over a new past_interval in OSD::build_past_intervals_parallel().
+    Fixes: #13471
+    Signed-off-by: xie.xingguo at zte.com.cn
+    (cherry picked from commit 65064ca05bc7f8b6ef424806d1fd14b87add62a4)
+
+commit 34d0b692cf1b9c0c2ea508b81d252b901fe1f52b
+Author: wenjunhuang <wenjunhuang at tencent.com>
+Date:   Sat Oct 10 14:30:56 2015 +0800
+
+    ceph-fuse.cc: While starting ceph-fuse, start the log thread first
+    
+    http://tracker.ceph.com/issues/13443 Fixes: #13443
+    
+    Signed-off-by: Wenjun Huang <wenjunhuang at tencent.com>
+    (cherry picked from commit f2763085754462610730a23bb5652237714abc2a)
+
+commit 8707b0b083e7a7732d1e3563b00d3adf3e09807b
+Author: yangruifeng <yangruifeng.09209 at h3c.com>
+Date:   Mon Oct 19 08:08:12 2015 -0400
+
+    mon: should not set isvalid = true when cephx_verify_authorizer return false
+    
+    Fixes: #13525
+    Signed-off-by: Ruifeng Yang <yangruifeng.09209 at h3c.com>
+    (cherry picked from commit c7f75b8f7c0a773148ec16141941efd00ee76626)
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 0000000..f1fefe0
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,52 @@
+import sys
+import os
+
+project = u'Ceph'
+copyright = u'2010-2014, Inktank Storage, Inc. and contributors. Licensed under Creative Commons BY-SA'
+version = 'dev'
+release = 'dev'
+
+templates_path = ['_templates']
+source_suffix = '.rst'
+master_doc = 'index'
+exclude_patterns = ['**/.#*', '**/*~', 'start/quick-common.rst']
+pygments_style = 'sphinx'
+
+html_theme = 'ceph'
+html_theme_path = ['_themes']
+html_title = "Ceph Documentation"
+html_logo = 'logo.png'
+html_favicon = 'favicon.ico'
+html_use_smartypants = True
+html_show_sphinx = False
+html_sidebars = {
+    '**': ['smarttoc.html', 'searchbox.html'],
+    }
+
+extensions = [
+    'sphinx.ext.autodoc',
+    'sphinx.ext.graphviz',
+    'sphinx.ext.todo',
+    'sphinx_ditaa',
+    'breathe',
+    ]
+todo_include_todos = True
+
+top_level = os.path.dirname(
+    os.path.dirname(
+        os.path.abspath(__file__)
+    )
+)
+
+breathe_default_project = "Ceph"
+# see $(top_srcdir)/Doxyfile
+
+breathe_build_directory = os.path.join(top_level, "build-doc")
+breathe_projects = {"Ceph": os.path.join(top_level, breathe_build_directory)}
+breathe_projects_source = {
+    "Ceph": (os.path.join(top_level, "src/include/rados"),
+             ["rados_types.h", "librados.h"])
+}
+pybind = os.path.join(top_level, 'src/pybind')
+if pybind not in sys.path:
+    sys.path.insert(0, pybind)
diff --git a/doc/dev/PlanningImplementation.txt b/doc/dev/PlanningImplementation.txt
new file mode 100644
index 0000000..871eb5f
--- /dev/null
+++ b/doc/dev/PlanningImplementation.txt
@@ -0,0 +1,43 @@
+ <big>About this Document</big>
+This document contains planning and implementation procedures for Ceph.  The audience for this document includes technical support personnel, installation engineers, system administrators, and quality assurance.  
+<B>Prerequisites<b>
+Users of this document must be familiar with Linux command line options.  They must also be familiar with the overall Ceph product. 
+Before You Begin
+Before implementing a new Ceph System, first answer the questions in the Ceph Getting Started Guide to determine your configuration needs.  Once you have determined your hardware and configuration needs, the following decisions must be made:
+�	Determine what level of technical support you need.  Pick from the Ceph Technical Support options in the next section.
+�	Determine how much and what level of training your organization needs.
+Ceph Technical Support Options
+The Ceph Technical support model provides 4 tiers of technical support options:
+1st � This option is for brand new customers that need installation, configuration, and setup on their production environment.  
+2nd � This level of support requires a trouble ticket to be generated on a case by case basis as customer difficulties arise.  Customers can choose between two maintenance options; they can either purchase a yearly maintenance contract, or pay for each trouble resolution as it occurs.
+3rd � This option comes with our bundled packages for customers who have also purchased our hosting plans.  In this case, the customer is a service provider. The Help Desk can generally provide this level of incident resolution. (NEED MORE INFO)
+4th � This level of support requires a Service Level Agreement (SLA) between the customer and Dreamhost.  This level is used for handling the most difficult or advanced problems.
+Planning a Ceph Cluster Configuration
+The following section contains guidelines for planning the deployment for a Ceph cluster configuration.  A Ceph cluster consists of the following core components:
+�	Monitors � These must be an odd number, such as one, three, or five.  Three is the preferred configuration.
+�	Object Storage Devices (OSD) � used as storage nodes
+�	Metadata Servers (MDS)
+For redundancy, you should employ several of these components. 
+Monitors 
+The monitors handle central cluster management, configuration, and state.  
+Hardware Requirements: 
+�	A few gigs of local disk space 
+�	A fixed network address 
+ Warning: Never configure 2 monitors per cluster.  If you do, they will both have to be up all of the time, which will greatly degrade system performance. 
+Object Storage Devices 
+The OSDs store the actual data on the disks. A minimum of two is required. 
+Hardware Requirements: 
+�	As many disks as possible for faster performance and scalability
+�	An SSD or NVRAM for a journal, or a RAID controller with a battery-backed NVRAM. 
+�	Ample RAM for better file system caching 
+�	Fast network 
+ Metadata Servers 
+The metadata server daemon commands act as a distributed, coherent cache of file system metadata. They do not store data locally; all metadata is stored on disk via the storage nodes. 
+Metadata servers can be added into the cluster on an as-needed basis.  The load is automatically balanced. The max_mds parameter controls how many cmds instances are active. Any additional running instances are put in standby mode and can be activated if one of the active daemons becomes unresponsive. 
+Hardware Requirements: 
+�	Large amount of  RAM 
+�	Fast CPU 
+�	Fast (low latency) network 
+�	At least two servers for redundancy and load balancing
+TIPS: If you have just a few nodes, put cmon, cmds, and cosd on the same node.  For moderate node configurations, put cmon and cmds together, and cosd on the disk nodes.  For large node configurations, put cmon, cmds, and cosd each on their own dedicated machine. 
+
diff --git a/doc/dev/cache-pool.rst b/doc/dev/cache-pool.rst
new file mode 100644
index 0000000..7dc71c8
--- /dev/null
+++ b/doc/dev/cache-pool.rst
@@ -0,0 +1,200 @@
+Cache pool
+==========
+
+Purpose
+-------
+
+Use a pool of fast storage devices (probably SSDs) and use it as a
+cache for an existing slower and larger pool.
+
+Use a replicated pool as a front-end to service most I/O, and destage
+cold data to a separate erasure coded pool that does not currently (and
+cannot efficiently) handle the workload.
+
+We should be able to create and add a cache pool to an existing pool
+of data, and later remove it, without disrupting service or migrating
+data around.
+
+Use cases
+---------
+
+Read-write pool, writeback
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We have an existing data pool and put a fast cache pool "in front" of
+it.  Writes will go to the cache pool and immediately ack.  We flush
+them back to the data pool based on the defined policy.
+
+Read-only pool, weak consistency
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We have an existing data pool and add one or more read-only cache
+pools.  We copy data to the cache pool(s) on read.  Writes are
+forwarded to the original data pool.  Stale data is expired from the
+cache pools based on the defined policy.
+
+This is likely only useful for specific applications with specific
+data access patterns.  It may be a match for rgw, for example.
+
+
+Interface
+---------
+
+Set up a read/write cache pool foo-hot for pool foo::
+
+ ceph osd tier add foo foo-hot
+ ceph osd tier cache-mode foo-hot writeback
+
+Direct all traffic for foo to foo-hot::
+
+ ceph osd tier set-overlay foo foo-hot
+
+Set the target size and enable the tiering agent for foo-hot::
+
+ ceph osd pool set foo-hot hit_set_type bloom
+ ceph osd pool set foo-hot hit_set_count 1
+ ceph osd pool set foo-hot hit_set_period 3600   # 1 hour
+ ceph osd pool set foo-hot target_max_bytes 1000000000000  # 1 TB
+ ceph osd pool set foo-hot min_read_recency_for_promote 1
+ ceph osd pool set foo-hot min_write_recency_for_promote 1
+
+Drain the cache in preparation for turning it off::
+
+ ceph osd tier cache-mode foo-hot forward
+ rados -p foo-hot cache-flush-evict-all
+
+When cache pool is finally empty, disable it::
+
+ ceph osd tier remove-overlay foo
+ ceph osd tier remove foo foo-hot
+
+Read-only pools with lazy consistency::
+
+ ceph osd tier add foo foo-east
+ ceph osd tier cache-mode foo-east readonly
+ ceph osd tier add foo foo-west
+ ceph osd tier cache-mode foo-west readonly
+
+
+
+Tiering agent
+-------------
+
+The tiering policy is defined as properties on the cache pool itself.
+
+HitSet metadata
+~~~~~~~~~~~~~~~
+
+First, the agent requires HitSet information to be tracked on the
+cache pool in order to determine which objects in the pool are being
+accessed.  This is enabled with::
+
+ ceph osd pool set foo-hot hit_set_type bloom
+ ceph osd pool set foo-hot hit_set_count 1
+ ceph osd pool set foo-hot hit_set_period 3600   # 1 hour
+
+The supported HitSet types include 'bloom' (a bloom filter, the
+default), 'explicit_hash', and 'explicit_object'.  The latter two
+explicitly enumerate accessed objects and are less memory efficient.
+They are there primarily for debugging and to demonstrate pluggability
+for the infrastructure.  For the bloom filter type, you can additionally
+define the false positive probability for the bloom filter (default is 0.05)::
+
+ ceph osd pool set foo-hot hit_set_fpp 0.15
+
+The hit_set_count and hit_set_period define how much time each HitSet
+should cover, and how many such HitSets to store.  Binning accesses
+over time allows Ceph to independently determine whether an object was
+accessed at least once and whether it was accessed more than once over
+some time period ("age" vs "temperature").
+
+The ``min_read_recency_for_promote`` defines how many HitSets to check for the
+existence of an object when handling a read operation. The checking result is
+used to decide whether to promote the object asynchronously. Its value should be
+between 0 and ``hit_set_count``. If it's set to 0, the object is always promoted.
+If it's set to 1, the current HitSet is checked. And if this object is in the
+current HitSet, it's promoted. Otherwise not. For the other values, the exact
+number of archive HitSets are checked. The object is promoted if the object is
+found in any of the most recent ``min_read_recency_for_promote`` HitSets.
+
+A similar parameter can be set for the write operation, which is
+``min_write_recency_for_promote``. ::
+
+ ceph osd pool set {cachepool} min_read_recency_for_promote 1
+ ceph osd pool set {cachepool} min_write_recency_for_promote 1
+
+Note that the longer the ``hit_set_period`` and the higher the
+``min_read_recency_for_promote``/``min_write_recency_for_promote`` the more RAM
+will be consumed by the ceph-osd process. In particular, when the agent is active
+to flush or evict cache objects, all hit_set_count HitSets are loaded into RAM.
+
+Cache mode
+~~~~~~~~~~
+
+The most important policy is the cache mode:
+
+ ceph osd pool set foo-hot cache-mode writeback
+
+The supported modes are 'none', 'writeback', 'forward', and
+'readonly'.  Most installations want 'writeback', which will write
+into the cache tier and only later flush updates back to the base
+tier.  Similarly, any object that is read will be promoted into the
+cache tier.
+
+The 'forward' mode is intended for when the cache is being disabled
+and needs to be drained.  No new objects will be promoted or written
+to the cache pool unless they are already present.  A background
+operation can then do something like::
+
+  rados -p foo-hot cache-try-flush-evict-all
+  rados -p foo-hot cache-flush-evict-all
+
+to force all data to be flushed back to the base tier.
+
+The 'readonly' mode is intended for read-only workloads that do not
+require consistency to be enforced by the storage system.  Writes will
+be forwarded to the base tier, but objects that are read will get
+promoted to the cache.  No attempt is made by Ceph to ensure that the
+contents of the cache tier(s) are consistent in the presence of object
+updates.
+
+Cache sizing
+~~~~~~~~~~~~
+
+The agent performs two basic functions: flushing (writing 'dirty'
+cache objects back to the base tier) and evicting (removing cold and
+clean objects from the cache).
+
+The thresholds at which Ceph will flush or evict objects is specified
+relative to a 'target size' of the pool.  For example::
+
+ ceph osd pool set foo-hot cache_target_dirty_ratio .4
+ ceph osd pool set foo-hot cache_target_dirty_high_ratio .6
+ ceph osd pool set foo-hot cache_target_full_ratio .8
+
+will begin flushing dirty objects when 40% of the pool is dirty and begin
+evicting clean objects when we reach 80% of the target size.
+
+The target size can be specified either in terms of objects or bytes::
+
+ ceph osd pool set foo-hot target_max_bytes 1000000000000  # 1 TB
+ ceph osd pool set foo-hot target_max_objects 1000000       # 1 million objects
+
+Note that if both limits are specified, Ceph will begin flushing or
+evicting when either threshold is triggered.
+
+Other tunables
+~~~~~~~~~~~~~~
+
+You can specify a minimum object age before a recently updated object is
+flushed to the base tier::
+
+ ceph osd pool set foo-hot cache_min_flush_age 600   # 10 minutes
+
+You can specify the minimum age of an object before it will be evicted from
+the cache tier::
+
+ ceph osd pool set foo-hot cache_min_evict_age 1800   # 30 minutes
+
+
+
diff --git a/doc/dev/cephx_protocol.rst b/doc/dev/cephx_protocol.rst
new file mode 100644
index 0000000..c514b38
--- /dev/null
+++ b/doc/dev/cephx_protocol.rst
@@ -0,0 +1,335 @@
+============================================================
+A Detailed Description of the Cephx Authentication Protocol
+============================================================
+Peter Reiher
+7/13/12
+
+This document provides deeper detail on the Cephx authorization protocol whose high level flow 
+is described in the memo by Yehuda (12/19/09).  Because this memo discusses details of 
+routines called and variables used, it represents a snapshot.  The code might be changed 
+subsequent to the creation of this document, and the document is not likely to be updated in
+lockstep.  With luck, code comments will indicate major changes in the way the protocol is
+implemented.
+
+Introduction
+-------------
+
+The basic idea of the protocol is based on Kerberos.  A client wishes to obtain something from 
+a server.  The server will only offer the requested service to authorized clients.  Rather 
+than requiring each server to deal with authentication and authorization issues, the system 
+uses an authorization server.  Thus, the client must first communicate with the authorization 
+server to authenticate itself and to obtain credentials that will grant it access to the
+service it wants.
+
+Authorization is not the same as authentication.  Authentication provides evidence that some 
+party is who it claims to be.  Authorization provides evidence that a particular party is
+allowed to do something.  Generally, secure authorization implies secure authentication 
+(since without authentication, you may authorize something for an imposter), but the reverse 
+is not necessarily true.  One can authenticate without authorizing.  The purpose 
+of this protocol is to authorize.
+
+The basic approach is to use symmetric cryptography throughout.  Each client C has its own
+secret key, known only to itself and the authorization server A.  Each server S has its own
+secret key, known only to itself and the authorization server A.  Authorization information 
+will be passed in tickets, encrypted with the secret key of the entity that offers the service.
+There will be a ticket that A gives to C, which permits C to ask A for other tickets.  This 
+ticket will be encrypted with A's key, since A is the one who needs to check it.  There will 
+later be tickets that A issues that allow C to communicate with S to ask for service.  These 
+tickets will be encrypted with S's key, since S needs to check them.   Since we wish to provide 
+security of the communications, as well, session keys are set up along with the tickets.  
+Currently, those session keys are only used for authentication purposes during this protocol 
+and the handshake between the client C and the server S, when the client provides its service 
+ticket.  They could be used for authentication or secrecy throughout, with some changes to 
+the system.
+
+Several parties need to prove something to each other if this protocol is to achieve its 
+desired security effects.
+
+1.  The client C must prove to the authenticator A that it really is C.  Since everything
+is being done via messages, the client must also prove that the message proving authenticity
+is fresh, and is not being replayed by an attacker.
+
+2.  The authenticator A must prove to client C that it really is the authenticator.  Again,
+proof that replay is not occurring is also required.
+
+3.  A and C must securely share a session key to be used for distribution of later
+authorization material between them.  Again, no replay is allowable, and the key must be
+known only to A and C.
+
+4.  A must receive evidence from C that allows A to look up C's authorized operations with
+server S.  
+
+5.  C must receive a ticket from A that will prove to S that C can perform its authorized
+operations.   This ticket must be usable only by C.
+
+6.  C must receive from A a session key to protect the communications between C and S.  The
+session key must be fresh and not the result of a replay.
+
+Getting Started With Authorization
+-----------------------------------
+
+When the client first needs to get service, it contacts the monitor.  At the moment, it has 
+no tickets.  Therefore, it uses the "unknown" protocol to talk to the monitor.  This protocol 
+is specified as ``CEPH_AUTH_UNKNOWN``.  The monitor also takes on the authentication server 
+role, A.  The remainder of the communications will use the cephx protocol (most of whose code 
+will be found in files in ``auth/cephx``).  This protocol is responsible for creating and 
+communicating the tickets spoken of above.  
+
+Currently, this document does not follow the pre-cephx protocol flow.  It starts up at the 
+point where the client has contacted the server and is ready to start the cephx protocol itself.
+
+Once we are in the cephx protocol, we can get the tickets.  First, C needs a ticket that 
+allows secure communications with A.  This ticket can then be used to obtain other tickets. 
+This is phase I of the protocol, and consists of a send from C to A and a response from A to C.
+Then, C needs a ticket to allow it to talk to S to get services.  This is phase II of the 
+protocol, and consists of a send from C to A and a response from A to C.
+
+Phase I:
+--------
+
+The client is set up to know that it needs certain things, using a variable called ``need``, 
+which is part of the ``AuthClientHandler`` class, which the ``CephxClientHandler`` inherits 
+from.  At this point, one thing that's encoded in the ``need`` variable is 
+``CEPH_ENTITY_TYPE_AUTH``, indicating that we need to start the authentication protocol 
+from scratch.  Since we're always talking to the same authorization server, if we've gone 
+through this step of the protocol before (and the resulting ticket/session hasn't timed out), 
+we can skip this step and just ask for client tickets.  But it must be done initially, and 
+we'll assume that we are in that state.
+
+The message C sends to A in phase I is build in ``CephxClientHandler::build_request()`` (in 
+``auth/cephx/CephxClientHandler.cc``).  This routine is used for more than one purpose.  
+In this case, we first call ``validate_tickets()`` (from routine 
+``CephXTicektManager::validate_tickets()`` which lives in ``auth/cephx/CephxProtocol.h``).  
+This code runs through the list of possible tickets to determine what we need, setting values 
+in the ``need`` flag as necessary.  Then we call ``ticket.get_handler()``.  This routine 
+(in ``CephxProtocol.h``) finds a ticket of the specified type (a ticket to perform 
+authorization) in the ticket map, creates a ticket handler object for it,  and puts the 
+handler into the right place in the map.  Then we hit specialized code to deal with individual 
+cases.  The case here is when we still need to authenticate to A (the 
+``if (need & CEPH_ENTITY_TYPE_AUTH)`` branch).
+
+We now create a message of type ``CEPH_AUTH_UNKNOWN``.  We need to authenticate 
+this message with C's secret key, so we fetch that from the local key repository.  (It's 
+called a key server in the code, but it's not really a separate machine or processing entity.
+It's more like the place where locally used keys are kept.)  We create a 
+random challenge, whose purpose is to prevent replays.  We encrypt that challenge.  We already 
+have a server challenge (a similar set of random bytes, but created by the server and sent to
+the client) from our pre-cephx stage.  We take both challenges and our secret key and 
+produce a combined encrypted challenge value, which goes into ``req.key``.
+
+If we have an old ticket, we store it in ``req.old_ticket``.  We're about to get a new one.
+
+The entire ``req`` structure, including the old ticket and the cryptographic hash of the two 
+challenges, gets put into the message.  Then we return from this function, and the 
+message is sent.
+
+We now switch over to the authenticator side, A.  The server receives the message that was 
+sent, of type ``CEPH_AUTH_UNKNOWN``.  The message gets handled in ``prep_auth()``, 
+in ``mon/AuthMonitor.cc``, which calls ``handle_request()`` is ``CephxServiceHandler.cc`` to 
+do most of the work.  This routine, also, handles multiple cases.  
+
+The control flow is determined by the ``request_type`` in the ``cephx_header`` associated 
+with the message.  Our case here is ``CEPH_AUTH_UNKNOWN``.  We need the 
+secret key A shares with C, so we call ``get_secret()`` from out local key repository to get 
+it.  We should have set up a server challenge already with this client, so we make sure 
+we really do have one.  (This variable is specific to a ``CephxServiceHandler``, so there 
+is a different one for each such structure we create, presumably one per client A is 
+dealing with.)  If there is no challenge, we'll need to start over, since we need to 
+check the client's crypto hash, which depends on a server challenge, in part.
+
+We now call the same routine the client used to calculate the hash, based on the same values: 
+the client challenge (which is in the incoming message), the server challenge (which we saved), 
+and the client's key (which we just obtained).  We check to see if the client sent the same 
+thing we expected.  If so, we know we're talking to the right client.  We know the session is 
+fresh, because it used the challenge we sent it to calculate its crypto hash.  So we can
+give it an authentication ticket.
+
+We fetch C's ``eauth`` structure.  This contains an ID, a key, and a set of caps (capabilities).
+
+The client sent us its old ticket in the message, if it had one.  If so, we set a flag,
+``should_enc_ticket``, to true and set the global ID to the global ID in that old ticket.  
+If the attempt to decode its old ticket fails (most probably because it didn't have one),
+``should_enc_ticket`` remains false.  Now we set up the new ticket, filling in timestamps, 
+the name of C, the global ID provided in the method call (unless there was an old ticket), and 
+his ``auid``, obtained from the ``eauth`` structure obtained above.  We need a new session key 
+to help the client communicate securely with us, not using its permanent key.    We set the
+service ID to ``CEPH_ENTITY_TYPE_AUTH``, which will tell the client C what to do with the 
+message we send it.  We build a cephx response header and call 
+``cephx_build_service_ticket_reply()``.
+
+``cephx_build_service_ticket_reply()`` is in ``auth/cephx/CephxProtocol.cc``.  This 
+routine will build up the response message.   Much of it copies data from its parameters to 
+a message structure.  Part of that information (the session key and the validity period) 
+gets encrypted with C's permanent key.  If the ``should_encrypt_ticket`` flag is set, 
+encrypt it using the old ticket's key.  Otherwise, there was no old ticket key, so the 
+new ticket is not encrypted.  (It is, of course, already encrypted with A's permanent key.)  
+Presumably the point of this second encryption is to expose less material encrypted with 
+permanent keys.
+
+Then we call the key server's ``get_service_caps()`` routine on the entity name, with a 
+flag ``CEPH_ENTITY_TYPE_MON``, and capabilities, which will be filled in by this routine.  
+The use of that constant flag means we're going to get the client's caps for A, not for some 
+other data server.  The ticket here is to access the authorizer A, not the service S.  The 
+result of this call is that the caps variable  (a parameter to the routine we're in) is 
+filled in with the monitor capabilities that will allow C to  access A's authorization services.
+
+``handle_request()`` itself does not send the response message.  It builds up the 
+``result_bl``, which basically holds that message's contents, and the capabilities structure, 
+but it doesn't send the message.  We go back to ``prep_auth()``, in ``mon/AuthMonitor.cc``, 
+for that.    This routine does some fiddling around with the caps structure that just got 
+filled in.  There's a global ID that comes up as a result of this fiddling that is put into 
+the reply message.  The reply message is built here (mostly from the ``response_bl`` buffer) 
+and sent off.
+
+This completes Phase I of the protocol.  At this point, C has authenticated itself to A, and A has generated a new session key and ticket allowing C to obtain server tickets from A.
+
+Phase II
+--------
+
+This phase starts when C receives the message from A containing a new ticket and session key.
+The goal of this phase is to provide A with a session key and ticket allowing it to
+communicate with S.
+
+The message A sent to C is dispatched to ``build_request()`` in ``CephxClientHandler.cc``, 
+the same routine that was used early in Phase I to build the first message in the protocol.  
+This time, when ``validate_tickets()`` is called, the ``need`` variable will not contain 
+``CEPH_ENTITY_TYPE_AUTH``, so a different branch through the bulk of the routine will be 
+used.  This is the branch indicated by ``if (need)``.  We have a ticket for the authorizer, 
+but we still need service tickets.
+
+We must send another message to A to obtain the tickets (and session key) for the server 
+S.  We set the ``request_type`` of the message to ``CEPHX_GET_PRINCIPAL_SESSION_KEY`` and 
+call ``ticket_handler.build_authorizer()`` to obtain an authorizer.  This routine is in 
+``CephxProtocol.cc``.  We set the key for this authorizer to be the session key we just got 
+from A,and create a new nonce.  We put the global ID, the service ID, and the ticket into a 
+message buffer that is part of the authorizer.  Then we create a new ``CephXAuthorize`` 
+structure.  The nonce we just created goes there.  We encrypt this ``CephXAuthorize`` 
+structure with the current session key and stuff it into the authorizer's buffer.  We 
+return the authorizer.
+
+Back in ``build_request()``, we take the part of the authorizer that was just built (its 
+buffer, not the session key or anything else) and shove it into the buffer we're creating 
+for the message that will go to A.  Then we delete the authorizer.  We put the requirements 
+for what we want in ``req.keys``, and we put ``req`` into the buffer.  Then we return, and 
+the message gets sent.
+
+The authorizer A receives this message which is of type ``CEPHX_GET_PRINCIPAL_SESSION_KEY``.
+The message gets handled in ``prep_auth()``, in ``mon/AuthMonitor.cc``, which again calls 
+``handle_request()`` in ``CephxServiceHandler.cc`` to do most of the work.  
+
+In this case, ``handle_request()`` will take the ``CEPHX_GET_PRINCIPAL_SESSION_KEY`` case. 
+It will call ``cephx_verify_authorizer()`` in ``CephxProtocol.cc``.  Here, we will grab 
+a bunch of data out of the input buffer, including the global and service IDs and the ticket 
+for A.   The ticket contains a ``secret_id``, indicating which key is being used for it.     
+If the secret ID pulled out of the ticket was -1, the ticket does not specify which secret 
+key A should use.  In this case, A should use the key for the specific entity that C wants
+to contact, rather than a rotating key shared by all server entities of the same type.
+To get that key, A must consult the key repository to find the right key.   Otherwise, 
+there's already a structure obtained from the key repository to hold the necessary secret.  
+Server secrets rotate on a time expiration basis (key rotation is not covered in this
+document), so run through that structure to find its current secret.  Either way, A now 
+knows the secret key used to create this ticket.  Now decrypt the encrypted part of the 
+ticket, using this key.  It should be a ticket for A.  
+
+The ticket also contains a session key that C should have used to encrypt other parts of 
+this message.  Use that session key to decrypt the rest of the message.  
+
+Create a ``CephXAuthorizeReply`` to hold our reply.  Extract the nonce (which was in the stuff 
+we just decrypted), add 1 to it, and put the result in the reply.  Encrypt the reply and 
+put it in the buffer provided in the call to ``cephx_verify_authorizer()`` and return 
+to ``handle`_request()``.  This will be used to prove to C that A (rather than an attacker) 
+created this response.
+
+Having verified that the message is valid and from C, now we need to build it a ticket for S.
+We need to know what S it wants to communicate with and what services it wants.  Pull the
+ticket request that describes those things out of its message.  Now run through the ticket
+request to see what it wanted.  (He could potentially be asking for multiple different
+services in the same request, but we will assume it's just one, for this discussion.)  Once we 
+know which service ID it's after, call ``build_session_auth_info()``.
+
+``build_session_auth_info()`` is in ``CephxKeyServer.cc``.  It checks to see if the 
+secret for the ``service_ID`` of S is available and puts it into the subfield of one of 
+the parameters, and calls the similarly named ``_build_session_auth_info()``, located in 
+the same file.      This routine loads up the new ``auth_info`` structure with the 
+ID of S, a ticket, and some timestamps for that ticket.  It generates a new session key 
+and puts it in the structure.   It then calls ``get_caps()`` to fill in the 
+``info.ticket`` caps field.  ``get_caps()`` is also in ``CephxKeyServer.cc``.  It fills the 
+``caps_info`` structure it is provided with caps for S allowed to C.
+
+Once ``build_session_auth_info()`` returns, A has a list of the capabilities allowed to 
+C for S.  We put a validity period based on the current TTL for this context into the info 
+structure, and put it into the ``info_vec`` structure we are preparing in response to the 
+message.  
+
+Now call ``build_cephx_response_header()``, also in ``CephxServiceHandler.cc``.   Fill in 
+the ``request_type``, which is ``CEPHX_GET_PRINCIPAL_SESSION_KEY``, a status of 0, 
+and the result buffer.  
+
+Now call ``cephx_build_service_ticket_reply()``, which is in ``CephxProtocol.cc``.  The 
+same routine was used towards the end of A's handling of its response in phase I.  Here, 
+the session key (now a session key to talk to S, not A) and the validity period for that 
+key will be encrypted with the existing session key shared between C and A.  
+The ``should_encrypt_ticket`` parameter is false here, and no key is provided for that 
+encryption.  The ticket in question, destined for S once C sends it there, is already 
+encrypted with S's secret.  So, essentially, this routine will put ID information, 
+the encrypted session key, and the ticket allowing C to talk to S into the buffer to 
+be sent to C.
+
+After this routine returns, we exit from ``handle_request()``, going back to ``prep_auth()`` 
+and ultimately to the underlying message send code.  
+
+The client receives this message. The nonce is checked as the message passes through
+``Pipe::connect()``, which is in ``msg/SimpleMessager.cc``.  In a lengthy ``while(1)`` loop in
+the middle of this routine, it gets an authorizer.  If the get was successful, eventually
+it will call ``verify_reply()``, which checks the nonce.  ``connect()`` never explicitly
+checks to see if it got an authorizer, which would suggest that failure to provide an
+authorizer would allow an attacker to skip checking of the nonce.  However, in many places,
+if there is no authorizer, important connection fields will get set to zero, which will
+ultimately cause the connection to fail to provide data.  It would be worth testing, but
+it looks like failure to provide an authorizer, which contains the nonce, would not be helpful
+to an attacker.
+
+The message eventually makes its way through to ``handle_response()``, in 
+``CephxClientHandler.cc``.    In this routine, we call ``get_handler()`` to get a ticket 
+handler to hold the ticket we have just received.  This routine is embedded in the definition 
+for a ``CephXTicketManager`` structure.  It takes a type (``CEPH_ENTITY_TYPE_AUTH``, in 
+this case) and looks through the ``tickets_map`` to find that type.  There should be one, and 
+it should have the session key of the session between C and A in its entry.  This key will 
+be used to decrypt the information provided by A, particularly the new session key allowing 
+C to talk to S.
+
+We then call ``verify_service_ticket_reply()``, in ``CephxProtocol.cc``.  This routine 
+needs to determine if the ticket is OK and also obtain the session key associated with this 
+ticket.  It decrypts the encrypted portion of the message buffer, using the session key 
+shared with A.  This ticket was not encrypted (well, not twice - tickets are always encrypted, 
+but sometimes double encrypted, which this one isn't).  So it can be stored in a service 
+ticket buffer directly.  We now grab the ticket out of that buffer.  
+
+The stuff we decrypted with the session key shared between C and A included the new session 
+key.  That's our current session key for this ticket, so set it.  Check validity and 
+set the expiration times.  Now return true, if we got this far.  
+
+Back in ``handle_response()``, we now call ``validate_tickets()`` to adjust what we think 
+we need, since we now have a ticket we didn't have before.  If we've taken care of 
+everything we need, we'll return 0.
+
+This ends phase II of the protocol.  We have now successfully set up a ticket and session key 
+for client C to talk to server S.  S will know that C is who it claims to be, since A will
+verify it.  C will know it is S it's talking to, again because A verified it.  The only
+copies of the session key for C and S to communicate were sent encrypted under the permanent
+keys of C and S, respectively, so no other party (excepting A, who is trusted by all) knows
+that session key.  The ticket will securely indicate to S what C is allowed to do, attested 
+to by A.  The nonces passed back and forth between A and C ensure that they have not been 
+subject to a replay attack.  C has not yet actually talked to S, but it is ready to.
+
+Much of the security here falls apart if one of the permanent keys is compromised.  Compromise
+of C's key means that the attacker can pose as C and obtain all of C's privileges, and can
+eavesdrop on C's legitimate conversations.  He can also pretend to be A, but only in 
+conversations with C.  Since it does not (by hypothesis) have keys for any services, he
+cannot generate any new tickets for services, though it can replay old tickets and session
+keys until S's permanent key is changed or the old tickets time out. 
+
+Compromise of S's key means that the attacker can pose as S to anyone, and can eavesdrop on 
+any user's conversation with S.  Unless some client's key is also compromised, the attacker
+cannot generate new fake client tickets for S, since doing so requires it to authenticate
+himself as A, using the client key it doesn't know.
diff --git a/doc/dev/config.rst b/doc/dev/config.rst
new file mode 100644
index 0000000..298dcaa
--- /dev/null
+++ b/doc/dev/config.rst
@@ -0,0 +1,90 @@
+=================================
+ Configuration Management System
+=================================
+
+The configuration management system exists to provide every daemon with the
+proper configuration information. The configuration can be viewed as a set of
+key-value pairs.
+
+How can the configuration be set? Well, there are several sources:
+ - the ceph configuration file, usually named ceph.conf
+ - command line arguments::
+    --debug-ms=1
+    --debug-pg=10
+    etc.
+ - arguments injected at runtime by using injectargs
+
+
+The Configuration File
+======================
+
+Most configuration settings originate in the Ceph configuration file.
+
+How do we find the configuration file? Well, in order, we check:
+ - the default locations
+ - the environment variable CEPH_CONF
+ - the command line argument -c
+
+Each stanza of the configuration file describes the key-value pairs that will be in
+effect for a particular subset of the daemons. The "global" stanza applies to
+everything. The "mon", "osd", and "mds" stanzas specify settings to take effect
+for all monitors, all OSDs, and all mds servers, respectively.  A stanza of the
+form mon.$name, osd.$name, or mds.$name gives settings for the monitor, OSD, or
+MDS of that name, respectively. Configuration values that appear later in the
+file win over earlier ones.
+
+A sample configuration file can be found in src/sample.ceph.conf.
+
+
+Metavariables
+=============
+
+The configuration system allows any configuration value to be
+substituted into another value using the ``$varname`` syntax, similar
+to how bash shell expansion works.
+
+A few additional special metavariables are also defined:
+ - $host: expands to the current hostname
+ - $type: expands to one of "mds", "osd", "mon", or "client"
+ - $id: expands to the daemon identifier. For ``osd.0``, this would be ``0``; for ``mds.a``, it would be ``a``; for ``client.admin``, it would be ``admin``.
+ - $num: same as $id
+ - $name: expands to $type.$id
+
+
+Reading configuration values
+====================================================
+
+There are two ways for Ceph code to get configuration values. One way is to
+read it directly from a variable named "g_conf," or equivalently,
+"g_ceph_ctx->_conf." The other is to register an observer that will be called
+every time the relevant configuration values changes.  This observer will be
+called soon after the initial configuration is read, and every time after that
+when one of the relevant values changes. Each observer tracks a set of keys
+and is invoked only when one of the relevant keys changes.
+
+The interface to implement is found in common/config_obs.h.
+
+The observer method should be preferred in new code because
+ - It is more flexible, allowing the code to do whatever reinitialization needs
+   to be done to implement the new configuration value.
+ - It is the only way to create a std::string configuration variable that can
+   be changed by injectargs.
+ - Even for int-valued configuration options, changing the values in one thread
+   while another thread is reading them can lead to subtle and
+   impossible-to-diagnose bugs.
+
+For these reasons, reading directly from g_conf should be considered deprecated
+and not done in new code.  Do not ever alter g_conf.
+
+Changing configuration values
+====================================================
+
+Configuration values can be changed by calling g_conf->set_val. After changing
+the configuration, you should call g_conf->apply_changes to re-run all the
+affected configuration observers. For convenience, you can call
+g_conf->set_val_or_die to make a configuration change which you think should
+never fail.
+
+Injectargs, parse_argv, and parse_env are three other functions which modify
+the configuration. Just like with set_val, you should call apply_changes after
+calling these functions to make sure your changes get applied.
diff --git a/doc/dev/confusing.txt b/doc/dev/confusing.txt
new file mode 100644
index 0000000..a860c25
--- /dev/null
+++ b/doc/dev/confusing.txt
@@ -0,0 +1,36 @@
+About this Document
+This document contains procedures for a new customer to configure a Ceph System.  
+Before You Begin
+Before you begin configuring your system for Ceph, use the following checklist to decide what type of system you need.
+1.	Identify the amount of storage that you need based on your current data, network traffic, workload, and other parameters
+2.	Identify the growth potential for your business so that you can project ahead for future storage needs.
+3.	Plan ahead for redundancy and replacement options.
+4.	Study market forecasts and how they affect your business. 
+Preparing a Ceph Cluster
+A Ceph cluster consists of the following core components:
+1.	Monitors � These must be an odd number, such as one, three, or five.  Three is the preferred configuration.
+2.	Object Storage Devices (OSD) � used as storage nodes
+3.	Metadata Servers (MDS)
+Although Ceph is extremely scalable, and nodes can be added any time on an as-needed basis, it is important to first determine the base needs of your configuration prior to setting up your system.  This will save time and money in the long run. The following table offers a guideline on how many components your business should obtain prior to configuring your Ceph Cluster.  
+Size/Workload	Monitors	OSD	MDS	Bandwidth
+Small/low	1	10	0-1	???
+Small/average	3	23	1-3	???
+Small/high	3 or more	30	3-5	???
+Medium/low	3	20	1	???
+Medium/average	3	30	1-3	???
+Medium/high	3 or more	1000	3-5	???
+Large/low	3	30	1	???
+Large/average	3 or more	50	1-3	???
+Large/high	3 or more	2000	3-10	???
+ Warning:  If you are using a low bandwidth system, and are connecting to the cluster over the internet, you must use the librados object level interface, and your OSDs must be located in the same data center.
+Sample Configuration
+The figure below shows a sample Ceph Configuration.  
+img cephconfig.jpg
+ 
+Related Documentation
+Once you have determined your configuration needs, make sure you have access to the following documents:
+�	Ceph Installation and Configuration Guide
+�	Ceph System Administration Guide
+�	Ceph Troubleshooting Manual
+
+
diff --git a/doc/dev/context.rst b/doc/dev/context.rst
new file mode 100644
index 0000000..1a2b2cb
--- /dev/null
+++ b/doc/dev/context.rst
@@ -0,0 +1,20 @@
+=============
+ CephContext
+=============
+
+A CephContext represents a single view of the Ceph cluster. It comes complete
+with a configuration, a set of performance counters (PerfCounters), and a
+heartbeat map. You can find more information about CephContext in
+src/common/ceph_context.h.
+
+Generally, you will have only one CephContext in your application, called
+g_ceph_context. However, in library code, it is possible that the library user
+will initialize multiple CephContexts. For example, this would happen if he
+called rados_create more than once.
+
+A ceph context is required to issue log messages. Why is this? Well, without
+the CephContext, we would not know which log messages were disabled and which
+were enabled.  The dout() macro implicitly references g_ceph_context, so it
+can't be used in library code.  It is fine to use dout and derr in daemons, but
+in library code, you must use ldout and lderr, and pass in your own CephContext
+object. The compiler will enforce this restriction.
diff --git a/doc/dev/corpus.rst b/doc/dev/corpus.rst
new file mode 100644
index 0000000..76fa43d
--- /dev/null
+++ b/doc/dev/corpus.rst
@@ -0,0 +1,95 @@
+
+Corpus structure
+================
+
+ceph.git/ceph-object-corpus is a submodule.::
+
+ bin/   # misc scripts
+ archive/$version/objects/$type/$hash  # a sample of encoded objects from a specific version
+
+You can also mark known or deliberate incompatibilities between versions with::
+
+ archive/$version/forward_incompat/$type
+
+The presence of a file indicates that new versions of code cannot
+decode old objects across that $version (this is normally the case).
+
+
+How to generate an object corpus
+--------------------------------
+
+We can generate an object corpus for a particular version of ceph like so.
+
+#. Checkout a clean repo (best not to do this where you normally work)::
+
+	git clone ceph.git
+	cd ceph
+	git submodule update --init --recursive
+
+#. Build with flag to dump objects to /tmp/foo::
+
+	rm -rf /tmp/foo ; mkdir /tmp/foo
+	./do_autogen.sh -e /tmp/foo
+	make
+
+#. Start via vstart::
+
+	cd src
+	MON=3 OSD=3 MDS=3 RGW=1 ./vstart.sh -n -x
+
+#. Use as much functionality of the cluster as you can, to exercise as many object encoder methods as possible::
+
+	./rados -p rbd bench 10 write -b 123
+	./ceph osd out 0
+	./init-ceph stop osd.1
+	for f in ../qa/workunits/cls/*.sh ; do PATH=".:$PATH" $f ; done
+	../qa/workunits/rados/test.sh
+	./ceph_test_librbd
+	./ceph_test_libcephfs
+	./init-ceph restart mds.a
+
+Do some more stuff with rgw if you know how.
+
+#. Stop::
+
+	./stop.sh
+
+#. Import the corpus (this will take a few minutes)::
+
+	test/encoding/import.sh /tmp/foo `./ceph-dencoder version` ../ceph-object-corpus/archive
+	test/encoding/import-generated.sh ../ceph-object-corpus/archive
+
+#. Prune it!  There will be a bazillion copies of various objects, and we only want a representative sample.::
+
+	pushd ../ceph-object-corpus
+	bin/prune-archive.sh
+	popd
+
+#. Verify the tests pass::
+
+	make check-local
+
+#. Commit it to the corpus repo and push::
+
+	pushd ../ceph-object-corpus
+	git checkout -b wip-new
+	git add archive/`../src/ceph-dencoder version`
+	git commit -m `../src/ceph-dencoder version`
+	git remote add cc ceph.com:/git/ceph-object-corpus.git
+	git push cc wip-new
+	popd
+
+#. Go test it out::
+
+	cd my/regular/tree
+	cd ceph-object-corpus
+	git fetch origin
+	git checkout wip-new
+	cd ../src
+	make check-local
+
+#. If everything looks good, update the submodule master branch, and commit the submodule in ceph.git.
+
+
+
+
diff --git a/doc/dev/cpu-profiler.rst b/doc/dev/cpu-profiler.rst
new file mode 100644
index 0000000..d7a77fe
--- /dev/null
+++ b/doc/dev/cpu-profiler.rst
@@ -0,0 +1,54 @@
+=====================
+ Installing Oprofile
+=====================
+
+The easiest way to profile Ceph's CPU consumption is to use the `oprofile`_
+system-wide profiler.
+
+.. _oprofile: http://oprofile.sourceforge.net/about/
+
+Installation
+============
+
+If you are using a Debian/Ubuntu distribution, you can install ``oprofile`` by
+executing the following::
+
+	sudo apt-get install oprofile oprofile-gui
+	
+
+Compiling Ceph for Profiling
+============================
+
+To compile Ceph for profiling, first clean everything. :: 
+
+	make distclean
+	
+Then, export the following settings so that you can see callgraph output. :: 
+
+	export CFLAGS="-fno=omit-frame-pointer -O2 -g"
+
+Finally, compile Ceph. :: 
+
+	./autogen.sh
+	./configure
+	make
+
+You can use ``make -j`` to execute multiple jobs depending upon your system. For
+example::
+
+	make -j4
+
+
+Ceph Configuration 
+==================
+
+Ensure that you disable ``lockdep``. Consider setting logging to 
+levels appropriate for a production cluster. See `Ceph Logging and Debugging`_ 
+for details.
+
+.. _Ceph Logging and Debugging: ../../rados/troubleshooting/log-and-debug
+
+See the `CPU Profiling`_ section of the RADOS Troubleshooting documentation for details on using Oprofile.
+
+
+.. _CPU Profiling: ../../rados/troubleshooting/cpu-profiling
\ No newline at end of file
diff --git a/doc/dev/delayed-delete.rst b/doc/dev/delayed-delete.rst
new file mode 100644
index 0000000..bf5f65a
--- /dev/null
+++ b/doc/dev/delayed-delete.rst
@@ -0,0 +1,12 @@
+=========================
+ CephFS delayed deletion
+=========================
+
+When you delete a file, the data is not immediately removed. Each
+object in the file needs to be removed independently, and sending
+``size_of_file / stripe_size * replication_count`` messages would slow
+the client down too much, and use a too much of the clients
+bandwidth. Additionally, snapshots may mean some objects should not be
+deleted.
+
+Instead, the file is marked as deleted on the MDS, and deleted lazily.
diff --git a/doc/dev/dev_cluster_deployement.rst b/doc/dev/dev_cluster_deployement.rst
new file mode 100644
index 0000000..2dd232f
--- /dev/null
+++ b/doc/dev/dev_cluster_deployement.rst
@@ -0,0 +1,129 @@
+=================================
+ Deploying a development cluster
+=================================
+
+In order to develop on ceph, a Ceph utility,
+*vstart.sh*, allows you to deploy fake local cluster for development purpose.
+
+Usage
+=====
+
+It allows to deploy a fake local cluster on your machine for development purpose. It starts rgw, mon, osd and/or mds, or all of them if not specified.
+
+To start your development cluster, type the following::
+
+	vstart.sh [OPTIONS]... [mon] [osd] [mds]
+
+In order to stop the cluster, you can type::
+
+	./stop.sh
+
+Options
+=======
+
+.. option:: -i ip_address
+
+    Bind to the specified *ip_address* instead of guessing and resolve from hostname.
+
+.. option:: -k
+
+    Keep old configuration files instead of overwritting theses.
+
+.. option:: -l, --localhost
+
+    Use localhost instead of hostanme.
+
+.. option:: -m ip[:port]
+
+    Specifies monitor *ip* address and *port*.
+
+.. option:: -n, --new
+
+    Create a new cluster.
+
+.. option:: -o config
+
+    Add *config* to all sections in the ceph configuration.
+
+.. option:: -r
+
+    Start radosgw (ceph needs to be compiled with --radosgw), create an apache2 configuration file, and start apache2 with it (needs apache2 with mod_fastcgi) on port starting from 8000.
+
+.. option:: --nodaemon
+
+    Use ceph-run as wrapper for mon/osd/mds.
+
+.. option:: --smallmds
+
+    Configure mds with small limit cache size.
+
+.. option:: -x
+
+    Enable Cephx (on by default).
+
+.. option:: -X
+
+    Disable Cephx.
+
+.. option:: -d, --debug
+
+    Launch in debug mode
+
+.. option:: --valgrind[_{osd,mds,mon}] 'valgrind_toolname [args...]'
+
+    Launch the osd/mds/mon/all the ceph binaries using valgrind with the specified tool and arguments.
+
+.. option:: --{mon,osd,mds}_num
+
+    Set the count of mon/osd/mds daemons
+
+.. option:: --bluestore
+
+    Use bluestore as the objectstore backend for osds
+
+.. option:: --memstore
+
+    Use memstore as the objectstore backend for osds
+
+.. option:: --cache <pool>
+
+    Set a cache-tier for the specified pool
+
+
+Environment variables
+=====================
+
+{OSD,MDS,MON,RGW}
+
+Theses environment variables will contains the number of instances of the desired ceph process you want to start.
+
+Example: ::
+
+	OSD=3 MON=3 RGW=1 vstart.sh
+
+
+============================================================
+ Deploying multiple development clusters on the same machine
+============================================================
+
+In order to bring up multiple ceph clusters on the same machine, *mstart.sh* a
+small wrapper around the above *vstart* can help.
+
+Usage
+=====
+
+To start multiple clusters, you would run mstart for each cluster you would want
+to deploy, and it will start monitors, rgws for each cluster on different ports
+allowing you to run multiple mons, rgws etc. on the same cluster. Invoke it in
+the following way::
+
+  mstart.sh <cluster-name> <vstart options>
+
+For eg::
+
+  ./mstart.sh cluster1 -n -r
+
+
+For stopping the cluster, you do::
+
+  ./mstop.sh <cluster-name>
diff --git a/doc/dev/development-workflow.rst b/doc/dev/development-workflow.rst
new file mode 100644
index 0000000..8da4432
--- /dev/null
+++ b/doc/dev/development-workflow.rst
@@ -0,0 +1,255 @@
+=====================
+Development workflows
+=====================
+
+This page explains the workflows a developer is expected to follow to
+implement the goals that are part of the Ceph release cycle. It does not
+go into technical details and is designed to provide a high level view
+instead. Each chapter is about a given goal such as ``Merging bug
+fixes or features`` or ``Publishing point releases and backporting``.
+
+A key aspect of all workflows is that none of them blocks another. For
+instance, a bug fix can be backported and merged to a stable branch
+while the next point release is being published. For that specific
+example to work, a branch should be created to avoid any
+interference. In practice it is not necessary for Ceph because:
+
+* there are few people involved
+* the frequency of backports is not too high
+* the reviewers, who know a release is being published, are unlikely
+  to merge anything that may cause issues
+
+This ad-hoc approach implies the workflows are changed on a regular
+basis to adapt. For instance, ``quality engineers`` were not involved
+in the workflow to publish ``dumpling`` point releases. The number of
+commits being backported to ``firefly`` made it impractical for developers
+tasked to write code or fix bugs to also run and verify the full suite
+of integration tests. Inserting ``quality engineers`` makes it
+possible for someone to participate in the workflow by analyzing test
+results.
+
+The workflows are not enforced when they impose an overhead that does
+not make sense. For instance, if the release notes for a point release
+were not written prior to checking all integration tests, they can be
+commited to the stable branch and the result sent for publication
+without going through another run of integration tests.
+
+Release Cycle
+=============
+
+::
+
+    Ceph              hammer                             infernalis
+    Developer          CDS                                  CDS 
+    Summit              |                                    |
+                        |                                    |
+    development         |                                    |
+    release             |  v0.88  v0.89  v0.90   ...         |  v9.0.0
+                   --v--^----^--v---^------^--v-     ---v----^----^---  2015       
+                     |          |             |         |
+    stable         giant        |             |      hammer
+    release        v0.87        |             |      v0.94
+                                |             |          
+    point                    firefly       dumpling
+    release                  v0.80.8       v0.67.12
+
+
+Four times a year, the development roadmap is discussed online during
+the `Ceph Developer Summit <http://wiki.ceph.com/Planning/CDS/>`_. A
+new stable release (argonaut, cuttlefish, dumpling, emperor, firefly,
+giant, hammer, infernalis ...) is published at the same frequency. 
+Every other release (dumpling, firefly, hammer, ...) is a `Long Term Stable (LTS) <../../releases>`_.
+See `Understanding the release cycle
+<../../releases#understanding-the-release-cycle>`_ for more
+information.
+
+Merging bug fixes or features
+=============================
+
+The development branch is ``master`` and the workflow followed by all
+developers can be summarized as follows:
+
+* The developer prepares a series of commits
+* The developer submits the series of commits via a pull request
+* A reviewer is assigned the pull request
+* When the pull request looks good to the reviewer, it is merged into
+  an integration branch by the tester
+* After a successful run of integration tests, the pull request is
+  merged by the tester
+
+The ``developer`` is the author of a series of commits. The
+``reviewer`` is responsible for providing feedback to the developer on
+a regular basis and the developer is invited to ping the reviewer if
+nothing happened after a week. After the ``reviewer`` is satisfied
+with the pull request, (s)he passes it to the ``tester``. The
+``tester`` is responsible for running teuthology integration tests on
+the pull request. If nothing happens within a month the ``reviewer`` is
+invited to ping the ``tester``.
+
+Resolving bug reports and implementing features
+===============================================
+
+All bug reports and feature requests are in the `issue tracker
+<http://tracker.ceph.com>`_ and the workflow can be summarized as
+follows:
+
+* The reporter creates the issue with priority ``Normal``
+* A developer may pick the issue right away
+* During a bi-weekly bug scrub, the team goes over all new issue and
+  assign them a priority
+* The bugs with higher priority are worked on first
+
+Each ``team`` is responsible for a project:
+
+* rgw lead is Yehuda Sadeh
+* CephFS lead is Gregory Farnum
+* rados lead is Samuel Just
+* rbd lead is Josh Durgin
+
+The ``developer`` assigned to an issue is responsible for it. The
+status of an open issue can be:
+
+* ``New``: it is unclear if the issue needs work.
+* ``Verified``: the bug can be reproduced or showed up multiple times
+* ``In Progress``: the developer is working on it this week
+* ``Pending Backport``: the fix needs to be backported to the stable
+  releases listed in the backport field
+
+For each ``Pending Backport`` issue, there exists at least one issue
+in the ``Backport`` tracker to record the work done to cherry pick the
+necessary commits from the master branch to the target stable branch.
+See `the backporter manual
+<http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO>`_ for more
+information.
+
+Running and interpreting teuthology integration tests
+=====================================================
+
+The :doc:`/dev/sepia` runs `teuthology
+<https://github.com/ceph/teuthology/>`_ integration tests `on a regular basis <http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO_monitor_the_automated_tests_AKA_nightlies#Automated-tests-AKA-nightlies>`_ and the
+results are posted on `pulpito <http://pulpito.ceph.com/>`_ and the
+`ceph-qa mailing list <http://ceph.com/resources/mailing-list-irc/>`_.
+
+* The job failures are `analyzed by quality engineers and developers
+  <http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO_monitor_the_automated_tests_AKA_nightlies#List-of-suites-and-watchers>`_
+* If the cause is environmental (e.g. network connectivity), an issue
+  is created in the `sepia lab project
+  <http://tracker.ceph.com/projects/lab/issues/new>`_
+* If the bug is known, a pulpito URL to the failed job is added to the issue
+* If the bug is new, an issue is created
+
+The ``quality engineer`` is either a developer or a member of the QE
+team. There is at least one integration test suite per project:
+
+* `rgw <https://github.com/ceph/ceph-qa-suite/tree/master/suites/rgw>`_ suite
+* `CephFS <https://github.com/ceph/ceph-qa-suite/tree/master/suites/fs>`_ suite
+* `rados <https://github.com/ceph/ceph-qa-suite/tree/master/suites/rados>`_ suite
+* `rbd <https://github.com/ceph/ceph-qa-suite/tree/master/suites/rbd>`_ suite
+
+and a many others such as
+
+* `upgrade <https://github.com/ceph/ceph-qa-suite/tree/master/suites/upgrade>`_ suites
+* `power-cyle <https://github.com/ceph/ceph-qa-suite/tree/master/suites/powercycle>`_ suite
+* ...
+
+Preparing a new release
+=======================
+
+A release is prepared in a dedicated branch, different from the
+``master`` branch.
+
+* For a stable releases it is the branch matching the release code
+  name (dumpling, firefly, etc.)
+* For a development release it is the ``next`` branch
+
+The workflow expected of all developers to stabilize the release
+candidate is the same as the normal development workflow with the
+following differences:
+
+* The pull requests must target the stable branch or next instead of
+  master
+* The reviewer rejects pull requests that are not bug fixes
+* The ``Backport`` issues matching a teuthology test failure and set
+  with priority ``Urgent`` must be fixed before the release
+
+Cutting a new stable release
+============================
+
+A new stable release can be cut when:
+
+* all ``Backport`` issues with priority ``Urgent`` are fixed
+* integration and upgrade tests run successfully
+
+Publishing a new stable release implies a risk of regression or
+discovering new bugs during the upgrade, no matter how carefully it is
+tested. The decision to cut a release must take this into account: it
+may not be wise to publish a stable release that only fixes a few
+minor bugs. For instance if only one commit has been backported to a
+stable release that is not a LTS, it is better to wait until there are
+more.
+
+When a stable release is to be retired, it may be safer to
+recommend an upgrade to the next LTS release instead of
+proposing a new point release to fix a problem. For instance, the
+``dumpling`` v0.67.11 release has bugs related to backfilling which have
+been fixed in ``firefly`` v0.80.x. A backport fixing these backfilling
+bugs has been tested in the draft point release ``dumpling`` v0.67.12 but
+they are large enough to introduce a risk of regression. As ``dumpling``
+is to be retired, users suffering from this bug can
+upgrade to ``firefly`` to fix it. Unless users manifest themselves and ask
+for ``dumpling`` v0.67.12, this draft release may never be published.
+
+* The ``Ceph lead`` decides a new stable release must be published
+* The ``release master`` gets approval from all leads
+* The ``release master`` writes and commits the release notes
+* The ``release master`` informs the ``quality engineer`` that the
+  branch is ready for testing
+* The ``quality engineer`` runs additional integration tests
+* If the ``quality engineer`` discovers new bugs that require an
+  ``Urgent Backport``, the release goes back to being prepared, it
+  was not ready after all
+* The ``quality engineer`` informs the ``publisher`` that the branch
+  is ready for release
+* The ``publisher`` `creates the packages and sets the release tag
+  <../release-process>`_
+
+The person responsible for each role is:
+
+* Sage Weil is the ``Ceph lead``
+* Sage Weil is the ``release master`` for major stable releases
+  (``firefly`` 0.80, ``hammer`` 0.94 etc.)
+* Loic Dachary is the ``release master`` for stable point releases
+  (``firefly`` 0.80.10, ``hammer`` 0.94.1 etc.)
+* Yuri Weinstein is the ``quality engineer``
+* Alfredo Deza is the ``publisher``
+
+Cutting a new development release
+=================================
+
+The publication workflow of a development release is the same as
+preparing a new release and cutting it, with the following
+differences:
+
+* The ``next`` branch is reset to the tip of ``master`` after
+  publication
+* The ``quality engineer`` is not required to run additional tests,
+  the ``release master`` directly informs the ``publisher`` that the
+  release is ready to be published.
+
+Publishing point releases and backporting
+=========================================
+
+The publication workflow of the point releases is the same as
+preparing a new release and cutting it, with the following
+differences:
+
+* The ``backport`` field of each issue contains the code name of the
+  stable release
+* There is exactly one issue in the ``Backport`` tracker for each
+  stable release to which the issue is backported
+* All commits are cherry-picked with ``git cherry-pick -x`` to
+  reference the original commit
+
+See `the backporter manual
+<http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO>`_ for more
+information.
diff --git a/doc/dev/documenting.rst b/doc/dev/documenting.rst
new file mode 100644
index 0000000..afd6efa
--- /dev/null
+++ b/doc/dev/documenting.rst
@@ -0,0 +1,108 @@
+==================
+ Documenting Ceph
+==================
+
+Code Documentation
+==================
+
+C and C++ can be documented with Doxygen_, using the subset of Doxygen
+markup supported by Breathe_.
+
+.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/
+.. _Breathe: https://github.com/michaeljones/breathe
+
+The general format for function documentation is::
+
+  /**
+   * Short description
+   *
+   * Detailed description when necessary
+   *
+   * preconditons, postconditions, warnings, bugs or other notes
+   *
+   * parameter reference
+   * return value (if non-void)
+   */
+
+This should be in the header where the function is declared, and
+functions should be grouped into logical categories. The `librados C
+API`_ provides a complete example. It is pulled into Sphinx by
+`librados.rst`_, which is rendered at :doc:`/rados/api/librados`.
+
+.. _`librados C API`: https://github.com/ceph/ceph/blob/master/src/include/rados/librados.h
+.. _`librados.rst`: https://raw.github.com/ceph/ceph/master/doc/api/librados.rst
+
+Drawing diagrams
+================
+
+Graphviz
+--------
+
+You can use Graphviz_, as explained in the `Graphviz extension documentation`_.
+
+.. _Graphviz: http://graphviz.org/
+.. _`Graphviz extension documentation`: http://sphinx.pocoo.org/ext/graphviz.html
+
+.. graphviz::
+
+   digraph "example" {
+     foo -> bar;
+     bar -> baz;
+     bar -> thud;
+   }
+
+Most of the time, you'll want to put the actual DOT source in a
+separate file, like this::
+
+  .. graphviz:: myfile.dot
+
+
+Ditaa
+-----
+
+You can use Ditaa_:
+
+.. _Ditaa: http://ditaa.sourceforge.net/
+
+.. ditaa::
+
+   +--------------+   /=----\
+   | hello, world |-->| hi! |
+   +--------------+   \-----/
+
+
+Blockdiag
+---------
+
+If a use arises, we can integrate Blockdiag_. It is a Graphviz-style
+declarative language for drawing things, and includes:
+
+- `block diagrams`_: boxes and arrows (automatic layout, as opposed to
+  Ditaa_)
+- `sequence diagrams`_: timelines and messages between them
+- `activity diagrams`_: subsystems and activities in them
+- `network diagrams`_: hosts, LANs, IP addresses etc (with `Cisco
+  icons`_ if wanted)
+
+.. _Blockdiag: http://blockdiag.com/
+.. _`Cisco icons`: http://pypi.python.org/pypi/blockdiagcontrib-cisco/
+.. _`block diagrams`: http://blockdiag.com/en/blockdiag/
+.. _`sequence diagrams`: http://blockdiag.com/en/seqdiag/index.html
+.. _`activity diagrams`: http://blockdiag.com/en/actdiag/index.html
+.. _`network diagrams`: http://blockdiag.com/en/nwdiag/
+
+
+Inkscape
+--------
+
+You can use Inkscape to generate scalable vector graphics.
+http://inkscape.org for restructedText documents.
+
+If you generate diagrams with Inkscape, you should
+commit both the Scalable Vector Graphics (SVG) file and export a
+Portable Network Graphic (PNG) file. Reference the PNG file.
+
+By committing the SVG file, others will be able to update the
+SVG diagrams using Inkscape.
+
+HTML5 will support SVG inline.
diff --git a/doc/dev/erasure-coded-pool.rst b/doc/dev/erasure-coded-pool.rst
new file mode 100644
index 0000000..0043e17
--- /dev/null
+++ b/doc/dev/erasure-coded-pool.rst
@@ -0,0 +1,137 @@
+Erasure Coded pool
+==================
+
+Purpose
+-------
+
+Erasure-coded pools require less storage space compared to replicated
+pools.  The erasure-coding support has higher computational requirements and
+only supports a subset of the operations allowed on an object (for instance,
+partial write is not supported).
+
+Use cases
+---------
+
+Cold storage
+~~~~~~~~~~~~
+
+An erasure-coded pool is created to store a large number of 1GB
+objects (imaging, genomics, etc.) and 10% of them are read per
+month. New objects are added every day and the objects are not
+modified after being written. On average there is one write for 10,000
+reads.
+
+A replicated pool is created and set as a cache tier for the
+erasure coded pool. An agent demotes objects (i.e. moves them from the
+replicated pool to the erasure-coded pool) if they have not been
+accessed in a week.
+
+The erasure-coded pool crush ruleset targets hardware designed for
+cold storage with high latency and slow access time. The replicated
+pool crush ruleset targets faster hardware to provide better response
+times.
+
+Cheap multidatacenter storage
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Ten datacenters are connected with dedicated network links. Each
+datacenter contains the same amount of storage with no power-supply
+backup and no air-cooling system.
+
+An erasure-coded pool is created with a crush map ruleset that will
+ensure no data loss if at most three datacenters fail
+simultaneously. The overhead is 50% with erasure code configured to
+split data in six (k=6) and create three coding chunks (m=3). With
+replication the overhead would be 400% (four replicas).
+
+Interface
+---------
+
+Set up an erasure-coded pool::
+
+ $ ceph osd pool create ecpool 12 12 erasure
+
+Set up an erasure-coded pool and the associated crush ruleset::
+
+ $ ceph osd crush rule create-erasure ecruleset
+ $ ceph osd pool create ecpool 12 12 erasure \
+     default ecruleset
+
+Set the ruleset failure domain to osd (instead of the host which is the default)::
+
+ $ ceph osd erasure-code-profile set myprofile \
+     ruleset-failure-domain=osd
+ $ ceph osd erasure-code-profile get myprofile
+ k=2
+ m=1
+ plugin=jerasure
+ technique=reed_sol_van
+ ruleset-failure-domain=osd
+ $ ceph osd pool create ecpool 12 12 erasure myprofile
+
+Control the parameters of the erasure code plugin::
+
+ $ ceph osd erasure-code-profile set myprofile \
+     k=3 m=1
+ $ ceph osd erasure-code-profile get myprofile
+ k=3
+ m=1
+ plugin=jerasure
+ technique=reed_sol_van
+ $ ceph osd pool create ecpool 12 12 erasure \
+     myprofile
+
+Choose an alternate erasure code plugin::
+
+ $ ceph osd erasure-code-profile set myprofile \
+     plugin=example technique=xor
+ $ ceph osd erasure-code-profile get myprofile
+ k=2
+ m=1
+ plugin=example
+ technique=xor
+ $ ceph osd pool create ecpool 12 12 erasure \
+     myprofile
+
+Display the default erasure code profile::
+
+  $ ceph osd erasure-code-profile ls
+  default
+  $ ceph osd erasure-code-profile get default
+  k=2
+  m=1
+  plugin=jerasure
+  technique=reed_sol_van
+
+Create a profile to set the data to be distributed on six OSDs (k+m=6) and sustain the loss of three OSDs (m=3) without losing data::
+
+  $ ceph osd erasure-code-profile set myprofile k=3 m=3
+  $ ceph osd erasure-code-profile get myprofile
+  k=3
+  m=3
+  plugin=jerasure
+  technique=reed_sol_van
+  $ ceph osd erasure-code-profile ls
+  default
+  myprofile
+
+Remove a profile that is no longer in use (otherwise it will fail with EBUSY)::
+
+  $ ceph osd erasure-code-profile ls
+  default
+  myprofile
+  $ ceph osd erasure-code-profile rm myprofile
+  $ ceph osd erasure-code-profile ls
+  default
+
+Set the ruleset to take ssd (instead of default)::
+
+ $ ceph osd erasure-code-profile set myprofile \
+     ruleset-root=ssd
+ $ ceph osd erasure-code-profile get myprofile
+ k=2
+ m=1
+ plugin=jerasure
+ technique=reed_sol_van
+ ruleset-root=ssd
+
diff --git a/doc/dev/file-striping.rst b/doc/dev/file-striping.rst
new file mode 100644
index 0000000..405c971
--- /dev/null
+++ b/doc/dev/file-striping.rst
@@ -0,0 +1,161 @@
+File striping
+=============
+
+The text below describes how files from Ceph file system clients are
+stored across objects stored in RADOS.
+
+ceph_file_layout
+----------------
+
+Ceph distributes (stripes) the data for a given file across a number
+of underlying objects.  The way file data is mapped to those objects
+is defined by the ceph_file_layout structure.  The data distribution
+is a modified RAID 0, where data is striped across a set of objects up
+to a (per-file) fixed size, at which point another set of objects
+holds the file's data.  The second set also holds no more than the
+fixed amount of data, and then another set is used, and so on.
+
+Defining some terminology will go a long way toward explaining the
+way file data is laid out across Ceph objects.
+
+- file
+    A collection of contiguous data, named from the perspective of
+    the Ceph client (i.e., a file on a Linux system using Ceph
+    storage).  The data for a file is divided into fixed-size
+    "stripe units," which are stored in ceph "objects."
+- stripe unit
+    The size (in bytes) of a block of data used in the RAID 0
+    distribution of a file.  All stripe units for a file have equal
+    size.  The last stripe unit is typically incomplete--i.e. it
+    represents the data at the end of the file as well as unused
+    "space" beyond it up to the end of the fixed stripe unit size.
+- stripe count
+    The number of consecutive stripe units that constitute a RAID 0
+    "stripe" of file data.
+- stripe
+    A contiguous range of file data, RAID 0 striped across "stripe
+    count" objects in fixed-size "stripe unit" blocks.
+- object
+    A collection of data maintained by Ceph storage.  Objects are
+    used to hold portions of Ceph client files.
+- object set
+    A set of objects that together represent a contiguous portion of
+    a file.
+
+Three fields in the ceph_file_layout structure define this mapping::
+
+	u32 fl_stripe_unit;
+	u32 fl_stripe_count;
+	u32 fl_object_size;
+
+(They are actually maintained in their on-disk format, __le32.)
+
+The role of the first two fields should be clear from the
+definitions above.
+
+The third field is the maximum size (in bytes) of an object used to
+back file data.  The object size is a multiple of the stripe unit.
+
+A file's data is blocked into stripe units, and consecutive stripe
+units are stored on objects in an object set.  The number of objects
+in a set is the same as the stripe count.  No object storing file
+data will exceed the file's designated object size, so after some
+fixed number of complete stripes, a new object set is used to store
+subsequent file data.
+
+Note that by default, Ceph uses a simple striping strategy in which
+object_size equals stripe_unit and stripe_count is 1.  This simply
+puts one stripe_unit in each object.  
+
+Here's a more complex example::
+
+    file size = 1 trillion = 1000000000000 bytes
+
+    fl_stripe_unit = 64KB = 65536 bytes
+    fl_stripe_count = 5 stripe units per stripe
+    fl_object_size = 64GB = 68719476736 bytes
+
+This means::
+
+    file stripe size = 64KB * 5 = 320KB = 327680 bytes
+    each object holds 64GB / 64KB = 1048576 stripe units
+    file object set size = 64GB * 5 = 320GB = 343597383680 bytes
+	(also 1048576 stripe units * 327680 bytes per stripe unit)
+
+So the file's 1 trillion bytes can be divided into complete object
+sets, then complete stripes, then complete stripe units, and finally
+a single incomplete stripe unit::
+
+    - 1 trillion bytes / 320GB per object set = 2 complete object sets
+        (with 312805232640 bytes remaining)
+    - 312805232640 bytes / 320KB per stripe = 954605 complete stripes
+        (with 266240 bytes remaining)
+    - 266240 bytes / 64KB per stripe unit = 4 complete stripe units
+        (with 4096 bytes remaining)
+    - and the final incomplete stripe unit holds those 4096 bytes.
+
+The ASCII art below attempts to capture this::
+
+     _________   _________   _________   _________   _________
+    /object  0\ /object  1\ /object  2\ /object  3\ /object  4\
+    +=========+ +=========+ +=========+ +=========+ +=========+
+    |  stripe | |  stripe | |  stripe | |  stripe | |  stripe |
+  o |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | stripe 0
+  b |     0   | |     1   | |     2   | |     3   | |     4   |
+  j |---------| |---------| |---------| |---------| |---------|
+  e |  stripe | |  stripe | |  stripe | |  stripe | |  stripe |
+  c |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | stripe 1
+  t |     5   | |     6   | |     7   | |     8   | |     9   |
+    |---------| |---------| |---------| |---------| |---------|
+  s |     .   | |     .   | |     .   | |     .   | |     .   |
+  e       .           .           .           .           .
+  t |     .   | |     .   | |     .   | |     .   | |     .   |
+    |---------| |---------| |---------| |---------| |---------|
+  0 |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+    |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 1048575
+    | 5242875 | | 5242876 | | 5242877 | | 5242878 | | 5242879 |
+    \=========/ \=========/ \=========/ \=========/ \=========/
+
+     _________   _________   _________   _________   _________
+    /object  5\ /object  6\ /object  7\ /object  8\ /object  9\
+    +=========+ +=========+ +=========+ +=========+ +=========+
+    |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+  o |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 1048576
+  b | 5242880 | | 5242881 | | 5242882 | | 5242883 | | 5242884 |
+  j |---------| |---------| |---------| |---------| |---------|
+  e |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+  c |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 1048577
+  t | 5242885 | | 5242886 | | 5242887 | | 5242888 | | 5242889 |
+    |---------| |---------| |---------| |---------| |---------|
+  s |     .   | |     .   | |     .   | |     .   | |     .   |
+  e       .           .           .           .           .
+  t |     .   | |     .   | |     .   | |     .   | |     .   |
+    |---------| |---------| |---------| |---------| |---------|
+  1 |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+    |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 2097151
+    | 10485755| | 10485756| | 10485757| | 10485758| | 10485759|
+    \=========/ \=========/ \=========/ \=========/ \=========/
+
+     _________   _________   _________   _________   _________
+    /object 10\ /object 11\ /object 12\ /object 13\ /object 14\
+    +=========+ +=========+ +=========+ +=========+ +=========+
+    |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+  o |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 2097152
+  b | 10485760| | 10485761| | 10485762| | 10485763| | 10485764|
+  j |---------| |---------| |---------| |---------| |---------|
+  e |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+  c |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 2097153
+  t | 10485765| | 10485766| | 10485767| | 10485768| | 10485769|
+    |---------| |---------| |---------| |---------| |---------|
+  s |     .   | |     .   | |     .   | |     .   | |     .   |
+  e       .           .           .           .           .
+  t |     .   | |     .   | |     .   | |     .   | |     .   |
+    |---------| |---------| |---------| |---------| |---------|
+  2 |  stripe | |  stripe | |  stripe | |  stripe | |  stripe | stripe
+    |   unit  | |   unit  | |   unit  | |   unit  | |   unit  | 3051756
+    | 15258780| | 15258781| | 15258782| | 15258783| | 15258784|
+    |---------| |---------| |---------| |---------| |---------|
+    |  stripe | |  stripe | |  stripe | |  stripe | | (partial| (partial
+    |   unit  | |   unit  | |   unit  | |   unit  | |  stripe | stripe
+    | 15258785| | 15258786| | 15258787| | 15258788| |  unit)  | 3051757)
+    \=========/ \=========/ \=========/ \=========/ \=========/
diff --git a/doc/dev/generatedocs.rst b/doc/dev/generatedocs.rst
new file mode 100644
index 0000000..7332167
--- /dev/null
+++ b/doc/dev/generatedocs.rst
@@ -0,0 +1,66 @@
+Building Ceph Documentation
+===========================
+
+Ceph utilizes Python's Sphinx documentation tool. For details on
+the Sphinx documentation tool, refer to `The Sphinx Documentation Tool <http://sphinx.pocoo.org/>`_.
+
+To build the Ceph documentation set, you must:
+
+1. Clone the Ceph repository
+2. Install the required tools
+3. Build the documents
+
+Clone the Ceph Repository
+-------------------------
+
+To clone the Ceph repository, you must have ``git`` installed
+on your local host. To install ``git``, execute::
+
+	sudo apt-get install git
+
+To clone the Ceph repository, execute::
+
+	git clone git://github.com/ceph/ceph
+
+You should have a full copy of the Ceph repository.
+
+
+Install the Required Tools
+--------------------------
+
+To build the Ceph documentation, the following packages are required on
+Ubuntu 14.04:
+
+- ``python-dev``
+- ``python-pip``
+- ``python-virtualenv``
+- ``libxml2-dev``
+- ``libxslt-dev``
+- ``doxygen``
+- ``ditaa``
+- ``graphviz``
+- ``ant``
+- ``cython``
+- ``librbd-dev``
+
+Execute ``apt-get install`` for each dependency that isn't installed
+on your host.::
+
+	sudo apt-get install python-dev python-pip python-virtualenv libxml2-dev libxslt-dev doxygen ditaa graphviz ant cython librbd-dev
+
+
+
+Build the Documents
+-------------------
+
+Once you have installed all the dependencies, execute the build::
+
+	cd ceph
+	admin/build-doc
+
+Once you build the documentation set, you may navigate to the source directory to view it::
+
+	cd build-doc/output
+
+There should be an ``html`` directory and a ``man`` directory containing documentation
+in HTML and manpage formats respectively.
diff --git a/doc/dev/index-old.rst b/doc/dev/index-old.rst
new file mode 100644
index 0000000..f18adae
--- /dev/null
+++ b/doc/dev/index-old.rst
@@ -0,0 +1,39 @@
+==================================
+ Internal developer documentation
+==================================
+
+.. note:: If you're looking for how to use Ceph as a library from your
+   own software, please see :doc:`/api/index`.
+
+You can start a development mode Ceph cluster, after compiling the source, with::
+
+	cd src
+	install -d -m0755 out dev/osd0
+	./vstart.sh -n -x -l
+	# check that it's there
+	./ceph health
+
+.. todo:: vstart is woefully undocumented and full of sharp sticks to poke yourself with.
+
+
+.. _mailing-list:
+
+.. rubric:: Mailing list
+
+The official development email list is ``ceph-devel at vger.kernel.org``.  Subscribe by sending
+a message to ``majordomo at vger.kernel.org`` with the line::
+
+ subscribe ceph-devel
+
+in the body of the message.
+
+
+.. rubric:: Contents
+
+.. toctree::
+   :glob:
+
+   *
+   osd_internals/index*
+   mds_internals/index*
+   radosgw/index*
diff --git a/doc/dev/index.rst b/doc/dev/index.rst
new file mode 100644
index 0000000..7a5ce68
--- /dev/null
+++ b/doc/dev/index.rst
@@ -0,0 +1,1396 @@
+============================================
+Contributing to Ceph: A Guide for Developers
+============================================
+
+:Author: Loic Dachary
+:Author: Nathan Cutler
+:License: Creative Commons Attribution-ShareAlike (CC BY-SA)
+
+.. note:: The old (pre-2016) developer documentation has been moved to :doc:`/dev/index-old`.
+
+.. contents::
+   :depth: 3
+
+Introduction
+============
+
+This guide has two aims. First, it should lower the barrier to entry for
+software developers who wish to get involved in the Ceph project. Second,
+it should serve as a reference for Ceph developers.
+
+We assume that readers are already familiar with Ceph (the distributed
+object store and file system designed to provide excellent performance,
+reliability and scalability). If not, please refer to the `project website`_
+and especially the `publications list`_.
+
+.. _`project website`: http://ceph.com
+.. _`publications list`: https://ceph.com/resources/publications/
+
+Since this document is to be consumed by developers, who are assumed to
+have Internet access, topics covered elsewhere, either within the Ceph
+documentation or elsewhere on the web, are treated by linking. If you
+notice that a link is broken or if you know of a better link, please
+`report it as a bug`_.
+
+.. _`report it as a bug`: http://tracker.ceph.com/projects/ceph/issues/new
+
+Essentials (tl;dr)
+==================
+
+This chapter presents essential information that every Ceph developer needs
+to know.
+
+Leads
+-----
+
+The Ceph project is led by Sage Weil. In addition, each major project
+component has its own lead. The following table shows all the leads and
+their nicks on `GitHub`_:
+
+.. _github: https://github.com/
+
+========= =============== =============
+Scope     Lead            GitHub nick
+========= =============== =============
+Ceph      Sage Weil       liewegas
+RADOS     Samuel Just     athanatos
+RGW       Yehuda Sadeh    yehudasa
+RBD       Josh Durgin     jdurgin
+CephFS    Gregory Farnum  gregsfortytwo
+Build/Ops Ken Dreyer      ktdreyer
+========= =============== =============
+
+The Ceph-specific acronyms in the table are explained in
+:doc:`/architecture`.
+
+History
+-------
+
+See the `History chapter of the Wikipedia article`_.
+
+.. _`History chapter of the Wikipedia article`: https://en.wikipedia.org/wiki/Ceph_%28software%29#History
+
+Licensing
+---------
+
+Ceph is free software.
+
+Unless stated otherwise, the Ceph source code is distributed under the terms of
+the LGPL2.1. For full details, see `the file COPYING in the top-level
+directory of the source-code tree`_.
+
+.. _`the file COPYING in the top-level directory of the source-code tree`:
+  https://github.com/ceph/ceph/blob/master/COPYING
+
+Source code repositories
+------------------------
+
+The source code of Ceph lives on `GitHub`_ in a number of repositories below
+the `Ceph "organization"`_.
+
+.. _`Ceph "organization"`: https://github.com/ceph
+
+To make a meaningful contribution to the project as a developer, a working
+knowledge of git_ is essential.
+
+.. _git: https://git-scm.com/documentation
+
+Although the `Ceph "organization"`_ includes several software repositories,
+this document covers only one: https://github.com/ceph/ceph.
+
+Redmine issue tracker
+---------------------
+
+Although `GitHub`_ is used for code, Ceph-related issues (Bugs, Features,
+Backports, Documentation, etc.) are tracked at http://tracker.ceph.com,
+which is powered by `Redmine`_.
+
+.. _Redmine: http://www.redmine.org
+
+The tracker has a Ceph project with a number of subprojects loosely
+corresponding to the various architectural components (see
+:doc:`/architecture`).
+
+Mere `registration`_ in the tracker automatically grants permissions
+sufficient to open new issues and comment on existing ones.
+
+.. _registration: http://tracker.ceph.com/account/register
+
+To report a bug or propose a new feature, `jump to the Ceph project`_ and
+click on `New issue`_.
+
+.. _`jump to the Ceph project`: http://tracker.ceph.com/projects/ceph
+.. _`New issue`: http://tracker.ceph.com/projects/ceph/issues/new
+
+Mailing list
+------------
+
+Ceph development email discussions take place on the mailing list
+``ceph-devel at vger.kernel.org``. The list is open to all. Subscribe by
+sending a message to ``majordomo at vger.kernel.org`` with the line: ::
+
+    subscribe ceph-devel
+
+in the body of the message.
+
+There are also `other Ceph-related mailing lists`_.
+
+.. _`other Ceph-related mailing lists`: https://ceph.com/resources/mailing-list-irc/
+
+IRC
+---
+
+In addition to mailing lists, the Ceph community also communicates in real
+time using `Internet Relay Chat`_.
+
+.. _`Internet Relay Chat`: http://www.irchelp.org/
+
+See https://ceph.com/resources/mailing-list-irc/ for how to set up your IRC
+client and a list of channels.
+
+Submitting patches
+------------------
+
+The canonical instructions for submitting patches are contained in the
+`the file CONTRIBUTING.rst in the top-level directory of the source-code
+tree`_. There may be some overlap between this guide and that file.
+
+.. _`the file CONTRIBUTING.rst in the top-level directory of the source-code tree`:
+  https://github.com/ceph/ceph/blob/master/CONTRIBUTING.rst
+
+All newcomers are encouraged to read that file carefully.
+
+Building from source
+--------------------
+
+See instructions at :doc:`/dev/quick_guide` and :doc:`/install/build-ceph`.
+
+Development-mode cluster
+------------------------
+
+You can start a development-mode Ceph cluster, after compiling the source,
+with::
+
+    cd src
+    install -d -m0755 out dev/osd0
+    ./vstart.sh -n -x -l
+    # check that it's there
+    ./ceph health
+
+For more ``vstart.sh`` examples, see :doc:`/dev/quick_guide`.
+
+What is merged where and when ?
+===============================
+
+Commits are merged into branches according to criteria that change
+during the lifecycle of a Ceph release. This chapter is the inventory
+of what can be merged in which branch at a given point in time.
+
+Development releases (i.e. x.0.z)
+---------------------------------
+
+What ?
+^^^^^^
+
+* features
+* bug fixes
+
+Where ?
+^^^^^^^
+
+Features are merged to the master branch. Bug fixes should be merged
+to the corresponding named branch (e.g. "jewel" for 10.0.z, "kraken"
+for 11.0.z, etc.). However, this is not mandatory - bug fixes can be
+merged to the master branch as well, since the master branch is
+periodically merged to the named branch during the development
+releases phase. In either case, if the bugfix is important it can also
+be flagged for backport to one or more previous stable releases.
+
+When ?
+^^^^^^
+
+After the stable release candidates of the previous release enters
+phase 2 (see below).  For example: the "jewel" named branch was
+created when the infernalis release candidates entered phase 2. From
+this point on, master was no longer associated with infernalis. As
+soon as the named branch of the next stable release is created, master
+starts getting periodically merged into it.
+
+Branch merges
+^^^^^^^^^^^^^
+
+* The branch of the stable release is merged periodically into master.
+* The master branch is merged periodically into the branch of the
+  stable release.
+* The master is merged into the branch of the stable release
+  immediately after each development x.0.z release.
+  
+Stable release candidates (i.e. x.1.z) phase 1
+----------------------------------------------
+
+What ?
+^^^^^^
+
+* bug fixes only
+
+Where ?
+^^^^^^^
+
+The branch of the stable release (e.g. "jewel" for 10.0.z, "kraken"
+for 11.0.z, etc.) or master.  Bug fixes should be merged to the named
+branch corresponding to the stable release candidate (e.g. "jewel" for
+10.1.z) or to master. During this phase, all commits to master will be
+merged to the named branch, and vice versa. In other words, it makes
+no difference whether a commit is merged to the named branch or to
+master - it will make it into the next release candidate either way.
+
+When ?
+^^^^^^
+
+After the first stable release candidate is published, i.e. after the
+x.1.0 tag is set in the release branch.
+
+Branch merges
+^^^^^^^^^^^^^
+
+* The branch of the stable release is merged periodically into master.
+* The master branch is merged periodically into the branch of the
+  stable release.
+* The master is merged into the branch of the stable release
+  immediately after each x.1.z release candidate.
+
+Stable release candidates (i.e. x.1.z) phase 2
+----------------------------------------------
+
+What ?
+^^^^^^
+
+* bug fixes only
+
+Where ?
+^^^^^^^
+
+The branch of the stable release (e.g. "jewel" for 10.0.z, "kraken"
+for 11.0.z, etc.). During this phase, all commits to the named branch
+will be merged into master. Cherry-picking to the named branch during
+release candidate phase 2 is done manually since the official
+backporting process only begins when the release is pronounced
+"stable".
+
+When ?
+^^^^^^
+
+After Sage Weil decides it is time for phase 2 to happen.
+
+Branch merges
+^^^^^^^^^^^^^
+
+* The branch of the stable release is merged periodically into master.
+
+Stable releases (i.e. x.2.z)
+----------------------------
+
+What ?
+^^^^^^
+
+* bug fixes
+* features are sometime accepted
+* commits should be cherry-picked from master when possible
+* commits that are not cherry-picked from master must be about a bug unique to the stable release
+* see also `the backport HOWTO`_
+
+.. _`the backport HOWTO`:
+  http://tracker.ceph.com/projects/ceph-releases/wiki/HOWTO#HOWTO
+
+Where ?
+^^^^^^^
+
+The branch of the stable release (hammer for 0.94.x, infernalis for 9.2.x, etc.)
+
+When ?
+^^^^^^
+
+After the stable release is published, i.e. after the "vx.2.0" tag is
+set in the release branch.
+
+Branch merges
+^^^^^^^^^^^^^
+
+Never
+
+Issue tracker
+=============
+
+See `Redmine issue tracker`_ for a brief introduction to the Ceph Issue Tracker.
+
+Ceph developers use the issue tracker to 
+
+1. keep track of issues - bugs, fix requests, feature requests, backport
+requests, etc. 
+
+2. communicate with other developers and keep them informed as work
+on the issues progresses.
+
+Issue tracker conventions
+-------------------------
+
+When you start working on an existing issue, it's nice to let the other
+developers know this - to avoid duplication of labor. Typically, this is
+done by changing the :code:`Assignee` field (to yourself) and changing the
+:code:`Status` to *In progress*. Newcomers to the Ceph community typically do not
+have sufficient privileges to update these fields, however: they can
+simply update the issue with a brief note.
+
+.. table:: Meanings of some commonly used statuses
+
+   ================ ===========================================
+   Status           Meaning
+   ================ ===========================================
+   New              Initial status
+   In Progress      Somebody is working on it
+   Need Review      Pull request is open with a fix
+   Pending Backport Fix has been merged, backport(s) pending
+   Resolved         Fix and backports (if any) have been merged
+   ================ ===========================================
+
+Basic workflow
+==============
+
+The following chart illustrates basic development workflow:
+
+.. ditaa::
+
+            Upstream Code                       Your Local Environment
+
+           /----------\        git clone           /-------------\
+           |   Ceph   | -------------------------> | ceph/master |
+           \----------/                            \-------------/
+                ^                                    |
+                |                                    | git branch fix_1
+                | git merge                          |
+                |                                    v
+           /----------------\  git commit --amend   /-------------\
+           |  make check    |---------------------> | ceph/fix_1  |
+           | ceph--qa--suite|                       \-------------/
+           \----------------/                        |
+                ^                                    | fix changes
+                |                                    | test changes
+                | review                             | git commit
+                |                                    | 
+                |                                    v
+           /--------------\                        /-------------\
+           |   github     |<---------------------- | ceph/fix_1  |
+           | pull request |         git push       \-------------/
+           \--------------/
+
+Below we present an explanation of this chart. The explanation is written
+with the assumption that you, the reader, are a beginning developer who
+has an idea for a bugfix, but do not know exactly how to proceed.
+
+Update the tracker
+------------------
+
+Before you start, you should know the `Issue tracker`_ number of the bug
+you intend to fix. If there is no tracker issue, now is the time to create
+one. 
+
+The tracker is there to explain the issue (bug) to your fellow Ceph
+developers and keep them informed as you make progress toward resolution. 
+To this end, then, provide a descriptive title as well as sufficient
+information and details in the description.
+
+If you have sufficient tracker permissions, assign the bug to yourself by
+changing the ``Assignee`` field.  If your tracker permissions have not yet
+been elevated, simply add a comment to the issue with a short message like
+"I am working on this issue". 
+
+Upstream code
+-------------
+
+This section, and the ones that follow, correspond to the nodes in the
+above chart.
+
+The upstream code lives in https://github.com/ceph/ceph.git, which is
+sometimes referred to as the "upstream repo", or simply "upstream". As the
+chart illustrates, we will make a local copy of this code, modify it, test
+our modifications, and submit the modifications back to the upstream repo
+for review.
+
+A local copy of the upstream code is made by 
+
+1. forking the upstream repo on GitHub, and 
+2. cloning your fork to make a local working copy
+
+See the `the GitHub documentation
+<https://help.github.com/articles/fork-a-repo/#platform-linux>`_ for
+detailed instructions on forking. In short, if your GitHub username is
+"mygithubaccount", your fork of the upstream repo will show up at
+https://github.com/mygithubaccount/ceph. Once you have created your fork,
+you clone it by doing:
+
+.. code::
+
+    $ git clone https://github.com/mygithubaccount/ceph
+
+While it is possible to clone the upstream repo directly, in this case you
+must fork it first. Forking is what enables us to open a `GitHub pull
+request`_.
+
+For more information on using GitHub, refer to `GitHub Help
+<https://help.github.com/>`_.
+
+Local environment
+-----------------
+
+In the local environment created in the previous step, you now have a
+copy of the ``master`` branch in ``remotes/origin/master``. Since the fork
+(https://github.com/mygithubaccount/ceph.git) is frozen in time and the
+upstream repo (https://github.com/ceph/ceph.git, typically abbreviated to
+``ceph/ceph.git``) is updated frequently by other developers, you will need
+to sync your fork periodically. To do this, first add the upstream repo as
+a "remote" and fetch it::
+
+    $ git remote add ceph https://github.com/ceph/ceph.git
+    $ git fetch ceph
+
+Fetching downloads all objects (commits, branches) that were added since
+the last sync. After running these commands, all the branches from
+``ceph/ceph.git`` are downloaded to the local git repo as
+``remotes/ceph/$BRANCH_NAME`` and can be referenced as
+``ceph/$BRANCH_NAME`` in certain git commands. 
+
+For example, your local ``master`` branch can be reset to the upstream Ceph
+``master`` branch by doing::
+
+    $ git fetch ceph
+    $ git checkout master
+    $ git reset --hard ceph/master
+
+Finally, the ``master`` branch of your fork can then be synced to upstream
+master by::
+
+    $ git push -u origin master
+
+Bugfix branch
+-------------
+
+Next, create a branch for the bugfix:
+
+.. code::
+
+    $ git checkout master
+    $ git branch -b fix_1
+    $ git push -u origin fix_1
+
+This creates a ``fix_1`` branch locally and in our GitHub fork. At this
+point, the ``fix_1`` branch is identical to the ``master`` branch, but not
+for long! You are now ready to modify the code.
+
+Fix bug locally
+---------------
+
+At this point, change the status of the tracker issue to "In progress" to
+communicate to the other Ceph developers that you have begun working on a
+fix. If you don't have permission to change that field, your comment that
+you are working on the issue is sufficient.
+
+Possibly, your fix is very simple and requires only minimal testing.
+More likely, it will be an iterative process involving trial and error, not
+to mention skill. An explanation of how to fix bugs is beyond the
+scope of this document. Instead, we focus on the mechanics of the process
+in the context of the Ceph project.
+
+A detailed discussion of the tools available for validating your bugfixes,
+see the `Testing`_ chapter.
+
+For now, let us just assume that you have finished work on the bugfix and
+that you have tested it and believe it works. Commit the changes to your local
+branch using the ``--signoff`` option::
+
+    $ git commit -as
+
+and push the changes to your fork::
+
+    $ git push origin fix_1
+
+GitHub pull request
+-------------------
+
+The next step is to open a GitHub pull request. The purpose of this step is
+to make your bugfix available to the community of Ceph developers.  They
+will review it and may do additional testing on it.
+
+In short, this is the point where you "go public" with your modifications.
+Psychologically, you should be prepared to receive suggestions and
+constructive criticism. Don't worry! In our experience, the Ceph project is
+a friendly place!
+
+If you are uncertain how to use pull requests, you may read
+`this GitHub pull request tutorial`_.
+
+.. _`this GitHub pull request tutorial`:
+   https://help.github.com/articles/using-pull-requests/
+
+For some ideas on what constitutes a "good" pull request, see
+the `Git Commit Good Practice`_ article at the `OpenStack Project Wiki`_.
+
+.. _`Git Commit Good Practice`: https://wiki.openstack.org/wiki/GitCommitMessages
+.. _`OpenStack Project Wiki`: https://wiki.openstack.org/wiki/Main_Page
+
+Once your pull request (PR) is opened, update the `Issue tracker`_ by
+adding a comment to the bug pointing the other developers to your PR. The
+update can be as simple as::
+
+    *PR*: https://github.com/ceph/ceph/pull/$NUMBER_OF_YOUR_PULL_REQUEST
+
+Automated PR validation
+-----------------------
+
+When your PR hits GitHub, the Ceph project's `Continuous Integration (CI)
+<https://en.wikipedia.org/wiki/Continuous_integration>`_
+infrastructure will test it automatically. At the time of this writing
+(March 2016), the automated CI testing included a test to check that the
+commits in the PR are properly signed (see `Submitting patches`_) and a
+``make check`` test.
+
+The latter, ``make check``, builds the PR and runs it through a battery of
+tests. These tests run on machines operated by the Ceph Continuous
+Integration (CI) team. When the tests complete, the result will be shown
+on GitHub in the pull request itself.
+
+You can (and should) also test your modifications before you open a PR. 
+Refer to the the `Testing`_ chapter for details.
+
+Integration tests AKA ceph-qa-suite
+-----------------------------------
+
+Since Ceph is a complex beast, it may also be necessary to test your fix to
+see how it behaves on real clusters running either on real or virtual
+hardware. Tests designed for this purpose live in the `ceph-qa-suite
+repository`_ and are run via the `teuthology framework`_.
+
+.. _`ceph-qa-suite repository`: https://github.com/ceph/ceph-qa-suite/
+.. _`teuthology framework`: https://github.com/ceph/teuthology
+
+If you have access to an OpenStack tenant, you are encouraged to run the
+integration tests yourself using `ceph-workbench ceph-qa-suite`_,
+and to post the test results to the PR.
+
+.. _`ceph-workbench ceph-qa-suite`: http://ceph-workbench.readthedocs.org/
+
+The Ceph community has access to the `Sepia lab
+<http://ceph.github.io/sepia/>`_ where integration tests can be run on
+real hardware. Other developers may add tags like "needs-qa" to your PR.
+This allows PRs that need testing to be merged into a single branch and
+tested all at the same time. Since teuthology suites can take hours
+(even days in some cases) to run, this can save a lot of time.
+
+Integration testing is discussed in more detail in the `Testing`_ chapter.
+
+Code review
+-----------
+
+Once your bugfix has been thoroughly tested, or even during this process,
+it will be subjected to code review by other developers. This typically
+takes the form of correspondence in the PR itself, but can be supplemented
+by discussions on `IRC`_ and the `Mailing list`_.
+
+Amending your PR
+----------------
+
+While your PR is going through `Testing`_ and `Code review`_, you can
+modify it at any time by editing files in your local branch.
+
+After the changes are committed locally (to the ``fix_1`` branch in our
+example), they need to be pushed to GitHub so they appear in the PR.
+
+Modifying the PR is done by adding commits to the ``fix_1`` branch upon
+which it is based, often followed by rebasing to modify the branch's git
+history. See `this tutorial
+<https://www.atlassian.com/git/tutorials/rewriting-history>`_ for a good
+introduction to rebasing. When you are done with your modifications, you
+will need to force push your branch with:
+
+.. code::
+
+    $ git push --force origin fix_1
+
+Merge
+-----
+
+The bugfixing process culminates when one of the project leads decides to
+merge your PR.
+
+When this happens, it is a signal for you (or the lead who merged the PR)
+to change the `Issue tracker`_ status to "Resolved". Some issues may be
+flagged for backporting, in which case the status should be changed to
+"Pending Backport" (see the `Backporting`_ chapter for details).
+
+
+Testing
+=======
+
+Ceph has two types of tests: "make check" tests and integration tests.
+The former are run via `GNU Make <https://www.gnu.org/software/make/>`,
+and the latter are run via the `teuthology framework`_. The following two
+chapters examine the "make check" and integration tests in detail.
+
+Testing - make check
+====================
+
+After compiling Ceph, the ``make check`` command can be used to run the
+code through a battery of tests covering various aspects of Ceph. For
+inclusion in "make check", a test must:
+
+* bind ports that do not conflict with other tests
+* not require root access
+* not require more than one machine to run
+* complete within a few minutes
+
+While it is possible to run ``make check`` directly, it can be tricky to
+correctly set up your environment. Fortunately, a script is provided to
+make it easier run "make check" on your code. It can be run from the
+top-level directory of the Ceph source tree by doing::
+
+    $ ./run-make-check.sh
+
+You will need a minimum of 8GB of RAM and 32GB of free disk space for this
+command to complete successfully on x86_64 (other architectures may have
+different constraints). Depending on your hardware, it can take from 20
+minutes to three hours to complete, but it's worth the wait.
+
+When you fix a bug, it's a good idea to add a test. See the `Writing make
+check tests`_ chapter.
+
+Further sections
+----------------
+
+* Principles of make check tests
+* Where to find test results
+* How to interpret test results
+* Find the corresponding source code
+* Writing make check tests
+* Make check caveats
+
+Testing - integration tests
+===========================
+
+When a test requires multiple machines, root access or lasts for a
+longer time (for example, to simulate a realistic Ceph deployment), it
+is deemed to be an integration test. Integration tests are organized into
+"suites", which are defined in the `ceph-qa-suite repository`_ and run with
+the ``teuthology-suite`` command.
+
+The ``teuthology-suite`` command is part of the `teuthology framework`_.
+In the sections that follow we attempt to provide a detailed introduction
+to that framework from the perspective of a beginning Ceph developer.
+
+Teuthology consumes packages 
+----------------------------
+
+It may take some time to understand the significance of this fact, but it
+is `very` significant. It means that automated tests can be conducted on
+multiple platforms using the same packages (RPM, DEB) that can be
+installed on any machine running those platforms.
+
+Teuthology has a `list of platforms that it supports
+<https://github.com/ceph/ceph-qa-suite/tree/master/distros/supported>`_ (as
+of March 2016 the list consisted of "CentOS 7.2" and "Ubuntu 14.04").  It
+expects to be provided pre-built Ceph packages for these platforms.
+Teuthology deploys these platforms on machines (bare-metal or
+cloud-provisioned), installs the packages on them, and deploys Ceph
+clusters on them - all as called for by the test.
+
+The nightlies
+-------------
+
+A number of integration tests are run on a regular basis in the `Sepia
+lab`_ against the official Ceph repositories (on the ``master`` development
+branch and the stable branches). Traditionally, these tests are called "the
+nightlies" because the Ceph core developers used to live and work in
+the same time zone and from their perspective the tests were run overnight. 
+
+The results of the nightlies are published at http://pulpito.ceph.com/ and
+http://pulpito.ovh.sepia.ceph.com:8081/. The developer nick shows in the
+test results URL and in the first column of the Pulpito dashboard.  The
+results are also reported on the `ceph-qa mailing list
+<http://ceph.com/resources/mailing-list-irc/>`_ for analysis.
+
+Suites inventory
+----------------
+
+The ``suites`` directory of the `ceph-qa-suite repository`_ contains
+all the integration tests, for all the Ceph components.
+
+`ceph-deploy <https://github.com/ceph/ceph-qa-suite/tree/master/suites/ceph-deploy>`_
+  install a Ceph cluster with ``ceph-deploy`` (`ceph-deploy man page`_)
+
+`ceph-disk <https://github.com/ceph/ceph-qa-suite/tree/master/suites/ceph-disk>`_
+  verify init scripts (upstart etc.) and udev integration with
+  ``ceph-disk`` (`ceph-disk man page`_), with and without `dmcrypt
+  <https://gitlab.com/cryptsetup/cryptsetup/wikis/DMCrypt>`_ support.
+
+`dummy <https://github.com/ceph/ceph-qa-suite/tree/master/suites/dummy>`_
+  get a machine, do nothing and return success (commonly used to
+  verify the integration testing infrastructure works as expected)
+
+`fs <https://github.com/ceph/ceph-qa-suite/tree/master/suites/fs>`_
+  test CephFS
+
+`kcephfs <https://github.com/ceph/ceph-qa-suite/tree/master/suites/kcephfs>`_
+  test the CephFS kernel module
+
+`krbd <https://github.com/ceph/ceph-qa-suite/tree/master/suites/krbd>`_
+  test the RBD kernel module
+
+`powercycle <https://github.com/ceph/ceph-qa-suite/tree/master/suites/powercycle>`_
+  verify the Ceph cluster behaves when machines are powered off
+  and on again
+
+`rados <https://github.com/ceph/ceph-qa-suite/tree/master/suites/rados>`_
+  run Ceph clusters including OSDs and MONs, under various conditions of
+  stress
+
+`rbd <https://github.com/ceph/ceph-qa-suite/tree/master/suites/rbd>`_
+  run RBD tests using actual Ceph clusters, with and without qemu
+
+`rgw <https://github.com/ceph/ceph-qa-suite/tree/master/suites/rgw>`_
+  run RGW tests using actual Ceph clusters
+
+`smoke <https://github.com/ceph/ceph-qa-suite/tree/master/suites/smoke>`_
+  run tests that exercise the Ceph API with an actual Ceph cluster
+
+`teuthology <https://github.com/ceph/ceph-qa-suite/tree/master/suites/teuthology>`_
+  verify that teuthology can run integration tests, with and without OpenStack
+
+`upgrade <https://github.com/ceph/ceph-qa-suite/tree/master/suites/upgrade>`_
+  for various versions of Ceph, verify that upgrades can happen
+  without disrupting an ongoing workload
+
+.. _`ceph-deploy man page`: ../../man/8/ceph-deploy
+.. _`ceph-disk man page`: ../../man/8/ceph-disk
+
+teuthology-describe-tests
+-------------------------
+
+In February 2016, a new feature called ``teuthology-describe-tests`` was
+added to the `teuthology framework`_ to facilitate documentation and better
+understanding of integration tests (`feature announcement
+<http://article.gmane.org/gmane.comp.file-systems.ceph.devel/29287>`_).
+
+The upshot is that tests can be documented by embedding ``meta:``
+annotations in the yaml files used to define the tests. The results can be
+seen in the `ceph-qa-suite wiki
+<http://tracker.ceph.com/projects/ceph-qa-suite/wiki/>`_.
+
+Since this is a new feature, many yaml files have yet to be annotated.
+Developers are encouraged to improve the documentation, in terms of both
+coverage and quality.
+
+How integration tests are run
+-----------------------------
+
+Given that - as a new Ceph developer - you will typically not have access
+to the `Sepia lab`_, you may rightly ask how you can run the integration
+tests in your own environment.
+
+One option is to set up a teuthology cluster on bare metal. Though this is
+a non-trivial task, it `is` possible. Here are `some notes
+<http://docs.ceph.com/teuthology/docs/LAB_SETUP.html>`_ to get you started
+if you decide to go this route.
+
+If you have access to an OpenStack tenant, you have another option: the
+`teuthology framework`_ has an OpenStack backend, which is documented `here
+<https://github.com/dachary/teuthology/tree/openstack#openstack-backend>`_.
+This OpenStack backend can build packages from a given git commit or
+branch, provision VMs, install the packages and run integration tests
+on those VMs. This process is controlled using a tool called
+`ceph-workbench ceph-qa-suite`_. This tool also automates publishing of
+test results at http://teuthology-logs.public.ceph.com. 
+
+Running integration tests on your code contributions and publishing the
+results allows reviewers to verify that changes to the code base do not
+cause regressions, or to analyze test failures when they do occur.
+
+Every teuthology cluster, whether bare-metal or cloud-provisioned, has a
+so-called "teuthology machine" from which tests suites are triggered using the
+`teuthology-suite`_ command.
+
+A detailed and up-to-date description of each `teuthology-suite`_ option is
+available by running the following command on the teuthology machine::
+
+   $ teuthology-suite --help
+
+How integration tests are defined
+---------------------------------
+
+Integration tests are defined by yaml files found in the ``suites``
+subdirectory of the `ceph-qa-suite repository`_ and implemented by python
+code found in the ``tasks`` subdirectory. Some tests ("standalone tests")
+are defined in a single yaml file, while other tests are defined by a
+directory tree containing yaml files that are combined, at runtime, into a
+larger yaml file.
+
+Reading a standalone test
+-------------------------
+
+Let us first examine a standalone test, or "singleton". 
+
+Here is a commented example using the integration test
+`rados/singleton/all/admin-socket.yaml
+<https://github.com/ceph/ceph-qa-suite/blob/master/suites/rados/singleton/all/admin-socket.yaml>`_
+::
+
+      roles:
+      - - mon.a
+        - osd.0
+        - osd.1
+      tasks:
+      - install:
+      - ceph:
+      - admin_socket:
+          osd.0:
+            version:
+            git_version:
+            help:
+            config show:
+            config set filestore_dump_file /tmp/foo:
+            perf dump:
+            perf schema:
+
+The ``roles`` array determines the composition of the cluster (how
+many MONs, OSDs, etc.) on which this test is designed to run, as well
+as how these roles will be distributed over the machines in the
+testing cluster. In this case, there is only one element in the
+top-level array: therefore, only one machine is allocated to the
+test. The nested array declares that this machine shall run a MON with
+id ``a`` (that is the ``mon.a`` in the list of roles) and two OSDs
+(``osd.0`` and ``osd.1``).
+
+The body of the test is in the ``tasks`` array: each element is
+evaluated in order, causing the corresponding python file found in the
+``tasks`` subdirectory of the `teuthology repository`_ or
+`ceph-qa-suite repository`_ to be run. "Running" in this case means calling
+the ``task()`` function defined in that file.
+
+In this case, the `install
+<https://github.com/ceph/teuthology/blob/master/teuthology/task/install.py>`_
+task comes first. It installs the Ceph packages on each machine (as
+defined by the ``roles`` array). A full description of the ``install``
+task is `found in the python file
+<https://github.com/ceph/teuthology/blob/master/teuthology/task/install.py>`_
+(search for "def task").
+
+The ``ceph`` task, which is documented `here
+<https://github.com/ceph/ceph-qa-suite/blob/master/tasks/ceph.py>`_ (again,
+search for "def task"), starts OSDs and MONs (and possibly MDSs as well)
+as required by the ``roles`` array. In this example, it will start one MON
+(``mon.a``) and two OSDs (``osd.0`` and ``osd.1``), all on the same
+machine. Control moves to the next task when the Ceph cluster reaches
+``HEALTH_OK`` state.
+
+The next task is ``admin_socket`` (`source code
+<https://github.com/ceph/ceph-qa-suite/blob/master/tasks/admin_socket.py>`_).
+The parameter of the ``admin_socket`` task (and any other task) is a
+structure which is interpreted as documented in the task. In this example
+the parameter is a set of commands to be sent to the admin socket of
+``osd.0``. The task verifies that each of them returns on success (i.e.
+exit code zero).
+
+This test can be run with::
+
+    $ teuthology-suite --suite rados/singleton/all/admin-socket.yaml
+
+Test descriptions 
+-----------------
+
+Each test has a "test description", which is similar to a directory path,
+but not the same. In the case of a standalone test, like the one in
+`Reading a standalone test`_, the test description is identical to the
+relative path (starting from the ``suites/`` directory of the
+`ceph-qa-suite repository`_) of the yaml file defining the test.
+
+Much more commonly, tests are defined not by a single yaml file, but by a
+`directory tree of yaml files`. At runtime, the tree is walked and all yaml
+files (facets) are combined into larger yaml "programs" that define the
+tests. A full listing of the yaml defining the test is included at the
+beginning of every test log.
+
+In these cases, the description of each test consists of the
+subdirectory under `suites/
+<https://github.com/ceph/ceph-qa-suite/tree/master/suites>`_ containing the
+yaml facets, followed by an expression in curly braces (``{}``) consisting of
+a list of yaml facets in order of concatenation. For instance the
+test description::
+
+  ceph-disk/basic/{distros/centos_7.0.yaml tasks/ceph-disk.yaml}
+
+signifies the concatenation of two files:
+
+* ceph-disk/basic/distros/centos_7.0.yaml
+* ceph-disk/basic/tasks/ceph-disk.yaml
+
+How are tests built from directories?
+-------------------------------------
+
+As noted in the previous section, most tests are not defined in a single
+yaml file, but rather as a `combination` of files collected from a
+directory tree within the ``suites/`` subdirectory of the `ceph-qa-suite repository`_. 
+
+The set of all tests defined by a given subdirectory of ``suites/`` is
+called an "integration test suite", or a "teuthology suite".
+
+Combination of yaml facets is controlled by special files (``%`` and
+``+``) that are placed within the directory tree and can be thought of as
+operators.  The ``%`` file is the "convolution" operator and ``+``
+signifies concatenation.
+
+Convolution operator
+--------------------
+
+The convolution operator, implemented as an empty file called ``%``, tells
+teuthology to construct a test matrix from yaml facets found in
+subdirectories below the directory containing the operator.
+
+For example, the `ceph-disk suite
+<https://github.com/ceph/ceph-qa-suite/tree/jewel/suites/ceph-disk/>`_ is
+defined by the ``suites/ceph-disk/`` tree, which consists of the files and
+subdirectories in the following structure::
+
+  directory: ceph-disk/basic
+      file: %
+      directory: distros
+         file: centos_7.0.yaml
+         file: ubuntu_14.04.yaml
+      directory: tasks
+         file: ceph-disk.yaml
+
+This is interpreted as a 2x1 matrix consisting of two tests: 
+
+1. ceph-disk/basic/{distros/centos_7.0.yaml tasks/ceph-disk.yaml}
+2. ceph-disk/basic/{distros/ubuntu_14.04.yaml tasks/ceph-disk.yaml}
+
+i.e. the concatenation of centos_7.0.yaml and ceph-disk.yaml and
+the concatenation of ubuntu_14.04.yaml and ceph-disk.yaml, respectively.
+In human terms, this means that the task found in ``ceph-disk.yaml`` is
+intended to run on both CentOS 7.0 and Ubuntu 14.04.
+
+Without the file percent, the ``ceph-disk`` tree would be interpreted as
+three standalone tests:
+
+* ceph-disk/basic/distros/centos_7.0.yaml
+* ceph-disk/basic/distros/ubuntu_14.04.yaml
+* ceph-disk/basic/tasks/ceph-disk.yaml
+
+(which would of course be wrong in this case).
+
+Referring to the `ceph-qa-suite repository`_, you will notice that the
+``centos_7.0.yaml`` and ``ubuntu_14.04.yaml`` files in the
+``suites/ceph-disk/basic/distros/`` directory are implemented as symlinks.
+By using symlinks instead of copying, a single file can appear in multiple
+suites. This eases the maintenance of the test framework as a whole.
+
+All the tests generated from the ``suites/ceph-disk/`` directory tree
+(also known as the "ceph-disk suite") can be run with::
+
+  $ teuthology-suite --suite ceph-disk
+
+An individual test from the `ceph-disk suite`_ can be run by adding the
+``--filter`` option::
+
+  $ teuthology-suite \
+      --suite ceph-disk/basic \
+      --filter 'ceph-disk/basic/{distros/ubuntu_14.04.yaml tasks/ceph-disk.yaml}'
+
+.. note: To run a standalone test like the one in `Reading a standalone
+   test`_, ``--suite`` alone is sufficient. If you want to run a single
+   test from a suite that is defined as a directory tree, ``--suite`` must
+   be combined with ``--filter``. This is because the ``--suite`` option
+   understands POSIX relative paths only.
+
+Concatenation operator
+----------------------
+
+For even greater flexibility in sharing yaml files between suites, the
+special file plus (``+``) can be used to concatenate files within a
+directory. For instance, consider the `suites/rbd/thrash
+<https://github.com/ceph/ceph-qa-suite/tree/master/suites/rbd/thrash>`_
+tree::
+
+  directory: rbd/thrash
+    file: %
+    directory: clusters
+      file: +
+      file: fixed-2.yaml
+      file: openstack.yaml
+    directory: workloads
+      file: rbd_api_tests_copy_on_read.yaml
+      file: rbd_api_tests.yaml
+
+This creates two tests:
+
+* rbd/thrash/{clusters/fixed-2.yaml clusters/openstack.yaml workloads/rbd_api_tests_copy_on_read.yaml}
+* rbd/thrash/{clusters/fixed-2.yaml clusters/openstack.yaml workloads/rbd_api_tests.yaml}
+
+Because the ``clusters/`` subdirectory contains the special file plus
+(``+``), all the other files in that subdirectory (``fixed-2.yaml`` and
+``openstack.yaml`` in this case) are concatenated together
+and treated as a single file. Without the special file plus, they would
+have been convolved with the files from the workloads directory to create
+a 2x2 matrix:
+
+* rbd/thrash/{clusters/openstack.yaml workloads/rbd_api_tests_copy_on_read.yaml}
+* rbd/thrash/{clusters/openstack.yaml workloads/rbd_api_tests.yaml}
+* rbd/thrash/{clusters/fixed-2.yaml workloads/rbd_api_tests_copy_on_read.yaml}
+* rbd/thrash/{clusters/fixed-2.yaml workloads/rbd_api_tests.yaml}
+
+The ``clusters/fixed-2.yaml`` file is shared among many suites to
+define the following ``roles``::
+
+  roles:
+  - [mon.a, mon.c, osd.0, osd.1, osd.2, client.0]
+  - [mon.b, osd.3, osd.4, osd.5, client.1]
+
+The ``rbd/thrash`` suite as defined above, consisting of two tests, 
+can be run with::
+
+  $ teuthology-suite --suite rbd/thrash
+
+A single test from the rbd/thrash suite can be run by adding the
+``--filter`` option::
+
+  $ teuthology-suite \
+      --suite rbd/thrash \
+      --filter 'rbd/thrash/{clusters/fixed-2.yaml clusters/openstack.yaml workloads/rbd_api_tests_copy_on_read.yaml}'
+
+Filtering tests by their description
+------------------------------------
+
+When a few jobs fail and need to be run again, the ``--filter`` option
+can be used to select tests with a matching description. For instance, if the
+``rados`` suite fails the `all/peer.yaml <https://github.com/ceph/ceph-qa-suite/blob/master/suites/rados/singleton/all/peer.yaml>`_ test, the following will only run the tests that contain this file::
+
+  teuthology-suite --suite rados --filter all/peer.yaml
+
+The ``--filter-out`` option does the opposite (it matches tests that do
+`not` contain a given string), and can be combined with the ``--filter``
+option.
+
+Both ``--filter`` and ``--filter-out`` take a comma-separated list of strings (which
+means the comma character is implicitly forbidden in filenames found in the
+`ceph-qa-suite repository`_). For instance::
+
+  teuthology-suite --suite rados --filter all/peer.yaml,all/rest-api.yaml
+
+will run tests that contain either
+`all/peer.yaml <https://github.com/ceph/ceph-qa-suite/blob/master/suites/rados/singleton/all/peer.yaml>`_
+or
+`all/rest-api.yaml <https://github.com/ceph/ceph-qa-suite/blob/master/suites/rados/singleton/all/rest-api.yaml>`_
+
+Each string is looked up anywhere in the test description and has to
+be an exact match: they are not regular expressions.
+
+Reducing the number of tests
+----------------------------
+
+The ``rados`` suite generates thousands of tests out of a few hundred
+files. For instance, all tests in the `rados/thrash suite
+<https://github.com/ceph/ceph-qa-suite/tree/master/suites/rados/thrash>`_
+run for ``xfs``, ``btrfs`` and ``ext4`` because they are combined (via
+special file ``%``) with the `fs directory
+<https://github.com/ceph/ceph-qa-suite/tree/master/suites/rados/thrash/fs>`_
+
+All integration tests are required to be run before a Ceph release is published. 
+When merely verifying whether a contribution can be merged without
+risking a trivial regression, it is enough to run a subset. The ``--subset`` option can be used to
+reduce the number of tests that are triggered. For instance::
+
+  teuthology-suite --suite rados --subset 0/4000
+
+will run as few tests as possible. The tradeoff in this case is that
+some tests will only run on ``xfs`` and not on ``ext4`` or ``btrfs``,
+but no matter how small a ratio is provided in the ``--subset``,
+teuthology will still ensure that all files in the suite are in at
+least one test. Understanding the actual logic that drives this
+requires reading the teuthology source code.
+
+The ``--limit`` option only runs the first ``N`` tests in the suite:
+this is rarely useful, however, because there is no way to control which
+test will be first.
+
+Testing in the cloud
+====================
+
+In this chapter, we will explain in detail how use an OpenStack
+tenant as an environment for Ceph integration testing.
+
+Assumptions and caveat
+----------------------
+
+We assume that:
+
+1. you are the only person using the tenant
+2. you have the credentials
+3. the tenant supports the ``nova`` and ``cinder`` APIs
+4. you have not tried to use ``ceph-workbench`` with this tenant before
+
+Caveat: be aware that, as of this writing (March 2016), testing in
+OpenStack clouds is a new feature. Things may not work as advertised.
+If you run into trouble, ask for help on `IRC`_ or the `Mailing list`_, or
+open a bug report at `ceph-workbench bug tracker URL`_.
+
+Getting ceph-workbench
+----------------------
+
+Since testing in the cloud is done using the `ceph-workbench
+ceph-qa-suite`_ tool, you will need to install that first. It is designed
+to be installed via Docker, so if you don't have Docker running on your
+development machine, take care of that first. The Docker project has a good
+tutorial called `Get Started with Docker Engine for Linux
+<https://docs.docker.com/linux/>`_ if you unsure how to proceed.
+
+Once Docker is up and running, install ``ceph-workbench`` by following the
+`Installation instructions in the ceph-workbench documentation
+<http://ceph-workbench.readthedocs.org/en/latest/#installation>`_::
+
+Linking ceph-workbench with your OpenStack tenant
+-------------------------------------------------
+
+Before you can trigger your first teuthology suite, you will need to link
+``ceph-workbench`` with your OpenStack account. 
+
+First, download a ``openrc.sh`` file by clicking on the "Download OpenStack
+RC File" button, which can be found in the "API Access" tab of the "Access
+& Security" dialog of the OpenStack Horizon dashboard.
+
+Second, create a ``~/.ceph-workbench`` directory, set its permissions to
+700, and move the ``openrc.sh`` file into it. Make sure that the filename
+is exactly ``~/.ceph-workbench/openrc.sh``.
+
+Third, edit the file so it does not ask for your OpenStack password
+interactively. Comment out the relevant lines and replace them with
+something like::
+
+    export OS_PASSWORD="aiVeth0aejee3eep8rogho3eep7Pha6ek"
+
+When `ceph-workbench ceph-qa-suite`_ connects to your OpenStack tenant for
+the first time, it will generate two keypairs: ``teuthology-myself`` and
+``teuthology``. 
+
+.. If this is not the first time you have tried to use
+.. `ceph-workbench ceph-qa-suite`_ with this tenant, make sure to delete any
+.. stale keypairs with these names!
+
+Run the dummy suite
+-------------------
+
+You are now ready to take your OpenStack teuthology setup for a test
+drive::
+
+    $ ceph-workbench ceph-qa-suite --suite dummy
+
+Be forewarned that the first run of `ceph-workbench ceph-qa-suite`_ on a
+pristine tenant will take a long time to complete because it downloads a VM
+image and during this time the command may not produce any output. 
+
+The images are cached in OpenStack, so they are only downloaded once.
+Subsequent runs of the same command will complete faster.
+
+Although ``dummy`` suite does not run any tests, in all other respects it
+behaves just like a teuthology suite and produces some of the same
+artifacts (see `Artifacts produced by teuthology-suite`_).
+
+The last bit of output should look something like this::
+
+  pulpito web interface: http://149.202.168.201:8081/
+  ssh access           : ssh -i /home/smithfarm/.ceph-workbench/teuthology-myself.pem ubuntu at 149.202.168.201 # logs in /usr/share/nginx/html
+
+What this means is that `ceph-workbench ceph-qa-suite`_ triggered the test
+suite run. It does not mean that the suite run has completed. To monitor
+progress of the run, check the Pulpito web interface URL periodically, or
+if you are impatient, ssh to the teuthology machine using the ssh command
+shown and do::
+
+    $ tail -f /var/log/teuthology.*
+
+The `/usr/share/nginx/html` directory contains the complete logs of the
+test suite. If we had provided the ``--upload`` option to the
+`ceph-workbench ceph-qa-suite`_ command, these logs would have been
+uploaded to http://teuthology-logs.public.ceph.com.
+
+Run a standalone test
+---------------------
+
+The standalone test explained in `Reading a standalone test`_ can be run
+with the following command::
+
+    $ ceph-workbench ceph-qa-suite --suite rados/singleton/all/admin-socket.yaml
+
+This will run the suite shown on the current ``master`` branch of
+``ceph/ceph.git``. You can specify a different branch with the ``--ceph``
+option, and even a different git repo with the ``--ceph-git-url`` option. (Run
+``ceph-workbench ceph-qa-suite --help`` for an up-to-date list of available
+options.)
+
+The first run of a suite will also take a long time, because ceph packages
+have to be built, first. Again, the packages so built are cached and
+`ceph-workbench ceph-qa-suite`_ will not build identical packages a second
+time.
+
+Interrupt a running suite
+-------------------------
+
+Teuthology suites take time to run. From time to time one may wish to
+interrupt a running suite. One obvious way to do this is::
+
+    ceph-workbench ceph-qa-suite --teardown
+
+This destroys all VMs created by `ceph-workbench ceph-qa-suite`_ and
+returns the OpenStack tenant to a "clean slate".
+
+Sometimes you may wish to interrupt the running suite, but keep the logs,
+the teuthology VM, the packages-repository VM, etc. To do this, you can
+``ssh`` to the teuthology VM (using the ``ssh access`` command reported
+when you triggered the suite -- see `Run the dummy suite`_) and, once
+there::
+
+    sudo /etc/init.d/teuthology restart
+
+This will keep the teuthology machine, the logs and the packages-repository
+instance but nuke everything else.
+
+Deploy a cluster for manual testing
+-----------------------------------
+
+The `teuthology framework`_ and `ceph-workbench ceph-qa-suite`_ are 
+versatile tools that automatically provision Ceph clusters in the cloud and
+run various tests on them in an automated fashion. This enables a single
+engineer, in a matter of hours, to perform thousands of tests that would
+keep dozens of human testers occupied for days or weeks if conducted
+manually.
+
+However, there are times when the automated tests do not cover a particular
+scenario and manual testing is desired. It turns out that it is simple to
+adapt a test to stop and wait after the Ceph installation phase, and the
+engineer can then ssh into the running cluster.
+
+This common use case is currently provided for by the following command::
+
+   ceph-workbench ceph-qa-suite --simultaneous-jobs 9 --verbose
+   --teuthology-git-url http://github.com/dachary/teuthology
+   --teuthology-branch openstack --ceph-qa-suite-git-url
+   http://github.com/dachary/ceph-qa-suite --suite-branch wip-ceph-disk
+   --ceph-git-url http://github.com/ceph/ceph --ceph jewel --suite
+   ceph-disk --filter ubuntu_14
+
+This builds packages from the Ceph git repository and branch specified in
+the ``--ceph-git-url`` and ``--ceph`` options, respectively, provisions VMs
+in OpenStack, installs the packages, and deploys a Ceph cluster on them.
+Then, instead of running automated tests, it stops and enters a wait loop.
+
+The VMs (or "instances" in OpenStack terminology) created by
+`ceph-workbench ceph-qa-suite`_ are named as follows:
+
+``teuthology`` - the teuthology machine
+
+``packages-repository`` - VM where packages are stored
+
+``ceph-*`` - VM where packages are built
+
+``target*`` - machines where tests are run
+
+The VMs named ``target*`` are used by tests. If you are monitoring the
+teuthology log for a given test, the hostnames of these target machines can
+be found out by searching for the string ``Locked targets``::
+
+    2016-03-20T11:39:06.166 INFO:teuthology.task.internal:Locked targets:
+      target149202171058.teuthology: null
+      target149202171059.teuthology: null
+
+The IP addresses of the target machines can be found by running
+``openstack server list`` on the teuthology machine.
+
+The whole process, which takes some time to complete, can be monitored as
+described in `Run the dummy suite`_. Be patient.
+
+Once the target machines are up and running and the test enters its wait
+loop, the engineer can ssh into the target machines and do whatever manual
+testing is required. Use the teuthology machine as jump host.
+
+
+.. WIP
+.. ===
+..
+.. Artifacts produced by teuthology-suite
+.. --------------------------------------
+.. 
+.. This section examines the files (artifacts) produced by
+.. ``teuthology-suite``. These files are FIXME
+.. 
+..
+.. Backporting
+.. -----------
+..
+.. Building RPM packages
+.. ---------------------
+..
+.. Ceph is regularly built and packaged for a number of major Linux
+.. distributions. At the time of this writing, these included CentOS, Debian,
+.. Fedora, openSUSE, and Ubuntu.
+..
+.. Architecture
+.. ============
+.. 
+.. Ceph is a collection of components built on top of RADOS and provide
+.. services (RBD, RGW, CephFS) and APIs (S3, Swift, POSIX) for the user to
+.. store and retrieve data.
+.. 
+.. See :doc:`/architecture` for an overview of Ceph architecture. The
+.. following sections treat each of the major architectural components
+.. in more detail, with links to code and tests.
+.. 
+.. FIXME The following are just stubs. These need to be developed into
+.. detailed descriptions of the various high-level components (RADOS, RGW,
+.. etc.) with breakdowns of their respective subcomponents.
+.. 
+.. FIXME Later, in the Testing chapter I would like to take another look
+.. at these components/subcomponents with a focus on how they are tested.
+.. 
+.. RADOS
+.. -----
+.. 
+.. RADOS stands for "Reliable, Autonomic Distributed Object Store". In a Ceph
+.. cluster, all data are stored in objects, and RADOS is the component responsible
+.. for that.
+.. 
+.. RADOS itself can be further broken down into Monitors, Object Storage Daemons
+.. (OSDs), and client APIs (librados). Monitors and OSDs are introduced at
+.. :doc:`/start/intro`. The client library is explained at
+.. :doc:`/rados/api/index`.
+.. 
+.. RGW
+.. ---
+.. 
+.. RGW stands for RADOS Gateway. Using the embedded HTTP server civetweb_ or
+.. Apache FastCGI, RGW provides a REST interface to RADOS objects.
+.. 
+.. .. _civetweb: https://github.com/civetweb/civetweb
+.. 
+.. A more thorough introduction to RGW can be found at :doc:`/radosgw/index`.
+.. 
+.. RBD
+.. ---
+.. 
+.. RBD stands for RADOS Block Device. It enables a Ceph cluster to store disk
+.. images, and includes in-kernel code enabling RBD images to be mounted.
+.. 
+.. To delve further into RBD, see :doc:`/rbd/rbd`.
+.. 
+.. CephFS
+.. ------
+.. 
+.. CephFS is a distributed file system that enables a Ceph cluster to be used as a NAS.
+.. 
+.. File system metadata is managed by Meta Data Server (MDS) daemons. The Ceph
+.. file system is explained in more detail at :doc:`/cephfs/index`.
+..
diff --git a/doc/dev/kernel-client-troubleshooting.rst b/doc/dev/kernel-client-troubleshooting.rst
new file mode 100644
index 0000000..59e4761
--- /dev/null
+++ b/doc/dev/kernel-client-troubleshooting.rst
@@ -0,0 +1,17 @@
+====================================
+ Kernel client troubleshooting (FS)
+====================================
+
+If there is an issue with the cephfs kernel client, the most important thing is
+figuring out whether the problem is with the client or the MDS. Generally,
+this is easy to work out. If the kernel client broke directly, there
+will be output in dmesg. Collect it and any appropriate kernel state. If
+the problem is with the MDS, there will be hung requests that the client
+is waiting on. Look in ``/sys/kernel/debug/ceph/*/`` and cat the ``mdsc`` file to
+get a listing of requests in progress. If one of them remains there, the
+MDS has probably "forgotten" it.
+We can get hints about what's going on by dumping the MDS cache:
+ceph mds tell 0 dumpcache /tmp/dump.txt
+
+And if high logging levels are set on the MDS, that will almost certainly
+hold the information we need to diagnose and solve the issue.
diff --git a/doc/dev/libs.rst b/doc/dev/libs.rst
new file mode 100644
index 0000000..203dd38
--- /dev/null
+++ b/doc/dev/libs.rst
@@ -0,0 +1,18 @@
+======================
+ Library architecture
+======================
+
+Ceph is structured into libraries which are built and then combined together to
+make executables and other libraries.
+
+- libcommon: a collection of utilities which are available to nearly every ceph
+  library and executable. In general, libcommon should not contain global
+  variables, because it is intended to be linked into libraries such as
+  libcephfs.so.
+
+- libglobal: a collection of utilities focused on the needs of Ceph daemon
+  programs. In here you will find pidfile management functions, signal
+  handlers, and so forth.
+
+.. todo:: document other libraries
+
diff --git a/doc/dev/logs.rst b/doc/dev/logs.rst
new file mode 100644
index 0000000..7fda64f
--- /dev/null
+++ b/doc/dev/logs.rst
@@ -0,0 +1,57 @@
+============
+ Debug logs
+============
+
+The main debugging tool for Ceph is the dout and derr logging functions.
+Collectively, these are referred to as "dout logging."
+
+Dout has several log faculties, which can be set at various log
+levels using the configuration management system. So it is possible to enable
+debugging just for the messenger, by setting debug_ms to 10, for example.
+
+Dout is implemented mainly in common/DoutStreambuf.cc
+
+The dout macro avoids even generating log messages which are not going to be
+used, by enclosing them in an "if" statement. What this means is that if you
+have the debug level set at 0, and you run this code::
+
+	dout(20) << "myfoo() = " << myfoo() << dendl;
+
+
+myfoo() will not be called here.
+
+Unfortunately, the performance of debug logging is relatively low. This is
+because there is a single, process-wide mutex which every debug output
+statement takes, and every debug output statement leads to a write() system
+call or a call to syslog(). There is also a computational overhead to using C++
+streams to consider. So you will need to be parsimonious in your logging to get
+the best performance.
+
+Sometimes, enabling logging can hide race conditions and other bugs by changing
+the timing of events. Keep this in mind when debugging.
+
+Performance counters
+====================
+
+Ceph daemons use performance counters to track key statistics like number of
+inodes pinned. Performance counters are essentially sets of integers and floats
+which can be set, incremented, and read using the PerfCounters API.
+
+A PerfCounters object is usually associated with a single subsystem.  It
+contains multiple counters. This object is thread-safe because it is protected
+by an internal mutex. You can create multiple PerfCounters objects.
+
+Currently, three types of performance counters are supported: u64 counters,
+float counters, and long-run floating-point average counters. These are created
+by PerfCountersBuilder::add_u64, PerfCountersBuilder::add_fl, and
+PerfCountersBuilder::add_fl_avg, respectively. u64 and float counters simply
+provide a single value which can be updated, incremented, and read atomically.
+floating-pointer average counters provide two values: the current total, and
+the number of times the total has been changed. This is intended to provide a
+long-run average value.
+
+Performance counter information can be read in JSON format from the
+administrative socket (admin_sock). This is implemented as a UNIX domain
+socket. The Ceph performance counter plugin for collectd shows an example of how
+to access this information. Another example can be found in the unit tests for
+the administrative sockets.
diff --git a/doc/dev/mds_internals/data-structures.rst b/doc/dev/mds_internals/data-structures.rst
new file mode 100644
index 0000000..1197b62
--- /dev/null
+++ b/doc/dev/mds_internals/data-structures.rst
@@ -0,0 +1,36 @@
+MDS internal data structures
+==============================
+
+*CInode*
+  CInode contains the metadata of a file, there is one CInode for each file.
+  The CInode stores information like who owns the file, how big the file is.
+
+*CDentry*
+  CDentry is the glue that holds inodes and files together by relating inode to
+  file/directory names. A CDentry links to at most one CInode (it may not link
+  to any CInode). A CInode may be linked by multiple CDentries.
+
+*CDir*
+  CDir only exists for directory inode, it's used to link CDentries under the
+  directory. A CInode can have multiple CDir when the directory is fragmented.
+
+These data structures are linked together as::
+
+  CInode
+  CDir
+   |   \
+   |      \
+   |         \
+  CDentry   CDentry
+  CInode    CInode
+  CDir      CDir
+   |         |  \
+   |         |     \
+   |         |        \
+  CDentry   CDentry  CDentry
+  CInode    CInode   CInode
+
+As this doc is being written, size of CInode is about 1400 bytes, size of CDentry
+is about 400 bytes, size of CDir is about 700 bytes. These data structures are
+quite large. Please be careful if you want to add new fields to them.
+
diff --git a/doc/dev/mds_internals/index.rst b/doc/dev/mds_internals/index.rst
new file mode 100644
index 0000000..c8c82ad
--- /dev/null
+++ b/doc/dev/mds_internals/index.rst
@@ -0,0 +1,10 @@
+==============================
+MDS developer documentation
+==============================
+
+.. rubric:: Contents
+
+.. toctree::
+   :glob:
+
+   *
diff --git a/doc/dev/messenger.rst b/doc/dev/messenger.rst
new file mode 100644
index 0000000..2b1a888
--- /dev/null
+++ b/doc/dev/messenger.rst
@@ -0,0 +1,33 @@
+============================
+ Messenger notes
+============================
+
+Messenger is the Ceph network layer implementation. Currently Ceph supports
+three messenger type "simple", "async" and "xio". The latter two are both
+experiment features and shouldn't use them in production environment.
+
+ceph_perf_msgr
+==============
+
+ceph_perf_msgr is used to do benchmark for messenger module only and can help
+to find the bottleneck or time consuming within messenger moduleIt just like
+"iperf", we need to start server-side program firstly:
+
+# ./ceph_perf_msgr_server 172.16.30.181:10001 0
+
+The first argument is ip:port pair which is telling the destination address the
+client need to specified. The second argument tells the "think time" when
+dispatching messages. After Giant, CEPH_OSD_OP message which is the actual client
+read/write io request is fast dispatched without queueing to Dispatcher, in order
+to achieve better performance. So CEPH_OSD_OP message will be processed inline,
+"think time" is used by mock this "inline process" process.
+
+# ./ceph_perf_msgr_client 172.16.30.181:10001 1 32 10000 10 4096 
+
+The first argument is specified the server ip:port, and the second argument is
+used to specify client threads. The third argument specify the concurrency(the
+max inflight messages for each client thread), the fourth argument specify the
+io numbers will be issued to server per client thread. The fifth argument is
+used to indicate the "think time" for client thread when receiving messages,
+this is also used to mock the client fast dispatch process. The last argument
+specify the message data length to issue.
diff --git a/doc/dev/mon-bootstrap.rst b/doc/dev/mon-bootstrap.rst
new file mode 100644
index 0000000..75c8a5e
--- /dev/null
+++ b/doc/dev/mon-bootstrap.rst
@@ -0,0 +1,199 @@
+===================
+ Monitor bootstrap
+===================
+
+Terminology:
+
+* ``cluster``: a set of monitors
+* ``quorum``: an active set of monitors consisting of a majority of the cluster
+
+In order to initialize a new monitor, it must always be fed:
+
+#. a logical name
+#. secret keys
+#. a cluster fsid (uuid)
+
+In addition, a monitor needs to know two things:
+
+#. what address to bind to
+#. who its peers are (if any)
+
+There are a range of ways to do both.
+
+Logical id
+==========
+
+The logical id should be unique across the cluster.  It will be
+appended to ``mon.`` to logically describe the monitor in the Ceph
+cluster.  For example, if the logical id is ``foo``, the monitor's
+name will be ``mon.foo``.
+
+For most users, there is no more than one monitor per host, which
+makes the short hostname logical choice.
+
+Secret keys
+===========
+
+The ``mon.`` secret key is stored a ``keyring`` file in the ``mon data`` directory.  It can be generated
+with a command like::
+
+        ceph-authtool --create-keyring /path/to/keyring --gen-key -n mon.
+
+When creating a new monitor cluster, the keyring should also contain a ``client.admin`` key that can be used
+to administer the system::
+
+        ceph-authtool /path/to/keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
+
+The resulting keyring is fed to ``ceph-mon --mkfs`` with the ``--keyring <keyring>`` command-line argument.
+
+Cluster fsid
+============
+
+The cluster fsid is a normal uuid, like that generated by the ``uuidgen`` command.  It
+can be provided to the monitor in two ways:
+
+#. via the ``--fsid <uuid>`` command-line argument (or config file option)
+#. via a monmap provided to the new monitor via the ``--monmap <path>`` command-line argument.
+
+Monitor address
+===============
+
+The monitor address can be provided in several ways.
+
+#. via the ``--public-addr <ip[:port]>`` command-line option (or config file option)
+#. via the ``--public-network <cidr>`` command-line option (or config file option)
+#. via the monmap provided via ``--monmap <path>``, if it includes a monitor with our name
+#. via the bootstrap monmap (provided via ``--inject-monmap <path>`` or generated from ``--mon-host <list>``) if it includes a monitor with no name (``noname-<something>``) and an address configured on the local host.
+
+Peers
+=====
+
+The monitor peers are provided in several ways:
+
+#. via the initial monmap, provided via ``--monmap <filename>``
+#. via the bootstrap monmap generated from ``--mon-host <list>``
+#. via the bootstrap monmap generated from ``[mon.*]`` sections with ``mon addr`` in the config file
+#. dynamically via the admin socket
+
+However, these methods are not completely interchangeable because of
+the complexity of creating a new monitor cluster without danger of
+races.
+
+Cluster creation
+================
+
+There are three basic approaches to creating a cluster:
+
+#. Create a new cluster by specifying the monitor names and addresses ahead of time.
+#. Create a new cluster by specifying the monitor names ahead of time, and dynamically setting the addresses as ``ceph-mon`` daemons configure themselves.
+#. Create a new cluster by specifying the monitor addresses ahead of time.
+
+
+Names and addresses
+-------------------
+
+Generate a monmap using ``monmaptool`` with the names and addresses of the initial
+monitors.  The generated monmap will also include a cluster fsid.  Feed that monmap
+to each monitor daemon::
+
+        ceph-mon --mkfs -i <name> --monmap <initial_monmap> --keyring <initial_keyring>
+
+When the daemons start, they will know exactly who they and their peers are.
+
+
+Addresses only
+--------------
+
+The initial monitor addresses can be specified with the ``mon host`` configuration value,
+either via a config file or the command-line argument.  This method has the advantage that
+a single global config file for the cluster can have a line like::
+
+     mon host = a.foo.com, b.foo.com, c.foo.com
+
+and will also serve to inform any ceph clients or daemons who the monitors are.
+
+The ``ceph-mon`` daemons will need to be fed the initial keyring and cluster fsid to 
+initialize themselves:
+
+     ceph-mon --mkfs -i <name> --fsid <uuid> --keyring <initial_keyring>
+
+When the daemons first start up, they will share their names with each other and form a
+new cluster.
+
+Names only
+----------
+
+In dynamic "cloud" environments, the cluster creator may not (yet)
+know what the addresses of the monitors are going to be.  Instead,
+they may want machines to configure and start themselves in parallel
+and, as they come up, form a new cluster on their own.  The problem is
+that the monitor cluster relies on strict majorities to keep itself
+consistent, and in order to "create" a new cluster, it needs to know
+what the *initial* set of monitors will be.
+
+This can be done with the ``mon initial members`` config option, which
+should list the ids of the initial monitors that are allowed to create
+the cluster::
+
+     mon initial members = foo, bar, baz
+
+The monitors can then be initialized by providing the other pieces of
+information (they keyring, cluster fsid, and a way of determining
+their own address).  For example::
+
+     ceph-mon --mkfs -i <name> --mon-initial-hosts 'foo,bar,baz' --keyring <initial_keyring> --public-addr <ip>
+
+When these daemons are started, they will know their own address, but
+not their peers.  They can learn those addresses via the admin socket::
+
+     ceph daemon mon.<id> add_bootstrap_peer_hint <peer ip>
+
+Once they learn enough of their peers from the initial member set,
+they will be able to create the cluster.
+
+
+Cluster expansion
+=================
+
+Cluster expansion is slightly less demanding than creation, because
+the creation of the initial quorum is not an issue and there is no
+worry about creating separately independent clusters.
+
+New nodes can be forced to join an existing cluster in two ways:
+
+#. by providing no initial monitor peers addresses, and feeding them dynamically.
+#. by specifying the ``mon initial members`` config option to prevent the new nodes from forming a new, independent cluster, and feeding some existing monitors via any available method.
+
+Initially peerless expansion
+----------------------------
+
+Create a new monitor and give it no peer addresses other than it's own.  For
+example::
+
+     ceph-mon --mkfs -i <myid> --fsid <fsid> --keyring <mon secret key> --public-addr <ip>
+
+Once the daemon starts, you can give it one or more peer addresses to join with::
+
+     ceph daemon mon.<id> add_bootstrap_peer_hint <peer ip>
+
+This monitor will never participate in cluster creation; it can only join an existing
+cluster.
+
+Expanding with initial members
+------------------------------
+
+You can feed the new monitor some peer addresses initially and avoid badness by also
+setting ``mon initial members``.  For example::
+
+     ceph-mon --mkfs -i <myid> --fsid <fsid> --keyring <mon secret key> --public-addr <ip> --mon-host foo,bar,baz
+
+When the daemon is started, ``mon initial members`` must be set via the command line or config file::
+
+     ceph-mon -i <myid> --mon-initial-members foo,bar,baz
+
+to prevent any risk of split-brain.
+  
+
+
+
+
diff --git a/doc/dev/network-encoding.rst b/doc/dev/network-encoding.rst
new file mode 100644
index 0000000..51d030e
--- /dev/null
+++ b/doc/dev/network-encoding.rst
@@ -0,0 +1,214 @@
+==================
+ Network Encoding
+==================
+
+This describes the encoding used to serialize data.  It doesn't cover specific
+objects/messages but focuses on the base types.
+
+The types are not self documenting in any way.  They can not be decoded unless
+you know what they are.
+
+Conventions
+===========
+
+Integers
+--------
+
+The integer types used will be named ``{signed}{size}{endian}``.  For example
+``u16le`` is an unsigned 16 bit integer encoded in little endian byte order
+while ``s64be`` is a signed 64 bit integer in big endian.  Additionally ``u8``
+and ``s8`` will represent signed and unsigned bytes respectively.  Signed
+integers use two's complement encoding.
+
+Complex Types
+-------------
+
+This document will use a c-like syntax for describing structures.  The
+structure represents the data that will go over the wire.  There will be no
+padding between the elements and the elements will be sent in the order they
+appear.  For example::
+
+	struct foo {
+		u8    tag;
+		u32le data;
+	}
+
+When encoding the values ``0x05`` and ``0x12345678`` respectively will appear on
+the wire as ``05 78 56 34 12``.
+
+Variable Arrays
+---------------
+
+Unlike c, length arrays can be used anywhere in structures and will be inline in
+the protocol.  Furthermore the length may be described using an earlier item in
+the structure.
+
+::
+	
+	struct blob {
+		u32le size;
+		u8    data[size];
+		u32le checksum;
+	}
+
+This structure is encoded as a 32 bit size, followed by ``size`` data bytes,
+then a 32 bit checksum.
+
+Primitive Aliases
+-----------------
+
+These types are just aliases for primitive types.
+
+::
+	
+	// From /src/include/types.h
+	
+	typedef u32le epoch_t;
+	typedef u32le ceph_seq_t;
+	typedef u64le ceph_tid_t;
+	typedef u64le version_t;
+
+
+Structures
+==========
+
+These are the way structures are encoded.  Note that these structures don't
+actually exist in the source but are the way that different types are encoded.
+
+Optional
+--------
+
+Optionals are represented as a presence byte, followed by the item if it exists.
+
+::
+	
+	struct ceph_optional<T> {
+		u8 present;
+		T  element[present? 1 : 0]; // Only if present is non-zero.
+	}
+
+Optionals are used to encode ``boost::optional``.
+
+Pair
+----
+
+Pairs are simply the first item followed by the second.
+
+::
+	
+	struct ceph_pair<A,B> {
+		A a;
+		B b;
+	}
+
+Pairs are used to encode ``std::pair``.
+
+Triple
+------
+
+Triples are simply the tree elements one after another.
+
+::
+	
+	struct ceph_triple<A,B,C> {
+		A a;
+		B b;
+		C c;
+	}
+
+Triples are used to encode ``ceph::triple``.
+
+
+List
+----
+
+Lists are represented as an element count followed by that many elements.
+
+::
+	
+	struct ceph_list<T> {
+		u32le length;
+		T     elements[length];
+	}
+
+.. note::
+	The size of the elements in the list are not necessarily uniform.
+
+Lists are used to encode ``std::list``, ``std::vector``, ``std::deque``,
+``std::set`` and ``ceph::unordered_set``.
+
+Blob
+----
+
+A Blob is simply a list of bytes.
+
+::
+	
+	struct ceph_string {
+		ceph_list<u8>;
+	}
+	
+	// AKA
+	
+	struct ceph_string {
+		u32le size;
+		u8    data[size];
+	}
+
+Blobs are used to encode ``std::string``, ``const char *`` and ``bufferlist``.
+
+.. note::
+	The content of a Blob is arbratrary binary data.
+
+Map
+---
+
+Maps are a list of pairs.
+
+::
+	
+	struct ceph_map<K,V> {
+		ceph_list<ceph_pair<K,V>>;
+	}
+	
+	// AKA
+	
+	struct ceph_map<K,V> {
+		u32le length;
+		ceph_pair<K,V> entries[length];
+	}
+
+Maps are used to encode ``std::map``, ``std::multimap`` and
+``ceph::unordered_map``.
+
+Complex Types
+=============
+
+These aren't hard to find in the source but the common ones are listed here for
+convenience.
+
+utime_t
+-------
+
+::
+	
+	// From /src/include/utime.h
+	struct utime_t {
+		u32le tv_sec;  // Seconds since epoch.
+		u32le tv_nsec; // Nanoseconds since the last second.
+	}
+
+ceph_entity_name
+----------------
+
+::
+	
+	// From /src/include/msgr.h
+	struct ceph_entity_name {
+		u8    type; // CEPH_ENTITY_TYPE_*
+		u64le num;
+	}
+	
+	// CEPH_ENTITY_TYPE_* defined in /src/include/msgr.h
+
+.. vi: textwidth=80 noexpandtab
diff --git a/doc/dev/network-protocol.rst b/doc/dev/network-protocol.rst
new file mode 100644
index 0000000..26e9d0b
--- /dev/null
+++ b/doc/dev/network-protocol.rst
@@ -0,0 +1,197 @@
+==================
+ Network Protocol
+==================
+
+This file describes the network protocol used by Ceph.  In order to understand
+the way the structures are defined it is recommended to read the introduction
+of :doc:`/dev/network-encoding` first.
+
+Hello
+=====
+
+The protocol starts with a handshake that confirms that both nodes are talking
+ceph and shares some basic information.
+
+Banner
+------
+
+The first action is the server sending banner to the client.  The banner is
+defined in ``CEPH_BANNER`` from ``src/include/msgr.h``.  This is followed by
+the server's then client's address each encoded as a ``entity_addr_t``.
+
+Once the client verifies that the servers banner matches its own it replies with
+its banner and its address.
+
+Connect
+-------
+
+Once the banners have been verified and the addresses exchanged the connection
+negotiation begins.  First the client sends a ``ceph_msg_connect`` structure
+with its information.
+
+::
+	
+	// From src/include/msgr.h
+	struct ceph_msg_connect {
+		u64le features;            // Supported features (CEPH_FEATURE_*)
+		u32le host_type;           // CEPH_ENTITY_TYPE_*
+		u32le global_seq;          // Number of connections initiated by this host.
+		u32le connect_seq;         // Number of connections initiated in this session.
+		u32le protocol_version;
+		u32le authorizer_protocol;
+		u32le authorizer_len;
+		u8    flags;               // CEPH_MSG_CONNECT_*
+		u8    authorizer[authorizer_len];
+	}
+
+Connect Reply
+-------------
+
+Once the connect has been sent the connection has effectively been opened,
+however the first message the server sends must be a connect reply message.
+
+::
+	
+	struct ceph_msg_connect_reply {
+		u8    tag; // Tag indicating response code.
+		u64le features;
+		u32le global_seq;
+		u32le connect_seq;
+		u32le protocol_version;
+		u32le authorizer_len;
+		u8    flags;
+		u8    authorizer[authorizer_len];
+	}
+
+MSGR Protocol
+=============
+
+This is a low level protocol over which messages are delivered.  The messages
+at this level consist of a tag byte, identifying the type of message, followed
+by the message data.
+
+::
+	
+	// Virtual structure.
+	struct {
+		u8 tag; // CEPH_MSGR_TAG_*
+		u8 data[]; // Length depends on tag and data.
+	}
+
+The length of ``data`` is determined by the tag byte and depending on the
+message type via information in the ``data`` array itself.
+
+.. note::
+	There is no way to determine the length of the message if you do not
+	understand the type of message.
+
+The message tags are defined in ``src/include/msgr.h`` and the current ones
+are listed below along with the data they include.  Note that the defined
+structures don't exist in the source and are merely for representing the
+protocol.
+
+CEPH_MSGR_TAG_CLOSE (0x06)
+--------------------------
+
+::
+	
+	struct ceph_msgr_close {
+		u8 tag = 0x06;
+		u8 data[0]; // No data.
+	}
+
+The close message indicates that the connection is being closed.
+
+CEPH_MSGR_TAG_MSG (0x07)
+------------------------
+
+::
+	
+	struct ceph_msgr_msg {
+		u8 tag = 0x07;
+		ceph_msg_header header;
+		u8 front [header.front_len ];
+		u8 middle[header.middle_len];
+		u8 data  [header.data_len  ];
+		ceph_msg_footer footer;
+	}
+	
+	// From src/include/msgr.h
+	struct ceph_msg_header {
+		u64le seq;       // Sequence number.
+		u64le tid;       // Transaction ID.
+		u16le type;      // Message type (CEPH_MSG_* or MSG_*).
+		u16le priority;  // Priority (higher is more important).
+		u16le version;   // Version of message encoding.
+		
+		u32le front_len;  // The size of the front section.
+		u32le middle_len; // The size of the middle section.
+		u32le data_len;   // The size of the data section.
+		u16le data_off;   // The way data should be aligned by the reciever.
+		
+		ceph_entity_name src; // Information about the sender.
+		
+		u16le compat_version; // Oldest compatible encoding version.
+		u16le reserved;       // Unused.
+		u32le crc;            // CRC of header.
+	}
+	
+	// From src/include/msgr.h
+	struct ceph_msg_footer {
+		u32le front_crc;  // Checksums of the various sections.
+		u32le middle_crc; //
+		u32le data_crc;   //
+		u64le sig; // Crypographic signature.
+		u8    flags;
+	}
+
+Messages are the business logic of Ceph.  They are what is used to send data and
+requests between nodes.  The message header contains the length of the message
+so unknown messages can be handled gracefully.
+
+There are two names for the message type constants ``CEPH_MSG_*`` and ``MSG_*``.
+The only difference between the two is that the first are considered "public"
+while the second is for internal use only.  There is no protocol-level
+difference.
+
+CEPH_MSGR_TAG_ACK (0x08)
+------------------------
+
+::
+	
+	struct ceph_msgr_ack {
+		u8    tag = 0x08;
+		u64le seq; // The sequence number of the message being acknowledged.
+	}
+
+CEPH_MSGR_TAG_KEEPALIVE (0x09)
+------------------------------
+
+::
+	
+	struct ceph_msgr_keepalive {
+		u8 tag = 0x09;
+		u8 data[0]; // No data.
+	}
+
+CEPH_MSGR_TAG_KEEPALIVE2 (0x04)
+-------------------------------
+
+::
+	
+	struct ceph_msgr_keepalive2 {
+		u8      tag = 0x0E;
+		utime_t timestamp;
+	}
+
+CEPH_MSGR_TAG_KEEPALIVE2_ACK (0x05)
+-----------------------------------
+
+::
+	
+	struct ceph_msgr_keepalive2_ack {
+		u8      tag = 0x0F;
+		utime_t timestamp;
+	}
+
+.. vi: textwidth=80 noexpandtab
diff --git a/doc/dev/object-store.rst b/doc/dev/object-store.rst
new file mode 100644
index 0000000..8aca54f
--- /dev/null
+++ b/doc/dev/object-store.rst
@@ -0,0 +1,67 @@
+====================================
+ Object Store Architecture Overview
+====================================
+
+.. graphviz::
+
+  /*
+   * Rough outline of object store module dependencies
+   */
+
+  digraph object_store {
+    size="7,7";
+    node [color=lightblue2, style=filled, fontname="Serif"];
+
+    "testrados" -> "librados"
+    "testradospp" -> "librados"
+
+    "rbd" -> "librados"
+
+    "radostool" -> "librados"
+
+    "radosgw-admin" -> "radosgw"
+
+    "radosgw" -> "librados"
+
+    "radosacl" -> "librados"
+
+    "librados" -> "objecter"
+
+    "ObjectCacher" -> "Filer"
+
+    "dumpjournal" -> "Journaler"
+
+    "Journaler" -> "Filer"
+
+    "SyntheticClient" -> "Filer"
+    "SyntheticClient" -> "objecter"
+
+    "Filer" -> "objecter"
+
+    "objecter" -> "OSDMap"
+
+    "ceph-osd" -> "PG"
+    "ceph-osd" -> "ObjectStore"
+
+    "crushtool" -> "CrushWrapper"
+
+    "OSDMap" -> "CrushWrapper"
+
+    "OSDMapTool" -> "OSDMap"
+
+    "PG" -> "ReplicatedPG"
+    "PG" -> "ObjectStore"
+    "PG" -> "OSDMap"
+
+    "ReplicatedPG" -> "ObjectStore"
+    "ReplicatedPG" -> "OSDMap"
+
+    "ObjectStore" -> "FileStore"
+
+    "FileStore" -> "xfs"
+    "FileStore" -> "btrfs"
+    "FileStore" -> "ext4"
+  }
+
+
+.. todo:: write more here
diff --git a/doc/dev/osd-class-path.rst b/doc/dev/osd-class-path.rst
new file mode 100644
index 0000000..6e209bc
--- /dev/null
+++ b/doc/dev/osd-class-path.rst
@@ -0,0 +1,16 @@
+=======================
+ OSD class path issues
+=======================
+
+::
+
+  2011-12-05 17:41:00.994075 7ffe8b5c3760 librbd: failed to assign a block name for image
+  create error: error 5: Input/output error
+
+This usually happens because your OSDs can't find ``cls_rbd.so``. They
+search for it in ``osd_class_dir``, which may not be set correctly by
+default (http://tracker.newdream.net/issues/1722).
+
+Most likely it's looking in ``/usr/lib/rados-classes`` instead of
+``/usr/lib64/rados-classes`` - change ``osd_class_dir`` in your
+``ceph.conf`` and restart the OSDs to fix it.
diff --git a/doc/dev/osd_internals/backfill_reservation.rst b/doc/dev/osd_internals/backfill_reservation.rst
new file mode 100644
index 0000000..cf9dab4
--- /dev/null
+++ b/doc/dev/osd_internals/backfill_reservation.rst
@@ -0,0 +1,38 @@
+====================
+Backfill Reservation
+====================
+
+When a new osd joins a cluster, all pgs containing it must eventually backfill
+to it.  If all of these backfills happen simultaneously, it would put excessive
+load on the osd. osd_max_backfills limits the number of outgoing or
+incoming backfills on a single node. The maximum number of outgoing backfills is
+osd_max_backfills. The maximum number of incoming backfills is
+osd_max_backfills. Therefore there can be a maximum of osd_max_backfills * 2
+simultaneous backfills on one osd.
+
+Each OSDService now has two AsyncReserver instances: one for backfills going
+from the osd (local_reserver) and one for backfills going to the osd
+(remote_reserver).  An AsyncReserver (common/AsyncReserver.h) manages a queue
+by priority of waiting items and a set of current reservation holders.  When a
+slot frees up, the AsyncReserver queues the Context* associated with the next
+item on the highest priority queue in the finisher provided to the constructor.
+
+For a primary to initiate a backfill, it must first obtain a reservation from
+its own local_reserver.  Then, it must obtain a reservation from the backfill
+target's remote_reserver via a MBackfillReserve message. This process is
+managed by substates of Active and ReplicaActive (see the substates of Active
+in PG.h).  The reservations are dropped either on the Backfilled event, which
+is sent on the primary before calling recovery_complete and on the replica on
+receipt of the BackfillComplete progress message), or upon leaving Active or
+ReplicaActive.
+
+It's important that we always grab the local reservation before the remote
+reservation in order to prevent a circular dependency.
+
+We want to minimize the risk of data loss by prioritizing the order in
+which PGs are recovered. The highest priority is log based recovery
+(OSD_RECOVERY_PRIORITY_MAX) since this must always complete before
+backfill can start.  The next priority is backfill of degraded PGs and
+is a function of the degradation. A backfill for a PG missing two
+replicas will have a priority higher than a backfill for a PG missing
+one replica.  The lowest priority is backfill of non-degraded PGs.
diff --git a/doc/dev/osd_internals/erasure_coding.rst b/doc/dev/osd_internals/erasure_coding.rst
new file mode 100644
index 0000000..9d273cb
--- /dev/null
+++ b/doc/dev/osd_internals/erasure_coding.rst
@@ -0,0 +1,82 @@
+==============================
+Erasure Coded Placement Groups
+==============================
+
+Glossary
+--------
+
+*chunk* 
+   when the encoding function is called, it returns chunks of the same
+   size. Data chunks which can be concatenated to reconstruct the original
+   object and coding chunks which can be used to rebuild a lost chunk.
+
+*chunk rank*
+   the index of a chunk when returned by the encoding function. The
+   rank of the first chunk is 0, the rank of the second chunk is 1
+   etc.
+
+*stripe* 
+   when an object is too large to be encoded with a single call,
+   each set of chunks created by a call to the encoding function is
+   called a stripe.
+
+*shard|strip*
+   an ordered sequence of chunks of the same rank from the same
+   object.  For a given placement group, each OSD contains shards of
+   the same rank. When dealing with objects that are encoded with a
+   single operation, *chunk* is sometime used instead of *shard*
+   because the shard is made of a single chunk. The *chunks* in a
+   *shard* are ordered according to the rank of the stripe they belong
+   to.
+
+*K*
+   the number of data *chunks*, i.e. the number of *chunks* in which the
+   original object is divided. For instance if *K* = 2 a 10KB object
+   will be divided into *K* objects of 5KB each.
+
+*M* 
+   the number of coding *chunks*, i.e. the number of additional *chunks*
+   computed by the encoding functions. If there are 2 coding *chunks*, 
+   it means 2 OSDs can be out without losing data.
+
+*N*
+   the number of data *chunks* plus the number of coding *chunks*, 
+   i.e. *K+M*.
+
+*rate*
+   the proportion of the *chunks* that contains useful information, i.e. *K/N*.
+   For instance, for *K* = 9 and *M* = 3 (i.e. *K+M* = *N* = 12) the rate is 
+   *K* = 9 / *N* = 12 = 0.75, i.e. 75% of the chunks contain useful information.
+
+The definitions are illustrated as follows (PG stands for placement group):
+::
+ 
+                 OSD 40                       OSD 33
+       +-------------------------+ +-------------------------+
+       |      shard 0 - PG 10    | |      shard 1 - PG 10    |
+       |+------ object O -------+| |+------ object O -------+|
+       ||+---------------------+|| ||+---------------------+||
+ stripe|||    chunk  0         ||| |||    chunk  1         ||| ...
+   0   |||    stripe 0         ||| |||    stripe 0         ||| 
+       ||+---------------------+|| ||+---------------------+||
+       ||+---------------------+|| ||+---------------------+||
+ stripe|||    chunk  0         ||| |||    chunk  1         ||| ...
+   1   |||    stripe 1         ||| |||    stripe 1         |||
+       ||+---------------------+|| ||+---------------------+||
+       ||+---------------------+|| ||+---------------------+||
+ stripe|||    chunk  0         ||| |||    chunk  1         ||| ...
+   2   |||    stripe 2         ||| |||    stripe 2         |||
+       ||+---------------------+|| ||+---------------------+||
+       |+-----------------------+| |+-----------------------+|
+       |         ...             | |         ...             |
+       +-------------------------+ +-------------------------+
+
+Table of content
+----------------
+
+.. toctree::
+   :maxdepth: 1
+
+   Developer notes <erasure_coding/developer_notes>
+   Jerasure plugin <erasure_coding/jerasure>
+   High level design document <erasure_coding/pgbackend>
diff --git a/doc/dev/osd_internals/erasure_coding/developer_notes.rst b/doc/dev/osd_internals/erasure_coding/developer_notes.rst
new file mode 100644
index 0000000..cdab34c
--- /dev/null
+++ b/doc/dev/osd_internals/erasure_coding/developer_notes.rst
@@ -0,0 +1,223 @@
+============================
+Erasure Code developer notes
+============================
+
+Introduction
+------------
+
+Each chapter of this document explains an aspect of the implementation
+of the erasure code within Ceph. It is mostly based on examples being
+explained to demonstrate how things work. 
+
+Reading and writing encoded chunks from and to OSDs
+---------------------------------------------------
+
+An erasure coded pool stores each object as K+M chunks. It is divided
+into K data chunks and M coding chunks. The pool is configured to have
+a size of K+M so that each chunk is stored in an OSD in the acting
+set. The rank of the chunk is stored as an attribute of the object.
+
+Let's say an erasure coded pool is created to use five OSDs ( K+M =
+5 ) and sustain the loss of two of them ( M = 2 ).
+
+When the object *NYAN* containing *ABCDEFGHI* is written to it, the
+erasure encoding function splits the content in three data chunks,
+simply by dividing the content in three : the first contains *ABC*,
+the second *DEF* and the last *GHI*. The content will be padded if the
+content length is not a multiple of K. The function also creates two
+coding chunks : the fourth with *YXY* and the fifth with *GQC*. Each
+chunk is stored in an OSD in the acting set. The chunks are stored in
+objects that have the same name ( *NYAN* ) but reside on different
+OSDs. The order in which the chunks were created must be preserved and
+is stored as an attribute of the object ( shard_t ), in addition to its
+name. Chunk *1* contains *ABC* and is stored on *OSD5* while chunk *4*
+contains *YXY* and is stored on *OSD3*.
+
+::
+ 
+                             +-------------------+
+                        name |        NYAN       |
+                             +-------------------+
+                     content |      ABCDEFGHI    |
+                             +--------+----------+
+                                      |
+                                      |
+                                      v
+                               +------+------+
+               +---------------+ encode(3,2) +-----------+
+               |               +--+--+---+---+           |
+               |                  |  |   |               |
+               |          +-------+  |   +-----+         |
+               |          |          |         |         |
+            +--v---+   +--v---+   +--v---+  +--v---+  +--v---+
+      name  | NYAN |   | NYAN |   | NYAN |  | NYAN |  | NYAN |
+            +------+   +------+   +------+  +------+  +------+
+     shard  |  1   |   |  2   |   |  3   |  |  4   |  |  5   |
+            +------+   +------+   +------+  +------+  +------+
+   content  | ABC  |   | DEF  |   | GHI  |  | YXY  |  | QGC  |
+            +--+---+   +--+---+   +--+---+  +--+---+  +--+---+
+               |          |          |         |         |
+               |          |          |         |         |
+               |          |       +--+---+     |         |
+               |          |       | OSD1 |     |         |
+               |          |       +------+     |         |
+               |          |       +------+     |         |
+               |          +------>| OSD2 |     |         |
+               |                  +------+     |         |
+               |                  +------+     |         |
+               |                  | OSD3 |<----+         |
+               |                  +------+               |
+               |                  +------+               |
+               |                  | OSD4 |<--------------+
+               |                  +------+
+               |                  +------+
+               +----------------->| OSD5 |
+                                  +------+
+
+
+
+
+When the object *NYAN* is read from the erasure coded pool, the
+decoding function reads three chunks : chunk *1* containing *ABC*,
+chunk *3* containing *GHI* and chunk *4* containing *YXY* and rebuild
+the original content of the object *ABCDEFGHI*. The decoding function
+is informed that the chunks *2* and *5* are missing ( they are called
+*erasures* ). The chunk *5* could not be read because the *OSD4* is
+*out*. 
+
+The decoding function could be called as soon as three chunks are
+read : *OSD2* was the slowest and its chunk does not need to be taken into
+account. This optimization is not implemented in Firefly.
+
+::
+ 
+                             +-------------------+
+                        name |        NYAN       |
+                             +-------------------+
+                     content |      ABCDEFGHI    |
+                             +--------+----------+
+                                      ^
+                                      |
+                                      |
+                               +------+------+
+                               | decode(3,2) |
+                               | erasures 2,5|
+               +-------------->|             |
+               |               +-------------+
+               |                     ^   ^
+               |                     |   +-----+
+               |                     |         |
+            +--+---+   +------+   +--+---+  +--+---+
+      name  | NYAN |   | NYAN |   | NYAN |  | NYAN |
+            +------+   +------+   +------+  +------+
+     shard  |  1   |   |  2   |   |  3   |  |  4   |
+            +------+   +------+   +------+  +------+
+   content  | ABC  |   | DEF  |   | GHI  |  | YXY  |
+            +--+---+   +--+---+   +--+---+  +--+---+
+               ^          .          ^         ^
+               |    TOO   .          |         |
+               |    SLOW  .       +--+---+     |
+               |          ^       | OSD1 |     |
+               |          |       +------+     |
+               |          |       +------+     |
+               |          +-------| OSD2 |     |
+               |                  +------+     |
+               |                  +------+     |
+               |                  | OSD3 |-----+
+               |                  +------+
+               |                  +------+
+               |                  | OSD4 | OUT
+               |                  +------+
+               |                  +------+
+               +------------------| OSD5 |
+                                  +------+
+
+
+Erasure code library
+--------------------
+
+Using `Reed-Solomon <https://en.wikipedia.org/wiki/Reed_Solomon>`_,
+with parameters K+M, object O is encoded by dividing it into chunks O1,
+O2, ...  OM and computing coding chunks P1, P2, ... PK. Any K chunks
+out of the available K+M chunks can be used to obtain the original
+object.  If data chunk O2 or coding chunk P2 are lost, they can be
+repaired using any K chunks out of the K+M chunks. If more than M
+chunks are lost, it is not possible to recover the object.
+
+Reading the original content of object O can be a simple
+concatenation of O1, O2, ... OM, because the plugins are using
+`systematic codes
+<http://en.wikipedia.org/wiki/Systematic_code>`_. Otherwise the chunks
+must be given to the erasure code library *decode* method to retrieve
+the content of the object.
+
+Performance depend on the parameters to the encoding functions and
+is also influenced by the packet sizes used when calling the encoding
+functions ( for Cauchy or Liberation for instance ): smaller packets
+means more calls and more overhead.
+
+Although Reed-Solomon is provided as a default, Ceph uses it via an
+`abstract API <https://github.com/ceph/ceph/blob/v0.78/src/erasure-code/ErasureCodeInterface.h>`_ designed to
+allow each pool to choose the plugin that implements it using
+key=value pairs stored in an `erasure code profile`_. 
+
+.. _erasure code profile: ../../../erasure-coded-pool
+
+::
+ 
+ $ ceph osd erasure-code-profile set myprofile \
+     ruleset-failure-domain=osd
+ $ ceph osd erasure-code-profile get myprofile
+ directory=/usr/lib/ceph/erasure-code
+ k=2
+ m=1
+ plugin=jerasure
+ technique=reed_sol_van
+ ruleset-failure-domain=osd
+ $ ceph osd pool create ecpool 12 12 erasure myprofile
+
+The *plugin* is dynamically loaded from *directory*  and expected to
+implement the *int __erasure_code_init(char *plugin_name, char *directory)* function 
+which is responsible for registering an object derived from *ErasureCodePlugin* 
+in the registry. The `ErasureCodePluginExample <https://github.com/ceph/ceph/blob/v0.78/src/test/erasure-code/ErasureCodePluginExample.cc>`_ plugin reads:
+
+::
+ 
+  ErasureCodePluginRegistry &instance = 
+                             ErasureCodePluginRegistry::instance();
+  instance.add(plugin_name, new ErasureCodePluginExample());
+
+The *ErasureCodePlugin* derived object must provide a factory method
+from which the concrete implementation of the *ErasureCodeInterface*
+object can be generated. The `ErasureCodePluginExample plugin <https://github.com/ceph/ceph/blob/v0.78/src/test/osd/ErasureCodePluginExample.cc>`_ reads:
+
+::
+ 
+  virtual int factory(const map<std::string,std::string> &parameters,
+                      ErasureCodeInterfaceRef *erasure_code) {
+    *erasure_code = ErasureCodeInterfaceRef(new ErasureCodeExample(parameters));
+    return 0;
+  } 
+
+The *parameters* argument is the list of *key=value* pairs that were
+set in the erasure code profile, before the pool was created.
+
+::
+ 
+  ceph osd erasure-code-profile set myprofile \
+     directory=<dir>         \ # mandatory
+     plugin=jerasure         \ # mandatory
+     m=10                    \ # optional and plugin dependant
+     k=3                     \ # optional and plugin dependant
+     technique=reed_sol_van  \ # optional and plugin dependant
+
+Notes
+-----
+
+If the objects are large, it may be impractical to encode and decode
+them in memory. However, when using *RBD* a 1TB device is divided in
+many individual 4MB objects and *RGW* does the same.
+
+Encoding and decoding is implemented in the OSD. Although it could be
+implemented client side for read write, the OSD must be able to encode
+and decode on its own when scrubbing.
diff --git a/doc/dev/osd_internals/erasure_coding/jerasure.rst b/doc/dev/osd_internals/erasure_coding/jerasure.rst
new file mode 100644
index 0000000..27669a0
--- /dev/null
+++ b/doc/dev/osd_internals/erasure_coding/jerasure.rst
@@ -0,0 +1,33 @@
+===============
+jerasure plugin
+===============
+
+Introduction
+------------
+
+The parameters interpreted by the jerasure plugin are:
+
+::
+ 
+  ceph osd erasure-code-profile set myprofile \
+     directory=<dir>         \ # plugin directory absolute path
+     plugin=jerasure         \ # plugin name (only jerasure)
+     k=<k>                   \ # data chunks (default 2)
+     m=<m>                   \ # coding chunks (default 2)
+     technique=<technique>   \ # coding technique
+
+The coding techniques can be chosen among *reed_sol_van*,
+*reed_sol_r6_op*, *cauchy_orig*, *cauchy_good*, *liberation*,
+*blaum_roth* and *liber8tion*.
+
+The *src/erasure-code/jerasure* directory contains the
+implementation. It is a wrapper around the code found at
+`https://github.com/ceph/jerasure <https://github.com/ceph/jerasure>`_
+and `https://github.com/ceph/gf-complete
+<https://github.com/ceph/gf-complete>`_ , pinned to the latest stable
+version in *.gitmodules*. These repositories are copies of the
+upstream repositories `http://jerasure.org/jerasure/jerasure
+<http://jerasure.org/jerasure/jerasure>`_ and
+`http://jerasure.org/jerasure/gf-complete
+<http://jerasure.org/jerasure/gf-complete>`_ . The difference
+between the two, if any, should match pull requests against upstream.
diff --git a/doc/dev/osd_internals/erasure_coding/pgbackend.rst b/doc/dev/osd_internals/erasure_coding/pgbackend.rst
new file mode 100644
index 0000000..db60299
--- /dev/null
+++ b/doc/dev/osd_internals/erasure_coding/pgbackend.rst
@@ -0,0 +1,320 @@
+===================
+PG Backend Proposal
+===================
+
+NOTE: the last update of this page is dated 2013, before the Firefly
+release. The details of the implementation may be different.
+
+Motivation
+----------
+
+The purpose of the `PG Backend interface
+<https://github.com/ceph/ceph/blob/firefly/src/osd/PGBackend.h>`_
+is to abstract over the differences between replication and erasure
+coding as failure recovery mechanisms.
+
+Much of the existing PG logic, particularly that for dealing with
+peering, will be common to each.  With both schemes, a log of recent
+operations will be used to direct recovery in the event that an OSD is
+down or disconnected for a brief period of time.  Similarly, in both
+cases it will be necessary to scan a recovered copy of the PG in order
+to recover an empty OSD.  The PGBackend abstraction must be
+sufficiently expressive for Replicated and ErasureCoded backends to be
+treated uniformly in these areas.
+
+However, there are also crucial differences between using replication
+and erasure coding which PGBackend must abstract over:
+
+1. The current write strategy would not ensure that a particular
+   object could be reconstructed after a failure.
+2. Reads on an erasure coded PG require chunks to be read from the
+   replicas as well.
+3. Object recovery probably involves recovering the primary and
+   replica missing copies at the same time to avoid performing extra
+   reads of replica shards.
+4. Erasure coded PG chunks created for different acting set
+   positions are not interchangeable.  In particular, it might make
+   sense for a single OSD to hold more than 1 PG copy for different
+   acting set positions.
+5. Selection of a pgtemp for backfill may differ between replicated
+   and erasure coded backends.
+6. The set of necessary OSDs from a particular interval required to
+   continue peering may differ between replicated and erasure coded
+   backends.
+7. The selection of the authoritative log may differ between replicated
+   and erasure coded backends.
+
+Client Writes
+-------------
+
+The current PG implementation performs a write by performing the write
+locally while concurrently directing replicas to perform the same
+operation.  Once all operations are durable, the operation is
+considered durable.  Because these writes may be destructive
+overwrites, during peering, a log entry on a replica (or the primary)
+may be found to be divergent if that replica remembers a log event
+which the authoritative log does not contain.  This can happen if only
+1 out of 3 replicas persisted an operation, but was not available in
+the next interval to provide an authoritative log.  With replication,
+we can repair the divergent object as long as at least 1 replica has a
+current copy of the divergent object.  With erasure coding, however,
+it might be the case that neither the new version of the object nor
+the old version of the object has enough available chunks to be
+reconstructed.  This problem is much simpler if we arrange for all
+supported operations to be locally roll-back-able.
+
+- CEPH_OSD_OP_APPEND: We can roll back an append locally by
+  including the previous object size as part of the PG log event.
+- CEPH_OSD_OP_DELETE: The possibility of rolling back a delete
+  requires that we retain the deleted object until all replicas have
+  persisted the deletion event.  ErasureCoded backend will therefore
+  need to store objects with the version at which they were created
+  included in the key provided to the filestore.  Old versions of an
+  object can be pruned when all replicas have committed up to the log
+  event deleting the object.
+- CEPH_OSD_OP_(SET|RM)ATTR: If we include the prior value of the attr
+  to be set or removed, we can roll back these operations locally.
+
+Core Changes:
+
+- Current code should be adapted to use and rollback as appropriate
+  APPEND, DELETE, (SET|RM)ATTR log entries.
+- The filestore needs to be able to deal with multiply versioned
+  hobjects.  This means adapting the filestore internally to
+  use a `ghobject <https://github.com/ceph/ceph/blob/firefly/src/common/hobject.h#L238>`_ 
+  which is basically a tuple<hobject_t, gen_t,
+  shard_t>.  The gen_t + shard_t need to be included in the on-disk
+  filename.  gen_t is a unique object identifier to make sure there
+  are no name collisions when object N is created +
+  deleted + created again. An interface needs to be added to get all
+  versions of a particular hobject_t or the most recently versioned
+  instance of a particular hobject_t.
+
+PGBackend Interfaces:
+
+- PGBackend::perform_write() : It seems simplest to pass the actual
+  ops vector.  The reason for providing an async, callback based
+  interface rather than having the PGBackend respond directly is that
+  we might want to use this interface for internal operations like
+  watch/notify expiration or snap trimming which might not necessarily
+  have an external client.
+- PGBackend::try_rollback() : Some log entries (all of the ones valid
+  for the Erasure coded backend) will support local rollback.  In
+  those cases, PGLog can avoid adding objects to the missing set when
+  identifying divergent objects.
+
+Peering and PG Logs
+-------------------
+
+Currently, we select the log with the newest last_update and the
+longest tail to be the authoritative log.  This is fine because we
+aren't generally able to roll operations on the other replicas forward
+or backwards, instead relying on our ability to re-replicate divergent
+objects.  With the write approach discussed in the previous section,
+however, the erasure coded backend will rely on being able to roll
+back divergent operations since we may not be able to re-replicate
+divergent objects.  Thus, we must choose the *oldest* last_update from
+the last interval which went active in order to minimize the number of
+divergent objects.
+
+The difficulty is that the current code assumes that as long as it has
+an info from at least 1 OSD from the prior interval, it can complete
+peering.  In order to ensure that we do not end up with an
+unrecoverably divergent object, a K+M erasure coded PG must hear from at
+least K of the replicas of the last interval to serve writes.  This ensures
+that we will select a last_update old enough to roll back at least K
+replicas.  If a replica with an older last_update comes along later,
+we will be able to provide at least K chunks of any divergent object.
+
+Core Changes:
+
+- PG::choose_acting(), etc. need to be generalized to use PGBackend to
+  determine the authoritative log.
+- PG::RecoveryState::GetInfo needs to use PGBackend to determine
+  whether it has enough infos to continue with authoritative log
+  selection.
+
+PGBackend interfaces:
+
+- have_enough_infos() 
+- choose_acting()
+
+PGTemp
+------
+
+Currently, an OSD is able to request a temp acting set mapping in
+order to allow an up-to-date OSD to serve requests while a new primary
+is backfilled (and for other reasons).  An erasure coded pg needs to
+be able to designate a primary for these reasons without putting it
+in the first position of the acting set.  It also needs to be able
+to leave holes in the requested acting set.
+
+Core Changes:
+
+- OSDMap::pg_to_*_osds needs to separately return a primary.  For most
+  cases, this can continue to be acting[0].
+- MOSDPGTemp (and related OSD structures) needs to be able to specify
+  a primary as well as an acting set.
+- Much of the existing code base assumes that acting[0] is the primary
+  and that all elements of acting are valid.  This needs to be cleaned
+  up since the acting set may contain holes.
+
+Client Reads
+------------
+
+Reads with the replicated strategy can always be satisfied
+synchronously out of the primary OSD.  With an erasure coded strategy,
+the primary will need to request data from some number of replicas in
+order to satisfy a read.  The perform_read() interface for PGBackend
+therefore will be async.
+
+PGBackend interfaces:
+
+- perform_read(): as with perform_write() it seems simplest to pass
+  the ops vector.  The call to oncomplete will occur once the out_bls
+  have been appropriately filled in.
+
+Distinguished acting set positions
+----------------------------------
+
+With the replicated strategy, all replicas of a PG are
+interchangeable.  With erasure coding, different positions in the
+acting set have different pieces of the erasure coding scheme and are
+not interchangeable.  Worse, crush might cause chunk 2 to be written
+to an OSD which happens already to contain an (old) copy of chunk 4.
+This means that the OSD and PG messages need to work in terms of a
+type like pair<shard_t, pg_t> in order to distinguish different pg
+chunks on a single OSD.
+
+Because the mapping of object name to object in the filestore must
+be 1-to-1, we must ensure that the objects in chunk 2 and the objects
+in chunk 4 have different names.  To that end, the filestore must
+include the chunk id in the object key.
+
+Core changes:
+
+- The filestore `ghobject_t needs to also include a chunk id
+  <https://github.com/ceph/ceph/blob/firefly/src/common/hobject.h#L241>`_ making it more like
+  tuple<hobject_t, gen_t, shard_t>.
+- coll_t needs to include a shard_t.
+- The OSD pg_map and similar pg mappings need to work in terms of a
+  spg_t (essentially
+  pair<pg_t, shard_t>).  Similarly, pg->pg messages need to include
+  a shard_t
+- For client->PG messages, the OSD will need a way to know which PG
+  chunk should get the message since the OSD may contain both a
+  primary and non-primary chunk for the same pg
+
+Object Classes
+--------------
+
+We probably won't support object classes at first on Erasure coded
+backends.
+
+Scrub
+-----
+
+We currently have two scrub modes with different default frequencies:
+
+1. [shallow] scrub: compares the set of objects and metadata, but not
+   the contents
+2. deep scrub: compares the set of objects, metadata, and a crc32 of
+   the object contents (including omap)
+
+The primary requests a scrubmap from each replica for a particular
+range of objects.  The replica fills out this scrubmap for the range
+of objects including, if the scrub is deep, a crc32 of the contents of
+each object.  The primary gathers these scrubmaps from each replica
+and performs a comparison identifying inconsistent objects.
+
+Most of this can work essentially unchanged with erasure coded PG with
+the caveat that the PGBackend implementation must be in charge of
+actually doing the scan, and that the PGBackend implementation should
+be able to attach arbitrary information to allow PGBackend on the
+primary to scrub PGBackend specific metadata.
+
+The main catch, however, for erasure coded PG is that sending a crc32
+of the stored chunk on a replica isn't particularly helpful since the
+chunks on different replicas presumably store different data.  Because
+we don't support overwrites except via DELETE, however, we have the
+option of maintaining a crc32 on each chunk through each append.
+Thus, each replica instead simply computes a crc32 of its own stored
+chunk and compares it with the locally stored checksum.  The replica
+then reports to the primary whether the checksums match.
+
+PGBackend interfaces:
+
+- scan()
+- scrub()
+- compare_scrub_maps()
+
+Crush
+-----
+
+If crush is unable to generate a replacement for a down member of an
+acting set, the acting set should have a hole at that position rather
+than shifting the other elements of the acting set out of position.
+
+Core changes:
+
+- Ensure that crush behaves as above for INDEP.
+
+Recovery
+--------
+
+The logic for recovering an object depends on the backend.  With
+the current replicated strategy, we first pull the object replica
+to the primary and then concurrently push it out to the replicas.
+With the erasure coded strategy, we probably want to read the
+minimum number of replica chunks required to reconstruct the object
+and push out the replacement chunks concurrently.
+
+Another difference is that objects in erasure coded pg may be
+unrecoverable without being unfound.  The "unfound" concept
+should probably then be renamed to unrecoverable.  Also, the
+PGBackend implementation will have to be able to direct the search
+for pg replicas with unrecoverable object chunks and to be able
+to determine whether a particular object is recoverable.
+
+
+Core changes:
+
+- s/unfound/unrecoverable
+
+PGBackend interfaces:
+
+- `on_local_recover_start <https://github.com/ceph/ceph/blob/firefly/src/osd/PGBackend.h#L60>`_
+- `on_local_recover <https://github.com/ceph/ceph/blob/firefly/src/osd/PGBackend.h#L66>`_
+- `on_global_recover <https://github.com/ceph/ceph/blob/firefly/src/osd/PGBackend.h#L78>`_
+- `on_peer_recover <https://github.com/ceph/ceph/blob/firefly/src/osd/PGBackend.h#L83>`_
+- `begin_peer_recover <https://github.com/ceph/ceph/blob/firefly/src/osd/PGBackend.h#L90>`_
+
+Backfill
+--------
+
+For the most part, backfill itself should behave similarly between
+replicated and erasure coded pools with a few exceptions:
+
+1. We probably want to be able to backfill multiple OSDs concurrently
+   with an erasure coded pool in order to cut down on the read
+   overhead.
+2. We probably want to avoid having to place the backfill peers in the
+   acting set for an erasure coded pg because we might have a good
+   temporary pg chunk for that acting set slot.
+
+For 2, we don't really need to place the backfill peer in the acting
+set for replicated PGs anyway.
+For 1, PGBackend::choose_backfill() should determine which OSDs are
+backfilled in a particular interval.
+
+Core changes:
+
+- Backfill should be capable of handling multiple backfill peers
+  concurrently even for
+  replicated pgs (easier to test for now)
+- Backfill peers should not be placed in the acting set.
+
+PGBackend interfaces:
+
+- choose_backfill(): allows the implementation to determine which OSDs
+  should be backfilled in a particular interval.
diff --git a/doc/dev/osd_internals/index.rst b/doc/dev/osd_internals/index.rst
new file mode 100644
index 0000000..7e82914
--- /dev/null
+++ b/doc/dev/osd_internals/index.rst
@@ -0,0 +1,10 @@
+==============================
+OSD developer documentation
+==============================
+
+.. rubric:: Contents
+
+.. toctree::
+   :glob:
+
+   *
diff --git a/doc/dev/osd_internals/last_epoch_started.rst b/doc/dev/osd_internals/last_epoch_started.rst
new file mode 100644
index 0000000..fa86b4a
--- /dev/null
+++ b/doc/dev/osd_internals/last_epoch_started.rst
@@ -0,0 +1,60 @@
+======================
+last_epoch_started
+======================
+
+info.last_epoch_started records an activation epoch e for interval i
+such that all writes commited in i or earlier are reflected in the
+local info/log and no writes after i are reflected in the local
+info/log.  Since no committed write is ever divergent, even if we
+get an authoritative log/info with an older info.last_epoch_started,
+we can leave our info.last_epoch_started alone since no writes could
+have commited in any intervening interval (See PG::proc_master_log).
+
+info.history.last_epoch_started records a lower bound on the most
+recent interval in which the pg as a whole went active and accepted
+writes.  On a particular osd, it is also an upper bound on the
+activation epoch of intervals in which writes in the local pg log
+occurred (we update it before accepting writes).  Because all
+committed writes are committed by all acting set osds, any
+non-divergent writes ensure that history.last_epoch_started was
+recorded by all acting set members in the interval.  Once peering has
+queried one osd from each interval back to some seen
+history.last_epoch_started, it follows that no interval after the max
+history.last_epoch_started can have reported writes as committed
+(since we record it before recording client writes in an interval).
+Thus, the minimum last_update across all infos with
+info.last_epoch_started >= MAX(history.last_epoch_started) must be an
+upper bound on writes reported as committed to the client.
+
+We update info.last_epoch_started with the intial activation message,
+but we only update history.last_epoch_started after the new
+info.last_epoch_started is persisted (possibly along with the first
+write).  This ensures that we do not require an osd with the most
+recent info.last_epoch_started until all acting set osds have recorded
+it.
+
+In find_best_info, we do include info.last_epoch_started values when
+calculating the max_last_epoch_started_found because we want to avoid
+designating a log entry divergent which in a prior interval would have
+been non-divergent since it might have been used to serve a read.  In
+activate(), we use the peer's last_epoch_started value as a bound on
+how far back divergent log entries can be found.
+
+However, in a case like
+
+.. code:: none
+
+  calc_acting osd.0 1.4e( v 473'302 (292'200,473'302] local-les=473 n=4 ec=5 les/c 473/473 556/556/556
+  calc_acting osd.1 1.4e( v 473'302 (293'202,473'302] lb 0//0//-1 local-les=477 n=0 ec=5 les/c 473/473 556/556/556
+  calc_acting osd.4 1.4e( v 473'302 (120'121,473'302] local-les=473 n=4 ec=5 les/c 473/473 556/556/556
+  calc_acting osd.5 1.4e( empty local-les=0 n=0 ec=5 les/c 473/473 556/556/556
+
+since osd.1 is the only one which recorded info.les=477 while 4,0
+which were the acting set in that interval did not (4 restarted and 0
+did not get the message in time) the pg is marked incomplete when
+either 4 or 0 would have been valid choices.  To avoid this, we do not
+consider info.les for incomplete peers when calculating
+min_last_epoch_started_found.  It would not have been in the acting
+set, so we must have another osd from that interval anyway (if
+maybe_went_rw).  If that osd does not remember that info.les, then we
+cannot have served reads.
diff --git a/doc/dev/osd_internals/map_message_handling.rst b/doc/dev/osd_internals/map_message_handling.rst
new file mode 100644
index 0000000..82ebf63
--- /dev/null
+++ b/doc/dev/osd_internals/map_message_handling.rst
@@ -0,0 +1,131 @@
+===========================
+Map and PG Message handling
+===========================
+
+Overview
+--------
+The OSD handles routing incoming messages to PGs, creating the PG if necessary
+in some cases.
+
+PG messages generally come in two varieties:
+
+  1. Peering Messages
+  2. Ops/SubOps
+
+There are several ways in which a message might be dropped or delayed.  It is
+important that the message delaying does not result in a violation of certain
+message ordering requirements on the way to the relevant PG handling logic:
+
+  1. Ops referring to the same object must not be reordered.
+  2. Peering messages must not be reordered.
+  3. Subops must not be reordered.
+
+MOSDMap
+-------
+MOSDMap messages may come from either monitors or other OSDs.  Upon receipt, the
+OSD must perform several tasks:
+
+  1. Persist the new maps to the filestore.
+     Several PG operations rely on having access to maps dating back to the last
+     time the PG was clean.
+  2. Update and persist the superblock.
+  3. Update OSD state related to the current map.
+  4. Expose new maps to PG processes via *OSDService*.
+  5. Remove PGs due to pool removal.
+  6. Queue dummy events to trigger PG map catchup.
+
+Each PG asynchronously catches up to the currently published map during
+process_peering_events before processing the event.  As a result, different
+PGs may have different views as to the "current" map.
+
+One consequence of this design is that messages containing submessages from
+multiple PGs (MOSDPGInfo, MOSDPGQuery, MOSDPGNotify) must tag each submessage
+with the PG's epoch as well as tagging the message as a whole with the OSD's
+current published epoch.
+
+MOSDPGOp/MOSDPGSubOp
+--------------------
+See OSD::dispatch_op, OSD::handle_op, OSD::handle_sub_op
+
+MOSDPGOps are used by clients to initiate rados operations. MOSDSubOps are used
+between OSDs to coordinate most non peering activities including replicating
+MOSDPGOp operations.
+
+OSD::require_same_or_newer map checks that the current OSDMap is at least
+as new as the map epoch indicated on the message.  If not, the message is
+queued in OSD::waiting_for_osdmap via OSD::wait_for_new_map.  Note, this
+cannot violate the above conditions since any two messages will be queued
+in order of receipt and if a message is received with epoch e0, a later message
+from the same source must be at epoch at least e0.  Note that two PGs from
+the same OSD count for these purposes as different sources for single PG
+messages.  That is, messages from different PGs may be reordered.
+
+
+MOSDPGOps follow the following process:
+
+  1. OSD::handle_op: validates permissions and crush mapping.
+     discard the request if they are not connected and the client cannot get the reply ( See OSD::op_is_discardable )
+     See OSDService::handle_misdirected_op
+     See PG::op_has_sufficient_caps
+     See OSD::require_same_or_newer_map
+  2. OSD::enqueue_op
+
+MOSDSubOps follow the following process:
+
+  1. OSD::handle_sub_op checks that sender is an OSD
+  2. OSD::enqueue_op
+
+OSD::enqueue_op calls PG::queue_op which checks waiting_for_map before calling OpWQ::queue which adds the op to the queue of the PG responsible for handling it.
+
+OSD::dequeue_op is then eventually called, with a lock on the PG.  At
+this time, the op is passed to PG::do_request, which checks that:
+
+  1. the PG map is new enough (PG::must_delay_op)
+  2. the client requesting the op has enough permissions (PG::op_has_sufficient_caps)
+  3. the op is not to be discarded (PG::can_discard_{request,op,subop,scan,backfill})
+  4. the PG is active (PG::flushed boolean)
+  5. the op is a CEPH_MSG_OSD_OP and the PG is in PG_STATE_ACTIVE state and not in PG_STATE_REPLAY 
+
+If these conditions are not met, the op is either discarded or queued for later processing. If all conditions are met, the op is processed according to its type:
+
+  1. CEPH_MSG_OSD_OP is handled by PG::do_op
+  2. MSG_OSD_SUBOP is handled by PG::do_sub_op
+  3. MSG_OSD_SUBOPREPLY is handled by PG::do_sub_op_reply
+  4. MSG_OSD_PG_SCAN is handled by PG::do_scan
+  5. MSG_OSD_PG_BACKFILL is handled by PG::do_backfill
+
+CEPH_MSG_OSD_OP processing
+--------------------------
+
+ReplicatedPG::do_op handles CEPH_MSG_OSD_OP op and will queue it
+
+  1. in wait_for_all_missing if it is a CEPH_OSD_OP_PGLS for a designated snapid and some object updates are still missing
+  2. in waiting_for_active if the op may write but the scrubber is working
+  3. in waiting_for_missing_object if the op requires an object or a snapdir or a specific snap that is still missing
+  4. in waiting_for_degraded_object if the op may write an object or a snapdir that is degraded, or if another object blocks it ("blocked_by")
+  5. in waiting_for_backfill_pos if the op requires an object that will be available after the backfill is complete
+  6. in waiting_for_ack if an ack from another OSD is expected
+  7. in waiting_for_ondisk if the op is waiting for a write to complete
+
+Peering Messages
+----------------
+See OSD::handle_pg_(notify|info|log|query)
+
+Peering messages are tagged with two epochs:
+
+  1. epoch_sent: map epoch at which the message was sent
+  2. query_epoch: map epoch at which the message triggering the message was sent
+
+These are the same in cases where there was no triggering message.  We discard
+a peering message if the message's query_epoch if the PG in question has entered
+a new epoch (See PG::old_peering_evt, PG::queue_peering_event).  Notifies,
+infos, notifies, and logs are all handled as PG::RecoveryMachine events and
+are wrapped by PG::queue_* by PG::CephPeeringEvts, which include the created
+state machine event along with epoch_sent and query_epoch in order to
+generically check PG::old_peering_message upon insertion and removal from the
+queue.
+
+Note, notifies, logs, and infos can trigger the creation of a PG.  See
+OSD::get_or_create_pg.
+
+
diff --git a/doc/dev/osd_internals/osd_overview.rst b/doc/dev/osd_internals/osd_overview.rst
new file mode 100644
index 0000000..1453e02
--- /dev/null
+++ b/doc/dev/osd_internals/osd_overview.rst
@@ -0,0 +1,106 @@
+===
+OSD
+===
+
+Concepts
+--------
+
+*Messenger*
+   See src/msg/Messenger.h
+
+   Handles sending and receipt of messages on behalf of the OSD.  The OSD uses
+   two messengers: 
+
+     1. cluster_messenger - handles traffic to other OSDs, monitors
+     2. client_messenger - handles client traffic
+
+	 This division allows the OSD to be configured with different interfaces for
+	 client and cluster traffic.
+
+*Dispatcher*
+   See src/msg/Dispatcher.h
+
+	 OSD implements the Dispatcher interface.  Of particular note is ms_dispatch,
+	 which serves as the entry point for messages received via either the client
+	 or cluster messenger.  Because there are two messengers, ms_dispatch may be
+	 called from at least two threads.  The osd_lock is always held during
+	 ms_dispatch.
+
+*WorkQueue*
+  See src/common/WorkQueue.h
+
+  The WorkQueue class abstracts the process of queueing independent tasks
+  for asynchronous execution.  Each OSD process contains workqueues for
+  distinct tasks:
+
+    1. OpWQ: handles ops (from clients) and subops (from other OSDs).
+       Runs in the op_tp threadpool.
+    2. PeeringWQ: handles peering tasks and pg map advancement
+       Runs in the op_tp threadpool.
+       See Peering
+    3. CommandWQ: handles commands (pg query, etc)
+       Runs in the command_tp threadpool.
+    4. RecoveryWQ: handles recovery tasks.
+       Runs in the recovery_tp threadpool.
+    5. SnapTrimWQ: handles snap trimming
+       Runs in the disk_tp threadpool.
+       See SnapTrimmer
+    6. ScrubWQ: handles primary scrub path
+       Runs in the disk_tp threadpool.
+       See Scrub
+    7. ScrubFinalizeWQ: handles primary scrub finalize
+       Runs in the disk_tp threadpool.
+       See Scrub
+    8. RepScrubWQ: handles replica scrub path
+       Runs in the disk_tp threadpool
+       See Scrub
+    9. RemoveWQ: Asynchronously removes old pg directories
+       Runs in the disk_tp threadpool
+       See PGRemoval
+
+*ThreadPool*
+  See src/common/WorkQueue.h
+  See also above.
+
+  There are 4 OSD threadpools:
+
+    1. op_tp: handles ops and subops
+    2. recovery_tp: handles recovery tasks
+    3. disk_tp: handles disk intensive tasks
+    4. command_tp: handles commands
+
+*OSDMap*
+  See src/osd/OSDMap.h
+
+  The crush algorithm takes two inputs: a picture of the cluster
+  with status information about which nodes are up/down and in/out, 
+  and the pgid to place.  The former is encapsulated by the OSDMap.
+  Maps are numbered by *epoch* (epoch_t).  These maps are passed around
+  within the OSD as std::tr1::shared_ptr<const OSDMap>.
+
+  See MapHandling
+
+*PG*
+  See src/osd/PG.* src/osd/ReplicatedPG.*
+
+  Objects in rados are hashed into *PGs* and *PGs* are placed via crush onto
+  OSDs.  The PG structure is responsible for handling requests pertaining to
+  a particular *PG* as well as for maintaining relevant metadata and controlling
+  recovery.
+
+*OSDService*
+  See src/osd/OSD.cc OSDService
+
+  The OSDService acts as a broker between PG threads and OSD state which allows
+  PGs to perform actions using OSD services such as workqueues and messengers.
+  This is still a work in progress.  Future cleanups will focus on moving such
+  state entirely from the OSD into the OSDService.
+
+Overview
+--------
+  See src/ceph_osd.cc
+
+  The OSD process represents one leaf device in the crush hierarchy.  There
+  might be one OSD process per physical machine, or more than one if, for
+  example, the user configures one OSD instance per disk.
+  
diff --git a/doc/dev/osd_internals/osd_throttles.rst b/doc/dev/osd_internals/osd_throttles.rst
new file mode 100644
index 0000000..e1142b3
--- /dev/null
+++ b/doc/dev/osd_internals/osd_throttles.rst
@@ -0,0 +1,93 @@
+=============
+OSD Throttles
+=============
+
+There are three significant throttles in the filestore: wbthrottle,
+op_queue_throttle, and a throttle based on journal usage.
+
+WBThrottle
+----------
+The WBThrottle is defined in src/os/filestore/WBThrottle.[h,cc] and
+included in FileStore as FileStore::wbthrottle.  The intention is to
+bound the amount of outstanding IO we need to do to flush the journal.
+At the same time, we don't want to necessarily do it inline in case we
+might be able to combine several IOs on the same object close together
+in time.  Thus, in FileStore::_write, we queue the fd for asyncronous
+flushing and block in FileStore::_do_op if we have exceeded any hard
+limits until the background flusher catches up.
+
+The relevant config options are filestore_wbthrottle*.  There are
+different defaults for btrfs and xfs.  Each set has hard and soft
+limits on bytes (total dirty bytes), ios (total dirty ios), and
+inodes (total dirty fds).  The WBThrottle will begin flushing
+when any of these hits the soft limit and will block in throttle()
+while any has exceeded the hard limit.
+
+Tighter soft limits will cause writeback to happen more quickly,
+but may cause the OSD to miss oportunities for write coalescing.
+Tighter hard limits may cause a reduction in latency variance by
+reducing time spent flushing the journal, but may reduce writeback
+parallelism.
+
+op_queue_throttle
+-----------------
+The op queue throttle is intended to bound the amount of queued but
+uncompleted work in the filestore by delaying threads calling
+queue_transactions more and more based on how many ops and bytes are
+currently queued.  The throttle is taken in queue_transactions and
+released when the op is applied to the filesystem.  This period
+includes time spent in the journal queue, time spent writing to the
+journal, time spent in the actual op queue, time spent waiting for the
+wbthrottle to open up (thus, the wbthrottle can push back indirectly
+on the queue_transactions caller), and time spent actually applying
+the op to the filesystem.  A BackoffThrottle is used to gradually
+delay the queueing thread after each throttle becomes more than
+filestore_queue_low_threshhold full (a ratio of
+filestore_queue_max_(bytes|ops)).  The throttles will block once the
+max value is reached (filestore_queue_max_(bytes|ops)).
+
+The significant config options are:
+filestore_queue_low_threshhold
+filestore_queue_high_threshhold
+filestore_expected_throughput_ops
+filestore_expected_throughput_bytes
+filestore_queue_high_delay_multiple
+filestore_queue_max_delay_multiple
+
+While each throttle is at less than low_threshhold of the max,
+no delay happens.  Between low and high, the throttle will
+inject a per-op delay (per op or byte) ramping from 0 at low to
+high_delay_multiple/expected_throughput at high.  From high to
+1, the delay will ramp from high_delay_multiple/expected_throughput
+to max_delay_multiple/expected_throughput.
+
+filestore_queue_high_delay_multiple and
+filestore_queue_max_delay_multiple probably do not need to be
+changed.
+
+Setting these properly should help to smooth out op latencies by
+mostly avoiding the hard limit.
+
+See FileStore::throttle_ops and FileSTore::thottle_bytes.
+
+journal usage throttle
+----------------------
+See src/os/filestore/JournalThrottle.h/cc
+
+The intention of the journal usage throttle is to gradually slow
+down queue_transactions callers as the journal fills up in order
+to smooth out hiccup during filestore syncs.  JournalThrottle
+wraps a BackoffThrottle and tracks journaled but not flushed
+journal entries so that the throttle can be released when the
+journal is flushed.  The configs work very similarly to the
+op_queue_throttle.
+
+The significant config options are:
+journal_throttle_low_threshhold
+journal_throttle_high_threshhold
+filestore_expected_throughput_ops
+filestore_expected_throughput_bytes
+journal_throttle_high_multiple
+journal_throttle_max_multiple
+
+.. literalinclude:: osd_throttles.txt
diff --git a/doc/dev/osd_internals/osd_throttles.txt b/doc/dev/osd_internals/osd_throttles.txt
new file mode 100644
index 0000000..0332377
--- /dev/null
+++ b/doc/dev/osd_internals/osd_throttles.txt
@@ -0,0 +1,21 @@
+                                                                                                   Messenger throttle (number and size)
+         |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+                                                                     FileStore op_queue throttle (number and size, includes a soft throttle based on filestore_expected_throughput_(ops|bytes))
+                                                                |--------------------------------------------------------|
+                                                                                                                                                                   WBThrottle
+                                                                                                                       |---------------------------------------------------------------------------------------------------------|
+                                                                                                                                                                 Journal (size, includes a soft throttle based on filestore_expected_throughput_bytes)
+                                                                 |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+                                                                                                                       |----------------------------------------------------------------------------------------------------> flushed ----------------> synced
+                                                                                                                       |
+Op: Read Header --DispatchQ--> OSD::_dispatch --OpWQ--> PG::do_request --journalq--> Journal --FileStore::OpWQ--> Apply Thread --Finisher--> op_applied ------------------------------------------------------------->  Complete
+                                              |                                                                                                                                                                      |
+SubOp:                                        --Messenger--> ReadHeader --DispatchQ--> OSD::_dispatch --OpWQ--> PG::do_request --journalq--> Journal --FileStore::OpWQ--> Apply Thread --Finisher--> sub_op_applied -
+                                                                                                                                                                              |
+                                                                                                                                                                              |-----------------------------> flushed ----------------> synced
+                                                                                                                                                |------------------------------------------------------------------------------------------|
+                                                                                                                                                                                        Journal (size)
+                                                                                                                                                                              |---------------------------------|
+                                                                                                                                                                                        WBThrottle
+                                                                                                                         |-----------------------------------------------------|
+                                                                                                                            FileStore op_queue throttle (number and size)
diff --git a/doc/dev/osd_internals/pg.rst b/doc/dev/osd_internals/pg.rst
new file mode 100644
index 0000000..4055363
--- /dev/null
+++ b/doc/dev/osd_internals/pg.rst
@@ -0,0 +1,31 @@
+====
+PG
+====
+
+Concepts
+--------
+
+*Peering Interval*
+  See PG::start_peering_interval.
+  See PG::acting_up_affected
+  See PG::RecoveryState::Reset
+
+  A peering interval is a maximal set of contiguous map epochs in which the
+  up and acting sets did not change.  PG::RecoveryMachine represents a 
+  transition from one interval to another as passing through
+  RecoveryState::Reset.  On PG::RecoveryState::AdvMap PG::acting_up_affected can
+  cause the pg to transition to Reset.
+  
+
+Peering Details and Gotchas
+---------------------------
+For an overview of peering, see `Peering <../../peering>`_.
+
+  * PG::flushed defaults to false and is set to false in
+    PG::start_peering_interval.  Upon transitioning to PG::RecoveryState::Started
+    we send a transaction through the pg op sequencer which, upon complete,
+    sends a FlushedEvt which sets flushed to true.  The primary cannot go
+    active until this happens (See PG::RecoveryState::WaitFlushedPeering).
+    Replicas can go active but cannot serve ops (writes or reads).
+    This is necessary because we cannot read our ondisk state until unstable
+    transactions from the previous interval have cleared.
diff --git a/doc/dev/osd_internals/pg_removal.rst b/doc/dev/osd_internals/pg_removal.rst
new file mode 100644
index 0000000..d968ecc
--- /dev/null
+++ b/doc/dev/osd_internals/pg_removal.rst
@@ -0,0 +1,56 @@
+==========
+PG Removal
+==========
+
+See OSD::_remove_pg, OSD::RemoveWQ
+
+There are two ways for a pg to be removed from an OSD:
+
+  1. MOSDPGRemove from the primary
+  2. OSD::advance_map finds that the pool has been removed
+
+In either case, our general strategy for removing the pg is to
+atomically set the metadata objects (pg->log_oid, pg->biginfo_oid) to
+backfill and asynronously remove the pg collections.  We do not do
+this inline because scanning the collections to remove the objects is
+an expensive operation.
+
+OSDService::deleting_pgs tracks all pgs in the process of being
+deleted.  Each DeletingState object in deleting_pgs lives while at
+least one reference to it remains.  Each item in RemoveWQ carries a
+reference to the DeletingState for the relevant pg such that
+deleting_pgs.lookup(pgid) will return a null ref only if there are no
+collections currently being deleted for that pg. 
+
+The DeletingState for a pg also carries information about the status
+of the current deletion and allows the deletion to be cancelled.
+The possible states are:
+
+  1. QUEUED: the PG is in the RemoveWQ
+  2. CLEARING_DIR: the PG's contents are being removed synchronously
+  3. DELETING_DIR: the PG's directories and metadata being queued for removal
+  4. DELETED_DIR: the final removal transaction has been queued
+  5. CANCELED: the deletion has been canceled
+
+In 1 and 2, the deletion can be canceled.  Each state transition
+method (and check_canceled) returns false if deletion has been
+canceled and true if the state transition was successful.  Similarly,
+try_stop_deletion() returns true if it succeeds in canceling the
+deletion.  Additionally, try_stop_deletion() in the event that it
+fails to stop the deletion will not return until the final removal
+transaction is queued.  This ensures that any operations queued after
+that point will be ordered after the pg deletion.
+
+OSD::_create_lock_pg must handle two cases:
+
+  1. Either there is no DeletingStateRef for the pg, or it failed to cancel
+  2. We succeeded in canceling the deletion.
+
+In case 1., we proceed as if there were no deletion occurring, except that
+we avoid writing to the PG until the deletion finishes.  In case 2., we
+proceed as in case 1., except that we first mark the PG as backfilling.
+
+Similarly, OSD::osr_registry ensures that the OpSequencers for those
+pgs can be reused for a new pg if created before the old one is fully
+removed, ensuring that operations on the new pg are sequenced properly
+with respect to operations on the old one.
diff --git a/doc/dev/osd_internals/recovery_reservation.rst b/doc/dev/osd_internals/recovery_reservation.rst
new file mode 100644
index 0000000..edbf4c9
--- /dev/null
+++ b/doc/dev/osd_internals/recovery_reservation.rst
@@ -0,0 +1,74 @@
+====================
+Recovery Reservation
+====================
+
+Recovery reservation extends and subsumes backfill reservation. The
+reservation system from backfill recovery is used for local and remote
+reservations.
+
+When a PG goes active, first it determines what type of recovery is
+necessary, if any. It may need log-based recovery, backfill recovery,
+both, or neither.
+
+In log-based recovery, the primary first acquires a local reservation
+from the OSDService's local_reserver. Then a MRemoteReservationRequest
+message is sent to each replica in order of OSD number. These requests
+will always be granted (i.e., cannot be rejected), but they may take
+some time to be granted if the remotes have already granted all their
+remote reservation slots.
+
+After all reservations are acquired, log-based recovery proceeds as it
+would without the reservation system.
+
+After log-based recovery completes, the primary releases all remote
+reservations. The local reservation remains held. The primary then
+determines whether backfill is necessary. If it is not necessary, the
+primary releases its local reservation and waits in the Recovered state
+for all OSDs to indicate that they are clean.
+
+If backfill recovery occurs after log-based recovery, the local
+reservation does not need to be reacquired since it is still held from
+before. If it occurs immediately after activation (log-based recovery
+not possible/necessary), the local reservation is acquired according to
+the typical process.
+
+Once the primary has its local reservation, it requests a remote
+reservation from the backfill target. This reservation CAN be rejected,
+for instance if the OSD is too full (osd_backfill_full_ratio config
+option). If the reservation is rejected, the primary drops its local
+reservation, waits (osd_backfill_retry_interval), and then retries. It
+will retry indefinitely.
+
+Once the primary has the local and remote reservations, backfill
+proceeds as usual. After backfill completes the remote reservation is
+dropped.
+
+Finally, after backfill (or log-based recovery if backfill was not
+necessary), the primary drops the local reservation and enters the
+Recovered state. Once all the PGs have reported they are clean, the
+primary enters the Clean state and marks itself active+clean.
+
+
+--------------
+Things to Note
+--------------
+
+We always grab the local reservation first, to prevent a circular
+dependency. We grab remote reservations in order of OSD number for the
+same reason.
+
+The recovery reservation state chart controls the PG state as reported
+to the monitor. The state chart can set:
+
+ - recovery_wait: waiting for local/remote reservations
+ - recovering: recovering
+ - wait_backfill: waiting for remote backfill reservations
+ - backfilling: backfilling
+ - backfill_toofull: backfill reservation rejected, OSD too full
+
+
+--------
+See Also
+--------
+
+The Active substate of the automatically generated OSD state diagram.
diff --git a/doc/dev/osd_internals/scrub.rst b/doc/dev/osd_internals/scrub.rst
new file mode 100644
index 0000000..3343b39
--- /dev/null
+++ b/doc/dev/osd_internals/scrub.rst
@@ -0,0 +1,30 @@
+
+Scrubbing Behavior Table
+========================
+
++-------------------------------------------------+----------+-----------+---------------+----------------------+
+|                                          Flags  | none     | noscrub   | nodeep_scrub  | noscrub/nodeep_scrub |
++=================================================+==========+===========+===============+======================+
+| Periodic tick                                   |   S      |    X      |     S         |         X            |
++-------------------------------------------------+----------+-----------+---------------+----------------------+
+| Periodic tick after osd_deep_scrub_interval     |   D      |    D      |     S         |         X            |
++-------------------------------------------------+----------+-----------+---------------+----------------------+
+| Initiated scrub                                 |   S      |    S      |     S         |         S            |
++-------------------------------------------------+----------+-----------+---------------+----------------------+
+| Initiated scrub after osd_deep_scrub_interval   |   D      |    D      |     S         |         S            |
++-------------------------------------------------+----------+-----------+---------------+----------------------+
+| Initiated deep scrub                            |   D      |    D      |     D         |         D            |
++-------------------------------------------------+----------+-----------+---------------+----------------------+
+
+- X = Do nothing
+- S = Do regular scrub
+- D = Do deep scrub
+
+State variables
+---------------
+
+- Periodic tick state is !must_scrub && !must_deep_scrub && !time_for_deep 
+- Periodic tick after osd_deep_scrub_interval state is !must_scrub && !must_deep_scrub && time_for_deep 
+- Initiated scrub state is  must_scrub && !must_deep_scrub && !time_for_deep
+- Initiated scrub after osd_deep_scrub_interval state is must scrub && !must_deep_scrub && time_for_deep
+- Initiated deep scrub state is  must_scrub && must_deep_scrub
diff --git a/doc/dev/osd_internals/snaps.rst b/doc/dev/osd_internals/snaps.rst
new file mode 100644
index 0000000..4cce9e8
--- /dev/null
+++ b/doc/dev/osd_internals/snaps.rst
@@ -0,0 +1,124 @@
+======
+Snaps
+======
+
+Overview
+--------
+Rados supports two related snapshotting mechanisms:
+
+  1. *pool snaps*: snapshots are implicitely applied to all objects
+     in a pool
+  2. *self managed snaps*: the user must provide the current *SnapContext*
+     on each write.
+
+These two are mutually exclusive, only one or the other can be used on
+a particular pool.
+
+The *SnapContext* is the set of snapshots currently defined for an object
+as well as the most recent snapshot (the *seq*) requested from the mon for
+sequencing purposes (a *SnapContext* with a newer *seq* is considered to
+be more recent).
+
+The difference between *pool snaps* and *self managed snaps* from the
+OSD's point of view lies in whether the *SnapContext* comes to the OSD
+via the client's MOSDOp or via the most recent OSDMap.
+
+See OSD::make_writeable
+
+Ondisk Structures
+-----------------
+Each object has in the pg collection a *head* object (or *snapdir*, which we
+will come to shortly) and possibly a set of *clone* objects.
+Each hobject_t has a snap field.  For the *head* (the only writeable version
+of an object), the snap field is set to CEPH_NOSNAP.  For the *clones*, the
+snap field is set to the *seq* of the *SnapContext* at their creation.
+When the OSD services a write, it first checks whether the most recent
+*clone* is tagged with a snapid prior to the most recent snap represented
+in the *SnapContext*.  If so, at least one snapshot has occurred between
+the time of the write and the time of the last clone.  Therefore, prior
+to performing the mutation, the OSD creates a new clone for servicing
+reads on snaps between the snapid of the last clone and the most recent
+snapid.
+
+The *head* object contains a *SnapSet* encoded in an attribute, which tracks
+
+  1. The full set of snaps defined for the object
+  2. The full set of clones which currently exist
+  3. Overlapping intervals between clones for tracking space usage
+  4. Clone size
+
+If the *head* is deleted while there are still clones, a *snapdir* object
+is created instead to house the *SnapSet*.
+
+Additionally, the *object_info_t* on each clone includes a vector of snaps
+for which clone is defined.
+
+Snap Removal
+------------
+To remove a snapshot, a request is made to the *Monitor* cluster to
+add the snapshot id to the list of purged snaps (or to remove it from
+the set of pool snaps in the case of *pool snaps*).  In either case,
+the *PG* adds the snap to its *snap_trimq* for trimming.
+
+A clone can be removed when all of its snaps have been removed.  In
+order to determine which clones might need to be removed upon snap
+removal, we maintain a mapping from snap to *hobject_t* using the
+*SnapMapper*.
+
+See ReplicatedPG::SnapTrimmer, SnapMapper
+
+This trimming is performed asynchronously by the snap_trim_wq while the
+pg is clean and not scrubbing.
+
+  #. The next snap in PG::snap_trimq is selected for trimming
+  #. We determine the next object for trimming out of PG::snap_mapper.
+     For each object, we create a log entry and repop updating the
+     object info and the snap set (including adjusting the overlaps).
+  #. We also locally update our *SnapMapper* instance with the object's
+     new snaps.
+  #. The log entry containing the modification of the object also
+     contains the new set of snaps, which the replica uses to update
+     its own *SnapMapper* instance.
+  #. The primary shares the info with the replica, which persists
+     the new set of purged_snaps along with the rest of the info.
+
+
+Recovery
+--------
+Because the trim operations are implemented using repops and log entries,
+normal pg peering and recovery maintain the snap trimmer operations with
+the caveat that push and removal operations need to update the local
+*SnapMapper* instance.  If the purged_snaps update is lost, we merely
+retrim a now empty snap.
+
+SnapMapper
+----------
+*SnapMapper* is implemented on top of map_cacher<string, bufferlist>,
+which provides an interface over a backing store such as the filesystem
+with async transactions.  While transactions are incomplete, the map_cacher
+instance buffers unstable keys allowing consistent access without having
+to flush the filestore.  *SnapMapper* provides two mappings:
+
+  1. hobject_t -> set<snapid_t>: stores the set of snaps for each clone
+     object
+  2. snapid_t -> hobject_t: stores the set of hobjects with the snapshot
+     as one of its snaps
+
+Assumption: there are lots of hobjects and relatively few snaps.  The
+first encoding has a stringification of the object as the key and an
+encoding of the set of snaps as a value.  The second mapping, because there
+might be many hobjects for a single snap, is stored as a collection of keys
+of the form stringify(snap)_stringify(object) such that stringify(snap)
+is constant length.  These keys have a bufferlist encoding
+pair<snapid, hobject_t> as a value.  Thus, creating or trimming a single
+object does not involve reading all objects for any snap.  Additionally,
+upon construction, the *SnapMapper* is provided with a mask for filtering
+the objects in the single SnapMapper keyspace belonging to that pg.
+
+Split
+-----
+The snapid_t -> hobject_t key entries are arranged such that for any pg,
+up to 8 prefixes need to be checked to determine all hobjects in a particular
+snap for a particular pg.  Upon split, the prefixes to check on the parent
+are adjusted such that only the objects remaining in the pg will be visible.
+The children will immediately have the correct mapping.
diff --git a/doc/dev/osd_internals/watch_notify.rst b/doc/dev/osd_internals/watch_notify.rst
new file mode 100644
index 0000000..24e9a4b
--- /dev/null
+++ b/doc/dev/osd_internals/watch_notify.rst
@@ -0,0 +1,81 @@
+============
+Watch Notify
+============
+
+See librados for the watch/notify interface.
+
+Overview
+--------
+The object_info (See osd/osd_types.h) tracks the set of watchers for
+a particular object persistently in the object_info_t::watchers map.
+In order to track notify progress, we also maintain some ephemeral
+structures associated with the ObjectContext.
+
+Each Watch has an associated Watch object (See osd/Watch.h).  The
+ObjectContext for a watched object will have a (strong) reference
+to one Watch object per watch, and each Watch object holds a
+reference to the corresponding ObjectContext.  This circular reference
+is deliberate and is broken when the Watch state is discarded on
+a new peering interval or removed upon timeout expiration or an
+unwatch operation.
+
+A watch tracks the associated connection via a strong
+ConnectionRef Watch::conn.  The associated connection has a
+WatchConState stashed in the OSD::Session for tracking associated
+Watches in order to be able to notify them upon ms_handle_reset()
+(via WatchConState::reset()).
+
+Each Watch object tracks the set of currently un-acked notifies.
+start_notify() on a Watch object adds a reference to a new in-progress
+Notify to the Watch and either:
+
+* if the Watch is *connected*, sends a Notify message to the client
+* if the Watch is *unconnected*, does nothing.
+
+When the Watch becomes connected (in ReplicatedPG::do_osd_op_effects),
+Notifies are resent to all remaining tracked Notify objects.
+
+Each Notify object tracks the set of un-notified Watchers via
+calls to complete_watcher().  Once the remaining set is empty or the
+timeout expires (cb, registered in init()) a notify completion
+is sent to the client.
+
+Watch Lifecycle
+---------------
+A watch may be in one of 5 states:
+
+1. Non existent.
+2. On disk, but not registered with an object context.
+3. Connected
+4. Disconnected, callback registered with timer
+5. Disconnected, callback in queue for scrub or is_degraded
+
+Case 2 occurs between when an OSD goes active and the ObjectContext
+for an object with watchers is loaded into memory due to an access.
+During Case 2, no state is registered for the watch.  Case 2
+transitions to Case 4 in ReplicatedPG::populate_obc_watchers() during
+ReplicatedPG::find_object_context.  Case 1 becomes case 3 via
+OSD::do_osd_op_effects due to a watch operation.  Case 4,5 become case
+3 in the same way. Case 3 becomes case 4 when the connection resets
+on a watcher's session.
+
+Cases 4&5 can use some explanation.  Normally, when a Watch enters Case
+4, a callback is registered with the OSDService::watch_timer to be
+called at timeout expiration.  At the time that the callback is
+called, however, the pg might be in a state where it cannot write
+to the object in order to remove the watch (i.e., during a scrub
+or while the object is degraded).  In that case, we use
+Watch::get_delayed_cb() to generate another Context for use from
+the callbacks_for_degraded_object and Scrubber::callbacks lists.
+In either case, Watch::unregister_cb() does the right thing
+(SafeTimer::cancel_event() is harmless for contexts not registered
+with the timer).
+
+Notify Lifecycle
+----------------
+The notify timeout is simpler: a timeout callback is registered when
+the notify is init()'d.  If all watchers ack notifies before the
+timeout occurs, the timeout is canceled and the client is notified
+of the notify completion.  Otherwise, the timeout fires, the Notify
+object pings each Watch via cancel_notify to remove itself, and
+sends the notify completion to the client early.
diff --git a/doc/dev/osd_internals/wbthrottle.rst b/doc/dev/osd_internals/wbthrottle.rst
new file mode 100644
index 0000000..a3ae00d
--- /dev/null
+++ b/doc/dev/osd_internals/wbthrottle.rst
@@ -0,0 +1,28 @@
+==================
+Writeback Throttle
+==================
+
+Previously, the filestore had a problem when handling large numbers of
+small ios.  We throttle dirty data implicitely via the journal, but
+a large number of inodes can be dirtied without filling the journal
+resulting in a very long sync time when the sync finally does happen.
+The flusher was not an adequate solution to this problem since it
+forced writeback of small writes too eagerly killing performance.
+
+WBThrottle tracks unflushed io per hobject_t and ::fsyncs in lru
+order once the start_flusher threshold is exceeded for any of
+dirty bytes, dirty ios, or dirty inodes.  While any of these exceed
+the hard_limit, we block on throttle() in _do_op.
+
+See src/os/WBThrottle.h, src/osd/WBThrottle.cc
+
+To track the open FDs through the writeback process, there is now an
+fdcache to cache open fds.  lfn_open now returns a cached FDRef which
+implicitely closes the fd once all references have expired.
+
+Filestore syncs have a sideeffect of flushing all outstanding objects
+in the wbthrottle.
+
+lfn_unlink clears the cached FDRef and wbthrottle entries for the
+unlinked object when the last link is removed and asserts that all
+outstanding FDRefs for that object are dead.
diff --git a/doc/dev/peering.rst b/doc/dev/peering.rst
new file mode 100644
index 0000000..ed1b04b
--- /dev/null
+++ b/doc/dev/peering.rst
@@ -0,0 +1,259 @@
+======================
+Peering
+======================
+
+Concepts
+--------
+
+*Peering*
+   the process of bringing all of the OSDs that store
+   a Placement Group (PG) into agreement about the state
+   of all of the objects (and their metadata) in that PG.
+   Note that agreeing on the state does not mean that
+   they all have the latest contents.
+
+*Acting set*
+   the ordered list of OSDs who are (or were as of some epoch)
+   responsible for a particular PG.
+
+*Up set*
+   the ordered list of OSDs responsible for a particular PG for
+   a particular epoch according to CRUSH.  Normally this
+   is the same as the *acting set*, except when the *acting set* has been
+   explicitly overridden via *PG temp* in the OSDMap.
+
+*PG temp* 
+   a temporary placement group acting set used while backfilling the
+   primary osd. Let say acting is [0,1,2] and we are
+   active+clean. Something happens and acting is now [3,1,2]. osd 3 is
+   empty and can't serve reads although it is the primary. osd.3 will
+   see that and request a *PG temp* of [1,2,3] to the monitors using a
+   MOSDPGTemp message so that osd.1 temporarily becomes the
+   primary. It will select osd.3 as a backfill peer and continue to
+   serve reads and writes while osd.3 is backfilled. When backfilling
+   is complete, *PG temp* is discarded and the acting set changes back
+   to [3,1,2] and osd.3 becomes the primary.
+
+*current interval* or *past interval*
+   a sequence of OSD map epochs during which the *acting set* and *up
+   set* for particular PG do not change
+
+*primary*
+   the (by convention first) member of the *acting set*,
+   who is responsible for coordination peering, and is
+   the only OSD that will accept client initiated
+   writes to objects in a placement group.
+
+*replica*
+   a non-primary OSD in the *acting set* for a placement group
+   (and who has been recognized as such and *activated* by the primary).
+
+*stray*
+   an OSD who is not a member of the current *acting set*, but
+   has not yet been told that it can delete its copies of a
+   particular placement group.
+
+*recovery*
+   ensuring that copies of all of the objects in a PG
+   are on all of the OSDs in the *acting set*.  Once
+   *peering* has been performed, the primary can start
+   accepting write operations, and *recovery* can proceed
+   in the background.
+
+*PG info* basic metadata about the PG's creation epoch, the version
+   for the most recent write to the PG, *last epoch started*, *last
+   epoch clean*, and the beginning of the *current interval*.  Any
+   inter-OSD communication about PGs includes the *PG info*, such that
+   any OSD that knows a PG exists (or once existed) also has a lower
+   bound on *last epoch clean* or *last epoch started*.
+
+*PG log*
+   a list of recent updates made to objects in a PG.
+   Note that these logs can be truncated after all OSDs
+   in the *acting set* have acknowledged up to a certain
+   point.
+
+*missing set*
+   Each OSD notes update log entries and if they imply updates to
+   the contents of an object, adds that object to a list of needed
+   updates.  This list is called the *missing set* for that <OSD,PG>.
+
+*Authoritative History*
+   a complete, and fully ordered set of operations that, if
+   performed, would bring an OSD's copy of a Placement Group
+   up to date.
+
+*epoch*
+   a (monotonically increasing) OSD map version number
+
+*last epoch start*
+   the last epoch at which all nodes in the *acting set*
+   for a particular placement group agreed on an
+   *authoritative history*.  At this point, *peering* is
+   deemed to have been successful.
+
+*up_thru*
+   before a primary can successfully complete the *peering* process,
+   it must inform a monitor that is alive through the current
+   OSD map epoch by having the monitor set its *up_thru* in the osd
+   map.  This helps peering ignore previous *acting sets* for which
+   peering never completed after certain sequences of failures, such as
+   the second interval below:
+
+   - *acting set* = [A,B]
+   - *acting set* = [A]
+   - *acting set* = [] very shortly after (e.g., simultaneous failure, but staggered detection)
+   - *acting set* = [B] (B restarts, A does not)
+
+*last epoch clean*
+   the last epoch at which all nodes in the *acting set*
+   for a particular placement group were completely
+   up to date (both PG logs and object contents).
+   At this point, *recovery* is deemed to have been
+   completed.
+
+Description of the Peering Process
+----------------------------------
+
+The *Golden Rule* is that no write operation to any PG
+is acknowledged to a client until it has been persisted
+by all members of the *acting set* for that PG.  This means
+that if we can communicate with at least one member of
+each *acting set* since the last successful *peering*, someone
+will have a record of every (acknowledged) operation
+since the last successful *peering*.
+This means that it should be possible for the current
+primary to construct and disseminate a new *authoritative history*.
+
+It is also important to appreciate the role of the OSD map
+(list of all known OSDs and their states, as well as some
+information about the placement groups) in the *peering*
+process:
+
+   When OSDs go up or down (or get added or removed)
+   this has the potential to affect the *active sets*
+   of many placement groups.
+
+   Before a primary successfully completes the *peering*
+   process, the OSD map must reflect that the OSD was alive
+   and well as of the first epoch in the *current interval*.
+
+   Changes can only be made after successful *peering*.
+
+Thus, a new primary can use the latest OSD map along with a recent
+history of past maps to generate a set of *past intervals* to
+determine which OSDs must be consulted before we can successfully
+*peer*.  The set of past intervals is bounded by *last epoch started*,
+the most recent *past interval* for which we know *peering* completed.
+The process by with an OSD discovers a PG exists in the first place is
+by exchanging *PG info* messages, so the OSD always has some lower
+bound on *last epoch started*.
+
+The high level process is for the current PG primary to:
+
+  1. get a recent OSD map (to identify the members of the all
+     interesting *acting sets*, and confirm that we are still the
+     primary).
+
+  #. generate a list of *past intervals* since *last epoch started*.
+     Consider the subset of those for which *up_thru* was greater than
+     the first interval epoch by the last interval epoch's OSD map; that is,
+     the subset for which *peering* could have completed before the *acting
+     set* changed to another set of OSDs.
+
+     Successful *peering* will require that we be able to contact at
+     least one OSD from each of *past interval*'s *acting set*.
+
+  #. ask every node in that list for its *PG info*, which includes the most
+     recent write made to the PG, and a value for *last epoch started*.  If
+     we learn about a *last epoch started* that is newer than our own, we can
+     prune older *past intervals* and reduce the peer OSDs we need to contact.
+
+  #. if anyone else has (in its PG log) operations that I do not have,
+     instruct them to send me the missing log entries so that the primary's
+     *PG log* is up to date (includes the newest write)..
+
+  #. for each member of the current *acting set*:
+
+     a. ask it for copies of all PG log entries since *last epoch start*
+	so that I can verify that they agree with mine (or know what
+	objects I will be telling it to delete).
+
+	If the cluster failed before an operation was persisted by all
+	members of the *acting set*, and the subsequent *peering* did not
+	remember that operation, and a node that did remember that
+	operation later rejoined, its logs would record a different
+	(divergent) history than the *authoritative history* that was
+	reconstructed in the *peering* after the failure.
+
+	Since the *divergent* events were not recorded in other logs
+	from that *acting set*, they were not acknowledged to the client,
+	and there is no harm in discarding them (so that all OSDs agree
+	on the *authoritative history*).  But, we will have to instruct
+	any OSD that stores data from a divergent update to delete the
+	affected (and now deemed to be apocryphal) objects.
+
+     #. ask it for its *missing set* (object updates recorded
+	in its PG log, but for which it does not have the new data).
+	This is the list of objects that must be fully replicated
+	before we can accept writes.
+
+  #. at this point, the primary's PG log contains an *authoritative history* of
+     the placement group, and the OSD now has sufficient
+     information to bring any other OSD in the *acting set* up to date.
+
+  #. if the primary's *up_thru* value in the current OSD map is not greater than
+     or equal to the first epoch in the *current interval*, send a request to the
+     monitor to update it, and wait until receive an updated OSD map that reflects
+     the change.
+
+  #. for each member of the current *acting set*:
+
+     a. send them log updates to bring their PG logs into agreement with
+	my own (*authoritative history*) ... which may involve deciding
+	to delete divergent objects.
+
+     #. await acknowledgment that they have persisted the PG log entries.
+
+  #. at this point all OSDs in the *acting set* agree on all of the meta-data,
+     and would (in any future *peering*) return identical accounts of all
+     updates.
+
+     a. start accepting client write operations (because we have unanimous
+	agreement on the state of the objects into which those updates are
+	being accepted).  Note, however, that if a client tries to write to an
+        object it will be promoted to the front of the recovery queue, and the
+        write willy be applied after it is fully replicated to the current *acting set*.
+
+     #. update the *last epoch started* value in our local *PG info*, and instruct
+	other *active set* OSDs to do the same.
+
+     #. start pulling object data updates that other OSDs have, but I do not.  We may
+	need to query OSDs from additional *past intervals* prior to *last epoch started*
+	(the last time *peering* completed) and following *last epoch clean* (the last epoch that
+	recovery completed) in order to find copies of all objects.
+
+     #. start pushing object data updates to other OSDs that do not yet have them.
+
+	We push these updates from the primary (rather than having the replicas
+	pull them) because this allows the primary to ensure that a replica has
+	the current contents before sending it an update write.  It also makes
+	it possible for a single read (from the primary) to be used to write
+	the data to multiple replicas.  If each replica did its own pulls,
+	the data might have to be read multiple times.
+
+  #. once all replicas store the all copies of all objects (that
+     existed prior to the start of this epoch) we can update *last
+     epoch clean* in the *PG info*, and we can dismiss all of the
+     *stray* replicas, allowing them to delete their copies of objects
+     for which they are no longer in the *acting set*.
+
+     We could not dismiss the *strays* prior to this because it was possible
+     that one of those *strays* might hold the sole surviving copy of an
+     old object (all of whose copies disappeared before they could be
+     replicated on members of the current *acting set*).
+
+State Model
+-----------
+
+.. graphviz:: peering_graph.generated.dot
diff --git a/doc/dev/perf_counters.rst b/doc/dev/perf_counters.rst
new file mode 100644
index 0000000..91589f4
--- /dev/null
+++ b/doc/dev/perf_counters.rst
@@ -0,0 +1,166 @@
+===============
+ Perf counters
+===============
+
+The perf counters provide generic internal infrastructure for gauges and counters.  The counted values can be both integer and float.  There is also an "average" type (normally float) that combines a sum and num counter which can be divided to provide an average.
+
+The intention is that this data will be collected and aggregated by a tool like ``collectd`` or ``statsd`` and fed into a tool like ``graphite`` for graphing and analysis.
+
+Access
+------
+
+The perf counter data is accessed via the admin socket.  For example::
+
+   ceph daemon osd.0 perf schema
+   ceph daemon osd.0 perf dump
+
+
+Collections
+-----------
+
+The values are grouped into named collections, normally representing a subsystem or an instance of a subsystem.  For example, the internal ``throttle`` mechanism reports statistics on how it is throttling, and each instance is named something like::
+
+
+    throttle-msgr_dispatch_throttler-hbserver
+    throttle-msgr_dispatch_throttler-client
+    throttle-filestore_bytes
+    ...
+
+
+Schema
+------
+
+The ``perf schema`` command dumps a json description of which values are available, and what their type is.  Each named value as a ``type`` bitfield, with the following bits defined.
+
++------+-------------------------------------+
+| bit  | meaning                             |
++======+=====================================+
+| 1    | floating point value                |
++------+-------------------------------------+
+| 2    | unsigned 64-bit integer value       |
++------+-------------------------------------+
+| 4    | average (sum + count pair)          |
++------+-------------------------------------+
+| 8    | counter (vs gauge)                  |
++------+-------------------------------------+
+
+Every value with have either bit 1 or 2 set to indicate the type (float or integer).  If bit 8 is set (counter), the reader may want to subtract off the previously read value to get the delta during the previous interval.  
+
+If bit 4 is set (average), there will be two values to read, a sum and a count.  If it is a counter, the average for the previous interval would be sum delta (since the previous read) divided by the count delta.  Alternatively, dividing the values outright would provide the lifetime average value.  Normally these are used to measure latencies (number of requests and a sum of request latencies), and the average for the previous interval is what is interesting.
+
+Here is an example of the schema output::
+
+ {
+   "throttle-msgr_dispatch_throttler-hbserver" : {
+      "get_or_fail_fail" : {
+         "type" : 10
+      },
+      "get_sum" : {
+         "type" : 10
+      },
+      "max" : {
+         "type" : 10
+      },
+      "put" : {
+         "type" : 10
+      },
+      "val" : {
+         "type" : 10
+      },
+      "take" : {
+         "type" : 10
+      },
+      "get_or_fail_success" : {
+         "type" : 10
+      },
+      "wait" : {
+         "type" : 5
+      },
+      "get" : {
+         "type" : 10
+      },
+      "take_sum" : {
+         "type" : 10
+      },
+      "put_sum" : {
+         "type" : 10
+      }
+   },
+   "throttle-msgr_dispatch_throttler-client" : {
+      "get_or_fail_fail" : {
+         "type" : 10
+      },
+      "get_sum" : {
+         "type" : 10
+      },
+      "max" : {
+         "type" : 10
+      },
+      "put" : {
+         "type" : 10
+      },
+      "val" : {
+         "type" : 10
+      },
+      "take" : {
+         "type" : 10
+      },
+      "get_or_fail_success" : {
+         "type" : 10
+      },
+      "wait" : {
+         "type" : 5
+      },
+      "get" : {
+         "type" : 10
+      },
+      "take_sum" : {
+         "type" : 10
+      },
+      "put_sum" : {
+         "type" : 10
+      }
+   }
+ }
+
+
+Dump
+----
+
+The actual dump is similar to the schema, except that average values are grouped.  For example::
+
+ {
+   "throttle-msgr_dispatch_throttler-hbserver" : {
+      "get_or_fail_fail" : 0,
+      "get_sum" : 0,
+      "max" : 104857600,
+      "put" : 0,
+      "val" : 0,
+      "take" : 0,
+      "get_or_fail_success" : 0,
+      "wait" : {
+         "avgcount" : 0,
+         "sum" : 0
+      },
+      "get" : 0,
+      "take_sum" : 0,
+      "put_sum" : 0
+   },
+   "throttle-msgr_dispatch_throttler-client" : {
+      "get_or_fail_fail" : 0,
+      "get_sum" : 82760,
+      "max" : 104857600,
+      "put" : 2637,
+      "val" : 0,
+      "take" : 0,
+      "get_or_fail_success" : 0,
+      "wait" : {
+         "avgcount" : 0,
+         "sum" : 0
+      },
+      "get" : 2637,
+      "take_sum" : 0,
+      "put_sum" : 82760
+   }
+ }
+
diff --git a/doc/dev/placement-group.rst b/doc/dev/placement-group.rst
new file mode 100644
index 0000000..a544e99
--- /dev/null
+++ b/doc/dev/placement-group.rst
@@ -0,0 +1,152 @@
+============================
+ PG (Placement Group) notes
+============================
+
+Miscellaneous copy-pastes from emails, when this gets cleaned up it
+should move out of /dev.
+
+Overview
+========
+
+PG = "placement group". When placing data in the cluster, objects are
+mapped into PGs, and those PGs are mapped onto OSDs. We use the
+indirection so that we can group objects, which reduces the amount of
+per-object metadata we need to keep track of and processes we need to
+run (it would be prohibitively expensive to track eg the placement
+history on a per-object basis). Increasing the number of PGs can
+reduce the variance in per-OSD load across your cluster, but each PG
+requires a bit more CPU and memory on the OSDs that are storing it. We
+try and ballpark it at 100 PGs/OSD, although it can vary widely
+without ill effects depending on your cluster. You hit a bug in how we
+calculate the initial PG number from a cluster description.
+
+There are a couple of different categories of PGs; the 6 that exist
+(in the original emailer's ``ceph -s`` output) are "local" PGs which
+are tied to a specific OSD. However, those aren't actually used in a
+standard Ceph configuration.
+
+
+Mapping algorithm (simplified)
+==============================
+
+| > How does the Object->PG mapping look like, do you map more than one object on
+| > one PG, or do you sometimes map an object to more than one PG? How about the
+| > mapping of PGs to OSDs, does one PG belong to exactly one OSD?
+| >
+| > Does one PG represent a fixed amount of storage space?
+
+Many objects map to one PG.
+
+Each object maps to exactly one PG.
+
+One PG maps to a single list of OSDs, where the first one in the list
+is the primary and the rest are replicas.
+
+Many PGs can map to one OSD.
+
+A PG represents nothing but a grouping of objects; you configure the
+number of PGs you want (see
+http://ceph.com/wiki/Changing_the_number_of_PGs ), number of
+OSDs * 100 is a good starting point, and all of your stored objects
+are pseudo-randomly evenly distributed to the PGs. So a PG explicitly
+does NOT represent a fixed amount of storage; it represents 1/pg_num
+'th of the storage you happen to have on your OSDs.
+
+Ignoring the finer points of CRUSH and custom placement, it goes
+something like this in pseudocode::
+
+	locator = object_name
+	obj_hash = hash(locator)
+	pg = obj_hash % num_pg
+	OSDs_for_pg = crush(pg)  # returns a list of OSDs
+	primary = osds_for_pg[0]
+	replicas = osds_for_pg[1:]
+
+If you want to understand the crush() part in the above, imagine a
+perfectly spherical datacenter in a vacuum ;) that is, if all OSDs
+have weight 1.0, and there is no topology to the data center (all OSDs
+are on the top level), and you use defaults, etc, it simplifies to
+consistent hashing; you can think of it as::
+
+	def crush(pg):
+	   all_osds = ['osd.0', 'osd.1', 'osd.2', ...]
+	   result = []
+	   # size is the number of copies; primary+replicas
+	   while len(result) < size:
+	       r = hash(pg)
+	       chosen = all_osds[ r % len(all_osds) ]
+	       if chosen in result:
+	           # OSD can be picked only once
+	           continue
+	       result.append(chosen)
+	   return result
+
+User-visible PG States
+======================
+
+.. todo:: diagram of states and how they can overlap
+
+*creating*
+  the PG is still being created
+
+*active*
+  requests to the PG will be processed
+
+*clean*
+  all objects in the PG are replicated the correct number of times
+
+*down*
+  a replica with necessary data is down, so the pg is offline
+
+*replay*
+  the PG is waiting for clients to replay operations after an OSD crashed
+
+*splitting*
+  the PG is being split into multiple PGs (not functional as of 2012-02)
+
+*scrubbing*
+  the PG is being checked for inconsistencies
+
+*degraded*
+  some objects in the PG are not replicated enough times yet
+
+*inconsistent*
+  replicas of the PG are not consistent (e.g. objects are
+  the wrong size, objects are missing from one replica *after* recovery
+  finished, etc.)
+
+*peering*
+  the PG is undergoing the :doc:`/dev/peering` process
+
+*repair*
+  the PG is being checked and any inconsistencies found will be repaired (if possible)
+
+*recovering*
+  objects are being migrated/synchronized with replicas
+
+*recovery_wait*
+  the PG is waiting for the local/remote recovery reservations
+
+*backfilling*
+  a special case of recovery, in which the entire contents of
+  the PG are scanned and synchronized, instead of inferring what
+  needs to be transferred from the PG logs of recent operations
+
+*backfill_wait*
+  the PG is waiting in line to start backfill
+
+*backfill_toofull*
+  backfill reservation rejected, OSD too full
+
+*incomplete*
+  a pg is missing a necessary period of history from its
+  log.  If you see this state, report a bug, and try to start any
+  failed OSDs that may contain the needed information.
+
+*stale*
+  the PG is in an unknown state - the monitors have not received
+  an update for it since the PG mapping changed.
+
+*remapped*
+  the PG is temporarily mapped to a different set of OSDs from what
+  CRUSH specified
diff --git a/doc/dev/quick_guide.rst b/doc/dev/quick_guide.rst
new file mode 100644
index 0000000..6a4fe08
--- /dev/null
+++ b/doc/dev/quick_guide.rst
@@ -0,0 +1,119 @@
+=================================
+ Developer Guide (Quick)
+=================================
+
+This guide will describe how to build and test Ceph for development.
+
+Development
+-----------
+
+The ``run-make-check.sh`` script will install Ceph dependencies,
+compile everything in debug mode and run a number of tests to verify
+the result behaves as expected.
+
+.. code::
+
+       $ ./run-make-check.sh
+
+
+Running a development deployment
+--------------------------------
+Ceph contains a script called ``vstart.sh`` (see also :doc:`/dev/dev_cluster_deployement`) which allows developers to quickly test their code using
+a simple deployment on your development system. Once the build finishes successfully, start the ceph
+deployment using the following command:
+
+.. code::
+
+	$ cd src
+	$ ./vstart.sh -d -n -x
+
+You can also configure ``vstart.sh`` to use only one monitor and one metadata server by using the following:
+
+.. code::
+
+	$ MON=1 MDS=1 ./vstart.sh -d -n -x
+
+The system creates three pools on startup: `cephfs_data`, `cephfs_metadata`, and `rbd`.  Let's get some stats on
+the current pools:
+
+.. code::
+
+	$ ./ceph osd pool stats
+	*** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
+	pool rbd id 0
+	  nothing is going on
+
+	pool cephfs_data id 1
+	  nothing is going on
+	
+	pool cephfs_metadata id 2
+	  nothing is going on
+	
+	$ ./ceph osd pool stats cephfs_data
+	*** DEVELOPER MODE: setting PATH, PYTHONPATH and LD_LIBRARY_PATH ***
+	pool cephfs_data id 1
+	  nothing is going on
+
+	$ ./rados df
+	pool name       category                 KB      objects       clones     degraded      unfound     rd        rd KB           wr        wr KB
+	rbd             -                          0            0            0            0     0            0            0            0            0
+	cephfs_data     -                          0            0            0            0     0            0            0            0            0
+	cephfs_metadata -                          2           20            0           40     0            0            0           21            8
+	  total used        12771536           20
+	  total avail     3697045460
+	  total space     3709816996
+
+
+Make a pool and run some benchmarks against it:
+
+.. code::
+
+	$ ./rados mkpool mypool
+	$ ./rados -p mypool bench 10 write -b 123
+
+Place a file into the new pool:
+
+.. code::
+
+	$ ./rados -p mypool put objectone <somefile>
+	$ ./rados -p mypool put objecttwo <anotherfile>
+
+List the objects in the pool:
+
+.. code::
+
+	$ ./rados -p mypool ls
+
+Once you are done, type the following to stop the development ceph deployment:
+
+.. code::
+
+	$ ./stop.sh
+
+Running a RadosGW development environment
+-----------------------------------------
+Add the ``-r`` to vstart.sh to enable the RadosGW
+
+.. code::
+
+	$ cd src
+	$ ./vstart.sh -d -n -x -r
+
+You can now use the swift python client to communicate with the RadosGW.
+
+.. code::
+
+    $ swift -A http://localhost:8000/auth -U tester:testing -K asdf list
+    $ swift -A http://localhost:8000/auth -U tester:testing -K asdf upload mycontainer ceph
+    $ swift -A http://localhost:8000/auth -U tester:testing -K asdf list
+
+
+Run unit tests
+--------------
+
+The tests are located in `src/tests`.  To run them type:
+
+.. code::
+
+	$ make check
+
diff --git a/doc/dev/radosgw/admin/adminops_nonimplemented.rst b/doc/dev/radosgw/admin/adminops_nonimplemented.rst
new file mode 100644
index 0000000..e579bd5
--- /dev/null
+++ b/doc/dev/radosgw/admin/adminops_nonimplemented.rst
@@ -0,0 +1,495 @@
+==================
+ Admin Operations
+==================
+
+An admin API request will be done on a URI that starts with the configurable 'admin'
+resource entry point. Authorization for the admin API duplicates the S3 authorization
+mechanism. Some operations require that the user holds special administrative capabilities.
+The response entity type (XML or JSON) may be specified as the 'format' option in the
+request and defaults to JSON if not specified.
+
+Get Object
+==========
+
+Get an existing object. NOTE: Does not require owner to be non-suspended.
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/bucket?object&format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket containing the object to be retrieved.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``object``
+
+:Description: The object to be retrieved.
+:Type: String
+:Example: ``foo.txt``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns the desired object.
+
+``object``
+
+:Description: The desired object.
+:Type: Object
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``NoSuchObject``
+
+:Description: Specified object does not exist.
+:Code: 404 Not Found
+
+Head Object
+===========
+
+Verify the existence of an object. If the object exists,
+metadata headers for the object will be returned.
+
+Syntax
+~~~~~~
+
+::
+
+	HEAD /{admin}/bucket?object HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket containing the object to be retrieved.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``object``
+
+:Description: The object to be retrieved.
+:Type: String
+:Example: ``foo.txt``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``NoSuchObject``
+
+:Description: Specified object does not exist.
+:Code: 404 Not Found
+
+Get Zone Info
+=============
+
+Get cluster information.
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/zone&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns cluster pool configuration.
+
+``zone``
+
+:Description: Contains current cluster pool configuration.
+:Type: Container
+
+``domain_root``
+
+:Description: root of all buckets.
+:Type: String
+:Parent: ``cluster``
+
+``control_pool``
+
+:Description: 
+:Type: String
+:Parent: ``cluster``
+
+``gc_pool``
+
+:Description: Garbage collection pool.
+:Type: String
+:Parent: ``cluster``
+
+``log_pool``
+
+:Description: Log pool.
+:Type: String
+:Parent: ``cluster``
+
+``intent_log_pool``
+
+:Description: Intent log pool.
+:Type: String
+:Parent: ``cluster``
+
+``usage_log_pool``
+
+:Description: Usage log pool.
+:Type: String
+:Parent: ``cluster``
+
+``user_keys_pool``
+
+:Description: User key pool.
+:Type: String
+:Parent: ``cluster``
+
+``user_email_pool``
+
+:Description: User email pool.
+:Type: String
+:Parent: ``cluster``
+
+``user_swift_pool``
+
+:Description: Pool of swift users.
+:Type: String
+:Parent: ``cluster``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+None.
+
+Example Response
+~~~~~~~~~~~~~~~~
+
+::
+
+	HTTP/1.1 200
+	Content-Type: application/json
+
+	{
+	  "domain_root": ".rgw",
+	  "control_pool": ".rgw.control",
+	  "gc_pool": ".rgw.gc",
+	  "log_pool": ".log",
+	  "intent_log_pool": ".intent-log",
+	  "usage_log_pool": ".usage",
+	  "user_keys_pool": ".users",
+	  "user_email_pool": ".users.email",
+	  "user_swift_pool": ".users.swift",
+	  "user_uid_pool ": ".users.uid"
+	}
+
+
+
+Add Placement Pool
+==================
+
+Make a pool available for data placement.
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{admin}/pool?format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``pool``
+
+:Description: The pool to be made available for data placement.
+:Type: String
+:Example: ``foo_pool``
+:Required: Yes
+
+``create``
+
+:Description: Creates the data pool if it does not exist.
+:Type: Boolean
+:Example: False [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Remove Placement Pool
+=====================
+
+Make a pool unavailable for data placement.
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/pool?format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``pool``
+
+:Description: The existing pool to be made available for data placement.
+:Type: String
+:Example: ``foo_pool``
+:Required: Yes
+
+``destroy``
+
+:Description: Destroys the pool after removing it from the active set.
+:Type: Boolean
+:Example: False [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+TBD.
+
+List Available Data Placement Pools
+===================================
+
+List current pools available for data placement.
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/pool?format=json HTTP/1.1
+	Host {fqdn}
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns a list of pools available for data placement.
+
+``pools``
+
+:Description: Contains currently available pools for data placement.
+:Type: Container
+
+
+
+List Expired Garbage Collection Items
+=====================================
+
+List objects scheduled for garbage collection.
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/garbage?format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+None.
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If expired garbage collection items exist, a list of such objects
+will be returned.
+
+``garbage``
+
+:Description: Expired garbage collection items.
+:Type: Container
+
+``object``
+
+:Description: A container garbage collection object information.
+:Type: Container
+:Parent: ``garbage``
+
+``name``
+
+:Description: The name of the object.
+:Type: String
+:Parent: ``object``
+
+``expired``
+
+:Description: The date at which the object expired.
+:Type: String
+:Parent: ``object``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Manually Processes Garbage Collection Items
+===========================================
+
+List objects scheduled for garbage collection.
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/garbage?format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+None.
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If expired garbage collection items exist, a list of removed objects
+will be returned.
+
+``garbage``
+
+:Description: Expired garbage collection items.
+:Type: Container
+
+``object``
+
+:Description: A container garbage collection object information.
+:Type: Container
+:Parent: ``garbage``
+
+``name``
+
+:Description: The name of the object.
+:Type: String
+:Parent: ``object``
+
+``expired``
+
+:Description: The date at which the object expired.
+:Type: String
+:Parent: ``object``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Show Log Objects
+================
+
+Show log objects
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/log?format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``object``
+
+:Description: The log object to return.
+:Type: String:
+:Example: ``2012-10-11-09-4165.2-foo_bucket``
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If no object is specified, returns the full list of log objects.
+
+``log-objects``
+
+:Description: A list of log objects.
+:Type: Container
+
+``object``
+
+:Description: The name of the log object.
+:Type: String
+
+``log``
+
+:Description: The contents of the log object.
+:Type: Container
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+None.
+
+Standard Error Responses
+========================
+
+``AccessDenied``
+
+:Description: Access denied.
+:Code: 403 Forbidden
+
+``InternalError``
+
+:Description: Internal server error.
+:Code: 500 Internal Server Error
+
+``NoSuchUser``
+
+:Description: User does not exist.
+:Code: 404 Not Found
+
+``NoSuchBucket``
+
+:Description: Bucket does not exist.
+:Code: 404 Not Found
+
+``NoSuchKey``
+
+:Description: No such access key.
+:Code: 404 Not Found
diff --git a/doc/dev/radosgw/index.rst b/doc/dev/radosgw/index.rst
new file mode 100644
index 0000000..5f77609
--- /dev/null
+++ b/doc/dev/radosgw/index.rst
@@ -0,0 +1,13 @@
+=======================================
+ RADOS Gateway developer documentation
+=======================================
+
+.. rubric:: Contents
+
+.. toctree::
+   :maxdepth: 1   
+   
+   
+   usage
+   Admin Ops Nonimplemented <admin/adminops_nonimplemented>
+   s3_compliance
diff --git a/doc/dev/radosgw/s3_compliance.rst b/doc/dev/radosgw/s3_compliance.rst
new file mode 100644
index 0000000..f22b303
--- /dev/null
+++ b/doc/dev/radosgw/s3_compliance.rst
@@ -0,0 +1,304 @@
+===============================
+Rados Gateway S3 API Compliance
+===============================
+
+.. warning::
+	This document is a draft, it might not be accurate
+
+----------------------
+Naming code reference
+----------------------
+
+Here comes a BNF definition on how to name a feature in the code for referencing purpose : ::
+
+    name ::= request_type "_" ( header | operation ) ( "_" header_option )?
+    
+    request_type ::= "req" | "res"
+    
+    header ::= string
+    
+    operation ::= method resource
+    
+    method ::= "GET" | "PUT" | "POST" | "DELETE" | "OPTIONS" | "HEAD"
+    
+    resource ::= string
+    
+    header_option ::= string
+
+----------------------
+Common Request Headers
+----------------------
+
+S3 Documentation reference : http://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html
+
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Header               | Supported? | Code Links                                                                                              | Tests links |
++======================+============+=========================================================================================================+=============+
+| Authorization        | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1962 |             |
+|                      |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L2051 |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Content-Length       | Yes        |                                                                                                         |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Content-Type         | Yes        |                                                                                                         |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Content-MD5          | Yes        | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1249      |             |
+|                      |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1306      |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Date                 | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_auth_s3.cc#L164  |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Expect               | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest.cc#L1227    |             |
+|                      |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L802  |             |
+|                      |            | https://github.com/ceph/ceph/blob/76040d90f7eb9f9921a3b8dcd0f821ac2cd9c492/src/rgw/rgw_main.cc#L372     |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Host                 | ?          |                                                                                                         |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| x-amz-date           | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_auth_s3.cc#L169  |             |
+|                      |            | should take precedence over DATE as mentionned here ->                                                  |             |
+|                      |            | http://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html                            |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| x-amz-security-token | No         |                                                                                                         |             |
++----------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+
+-----------------------
+Common Response Headers
+-----------------------
+
+S3 Documentation reference : http://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html
+
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Header              | Supported? | Code Links                                                                                              | Tests links |
++=====================+============+=========================================================================================================+=============+
+| Content-Length      | Yes        |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Connection          | ?          |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Date                | ?          |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| ETag                | Yes        | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1312      |             |
+|                     |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1436      |             |
+|                     |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L2222      |             |
+|                     |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L118  |             |
+|                     |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L268  |             |
+|                     |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L516  |             |
+|                     |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1336 |             |
+|                     |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1486 |             |
+|                     |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1548 |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Server              | No         |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| x-amz-delete-marker | No         |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| x-amz-id-2          | No         |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| x-amz-request-id    | Yes        | https://github.com/ceph/ceph/commit/b711e3124f8f73c17ebd19b38807a1b77f201e44                            |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| x-amz-version-id    | No         |                                                                                                         |             |
++---------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+
+-------------------------
+Operations on the Service
+-------------------------
+
+S3 Documentation reference : http://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceOps.html
+
++------+-----------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Type | Operation | Supported? | Code links                                                                                              | Tests links |
++======+===========+============+=========================================================================================================+=============+
+| GET  | Service   | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L2094 |             |
+|      |           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1676 |             |
+|      |           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L185  |             |
++------+-----------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+
+---------------------
+Operations on Buckets
+---------------------
+
+S3 Documentation reference : http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketOps.html
+
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| Type   | Operation              | Supported? | Code links                                                                                                 | Tests links |
++========+========================+============+============================================================================================================+=============+
+| DELETE | Bucket                 | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1728    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/e91042171939b6bf82a56a1015c5cae792d228ad/src/rgw/rgw_rest_bucket.cc#L250 |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/e91042171939b6bf82a56a1015c5cae792d228ad/src/rgw/rgw_rest_bucket.cc#L212 |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/25948319c4d256c4aeb0137eb88947e54d14cc79/src/rgw/rgw_bucket.cc#L856      |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/25948319c4d256c4aeb0137eb88947e54d14cc79/src/rgw/rgw_bucket.cc#L513      |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/25948319c4d256c4aeb0137eb88947e54d14cc79/src/rgw/rgw_bucket.cc#L286      |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L461     |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| DELETE | Bucket cors            | ?          | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1731    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1916         |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| DELETE | Bucket lifecycle       | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| DELETE | Bucket policy          | ?          |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| DELETE | Bucket tagging         | ?          |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| DELETE | Bucket website         | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket                 | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1676    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L185     |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket acl             | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1697    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1728         |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1344    |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket cors            | ?          | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1698    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1845         |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/76040d90f7eb9f9921a3b8dcd0f821ac2cd9c492/src/rgw/rgw_main.cc#L345        |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket lifecycle       | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket location        | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket policy          | ?          | https://github.com/ceph/ceph/blob/e91042171939b6bf82a56a1015c5cae792d228ad/src/rgw/rgw_rest_bucket.cc#L232 |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/e91042171939b6bf82a56a1015c5cae792d228ad/src/rgw/rgw_rest_bucket.cc#L58  |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket logging         | ?          | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1695    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L287     |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket notification    | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket tagging         | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket Object versions | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket requestPayment  | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket versionning     | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | Bucket website         | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| GET    | List Multipart uploads | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1701    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest.cc#L877        |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L2355         |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L2363         |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| HEAD   | Bucket                 | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1713    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1689    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L826          |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L834          |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket                 | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1725    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L382     |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L437     |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L901          |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L945          |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket acl             | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1721    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1354    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1373    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1739         |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1753         |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket cors            | ?          | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1723    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1398    |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1858         |             |
+|        |                        |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1866         |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket lifecycle       | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket policy          | ?          |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket logging         | ?          |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket notification    | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket tagging         | ?          |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket requestPayment  | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket versionning     | No         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+| PUT    | Bucket website         | N0         |                                                                                                            |             |
++--------+------------------------+------------+------------------------------------------------------------------------------------------------------------+-------------+
+
+---------------------
+Operations on Objects
+---------------------
+
+S3 Documentation reference : http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectOps.html
+
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| Type    | Operation                 | Supported? | Code links                                                                                              | Tests links |
++=========+===========================+============+=========================================================================================================+=============+
+| DELETE  | Object                    | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1796 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1516      |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1524      |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| DELETE  | Multiple objects          | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1739 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1616 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1626 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1641 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1667 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1516      |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1524      |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| GET     | Object                    | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1767 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L71   |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L397       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L424       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L497       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L562       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L626       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L641       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L706       |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| GET     | Object acl                | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| GET     | Object torrent            | No         |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| HEAD    | Object                    | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1777 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L71   |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L397       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L424       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L497       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L562       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L626       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L641       |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L706       |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| OPTIONS | Object                    | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1814 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1418 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1951      |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1968      |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1993      |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| POST    | Object                    | Yes        | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1742 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L631  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L694  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L700  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L707  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L759  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L771  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L781  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L795  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L929  |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1037 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1059 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/8a2eb18494005aa968b71f18121da8ebab48e950/src/rgw/rgw_rest_s3.cc#L1134 |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1344      |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1360      |             |
+|         |                           |            | https://github.com/ceph/ceph/blob/b139a7cd34b4e203ab164ada7a8fa590b50d8b13/src/rgw/rgw_op.cc#L1365      |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| POST    | Object restore            | ?          |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Object                    | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Object acl                | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Object copy               | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Initate multipart upload  | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Upload Part               | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Upload Part copy          | ?          |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Complete multipart upload | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | Abort multipart upload    | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
+| PUT     | List parts                | Yes        |                                                                                                         |             |
++---------+---------------------------+------------+---------------------------------------------------------------------------------------------------------+-------------+
diff --git a/doc/dev/radosgw/usage.rst b/doc/dev/radosgw/usage.rst
new file mode 100644
index 0000000..6c856fc
--- /dev/null
+++ b/doc/dev/radosgw/usage.rst
@@ -0,0 +1,84 @@
+============================
+Usage Design Overview
+============================
+
+
+
+
+Testing
+-------
+
+The current usage testing does the following:
+
+Following these operations:
+
+ - Create a few buckets
+ - Remove buckets
+ - Create a bucket
+ - Put object
+ - Remove object
+
+Test:
+
+1. Verify that 'usage show' with delete_obj category isn't empty after no more than 45 seconds (wait to flush)
+2. Check the following
+
+  - 'usage show'
+
+    - does not error out
+    - num of entries > 0
+    - num of summary entries > 0
+    - for every entry in categories check successful_ops > 0
+    - check that correct uid in the user summary
+
+
+  - 'usage show' with specified uid (--uid=<uid>')
+
+    - num of entries > 0
+    - num of summary entries > 0
+    - for every entry in categories check successful_ops > 0
+    - check that correct uid in the user summary
+
+  - 'usage show' with specified uid and specified categories (create_bucket,
+    put_obj, delete_obj, delete_bucket)
+
+    - for each category:
+      - does not error out
+      - num of entries > 0
+      - user in user summary is correct user
+      - length of categories entries under user summary is exactly 1
+      - name of category under user summary is correct name
+      - successful ops for the category > 0
+
+  - 'usage trim' with specified uid
+    - does not error
+    - check following 'usage show' shows complete usage info cleared for user
+
+
+Additional required testing:
+
+ - test multiple users
+
+   Do the same as in (2), with multiple users being set up.
+
+ - test with multiple buckets (> 1000 * factor, e.g., 2000)
+
+   Create multiple buckets, put objects in each. Account the number written data and verify
+   that usage reports show the expected number (up to a certain delta).
+
+ - verify usage show with a date/time range
+
+   Take timestamp of the beginning of the test, and the end of the test. Round timestamps to the
+   nearest hour (downward from start of test, upward from the end of test). List data starting
+   at end-time, make sure that no data is being shown. List data ending at start-time, make sure
+   that no data is shown. List data beginning at start-time, make sure that correct data is
+   displayed. List data ending end end-time, make sure that correct data is displayed. List
+   data beginning in begin-time, ending in end-time, make sure that correct data is displayed.
+
+ - verify usage trim with a date/time range
+
+   Take timestamp of the beginning of the test, and the end of the test. Round timestamps to the
+   nearest hour (downward from start of test, upward from the end of test). Trim data starting
+   at end-time, make sure that no data has been trimmed. Trim data ending at start-time, make sure
+   that no data has been trimmed.  Trim data beginning in begin-time, ending in end-time, make sure
+   that all data has been trimmed.
diff --git a/doc/dev/rbd-diff.rst b/doc/dev/rbd-diff.rst
new file mode 100644
index 0000000..bff9582
--- /dev/null
+++ b/doc/dev/rbd-diff.rst
@@ -0,0 +1,69 @@
+RBD Incremental Backup
+======================
+
+This is a simple streaming file format for representing a diff between
+two snapshots (or a snapshot and the head) of an RBD image.
+
+Header
+~~~~~~
+
+"rbd diff v1\\n"
+
+Metadata records
+~~~~~~~~~~~~~~~~
+
+Every record has a one byte "tag" that identifies the record type,
+followed by some other data.
+
+Metadata records come in the first part of the image.  Order is not
+important, as long as all the metadata records come before the data
+records.
+
+From snap
+---------
+
+- u8: 'f'
+- le32: snap name length
+- snap name
+
+To snap
+-------
+
+- u8: 't'
+- le32: snap name length
+- snap name
+
+Size
+----
+
+- u8: 's'
+- le64: (ending) image size
+
+Data Records
+~~~~~~~~~~~~
+
+These records come in the second part of the sequence.
+
+Updated data
+------------
+
+- u8: 'w'
+- le64: offset
+- le64: length
+- length bytes of actual data
+
+Zero data
+---------
+
+- u8: 'z'
+- le64: offset
+- le64: length
+
+
+Final Record
+~~~~~~~~~~~~
+
+End
+---
+
+- u8: 'e'
diff --git a/doc/dev/rbd-layering.rst b/doc/dev/rbd-layering.rst
new file mode 100644
index 0000000..e6e224c
--- /dev/null
+++ b/doc/dev/rbd-layering.rst
@@ -0,0 +1,281 @@
+============
+RBD Layering
+============
+
+RBD layering refers to the creation of copy-on-write clones of block
+devices. This allows for fast image creation, for example to clone a
+golden master image of a virtual machine into a new instance. To
+simplify the semantics, you can only create a clone of a snapshot -
+snapshots are always read-only, so the rest of the image is
+unaffected, and there's no possibility of writing to them
+accidentally.
+
+From a user's perspective, a clone is just like any other rbd image.
+You can take snapshots of them, read/write them, resize them, etc.
+There are no restrictions on clones from a user's viewpoint.
+
+Note: the terms `child` and `parent` below mean an rbd image created
+by cloning, and the rbd image snapshot a child was cloned from.
+
+Command line interface
+----------------------
+
+Before cloning a snapshot, you must mark it as protected, to prevent
+it from being deleted while child images refer to it:
+::
+
+    $ rbd snap protect pool/image at snap
+
+Then you can perform the clone:
+::
+
+    $ rbd clone [--parent] pool/parent at snap [--image] pool2/child1
+
+You can create a clone with different object sizes from the parent:
+::
+
+    $ rbd clone --order 25 pool/parent at snap pool2/child2
+
+To delete the parent, you must first mark it unprotected, which checks
+that there are no children left:
+::
+
+    $ rbd snap unprotect pool/image at snap
+    Cannot unprotect: Still in use by pool2/image2
+    $ rbd children pool/image at snap
+    pool2/child1
+    pool2/child2
+    $ rbd flatten pool2/child1
+    $ rbd rm pool2/child2
+    $ rbd snap rm pool/image at snap
+    Cannot remove a protected snapshot: pool/image at snap
+    $ rbd snap unprotect pool/image at snap
+
+Then the snapshot can be deleted like normal:
+::
+
+    $ rbd snap rm pool/image at snap
+
+Implementation
+--------------
+
+Data Flow
+^^^^^^^^^
+
+In the initial implementation, called 'trivial layering', there will
+be no tracking of which objects exist in a clone. A read that hits a
+non-existent object will attempt to read from the parent snapshot, and
+this will continue recursively until an object exists or an image with
+no parent is found. This is done through the normal read path from
+the parent, so differing object sizes between parents and children
+do not matter.
+
+Before a write to an object is performed, the object is checked for
+existence. If it doesn't exist, a copy-up operation is performed,
+which means reading the relevant range of data from the parent
+snapshot and writing it (plus the original write) to the child
+image. To prevent races with multiple writes trying to copy-up the
+same object, this copy-up operation will include an atomic create. If
+the atomic create fails, the original write is done instead. This
+copy-up operation is implemented as a class method so that extra
+metadata can be stored by it in the future. In trivial layering, the
+copy-up operation copies the entire range needed to the child object
+(that is, the full size of the child object). A future optimization
+could make this copy-up more fine-grained.
+
+Another future optimization could be storing a bitmap of which objects
+actually exist in a child. This would obviate the check for existence
+before each write, and let reads go directly to the parent if needed.
+
+These optimizations are discussed in:
+
+http://marc.info/?l=ceph-devel&m=129867273303846
+
+Parent/Child relationships
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Children store a reference to their parent in their header, as a tuple
+of (pool id, image id, snapshot id). This is enough information to
+open the parent and read from it.
+
+In addition to knowing which parent a given image has, we want to be
+able to tell if a protected snapshot still has children. This is
+accomplished with a new per-pool object, `rbd_children`, which maps
+(parent pool id, parent image id, parent snapshot id) to a list of
+child image ids. This is stored in the same pool as the child image
+because the client creating a clone already has read/write access to
+everything in this pool, but may not have write access to the parent's
+pool. This lets a client with read-only access to one pool clone a
+snapshot from that pool into a pool they have full access to. It
+increases the cost of unprotecting an image, since this needs to check
+for children in every pool, but this is a rare operation. It would
+likely only be done before removing old images, which is already much
+more expensive because it involves deleting every data object in the
+image.
+
+Protection
+^^^^^^^^^^
+
+Internally, protection_state is a field in the header object that
+can be in three states. "protected", "unprotected", and
+"unprotecting". The first two are set as the result of "rbd
+protect/unprotect". The "unprotecting" state is set while the "rbd
+unprotect" command checks for any child images. Only snapshots in the
+"protected" state may be cloned, so the "unprotected" state prevents
+a race like:
+
+1. A: walk through all pools, look for clones, find none
+2. B: create a clone
+3. A: unprotect parent
+4. A: rbd snap rm pool/parent at snap
+
+Resizing
+^^^^^^^^
+
+Resizing an rbd image is like truncating a sparse file. New space is
+treated as zeroes, and shrinking an rbd image deletes the contents
+beyond the old bounds. This means that if you have a 10G image full of
+data, and you resize it down to 5G and then up to 10G again, the last
+5G is treated as zeroes (and any objects that held that data were
+removed when the image was shrunk).
+
+Layering complicates this because the absence of an object no longer
+implies it should be treated as zeroes - if the object is part of a
+clone, it may mean that some data needs to be read from the parent.
+
+To preserve the resizing behavior for clones, we need to keep track of
+which objects could be stored in the parent. We can track this as the
+amount of overlap the child has with the parent, since resizing only
+changes the end of an image. When a child is created, its overlap
+is the size of the parent snapshot. On each subsequent resize, the
+overlap is `min(overlap, new_size)`. That is, shrinking the image
+may shrinks the overlap, but increasing the image's size does not
+change the overlap.
+
+Objects that do not exist past the overlap are treated as zeroes.
+Objects that do not exist before that point fall back to reading
+from the parent.
+
+Since this overlap changes over time, we store it as part of the
+metadata for a snapshot as well.
+
+Renaming
+^^^^^^^^
+
+Currently the rbd header object (that stores all the metadata about an
+image) is named after the name of the image. This makes renaming
+disrupt clients who have the image open (such as children reading from
+a parent). To avoid this, we can name the header object by the
+id of the image, which does not change. That is, the name of the
+header object could be `rbd_header.$id`, where $id is a unique id for
+the image in the pool.
+
+When a client opens an image, all it knows is the name. There is
+already a per-pool `rbd_directory` object that maps image names to
+ids, but if we relied on it to get the id, we could not open any
+images in that pool if that single object was unavailable. To avoid
+this dependency, we can store the id of an image in an object called
+`rbd_id.$image_name`, where $image_name is the name of the image. The
+per-pool `rbd_directory` object is still useful for listing all images
+in a pool, however.
+
+Header changes
+--------------
+
+The header needs a few new fields:
+
+* int64_t parent_pool_id
+* string parent_image_id
+* uint64_t parent_snap_id
+* uint64_t overlap (how much of the image may be referring to the parent)
+
+These are stored in a "parent" key, which is only present if the image
+has a parent.
+
+cls_rbd
+^^^^^^^
+
+Some new methods are needed:
+::
+
+    /***************** methods on the rbd header *********************/
+    /**
+     * Sets the parent and overlap keys.
+     * Fails if any of these keys exist, since the image already
+     * had a parent.
+     */
+    set_parent(uint64_t pool_id, string image_id, uint64_t snap_id)
+
+    /**
+     * returns the parent pool id, image id, snap id, and overlap, or -ENOENT
+     * if parent_pool_id does not exist or is -1
+     */
+    get_parent(uint64_t snapid)
+
+    /**
+     * Removes the parent key
+     */
+    remove_parent() // after all parent data is copied to the child
+
+    /*************** methods on the rbd_children object *****************/
+
+    add_child(uint64_t parent_pool_id, string parent_image_id,
+              uint64_t parent_snap_id, string image_id);
+    remove_child(uint64_t parent_pool_id, string parent_image_id,
+                 uint64_t parent_snap_id, string image_id);
+    /**
+     * List ids of a given parent
+     */
+    get_children(uint64_t parent_pool_id, string parent_image_id,
+                 uint64_t parent_snap_id, uint64_t max_return,
+                 string start);
+    /**
+     * list parent
+     */
+    get_parents(uint64_t max_return, uint64_t start_pool_id,
+                string start_image_id, string start_snap_id);
+
+
+    /************ methods on the rbd_id.$image_name object **************/
+
+    set_id(string id)
+    get_id()
+
+    /************** methods on the rbd_directory object *****************/
+
+    dir_get_id(string name);
+    dir_get_name(string id);
+    dir_list(string start_after, uint64_t max_return);
+    dir_add_image(string name, string id);
+    dir_remove_image(string name, string id);
+    dir_rename_image(string src, string dest, string id);
+
+Two existing methods will change if the image supports
+layering:
+::
+
+    snapshot_add - stores current overlap and has_parent with
+                   other snapshot metadata (images that don't have
+                   layering enabled aren't affected)
+
+    set_size     - will adjust the parent overlap down as needed.
+
+librbd
+^^^^^^
+
+Opening a child image opens its parent (and this will continue
+recursively as needed). This means that an ImageCtx will contain a
+pointer to the parent image context. Differing object sizes won't
+matter, since reading from the parent will go through the parent
+image context.
+
+Discard will need to change for layered images so that it only
+truncates objects, and does not remove them. If we removed objects, we
+could not tell if we needed to read them from the parent.
+
+A new clone method will be added, which takes the same arguments as
+create except size (size of the parent image is used).
+
+Instead of expanding the rbd_info struct, we will break the metadata
+retrieval into several API calls.  Right now, the only users of
+rbd_stat() other than 'rbd info' only use it to retrieve image size.
diff --git a/doc/dev/release-process.rst b/doc/dev/release-process.rst
new file mode 100644
index 0000000..f7e853b
--- /dev/null
+++ b/doc/dev/release-process.rst
@@ -0,0 +1,173 @@
+======================
+  Ceph Release Process
+======================
+
+1. Build environment
+====================
+
+There are multiple build environments, debian based packages are built via pbuilder for multiple distributions.  The build hosts are listed in the ``deb_hosts`` file, and the list of distributions are in ``deb_dist``.  All distributions are build on each of the build hosts.  Currently there is 1 64 bit and 1 32 bit build host.
+
+The RPM based packages are built natively, so one distribution per build host.  The list of hosts is found in ``rpm_hosts``.
+
+Prior to building, it's necessary to update the pbuilder seed tarballs::
+
+    ./update_all_pbuilders.sh
+
+2. Setup keyring for signing packages
+=====================================
+
+::
+
+    export GNUPGHOME=<path to keyring dir>
+
+    # verify it's accessible
+    gpg --list-keys
+
+The release key should be present::
+
+  pub   4096R/17ED316D 2012-05-20
+  uid   Ceph Release Key <sage at newdream.net>
+
+
+3. Set up build area
+====================
+
+Clone the ceph and ceph-build source trees::
+
+    git clone http://github.com/ceph/ceph.git
+    git clone http://github.com/ceph/ceph-build.git
+
+In the ceph source directory, checkout next branch (for point releases use the {codename} branch)::
+
+    git checkout next
+
+Checkout the submodules::
+
+    git submodule update --force --init --recursive
+
+4.  Update Build version numbers
+================================
+
+Substitute the ceph release number where indicated below by the string ``0.xx``.
+
+Edit configure.ac and update the version number. Example diff::
+
+	-AC_INIT([ceph], [0.54], [ceph-devel at vger.kernel.org])
+	+AC_INIT([ceph], [0.55], [ceph-devel at vger.kernel.org])
+ 
+Update the version number in the debian change log::
+
+	DEBEMAIL user at host dch -v 0.xx-1
+
+Commit the changes::
+
+	git commit -a
+
+Tag the release::
+
+	../ceph-build/tag-release v0.xx
+
+
+5. Create Makefiles
+===================
+
+The actual configure options used to build packages are in the
+``ceph.spec.in`` and ``debian/rules`` files.  At this point we just
+need to create a Makefile.::
+
+	./do_autogen.sh
+
+
+6. Run the release scripts
+==========================
+
+This creates tarballs and copies them, with other needed files to
+the build hosts listed in deb_hosts and rpm_hosts, runs a local build
+script, then rsyncs the results back to the specified release directory.::
+
+	../ceph-build/do_release.sh /tmp/release
+
+
+7. Create RPM Repo
+==================
+
+Copy the rpms to the destination repo::
+
+       mkdir /tmp/rpm-repo
+       ../ceph-build/push_to_rpm_repo.sh /tmp/release /tmp/rpm-repo 0.xx
+
+Next add any additional rpms to the repo that are needed such as leveldb and
+and ceph-deploy.  See RPM Backports section
+
+Finally, sign the rpms and build the repo indexes::
+
+  ../ceph-build/sign_and_index_rpm_repo.sh /tmp/release /tmp/rpm-repo 0.xx
+
+
+8. Create Debian repo
+=====================
+
+The key-id used below is the id of the ceph release key from step 2::
+
+	mkdir /tmp/debian-repo
+	../ceph-build/gen_reprepro_conf.sh /tmp/debian-repo key-id
+	../ceph-build/push_to_deb_repo.sh /tmp/release /tmp/debian-repo 0.xx main
+
+
+Next add any addition debian packages that are needed such as leveldb and
+ceph-deploy.  See the Debian Backports section below.
+
+Debian packages are signed when added to the repo, so no further action is
+needed.
+
+
+9.  Push repos to ceph.org
+==========================
+
+For a development release::
+
+	rcp ceph-0.xx.tar.bz2 ceph-0.xx.tar.gz \
+	     ceph_site at ceph.com:ceph.com/downloads/.
+	rsync -av /tmp/rpm-repo/0.xx/ ceph_site at ceph.com:ceph.com/rpm-testing
+	rsync -av /tmp/debian-repo/ ceph_site at ceph.com:ceph.com/debian-testing
+
+For a stable release, replace {CODENAME} with the release codename (e.g., ``argonaut`` or ``bobtail``)::
+
+        rcp ceph-0.xx.tar.bz2 \
+            ceph_site at ceph.com:ceph.com/downloads/ceph-0.xx.tar.bz2
+        rcp ceph-0.xx.tar.gz  \
+            ceph_site at ceph.com:ceph.com/downloads/ceph-0.xx.tar.gz
+        rsync -av /tmp/rpm-repo/0.xx/ ceph_site at ceph.com:ceph.com/rpm-{CODENAME}
+        rsync -auv /tmp/debian-repo/ ceph_site at ceph.com:ceph.com/debian-{CODENAME}
+
+10. Update Git
+==============
+
+Point release
+-------------
+
+For point releases just push the version number update to the
+branch and the new tag::
+
+    git push origin {codename}
+    git push origin v0.xx
+
+Development and Stable releases
+-------------------------------
+
+For a development release, update tags for ``ceph.git``::
+
+    git push origin v0.xx
+    git push origin HEAD:last
+    git checkout master
+    git merge next
+    git push origin master
+    git push origin HEAD:next
+
+Similarly, for a development release, for both ``teuthology.git`` and ``ceph-qa-suite.git``::
+
+    git checkout master
+    git reset --hard origin/master
+    git branch -f last origin/next
+    git push -f origin last
+    git push -f origin master:next
diff --git a/doc/dev/repo-access.rst b/doc/dev/repo-access.rst
new file mode 100644
index 0000000..0196b0a
--- /dev/null
+++ b/doc/dev/repo-access.rst
@@ -0,0 +1,38 @@
+Notes on Ceph repositories
+==========================
+
+Special branches
+----------------
+
+* ``master``: current tip (integration branch)
+* ``next``: pending release (feature frozen, bugfixes only)
+* ``last``: last/previous release
+* ``dumpling``, ``cuttlefish``, ``bobtail``, ``argonaut``, etc.: stable release branches
+* ``dumpling-next``: backports for stable release, pending testing
+
+Rules
+-----
+
+The source repos are all on github.
+
+* Any branch pushed to ceph.git will kick off builds that will either
+  run unit tests or generate packages for gitbuilder.ceph.com.  Try
+  not to generate unnecessary load.  For private, unreviewed work,
+  only push to branches named ``wip-*``.  This avoids colliding with
+  any special branches.
+
+* Nothing should every reach a special branch unless it has been
+  reviewed.
+
+* Preferred means of review is via github pull requests to capture any
+  review discussion.
+
+* For multi-patch series, the pull request can be merged via github,
+  and a Reviewed-by: ... line added to the merge commit.
+
+* For single- (or few-) patch merges, it is preferable to add the
+  Reviewed-by: directly to the commit so that it is also visible when
+  the patch is cherry-picked for backports.
+
+* All backports should use ``git cherry-pick -x`` to capture which
+  commit they are cherry-picking from.
diff --git a/doc/dev/sepia.rst b/doc/dev/sepia.rst
new file mode 100644
index 0000000..6f83b2c
--- /dev/null
+++ b/doc/dev/sepia.rst
@@ -0,0 +1,9 @@
+Sepia community test lab
+========================
+
+The Ceph community maintains a test lab that is open to active
+contributors to the Ceph project.  Please see the `Sepia repository`_ for more
+information.
+
+.. _Sepia repository: https://github.com/ceph/sepia
+
diff --git a/doc/dev/session_authentication.rst b/doc/dev/session_authentication.rst
new file mode 100644
index 0000000..e8a5059
--- /dev/null
+++ b/doc/dev/session_authentication.rst
@@ -0,0 +1,160 @@
+==============================================
+Session Authentication for the Cephx Protocol
+==============================================
+Peter Reiher
+7/30/12
+
+The original Cephx protocol authenticated the client to the authenticator and set up a session 
+key used to authenticate the client to the server it needs to talk to.  It did not, however,
+authenticate the ongoing messages between the client and server.  Based on the fact that they
+share a secret key, these ongoing session messages can be easily authenticated by using the
+key to sign the messages.  
+
+This document describes changes to the code that allow such ongoing session authentication.
+The changes allow for future changes that permit other authentication protocols (and the 
+existing null NONE and UNKNOWN protocols) to handle signatures, but the only protocol that 
+actually does signatures, at the time of the writing, is the Cephx protocol.
+
+Introduction
+-------------
+
+This code comes into play after the Cephx protocol has completed.  At this point, the client and
+server share a secret key.  This key will be used for authentication.  For other protocols, there
+may or may not be such a key in place, and perhaps the actual procedures used to perform 
+signing will be different, so the code is written to be general.
+
+The "session" here is represented by an established pipe.  For such pipes, there should be a
+``session\_security`` structure attached to the pipe.  Whenever a message is to be sent on the
+pipe, code that handles the signature for this kind of session security will be called.  On the
+other end of the pipe, code that checks this kind of session security's message signatures will
+be called.  Messages that fail the signature check will not be processed further.  That implies
+that the sender had better be in agreement with the receiver on the session security being used,
+since otherwise messages will be uniformly dropped between them.
+
+The code is also prepared to handle encryption and decryption of session messages, which would
+add secrecy to the integrity provided by the signatures.  No protocol currently implemented
+encrypts the ongoing session messages, though.
+
+For this functionality to work, several steps are required.  First, the sender and receiver must have 
+a successful run of the cephx protocol to establish a shared key.  They must store that key somewhere
+that the pipe can get at later, to permit messages to be signed with it.  Sent messages must be
+signed, and received messages must have their signatures checked.
+
+The signature could be computed in a variety of ways, but currently its size is limited to 64 bits.
+A message's signature is placed in its footer, in a field called ``sig``.
+
+The signature code in Cephx can be turned on and off at runtime, using a Ceph boolean option called 
+``cephx\_sign\_messages``.  It is currently set to false, by default, so no messages will be signed.  It
+must be changed to true to cause signatures to be calculated and checked.
+
+Storing the Key
+---------------
+
+The key is needed to create signatures on the sending end and check signatures on the receiving end.
+In the future, if asymmetric crypto is an option, it's possible that two keys (a private one for
+this end of the pipe and a public one for the other end) would need to be stored. At this time,
+messages going in both directions will be signed with the same key, so only that key needs to be
+saved.
+
+The key is saved when the pipe is established.  On the client side, this happens in ``connect()``,
+which is located in ``msg/Pipe.cc``.  The key is obtained from a run of the Cephx protocol,
+which results in a successfully checked authorizer structure.  If there is such an authorizer
+available, the code calls ``get\_auth\_session\_handler()`` to create a new authentication session handler
+and stores it in the pipe data structure.  On the server side, a similar thing is done in 
+``accept()`` after the authorizer provided by the client has been verified.
+
+Once these things are done on either end of the connection, session authentication can start.
+
+These routines (``connect()`` and ``accept()``) are also used to handle situations where a new 
+session is being set up.  At this stage, no authorizer has been created yet, so there's no key.
+Special cases in the code that calls the signature code skip these calls when the 
+``CEPH\_AUTH\_UNKNOWN`` protocol is in use.  This protocol label is on the pre-authorizer
+messages in a session, indicating that negotiation on an authentication protocol is ongoing and
+thus signature is not possible.  There will be a reliable authentication operation later in this 
+session before anything sensitive should be passed, so this is not a security problem.
+
+Signing Messages
+----------------
+
+Messages are signed in the ``write\_message`` call located in ``msg/Pipe.cc``.  The actual
+signature process is to encrypt the CRCs for the message using the shared key.  Thus, we must
+defer signing until all CRCs have been computed.  The header CRC is computed last, so we
+call ``sign\_message()`` as soon as we've calculated that CRC.  
+
+``sign\_message()`` is a virtual function defined in ``auth/AuthSessionHandler.h``.  Thus,
+a specific version of it must be written for each authentication protocol supported.  Currently,
+only UNKNOWN, NONE and CEPHX are supported.  So there is a separate version of ``sign\_message()`` in
+``auth/unknown/AuthUnknownSessionHandler.h``, ``auth/none/AuthNoneSessionHandler.h`` and 
+``auth/cephx/CephxSessionHandler.cc``.  The UNKNOWN and NONE versions simply return 0, indicating 
+success.
+
+The CEPHX version is more extensive.  It is found in ``auth/cephx/CephxSessionHandler.cc``.  
+The first thing done is to determine if the run time option to handle signatures (see above) is on.  
+If not, the Cephx version of ``sign\_message()`` simply returns success without actually calculating 
+a signature or inserting it into the message.
+
+If the run time option is enabled, ``sign\_message()`` copies all of the message's CRCs (one from the
+header and three from the footer) into a buffer.  It calls ``encode\_encrypt()`` on the buffer,
+using the key obtained from the pipe's ``session\_security`` structure.  64 bits of the encrypted
+result are put into the message footer's signature field and a footer flag is set to indicate that
+the message was signed.  (This flag is a sanity check.  It is not regarded as definitive 
+evidence that the message was signed.  The presence of a ``session\_security`` structure at the
+receiving end requires a signature regardless of the value of this flag.)  If this all goes well,
+``sign\_message()`` returns 0.  If there is a problem anywhere along the line and no signature
+was computed, it returns ``SESSION\_SIGNATURE\_FAILURE``.
+
+Checking Signatures 
+-------------------
+
+The signature is checked by a routine called ``check\_message\_signature()``.  This is also a
+virtual function, defined in ``auth/AuthSessionHandler.h``.  So again there are specific versions
+for supported authentication protocols, such as UNKNOWN, NONE and CEPHX.  Again, the UNKNOWN and
+NONE versions are stored in ``auth/unknown/AuthUnknownSessionHandler.h`` and 
+``auth/none/AuthNoneSessionHandler.h``, respectively, and again they simply return 0, indicating
+success.
+
+The CEPHX version of ``check\_message\_signature()`` performs a real signature check.  This routine 
+(stored in ``auth/cephx/CephxSessionHandler.cc``) exits with success if the run time option has 
+disabled signatures.  Otherwise, it takes the CRCs from the header and footer, encrypts the result, 
+and compares it to the signature stored in the footer.  Since an earlier routine has checked that
+the CRCs actually match the contents of the message, it is unnecessary to recompute the CRCs
+on the raw data in the message.  The encryption is performed with the same ``encode\_encrypt()``
+routine used on the sending end, using the key stored in the local ``session\_security``
+data structure.  
+
+If everything checks out, the CEPHX routine returns 0, indicating succcess.  If there is a 
+problem, the routine returns ``SESSION\_SIGNATURE\_FAILURE``.
+
+Adding New Session Authentication Methods
+-----------------------------------------
+
+For the purpose of session authentication only (not the basic authentication of client and 
+server currently performed by the Cephx protocol), in addition to adding a new protocol, that
+protocol must have a ``sign\_message()`` routine and a ``check\_message\_signature`` routine.
+These routines will take a message pointer as a parameter and return 0 on success.  The procedure
+used to sign and check will be specific to the new method, but probably there will be a
+``session\_security`` structure attached to the pipe that contains a cryptographic key.  This
+structure will be either an ``AuthSessionHandler`` (found in ``auth/AuthSessionHandler.h``) 
+or a structure derived from that type.
+
+Adding Encryption to Sessions
+-----------------------------
+
+The existing code is partially, but not fully, set up to allow sessions to have their packets
+encrypted.  Part of adding encryption would be similar to adding a new authentication method.
+But one would also need to add calls to the encryption and decryption routines in ``write\_message()`` 
+and ``read\_message()``.  These calls would probably go near where the current calls for
+authentication are made.  You should consider whether you want to replace the existing calls
+with something more general that does whatever the chosen form of session security requires,
+rather than explicitly saying ``sign`` or ``encrypt``.
+
+Session Security Statistics
+---------------------------
+
+The existing Cephx authentication code keeps statistics on how many messages were signed, how
+many message signature were checked, and how many checks succeeded and failed.  It is prepared
+to keep similar statistics on encryption and decryption.  These statistics can be accessed through
+the call ``printAuthSessionHandlerStats`` in ``auth/AuthSessionHandler.cc``.  
+
+If new authentication or encryption methods are added, they should include code that keeps these
+statistics.
diff --git a/doc/dev/versions.rst b/doc/dev/versions.rst
new file mode 100644
index 0000000..bf5ee25
--- /dev/null
+++ b/doc/dev/versions.rst
@@ -0,0 +1,42 @@
+==================
+Public OSD Version
+==================
+
+We maintain two versions on disk: an eversion_t pg_log.head and a
+version_t info.user_version. Each object is tagged with both the pg
+version and user_version it was last modified with.  The PG version is
+modified by manipulating OpContext::at_version and then persisting it
+to the pg log as transactions, and is incremented in all the places it
+used to be. The user_version is modified by manipulating the new
+OpContext::user_at_version and is also persisted via the pg log
+transactions.
+user_at_version is modified only in ReplicatedPG::prepare_transaction
+when the op was a "user modify" (a non-watch write), and the durable
+user_version is updated according to the following rules:
+1) set user_at_version to the maximum of ctx->new_obs.oi.user_version+1
+and info.last_user_version+1.
+2) set user_at_version to the maximum of itself and
+ctx->at_version.version.
+3) ctx->new_obs.oi.user_version = ctx->user_at_version (to change the
+object's user_version)
+
+This set of update semantics mean that for traditional pools the
+user_version will be equal to the past reassert_version, while for
+caching pools the object and PG user-version will be able to cross
+pools without making a total mess of things.
+In order to support old clients, we keep the old reassert_version but
+rename it to "bad_replay_version"; we fill it in as before: for writes
+it is set to the at_version (and is the proper replay version); for
+watches it is set to our user version; for ENOENT replies it is set to
+the replay version's epoch but the user_version's version. We also now
+fill in the version_t portion of the bad_replay_version on read ops as
+well as write ops, which should be fine for all old clients.
+
+For new clients, we prevent them from reading bad_replay_version and
+add two proper members: user_version and replay_version; user_version
+is filled in on every operation (reads included) while replay_version
+is filled in for writes.
+
+The objclass function get_current_version() now always returns the
+pg->info.last_user_version, which means it is guaranteed to contain
+the version of the last user update in the PG (including on reads!).
diff --git a/doc/dev/wireshark.rst b/doc/dev/wireshark.rst
new file mode 100644
index 0000000..e03b362
--- /dev/null
+++ b/doc/dev/wireshark.rst
@@ -0,0 +1,41 @@
+=====================
+ Wireshark Dissector
+=====================
+
+Wireshark has support for the Ceph protocol and it will be shipped in the 1.12.1
+release.
+
+Using
+=====
+
+To use the Wireshark dissector you must build it from `git`__, the process is
+outlined in great detail in the `Building and Installing`__ section of the
+`Wireshark Users Guide`__.
+
+__ `Wireshark git`_
+__ WSUG_BI_
+__ WSUG_
+
+Developing
+==========
+
+The Ceph dissector lives in `Wireshark git`_ at
+``epan/dissectors/packet-ceph.c``.  At the top of that file there are some
+comments explaining how to insert new functionality or to update the encoding
+of existing types.
+
+Before you start hacking on Wireshark code you should look at the
+``doc/README.developer`` and ``doc/README.dissector`` documents as they explain
+the basics of writing dissectors.  After reading those two documents you should
+be prepared to work on the Ceph dissector.  `The Wireshark
+developers guide`__ also contains a lot of useful information but it is less
+directed and is more useful as a reference then an introduction.
+
+__ WSDG_
+
+.. _WSUG: https://www.wireshark.org/docs/wsug_html_chunked/
+.. _WSDG: https://www.wireshark.org/docs/wsdg_html_chunked/
+.. _WSUG_BI: https://www.wireshark.org/docs/wsug_html_chunked/ChapterBuildInstall.html
+.. _Wireshark git: https://www.wireshark.org/develop.html
+
+.. vi: textwidth=80 noexpandtab
diff --git a/doc/favicon.ico b/doc/favicon.ico
new file mode 100644
index 0000000..90e538b
Binary files /dev/null and b/doc/favicon.ico differ
diff --git a/doc/glossary.rst b/doc/glossary.rst
new file mode 100644
index 0000000..603ac76
--- /dev/null
+++ b/doc/glossary.rst
@@ -0,0 +1,150 @@
+===============
+ Ceph Glossary
+===============
+
+Ceph is growing rapidly. As firms deploy Ceph, the technical terms such as
+"RADOS", "RBD," "RGW" and so forth require corresponding marketing terms
+that explain what each component does. The terms in this glossary are 
+intended to complement the existing technical terminology.
+
+Sometimes more than one term applies to a definition. Generally, the first
+term reflects a term consistent with Ceph's marketing, and secondary terms
+reflect either technical terms or legacy ways of referring to Ceph systems.
+
+
+.. glossary:: 
+
+	Ceph Project
+		The aggregate term for the people, software, mission and infrastructure 
+		of Ceph.
+		
+	cephx
+		The Ceph authentication protocol. Cephx operates like Kerberos, but it
+		has no single point of failure.
+
+	Ceph
+	Ceph Platform
+		All Ceph software, which includes any piece of code hosted at 
+		`http://github.com/ceph`_.
+		
+	Ceph System
+	Ceph Stack
+		A collection of two or more components of Ceph.
+
+	Ceph Node
+	Node
+	Host
+		Any single machine or server in a Ceph System.
+		
+	Ceph Storage Cluster
+	Ceph Object Store
+	RADOS
+	RADOS Cluster
+	Reliable Autonomic Distributed Object Store
+		The core set of storage software which stores the user's data (MON+OSD).
+
+	Ceph Cluster Map
+	cluster map
+		The set of maps comprising the monitor map, OSD map, PG map, MDS map and 
+		CRUSH map. See `Cluster Map`_ for details.
+
+	Ceph Object Storage
+		The object storage "product", service or capabilities, which consists
+		essentially of a Ceph Storage Cluster and a Ceph Object Gateway.
+
+	Ceph Object Gateway
+	RADOS Gateway
+	RGW
+		The S3/Swift gateway component of Ceph.
+				
+	Ceph Block Device
+	RBD
+		The block storage component of Ceph.
+		
+	Ceph Block Storage
+		The block storage "product," service or capabilities when used in 
+		conjunction with ``librbd``, a hypervisor such as QEMU or Xen, and a
+		hypervisor abstraction layer such as ``libvirt``.
+
+	Ceph Filesystem
+	CephFS
+	Ceph FS
+		The POSIX filesystem components of Ceph.
+
+	Cloud Platforms
+	Cloud Stacks
+		Third party cloud provisioning platforms such as OpenStack, CloudStack, 
+		OpenNebula, ProxMox, etc.
+
+	Object Storage Device
+	OSD
+		A physical or logical storage unit (*e.g.*, LUN).
+		Sometimes, Ceph users use the
+		term "OSD" to refer to :term:`Ceph OSD Daemon`, though the
+		proper term is "Ceph OSD".
+		
+	Ceph OSD Daemon
+	Ceph OSD
+		The Ceph OSD software, which interacts with a logical
+		disk (:term:`OSD`). Sometimes, Ceph users use the
+		term "OSD" to refer to "Ceph OSD Daemon", though the
+		proper term is "Ceph OSD".
+		
+	Ceph Monitor
+	MON
+		The Ceph monitor software.
+	
+	Ceph Metadata Server
+	MDS
+		The Ceph metadata software.
+
+	Ceph Clients
+	Ceph Client
+		The collection of Ceph components which can access a Ceph Storage 
+		Cluster. These include the Ceph Object Gateway, the Ceph Block Device, 
+		the Ceph Filesystem, and their corresponding libraries, kernel modules, 
+		and FUSEs.
+
+	Ceph Kernel Modules
+		The collection of kernel modules which can be used to interact with the 
+		Ceph System (e.g,. ``ceph.ko``, ``rbd.ko``).
+
+	Ceph Client Libraries
+		The collection of libraries that can be used to interact with components 
+		of the Ceph System.
+
+	Ceph Release
+		Any distinct numbered version of Ceph.
+	
+	Ceph Point Release
+		Any ad-hoc release that includes only bug or security fixes.
+
+	Ceph Interim Release
+		Versions of Ceph that have not yet been put through quality assurance
+		testing, but may contain new features.
+
+	Ceph Release Candidate
+		A major version of Ceph that has undergone initial quality assurance 
+		testing and is ready for beta testers.
+
+	Ceph Stable Release
+		A major version of Ceph where all features from the preceding interim 
+		releases have been put through quality assurance testing successfully.
+
+	Ceph Test Framework
+	Teuthology
+		The collection of software that performs scripted tests on Ceph.
+
+	CRUSH
+		Controlled Replication Under Scalable Hashing. It is the algorithm
+		Ceph uses to compute object storage locations.
+		
+	ruleset
+		A set of CRUSH data placement rules that applies to a particular pool(s).
+
+	Pool
+	Pools
+		Pools are logical partitions for storing objects.
+
+.. _http://github.com/ceph: http://github.com/ceph
+.. _Cluster Map: ../architecture#cluster-map
diff --git a/doc/images/CRUSH.jpg b/doc/images/CRUSH.jpg
new file mode 100644
index 0000000..ac79759
Binary files /dev/null and b/doc/images/CRUSH.jpg differ
diff --git a/doc/images/RADOS.jpg b/doc/images/RADOS.jpg
new file mode 100644
index 0000000..0793a8c
Binary files /dev/null and b/doc/images/RADOS.jpg differ
diff --git a/doc/images/RBD.jpg b/doc/images/RBD.jpg
new file mode 100644
index 0000000..c2a2b8f
Binary files /dev/null and b/doc/images/RBD.jpg differ
diff --git a/doc/images/RDBSnapshots.jpg b/doc/images/RDBSnapshots.jpg
new file mode 100644
index 0000000..493d468
Binary files /dev/null and b/doc/images/RDBSnapshots.jpg differ
diff --git a/doc/images/docreviewprocess.jpg b/doc/images/docreviewprocess.jpg
new file mode 100644
index 0000000..33f7163
Binary files /dev/null and b/doc/images/docreviewprocess.jpg differ
diff --git a/doc/images/region-sync.png b/doc/images/region-sync.png
new file mode 100644
index 0000000..7f889a0
Binary files /dev/null and b/doc/images/region-sync.png differ
diff --git a/doc/images/region-sync.svg b/doc/images/region-sync.svg
new file mode 100644
index 0000000..93b66f3
--- /dev/null
+++ b/doc/images/region-sync.svg
@@ -0,0 +1,30426 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg104536"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="region-sync.svg"
+   inkscape:export-filename="/home/john/Pictures/region-sync.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs104538">
+    <linearGradient
+       id="linearGradient126200"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4884_">
+      <rect
+         height="11.504"
+         width="174.63"
+         y="360.13901"
+         x="-679.57202"
+         id="use84863" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4886_">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use84873" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4888_">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use84881" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4890_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-535.73901"
+         id="use84891" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4892_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-535.73901"
+         id="use84899" />
+    </clipPath>
+    <clipPath
+       id="clipPath99071">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99073" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4894_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-536.966"
+         id="use84911" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4896_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-536.966"
+         id="use84919" />
+    </clipPath>
+    <clipPath
+       id="clipPath99079">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99081" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4898_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-538.19202"
+         id="use84931" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4900_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-538.19202"
+         id="use84939" />
+    </clipPath>
+    <clipPath
+       id="clipPath99087">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99089" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4902_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-539.41901"
+         id="use84951" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4904_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-539.41901"
+         id="use84959" />
+    </clipPath>
+    <clipPath
+       id="clipPath99095">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99097" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4906_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-540.646"
+         id="use84971" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4908_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-540.646"
+         id="use84979" />
+    </clipPath>
+    <clipPath
+       id="clipPath99103">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99105" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4910_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-541.87299"
+         id="use84991" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4912_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-541.87299"
+         id="use84999" />
+    </clipPath>
+    <clipPath
+       id="clipPath99111">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99113" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4914_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-543.099"
+         id="use85011" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4916_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-543.099"
+         id="use85019" />
+    </clipPath>
+    <clipPath
+       id="clipPath99119">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99121" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4918_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-544.32599"
+         id="use85031" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4920_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-544.32599"
+         id="use85039" />
+    </clipPath>
+    <clipPath
+       id="clipPath99127">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99129" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4922_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-545.55298"
+         id="use85051" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4924_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-545.55298"
+         id="use85059" />
+    </clipPath>
+    <clipPath
+       id="clipPath99135">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99137" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4926_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-546.77899"
+         id="use85071" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4928_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-546.77899"
+         id="use85079" />
+    </clipPath>
+    <clipPath
+       id="clipPath99143">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99145" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4930_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-548.00598"
+         id="use85091" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4932_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-548.00598"
+         id="use85099" />
+    </clipPath>
+    <clipPath
+       id="clipPath99151">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99153" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4934_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-549.23297"
+         id="use85111" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4936_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-549.23297"
+         id="use85119" />
+    </clipPath>
+    <clipPath
+       id="clipPath99159">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99161" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4938_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-550.46002"
+         id="use85131" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4940_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-550.46002"
+         id="use85139" />
+    </clipPath>
+    <clipPath
+       id="clipPath99167">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99169" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4942_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-551.68597"
+         id="use85151" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4944_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-551.68597"
+         id="use85159" />
+    </clipPath>
+    <clipPath
+       id="clipPath99175">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99177" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4946_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-552.91302"
+         id="use85171" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4948_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-552.91302"
+         id="use85179" />
+    </clipPath>
+    <clipPath
+       id="clipPath99183">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99185" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4950_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-554.14001"
+         id="use85191" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4952_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-554.14001"
+         id="use85199" />
+    </clipPath>
+    <clipPath
+       id="clipPath99191">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99193" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4954_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-555.367"
+         id="use85211" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4956_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-555.367"
+         id="use85219" />
+    </clipPath>
+    <clipPath
+       id="clipPath99199">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99201" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4958_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-556.59302"
+         id="use85231" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4960_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-556.59302"
+         id="use85239" />
+    </clipPath>
+    <clipPath
+       id="clipPath99207">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99209" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4962_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-557.82001"
+         id="use85251" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4964_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-557.82001"
+         id="use85259" />
+    </clipPath>
+    <clipPath
+       id="clipPath99215">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99217" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4966_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-559.047"
+         id="use85271" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4968_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-559.047"
+         id="use85279" />
+    </clipPath>
+    <clipPath
+       id="clipPath99223">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99225" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4970_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-560.27301"
+         id="use85291" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4972_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-560.27301"
+         id="use85299" />
+    </clipPath>
+    <clipPath
+       id="clipPath99231">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99233" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4974_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-561.5"
+         id="use85311" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4976_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-561.5"
+         id="use85319" />
+    </clipPath>
+    <clipPath
+       id="clipPath99239">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99241" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4978_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-562.72699"
+         id="use85331" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4980_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-562.72699"
+         id="use85339" />
+    </clipPath>
+    <clipPath
+       id="clipPath99247">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99249" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4982_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-563.95398"
+         id="use85351" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4984_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-563.95398"
+         id="use85359" />
+    </clipPath>
+    <clipPath
+       id="clipPath99255">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99257" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4986_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-565.17999"
+         id="use85371" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4988_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-565.17999"
+         id="use85379" />
+    </clipPath>
+    <clipPath
+       id="clipPath99263">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99265" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4990_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-566.40698"
+         id="use85391" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4992_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-566.40698"
+         id="use85399" />
+    </clipPath>
+    <clipPath
+       id="clipPath99271">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99273" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4994_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-567.63397"
+         id="use85411" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4996_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-567.63397"
+         id="use85419" />
+    </clipPath>
+    <clipPath
+       id="clipPath99279">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99281" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4998_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-568.86102"
+         id="use85431" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5000_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-568.86102"
+         id="use85439" />
+    </clipPath>
+    <clipPath
+       id="clipPath99287">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99289" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5002_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-570.08698"
+         id="use85451" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5004_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-570.08698"
+         id="use85459" />
+    </clipPath>
+    <clipPath
+       id="clipPath99295">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99297" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5006_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-571.315"
+         id="use85471" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5008_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-571.31403"
+         id="use85479" />
+    </clipPath>
+    <clipPath
+       id="clipPath99303">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99305" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5010_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-572.54102"
+         id="use85491" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5012_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-572.54102"
+         id="use85499" />
+    </clipPath>
+    <clipPath
+       id="clipPath99311">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99313" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5014_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-573.76801"
+         id="use85511" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5016_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-573.76801"
+         id="use85519" />
+    </clipPath>
+    <clipPath
+       id="clipPath99319">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99321" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5018_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-574.99402"
+         id="use85531" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5020_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-574.99402"
+         id="use85539" />
+    </clipPath>
+    <clipPath
+       id="clipPath99327">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99329" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5022_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-576.22101"
+         id="use85551" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5024_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-576.22101"
+         id="use85559" />
+    </clipPath>
+    <clipPath
+       id="clipPath99335">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99337" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5026_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-577.448"
+         id="use85571" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5028_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-577.448"
+         id="use85579" />
+    </clipPath>
+    <clipPath
+       id="clipPath99343">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99345" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5030_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-578.67499"
+         id="use85591" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5032_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-578.67499"
+         id="use85599" />
+    </clipPath>
+    <clipPath
+       id="clipPath99351">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99353" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5034_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-579.901"
+         id="use85611" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5036_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-579.901"
+         id="use85619" />
+    </clipPath>
+    <clipPath
+       id="clipPath99359">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99361" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5038_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-581.12799"
+         id="use85631" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5040_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-581.12799"
+         id="use85639" />
+    </clipPath>
+    <clipPath
+       id="clipPath99367">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99369" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5042_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-582.35498"
+         id="use85651" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5044_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-582.35498"
+         id="use85659" />
+    </clipPath>
+    <clipPath
+       id="clipPath99375">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99377" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5046_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-583.58197"
+         id="use85671" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5048_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-583.58197"
+         id="use85679" />
+    </clipPath>
+    <clipPath
+       id="clipPath99383">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99385" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5050_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-584.80798"
+         id="use85691" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5052_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-584.80798"
+         id="use85699" />
+    </clipPath>
+    <clipPath
+       id="clipPath99391">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99393" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5054_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-586.03497"
+         id="use85711" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5056_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-586.03497"
+         id="use85719" />
+    </clipPath>
+    <clipPath
+       id="clipPath99399">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99401" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5058_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-587.26202"
+         id="use85731" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5060_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-587.26202"
+         id="use85739" />
+    </clipPath>
+    <clipPath
+       id="clipPath99407">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99409" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5062_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-588.48901"
+         id="use85751" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5064_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-588.48901"
+         id="use85759" />
+    </clipPath>
+    <clipPath
+       id="clipPath99415">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99417" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5066_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-589.71503"
+         id="use85771" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5068_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-589.71503"
+         id="use85779" />
+    </clipPath>
+    <clipPath
+       id="clipPath99423">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99425" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5070_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-590.94202"
+         id="use85791" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5072_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-590.94202"
+         id="use85799" />
+    </clipPath>
+    <clipPath
+       id="clipPath99431">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99433" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5074_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-592.16901"
+         id="use85811" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5076_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-592.16901"
+         id="use85819" />
+    </clipPath>
+    <clipPath
+       id="clipPath99439">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99441" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5078_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-593.396"
+         id="use85831" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5080_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-593.396"
+         id="use85839" />
+    </clipPath>
+    <clipPath
+       id="clipPath99447">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99449" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5082_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-594.62299"
+         id="use85851" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5084_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-594.62299"
+         id="use85859" />
+    </clipPath>
+    <clipPath
+       id="clipPath99455">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99457" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5086_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-595.849"
+         id="use85871" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5088_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-595.849"
+         id="use85879" />
+    </clipPath>
+    <clipPath
+       id="clipPath99463">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99465" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5090_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-597.07599"
+         id="use85891" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5092_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-597.07599"
+         id="use85899" />
+    </clipPath>
+    <clipPath
+       id="clipPath99471">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99473" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5094_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-598.30298"
+         id="use85911" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5096_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-598.30298"
+         id="use85919" />
+    </clipPath>
+    <clipPath
+       id="clipPath99479">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99481" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5098_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-599.53003"
+         id="use85931" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5100_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-599.53003"
+         id="use85939" />
+    </clipPath>
+    <clipPath
+       id="clipPath99487">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99489" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5102_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-600.75598"
+         id="use85951" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5104_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-600.75598"
+         id="use85959" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4873_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use84798" />
+    </clipPath>
+    <clipPath
+       id="clipPath99497">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99499" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4874_"
+         overflow="visible"
+         id="use84810" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4876_"
+         overflow="visible"
+         id="use84818" />
+    </clipPath>
+    <clipPath
+       id="clipPath99511">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99513" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4879_"
+         overflow="visible"
+         id="use84841" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4881_"
+         overflow="visible"
+         id="use84849" />
+    </clipPath>
+    <clipPath
+       id="clipPath99519">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99521" />
+    </clipPath>
+    <clipPath
+       id="clipPath99523">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99525" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_">
+      <polygon
+         points="-640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 -654.922,278.632 "
+         id="use84771" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84759" />
+    </clipPath>
+    <clipPath
+       id="clipPath99534">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99536" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4864_"
+         overflow="visible"
+         id="use84732" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4862_"
+         overflow="visible"
+         id="use84720" />
+    </clipPath>
+    <clipPath
+       id="clipPath99545">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4862_"
+         overflow="visible"
+         id="use99547" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4861_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205299"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84696" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84698" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4860_">
+      <polygon
+         points="-521.64,278.632 -507.673,278.632 -507.673,273.567 -521.64,273.567 -523.432,276.108 "
+         id="use84693" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4858_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84681" />
+    </clipPath>
+    <clipPath
+       id="clipPath99556">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99558" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_">
+      <polygon
+         points="-521.64,208.524 -507.673,208.524 -507.673,203.458 -521.64,203.458 -523.432,206 "
+         id="use84656" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84644" />
+    </clipPath>
+    <clipPath
+       id="clipPath99567">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99569" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4851_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205101"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84622" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84624" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4850_">
+      <polygon
+         points="-588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 -574.322,203.458 "
+         id="use84619" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4848_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84607" />
+    </clipPath>
+    <clipPath
+       id="clipPath99578">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99580" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4846_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205101"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84585" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84587" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4845_">
+      <polygon
+         points="-654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 -640.956,203.458 "
+         id="use84582" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500" />
+    </clipPath>
+    <clipPath
+       id="clipPath99589">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99591" />
+    </clipPath>
+    <clipPath
+       id="clipPath99593">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99595" />
+    </clipPath>
+    <clipPath
+       id="clipPath99597">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99599" />
+    </clipPath>
+    <clipPath
+       id="clipPath99601">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99603" />
+    </clipPath>
+    <clipPath
+       id="clipPath99605">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99607" />
+    </clipPath>
+    <clipPath
+       id="clipPath99609">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99611" />
+    </clipPath>
+    <clipPath
+       id="clipPath99613">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99615" />
+    </clipPath>
+    <clipPath
+       id="clipPath99617">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99619" />
+    </clipPath>
+    <clipPath
+       id="clipPath99621">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99623" />
+    </clipPath>
+    <clipPath
+       id="clipPath99625">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99627" />
+    </clipPath>
+    <clipPath
+       id="clipPath99629">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99631" />
+    </clipPath>
+    <clipPath
+       id="clipPath99633">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99635" />
+    </clipPath>
+    <clipPath
+       id="clipPath99637">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99639" />
+    </clipPath>
+    <clipPath
+       id="clipPath99641">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99643" />
+    </clipPath>
+    <clipPath
+       id="clipPath99645">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99647" />
+    </clipPath>
+    <clipPath
+       id="clipPath99649">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99651" />
+    </clipPath>
+    <clipPath
+       id="clipPath99653">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99655" />
+    </clipPath>
+    <clipPath
+       id="clipPath99657">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99659" />
+    </clipPath>
+    <clipPath
+       id="clipPath99661">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99663" />
+    </clipPath>
+    <clipPath
+       id="clipPath99665">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99667" />
+    </clipPath>
+    <clipPath
+       id="clipPath99669">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99671" />
+    </clipPath>
+    <clipPath
+       id="clipPath99673">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99675" />
+    </clipPath>
+    <clipPath
+       id="clipPath99677">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99679" />
+    </clipPath>
+    <clipPath
+       id="clipPath99681">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99683" />
+    </clipPath>
+    <clipPath
+       id="clipPath99685">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99687" />
+    </clipPath>
+    <clipPath
+       id="clipPath99689">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99691" />
+    </clipPath>
+    <clipPath
+       id="clipPath99693">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99695" />
+    </clipPath>
+    <clipPath
+       id="clipPath99697">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99699" />
+    </clipPath>
+    <clipPath
+       id="clipPath99701">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99703" />
+    </clipPath>
+    <clipPath
+       id="clipPath99705">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99707" />
+    </clipPath>
+    <clipPath
+       id="clipPath99709">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99711" />
+    </clipPath>
+    <clipPath
+       id="clipPath99713">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99715" />
+    </clipPath>
+    <clipPath
+       id="clipPath99717">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99719" />
+    </clipPath>
+    <clipPath
+       id="clipPath99721">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99723" />
+    </clipPath>
+    <clipPath
+       id="clipPath99725">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99727" />
+    </clipPath>
+    <clipPath
+       id="clipPath99729">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99731" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4841_"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,942.8785,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84478" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84480" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84482" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84484" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84486" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4840_">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-531.92297"
+         id="use84475" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4838_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84445" />
+    </clipPath>
+    <clipPath
+       id="clipPath99743">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99745" />
+    </clipPath>
+    <clipPath
+       id="clipPath99747">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99749" />
+    </clipPath>
+    <clipPath
+       id="clipPath99751">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99753" />
+    </clipPath>
+    <clipPath
+       id="clipPath99755">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99757" />
+    </clipPath>
+    <clipPath
+       id="clipPath99759">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99761" />
+    </clipPath>
+    <clipPath
+       id="clipPath99763">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99765" />
+    </clipPath>
+    <clipPath
+       id="clipPath99767">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99769" />
+    </clipPath>
+    <clipPath
+       id="clipPath99771">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99773" />
+    </clipPath>
+    <clipPath
+       id="clipPath99775">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99777" />
+    </clipPath>
+    <clipPath
+       id="clipPath99779">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99781" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4836_"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.8129"
+       x2="37.392799"
+       y2="152.8129"
+       gradientTransform="matrix(0,-9.614,-9.614,0,876.3496,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84423" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84425" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84427" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84429" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84431" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4835_">
+      <rect
+         height="9.6140003"
+         width="11.315"
+         y="214.106"
+         x="-598.45099"
+         id="use84420" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4833_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84390" />
+    </clipPath>
+    <clipPath
+       id="clipPath99793">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99795" />
+    </clipPath>
+    <clipPath
+       id="clipPath99797">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99799" />
+    </clipPath>
+    <clipPath
+       id="clipPath99801">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99803" />
+    </clipPath>
+    <clipPath
+       id="clipPath99805">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99807" />
+    </clipPath>
+    <clipPath
+       id="clipPath99809">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99811" />
+    </clipPath>
+    <clipPath
+       id="clipPath99813">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99815" />
+    </clipPath>
+    <clipPath
+       id="clipPath99817">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99819" />
+    </clipPath>
+    <clipPath
+       id="clipPath99821">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99823" />
+    </clipPath>
+    <clipPath
+       id="clipPath99825">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99827" />
+    </clipPath>
+    <clipPath
+       id="clipPath99829">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99831" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4831_"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,809.7396,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84368" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84370" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84372" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84374" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84376" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4830_">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-665.06201"
+         id="use84365" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_">
+      <polygon
+         points="-636.358,231.934 -682.207,231.929 -682.208,251.221 -659.342,256.788 -636.356,251.283 "
+         id="use84326" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4823_"
+         overflow="visible"
+         id="use84295" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4822_"
+       gradientUnits="userSpaceOnUse"
+       x1="145.317"
+       y1="2.8515"
+       x2="146.317"
+       y2="2.8515"
+       gradientTransform="matrix(0.0299,24.8863,24.8863,-0.0299,-601.3687,-3384.4197)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84267" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84269" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84271" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84273" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84275" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4821_">
+      <polygon
+         points="-503.122,251.283 -503.124,231.934 -548.973,231.929 -548.973,251.221 -526.108,256.788 "
+         id="use84264" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4819_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84232" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4817_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,284.9195,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84220" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84222" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4816_">
+      <path
+         d="m -516.985,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84217"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4814_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84197" />
+    </clipPath>
+    <clipPath
+       id="clipPath99874">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99876" />
+    </clipPath>
+    <clipPath
+       id="clipPath99878">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99880" />
+    </clipPath>
+    <clipPath
+       id="clipPath99882">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99884" />
+    </clipPath>
+    <clipPath
+       id="clipPath99886">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99888" />
+    </clipPath>
+    <clipPath
+       id="clipPath99890">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99892" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4812_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,272.9481,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84185" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84187" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4811_">
+      <path
+         d="m -528.956,346.449 c 0,1.487 1.205,2.692 2.691,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use84182"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4809_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84162" />
+    </clipPath>
+    <clipPath
+       id="clipPath99901">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99903" />
+    </clipPath>
+    <clipPath
+       id="clipPath99905">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99907" />
+    </clipPath>
+    <clipPath
+       id="clipPath99909">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99911" />
+    </clipPath>
+    <clipPath
+       id="clipPath99913">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99915" />
+    </clipPath>
+    <clipPath
+       id="clipPath99917">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99919" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4807_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,260.9767,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84150" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84152" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4806_">
+      <path
+         d="m -540.927,346.449 c 0,1.487 1.205,2.692 2.691,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use84147"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4804_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84127" />
+    </clipPath>
+    <clipPath
+       id="clipPath99928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99930" />
+    </clipPath>
+    <clipPath
+       id="clipPath99932">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99934" />
+    </clipPath>
+    <clipPath
+       id="clipPath99936">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99938" />
+    </clipPath>
+    <clipPath
+       id="clipPath99940">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99942" />
+    </clipPath>
+    <clipPath
+       id="clipPath99944">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99946" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4802_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,249.0053,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84115" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84117" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4801_">
+      <path
+         d="m -552.899,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use84112"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4799_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84092" />
+    </clipPath>
+    <clipPath
+       id="clipPath99955">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99957" />
+    </clipPath>
+    <clipPath
+       id="clipPath99959">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99961" />
+    </clipPath>
+    <clipPath
+       id="clipPath99963">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99965" />
+    </clipPath>
+    <clipPath
+       id="clipPath99967">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99969" />
+    </clipPath>
+    <clipPath
+       id="clipPath99971">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99973" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4797_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,237.034,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84080" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84082" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4796_">
+      <path
+         d="m -564.87,346.449 c 0,1.487 1.205,2.692 2.691,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use84077"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4794_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84057" />
+    </clipPath>
+    <clipPath
+       id="clipPath99982">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99984" />
+    </clipPath>
+    <clipPath
+       id="clipPath99986">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99988" />
+    </clipPath>
+    <clipPath
+       id="clipPath99990">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99992" />
+    </clipPath>
+    <clipPath
+       id="clipPath99994">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99996" />
+    </clipPath>
+    <clipPath
+       id="clipPath99998">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100000" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4792_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,225.0626,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84045" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84047" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4791_">
+      <path
+         d="m -576.842,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use84042"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4789_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84022" />
+    </clipPath>
+    <clipPath
+       id="clipPath100009">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100011" />
+    </clipPath>
+    <clipPath
+       id="clipPath100013">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100015" />
+    </clipPath>
+    <clipPath
+       id="clipPath100017">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100019" />
+    </clipPath>
+    <clipPath
+       id="clipPath100021">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100023" />
+    </clipPath>
+    <clipPath
+       id="clipPath100025">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100027" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4785_"
+         overflow="visible"
+         id="use84007" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use83987" />
+    </clipPath>
+    <clipPath
+       id="clipPath100036">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100038" />
+    </clipPath>
+    <clipPath
+       id="clipPath100040">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100042" />
+    </clipPath>
+    <clipPath
+       id="clipPath100044">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100046" />
+    </clipPath>
+    <clipPath
+       id="clipPath100048">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100050" />
+    </clipPath>
+    <clipPath
+       id="clipPath100052">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100054" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4780_"
+         overflow="visible"
+         id="use83972" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use83952" />
+    </clipPath>
+    <clipPath
+       id="clipPath100063">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100065" />
+    </clipPath>
+    <clipPath
+       id="clipPath100067">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100069" />
+    </clipPath>
+    <clipPath
+       id="clipPath100071">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100073" />
+    </clipPath>
+    <clipPath
+       id="clipPath100075">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100077" />
+    </clipPath>
+    <clipPath
+       id="clipPath100079">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100081" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4775_"
+         overflow="visible"
+         id="use83937" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use83917" />
+    </clipPath>
+    <clipPath
+       id="clipPath100090">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100092" />
+    </clipPath>
+    <clipPath
+       id="clipPath100094">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100096" />
+    </clipPath>
+    <clipPath
+       id="clipPath100098">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100100" />
+    </clipPath>
+    <clipPath
+       id="clipPath100102">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100104" />
+    </clipPath>
+    <clipPath
+       id="clipPath100106">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100108" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4770_"
+         overflow="visible"
+         id="use83902" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use83882" />
+    </clipPath>
+    <clipPath
+       id="clipPath100117">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100119" />
+    </clipPath>
+    <clipPath
+       id="clipPath100121">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100123" />
+    </clipPath>
+    <clipPath
+       id="clipPath100125">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100127" />
+    </clipPath>
+    <clipPath
+       id="clipPath100129">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100131" />
+    </clipPath>
+    <clipPath
+       id="clipPath100133">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100135" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4765_"
+         overflow="visible"
+         id="use83867" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use83847" />
+    </clipPath>
+    <clipPath
+       id="clipPath100144">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100146" />
+    </clipPath>
+    <clipPath
+       id="clipPath100148">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100150" />
+    </clipPath>
+    <clipPath
+       id="clipPath100152">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100154" />
+    </clipPath>
+    <clipPath
+       id="clipPath100156">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100158" />
+    </clipPath>
+    <clipPath
+       id="clipPath100160">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100162" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4760_"
+         overflow="visible"
+         id="use83832" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use83812" />
+    </clipPath>
+    <clipPath
+       id="clipPath100171">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100173" />
+    </clipPath>
+    <clipPath
+       id="clipPath100175">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100177" />
+    </clipPath>
+    <clipPath
+       id="clipPath100179">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100181" />
+    </clipPath>
+    <clipPath
+       id="clipPath100183">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100185" />
+    </clipPath>
+    <clipPath
+       id="clipPath100187">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100189" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4755_"
+         overflow="visible"
+         id="use83797" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use83777" />
+    </clipPath>
+    <clipPath
+       id="clipPath100198">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100200" />
+    </clipPath>
+    <clipPath
+       id="clipPath100202">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100204" />
+    </clipPath>
+    <clipPath
+       id="clipPath100206">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100208" />
+    </clipPath>
+    <clipPath
+       id="clipPath100210">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100212" />
+    </clipPath>
+    <clipPath
+       id="clipPath100214">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100216" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4750_"
+         overflow="visible"
+         id="use83762" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4749_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use83742" />
+    </clipPath>
+    <clipPath
+       id="clipPath100225">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100227" />
+    </clipPath>
+    <clipPath
+       id="clipPath100229">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100231" />
+    </clipPath>
+    <clipPath
+       id="clipPath100233">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100235" />
+    </clipPath>
+    <clipPath
+       id="clipPath100237">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100239" />
+    </clipPath>
+    <clipPath
+       id="clipPath100241">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100243" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4747_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,284.9195,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83730" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83732" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4746_">
+      <path
+         d="m -516.985,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83727"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4744_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83707" />
+    </clipPath>
+    <clipPath
+       id="clipPath100252">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100254" />
+    </clipPath>
+    <clipPath
+       id="clipPath100256">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100258" />
+    </clipPath>
+    <clipPath
+       id="clipPath100260">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100262" />
+    </clipPath>
+    <clipPath
+       id="clipPath100264">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100266" />
+    </clipPath>
+    <clipPath
+       id="clipPath100268">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100270" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4742_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,272.9481,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83695" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83697" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4741_">
+      <path
+         d="m -528.956,334.666 c 0,1.488 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use83692"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4739_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83672" />
+    </clipPath>
+    <clipPath
+       id="clipPath100279">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100281" />
+    </clipPath>
+    <clipPath
+       id="clipPath100283">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100285" />
+    </clipPath>
+    <clipPath
+       id="clipPath100287">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100289" />
+    </clipPath>
+    <clipPath
+       id="clipPath100291">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100293" />
+    </clipPath>
+    <clipPath
+       id="clipPath100295">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100297" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4737_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,260.9767,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83660" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83662" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4736_">
+      <path
+         d="m -540.927,334.666 c 0,1.488 1.205,2.694 2.691,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use83657"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4734_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83637" />
+    </clipPath>
+    <clipPath
+       id="clipPath100306">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100308" />
+    </clipPath>
+    <clipPath
+       id="clipPath100310">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100312" />
+    </clipPath>
+    <clipPath
+       id="clipPath100314">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100316" />
+    </clipPath>
+    <clipPath
+       id="clipPath100318">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100320" />
+    </clipPath>
+    <clipPath
+       id="clipPath100322">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100324" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4732_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,249.0053,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83625" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83627" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4731_">
+      <path
+         d="m -552.899,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83622"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4729_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83602" />
+    </clipPath>
+    <clipPath
+       id="clipPath100333">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100335" />
+    </clipPath>
+    <clipPath
+       id="clipPath100337">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100339" />
+    </clipPath>
+    <clipPath
+       id="clipPath100341">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100343" />
+    </clipPath>
+    <clipPath
+       id="clipPath100345">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100347" />
+    </clipPath>
+    <clipPath
+       id="clipPath100349">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100351" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4727_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,225.0626,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83590" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83592" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4726_">
+      <path
+         d="m -576.842,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83587"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4724_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83567" />
+    </clipPath>
+    <clipPath
+       id="clipPath100360">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100362" />
+    </clipPath>
+    <clipPath
+       id="clipPath100364">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100366" />
+    </clipPath>
+    <clipPath
+       id="clipPath100368">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100370" />
+    </clipPath>
+    <clipPath
+       id="clipPath100372">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100374" />
+    </clipPath>
+    <clipPath
+       id="clipPath100376">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100378" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4720_"
+         overflow="visible"
+         id="use83552" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use83532" />
+    </clipPath>
+    <clipPath
+       id="clipPath100387">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100389" />
+    </clipPath>
+    <clipPath
+       id="clipPath100391">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100393" />
+    </clipPath>
+    <clipPath
+       id="clipPath100395">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100397" />
+    </clipPath>
+    <clipPath
+       id="clipPath100399">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100401" />
+    </clipPath>
+    <clipPath
+       id="clipPath100403">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100405" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4715_"
+         overflow="visible"
+         id="use83517" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use83497" />
+    </clipPath>
+    <clipPath
+       id="clipPath100414">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100416" />
+    </clipPath>
+    <clipPath
+       id="clipPath100418">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100420" />
+    </clipPath>
+    <clipPath
+       id="clipPath100422">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100424" />
+    </clipPath>
+    <clipPath
+       id="clipPath100426">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100428" />
+    </clipPath>
+    <clipPath
+       id="clipPath100430">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100432" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4710_"
+         overflow="visible"
+         id="use83482" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use83462" />
+    </clipPath>
+    <clipPath
+       id="clipPath100441">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100443" />
+    </clipPath>
+    <clipPath
+       id="clipPath100445">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100447" />
+    </clipPath>
+    <clipPath
+       id="clipPath100449">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100451" />
+    </clipPath>
+    <clipPath
+       id="clipPath100453">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100455" />
+    </clipPath>
+    <clipPath
+       id="clipPath100457">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100459" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4705_"
+         overflow="visible"
+         id="use83447" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use83427" />
+    </clipPath>
+    <clipPath
+       id="clipPath100468">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100470" />
+    </clipPath>
+    <clipPath
+       id="clipPath100472">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100474" />
+    </clipPath>
+    <clipPath
+       id="clipPath100476">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100478" />
+    </clipPath>
+    <clipPath
+       id="clipPath100480">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100482" />
+    </clipPath>
+    <clipPath
+       id="clipPath100484">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100486" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4700_"
+         overflow="visible"
+         id="use83412" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use83392" />
+    </clipPath>
+    <clipPath
+       id="clipPath100495">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100497" />
+    </clipPath>
+    <clipPath
+       id="clipPath100499">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100501" />
+    </clipPath>
+    <clipPath
+       id="clipPath100503">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100505" />
+    </clipPath>
+    <clipPath
+       id="clipPath100507">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100509" />
+    </clipPath>
+    <clipPath
+       id="clipPath100511">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100513" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4695_"
+         overflow="visible"
+         id="use83377" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use83357" />
+    </clipPath>
+    <clipPath
+       id="clipPath100522">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100524" />
+    </clipPath>
+    <clipPath
+       id="clipPath100526">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100528" />
+    </clipPath>
+    <clipPath
+       id="clipPath100530">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100532" />
+    </clipPath>
+    <clipPath
+       id="clipPath100534">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100536" />
+    </clipPath>
+    <clipPath
+       id="clipPath100538">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100540" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4690_"
+         overflow="visible"
+         id="use83342" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4689_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use83322" />
+    </clipPath>
+    <clipPath
+       id="clipPath100549">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100551" />
+    </clipPath>
+    <clipPath
+       id="clipPath100553">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100555" />
+    </clipPath>
+    <clipPath
+       id="clipPath100557">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100559" />
+    </clipPath>
+    <clipPath
+       id="clipPath100561">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100563" />
+    </clipPath>
+    <clipPath
+       id="clipPath100565">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100567" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4687_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,284.9569,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83310" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83312" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4686_">
+      <path
+         d="m -516.985,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83307"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4684_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83287" />
+    </clipPath>
+    <clipPath
+       id="clipPath100576">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100578" />
+    </clipPath>
+    <clipPath
+       id="clipPath100580">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100582" />
+    </clipPath>
+    <clipPath
+       id="clipPath100584">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100586" />
+    </clipPath>
+    <clipPath
+       id="clipPath100588">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100590" />
+    </clipPath>
+    <clipPath
+       id="clipPath100592">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100594" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4682_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,272.9856,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83275" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83277" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4681_">
+      <path
+         d="m -528.956,323.119 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.204 -2.691,2.69"
+         id="use83272"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4679_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83252" />
+    </clipPath>
+    <clipPath
+       id="clipPath100603">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100605" />
+    </clipPath>
+    <clipPath
+       id="clipPath100607">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100609" />
+    </clipPath>
+    <clipPath
+       id="clipPath100611">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100613" />
+    </clipPath>
+    <clipPath
+       id="clipPath100615">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100617" />
+    </clipPath>
+    <clipPath
+       id="clipPath100619">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100621" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4677_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,261.0142,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83240" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83242" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4676_">
+      <path
+         d="m -540.927,323.119 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.691,1.204 -2.691,2.69"
+         id="use83237"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4674_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83217" />
+    </clipPath>
+    <clipPath
+       id="clipPath100630">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100632" />
+    </clipPath>
+    <clipPath
+       id="clipPath100634">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100636" />
+    </clipPath>
+    <clipPath
+       id="clipPath100638">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100640" />
+    </clipPath>
+    <clipPath
+       id="clipPath100642">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100644" />
+    </clipPath>
+    <clipPath
+       id="clipPath100646">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100648" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4672_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,249.0428,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83205" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83207" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4671_">
+      <path
+         d="m -552.899,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83202"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4669_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83182" />
+    </clipPath>
+    <clipPath
+       id="clipPath100657">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100659" />
+    </clipPath>
+    <clipPath
+       id="clipPath100661">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100663" />
+    </clipPath>
+    <clipPath
+       id="clipPath100665">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100667" />
+    </clipPath>
+    <clipPath
+       id="clipPath100669">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100671" />
+    </clipPath>
+    <clipPath
+       id="clipPath100673">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100675" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4667_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,237.0715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83170" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83172" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4666_">
+      <path
+         d="m -564.87,323.119 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.204 -2.691,2.69"
+         id="use83167"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4664_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83147" />
+    </clipPath>
+    <clipPath
+       id="clipPath100684">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100686" />
+    </clipPath>
+    <clipPath
+       id="clipPath100688">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100690" />
+    </clipPath>
+    <clipPath
+       id="clipPath100692">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100694" />
+    </clipPath>
+    <clipPath
+       id="clipPath100696">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100698" />
+    </clipPath>
+    <clipPath
+       id="clipPath100700">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100702" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4662_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,225.1001,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83135" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83137" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4661_">
+      <path
+         d="m -576.842,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83132"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4659_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83112" />
+    </clipPath>
+    <clipPath
+       id="clipPath100711">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100713" />
+    </clipPath>
+    <clipPath
+       id="clipPath100715">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100717" />
+    </clipPath>
+    <clipPath
+       id="clipPath100719">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100721" />
+    </clipPath>
+    <clipPath
+       id="clipPath100723">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100725" />
+    </clipPath>
+    <clipPath
+       id="clipPath100727">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100729" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4655_"
+         overflow="visible"
+         id="use83097" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use83077" />
+    </clipPath>
+    <clipPath
+       id="clipPath100738">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100740" />
+    </clipPath>
+    <clipPath
+       id="clipPath100742">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100744" />
+    </clipPath>
+    <clipPath
+       id="clipPath100746">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100748" />
+    </clipPath>
+    <clipPath
+       id="clipPath100750">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100752" />
+    </clipPath>
+    <clipPath
+       id="clipPath100754">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100756" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4650_"
+         overflow="visible"
+         id="use83062" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use83042" />
+    </clipPath>
+    <clipPath
+       id="clipPath100765">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100767" />
+    </clipPath>
+    <clipPath
+       id="clipPath100769">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100771" />
+    </clipPath>
+    <clipPath
+       id="clipPath100773">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100775" />
+    </clipPath>
+    <clipPath
+       id="clipPath100777">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100779" />
+    </clipPath>
+    <clipPath
+       id="clipPath100781">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100783" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4645_"
+         overflow="visible"
+         id="use83027" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use83007" />
+    </clipPath>
+    <clipPath
+       id="clipPath100792">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100794" />
+    </clipPath>
+    <clipPath
+       id="clipPath100796">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100798" />
+    </clipPath>
+    <clipPath
+       id="clipPath100800">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100802" />
+    </clipPath>
+    <clipPath
+       id="clipPath100804">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100806" />
+    </clipPath>
+    <clipPath
+       id="clipPath100808">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100810" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4640_"
+         overflow="visible"
+         id="use82992" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use82972" />
+    </clipPath>
+    <clipPath
+       id="clipPath100819">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100821" />
+    </clipPath>
+    <clipPath
+       id="clipPath100823">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100825" />
+    </clipPath>
+    <clipPath
+       id="clipPath100827">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100829" />
+    </clipPath>
+    <clipPath
+       id="clipPath100831">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100833" />
+    </clipPath>
+    <clipPath
+       id="clipPath100835">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100837" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4635_"
+         overflow="visible"
+         id="use82957" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use82937" />
+    </clipPath>
+    <clipPath
+       id="clipPath100846">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100848" />
+    </clipPath>
+    <clipPath
+       id="clipPath100850">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100852" />
+    </clipPath>
+    <clipPath
+       id="clipPath100854">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100856" />
+    </clipPath>
+    <clipPath
+       id="clipPath100858">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100860" />
+    </clipPath>
+    <clipPath
+       id="clipPath100862">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100864" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4630_"
+         overflow="visible"
+         id="use82922" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use82902" />
+    </clipPath>
+    <clipPath
+       id="clipPath100873">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100875" />
+    </clipPath>
+    <clipPath
+       id="clipPath100877">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100879" />
+    </clipPath>
+    <clipPath
+       id="clipPath100881">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100883" />
+    </clipPath>
+    <clipPath
+       id="clipPath100885">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100887" />
+    </clipPath>
+    <clipPath
+       id="clipPath100889">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100891" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4625_"
+         overflow="visible"
+         id="use82887" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4624_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use82867" />
+    </clipPath>
+    <clipPath
+       id="clipPath100900">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100902" />
+    </clipPath>
+    <clipPath
+       id="clipPath100904">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100906" />
+    </clipPath>
+    <clipPath
+       id="clipPath100908">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100910" />
+    </clipPath>
+    <clipPath
+       id="clipPath100912">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100914" />
+    </clipPath>
+    <clipPath
+       id="clipPath100916">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100918" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4622_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,284.9569,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82855" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82857" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4621_">
+      <path
+         d="m -516.985,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="use82852"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4619_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82832" />
+    </clipPath>
+    <clipPath
+       id="clipPath100927">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100929" />
+    </clipPath>
+    <clipPath
+       id="clipPath100931">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100933" />
+    </clipPath>
+    <clipPath
+       id="clipPath100935">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100937" />
+    </clipPath>
+    <clipPath
+       id="clipPath100939">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100941" />
+    </clipPath>
+    <clipPath
+       id="clipPath100943">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100945" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4617_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,272.9856,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82820" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82822" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4616_">
+      <path
+         d="m -528.956,311.531 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.205 -2.691,2.69"
+         id="use82817"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4614_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82797" />
+    </clipPath>
+    <clipPath
+       id="clipPath100954">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100956" />
+    </clipPath>
+    <clipPath
+       id="clipPath100958">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100960" />
+    </clipPath>
+    <clipPath
+       id="clipPath100962">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100964" />
+    </clipPath>
+    <clipPath
+       id="clipPath100966">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100968" />
+    </clipPath>
+    <clipPath
+       id="clipPath100970">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100972" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4612_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,261.0142,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82785" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82787" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4611_">
+      <path
+         d="m -540.927,311.531 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.691,1.205 -2.691,2.69"
+         id="use82782"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4609_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82762" />
+    </clipPath>
+    <clipPath
+       id="clipPath100981">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100983" />
+    </clipPath>
+    <clipPath
+       id="clipPath100985">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100987" />
+    </clipPath>
+    <clipPath
+       id="clipPath100989">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100991" />
+    </clipPath>
+    <clipPath
+       id="clipPath100993">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100995" />
+    </clipPath>
+    <clipPath
+       id="clipPath100997">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100999" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4607_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,249.0428,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82750" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82752" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4606_">
+      <path
+         d="m -552.899,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82747"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4604_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82727" />
+    </clipPath>
+    <clipPath
+       id="clipPath101008">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101010" />
+    </clipPath>
+    <clipPath
+       id="clipPath101012">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101014" />
+    </clipPath>
+    <clipPath
+       id="clipPath101016">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101018" />
+    </clipPath>
+    <clipPath
+       id="clipPath101020">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101022" />
+    </clipPath>
+    <clipPath
+       id="clipPath101024">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101026" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4602_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,237.0715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82715" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82717" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4601_">
+      <path
+         d="m -564.87,311.531 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.205 -2.691,2.69"
+         id="use82712"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4599_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82692" />
+    </clipPath>
+    <clipPath
+       id="clipPath101035">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101037" />
+    </clipPath>
+    <clipPath
+       id="clipPath101039">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101041" />
+    </clipPath>
+    <clipPath
+       id="clipPath101043">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101045" />
+    </clipPath>
+    <clipPath
+       id="clipPath101047">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101049" />
+    </clipPath>
+    <clipPath
+       id="clipPath101051">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101053" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4597_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,225.1001,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82680" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82682" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4596_">
+      <path
+         d="m -576.842,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82677"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4594_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82657" />
+    </clipPath>
+    <clipPath
+       id="clipPath101062">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101064" />
+    </clipPath>
+    <clipPath
+       id="clipPath101066">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101068" />
+    </clipPath>
+    <clipPath
+       id="clipPath101070">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101072" />
+    </clipPath>
+    <clipPath
+       id="clipPath101074">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101076" />
+    </clipPath>
+    <clipPath
+       id="clipPath101078">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101080" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4590_"
+         overflow="visible"
+         id="use82642" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use82622" />
+    </clipPath>
+    <clipPath
+       id="clipPath101089">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101091" />
+    </clipPath>
+    <clipPath
+       id="clipPath101093">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101095" />
+    </clipPath>
+    <clipPath
+       id="clipPath101097">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101099" />
+    </clipPath>
+    <clipPath
+       id="clipPath101101">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101103" />
+    </clipPath>
+    <clipPath
+       id="clipPath101105">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101107" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4585_"
+         overflow="visible"
+         id="use82607" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use82587" />
+    </clipPath>
+    <clipPath
+       id="clipPath101116">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101118" />
+    </clipPath>
+    <clipPath
+       id="clipPath101120">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101122" />
+    </clipPath>
+    <clipPath
+       id="clipPath101124">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101126" />
+    </clipPath>
+    <clipPath
+       id="clipPath101128">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101130" />
+    </clipPath>
+    <clipPath
+       id="clipPath101132">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101134" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4580_"
+         overflow="visible"
+         id="use82572" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use82552" />
+    </clipPath>
+    <clipPath
+       id="clipPath101143">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101145" />
+    </clipPath>
+    <clipPath
+       id="clipPath101147">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101149" />
+    </clipPath>
+    <clipPath
+       id="clipPath101151">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101153" />
+    </clipPath>
+    <clipPath
+       id="clipPath101155">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101157" />
+    </clipPath>
+    <clipPath
+       id="clipPath101159">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101161" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4575_"
+         overflow="visible"
+         id="use82537" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use82517" />
+    </clipPath>
+    <clipPath
+       id="clipPath101170">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101172" />
+    </clipPath>
+    <clipPath
+       id="clipPath101174">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101176" />
+    </clipPath>
+    <clipPath
+       id="clipPath101178">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101180" />
+    </clipPath>
+    <clipPath
+       id="clipPath101182">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101184" />
+    </clipPath>
+    <clipPath
+       id="clipPath101186">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101188" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4570_"
+         overflow="visible"
+         id="use82502" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use82482" />
+    </clipPath>
+    <clipPath
+       id="clipPath101197">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101199" />
+    </clipPath>
+    <clipPath
+       id="clipPath101201">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101203" />
+    </clipPath>
+    <clipPath
+       id="clipPath101205">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101207" />
+    </clipPath>
+    <clipPath
+       id="clipPath101209">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101211" />
+    </clipPath>
+    <clipPath
+       id="clipPath101213">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101215" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4565_"
+         overflow="visible"
+         id="use82467" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447" />
+    </clipPath>
+    <clipPath
+       id="clipPath101224">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101226" />
+    </clipPath>
+    <clipPath
+       id="clipPath101228">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101230" />
+    </clipPath>
+    <clipPath
+       id="clipPath101232">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101234" />
+    </clipPath>
+    <clipPath
+       id="clipPath101236">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101238" />
+    </clipPath>
+    <clipPath
+       id="clipPath101240">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101242" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4562_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82435" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82437" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4561_">
+      <path
+         d="m -660.642,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82432"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412" />
+    </clipPath>
+    <clipPath
+       id="clipPath101251">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101253" />
+    </clipPath>
+    <clipPath
+       id="clipPath101255">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101257" />
+    </clipPath>
+    <clipPath
+       id="clipPath101259">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101261" />
+    </clipPath>
+    <clipPath
+       id="clipPath101263">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101265" />
+    </clipPath>
+    <clipPath
+       id="clipPath101267">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101269" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4555_"
+         overflow="visible"
+         id="use82397" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4554_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82373" />
+    </clipPath>
+    <clipPath
+       id="clipPath101278">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101280" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4551_"
+         overflow="visible"
+         id="use82359" />
+    </clipPath>
+    <clipPath
+       id="clipPath101284">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4551_"
+         overflow="visible"
+         id="use101286" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_"
+         overflow="visible"
+         id="use82345" />
+    </clipPath>
+    <clipPath
+       id="clipPath101290">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_"
+         overflow="visible"
+         id="use101292" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_">
+      <polygon
+         points="-637.65,267.32 -637.642,253.133 -659.18,258.293 -679.997,253.224 -680.004,267.353 "
+         id="use82316" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4543_"
+         overflow="visible"
+         id="use82287" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4542_"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1387.9897,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82261" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82263" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82265" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82267" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82269" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82271" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82273" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82275" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4541_">
+      <polygon
+         points="-547.185,267.353 -504.831,267.32 -504.824,253.133 -526.362,258.293 -547.178,253.224 "
+         id="use82258" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4524_"
+         overflow="visible"
+         id="use82164" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4526_"
+         overflow="visible"
+         id="use82174" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4528_"
+         overflow="visible"
+         id="use82182" />
+    </clipPath>
+    <clipPath
+       id="clipPath101336">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4526_"
+         overflow="visible"
+         id="use101338" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4531_"
+         overflow="visible"
+         id="use82197" />
+    </clipPath>
+    <clipPath
+       id="clipPath101342">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4524_"
+         overflow="visible"
+         id="use101344" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4533_"
+         overflow="visible"
+         id="use82209" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4535_"
+         overflow="visible"
+         id="use82217" />
+    </clipPath>
+    <clipPath
+       id="clipPath101353">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4533_"
+         overflow="visible"
+         id="use101355" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4538_"
+         overflow="visible"
+         id="use82232" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82132" />
+    </clipPath>
+    <clipPath
+       id="clipPath101361">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101363" />
+    </clipPath>
+    <clipPath
+       id="clipPath101365">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101367" />
+    </clipPath>
+    <clipPath
+       id="clipPath101369">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101371" />
+    </clipPath>
+    <clipPath
+       id="clipPath101373">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101375" />
+    </clipPath>
+    <clipPath
+       id="clipPath101377">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101379" />
+    </clipPath>
+    <clipPath
+       id="clipPath101381">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101383" />
+    </clipPath>
+    <clipPath
+       id="clipPath101385">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101387" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4521_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_">
+      <polygon
+         points="-547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 "
+         id="use82113" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4518_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82083" />
+    </clipPath>
+    <clipPath
+       id="clipPath101398">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101400" />
+    </clipPath>
+    <clipPath
+       id="clipPath101402">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101404" />
+    </clipPath>
+    <clipPath
+       id="clipPath101406">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101408" />
+    </clipPath>
+    <clipPath
+       id="clipPath101410">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101412" />
+    </clipPath>
+    <clipPath
+       id="clipPath101414">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101416" />
+    </clipPath>
+    <clipPath
+       id="clipPath101418">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101420" />
+    </clipPath>
+    <clipPath
+       id="clipPath101422">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101424" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4516_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,902.0769,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82067" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82069" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82071" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82073" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4515_">
+      <polygon
+         points="-590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 "
+         id="use82064" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4511_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82010" />
+    </clipPath>
+    <clipPath
+       id="clipPath101435">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101437" />
+    </clipPath>
+    <clipPath
+       id="clipPath101439">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101441" />
+    </clipPath>
+    <clipPath
+       id="clipPath101443">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101445" />
+    </clipPath>
+    <clipPath
+       id="clipPath101447">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101449" />
+    </clipPath>
+    <clipPath
+       id="clipPath101451">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101453" />
+    </clipPath>
+    <clipPath
+       id="clipPath101455">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101457" />
+    </clipPath>
+    <clipPath
+       id="clipPath101459">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101461" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4509_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop81994" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop81996" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop81998" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82000" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4508_">
+      <polygon
+         points="-657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 "
+         id="use81991" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient104534"
+       xlink:href="#SVGID_4509_"
+       inkscape:collect="always" />
+    <defs
+       id="defs84496">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4842_" />
+    </defs>
+    <clipPath
+       id="clipPath103391">
+      <use
+         id="use103393"
+         overflow="visible"
+         xlink:href="#SVGID_4842_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4873_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84798-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath113428">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113430" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_-9">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84810-6" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821-2" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823-4" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825-9" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827-7" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_-0">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84818-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath113442">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113444" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_-0">
+      <rect
+         height="10.152"
+         width="174.94701"
+         y="360.13901"
+         x="-679.88898"
+         id="use84841-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_-9">
+      <rect
+         height="10.153"
+         width="174.94701"
+         y="360.138"
+         x="-679.88898"
+         id="use84849-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath113450">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113452" />
+    </clipPath>
+    <clipPath
+       id="clipPath113454">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113456" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_-6">
+      <polygon
+         points="-654.922,273.567 -656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 "
+         id="use84771-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84759-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113465">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113467" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735-4" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_-6">
+      <polygon
+         points="-588.288,273.567 -590.081,276.108 -588.288,278.632 -574.322,278.632 -574.322,273.567 "
+         id="use84732-8" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84720-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113476">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113478" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4851_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205101"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84622-4" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84624-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4850_-1">
+      <polygon
+         points="-588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 -574.322,203.458 "
+         id="use84619-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4848_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84607-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113487">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113489" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4846_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205101"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84585-1" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84587-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4845_-3">
+      <polygon
+         points="-654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 -640.956,203.458 "
+         id="use84582-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113498">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113500" />
+    </clipPath>
+    <clipPath
+       id="clipPath113502">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113504" />
+    </clipPath>
+    <clipPath
+       id="clipPath113506">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113508" />
+    </clipPath>
+    <clipPath
+       id="clipPath113510">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113512" />
+    </clipPath>
+    <clipPath
+       id="clipPath113514">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113516" />
+    </clipPath>
+    <clipPath
+       id="clipPath113518">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113520" />
+    </clipPath>
+    <clipPath
+       id="clipPath113522">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113524" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4838_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84445-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath113528">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113530" />
+    </clipPath>
+    <clipPath
+       id="clipPath113532">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113534" />
+    </clipPath>
+    <clipPath
+       id="clipPath113536">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113538" />
+    </clipPath>
+    <clipPath
+       id="clipPath113540">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113542" />
+    </clipPath>
+    <clipPath
+       id="clipPath113544">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113546" />
+    </clipPath>
+    <clipPath
+       id="clipPath113548">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113550" />
+    </clipPath>
+    <clipPath
+       id="clipPath113552">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113554" />
+    </clipPath>
+    <clipPath
+       id="clipPath113556">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113558" />
+    </clipPath>
+    <clipPath
+       id="clipPath113560">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113562" />
+    </clipPath>
+    <clipPath
+       id="clipPath113564">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113566" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4836_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.8129"
+       x2="37.392799"
+       y2="152.8129"
+       gradientTransform="matrix(0,-9.614,-9.614,0,876.3496,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84423-1" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84425-8" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84427-7" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84429-9" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84431-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4835_-5">
+      <rect
+         height="9.6140003"
+         width="11.315"
+         y="214.106"
+         x="-598.45099"
+         id="use84420-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4833_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84390-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath113578">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113580" />
+    </clipPath>
+    <clipPath
+       id="clipPath113582">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113584" />
+    </clipPath>
+    <clipPath
+       id="clipPath113586">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113588" />
+    </clipPath>
+    <clipPath
+       id="clipPath113590">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113592" />
+    </clipPath>
+    <clipPath
+       id="clipPath113594">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113596" />
+    </clipPath>
+    <clipPath
+       id="clipPath113598">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113600" />
+    </clipPath>
+    <clipPath
+       id="clipPath113602">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113604" />
+    </clipPath>
+    <clipPath
+       id="clipPath113606">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113608" />
+    </clipPath>
+    <clipPath
+       id="clipPath113610">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113612" />
+    </clipPath>
+    <clipPath
+       id="clipPath113614">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113616" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4831_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,809.7396,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84368-9" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84370-7" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84372-0" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84374-4" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84376-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4830_-7">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-665.06201"
+         id="use84365-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329-2" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331-0" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333-0" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335-1" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_-3">
+      <polygon
+         points="-682.208,251.221 -659.342,256.788 -636.356,251.283 -636.358,231.934 -682.207,231.929 "
+         id="use84326-6" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298-6" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300-1" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302-6" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304-9" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_-9">
+      <polygon
+         points="-615.653,251.221 -592.788,256.788 -569.802,251.283 -569.804,231.934 -615.653,231.929 "
+         id="use84295-9" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_-8">
+      <path
+         d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84007-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83987-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath113649">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113651" />
+    </clipPath>
+    <clipPath
+       id="clipPath113653">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113655" />
+    </clipPath>
+    <clipPath
+       id="clipPath113657">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113659" />
+    </clipPath>
+    <clipPath
+       id="clipPath113661">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113663" />
+    </clipPath>
+    <clipPath
+       id="clipPath113665">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113667" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_-3">
+      <path
+         d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83972-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83952-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath113676">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113678" />
+    </clipPath>
+    <clipPath
+       id="clipPath113680">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113682" />
+    </clipPath>
+    <clipPath
+       id="clipPath113684">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113686" />
+    </clipPath>
+    <clipPath
+       id="clipPath113688">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113690" />
+    </clipPath>
+    <clipPath
+       id="clipPath113692">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113694" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_-4">
+      <path
+         d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83937-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83917-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath113703">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113705" />
+    </clipPath>
+    <clipPath
+       id="clipPath113707">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113709" />
+    </clipPath>
+    <clipPath
+       id="clipPath113711">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113713" />
+    </clipPath>
+    <clipPath
+       id="clipPath113715">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113717" />
+    </clipPath>
+    <clipPath
+       id="clipPath113719">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113721" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_-5">
+      <path
+         d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
+         id="use83902-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83882-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath113730">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113732" />
+    </clipPath>
+    <clipPath
+       id="clipPath113734">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113736" />
+    </clipPath>
+    <clipPath
+       id="clipPath113738">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113740" />
+    </clipPath>
+    <clipPath
+       id="clipPath113742">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113744" />
+    </clipPath>
+    <clipPath
+       id="clipPath113746">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113748" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_-5">
+      <path
+         d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83867-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83847-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113757">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113759" />
+    </clipPath>
+    <clipPath
+       id="clipPath113761">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113763" />
+    </clipPath>
+    <clipPath
+       id="clipPath113765">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113767" />
+    </clipPath>
+    <clipPath
+       id="clipPath113769">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113771" />
+    </clipPath>
+    <clipPath
+       id="clipPath113773">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113775" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_-9">
+      <path
+         d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83832-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83812-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113784">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113786" />
+    </clipPath>
+    <clipPath
+       id="clipPath113788">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113790" />
+    </clipPath>
+    <clipPath
+       id="clipPath113792">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113794" />
+    </clipPath>
+    <clipPath
+       id="clipPath113796">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113798" />
+    </clipPath>
+    <clipPath
+       id="clipPath113800">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113802" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_-5">
+      <path
+         d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83797-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83777-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath113811">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113813" />
+    </clipPath>
+    <clipPath
+       id="clipPath113815">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113817" />
+    </clipPath>
+    <clipPath
+       id="clipPath113819">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113821" />
+    </clipPath>
+    <clipPath
+       id="clipPath113823">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113825" />
+    </clipPath>
+    <clipPath
+       id="clipPath113827">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113829" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_-0">
+      <path
+         d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83762-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_-5">
+      <path
+         d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83552-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83532-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113843">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113845" />
+    </clipPath>
+    <clipPath
+       id="clipPath113847">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113849" />
+    </clipPath>
+    <clipPath
+       id="clipPath113851">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113853" />
+    </clipPath>
+    <clipPath
+       id="clipPath113855">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113857" />
+    </clipPath>
+    <clipPath
+       id="clipPath113859">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113861" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_-1">
+      <path
+         d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83517-1"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83497-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath113870">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113872" />
+    </clipPath>
+    <clipPath
+       id="clipPath113874">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113876" />
+    </clipPath>
+    <clipPath
+       id="clipPath113878">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113880" />
+    </clipPath>
+    <clipPath
+       id="clipPath113882">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113884" />
+    </clipPath>
+    <clipPath
+       id="clipPath113886">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113888" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_-6">
+      <path
+         d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83482-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83462-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath113897">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113899" />
+    </clipPath>
+    <clipPath
+       id="clipPath113901">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113903" />
+    </clipPath>
+    <clipPath
+       id="clipPath113905">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113907" />
+    </clipPath>
+    <clipPath
+       id="clipPath113909">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113911" />
+    </clipPath>
+    <clipPath
+       id="clipPath113913">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113915" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_-5">
+      <path
+         d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83447-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83427-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath113924">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113926" />
+    </clipPath>
+    <clipPath
+       id="clipPath113928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113930" />
+    </clipPath>
+    <clipPath
+       id="clipPath113932">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113934" />
+    </clipPath>
+    <clipPath
+       id="clipPath113936">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113938" />
+    </clipPath>
+    <clipPath
+       id="clipPath113940">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113942" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_-3">
+      <path
+         d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83412-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83392-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath113951">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113953" />
+    </clipPath>
+    <clipPath
+       id="clipPath113955">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113957" />
+    </clipPath>
+    <clipPath
+       id="clipPath113959">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113961" />
+    </clipPath>
+    <clipPath
+       id="clipPath113963">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113965" />
+    </clipPath>
+    <clipPath
+       id="clipPath113967">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113969" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_-2">
+      <path
+         d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83377-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83357-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113978">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113980" />
+    </clipPath>
+    <clipPath
+       id="clipPath113982">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113984" />
+    </clipPath>
+    <clipPath
+       id="clipPath113986">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113988" />
+    </clipPath>
+    <clipPath
+       id="clipPath113990">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113992" />
+    </clipPath>
+    <clipPath
+       id="clipPath113994">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113996" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_-2">
+      <path
+         d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83342-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-1">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83097-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83077-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114010">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114012" />
+    </clipPath>
+    <clipPath
+       id="clipPath114014">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114016" />
+    </clipPath>
+    <clipPath
+       id="clipPath114018">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114020" />
+    </clipPath>
+    <clipPath
+       id="clipPath114022">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114024" />
+    </clipPath>
+    <clipPath
+       id="clipPath114026">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114028" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_-4">
+      <path
+         d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83062-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83042-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath114037">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114039" />
+    </clipPath>
+    <clipPath
+       id="clipPath114041">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114043" />
+    </clipPath>
+    <clipPath
+       id="clipPath114045">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114047" />
+    </clipPath>
+    <clipPath
+       id="clipPath114049">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114051" />
+    </clipPath>
+    <clipPath
+       id="clipPath114053">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114055" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_-1">
+      <path
+         d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
+         id="use83027-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83007-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath114064">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114066" />
+    </clipPath>
+    <clipPath
+       id="clipPath114068">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114070" />
+    </clipPath>
+    <clipPath
+       id="clipPath114072">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114074" />
+    </clipPath>
+    <clipPath
+       id="clipPath114076">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114078" />
+    </clipPath>
+    <clipPath
+       id="clipPath114080">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114082" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_-8">
+      <path
+         d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82992-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82972-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114091">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114093" />
+    </clipPath>
+    <clipPath
+       id="clipPath114095">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114097" />
+    </clipPath>
+    <clipPath
+       id="clipPath114099">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114101" />
+    </clipPath>
+    <clipPath
+       id="clipPath114103">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114105" />
+    </clipPath>
+    <clipPath
+       id="clipPath114107">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114109" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_-6">
+      <path
+         d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82957-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82937-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath114118">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114120" />
+    </clipPath>
+    <clipPath
+       id="clipPath114122">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114124" />
+    </clipPath>
+    <clipPath
+       id="clipPath114126">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114128" />
+    </clipPath>
+    <clipPath
+       id="clipPath114130">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114132" />
+    </clipPath>
+    <clipPath
+       id="clipPath114134">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114136" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_-1">
+      <path
+         d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82922-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82902-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath114145">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114147" />
+    </clipPath>
+    <clipPath
+       id="clipPath114149">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114151" />
+    </clipPath>
+    <clipPath
+       id="clipPath114153">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114155" />
+    </clipPath>
+    <clipPath
+       id="clipPath114157">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114159" />
+    </clipPath>
+    <clipPath
+       id="clipPath114161">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114163" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_-6">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82887-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_-6">
+      <path
+         d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="use82642-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82622-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114177">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114179" />
+    </clipPath>
+    <clipPath
+       id="clipPath114181">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114183" />
+    </clipPath>
+    <clipPath
+       id="clipPath114185">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114187" />
+    </clipPath>
+    <clipPath
+       id="clipPath114189">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114191" />
+    </clipPath>
+    <clipPath
+       id="clipPath114193">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114195" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_-0">
+      <path
+         d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82607-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82587-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath114204">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114206" />
+    </clipPath>
+    <clipPath
+       id="clipPath114208">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114210" />
+    </clipPath>
+    <clipPath
+       id="clipPath114212">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114214" />
+    </clipPath>
+    <clipPath
+       id="clipPath114216">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114218" />
+    </clipPath>
+    <clipPath
+       id="clipPath114220">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114222" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_-6">
+      <path
+         d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82572-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82552-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath114231">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114233" />
+    </clipPath>
+    <clipPath
+       id="clipPath114235">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114237" />
+    </clipPath>
+    <clipPath
+       id="clipPath114239">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114241" />
+    </clipPath>
+    <clipPath
+       id="clipPath114243">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114245" />
+    </clipPath>
+    <clipPath
+       id="clipPath114247">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114249" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_-2">
+      <path
+         d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
+         id="use82537-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82517-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114258">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114260" />
+    </clipPath>
+    <clipPath
+       id="clipPath114262">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114264" />
+    </clipPath>
+    <clipPath
+       id="clipPath114266">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114268" />
+    </clipPath>
+    <clipPath
+       id="clipPath114270">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114272" />
+    </clipPath>
+    <clipPath
+       id="clipPath114274">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114276" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_-1">
+      <path
+         d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82502-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82482-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114285">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114287" />
+    </clipPath>
+    <clipPath
+       id="clipPath114289">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114291" />
+    </clipPath>
+    <clipPath
+       id="clipPath114293">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114295" />
+    </clipPath>
+    <clipPath
+       id="clipPath114297">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114299" />
+    </clipPath>
+    <clipPath
+       id="clipPath114301">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114303" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_-1">
+      <path
+         d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82467-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82447-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath114312">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114314" />
+    </clipPath>
+    <clipPath
+       id="clipPath114316">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114318" />
+    </clipPath>
+    <clipPath
+       id="clipPath114320">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114322" />
+    </clipPath>
+    <clipPath
+       id="clipPath114324">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114326" />
+    </clipPath>
+    <clipPath
+       id="clipPath114328">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114330" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4562_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82435-2" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82437-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4561_-1">
+      <path
+         d="m -660.642,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82432-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath114339">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114341" />
+    </clipPath>
+    <clipPath
+       id="clipPath114343">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114345" />
+    </clipPath>
+    <clipPath
+       id="clipPath114347">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114349" />
+    </clipPath>
+    <clipPath
+       id="clipPath114351">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114353" />
+    </clipPath>
+    <clipPath
+       id="clipPath114355">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114357" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-5">
+      <path
+         d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82397-5"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82359-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114366">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114368" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82345-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114372">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114374" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319-4" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321-6" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323-0" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325-7" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327-0" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329-5" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_-4">
+      <polygon
+         points="-659.18,258.293 -679.997,253.224 -680.004,267.353 -637.65,267.32 -637.642,253.133 "
+         id="use82316-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290-3" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292-3" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294-2" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296-5" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298-7" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300-2" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_-2">
+      <polygon
+         points="-593.085,258.293 -613.901,253.224 -613.908,267.353 -571.554,267.32 -571.547,253.133 "
+         id="use82287-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82164-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_-8">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82174-4" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185-5" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_-6">
+      <rect
+         height="64.037003"
+         width="174.953"
+         y="293.367"
+         x="-679.57202"
+         id="use82182-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath114407">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use114409" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_-7">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82197-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114413">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114415" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_-4">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82209-7" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_-8">
+      <rect
+         height="64.037003"
+         width="45.659"
+         y="293.367"
+         x="-441.45999"
+         id="use82217-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114424">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use114426" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_-9">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82232-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4518_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82083-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114432">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114434" />
+    </clipPath>
+    <clipPath
+       id="clipPath114436">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114438" />
+    </clipPath>
+    <clipPath
+       id="clipPath114440">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114442" />
+    </clipPath>
+    <clipPath
+       id="clipPath114444">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114446" />
+    </clipPath>
+    <clipPath
+       id="clipPath114448">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114450" />
+    </clipPath>
+    <clipPath
+       id="clipPath114452">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114454" />
+    </clipPath>
+    <clipPath
+       id="clipPath114456">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114458" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4516_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,902.0769,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82067-5" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82069-0" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82071-8" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82073-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4515_-1">
+      <polygon
+         points="-613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 -590.704,196.685 -571.658,196.685 -571.658,188.287 "
+         id="use82064-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4511_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82010-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114469">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114471" />
+    </clipPath>
+    <clipPath
+       id="clipPath114473">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114475" />
+    </clipPath>
+    <clipPath
+       id="clipPath114477">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114479" />
+    </clipPath>
+    <clipPath
+       id="clipPath114481">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114483" />
+    </clipPath>
+    <clipPath
+       id="clipPath114485">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114487" />
+    </clipPath>
+    <clipPath
+       id="clipPath114489">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114491" />
+    </clipPath>
+    <clipPath
+       id="clipPath114493">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114495" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient104534-0"
+       xlink:href="#SVGID_4509_-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4509_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop81994-0" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop81996-4" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop81998-3" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82000-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4508_-0">
+      <polygon
+         points="-680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 -657.048,196.685 -638.002,196.685 -638.002,188.287 "
+         id="use81991-1" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient115446"
+       xlink:href="#SVGID_4509_-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4657_-1-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-8-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-8-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-1-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4655_-2-7"
+         overflow="visible"
+         id="use83097-8-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-0-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82345-2-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath118798">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use118800" />
+    </clipPath>
+    <defs
+       id="defs83093-1-3">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4655_-2-7"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102313-6-0">
+      <use
+         id="use102315-6-2"
+         overflow="visible"
+         xlink:href="#SVGID_4655_-2-7"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102317-9-1">
+      <stop
+         id="stop102319-7-7"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102321-3-3"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4873_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84798-79" />
+    </clipPath>
+    <clipPath
+       id="clipPath119610">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119612" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_-5">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84810-0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821-4" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823-2" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825-99" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827-79" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_-3">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84818-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119624">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119626" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_-1">
+      <rect
+         height="10.152"
+         width="174.94701"
+         y="360.13901"
+         x="-679.88898"
+         id="use84841-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_-6">
+      <rect
+         height="10.153"
+         width="174.94701"
+         y="360.138"
+         x="-679.88898"
+         id="use84849-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath119632">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119634" />
+    </clipPath>
+    <clipPath
+       id="clipPath119636">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119638" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774-61" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_-2">
+      <polygon
+         points="-654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 "
+         id="use84771-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84759-44" />
+    </clipPath>
+    <clipPath
+       id="clipPath119647">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119649" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_-0">
+      <polygon
+         points="-588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 -590.081,276.108 "
+         id="use84732-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84720-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119658">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119660" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4851_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205101"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84622-0" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84624-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4850_-19">
+      <polygon
+         points="-588.288,208.524 -574.322,208.524 -574.322,203.458 -588.288,203.458 -590.081,206 "
+         id="use84619-38" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4848_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84607-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath119669">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119671" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4846_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205101"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84585-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84587-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4845_-4">
+      <polygon
+         points="-654.922,208.524 -640.956,208.524 -640.956,203.458 -654.922,203.458 -656.715,206 "
+         id="use84582-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath119680">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119682" />
+    </clipPath>
+    <clipPath
+       id="clipPath119684">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119686" />
+    </clipPath>
+    <clipPath
+       id="clipPath119688">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119690" />
+    </clipPath>
+    <clipPath
+       id="clipPath119692">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119694" />
+    </clipPath>
+    <clipPath
+       id="clipPath119696">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119698" />
+    </clipPath>
+    <clipPath
+       id="clipPath119700">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119702" />
+    </clipPath>
+    <clipPath
+       id="clipPath119704">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119706" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4838_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84445-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath119710">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119712" />
+    </clipPath>
+    <clipPath
+       id="clipPath119714">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119716" />
+    </clipPath>
+    <clipPath
+       id="clipPath119718">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119720" />
+    </clipPath>
+    <clipPath
+       id="clipPath119722">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119724" />
+    </clipPath>
+    <clipPath
+       id="clipPath119726">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119728" />
+    </clipPath>
+    <clipPath
+       id="clipPath119730">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119732" />
+    </clipPath>
+    <clipPath
+       id="clipPath119734">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119736" />
+    </clipPath>
+    <clipPath
+       id="clipPath119738">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119740" />
+    </clipPath>
+    <clipPath
+       id="clipPath119742">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119744" />
+    </clipPath>
+    <clipPath
+       id="clipPath119746">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119748" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4836_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.8129"
+       x2="37.392799"
+       y2="152.8129"
+       gradientTransform="matrix(0,-9.614,-9.614,0,876.3496,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84423-5" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84425-7" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84427-8" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84429-1" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84431-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4835_-3">
+      <rect
+         height="9.6140003"
+         width="11.315"
+         y="214.106"
+         x="-598.45099"
+         id="use84420-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4833_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84390-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119760">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119762" />
+    </clipPath>
+    <clipPath
+       id="clipPath119764">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119766" />
+    </clipPath>
+    <clipPath
+       id="clipPath119768">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119770" />
+    </clipPath>
+    <clipPath
+       id="clipPath119772">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119774" />
+    </clipPath>
+    <clipPath
+       id="clipPath119776">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119778" />
+    </clipPath>
+    <clipPath
+       id="clipPath119780">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119782" />
+    </clipPath>
+    <clipPath
+       id="clipPath119784">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119786" />
+    </clipPath>
+    <clipPath
+       id="clipPath119788">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119790" />
+    </clipPath>
+    <clipPath
+       id="clipPath119792">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119794" />
+    </clipPath>
+    <clipPath
+       id="clipPath119796">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119798" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4831_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,809.7396,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84368-1" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84370-0" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84372-8" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84374-42" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84376-15" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4830_-5">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-665.06201"
+         id="use84365-9" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329-5" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331-2" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333-3" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335-9" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_-8">
+      <polygon
+         points="-636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 -659.342,256.788 "
+         id="use84326-1" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298-1" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300-7" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302-5" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304-7" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_-6">
+      <polygon
+         points="-569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 -592.788,256.788 "
+         id="use84295-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_-2">
+      <path
+         d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84007-5"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83987-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119831">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119833" />
+    </clipPath>
+    <clipPath
+       id="clipPath119835">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119837" />
+    </clipPath>
+    <clipPath
+       id="clipPath119839">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119841" />
+    </clipPath>
+    <clipPath
+       id="clipPath119843">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119845" />
+    </clipPath>
+    <clipPath
+       id="clipPath119847">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119849" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_-1">
+      <path
+         d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83972-45"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_-85">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83952-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath119858">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119860" />
+    </clipPath>
+    <clipPath
+       id="clipPath119862">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119864" />
+    </clipPath>
+    <clipPath
+       id="clipPath119866">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119868" />
+    </clipPath>
+    <clipPath
+       id="clipPath119870">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119872" />
+    </clipPath>
+    <clipPath
+       id="clipPath119874">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119876" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_-7">
+      <path
+         d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83937-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83917-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath119885">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119887" />
+    </clipPath>
+    <clipPath
+       id="clipPath119889">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119891" />
+    </clipPath>
+    <clipPath
+       id="clipPath119893">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119895" />
+    </clipPath>
+    <clipPath
+       id="clipPath119897">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119899" />
+    </clipPath>
+    <clipPath
+       id="clipPath119901">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119903" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_-2">
+      <path
+         d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
+         id="use83902-70"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83882-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath119912">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119914" />
+    </clipPath>
+    <clipPath
+       id="clipPath119916">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119918" />
+    </clipPath>
+    <clipPath
+       id="clipPath119920">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119922" />
+    </clipPath>
+    <clipPath
+       id="clipPath119924">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119926" />
+    </clipPath>
+    <clipPath
+       id="clipPath119928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119930" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870-91" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_-6">
+      <path
+         d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83867-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83847-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath119939">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119941" />
+    </clipPath>
+    <clipPath
+       id="clipPath119943">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119945" />
+    </clipPath>
+    <clipPath
+       id="clipPath119947">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119949" />
+    </clipPath>
+    <clipPath
+       id="clipPath119951">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119953" />
+    </clipPath>
+    <clipPath
+       id="clipPath119955">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119957" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_-3">
+      <path
+         d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83832-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83812-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath119966">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119968" />
+    </clipPath>
+    <clipPath
+       id="clipPath119970">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119972" />
+    </clipPath>
+    <clipPath
+       id="clipPath119974">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119976" />
+    </clipPath>
+    <clipPath
+       id="clipPath119978">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119980" />
+    </clipPath>
+    <clipPath
+       id="clipPath119982">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119984" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802-76" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_-1">
+      <path
+         d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83797-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83777-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath119993">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119995" />
+    </clipPath>
+    <clipPath
+       id="clipPath119997">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119999" />
+    </clipPath>
+    <clipPath
+       id="clipPath120001">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120003" />
+    </clipPath>
+    <clipPath
+       id="clipPath120005">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120007" />
+    </clipPath>
+    <clipPath
+       id="clipPath120009">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120011" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_-6">
+      <path
+         d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83762-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4749_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83742-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath120020">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120022" />
+    </clipPath>
+    <clipPath
+       id="clipPath120024">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120026" />
+    </clipPath>
+    <clipPath
+       id="clipPath120028">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120030" />
+    </clipPath>
+    <clipPath
+       id="clipPath120032">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120034" />
+    </clipPath>
+    <clipPath
+       id="clipPath120036">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120038" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555-85" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_-8">
+      <path
+         d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83552-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_-85">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83532-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath120047">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120049" />
+    </clipPath>
+    <clipPath
+       id="clipPath120051">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120053" />
+    </clipPath>
+    <clipPath
+       id="clipPath120055">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120057" />
+    </clipPath>
+    <clipPath
+       id="clipPath120059">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120061" />
+    </clipPath>
+    <clipPath
+       id="clipPath120063">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120065" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_-0">
+      <path
+         d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83517-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83497-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath120074">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120076" />
+    </clipPath>
+    <clipPath
+       id="clipPath120078">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120080" />
+    </clipPath>
+    <clipPath
+       id="clipPath120082">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120084" />
+    </clipPath>
+    <clipPath
+       id="clipPath120086">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120088" />
+    </clipPath>
+    <clipPath
+       id="clipPath120090">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120092" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_-68">
+      <path
+         d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83482-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83462-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120101">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120103" />
+    </clipPath>
+    <clipPath
+       id="clipPath120105">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120107" />
+    </clipPath>
+    <clipPath
+       id="clipPath120109">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120111" />
+    </clipPath>
+    <clipPath
+       id="clipPath120113">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120115" />
+    </clipPath>
+    <clipPath
+       id="clipPath120117">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120119" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450-77" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_-2">
+      <path
+         d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83447-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83427-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120128">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120130" />
+    </clipPath>
+    <clipPath
+       id="clipPath120132">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120134" />
+    </clipPath>
+    <clipPath
+       id="clipPath120136">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120138" />
+    </clipPath>
+    <clipPath
+       id="clipPath120140">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120142" />
+    </clipPath>
+    <clipPath
+       id="clipPath120144">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120146" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_-5">
+      <path
+         d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83412-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83392-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120155">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120157" />
+    </clipPath>
+    <clipPath
+       id="clipPath120159">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120161" />
+    </clipPath>
+    <clipPath
+       id="clipPath120163">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120165" />
+    </clipPath>
+    <clipPath
+       id="clipPath120167">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120169" />
+    </clipPath>
+    <clipPath
+       id="clipPath120171">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120173" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_-62"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_-20">
+      <path
+         d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83377-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83357-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath120182">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120184" />
+    </clipPath>
+    <clipPath
+       id="clipPath120186">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120188" />
+    </clipPath>
+    <clipPath
+       id="clipPath120190">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120192" />
+    </clipPath>
+    <clipPath
+       id="clipPath120194">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120196" />
+    </clipPath>
+    <clipPath
+       id="clipPath120198">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120200" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_-7">
+      <path
+         d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83342-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4689_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83322-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath120209">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120211" />
+    </clipPath>
+    <clipPath
+       id="clipPath120213">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120215" />
+    </clipPath>
+    <clipPath
+       id="clipPath120217">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120219" />
+    </clipPath>
+    <clipPath
+       id="clipPath120221">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120223" />
+    </clipPath>
+    <clipPath
+       id="clipPath120225">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120227" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-7">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83097-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83077-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath120236">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120238" />
+    </clipPath>
+    <clipPath
+       id="clipPath120240">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120242" />
+    </clipPath>
+    <clipPath
+       id="clipPath120244">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120246" />
+    </clipPath>
+    <clipPath
+       id="clipPath120248">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120250" />
+    </clipPath>
+    <clipPath
+       id="clipPath120252">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120254" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065-42" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_-1">
+      <path
+         d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83062-1"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83042-49" />
+    </clipPath>
+    <clipPath
+       id="clipPath120263">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120265" />
+    </clipPath>
+    <clipPath
+       id="clipPath120267">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120269" />
+    </clipPath>
+    <clipPath
+       id="clipPath120271">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120273" />
+    </clipPath>
+    <clipPath
+       id="clipPath120275">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120277" />
+    </clipPath>
+    <clipPath
+       id="clipPath120279">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120281" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032-35" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_-8">
+      <path
+         d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
+         id="use83027-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83007-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120290">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120292" />
+    </clipPath>
+    <clipPath
+       id="clipPath120294">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120296" />
+    </clipPath>
+    <clipPath
+       id="clipPath120298">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120300" />
+    </clipPath>
+    <clipPath
+       id="clipPath120302">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120304" />
+    </clipPath>
+    <clipPath
+       id="clipPath120306">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120308" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_-9">
+      <path
+         d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82992-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82972-97" />
+    </clipPath>
+    <clipPath
+       id="clipPath120317">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120319" />
+    </clipPath>
+    <clipPath
+       id="clipPath120321">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120323" />
+    </clipPath>
+    <clipPath
+       id="clipPath120325">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120327" />
+    </clipPath>
+    <clipPath
+       id="clipPath120329">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120331" />
+    </clipPath>
+    <clipPath
+       id="clipPath120333">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120335" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_-2">
+      <path
+         d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82957-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82937-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120344">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120346" />
+    </clipPath>
+    <clipPath
+       id="clipPath120348">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120350" />
+    </clipPath>
+    <clipPath
+       id="clipPath120352">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120354" />
+    </clipPath>
+    <clipPath
+       id="clipPath120356">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120358" />
+    </clipPath>
+    <clipPath
+       id="clipPath120360">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120362" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925-64" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_-9">
+      <path
+         d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82922-36"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82902-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath120371">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120373" />
+    </clipPath>
+    <clipPath
+       id="clipPath120375">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120377" />
+    </clipPath>
+    <clipPath
+       id="clipPath120379">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120381" />
+    </clipPath>
+    <clipPath
+       id="clipPath120383">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120385" />
+    </clipPath>
+    <clipPath
+       id="clipPath120387">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120389" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_-2">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82887-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4624_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82867-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath120398">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120400" />
+    </clipPath>
+    <clipPath
+       id="clipPath120402">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120404" />
+    </clipPath>
+    <clipPath
+       id="clipPath120406">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120408" />
+    </clipPath>
+    <clipPath
+       id="clipPath120410">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120412" />
+    </clipPath>
+    <clipPath
+       id="clipPath120414">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120416" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_-1">
+      <path
+         d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="use82642-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82622-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120425">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120427" />
+    </clipPath>
+    <clipPath
+       id="clipPath120429">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120431" />
+    </clipPath>
+    <clipPath
+       id="clipPath120433">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120435" />
+    </clipPath>
+    <clipPath
+       id="clipPath120437">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120439" />
+    </clipPath>
+    <clipPath
+       id="clipPath120441">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120443" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_-7">
+      <path
+         d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82607-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82587-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath120452">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120454" />
+    </clipPath>
+    <clipPath
+       id="clipPath120456">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120458" />
+    </clipPath>
+    <clipPath
+       id="clipPath120460">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120462" />
+    </clipPath>
+    <clipPath
+       id="clipPath120464">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120466" />
+    </clipPath>
+    <clipPath
+       id="clipPath120468">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120470" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577-03" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_-7">
+      <path
+         d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82572-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_-65">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82552-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120479">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120481" />
+    </clipPath>
+    <clipPath
+       id="clipPath120483">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120485" />
+    </clipPath>
+    <clipPath
+       id="clipPath120487">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120489" />
+    </clipPath>
+    <clipPath
+       id="clipPath120491">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120493" />
+    </clipPath>
+    <clipPath
+       id="clipPath120495">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120497" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_-5">
+      <path
+         d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
+         id="use82537-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82517-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath120506">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120508" />
+    </clipPath>
+    <clipPath
+       id="clipPath120510">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120512" />
+    </clipPath>
+    <clipPath
+       id="clipPath120514">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120516" />
+    </clipPath>
+    <clipPath
+       id="clipPath120518">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120520" />
+    </clipPath>
+    <clipPath
+       id="clipPath120522">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120524" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_-3">
+      <path
+         d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82502-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_-54">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82482-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath120533">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120535" />
+    </clipPath>
+    <clipPath
+       id="clipPath120537">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120539" />
+    </clipPath>
+    <clipPath
+       id="clipPath120541">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120543" />
+    </clipPath>
+    <clipPath
+       id="clipPath120545">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120547" />
+    </clipPath>
+    <clipPath
+       id="clipPath120549">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120551" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_-8">
+      <path
+         d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82467-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82447-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath120560">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120562" />
+    </clipPath>
+    <clipPath
+       id="clipPath120564">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120566" />
+    </clipPath>
+    <clipPath
+       id="clipPath120568">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120570" />
+    </clipPath>
+    <clipPath
+       id="clipPath120572">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120574" />
+    </clipPath>
+    <clipPath
+       id="clipPath120576">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120578" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4562_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82435-29" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82437-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4561_-11">
+      <path
+         d="m -660.642,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82432-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath120587">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120589" />
+    </clipPath>
+    <clipPath
+       id="clipPath120591">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120593" />
+    </clipPath>
+    <clipPath
+       id="clipPath120595">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120597" />
+    </clipPath>
+    <clipPath
+       id="clipPath120599">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120601" />
+    </clipPath>
+    <clipPath
+       id="clipPath120603">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120605" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-7">
+      <path
+         d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82397-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_-54">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82359-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath120614">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120616" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82345-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath120620">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120622" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319-6" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321-0" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323-4" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325-70" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327-00" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329-8" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331-67" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_-3">
+      <polygon
+         points="-680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 -679.997,253.224 "
+         id="use82316-0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_-93"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290-1" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292-0" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294-1" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296-0" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298-2" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300-3" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302-1" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_-1">
+      <polygon
+         points="-613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 -613.901,253.224 "
+         id="use82287-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82164-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_-9">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82174-42" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185-2" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_-4">
+      <rect
+         height="64.037003"
+         width="174.953"
+         y="293.367"
+         x="-679.57202"
+         id="use82182-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath120655">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use120657" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_-5">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82197-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath120661">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120663" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_-1">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82209-3" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_-89">
+      <rect
+         height="64.037003"
+         width="45.659"
+         y="293.367"
+         x="-441.45999"
+         id="use82217-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120672">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use120674" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_-1">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82232-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4518_-35">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82083-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120680">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120682" />
+    </clipPath>
+    <clipPath
+       id="clipPath120684">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120686" />
+    </clipPath>
+    <clipPath
+       id="clipPath120688">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120690" />
+    </clipPath>
+    <clipPath
+       id="clipPath120692">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120694" />
+    </clipPath>
+    <clipPath
+       id="clipPath120696">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120698" />
+    </clipPath>
+    <clipPath
+       id="clipPath120700">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120702" />
+    </clipPath>
+    <clipPath
+       id="clipPath120704">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120706" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4516_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,902.0769,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82067-0" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82069-6" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82071-2" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82073-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4515_-11">
+      <polygon
+         points="-590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 "
+         id="use82064-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4511_-38">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82010-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath120717">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120719" />
+    </clipPath>
+    <clipPath
+       id="clipPath120721">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120723" />
+    </clipPath>
+    <clipPath
+       id="clipPath120725">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120727" />
+    </clipPath>
+    <clipPath
+       id="clipPath120729">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120731" />
+    </clipPath>
+    <clipPath
+       id="clipPath120733">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120735" />
+    </clipPath>
+    <clipPath
+       id="clipPath120737">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120739" />
+    </clipPath>
+    <clipPath
+       id="clipPath120741">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120743" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient104534-4"
+       xlink:href="#SVGID_4509_-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4509_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop81994-08" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop81996-2" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop81998-7" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82000-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4508_-3">
+      <polygon
+         points="-657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 "
+         id="use81991-0" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient121727"
+       xlink:href="#SVGID_4509_-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200"
+       id="linearGradient126204"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200"
+       id="linearGradient126210"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-7"
+       id="linearGradient126210-7"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-7"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-2" />
+    </linearGradient>
+    <linearGradient
+       y2="442.86218"
+       x2="219"
+       y1="442.86218"
+       x1="111"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126228"
+       xlink:href="#linearGradient126200-7"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2"
+       id="linearGradient126210-9"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7" />
+    </linearGradient>
+    <linearGradient
+       y2="442.86218"
+       x2="219"
+       y1="442.86218"
+       x1="111"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126435"
+       xlink:href="#linearGradient126200-2"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2"
+       id="linearGradient126487"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218"
+       gradientTransform="translate(190.5,52.1205)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-0"
+       id="linearGradient126520-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(190.5,52.1205)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2-0"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7-1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-2"
+       id="linearGradient126520-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(190.5,52.1205)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2-2"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4843_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-1-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-9-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-8-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-2-2" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4854_"
+         overflow="visible"
+         id="use84656-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_"
+         overflow="visible"
+         id="use84644-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath126768">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_"
+         overflow="visible"
+         id="use126770" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4841_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,942.8785,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84478-8" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84480-2" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84482-3" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84484-9" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84486-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4840_-7">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-531.92297"
+         id="use84475-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use82132-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath126782">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126784" />
+    </clipPath>
+    <clipPath
+       id="clipPath126786">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126788" />
+    </clipPath>
+    <clipPath
+       id="clipPath126790">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126792" />
+    </clipPath>
+    <clipPath
+       id="clipPath126794">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126796" />
+    </clipPath>
+    <clipPath
+       id="clipPath126798">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126800" />
+    </clipPath>
+    <clipPath
+       id="clipPath126802">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126804" />
+    </clipPath>
+    <clipPath
+       id="clipPath126806">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126808" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4521_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4519_"
+         overflow="visible"
+         id="use82113-2" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904"
+       xlink:href="#SVGID_4521_-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4856_-4-6"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2-0" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2-2">
+      <polygon
+         points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 "
+         id="use84656-1-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84644-1-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath127140">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127142" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82132-5-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath127146">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127148" />
+    </clipPath>
+    <clipPath
+       id="clipPath127150">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127152" />
+    </clipPath>
+    <clipPath
+       id="clipPath127154">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127156" />
+    </clipPath>
+    <clipPath
+       id="clipPath127158">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127160" />
+    </clipPath>
+    <clipPath
+       id="clipPath127162">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127164" />
+    </clipPath>
+    <clipPath
+       id="clipPath127166">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127168" />
+    </clipPath>
+    <clipPath
+       id="clipPath127170">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127172" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904-6"
+       xlink:href="#SVGID_4521_-3-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4521_-3-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6-3" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6-5" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5-4" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5-3">
+      <polygon
+         points="-524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 "
+         id="use82113-2-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_-4-1"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2-24">
+      <polygon
+         id="use84656-1-9"
+         points="-521.64,208.524 -507.673,208.524 -507.673,203.458 -521.64,203.458 -523.432,206 " />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8-0">
+      <rect
+         id="use84644-1-6"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9068">
+      <rect
+         id="use9070"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1-5">
+      <rect
+         id="use82132-5-25"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9074">
+      <rect
+         id="use9076"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9078">
+      <rect
+         id="use9080"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9082">
+      <rect
+         id="use9084"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9086">
+      <rect
+         id="use9088"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9090">
+      <rect
+         id="use9092"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9094">
+      <rect
+         id="use9096"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <clipPath
+       id="clipPath9098">
+      <rect
+         id="use9100"
+         x="-682.31403"
+         y="181.315"
+         width="200.271"
+         height="205.44099" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904-61"
+       xlink:href="#SVGID_4521_-3-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4521_-3-0"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6-7" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6-2" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5-1" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9-34" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5-6">
+      <polygon
+         id="use82113-2-5"
+         points="-528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 " />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-0"
+       id="linearGradient9382"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(28.50002,64.927434)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <clipPath
+       id="SVGID_4550_-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8"
+         overflow="visible"
+         id="use82345-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath9448">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8"
+         overflow="visible"
+         id="use9450" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412-03" />
+    </clipPath>
+    <clipPath
+       id="clipPath9526">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9528" />
+    </clipPath>
+    <clipPath
+       id="clipPath9530">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9532" />
+    </clipPath>
+    <clipPath
+       id="clipPath9534">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9536" />
+    </clipPath>
+    <clipPath
+       id="clipPath9538">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9540" />
+    </clipPath>
+    <clipPath
+       id="clipPath9542">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9544" />
+    </clipPath>
+    <defs
+       id="defs82478">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4568_" />
+    </defs>
+    <clipPath
+       id="clipPath101841">
+      <use
+         id="use101843"
+         overflow="visible"
+         xlink:href="#SVGID_4568_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82443">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4563_" />
+    </defs>
+    <clipPath
+       id="clipPath101814">
+      <use
+         id="use101816"
+         overflow="visible"
+         xlink:href="#SVGID_4563_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3-4-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6-0-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3-43">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6-01" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-3-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-2-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-39">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-27" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-6-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8-0"
+         overflow="visible"
+         id="use82345-0-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath9882">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8-0"
+         overflow="visible"
+         id="use9884" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_-4-65"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2-8" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2-4">
+      <polygon
+         points="-523.432,206 -521.64,208.524 -507.673,208.524 -507.673,203.458 -521.64,203.458 "
+         id="use84656-1-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84644-1-67" />
+    </clipPath>
+    <clipPath
+       id="clipPath9893">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9895" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82132-5-21" />
+    </clipPath>
+    <clipPath
+       id="clipPath9899">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9901" />
+    </clipPath>
+    <clipPath
+       id="clipPath9903">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9905" />
+    </clipPath>
+    <clipPath
+       id="clipPath9907">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9909" />
+    </clipPath>
+    <clipPath
+       id="clipPath9911">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9913" />
+    </clipPath>
+    <clipPath
+       id="clipPath9915">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9917" />
+    </clipPath>
+    <clipPath
+       id="clipPath9919">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9921" />
+    </clipPath>
+    <clipPath
+       id="clipPath9923">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9925" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904-5"
+       xlink:href="#SVGID_4521_-3-09"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4521_-3-09"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6-0" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6-1" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5-5" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5-2">
+      <polygon
+         points="-504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 "
+         id="use82113-2-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4873_-98">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_-8"
+         overflow="visible"
+         id="use84798-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath9939">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_-8"
+         overflow="visible"
+         id="use9941" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4874_-4"
+         overflow="visible"
+         id="use84810-3" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821-5" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823-1" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825-0" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827-2" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4876_-1"
+         overflow="visible"
+         id="use84818-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath9953">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_-8"
+         overflow="visible"
+         id="use9955" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4879_-3"
+         overflow="visible"
+         id="use84841-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4881_-4"
+         overflow="visible"
+         id="use84849-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath9961">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_-8"
+         overflow="visible"
+         id="use9963" />
+    </clipPath>
+    <clipPath
+       id="clipPath9965">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_-8"
+         overflow="visible"
+         id="use9967" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774-5" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4869_-7"
+         overflow="visible"
+         id="use84771-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4867_-0"
+         overflow="visible"
+         id="use84759-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath9976">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4867_-0"
+         overflow="visible"
+         id="use9978" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735-7" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737-90" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_-5">
+      <polygon
+         points="-574.322,278.632 -574.322,273.567 -588.288,273.567 -590.081,276.108 -588.288,278.632 "
+         id="use84732-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84720-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath9987">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9989" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath9993">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use9995" />
+    </clipPath>
+    <clipPath
+       id="clipPath9997">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use9999" />
+    </clipPath>
+    <clipPath
+       id="clipPath10001">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use10003" />
+    </clipPath>
+    <clipPath
+       id="clipPath10005">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use10007" />
+    </clipPath>
+    <clipPath
+       id="clipPath10009">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use10011" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329-0" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331-5" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333-31" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335-7" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4826_-2"
+         overflow="visible"
+         id="use84326-14" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904-61-3"
+       xlink:href="#SVGID_4521_-3-0-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4521_-3-0-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6-7-7" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6-2-5" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5-1-8" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9-34-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5-6-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4519_-5-8"
+         overflow="visible"
+         id="use82113-2-5-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1-5-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use82132-5-25-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath10031">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10033" />
+    </clipPath>
+    <clipPath
+       id="clipPath10035">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10037" />
+    </clipPath>
+    <clipPath
+       id="clipPath10039">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10041" />
+    </clipPath>
+    <clipPath
+       id="clipPath10043">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10045" />
+    </clipPath>
+    <clipPath
+       id="clipPath10047">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10049" />
+    </clipPath>
+    <clipPath
+       id="clipPath10051">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10053" />
+    </clipPath>
+    <clipPath
+       id="clipPath10055">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8-1"
+         overflow="visible"
+         id="use10057" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8-0-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_-4-9"
+         overflow="visible"
+         id="use84644-1-6-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath10061">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_-4-9"
+         overflow="visible"
+         id="use10063" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_-4-1-0"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2-9-3" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1-0-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2-24-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4854_-1-2"
+         overflow="visible"
+         id="use84656-1-9-9" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298-2" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300-4" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302-9" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304-0" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_-4">
+      <polygon
+         points="-569.804,231.934 -615.653,231.929 -615.653,251.221 -592.788,256.788 -569.802,251.283 "
+         id="use84295-5" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4785_-4"
+         overflow="visible"
+         id="use84007-57" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_-9"
+         overflow="visible"
+         id="use83987-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath10085">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_-9"
+         overflow="visible"
+         id="use10087" />
+    </clipPath>
+    <clipPath
+       id="clipPath10089">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_-9"
+         overflow="visible"
+         id="use10091" />
+    </clipPath>
+    <clipPath
+       id="clipPath10093">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_-9"
+         overflow="visible"
+         id="use10095" />
+    </clipPath>
+    <clipPath
+       id="clipPath10097">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_-9"
+         overflow="visible"
+         id="use10099" />
+    </clipPath>
+    <clipPath
+       id="clipPath10101">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_-9"
+         overflow="visible"
+         id="use10103" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975-2" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4780_-6"
+         overflow="visible"
+         id="use83972-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_-83">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_-7"
+         overflow="visible"
+         id="use83952-22" />
+    </clipPath>
+    <clipPath
+       id="clipPath10112">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_-7"
+         overflow="visible"
+         id="use10114" />
+    </clipPath>
+    <clipPath
+       id="clipPath10116">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_-7"
+         overflow="visible"
+         id="use10118" />
+    </clipPath>
+    <clipPath
+       id="clipPath10120">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_-7"
+         overflow="visible"
+         id="use10122" />
+    </clipPath>
+    <clipPath
+       id="clipPath10124">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_-7"
+         overflow="visible"
+         id="use10126" />
+    </clipPath>
+    <clipPath
+       id="clipPath10128">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_-7"
+         overflow="visible"
+         id="use10130" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_-42"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4775_-6"
+         overflow="visible"
+         id="use83937-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_-60">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_-2"
+         overflow="visible"
+         id="use83917-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath10139">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_-2"
+         overflow="visible"
+         id="use10141" />
+    </clipPath>
+    <clipPath
+       id="clipPath10143">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_-2"
+         overflow="visible"
+         id="use10145" />
+    </clipPath>
+    <clipPath
+       id="clipPath10147">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_-2"
+         overflow="visible"
+         id="use10149" />
+    </clipPath>
+    <clipPath
+       id="clipPath10151">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_-2"
+         overflow="visible"
+         id="use10153" />
+    </clipPath>
+    <clipPath
+       id="clipPath10155">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_-2"
+         overflow="visible"
+         id="use10157" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905-30" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4770_-0"
+         overflow="visible"
+         id="use83902-8" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_-0"
+         overflow="visible"
+         id="use83882-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath10166">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_-0"
+         overflow="visible"
+         id="use10168" />
+    </clipPath>
+    <clipPath
+       id="clipPath10170">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_-0"
+         overflow="visible"
+         id="use10172" />
+    </clipPath>
+    <clipPath
+       id="clipPath10174">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_-0"
+         overflow="visible"
+         id="use10176" />
+    </clipPath>
+    <clipPath
+       id="clipPath10178">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_-0"
+         overflow="visible"
+         id="use10180" />
+    </clipPath>
+    <clipPath
+       id="clipPath10182">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_-0"
+         overflow="visible"
+         id="use10184" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870-2" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872-06" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4765_-7"
+         overflow="visible"
+         id="use83867-8" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_-6"
+         overflow="visible"
+         id="use83847-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath10193">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_-6"
+         overflow="visible"
+         id="use10195" />
+    </clipPath>
+    <clipPath
+       id="clipPath10197">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_-6"
+         overflow="visible"
+         id="use10199" />
+    </clipPath>
+    <clipPath
+       id="clipPath10201">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_-6"
+         overflow="visible"
+         id="use10203" />
+    </clipPath>
+    <clipPath
+       id="clipPath10205">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_-6"
+         overflow="visible"
+         id="use10207" />
+    </clipPath>
+    <clipPath
+       id="clipPath10209">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_-6"
+         overflow="visible"
+         id="use10211" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_-32">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4760_-8"
+         overflow="visible"
+         id="use83832-48" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_-6"
+         overflow="visible"
+         id="use83812-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath10220">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_-6"
+         overflow="visible"
+         id="use10222" />
+    </clipPath>
+    <clipPath
+       id="clipPath10224">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_-6"
+         overflow="visible"
+         id="use10226" />
+    </clipPath>
+    <clipPath
+       id="clipPath10228">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_-6"
+         overflow="visible"
+         id="use10230" />
+    </clipPath>
+    <clipPath
+       id="clipPath10232">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_-6"
+         overflow="visible"
+         id="use10234" />
+    </clipPath>
+    <clipPath
+       id="clipPath10236">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_-6"
+         overflow="visible"
+         id="use10238" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_-57">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4755_-2"
+         overflow="visible"
+         id="use83797-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_-7"
+         overflow="visible"
+         id="use83777-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath10247">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_-7"
+         overflow="visible"
+         id="use10249" />
+    </clipPath>
+    <clipPath
+       id="clipPath10251">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_-7"
+         overflow="visible"
+         id="use10253" />
+    </clipPath>
+    <clipPath
+       id="clipPath10255">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_-7"
+         overflow="visible"
+         id="use10257" />
+    </clipPath>
+    <clipPath
+       id="clipPath10259">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_-7"
+         overflow="visible"
+         id="use10261" />
+    </clipPath>
+    <clipPath
+       id="clipPath10263">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_-7"
+         overflow="visible"
+         id="use10265" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765-41" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4750_-6"
+         overflow="visible"
+         id="use83762-4" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_-33"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557-25" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_-50">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4720_-7"
+         overflow="visible"
+         id="use83552-66" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_-5"
+         overflow="visible"
+         id="use83532-81" />
+    </clipPath>
+    <clipPath
+       id="clipPath10279">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_-5"
+         overflow="visible"
+         id="use10281" />
+    </clipPath>
+    <clipPath
+       id="clipPath10283">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_-5"
+         overflow="visible"
+         id="use10285" />
+    </clipPath>
+    <clipPath
+       id="clipPath10287">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_-5"
+         overflow="visible"
+         id="use10289" />
+    </clipPath>
+    <clipPath
+       id="clipPath10291">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_-5"
+         overflow="visible"
+         id="use10293" />
+    </clipPath>
+    <clipPath
+       id="clipPath10295">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_-5"
+         overflow="visible"
+         id="use10297" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_-52"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4715_-7"
+         overflow="visible"
+         id="use83517-8" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_-2"
+         overflow="visible"
+         id="use83497-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath10306">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_-2"
+         overflow="visible"
+         id="use10308" />
+    </clipPath>
+    <clipPath
+       id="clipPath10310">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_-2"
+         overflow="visible"
+         id="use10312" />
+    </clipPath>
+    <clipPath
+       id="clipPath10314">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_-2"
+         overflow="visible"
+         id="use10316" />
+    </clipPath>
+    <clipPath
+       id="clipPath10318">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_-2"
+         overflow="visible"
+         id="use10320" />
+    </clipPath>
+    <clipPath
+       id="clipPath10322">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_-2"
+         overflow="visible"
+         id="use10324" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4710_-7"
+         overflow="visible"
+         id="use83482-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_-8"
+         overflow="visible"
+         id="use83462-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath10333">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_-8"
+         overflow="visible"
+         id="use10335" />
+    </clipPath>
+    <clipPath
+       id="clipPath10337">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_-8"
+         overflow="visible"
+         id="use10339" />
+    </clipPath>
+    <clipPath
+       id="clipPath10341">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_-8"
+         overflow="visible"
+         id="use10343" />
+    </clipPath>
+    <clipPath
+       id="clipPath10345">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_-8"
+         overflow="visible"
+         id="use10347" />
+    </clipPath>
+    <clipPath
+       id="clipPath10349">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_-8"
+         overflow="visible"
+         id="use10351" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_-25">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4705_-7"
+         overflow="visible"
+         id="use83447-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_-5"
+         overflow="visible"
+         id="use83427-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath10360">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_-5"
+         overflow="visible"
+         id="use10362" />
+    </clipPath>
+    <clipPath
+       id="clipPath10364">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_-5"
+         overflow="visible"
+         id="use10366" />
+    </clipPath>
+    <clipPath
+       id="clipPath10368">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_-5"
+         overflow="visible"
+         id="use10370" />
+    </clipPath>
+    <clipPath
+       id="clipPath10372">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_-5"
+         overflow="visible"
+         id="use10374" />
+    </clipPath>
+    <clipPath
+       id="clipPath10376">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_-5"
+         overflow="visible"
+         id="use10378" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4700_-3"
+         overflow="visible"
+         id="use83412-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_-07">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_-1"
+         overflow="visible"
+         id="use83392-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath10387">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_-1"
+         overflow="visible"
+         id="use10389" />
+    </clipPath>
+    <clipPath
+       id="clipPath10391">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_-1"
+         overflow="visible"
+         id="use10393" />
+    </clipPath>
+    <clipPath
+       id="clipPath10395">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_-1"
+         overflow="visible"
+         id="use10397" />
+    </clipPath>
+    <clipPath
+       id="clipPath10399">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_-1"
+         overflow="visible"
+         id="use10401" />
+    </clipPath>
+    <clipPath
+       id="clipPath10403">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_-1"
+         overflow="visible"
+         id="use10405" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4695_-3"
+         overflow="visible"
+         id="use83377-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_-2"
+         overflow="visible"
+         id="use83357-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath10414">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_-2"
+         overflow="visible"
+         id="use10416" />
+    </clipPath>
+    <clipPath
+       id="clipPath10418">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_-2"
+         overflow="visible"
+         id="use10420" />
+    </clipPath>
+    <clipPath
+       id="clipPath10422">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_-2"
+         overflow="visible"
+         id="use10424" />
+    </clipPath>
+    <clipPath
+       id="clipPath10426">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_-2"
+         overflow="visible"
+         id="use10428" />
+    </clipPath>
+    <clipPath
+       id="clipPath10430">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_-2"
+         overflow="visible"
+         id="use10432" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347-37" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4690_-8"
+         overflow="visible"
+         id="use83342-0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4655_-6"
+         overflow="visible"
+         id="use83097-44" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_-9"
+         overflow="visible"
+         id="use83077-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath10446">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_-9"
+         overflow="visible"
+         id="use10448" />
+    </clipPath>
+    <clipPath
+       id="clipPath10450">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_-9"
+         overflow="visible"
+         id="use10452" />
+    </clipPath>
+    <clipPath
+       id="clipPath10454">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_-9"
+         overflow="visible"
+         id="use10456" />
+    </clipPath>
+    <clipPath
+       id="clipPath10458">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_-9"
+         overflow="visible"
+         id="use10460" />
+    </clipPath>
+    <clipPath
+       id="clipPath10462">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_-9"
+         overflow="visible"
+         id="use10464" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4650_-3"
+         overflow="visible"
+         id="use83062-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_-2"
+         overflow="visible"
+         id="use83042-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath10473">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_-2"
+         overflow="visible"
+         id="use10475" />
+    </clipPath>
+    <clipPath
+       id="clipPath10477">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_-2"
+         overflow="visible"
+         id="use10479" />
+    </clipPath>
+    <clipPath
+       id="clipPath10481">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_-2"
+         overflow="visible"
+         id="use10483" />
+    </clipPath>
+    <clipPath
+       id="clipPath10485">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_-2"
+         overflow="visible"
+         id="use10487" />
+    </clipPath>
+    <clipPath
+       id="clipPath10489">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_-2"
+         overflow="visible"
+         id="use10491" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_-87">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4645_-7"
+         overflow="visible"
+         id="use83027-49" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_-8"
+         overflow="visible"
+         id="use83007-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath10500">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_-8"
+         overflow="visible"
+         id="use10502" />
+    </clipPath>
+    <clipPath
+       id="clipPath10504">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_-8"
+         overflow="visible"
+         id="use10506" />
+    </clipPath>
+    <clipPath
+       id="clipPath10508">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_-8"
+         overflow="visible"
+         id="use10510" />
+    </clipPath>
+    <clipPath
+       id="clipPath10512">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_-8"
+         overflow="visible"
+         id="use10514" />
+    </clipPath>
+    <clipPath
+       id="clipPath10516">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_-8"
+         overflow="visible"
+         id="use10518" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4640_-2"
+         overflow="visible"
+         id="use82992-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_-45">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_-3"
+         overflow="visible"
+         id="use82972-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath10527">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_-3"
+         overflow="visible"
+         id="use10529" />
+    </clipPath>
+    <clipPath
+       id="clipPath10531">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_-3"
+         overflow="visible"
+         id="use10533" />
+    </clipPath>
+    <clipPath
+       id="clipPath10535">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_-3"
+         overflow="visible"
+         id="use10537" />
+    </clipPath>
+    <clipPath
+       id="clipPath10539">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_-3"
+         overflow="visible"
+         id="use10541" />
+    </clipPath>
+    <clipPath
+       id="clipPath10543">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_-3"
+         overflow="visible"
+         id="use10545" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960-54" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4635_-5"
+         overflow="visible"
+         id="use82957-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_-6"
+         overflow="visible"
+         id="use82937-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath10554">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_-6"
+         overflow="visible"
+         id="use10556" />
+    </clipPath>
+    <clipPath
+       id="clipPath10558">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_-6"
+         overflow="visible"
+         id="use10560" />
+    </clipPath>
+    <clipPath
+       id="clipPath10562">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_-6"
+         overflow="visible"
+         id="use10564" />
+    </clipPath>
+    <clipPath
+       id="clipPath10566">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_-6"
+         overflow="visible"
+         id="use10568" />
+    </clipPath>
+    <clipPath
+       id="clipPath10570">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_-6"
+         overflow="visible"
+         id="use10572" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4630_-9"
+         overflow="visible"
+         id="use82922-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_-3"
+         overflow="visible"
+         id="use82902-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath10581">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_-3"
+         overflow="visible"
+         id="use10583" />
+    </clipPath>
+    <clipPath
+       id="clipPath10585">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_-3"
+         overflow="visible"
+         id="use10587" />
+    </clipPath>
+    <clipPath
+       id="clipPath10589">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_-3"
+         overflow="visible"
+         id="use10591" />
+    </clipPath>
+    <clipPath
+       id="clipPath10593">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_-3"
+         overflow="visible"
+         id="use10595" />
+    </clipPath>
+    <clipPath
+       id="clipPath10597">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_-3"
+         overflow="visible"
+         id="use10599" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892-95" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_-3">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82887-94"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647-71" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4590_-7"
+         overflow="visible"
+         id="use82642-05" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_-2"
+         overflow="visible"
+         id="use82622-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath10613">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_-2"
+         overflow="visible"
+         id="use10615" />
+    </clipPath>
+    <clipPath
+       id="clipPath10617">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_-2"
+         overflow="visible"
+         id="use10619" />
+    </clipPath>
+    <clipPath
+       id="clipPath10621">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_-2"
+         overflow="visible"
+         id="use10623" />
+    </clipPath>
+    <clipPath
+       id="clipPath10625">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_-2"
+         overflow="visible"
+         id="use10627" />
+    </clipPath>
+    <clipPath
+       id="clipPath10629">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_-2"
+         overflow="visible"
+         id="use10631" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610-2" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_-03">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4585_-8"
+         overflow="visible"
+         id="use82607-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_-4"
+         overflow="visible"
+         id="use82587-10" />
+    </clipPath>
+    <clipPath
+       id="clipPath10640">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_-4"
+         overflow="visible"
+         id="use10642" />
+    </clipPath>
+    <clipPath
+       id="clipPath10644">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_-4"
+         overflow="visible"
+         id="use10646" />
+    </clipPath>
+    <clipPath
+       id="clipPath10648">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_-4"
+         overflow="visible"
+         id="use10650" />
+    </clipPath>
+    <clipPath
+       id="clipPath10652">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_-4"
+         overflow="visible"
+         id="use10654" />
+    </clipPath>
+    <clipPath
+       id="clipPath10656">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_-4"
+         overflow="visible"
+         id="use10658" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4580_-5"
+         overflow="visible"
+         id="use82572-40" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_-9"
+         overflow="visible"
+         id="use82552-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath10667">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_-9"
+         overflow="visible"
+         id="use10669" />
+    </clipPath>
+    <clipPath
+       id="clipPath10671">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_-9"
+         overflow="visible"
+         id="use10673" />
+    </clipPath>
+    <clipPath
+       id="clipPath10675">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_-9"
+         overflow="visible"
+         id="use10677" />
+    </clipPath>
+    <clipPath
+       id="clipPath10679">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_-9"
+         overflow="visible"
+         id="use10681" />
+    </clipPath>
+    <clipPath
+       id="clipPath10683">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_-9"
+         overflow="visible"
+         id="use10685" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_-27"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4575_-2"
+         overflow="visible"
+         id="use82537-22" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_-4"
+         overflow="visible"
+         id="use82517-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath10694">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_-4"
+         overflow="visible"
+         id="use10696" />
+    </clipPath>
+    <clipPath
+       id="clipPath10698">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_-4"
+         overflow="visible"
+         id="use10700" />
+    </clipPath>
+    <clipPath
+       id="clipPath10702">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_-4"
+         overflow="visible"
+         id="use10704" />
+    </clipPath>
+    <clipPath
+       id="clipPath10706">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_-4"
+         overflow="visible"
+         id="use10708" />
+    </clipPath>
+    <clipPath
+       id="clipPath10710">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_-4"
+         overflow="visible"
+         id="use10712" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_-41"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4570_-9"
+         overflow="visible"
+         id="use82502-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use82482-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath10721">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use10723" />
+    </clipPath>
+    <clipPath
+       id="clipPath10725">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use10727" />
+    </clipPath>
+    <clipPath
+       id="clipPath10729">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use10731" />
+    </clipPath>
+    <clipPath
+       id="clipPath10733">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use10735" />
+    </clipPath>
+    <clipPath
+       id="clipPath10737">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use10739" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4565_-3"
+         overflow="visible"
+         id="use82467-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-73">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath10748">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use10750" />
+    </clipPath>
+    <clipPath
+       id="clipPath10752">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use10754" />
+    </clipPath>
+    <clipPath
+       id="clipPath10756">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use10758" />
+    </clipPath>
+    <clipPath
+       id="clipPath10760">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use10762" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4555_-7"
+         overflow="visible"
+         id="use82397-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4551_-7"
+         overflow="visible"
+         id="use82359-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath10771">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4551_-7"
+         overflow="visible"
+         id="use10773" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-50">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-7"
+         overflow="visible"
+         id="use82345-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath10777">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-7"
+         overflow="visible"
+         id="use10779" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319-3" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321-8" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323-7" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325-9" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327-2" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329-0" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331-0" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4546_-1"
+         overflow="visible"
+         id="use82316-1" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290-7" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292-4" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294-4" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296-50" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298-8" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300-4" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302-5" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304-53" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_-16">
+      <polygon
+         points="-571.554,267.32 -571.547,253.133 -593.085,258.293 -613.901,253.224 -613.908,267.353 "
+         id="use82287-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4524_-5"
+         overflow="visible"
+         id="use82164-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4526_-7"
+         overflow="visible"
+         id="use82174-5" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185-1" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187-47" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4528_-0"
+         overflow="visible"
+         id="use82182-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath10812">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4526_-7"
+         overflow="visible"
+         id="use10814" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4531_-4"
+         overflow="visible"
+         id="use82197-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath10818">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4524_-5"
+         overflow="visible"
+         id="use10820" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_-49">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4533_-1"
+         overflow="visible"
+         id="use82209-0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220-2" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4535_-5"
+         overflow="visible"
+         id="use82217-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath10829">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4533_-1"
+         overflow="visible"
+         id="use10831" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4538_-7"
+         overflow="visible"
+         id="use82232-1" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-0-0"
+       id="linearGradient9382-1"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(197.19124,64.89703)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2-0-0"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7-1-6" />
+    </linearGradient>
+    <linearGradient
+       id="SVGID_4757_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_-3">
+      <path
+         d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83797-44"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83777-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath14916">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14918" />
+    </clipPath>
+    <clipPath
+       id="clipPath14920">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14922" />
+    </clipPath>
+    <clipPath
+       id="clipPath14924">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14926" />
+    </clipPath>
+    <clipPath
+       id="clipPath14928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14930" />
+    </clipPath>
+    <clipPath
+       id="clipPath14932">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14934" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_-5">
+      <path
+         d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83762-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_-0">
+      <path
+         d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83377-5"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_-29">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83357-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath14948">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14950" />
+    </clipPath>
+    <clipPath
+       id="clipPath14952">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14954" />
+    </clipPath>
+    <clipPath
+       id="clipPath14956">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14958" />
+    </clipPath>
+    <clipPath
+       id="clipPath14960">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14962" />
+    </clipPath>
+    <clipPath
+       id="clipPath14964">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14966" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347-07" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_-6">
+      <path
+         d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83342-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_-16">
+      <path
+         d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82922-1"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_-99">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82902-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath14980">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14982" />
+    </clipPath>
+    <clipPath
+       id="clipPath14984">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14986" />
+    </clipPath>
+    <clipPath
+       id="clipPath14988">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14990" />
+    </clipPath>
+    <clipPath
+       id="clipPath14992">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14994" />
+    </clipPath>
+    <clipPath
+       id="clipPath14996">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use14998" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892-90" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_-69">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82887-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       y2="-148.46021"
+       x2="256.37631"
+       y1="-148.46021"
+       x1="255.37621"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient15092"
+       xlink:href="#SVGID_4627_-3"
+       inkscape:collect="always" />
+    <clipPath
+       id="SVGID_4564_-7-9-3-4-4-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6-0-9-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3-43-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6-01-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-8-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-9-3" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_-8-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010-1-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012-3-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_-1-6">
+      <path
+         d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84007-57-5"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_-33-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555-7-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557-25-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_-50-0">
+      <path
+         d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83552-66-1"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_-5-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-0-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-0-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-5-8">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83097-44-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-3-3-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-2-3-9" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_-8-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-5-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-1-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-9-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4555_-7-9"
+         overflow="visible"
+         id="use82397-7-5" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4557_-8-1"
+       id="linearGradient15887"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4557_-8-1-0"
+       id="linearGradient15887-0"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021" />
+    <linearGradient
+       id="SVGID_4557_-8-1-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-5-0-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-1-3-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-9-2-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4555_-7-9-1"
+         overflow="visible"
+         id="use82397-7-5-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-3-3-7-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-2-3-9-1" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#SVGID_4557_-8-1-0-3"
+       id="linearGradient15887-0-3"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021" />
+    <linearGradient
+       id="SVGID_4557_-8-1-0-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-5-0-3-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-1-3-5-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-9-2-5-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4555_-7-9-1-0"
+         overflow="visible"
+         id="use82397-7-5-6-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-3-3-7-5-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-2-3-9-1-0" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.93303299"
+     inkscape:cx="321.56814"
+     inkscape:cy="515.95091"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1535"
+     inkscape:window-height="876"
+     inkscape:window-x="65"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata104541">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <rect
+       style="fill:none;stroke:#5e6a71;stroke-width:0.48500001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect125410-1-2-7"
+       width="94.101288"
+       height="87.10128"
+       x="316.64056"
+       y="418.58807" />
+    <rect
+       style="fill:url(#linearGradient9382-1);fill-opacity:1;stroke:none"
+       id="rect126198-3-8-1"
+       width="108"
+       height="27"
+       x="308.19122"
+       y="494.25922" />
+    <line
+       style="fill:none;stroke:#5e6a71;stroke-width:1.0268178;stroke-miterlimit:10;stroke-dasharray:3.07565499, 3.07565499"
+       stroke-miterlimit="10"
+       x1="277.38089"
+       y1="315.69797"
+       x2="277.38089"
+       y2="533.44318"
+       id="line84244" />
+    <rect
+       style="fill:url(#linearGradient9382);fill-opacity:1;stroke:none"
+       id="rect126198-3-8"
+       width="108"
+       height="27"
+       x="139.50002"
+       y="494.28964" />
+    <g
+       transform="matrix(1.3542118,0,0,2.25,996.72494,-25.560183)"
+       id="g82158"
+       inkscape:transform-center-x="262.3321"
+       inkscape:transform-center-y="50.765304">
+      <defs
+         id="defs82160">
+        <rect
+           id="SVGID_4524_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101582">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4524_"
+           overflow="visible"
+           id="use101584" />
+      </clipPath>
+      <g
+         clip-path="url(#SVGID_4525_)"
+         id="g82166">
+        <g
+           id="g82168">
+          <defs
+             id="defs82170">
+            <rect
+               id="SVGID_4526_"
+               x="-679.67902"
+               y="293.259"
+               width="175.168"
+               height="64.251999" />
+          </defs>
+          <clipPath
+             id="clipPath101590">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4526_"
+               overflow="visible"
+               id="use101592" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4527_)"
+             id="g82176">
+            <defs
+               id="defs82178">
+              <rect
+                 id="SVGID_4528_"
+                 x="-679.57202"
+                 y="293.367"
+                 width="174.953"
+                 height="64.037003" />
+            </defs>
+            <clipPath
+               id="clipPath101597">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4528_"
+                 overflow="visible"
+                 id="use101599" />
+            </clipPath>
+            <linearGradient
+               id="linearGradient101601"
+               gradientUnits="userSpaceOnUse"
+               x1="126.8011"
+               y1="60.902401"
+               x2="127.8011"
+               y2="60.902401"
+               gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+              <stop
+                 offset="0"
+                 style="stop-color:#E6E8E7"
+                 id="stop101603" />
+              <stop
+                 offset="1"
+                 style="stop-color:#FFFFFF"
+                 id="stop101605" />
+            </linearGradient>
+            <rect
+               style="fill:url(#SVGID_4530_)"
+               x="-679.57202"
+               y="293.366"
+               clip-path="url(#SVGID_4529_)"
+               width="174.953"
+               height="64.038002"
+               id="rect82189" />
+          </g>
+          <g
+             clip-path="url(#SVGID_4527_)"
+             id="g82191">
+            <defs
+               id="defs82193">
+              <rect
+                 id="SVGID_4531_"
+                 x="-679.67902"
+                 y="293.259"
+                 width="175.168"
+                 height="64.251999" />
+            </defs>
+            <clipPath
+               id="clipPath101611">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4531_"
+                 overflow="visible"
+                 id="use101613" />
+            </clipPath>
+            <rect
+               style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10"
+               x="-679.57202"
+               y="293.366"
+               clip-path="url(#SVGID_4532_)"
+               stroke-miterlimit="10"
+               width="174.953"
+               height="64.038002"
+               id="rect82199" />
+          </g>
+        </g>
+      </g>
+      <g
+         clip-path="url(#SVGID_4525_)"
+         id="g82201">
+        <g
+           id="g82203">
+          <defs
+             id="defs82205">
+            <rect
+               id="SVGID_4533_"
+               x="-441.56699"
+               y="293.259"
+               width="45.873001"
+               height="64.251999" />
+          </defs>
+          <clipPath
+             id="clipPath101620">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4533_"
+               overflow="visible"
+               id="use101622" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4534_)"
+             id="g82211">
+            <defs
+               id="defs82213">
+              <rect
+                 id="SVGID_4535_"
+                 x="-441.45999"
+                 y="293.367"
+                 width="45.659"
+                 height="64.037003" />
+            </defs>
+            <clipPath
+               id="clipPath101627">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4535_"
+                 overflow="visible"
+                 id="use101629" />
+            </clipPath>
+            <linearGradient
+               id="linearGradient101631"
+               gradientUnits="userSpaceOnUse"
+               x1="126.8011"
+               y1="60.902401"
+               x2="127.8011"
+               y2="60.902401"
+               gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+              <stop
+                 offset="0"
+                 style="stop-color:#E6E8E7"
+                 id="stop101633" />
+              <stop
+                 offset="1"
+                 style="stop-color:#FFFFFF"
+                 id="stop101635" />
+            </linearGradient>
+            <rect
+               style="fill:url(#SVGID_4537_)"
+               x="-441.45999"
+               y="293.366"
+               clip-path="url(#SVGID_4536_)"
+               width="45.659"
+               height="64.038002"
+               id="rect82224" />
+          </g>
+          <g
+             clip-path="url(#SVGID_4534_)"
+             id="g82226">
+            <defs
+               id="defs82228">
+              <rect
+                 id="SVGID_4538_"
+                 x="-441.56699"
+                 y="293.259"
+                 width="45.873001"
+                 height="64.251999" />
+            </defs>
+            <clipPath
+               id="clipPath101641">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4538_"
+                 overflow="visible"
+                 id="use101643" />
+            </clipPath>
+            <rect
+               style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10"
+               x="-441.45999"
+               y="293.366"
+               clip-path="url(#SVGID_4539_)"
+               stroke-miterlimit="10"
+               width="45.659"
+               height="64.038002"
+               id="rect82234" />
+          </g>
+        </g>
+      </g>
+    </g>
+    <rect
+       style="fill:#f15d57"
+       x="224.23932"
+       y="574.69031"
+       width="95.793755"
+       height="3.0712502"
+       id="rect82238"
+       inkscape:transform-center-x="437.28349"
+       inkscape:transform-center-y="-79.564828" />
+    <line
+       style="fill:none;stroke:#5e6a71;stroke-width:0.48150003;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
+       stroke-miterlimit="10"
+       x1="272.20041"
+       y1="577.34521"
+       x2="272.20041"
+       y2="631.72772"
+       id="line82244"
+       inkscape:transform-center-x="437.21928"
+       inkscape:transform-center-y="-51.254289" />
+    <polyline
+       style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       stroke-miterlimit="10"
+       points="  -603.212,292.128 -603.212,283.832 -582.187,283.832 -582.187,292.128 "
+       id="polyline82246"
+       inkscape:transform-center-x="437.22048"
+       inkscape:transform-center-y="-33.395941" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82281"
+       inkscape:transform-center-x="437.2835"
+       inkscape:transform-center-y="-95.804196">
+      <defs
+         id="defs82283">
+        <polygon
+           id="SVGID_4543_"
+           points="-613.901,253.224 -613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 " />
+      </defs>
+      <clipPath
+         id="clipPath101684">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4543_"
+           overflow="visible"
+           id="use101686" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101688"
+         gradientUnits="userSpaceOnUse"
+         x1="76.3899"
+         y1="97.785698"
+         x2="77.3899"
+         y2="97.785698"
+         gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101690" />
+        <stop
+           offset="0.0507"
+           style="stop-color:#68B4BF"
+           id="stop101692" />
+        <stop
+           offset="0.2116"
+           style="stop-color:#96C6CF"
+           id="stop101694" />
+        <stop
+           offset="0.3736"
+           style="stop-color:#BAD8DD"
+           id="stop101696" />
+        <stop
+           offset="0.5342"
+           style="stop-color:#D7E6EA"
+           id="stop101698" />
+        <stop
+           offset="0.693"
+           style="stop-color:#EBF2F3"
+           id="stop101700" />
+        <stop
+           offset="0.8492"
+           style="stop-color:#F8FBFB"
+           id="stop101702" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop101704" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4545_)"
+         x="-613.90802"
+         y="253.133"
+         clip-path="url(#SVGID_4544_)"
+         width="42.361"
+         height="14.22"
+         id="rect82306" />
+    </g>
+    <text
+       y="567.99066"
+       x="255.24185"
+       id="text84246"
+       inkscape:transform-center-x="438.70839"
+       inkscape:transform-center-y="-90.601429"
+       style="font-size:27px">
+      <tspan
+         style="font-size:8px;fill:#37424b;font-family:ApexSans-Medium"
+         x="255.24185"
+         y="567.99066"
+         font-size="3.4203"
+         id="tspan84248">US-EAST</tspan>
+    </text>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 319.54934,544.29505 -0.0157,31.37625 -94.815,0.072 0.0157,-31.2435 46.48275,11.31975 0.1125,0.027 0.11475,-0.027 48.105,-11.5245 z m 0.4815,-0.60975 -48.699,11.66625 -47.079,-11.46375 -0.0135,32.337 95.77575,-0.0743 0.0158,-32.46525 z"
+       id="path82308"
+       inkscape:transform-center-x="437.28456"
+       inkscape:transform-center-y="-95.835733" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82339"
+       inkscape:transform-center-x="449.81598"
+       inkscape:transform-center-y="45.666809">
+      <defs
+         id="defs82341">
+        <rect
+           id="SVGID_4549_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101738">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4549_"
+           overflow="visible"
+           id="use101740" />
+      </clipPath>
+      <path
+         style="fill:#f15d57"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4550_)"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82347" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4550_)"
+         stroke-miterlimit="10"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82349" />
+    </g>
+    <text
+       y="704.88873"
+       x="275.14355"
+       style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+       font-size="4.3343"
+       id="text82351"
+       inkscape:transform-center-x="450.06672"
+       inkscape:transform-center-y="45.543285">M</text>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82353"
+       inkscape:transform-center-x="503.22873"
+       inkscape:transform-center-y="71.647559">
+      <defs
+         id="defs82355">
+        <rect
+           id="SVGID_4551_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101748">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4551_"
+           overflow="visible"
+           id="use101750" />
+      </clipPath>
+      <path
+         style="fill:#f15d57"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4552_)"
+         d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82361" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4552_)"
+         stroke-miterlimit="10"
+         d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82363" />
+    </g>
+    <text
+       y="730.87036"
+       x="201.73129"
+       style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+       font-size="4.3343"
+       id="text82365"
+       inkscape:transform-center-x="503.47899"
+       inkscape:transform-center-y="71.524915">M</text>
+    <rect
+       style="fill:#ffffff"
+       x="87.659889"
+       y="664.59583"
+       width="21.581999"
+       height="21.584251"
+       id="rect82381"
+       inkscape:transform-center-x="610.96881"
+       inkscape:transform-center-y="19.597191" />
+    <rect
+       style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10"
+       x="87.659889"
+       y="664.59583"
+       stroke-miterlimit="10"
+       width="21.581999"
+       height="21.584251"
+       id="rect82383"
+       inkscape:transform-center-x="610.96881"
+       inkscape:transform-center-y="19.597191" />
+    <rect
+       style="fill:#81d0db"
+       x="89.169548"
+       y="666.1123"
+       width="18.557999"
+       height="18.553501"
+       id="rect82385"
+       inkscape:transform-center-x="610.97115"
+       inkscape:transform-center-y="19.598295" />
+    <rect
+       style="fill:#ffffff"
+       x="90.654625"
+       y="667.59052"
+       width="15.592501"
+       height="15.594751"
+       id="rect82387"
+       inkscape:transform-center-x="610.96883"
+       inkscape:transform-center-y="19.597131" />
+    <rect
+       style="fill:#ffffff"
+       x="93.307411"
+       y="670.24774"
+       width="10.282501"
+       height="10.278"
+       id="rect82389"
+       inkscape:transform-center-x="610.97103"
+       inkscape:transform-center-y="19.595982" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82391"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82393">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4555_"
+           d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101773">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4555_"
+           overflow="visible"
+           id="use101775" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101777"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.46021"
+         x2="256.3761"
+         y2="-148.46021"
+         gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101779" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101781" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4557_)"
+         x="-672.61401"
+         y="308.841"
+         clip-path="url(#SVGID_4556_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82404" />
+    </g>
+    <rect
+       id="rect82451"
+       height="9.5930004"
+       width="9.592"
+       clip-path="url(#SVGID_4564_)"
+       y="306.73599"
+       x="-650.77399"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82453"
+       height="9.5930004"
+       width="9.592"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4564_)"
+       y="306.73599"
+       x="-650.77399"
+       style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82455"
+       height="8.2460003"
+       width="8.2480001"
+       clip-path="url(#SVGID_4564_)"
+       y="307.41"
+       x="-650.10303"
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82457"
+       height="6.9310002"
+       width="6.9299998"
+       clip-path="url(#SVGID_4564_)"
+       y="308.06699"
+       x="-649.44299"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82459"
+       height="4.5679998"
+       width="4.5700002"
+       clip-path="url(#SVGID_4564_)"
+       y="309.24799"
+       x="-648.26398"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82461"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82463">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4565_"
+           d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101827">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4565_"
+           overflow="visible"
+           id="use101829" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101831"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101833" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101835" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4567_)"
+         x="-648.67102"
+         y="308.841"
+         clip-path="url(#SVGID_4566_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82474" />
+    </g>
+    <path
+       id="path82484"
+       d="m -646.611,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4569_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82486"
+       height="9.5930004"
+       width="9.592"
+       clip-path="url(#SVGID_4569_)"
+       y="306.73599"
+       x="-638.80298"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82488"
+       height="9.5930004"
+       width="9.592"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4569_)"
+       y="306.73599"
+       x="-638.80298"
+       style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82490"
+       height="8.2460003"
+       width="8.2480001"
+       clip-path="url(#SVGID_4569_)"
+       y="307.41"
+       x="-638.13202"
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82492"
+       height="6.9310002"
+       width="6.9299998"
+       clip-path="url(#SVGID_4569_)"
+       y="308.06699"
+       x="-637.47198"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <rect
+       id="rect82494"
+       height="4.5679998"
+       width="4.5700002"
+       clip-path="url(#SVGID_4569_)"
+       y="309.24799"
+       x="-636.29199"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82496"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82498">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4570_"
+           d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101854">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4570_"
+           overflow="visible"
+           id="use101856" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101858"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.46001"
+         x2="256.3761"
+         y2="-148.46001"
+         gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101860" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101862" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4572_)"
+         x="-636.69897"
+         y="308.841"
+         clip-path="url(#SVGID_4571_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82509" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82511"
+       inkscape:transform-center-x="511.76858"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82513">
+        <rect
+           id="SVGID_4573_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101868">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4573_"
+           overflow="visible"
+           id="use101870" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4574_)"
+         d="m -634.639,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82519" />
+      <rect
+         style="fill:#ffffff"
+         x="-626.83099"
+         y="306.73599"
+         clip-path="url(#SVGID_4574_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82521" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-626.83099"
+         y="306.73599"
+         clip-path="url(#SVGID_4574_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82523" />
+      <rect
+         style="fill:#81d0db"
+         x="-626.15997"
+         y="307.41"
+         clip-path="url(#SVGID_4574_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82525" />
+      <rect
+         style="fill:#ffffff"
+         x="-625.5"
+         y="308.06699"
+         clip-path="url(#SVGID_4574_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82527" />
+      <rect
+         style="fill:#ffffff"
+         x="-624.32098"
+         y="309.24799"
+         clip-path="url(#SVGID_4574_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82529" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82531"
+       inkscape:transform-center-x="503.22762"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82533">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4575_"
+           d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101881">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4575_"
+           overflow="visible"
+           id="use101883" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101885"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101887" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101889" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4577_)"
+         x="-624.72803"
+         y="308.841"
+         clip-path="url(#SVGID_4576_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82544" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82546"
+       inkscape:transform-center-x="484.83387"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82548">
+        <rect
+           id="SVGID_4578_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101895">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4578_"
+           overflow="visible"
+           id="use101897" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4579_)"
+         d="m -622.668,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82554" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="306.73599"
+         clip-path="url(#SVGID_4579_)"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect82556" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="306.73599"
+         clip-path="url(#SVGID_4579_)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect82558" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="307.41"
+         clip-path="url(#SVGID_4579_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82560" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="308.06699"
+         clip-path="url(#SVGID_4579_)"
+         width="6.9310002"
+         height="6.9310002"
+         id="rect82562" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="309.24799"
+         clip-path="url(#SVGID_4579_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82564" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82566"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82568">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4580_"
+           d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101908">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4580_"
+           overflow="visible"
+           id="use101910" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101912"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101914" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101916" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4582_)"
+         x="-612.75598"
+         y="308.841"
+         clip-path="url(#SVGID_4581_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect82579" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82581"
+       inkscape:transform-center-x="457.89686"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82583">
+        <rect
+           id="SVGID_4583_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101922">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4583_"
+           overflow="visible"
+           id="use101924" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4584_)"
+         d="m -610.696,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82589" />
+      <rect
+         style="fill:#ffffff"
+         x="-602.888"
+         y="306.73599"
+         clip-path="url(#SVGID_4584_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82591" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-602.888"
+         y="306.73599"
+         clip-path="url(#SVGID_4584_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82593" />
+      <rect
+         style="fill:#81d0db"
+         x="-602.21698"
+         y="307.41"
+         clip-path="url(#SVGID_4584_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82595" />
+      <rect
+         style="fill:#ffffff"
+         x="-601.55701"
+         y="308.06699"
+         clip-path="url(#SVGID_4584_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82597" />
+      <rect
+         style="fill:#ffffff"
+         x="-600.37799"
+         y="309.24799"
+         clip-path="url(#SVGID_4584_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82599" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82601"
+       inkscape:transform-center-x="449.35694"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82603">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4585_"
+           d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101935">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4585_"
+           overflow="visible"
+           id="use101937" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101939"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.46021"
+         x2="256.3761"
+         y2="-148.46021"
+         gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101941" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101943" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4587_)"
+         x="-600.78497"
+         y="308.841"
+         clip-path="url(#SVGID_4586_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect82614" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82616"
+       inkscape:transform-center-x="430.96208"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82618">
+        <rect
+           id="SVGID_4588_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101949">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4588_"
+           overflow="visible"
+           id="use101951" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4589_)"
+         d="m -598.725,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82624" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="306.73599"
+         clip-path="url(#SVGID_4589_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82626" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="306.73599"
+         clip-path="url(#SVGID_4589_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82628" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="307.41"
+         clip-path="url(#SVGID_4589_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82630" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="308.06699"
+         clip-path="url(#SVGID_4589_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82632" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="309.24799"
+         clip-path="url(#SVGID_4589_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82634" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82636"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82638">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4590_"
+           d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101962">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4590_"
+           overflow="visible"
+           id="use101964" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101966"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101968" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101970" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4592_)"
+         x="-588.81299"
+         y="308.841"
+         clip-path="url(#SVGID_4591_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect82649" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82861"
+       inkscape:transform-center-x="440.81033"
+       inkscape:transform-center-y="37.558931">
+      <defs
+         id="defs82863">
+        <rect
+           id="SVGID_4623_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102138">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4623_"
+           overflow="visible"
+           id="use102140" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4624_)"
+         d="m -514.925,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82869" />
+      <rect
+         style="fill:#ffffff"
+         x="-674.71698"
+         y="318.323"
+         clip-path="url(#SVGID_4624_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82871" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-674.71698"
+         y="318.323"
+         clip-path="url(#SVGID_4624_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82873" />
+      <rect
+         style="fill:#81d0db"
+         x="-674.04602"
+         y="318.99701"
+         clip-path="url(#SVGID_4624_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82875" />
+      <rect
+         style="fill:#ffffff"
+         x="-673.38599"
+         y="319.65399"
+         clip-path="url(#SVGID_4624_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82877" />
+      <rect
+         style="fill:#ffffff"
+         x="-672.20697"
+         y="320.83499"
+         clip-path="url(#SVGID_4624_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82879" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82881"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82883">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4625_"
+           d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102151">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4625_"
+           overflow="visible"
+           id="use102153" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102155"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.46021"
+         x2="256.37631"
+         y2="-148.46021"
+         gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102157" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102159" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4627_)"
+         x="-672.61401"
+         y="320.42899"
+         clip-path="url(#SVGID_4626_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82894" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82896"
+       inkscape:transform-center-x="592.57619"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs82898">
+        <rect
+           id="SVGID_4628_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102165">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4628_"
+           overflow="visible"
+           id="use102167" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4629_)"
+         d="m -670.553,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82904" />
+      <rect
+         style="fill:#ffffff"
+         x="-662.745"
+         y="318.323"
+         clip-path="url(#SVGID_4629_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82906" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-662.74597"
+         y="318.323"
+         clip-path="url(#SVGID_4629_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82908" />
+      <rect
+         style="fill:#81d0db"
+         x="-662.07397"
+         y="318.99701"
+         clip-path="url(#SVGID_4629_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82910" />
+      <rect
+         style="fill:#ffffff"
+         x="-661.414"
+         y="319.65399"
+         clip-path="url(#SVGID_4629_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82912" />
+      <rect
+         style="fill:#ffffff"
+         x="-660.23499"
+         y="320.83499"
+         clip-path="url(#SVGID_4629_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82914" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82916"
+       inkscape:transform-center-x="584.03412"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82918">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4630_"
+           d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102178">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4630_"
+           overflow="visible"
+           id="use102180" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102182"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102184" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102186" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4632_)"
+         x="-660.64203"
+         y="320.42899"
+         clip-path="url(#SVGID_4631_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82929" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82931"
+       inkscape:transform-center-x="565.64033"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs82933">
+        <rect
+           id="SVGID_4633_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102192">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4633_"
+           overflow="visible"
+           id="use102194" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4634_)"
+         d="m -658.582,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82939" />
+      <rect
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="318.323"
+         clip-path="url(#SVGID_4634_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82941" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="318.323"
+         clip-path="url(#SVGID_4634_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82943" />
+      <rect
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="318.99701"
+         clip-path="url(#SVGID_4634_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82945" />
+      <rect
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="319.65399"
+         clip-path="url(#SVGID_4634_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82947" />
+      <rect
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="320.83499"
+         clip-path="url(#SVGID_4634_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82949" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82951"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82953">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4635_"
+           d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102205">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4635_"
+           overflow="visible"
+           id="use102207" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102209"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102211" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102213" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4637_)"
+         x="-648.67102"
+         y="320.42899"
+         clip-path="url(#SVGID_4636_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82964" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82966"
+       inkscape:transform-center-x="538.70558"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs82968">
+        <rect
+           id="SVGID_4638_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102219">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4638_"
+           overflow="visible"
+           id="use102221" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4639_)"
+         d="m -646.611,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82974" />
+      <rect
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="318.323"
+         clip-path="url(#SVGID_4639_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82976" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="318.323"
+         clip-path="url(#SVGID_4639_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82978" />
+      <rect
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="318.99701"
+         clip-path="url(#SVGID_4639_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82980" />
+      <rect
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="319.65399"
+         clip-path="url(#SVGID_4639_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82982" />
+      <rect
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="320.83499"
+         clip-path="url(#SVGID_4639_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82984" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82986"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82988">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4640_"
+           d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102232">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4640_"
+           overflow="visible"
+           id="use102234" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102236"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.46001"
+         x2="256.37631"
+         y2="-148.46001"
+         gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102238" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102240" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4642_)"
+         x="-636.69897"
+         y="320.42899"
+         clip-path="url(#SVGID_4641_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82999" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83001"
+       inkscape:transform-center-x="511.76858"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs83003">
+        <rect
+           id="SVGID_4643_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102246">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4643_"
+           overflow="visible"
+           id="use102248" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4644_)"
+         d="m -634.639,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83009" />
+      <rect
+         style="fill:#ffffff"
+         x="-626.83099"
+         y="318.323"
+         clip-path="url(#SVGID_4644_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect83011" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-626.83099"
+         y="318.323"
+         clip-path="url(#SVGID_4644_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect83013" />
+      <rect
+         style="fill:#81d0db"
+         x="-626.15997"
+         y="318.99701"
+         clip-path="url(#SVGID_4644_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect83015" />
+      <rect
+         style="fill:#ffffff"
+         x="-625.5"
+         y="319.65399"
+         clip-path="url(#SVGID_4644_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect83017" />
+      <rect
+         style="fill:#ffffff"
+         x="-624.32098"
+         y="320.83499"
+         clip-path="url(#SVGID_4644_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83019" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83021"
+       inkscape:transform-center-x="503.22762"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs83023">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4645_"
+           d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102259">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4645_"
+           overflow="visible"
+           id="use102261" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102263"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102265" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102267" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4647_)"
+         x="-624.72803"
+         y="320.42899"
+         clip-path="url(#SVGID_4646_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83034" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83036"
+       inkscape:transform-center-x="484.83387"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs83038">
+        <rect
+           id="SVGID_4648_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102273">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4648_"
+           overflow="visible"
+           id="use102275" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4649_)"
+         d="m -622.668,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83044" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="318.323"
+         clip-path="url(#SVGID_4649_)"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect83046" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="318.323"
+         clip-path="url(#SVGID_4649_)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect83048" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="318.99701"
+         clip-path="url(#SVGID_4649_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect83050" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="319.65399"
+         clip-path="url(#SVGID_4649_)"
+         width="6.9310002"
+         height="6.9310002"
+         id="rect83052" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="320.83499"
+         clip-path="url(#SVGID_4649_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83054" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83056"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs83058">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4650_"
+           d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102286">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4650_"
+           overflow="visible"
+           id="use102288" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102290"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102292" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102294" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4652_)"
+         x="-612.75598"
+         y="320.42899"
+         clip-path="url(#SVGID_4651_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83069" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83071"
+       inkscape:transform-center-x="444.42945"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs83073">
+        <rect
+           id="SVGID_4653_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102300">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4653_"
+           overflow="visible"
+           id="use102302" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4654_)"
+         d="m -610.696,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83079" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="318.323"
+         clip-path="url(#SVGID_4654_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect83081" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="318.323"
+         clip-path="url(#SVGID_4654_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect83083" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="318.99701"
+         clip-path="url(#SVGID_4654_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect83085" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="319.65399"
+         clip-path="url(#SVGID_4654_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect83087" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="320.83499"
+         clip-path="url(#SVGID_4654_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83089" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83091"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs83093">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4655_"
+           d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102313">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4655_"
+           overflow="visible"
+           id="use102315" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102317"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102319" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102321" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4657_)"
+         x="-588.81299"
+         y="320.42899"
+         clip-path="url(#SVGID_4656_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83104" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83316"
+       inkscape:transform-center-x="440.81033"
+       inkscape:transform-center-y="63.583551">
+      <defs
+         id="defs83318">
+        <rect
+           id="SVGID_4688_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102489">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4688_"
+           overflow="visible"
+           id="use102491" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4689_)"
+         d="m -514.925,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83324" />
+      <rect
+         style="fill:#ffffff"
+         x="-674.71698"
+         y="329.87"
+         clip-path="url(#SVGID_4689_)"
+         width="9.592"
+         height="9.592"
+         id="rect83326" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-674.71698"
+         y="329.87"
+         clip-path="url(#SVGID_4689_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83328" />
+      <rect
+         style="fill:#81d0db"
+         x="-674.04602"
+         y="330.543"
+         clip-path="url(#SVGID_4689_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83330" />
+      <rect
+         style="fill:#ffffff"
+         x="-673.38599"
+         y="331.20099"
+         clip-path="url(#SVGID_4689_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83332" />
+      <rect
+         style="fill:#ffffff"
+         x="-672.20697"
+         y="332.38199"
+         clip-path="url(#SVGID_4689_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83334" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83336"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83338">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4690_"
+           d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102502">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4690_"
+           overflow="visible"
+           id="use102504" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102506"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3544"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102508" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102510" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4692_)"
+         x="-672.61401"
+         y="331.974"
+         clip-path="url(#SVGID_4691_)"
+         width="5.3839998"
+         height="5.3860002"
+         id="rect83349" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83351"
+       inkscape:transform-center-x="592.57619"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83353">
+        <rect
+           id="SVGID_4693_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102516">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4693_"
+           overflow="visible"
+           id="use102518" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4694_)"
+         d="m -670.553,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83359" />
+      <rect
+         style="fill:#ffffff"
+         x="-662.745"
+         y="329.87"
+         clip-path="url(#SVGID_4694_)"
+         width="9.592"
+         height="9.592"
+         id="rect83361" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-662.74597"
+         y="329.87"
+         clip-path="url(#SVGID_4694_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83363" />
+      <rect
+         style="fill:#81d0db"
+         x="-662.07397"
+         y="330.543"
+         clip-path="url(#SVGID_4694_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83365" />
+      <rect
+         style="fill:#ffffff"
+         x="-661.414"
+         y="331.20099"
+         clip-path="url(#SVGID_4694_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83367" />
+      <rect
+         style="fill:#ffffff"
+         x="-660.23499"
+         y="332.38199"
+         clip-path="url(#SVGID_4694_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83369" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83371"
+       inkscape:transform-center-x="584.03412"
+       inkscape:transform-center-y="71.648681">
+      <defs
+         id="defs83373">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4695_"
+           d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102529">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4695_"
+           overflow="visible"
+           id="use102531" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102533"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.35419"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102535" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102537" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4697_)"
+         x="-660.64203"
+         y="331.974"
+         clip-path="url(#SVGID_4696_)"
+         width="5.3839998"
+         height="5.3850002"
+         id="rect83384" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83386"
+       inkscape:transform-center-x="565.64033"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83388">
+        <rect
+           id="SVGID_4698_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102543">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4698_"
+           overflow="visible"
+           id="use102545" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4699_)"
+         d="m -658.582,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83394" />
+      <rect
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="329.87"
+         clip-path="url(#SVGID_4699_)"
+         width="9.592"
+         height="9.592"
+         id="rect83396" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="329.87"
+         clip-path="url(#SVGID_4699_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83398" />
+      <rect
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="330.543"
+         clip-path="url(#SVGID_4699_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83400" />
+      <rect
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="331.20099"
+         clip-path="url(#SVGID_4699_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83402" />
+      <rect
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="332.38199"
+         clip-path="url(#SVGID_4699_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83404" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83406"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83408">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4700_"
+           d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102556">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4700_"
+           overflow="visible"
+           id="use102558" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102560"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3544"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102562" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102564" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4702_)"
+         x="-648.67102"
+         y="331.974"
+         clip-path="url(#SVGID_4701_)"
+         width="5.3839998"
+         height="5.3860002"
+         id="rect83419" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83421"
+       inkscape:transform-center-x="538.70558"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83423">
+        <rect
+           id="SVGID_4703_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102570">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4703_"
+           overflow="visible"
+           id="use102572" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4704_)"
+         d="m -646.611,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83429" />
+      <rect
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="329.87"
+         clip-path="url(#SVGID_4704_)"
+         width="9.592"
+         height="9.592"
+         id="rect83431" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="329.87"
+         clip-path="url(#SVGID_4704_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83433" />
+      <rect
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="330.543"
+         clip-path="url(#SVGID_4704_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83435" />
+      <rect
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="331.20099"
+         clip-path="url(#SVGID_4704_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83437" />
+      <rect
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="332.38199"
+         clip-path="url(#SVGID_4704_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83439" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83441"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83443">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4705_"
+           d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102583">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4705_"
+           overflow="visible"
+           id="use102585" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102587"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.3544"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102589" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102591" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4707_)"
+         x="-636.69897"
+         y="331.974"
+         clip-path="url(#SVGID_4706_)"
+         width="5.3839998"
+         height="5.3860002"
+         id="rect83454" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83456"
+       inkscape:transform-center-x="498.30125"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83458">
+        <rect
+           id="SVGID_4708_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102597">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4708_"
+           overflow="visible"
+           id="use102599" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4709_)"
+         d="m -634.639,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83464" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="329.87"
+         clip-path="url(#SVGID_4709_)"
+         width="9.5930004"
+         height="9.592"
+         id="rect83466" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="329.87"
+         clip-path="url(#SVGID_4709_)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.592"
+         id="rect83468" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="330.543"
+         clip-path="url(#SVGID_4709_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83470" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="331.20099"
+         clip-path="url(#SVGID_4709_)"
+         width="6.9310002"
+         height="6.9299998"
+         id="rect83472" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="332.38199"
+         clip-path="url(#SVGID_4709_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83474" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83476"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83478">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4710_"
+           d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102610">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4710_"
+           overflow="visible"
+           id="use102612" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102614"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3544"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102616" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102618" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4712_)"
+         x="-612.75598"
+         y="331.974"
+         clip-path="url(#SVGID_4711_)"
+         width="5.3829999"
+         height="5.3860002"
+         id="rect83489" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83491"
+       inkscape:transform-center-x="457.89686"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83493">
+        <rect
+           id="SVGID_4713_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102624">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4713_"
+           overflow="visible"
+           id="use102626" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4714_)"
+         d="m -610.696,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83499" />
+      <rect
+         style="fill:#ffffff"
+         x="-602.888"
+         y="329.87"
+         clip-path="url(#SVGID_4714_)"
+         width="9.592"
+         height="9.592"
+         id="rect83501" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-602.888"
+         y="329.87"
+         clip-path="url(#SVGID_4714_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83503" />
+      <rect
+         style="fill:#81d0db"
+         x="-602.21698"
+         y="330.543"
+         clip-path="url(#SVGID_4714_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83505" />
+      <rect
+         style="fill:#ffffff"
+         x="-601.55701"
+         y="331.20099"
+         clip-path="url(#SVGID_4714_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83507" />
+      <rect
+         style="fill:#ffffff"
+         x="-600.37799"
+         y="332.38199"
+         clip-path="url(#SVGID_4714_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83509" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83511"
+       inkscape:transform-center-x="449.35694"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83513">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4715_"
+           d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102637">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4715_"
+           overflow="visible"
+           id="use102639" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102641"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3544"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102643" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102645" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4717_)"
+         x="-600.78497"
+         y="331.974"
+         clip-path="url(#SVGID_4716_)"
+         width="5.3829999"
+         height="5.3860002"
+         id="rect83524" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83526"
+       inkscape:transform-center-x="430.96208"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83528">
+        <rect
+           id="SVGID_4718_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102651">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4718_"
+           overflow="visible"
+           id="use102653" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4719_)"
+         d="m -598.725,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83534" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="329.87"
+         clip-path="url(#SVGID_4719_)"
+         width="9.592"
+         height="9.592"
+         id="rect83536" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="329.87"
+         clip-path="url(#SVGID_4719_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83538" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="330.543"
+         clip-path="url(#SVGID_4719_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83540" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="331.20099"
+         clip-path="url(#SVGID_4719_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83542" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="332.38199"
+         clip-path="url(#SVGID_4719_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83544" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83546"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83548">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4720_"
+           d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102664">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4720_"
+           overflow="visible"
+           id="use102666" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102668"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3544"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102670" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102672" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4722_)"
+         x="-588.81299"
+         y="331.974"
+         clip-path="url(#SVGID_4721_)"
+         width="5.3829999"
+         height="5.3860002"
+         id="rect83559" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83736"
+       inkscape:transform-center-x="440.81033"
+       inkscape:transform-center-y="89.828699">
+      <defs
+         id="defs83738">
+        <rect
+           id="SVGID_4748_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102813">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4748_"
+           overflow="visible"
+           id="use102815" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4749_)"
+         d="m -514.925,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83744" />
+      <rect
+         style="fill:#ffffff"
+         x="-674.71698"
+         y="341.65302"
+         clip-path="url(#SVGID_4749_)"
+         width="9.592"
+         height="9.592"
+         id="rect83746" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-674.71698"
+         y="341.65302"
+         clip-path="url(#SVGID_4749_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83748" />
+      <rect
+         style="fill:#81d0db"
+         x="-674.04602"
+         y="342.32599"
+         clip-path="url(#SVGID_4749_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83750" />
+      <rect
+         style="fill:#ffffff"
+         x="-673.38599"
+         y="342.98401"
+         clip-path="url(#SVGID_4749_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83752" />
+      <rect
+         style="fill:#ffffff"
+         x="-672.20697"
+         y="344.164"
+         clip-path="url(#SVGID_4749_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83754" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83756"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83758">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4750_"
+           d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102826">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4750_"
+           overflow="visible"
+           id="use102828" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102830"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3541"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102832" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102834" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4752_)"
+         x="-672.61401"
+         y="343.75699"
+         clip-path="url(#SVGID_4751_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83769" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83771"
+       inkscape:transform-center-x="592.57619"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83773">
+        <rect
+           id="SVGID_4753_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102840">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4753_"
+           overflow="visible"
+           id="use102842" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4754_)"
+         d="m -670.553,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83779" />
+      <rect
+         style="fill:#ffffff"
+         x="-662.745"
+         y="341.65302"
+         clip-path="url(#SVGID_4754_)"
+         width="9.592"
+         height="9.592"
+         id="rect83781" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-662.74597"
+         y="341.65302"
+         clip-path="url(#SVGID_4754_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83783" />
+      <rect
+         style="fill:#81d0db"
+         x="-662.07397"
+         y="342.32599"
+         clip-path="url(#SVGID_4754_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83785" />
+      <rect
+         style="fill:#ffffff"
+         x="-661.414"
+         y="342.98401"
+         clip-path="url(#SVGID_4754_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83787" />
+      <rect
+         style="fill:#ffffff"
+         x="-660.23499"
+         y="344.164"
+         clip-path="url(#SVGID_4754_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83789" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83791"
+       inkscape:transform-center-x="584.03412"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83793">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4755_"
+           d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102853">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4755_"
+           overflow="visible"
+           id="use102855" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102857"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.3541"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102859" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102861" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4757_)"
+         x="-660.64203"
+         y="343.75699"
+         clip-path="url(#SVGID_4756_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83804" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83806"
+       inkscape:transform-center-x="565.64033"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83808">
+        <rect
+           id="SVGID_4758_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102867">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4758_"
+           overflow="visible"
+           id="use102869" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4759_)"
+         d="m -658.582,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83814" />
+      <rect
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="341.65302"
+         clip-path="url(#SVGID_4759_)"
+         width="9.592"
+         height="9.592"
+         id="rect83816" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="341.65302"
+         clip-path="url(#SVGID_4759_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83818" />
+      <rect
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="342.32599"
+         clip-path="url(#SVGID_4759_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83820" />
+      <rect
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="342.98401"
+         clip-path="url(#SVGID_4759_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83822" />
+      <rect
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="344.164"
+         clip-path="url(#SVGID_4759_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83824" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83826"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83828">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4760_"
+           d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102880">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4760_"
+           overflow="visible"
+           id="use102882" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102884"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102886" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102888" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4762_)"
+         x="-648.67102"
+         y="343.75699"
+         clip-path="url(#SVGID_4761_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83839" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83841"
+       inkscape:transform-center-x="538.70558"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83843">
+        <rect
+           id="SVGID_4763_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102894">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4763_"
+           overflow="visible"
+           id="use102896" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4764_)"
+         d="m -646.611,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83849" />
+      <rect
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="341.65302"
+         clip-path="url(#SVGID_4764_)"
+         width="9.592"
+         height="9.592"
+         id="rect83851" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="341.65302"
+         clip-path="url(#SVGID_4764_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83853" />
+      <rect
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="342.32599"
+         clip-path="url(#SVGID_4764_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83855" />
+      <rect
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="342.98401"
+         clip-path="url(#SVGID_4764_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83857" />
+      <rect
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="344.164"
+         clip-path="url(#SVGID_4764_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83859" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83861"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83863">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4765_"
+           d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102907">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4765_"
+           overflow="visible"
+           id="use102909" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102911"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.3541"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102913" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102915" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4767_)"
+         x="-636.69897"
+         y="343.75699"
+         clip-path="url(#SVGID_4766_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83874" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83876"
+       inkscape:transform-center-x="511.76858"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83878">
+        <rect
+           id="SVGID_4768_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102921">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4768_"
+           overflow="visible"
+           id="use102923" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4769_)"
+         d="m -634.639,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83884" />
+      <rect
+         style="fill:#ffffff"
+         x="-626.83099"
+         y="341.65302"
+         clip-path="url(#SVGID_4769_)"
+         width="9.592"
+         height="9.592"
+         id="rect83886" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-626.83099"
+         y="341.65302"
+         clip-path="url(#SVGID_4769_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83888" />
+      <rect
+         style="fill:#81d0db"
+         x="-626.15997"
+         y="342.32599"
+         clip-path="url(#SVGID_4769_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83890" />
+      <rect
+         style="fill:#ffffff"
+         x="-625.5"
+         y="342.98401"
+         clip-path="url(#SVGID_4769_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83892" />
+      <rect
+         style="fill:#ffffff"
+         x="-624.32098"
+         y="344.164"
+         clip-path="url(#SVGID_4769_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83894" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83896"
+       inkscape:transform-center-x="503.22762"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83898">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4770_"
+           d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102934">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4770_"
+           overflow="visible"
+           id="use102936" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102938"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102940" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102942" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4772_)"
+         x="-624.72803"
+         y="343.75699"
+         clip-path="url(#SVGID_4771_)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83909" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83911"
+       inkscape:transform-center-x="484.83387"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83913">
+        <rect
+           id="SVGID_4773_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102948">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4773_"
+           overflow="visible"
+           id="use102950" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4774_)"
+         d="m -622.668,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83919" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="341.65302"
+         clip-path="url(#SVGID_4774_)"
+         width="9.5930004"
+         height="9.592"
+         id="rect83921" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="341.65302"
+         clip-path="url(#SVGID_4774_)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.592"
+         id="rect83923" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="342.32599"
+         clip-path="url(#SVGID_4774_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83925" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="342.98401"
+         clip-path="url(#SVGID_4774_)"
+         width="6.9310002"
+         height="6.9299998"
+         id="rect83927" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="344.164"
+         clip-path="url(#SVGID_4774_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83929" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83931"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83933">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4775_"
+           d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102961">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4775_"
+           overflow="visible"
+           id="use102963" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102965"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102967" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102969" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4777_)"
+         x="-612.75598"
+         y="343.75699"
+         clip-path="url(#SVGID_4776_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83944" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83946"
+       inkscape:transform-center-x="457.89686"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83948">
+        <rect
+           id="SVGID_4778_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102975">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4778_"
+           overflow="visible"
+           id="use102977" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4779_)"
+         d="m -610.696,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83954" />
+      <rect
+         style="fill:#ffffff"
+         x="-602.888"
+         y="341.65302"
+         clip-path="url(#SVGID_4779_)"
+         width="9.592"
+         height="9.592"
+         id="rect83956" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-602.888"
+         y="341.65302"
+         clip-path="url(#SVGID_4779_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83958" />
+      <rect
+         style="fill:#81d0db"
+         x="-602.21698"
+         y="342.32599"
+         clip-path="url(#SVGID_4779_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83960" />
+      <rect
+         style="fill:#ffffff"
+         x="-601.55701"
+         y="342.98401"
+         clip-path="url(#SVGID_4779_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83962" />
+      <rect
+         style="fill:#ffffff"
+         x="-600.37799"
+         y="344.164"
+         clip-path="url(#SVGID_4779_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83964" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83966"
+       inkscape:transform-center-x="449.35694"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83968">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4780_"
+           d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102988">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4780_"
+           overflow="visible"
+           id="use102990" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102992"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3541"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102994" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102996" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4782_)"
+         x="-600.78497"
+         y="343.75699"
+         clip-path="url(#SVGID_4781_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83979" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g83981"
+       inkscape:transform-center-x="430.96208"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83983">
+        <rect
+           id="SVGID_4783_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103002">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4783_"
+           overflow="visible"
+           id="use103004" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4784_)"
+         d="m -598.725,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83989" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="341.65302"
+         clip-path="url(#SVGID_4784_)"
+         width="9.592"
+         height="9.592"
+         id="rect83991" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="341.65302"
+         clip-path="url(#SVGID_4784_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83993" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="342.32599"
+         clip-path="url(#SVGID_4784_)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83995" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="342.98401"
+         clip-path="url(#SVGID_4784_)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83997" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="344.164"
+         clip-path="url(#SVGID_4784_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83999" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84001"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs84003">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4785_"
+           d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath103015">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4785_"
+           overflow="visible"
+           id="use103017" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103019"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop103021" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop103023" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4787_)"
+         x="-588.81299"
+         y="343.75699"
+         clip-path="url(#SVGID_4786_)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect84014" />
+    </g>
+    <rect
+       style="fill:#f15d57"
+       x="220.3154"
+       y="492.99048"
+       width="103.6395"
+       height="3.8114998"
+       id="rect84287"
+       inkscape:transform-center-x="437.28453"
+       inkscape:transform-center-y="-160.89453" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84289"
+       inkscape:transform-center-x="437.28348"
+       inkscape:transform-center-y="-131.54432">
+      <defs
+         id="defs84291">
+        <polygon
+           id="SVGID_4823_"
+           points="-592.788,256.788 -569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 " />
+      </defs>
+      <clipPath
+         id="clipPath103235">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4823_"
+           overflow="visible"
+           id="use103237" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103239"
+         gradientUnits="userSpaceOnUse"
+         x1="145.3168"
+         y1="2.8518"
+         x2="146.3168"
+         y2="2.8518"
+         gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+        <stop
+           offset="0"
+           style="stop-color:#FFFFFF"
+           id="stop103241" />
+        <stop
+           offset="0.23"
+           style="stop-color:#FFFFFF"
+           id="stop103243" />
+        <stop
+           offset="0.5671"
+           style="stop-color:#F9F9F9"
+           id="stop103245" />
+        <stop
+           offset="0.8674"
+           style="stop-color:#EDEEEE"
+           id="stop103247" />
+        <stop
+           offset="1"
+           style="stop-color:#E6E8E7"
+           id="stop103249" />
+      </linearGradient>
+      <polygon
+         style="fill:url(#SVGID_4825_)"
+         clip-path="url(#SVGID_4824_)"
+         points="-615.683,231.929 -569.802,231.874 -569.772,256.788 -615.653,256.843 "
+         id="polygon84308" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 220.79459,496.5208 102.67875,0.009 10e-4,43.1055 -51.4755,12.33 -51.20775,-12.46725 0.003,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.687,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.6395,-0.009 z"
+       id="path84310"
+       inkscape:transform-center-x="437.28484"
+       inkscape:transform-center-y="-131.54096" />
+    <text
+       y="513.2843"
+       x="243.95297"
+       id="text84312"
+       inkscape:transform-center-x="437.86922"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px">
+      <tspan
+         style="font-size:11px;fill:#37424b;font-family:ApexSans-Book"
+         x="243.95297"
+         y="513.2843"
+         font-size="5.1244"
+         id="tspan84314">RADOSGW</tspan>
+    </text>
+    <polygon
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       points="-592.696,269.217 -590.628,267.424 -594.747,267.424 "
+       id="polygon84355"
+       inkscape:transform-center-x="437.19348"
+       inkscape:transform-center-y="-77.629816" />
+    <path
+       id="path84524"
+       d="m -365.856,302.434 c 0,-2.331 1.892,-4.222 4.225,-4.222 2.334,0 4.223,1.891 4.223,4.222 0,2.334 -1.889,4.226 -4.223,4.226 -2.333,0 -4.225,-1.892 -4.225,-4.226"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84526"
+       d="m -361.631,301.547 c 0.488,0 0.888,0.398 0.888,0.887 0,0.493 -0.4,0.892 -0.888,0.89 -0.491,0 -0.888,-0.397 -0.888,-0.89 0,-0.489 0.397,-0.887 0.888,-0.887"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84528"
+       d="m -347.575,299.54 c 0.487,0 0.886,0.395 0.886,0.886 0,0.494 -0.399,0.891 -0.886,0.891 -0.493,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.395,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84530"
+       d="m -350.839,302.809 c 0.49,0 0.886,0.397 0.886,0.886 0,0.494 -0.396,0.893 -0.886,0.893 -0.491,0 -0.889,-0.399 -0.889,-0.893 0,-0.489 0.398,-0.886 0.889,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84532"
+       d="m -350.838,299.54 c 0.489,0 0.885,0.395 0.885,0.886 0,0.494 -0.396,0.891 -0.885,0.891 -0.492,0 -0.89,-0.397 -0.89,-0.891 0,-0.491 0.398,-0.886 0.89,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84534"
+       d="m -347.576,302.809 c 0.488,0 0.888,0.397 0.888,0.886 0,0.494 -0.4,0.893 -0.888,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84536"
+       d="m -344.311,302.809 c 0.488,0 0.886,0.397 0.886,0.886 0,0.494 -0.398,0.893 -0.886,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84538"
+       d="m -344.31,299.54 c 0.487,0 0.885,0.395 0.885,0.886 0,0.494 -0.398,0.891 -0.885,0.891 -0.492,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.396,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <line
+       id="line84540"
+       y2="308.98499"
+       x2="-343.42499"
+       y1="308.98499"
+       x1="-365.664"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4843_)"
+       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <line
+       id="line84542"
+       y2="311.16699"
+       x2="-343.42499"
+       y1="311.16699"
+       x1="-365.664"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4843_)"
+       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <line
+       id="line84544"
+       y2="313.35001"
+       x2="-343.42499"
+       y1="313.35001"
+       x1="-365.664"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4843_)"
+       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84552"
+       points="-601.13,292.47 -605.249,292.47 -603.198,294.263 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <polygon
+       id="polygon84554"
+       points="-590.618,292.47 -594.737,292.47 -592.686,294.263 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <polygon
+       id="polygon84556"
+       points="-580.105,292.47 -584.224,292.47 -582.173,294.263 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)" />
+    <polygon
+       id="polygon84564"
+       points="-436.6,208.359 -434.532,206.566 -438.651,206.566 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84566"
+       points="-426.089,208.359 -424.021,206.566 -428.14,206.566 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84568"
+       points="-415.575,208.359 -413.507,206.566 -417.626,206.566 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84570"
+       points="-296.627,290.885 -294.559,289.091 -298.678,289.091 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84714"
+       inkscape:transform-center-x="434.5295"
+       inkscape:transform-center-y="-60.127066">
+      <defs
+         id="defs84716">
+        <rect
+           id="SVGID_4862_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103539">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4862_"
+           overflow="visible"
+           id="use103541" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4863_)"
+         d="m -593.321,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84722" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#SVGID_4863_)"
+         stroke-miterlimit="10"
+         x1="-592.68903"
+         y1="276.099"
+         x2="-589.79303"
+         y2="276.099"
+         id="line84724" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84726"
+       inkscape:transform-center-x="413.59995"
+       inkscape:transform-center-y="-60.127083">
+      <defs
+         id="defs84728">
+        <polygon
+           id="SVGID_4864_"
+           points="-590.081,276.108 -588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 " />
+      </defs>
+      <clipPath
+         id="clipPath103548">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4864_"
+           overflow="visible"
+           id="use103550" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103552"
+         gradientUnits="userSpaceOnUse"
+         x1="-34.205299"
+         y1="249.9404"
+         x2="-33.205299"
+         y2="249.9404"
+         gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+        <stop
+           offset="0"
+           style="stop-color:#E6E8E7"
+           id="stop103554" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop103556" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4866_)"
+         x="-590.08099"
+         y="273.56699"
+         clip-path="url(#SVGID_4865_)"
+         width="15.759"
+         height="5.0650001"
+         id="rect84739" />
+    </g>
+    <polygon
+       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       stroke-miterlimit="10"
+       points="-590.082,276.108 -588.289,278.632 -574.323,278.632 -574.323,273.567 -588.289,273.567 "
+       id="polygon84741"
+       inkscape:transform-center-x="413.60223"
+       inkscape:transform-center-y="-60.127066" />
+    <text
+       y="597.62451"
+       x="287.82977"
+       id="text84743"
+       inkscape:transform-center-x="412.33742"
+       inkscape:transform-center-y="-60.270044"
+       style="font-size:27px">
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="287.82977"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84745">N</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="291.70874"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84747">A</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="294.77774"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84749">TIV</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="302.49078"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84751">E</tspan>
+    </text>
+    <g
+       transform="matrix(1.3542118,0,0,2.25,996.72494,-31.560183)"
+       id="g84792"
+       inkscape:transform-center-x="262.77489"
+       inkscape:transform-center-y="141.90493">
+      <defs
+         id="defs84794">
+        <rect
+           id="SVGID_4872_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103597">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4872_"
+           overflow="visible"
+           id="use103599" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4873_)"
+         d="m -438.652,188.287 c 0,0.349 -0.282,0.632 -0.632,0.632 -0.349,0 -0.632,-0.283 -0.632,-0.632 0,-0.35 0.283,-0.633 0.632,-0.633 0.35,0 0.632,0.284 0.632,0.633"
+         id="path84800" />
+      <g
+         clip-path="url(#SVGID_4873_)"
+         id="g84802">
+        <g
+           id="g84804">
+          <defs
+             id="defs84806">
+            <rect
+               id="SVGID_4874_"
+               x="-679.90002"
+               y="360.13901"
+               width="174.95799"
+               height="10.152" />
+          </defs>
+          <clipPath
+             id="clipPath103606">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4874_"
+               overflow="visible"
+               id="use103608" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4875_)"
+             id="g84812">
+            <defs
+               id="defs84814">
+              <rect
+                 id="SVGID_4876_"
+                 x="-679.90002"
+                 y="360.13901"
+                 width="174.95799"
+                 height="10.152" />
+            </defs>
+            <clipPath
+               id="clipPath103613">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4876_"
+                 overflow="visible"
+                 id="use103615" />
+            </clipPath>
+            <linearGradient
+               id="linearGradient103617"
+               gradientUnits="userSpaceOnUse"
+               x1="40.563"
+               y1="147.0757"
+               x2="41.563"
+               y2="147.0757"
+               gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+              <stop
+                 offset="0"
+                 style="stop-color:#55AEB9"
+                 id="stop103619" />
+              <stop
+                 offset="0.486"
+                 style="stop-color:#B0D2D9"
+                 id="stop103621" />
+              <stop
+                 offset="0.8287"
+                 style="stop-color:#E6EFF1"
+                 id="stop103623" />
+              <stop
+                 offset="0.9939"
+                 style="stop-color:#FFFFFF"
+                 id="stop103625" />
+              <stop
+                 offset="1"
+                 style="stop-color:#FFFFFF"
+                 id="stop103627" />
+            </linearGradient>
+            <rect
+               style="fill:url(#SVGID_4878_)"
+               x="-679.90002"
+               y="360.138"
+               clip-path="url(#SVGID_4877_)"
+               width="174.95799"
+               height="10.153"
+               id="rect84831" />
+          </g>
+        </g>
+      </g>
+      <g
+         clip-path="url(#SVGID_4873_)"
+         id="g84833">
+        <g
+           id="g84835">
+          <defs
+             id="defs84837">
+            <rect
+               id="SVGID_4879_"
+               x="-679.88898"
+               y="360.13901"
+               width="174.94701"
+               height="10.152" />
+          </defs>
+          <clipPath
+             id="clipPath103634">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4879_"
+               overflow="visible"
+               id="use103636" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4880_)"
+             id="g84843">
+            <defs
+               id="defs84845">
+              <rect
+                 id="SVGID_4881_"
+                 x="-679.88898"
+                 y="360.138"
+                 width="174.94701"
+                 height="10.153" />
+            </defs>
+            <clipPath
+               id="clipPath103641">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4881_"
+                 overflow="visible"
+                 id="use103643" />
+            </clipPath>
+            <polygon
+               style="fill:#f15d57"
+               clip-path="url(#SVGID_4882_)"
+               points="-679.89,364.81 -679.89,367.139 -679.89,370.291 -504.943,370.291 -504.943,360.138 -679.89,360.139 "
+               id="polygon84851" />
+          </g>
+        </g>
+      </g>
+      <rect
+         style="fill:#f15d57"
+         x="-679.90198"
+         y="360.267"
+         clip-path="url(#SVGID_4873_)"
+         width="174.96001"
+         height="2.641"
+         id="rect84853" />
+      <rect
+         style="fill:#55aeb9"
+         x="-679.88898"
+         y="370.29199"
+         clip-path="url(#SVGID_4873_)"
+         width="174.94701"
+         height="1.352"
+         id="rect84855" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:8px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="285.86542"
+       y="577.40869"
+       id="text113406"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan113408"
+         x="285.86542"
+         y="577.40869" /></text>
+    <text
+       y="832.10559"
+       x="242.41013"
+       id="text84343-2"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="197.43796"
+         y="832.10559"
+         font-size="5.1244"
+         id="tspan84345-2">MASTER REGION</tspan>
+    </text>
+    <text
+       y="926.36633"
+       x="288.45654"
+       id="text84343-2-6"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="249.24219"
+         y="926.36633"
+         font-size="5.1244"
+         id="tspan84345-2-5" />
+    </text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot126352"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
+         id="flowRegion126354"><rect
+           id="rect126356"
+           width="0"
+           height="51"
+           x="247"
+           y="928.36218" /></flowRegion><flowPara
+         id="flowPara126358" /></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot126403"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
+         id="flowRegion126405"><rect
+           id="rect126407"
+           width="185"
+           height="81"
+           x="286"
+           y="941.36218" /></flowRegion><flowPara
+         id="flowPara126409" /></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot126411"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
+         id="flowRegion126413"><rect
+           id="rect126415"
+           width="89"
+           height="64"
+           x="285"
+           y="943.36218" /></flowRegion><flowPara
+         id="flowPara126417" /></flowRoot>    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="272"
+       y="529.64587"
+       id="text126456"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan126458"
+         x="272"
+         y="529.64587">MASTER</tspan><tspan
+         sodipodi:role="line"
+         x="272"
+         y="540.89587"
+         id="tspan126460">ZONE</tspan></text>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g82107">
+      <defs
+         id="defs82109">
+        <polygon
+           id="SVGID_4519_"
+           points="-504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 " />
+      </defs>
+      <clipPath
+         id="clipPath126820">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4519_"
+           overflow="visible"
+           id="use126822" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient126824"
+         gradientUnits="userSpaceOnUse"
+         x1="40.840599"
+         y1="146.6937"
+         x2="41.840599"
+         y2="146.6937"
+         gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+        <stop
+           offset="0"
+           style="stop-color:#37424B"
+           id="stop126826" />
+        <stop
+           offset="0.12"
+           style="stop-color:#37424B"
+           id="stop126828" />
+        <stop
+           offset="0.88"
+           style="stop-color:#5E6A71"
+           id="stop126830" />
+        <stop
+           offset="1"
+           style="stop-color:#5E6A71"
+           id="stop126832" />
+      </linearGradient>
+      <rect
+         style="fill:url(#linearGradient126904)"
+         x="-547.302"
+         y="188.287"
+         clip-path="url(#SVGID_4520_-5)"
+         width="42.327"
+         height="10.191"
+         id="rect82124" />
+    </g>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g82126">
+      <defs
+         id="defs82128">
+        <rect
+           id="SVGID_4522_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath126838">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4522_"
+           overflow="visible"
+           id="use126840" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
+         id="path82134" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
+         id="path82136" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="191.26801"
+         sodipodi:cx="-541.625"
+         d="m -540.985,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-541.625"
+         cy="191.26801"
+         r="0.63999999"
+         id="circle82138" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="193.623"
+         sodipodi:cx="-541.625"
+         d="m -540.985,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-541.625"
+         cy="193.623"
+         r="0.63999999"
+         id="circle82140" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="191.26801"
+         sodipodi:cx="-543.85303"
+         d="m -543.21303,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-543.85303"
+         cy="191.26801"
+         r="0.63999999"
+         id="circle82142" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="193.623"
+         sodipodi:cx="-543.854"
+         d="m -543.214,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35347,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28653,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-543.854"
+         cy="193.623"
+         r="0.63999999"
+         id="circle82144" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
+         id="path82146" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
+         id="path82148" />
+    </g>
+    <text
+       y="319.3797"
+       x="267.68884"
+       id="text82150"
+       style="font-size:40.5px">
+      <tspan
+         style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="267.68884"
+         y="319.3797"
+         font-size="3.2027"
+         id="tspan82152">AP</tspan>
+      <tspan
+         style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="281.37094"
+         y="319.3797"
+         font-size="3.2027"
+         id="tspan82154">P</tspan>
+    </text>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g84638">
+      <defs
+         id="defs84640">
+        <rect
+           id="SVGID_4852_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath126879">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4852_"
+           overflow="visible"
+           id="use126881" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4853_-8)"
+         d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84646" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#SVGID_4853_-8)"
+         stroke-miterlimit="10"
+         x1="-526.03998"
+         y1="205.991"
+         x2="-523.14398"
+         y2="205.991"
+         id="line84648" />
+    </g>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g84650">
+      <defs
+         id="defs84652">
+        <polygon
+           id="SVGID_4854_"
+           points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 " />
+      </defs>
+      <clipPath
+         id="clipPath126888">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4854_"
+           overflow="visible"
+           id="use126890" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient126892"
+         gradientUnits="userSpaceOnUse"
+         x1="-34.205299"
+         y1="249.94031"
+         x2="-33.205101"
+         y2="249.94031"
+         gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+        <stop
+           offset="0"
+           style="stop-color:#E6E8E7"
+           id="stop126894" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop126896" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4856_-4)"
+         x="-523.43201"
+         y="203.45799"
+         clip-path="url(#SVGID_4855_-2)"
+         width="15.759"
+         height="5.066"
+         id="rect84663" />
+    </g>
+    <polygon
+       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       stroke-miterlimit="10"
+       points="-507.674,203.459 -521.64,203.459 -523.433,206 -521.64,208.524 -507.674,208.524 "
+       id="polygon84665" />
+    <text
+       y="363.54565"
+       x="306.66861"
+       id="text84667"
+       style="font-size:40.5px">
+      <tspan
+         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="306.66861"
+         y="363.54565"
+         font-size="2.5652"
+         id="tspan84669">RE</tspan>
+      <tspan
+         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="315.84521"
+         y="363.54565"
+         font-size="2.5652"
+         id="tspan84671">S</tspan>
+      <tspan
+         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="319.98297"
+         y="363.54565"
+         font-size="2.5652"
+         id="tspan84673">T</tspan>
+    </text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="232.25806"
+       y="178.16862"
+       id="text127482"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan127484"
+         x="232.25806"
+         y="178.16862" /></text>
+    <text
+       y="247.60512"
+       x="322.41013"
+       id="text84343-2-0"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="277.43796"
+         y="247.60512"
+         font-size="5.1244"
+         id="tspan84345-2-6">MASTER REGION</tspan>
+    </text>
+    <text
+       y="705.37921"
+       x="255.23141"
+       style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+       font-size="4.3343"
+       id="text82351-9"
+       inkscape:transform-center-x="450.06672"
+       inkscape:transform-center-y="45.543285">M</text>
+    <g
+       id="g9504"
+       transform="translate(-230,34)">
+      <g
+         inkscape:transform-center-y="45.666809"
+         inkscape:transform-center-x="449.81598"
+         id="g82339-6"
+         transform="matrix(2.25,0,0,2.25,1701.0081,-85.193202)">
+        <defs
+           id="defs82341-9">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4549_-8" />
+        </defs>
+        <clipPath
+           id="clipPath101738-3">
+          <use
+             id="use101740-3"
+             overflow="visible"
+             xlink:href="#SVGID_4549_-8"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82347-9"
+           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           clip-path="url(#SVGID_4550_-6)"
+           inkscape:connector-curvature="0"
+           style="fill:#f15d57" />
+        <path
+           id="path82349-9"
+           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4550_-6)"
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+      </g>
+      <text
+         inkscape:transform-center-y="45.543285"
+         inkscape:transform-center-x="450.06672"
+         id="text82351-9-4"
+         font-size="4.3343"
+         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="350.6293"
+         y="645.37921">M</text>
+    </g>
+    <path
+       id="path82449-2"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1767.5425,-25.466067)" />
+    <path
+       id="path82449-2-2"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-3)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1578.7139,-25.075587)" />
+    <path
+       id="path82449-2-0"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-9)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1767.5425,0.59793262)" />
+    <path
+       id="path82449-2-0-1"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-9-3)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1767.6425,26.597933)" />
+    <path
+       id="path82449-2-0-1-5"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-9-3-4)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1767.7422,53.197933)" />
+    <text
+       y="292.96655"
+       x="321.78174"
+       id="text84343-2-0-4-3"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="276.80957"
+         y="292.96655"
+         font-size="5.1244"
+         id="tspan84345-2-6-5-3">WRITE / READ</tspan>
+    </text>
+    <text
+       y="262.38412"
+       x="322.19797"
+       id="text84343-2-0-4-6"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="277.2258"
+         y="262.38412"
+         font-size="5.1244"
+         id="tspan84345-2-6-5-6">(United States)</tspan>
+    </text>
+    <g
+       transform="matrix(1.3542118,0,0,2.25,1325.4162,-25.59059)"
+       id="g82158-9"
+       inkscape:transform-center-x="262.3321"
+       inkscape:transform-center-y="50.765304">
+      <defs
+         id="defs82160-5">
+        <rect
+           id="SVGID_4524_-5"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101582-0">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4524_-5"
+           overflow="visible"
+           id="use101584-7" />
+      </clipPath>
+      <g
+         clip-path="url(#SVGID_4525_-0)"
+         id="g82166-4">
+        <g
+           id="g82168-7">
+          <defs
+             id="defs82170-2">
+            <rect
+               id="SVGID_4526_-7"
+               x="-679.67902"
+               y="293.259"
+               width="175.168"
+               height="64.251999" />
+          </defs>
+          <clipPath
+             id="clipPath101590-3">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4526_-7"
+               overflow="visible"
+               id="use101592-1" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4527_-7)"
+             id="g82176-6">
+            <defs
+               id="defs82178-7">
+              <rect
+                 id="SVGID_4528_-0"
+                 x="-679.57202"
+                 y="293.367"
+                 width="174.953"
+                 height="64.037003" />
+            </defs>
+            <clipPath
+               id="clipPath101597-1">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4528_-0"
+                 overflow="visible"
+                 id="use101599-3" />
+            </clipPath>
+            <linearGradient
+               id="linearGradient101601-1"
+               gradientUnits="userSpaceOnUse"
+               x1="126.8011"
+               y1="60.902401"
+               x2="127.8011"
+               y2="60.902401"
+               gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+              <stop
+                 offset="0"
+                 style="stop-color:#E6E8E7"
+                 id="stop101603-3" />
+              <stop
+                 offset="1"
+                 style="stop-color:#FFFFFF"
+                 id="stop101605-0" />
+            </linearGradient>
+            <rect
+               style="fill:url(#SVGID_4530_-2)"
+               x="-679.57202"
+               y="293.366"
+               clip-path="url(#SVGID_4529_-9)"
+               width="174.953"
+               height="64.038002"
+               id="rect82189-5" />
+          </g>
+          <g
+             clip-path="url(#SVGID_4527_-7)"
+             id="g82191-9">
+            <defs
+               id="defs82193-6">
+              <rect
+                 id="SVGID_4531_-4"
+                 x="-679.67902"
+                 y="293.259"
+                 width="175.168"
+                 height="64.251999" />
+            </defs>
+            <clipPath
+               id="clipPath101611-1">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4531_-4"
+                 overflow="visible"
+                 id="use101613-8" />
+            </clipPath>
+            <rect
+               style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10"
+               x="-679.57202"
+               y="293.366"
+               clip-path="url(#SVGID_4532_-8)"
+               stroke-miterlimit="10"
+               width="174.953"
+               height="64.038002"
+               id="rect82199-7" />
+          </g>
+        </g>
+      </g>
+      <g
+         clip-path="url(#SVGID_4525_-0)"
+         id="g82201-2">
+        <g
+           id="g82203-6">
+          <defs
+             id="defs82205-4">
+            <rect
+               id="SVGID_4533_-1"
+               x="-441.56699"
+               y="293.259"
+               width="45.873001"
+               height="64.251999" />
+          </defs>
+          <clipPath
+             id="clipPath101620-7">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4533_-1"
+               overflow="visible"
+               id="use101622-3" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4534_-49)"
+             id="g82211-7">
+            <defs
+               id="defs82213-4">
+              <rect
+                 id="SVGID_4535_-5"
+                 x="-441.45999"
+                 y="293.367"
+                 width="45.659"
+                 height="64.037003" />
+            </defs>
+            <clipPath
+               id="clipPath101627-6">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4535_-5"
+                 overflow="visible"
+                 id="use101629-8" />
+            </clipPath>
+            <linearGradient
+               id="linearGradient101631-5"
+               gradientUnits="userSpaceOnUse"
+               x1="126.8011"
+               y1="60.902401"
+               x2="127.8011"
+               y2="60.902401"
+               gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+              <stop
+                 offset="0"
+                 style="stop-color:#E6E8E7"
+                 id="stop101633-8" />
+              <stop
+                 offset="1"
+                 style="stop-color:#FFFFFF"
+                 id="stop101635-5" />
+            </linearGradient>
+            <rect
+               style="fill:url(#SVGID_4537_-7)"
+               x="-441.45999"
+               y="293.366"
+               clip-path="url(#SVGID_4536_-4)"
+               width="45.659"
+               height="64.038002"
+               id="rect82224-8" />
+          </g>
+          <g
+             clip-path="url(#SVGID_4534_-49)"
+             id="g82226-0">
+            <defs
+               id="defs82228-3">
+              <rect
+                 id="SVGID_4538_-7"
+                 x="-441.56699"
+                 y="293.259"
+                 width="45.873001"
+                 height="64.251999" />
+            </defs>
+            <clipPath
+               id="clipPath101641-2">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4538_-7"
+                 overflow="visible"
+                 id="use101643-6" />
+            </clipPath>
+            <rect
+               style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10"
+               x="-441.45999"
+               y="293.366"
+               clip-path="url(#SVGID_4539_-0)"
+               stroke-miterlimit="10"
+               width="45.659"
+               height="64.038002"
+               id="rect82234-0" />
+          </g>
+        </g>
+      </g>
+    </g>
+    <rect
+       style="fill:#f15d57"
+       x="404.21451"
+       y="574.65991"
+       width="95.778"
+       height="3.0712502"
+       id="rect82236-5"
+       inkscape:transform-center-x="586.0074"
+       inkscape:transform-center-y="-79.564828" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82310-8"
+       inkscape:transform-center-x="585.9972"
+       inkscape:transform-center-y="-95.804196">
+      <defs
+         id="defs82312-6">
+        <polygon
+           id="SVGID_4546_-1"
+           points="-679.997,253.224 -680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 " />
+      </defs>
+      <clipPath
+         id="clipPath101711-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4546_-1"
+           overflow="visible"
+           id="use101713-5" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101715-3"
+         gradientUnits="userSpaceOnUse"
+         x1="76.3899"
+         y1="97.785698"
+         x2="77.3899"
+         y2="97.785698"
+         gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101717-8" />
+        <stop
+           offset="0.0507"
+           style="stop-color:#68B4BF"
+           id="stop101719-2" />
+        <stop
+           offset="0.2116"
+           style="stop-color:#96C6CF"
+           id="stop101721-7" />
+        <stop
+           offset="0.3736"
+           style="stop-color:#BAD8DD"
+           id="stop101723-6" />
+        <stop
+           offset="0.5342"
+           style="stop-color:#D7E6EA"
+           id="stop101725-5" />
+        <stop
+           offset="0.693"
+           style="stop-color:#EBF2F3"
+           id="stop101727-2" />
+        <stop
+           offset="0.8492"
+           style="stop-color:#F8FBFB"
+           id="stop101729-5" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop101731-7" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4548_-6)"
+         x="-680.00299"
+         y="253.133"
+         clip-path="url(#SVGID_4547_-1)"
+         width="42.361"
+         height="14.22"
+         id="rect82335-2" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 499.52681,544.26464 -0.0157,31.37625 -94.815,0.072 0.0158,-31.2435 46.48274,11.31975 0.1125,0.027 0.11475,-0.027 48.10501,-11.5245 z m 0.4815,-0.60975 -48.699,11.66625 -47.079,-11.46375 -0.0135,32.337 95.77575,-0.0743 0.0157,-32.46525 z"
+       id="path82337-5"
+       inkscape:transform-center-x="585.99834"
+       inkscape:transform-center-y="-95.835733" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82339-8"
+       inkscape:transform-center-x="449.81598"
+       inkscape:transform-center-y="45.666809">
+      <defs
+         id="defs82341-98">
+        <rect
+           id="SVGID_4549_-7"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101738-4">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4549_-7"
+           overflow="visible"
+           id="use101740-4" />
+      </clipPath>
+      <path
+         style="fill:#f15d57"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4550_-50)"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82347-4" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4550_-50)"
+         stroke-miterlimit="10"
+         d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82349-4" />
+    </g>
+    <text
+       y="704.8584"
+       x="603.83478"
+       style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+       font-size="4.3343"
+       id="text82351-1"
+       inkscape:transform-center-x="450.06672"
+       inkscape:transform-center-y="45.543285">M</text>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82353-8"
+       inkscape:transform-center-x="503.22873"
+       inkscape:transform-center-y="71.647559">
+      <defs
+         id="defs82355-0">
+        <rect
+           id="SVGID_4551_-7"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101748-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4551_-7"
+           overflow="visible"
+           id="use101750-2" />
+      </clipPath>
+      <path
+         style="fill:#f15d57"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4552_-4)"
+         d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82361-9" />
+      <path
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4552_-4)"
+         stroke-miterlimit="10"
+         d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+         id="path82363-6" />
+    </g>
+    <text
+       y="730.84003"
+       x="530.42249"
+       style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+       font-size="4.3343"
+       id="text82365-8"
+       inkscape:transform-center-x="503.47899"
+       inkscape:transform-center-y="71.524915">M</text>
+    <rect
+       style="fill:#ffffff"
+       x="416.3511"
+       y="664.56543"
+       width="21.581999"
+       height="21.584251"
+       id="rect82381-2"
+       inkscape:transform-center-x="610.96881"
+       inkscape:transform-center-y="19.597191" />
+    <rect
+       style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10"
+       x="416.3511"
+       y="664.56543"
+       stroke-miterlimit="10"
+       width="21.581999"
+       height="21.584251"
+       id="rect82383-1"
+       inkscape:transform-center-x="610.96881"
+       inkscape:transform-center-y="19.597191" />
+    <rect
+       style="fill:#81d0db"
+       x="417.8631"
+       y="666.08191"
+       width="18.557999"
+       height="18.553501"
+       id="rect82385-3"
+       inkscape:transform-center-x="610.97115"
+       inkscape:transform-center-y="19.598295" />
+    <rect
+       style="fill:#ffffff"
+       x="419.34586"
+       y="667.56012"
+       width="15.592501"
+       height="15.594751"
+       id="rect82387-5"
+       inkscape:transform-center-x="610.96883"
+       inkscape:transform-center-y="19.597131" />
+    <rect
+       style="fill:#ffffff"
+       x="422.00085"
+       y="670.21729"
+       width="10.282501"
+       height="10.278"
+       id="rect82389-9"
+       inkscape:transform-center-x="610.97103"
+       inkscape:transform-center-y="19.595982" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4666,-25.591067)"
+       id="g82391-8"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82393-4">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4555_-7"
+           d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101773-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4555_-7"
+           overflow="visible"
+           id="use101775-6" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101777-2"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.46021"
+         x2="256.3761"
+         y2="-148.46021"
+         gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101779-4" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101781-1" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4557_-8)"
+         x="-672.61401"
+         y="308.841"
+         clip-path="url(#SVGID_4556_-9)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82404-9" />
+    </g>
+    <rect
+       id="rect82451-3"
+       height="9.5930004"
+       width="9.592"
+       clip-path="url(#SVGID_4564_-73)"
+       y="306.73599"
+       x="-650.77399"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82453-2"
+       height="9.5930004"
+       width="9.592"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4564_-73)"
+       y="306.73599"
+       x="-650.77399"
+       style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82455-8"
+       height="8.2460003"
+       width="8.2480001"
+       clip-path="url(#SVGID_4564_-73)"
+       y="307.41"
+       x="-650.10303"
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82457-2"
+       height="6.9310002"
+       width="6.9299998"
+       clip-path="url(#SVGID_4564_-73)"
+       y="308.06699"
+       x="-649.44299"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82459-8"
+       height="4.5679998"
+       width="4.5700002"
+       clip-path="url(#SVGID_4564_-73)"
+       y="309.24799"
+       x="-648.26398"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82461-4"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82463-7">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4565_-3"
+           d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101827-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4565_-3"
+           overflow="visible"
+           id="use101829-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101831-3"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101833-4" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101835-4" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4567_-1)"
+         x="-648.67102"
+         y="308.841"
+         clip-path="url(#SVGID_4566_-3)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82474-5" />
+    </g>
+    <path
+       id="path82484-3"
+       d="m -646.611,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4569_-7)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82486-0"
+       height="9.5930004"
+       width="9.592"
+       clip-path="url(#SVGID_4569_-7)"
+       y="306.73599"
+       x="-638.80298"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82488-6"
+       height="9.5930004"
+       width="9.592"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4569_-7)"
+       y="306.73599"
+       x="-638.80298"
+       style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82490-6"
+       height="8.2460003"
+       width="8.2480001"
+       clip-path="url(#SVGID_4569_-7)"
+       y="307.41"
+       x="-638.13202"
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82492-4"
+       height="6.9310002"
+       width="6.9299998"
+       clip-path="url(#SVGID_4569_-7)"
+       y="308.06699"
+       x="-637.47198"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <rect
+       id="rect82494-9"
+       height="4.5679998"
+       width="4.5700002"
+       clip-path="url(#SVGID_4569_-7)"
+       y="309.24799"
+       x="-636.29199"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82496-3"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82498-5">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4570_-9"
+           d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101854-8">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4570_-9"
+           overflow="visible"
+           id="use101856-3" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101858-4"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.46001"
+         x2="256.3761"
+         y2="-148.46001"
+         gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101860-6" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101862-5" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4572_-41)"
+         x="-636.69897"
+         y="308.841"
+         clip-path="url(#SVGID_4571_-0)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82509-9" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82511-7"
+       inkscape:transform-center-x="511.76858"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82513-7">
+        <rect
+           id="SVGID_4573_-4"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101868-0">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4573_-4"
+           overflow="visible"
+           id="use101870-7" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4574_-9)"
+         d="m -634.639,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82519-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-626.83099"
+         y="306.73599"
+         clip-path="url(#SVGID_4574_-9)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82521-0" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-626.83099"
+         y="306.73599"
+         clip-path="url(#SVGID_4574_-9)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82523-1" />
+      <rect
+         style="fill:#81d0db"
+         x="-626.15997"
+         y="307.41"
+         clip-path="url(#SVGID_4574_-9)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82525-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-625.5"
+         y="308.06699"
+         clip-path="url(#SVGID_4574_-9)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82527-3" />
+      <rect
+         style="fill:#ffffff"
+         x="-624.32098"
+         y="309.24799"
+         clip-path="url(#SVGID_4574_-9)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82529-8" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82531-3"
+       inkscape:transform-center-x="503.22762"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82533-9">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4575_-2"
+           d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101881-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4575_-2"
+           overflow="visible"
+           id="use101883-6" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101885-7"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101887-1" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101889-2" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4577_-27)"
+         x="-624.72803"
+         y="308.841"
+         clip-path="url(#SVGID_4576_-1)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82544-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82546-5"
+       inkscape:transform-center-x="484.83387"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82548-4">
+        <rect
+           id="SVGID_4578_-9"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101895-1">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4578_-9"
+           overflow="visible"
+           id="use101897-5" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4579_-0)"
+         d="m -622.668,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82554-9" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="306.73599"
+         clip-path="url(#SVGID_4579_-0)"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect82556-4" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="306.73599"
+         clip-path="url(#SVGID_4579_-0)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect82558-0" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="307.41"
+         clip-path="url(#SVGID_4579_-0)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82560-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="308.06699"
+         clip-path="url(#SVGID_4579_-0)"
+         width="6.9310002"
+         height="6.9310002"
+         id="rect82562-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="309.24799"
+         clip-path="url(#SVGID_4579_-0)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82564-1" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82566-5"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82568-0">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4580_-5"
+           d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101908-7">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4580_-5"
+           overflow="visible"
+           id="use101910-9" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101912-3"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101914-7" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101916-2" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4582_-8)"
+         x="-612.75598"
+         y="308.841"
+         clip-path="url(#SVGID_4581_-2)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect82579-9" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82581-3"
+       inkscape:transform-center-x="457.89686"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82583-0">
+        <rect
+           id="SVGID_4583_-4"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101922-4">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4583_-4"
+           overflow="visible"
+           id="use101924-4" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4584_-0)"
+         d="m -610.696,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82589-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-602.888"
+         y="306.73599"
+         clip-path="url(#SVGID_4584_-0)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82591-2" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-602.888"
+         y="306.73599"
+         clip-path="url(#SVGID_4584_-0)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82593-2" />
+      <rect
+         style="fill:#81d0db"
+         x="-602.21698"
+         y="307.41"
+         clip-path="url(#SVGID_4584_-0)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82595-8" />
+      <rect
+         style="fill:#ffffff"
+         x="-601.55701"
+         y="308.06699"
+         clip-path="url(#SVGID_4584_-0)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82597-7" />
+      <rect
+         style="fill:#ffffff"
+         x="-600.37799"
+         y="309.24799"
+         clip-path="url(#SVGID_4584_-0)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82599-7" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82601-6"
+       inkscape:transform-center-x="449.35694"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82603-1">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4585_-8"
+           d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101935-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4585_-8"
+           overflow="visible"
+           id="use101937-8" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101939-7"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.46021"
+         x2="256.3761"
+         y2="-148.46021"
+         gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101941-5" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101943-8" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4587_-9)"
+         x="-600.78497"
+         y="308.841"
+         clip-path="url(#SVGID_4586_-03)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect82614-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82616-8"
+       inkscape:transform-center-x="430.96208"
+       inkscape:transform-center-y="19.597166">
+      <defs
+         id="defs82618-9">
+        <rect
+           id="SVGID_4588_-2"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath101949-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4588_-2"
+           overflow="visible"
+           id="use101951-6" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4589_-7)"
+         d="m -598.725,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82624-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="306.73599"
+         clip-path="url(#SVGID_4589_-7)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82626-0" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="306.73599"
+         clip-path="url(#SVGID_4589_-7)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82628-0" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="307.41"
+         clip-path="url(#SVGID_4589_-7)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82630-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="308.06699"
+         clip-path="url(#SVGID_4589_-7)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82632-3" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="309.24799"
+         clip-path="url(#SVGID_4589_-7)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82634-1" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82636-3"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="19.598312">
+      <defs
+         id="defs82638-5">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4590_-7"
+           d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath101962-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4590_-7"
+           overflow="visible"
+           id="use101964-0" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101966-2"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3761"
+         y1="-148.4601"
+         x2="256.3761"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101968-4" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop101970-4" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4592_-6)"
+         x="-588.81299"
+         y="308.841"
+         clip-path="url(#SVGID_4591_-2)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect82649-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82896-3"
+       inkscape:transform-center-x="592.57619"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs82898-8">
+        <rect
+           id="SVGID_4628_-3"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102165-4">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4628_-3"
+           overflow="visible"
+           id="use102167-0" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4629_-0)"
+         d="m -670.553,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82904-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-662.745"
+         y="318.323"
+         clip-path="url(#SVGID_4629_-0)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82906-1" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-662.74597"
+         y="318.323"
+         clip-path="url(#SVGID_4629_-0)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82908-3" />
+      <rect
+         style="fill:#81d0db"
+         x="-662.07397"
+         y="318.99701"
+         clip-path="url(#SVGID_4629_-0)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82910-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-661.414"
+         y="319.65399"
+         clip-path="url(#SVGID_4629_-0)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82912-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-660.23499"
+         y="320.83499"
+         clip-path="url(#SVGID_4629_-0)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82914-4" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82916-7"
+       inkscape:transform-center-x="584.03412"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82918-4">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4630_-9"
+           d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102178-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4630_-9"
+           overflow="visible"
+           id="use102180-1" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102182-9"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102184-5" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102186-5" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4632_-7)"
+         x="-660.64203"
+         y="320.42899"
+         clip-path="url(#SVGID_4631_-7)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82929-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82931-1"
+       inkscape:transform-center-x="565.64033"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs82933-7">
+        <rect
+           id="SVGID_4633_-6"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102192-4">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4633_-6"
+           overflow="visible"
+           id="use102194-8" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4634_-0)"
+         d="m -658.582,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82939-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="318.323"
+         clip-path="url(#SVGID_4634_-0)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82941-6" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="318.323"
+         clip-path="url(#SVGID_4634_-0)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82943-7" />
+      <rect
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="318.99701"
+         clip-path="url(#SVGID_4634_-0)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82945-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="319.65399"
+         clip-path="url(#SVGID_4634_-0)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82947-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="320.83499"
+         clip-path="url(#SVGID_4634_-0)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82949-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82951-7"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82953-8">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4635_-5"
+           d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102205-2">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4635_-5"
+           overflow="visible"
+           id="use102207-1" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102209-9"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102211-5" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102213-4" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4637_-4)"
+         x="-648.67102"
+         y="320.42899"
+         clip-path="url(#SVGID_4636_-9)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82964-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82966-8"
+       inkscape:transform-center-x="538.70558"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs82968-8">
+        <rect
+           id="SVGID_4638_-3"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102219-2">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4638_-3"
+           overflow="visible"
+           id="use102221-0" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4639_-45)"
+         d="m -646.611,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82974-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="318.323"
+         clip-path="url(#SVGID_4639_-45)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82976-3" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="318.323"
+         clip-path="url(#SVGID_4639_-45)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82978-1" />
+      <rect
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="318.99701"
+         clip-path="url(#SVGID_4639_-45)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82980-7" />
+      <rect
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="319.65399"
+         clip-path="url(#SVGID_4639_-45)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82982-8" />
+      <rect
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="320.83499"
+         clip-path="url(#SVGID_4639_-45)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82984-6" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g82986-8"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs82988-7">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4640_-2"
+           d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102232-2">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4640_-2"
+           overflow="visible"
+           id="use102234-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102236-4"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.46001"
+         x2="256.37631"
+         y2="-148.46001"
+         gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102238-1" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102240-5" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4642_-8)"
+         x="-636.69897"
+         y="320.42899"
+         clip-path="url(#SVGID_4641_-3)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect82999-8" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83001-3"
+       inkscape:transform-center-x="511.76858"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs83003-9">
+        <rect
+           id="SVGID_4643_-8"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102246-1">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4643_-8"
+           overflow="visible"
+           id="use102248-6" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4644_-6)"
+         d="m -634.639,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83009-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-626.83099"
+         y="318.323"
+         clip-path="url(#SVGID_4644_-6)"
+         width="9.592"
+         height="9.5930004"
+         id="rect83011-4" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-626.83099"
+         y="318.323"
+         clip-path="url(#SVGID_4644_-6)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect83013-7" />
+      <rect
+         style="fill:#81d0db"
+         x="-626.15997"
+         y="318.99701"
+         clip-path="url(#SVGID_4644_-6)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect83015-7" />
+      <rect
+         style="fill:#ffffff"
+         x="-625.5"
+         y="319.65399"
+         clip-path="url(#SVGID_4644_-6)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect83017-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-624.32098"
+         y="320.83499"
+         clip-path="url(#SVGID_4644_-6)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83019-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83021-5"
+       inkscape:transform-center-x="503.22762"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs83023-1">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4645_-7"
+           d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102259-7">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4645_-7"
+           overflow="visible"
+           id="use102261-1" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102263-7"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102265-2" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102267-2" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4647_-0)"
+         x="-624.72803"
+         y="320.42899"
+         clip-path="url(#SVGID_4646_-87)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83034-4" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83036-0"
+       inkscape:transform-center-x="484.83387"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs83038-8">
+        <rect
+           id="SVGID_4648_-2"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102273-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4648_-2"
+           overflow="visible"
+           id="use102275-0" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4649_-4)"
+         d="m -622.668,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83044-7" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="318.323"
+         clip-path="url(#SVGID_4649_-4)"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect83046-7" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="318.323"
+         clip-path="url(#SVGID_4649_-4)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.5930004"
+         id="rect83048-4" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="318.99701"
+         clip-path="url(#SVGID_4649_-4)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect83050-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="319.65399"
+         clip-path="url(#SVGID_4649_-4)"
+         width="6.9310002"
+         height="6.9310002"
+         id="rect83052-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="320.83499"
+         clip-path="url(#SVGID_4649_-4)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83054-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83056-3"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs83058-3">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4650_-3"
+           d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102286-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4650_-3"
+           overflow="visible"
+           id="use102288-9" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102290-5"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102292-1" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102294-8" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4652_-6)"
+         x="-612.75598"
+         y="320.42899"
+         clip-path="url(#SVGID_4651_-3)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83069-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83071-4"
+       inkscape:transform-center-x="444.42945"
+       inkscape:transform-center-y="45.667929">
+      <defs
+         id="defs83073-0">
+        <rect
+           id="SVGID_4653_-9"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102300-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4653_-9"
+           overflow="visible"
+           id="use102302-8" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4654_-2)"
+         d="m -610.696,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83079-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="318.323"
+         clip-path="url(#SVGID_4654_-2)"
+         width="9.592"
+         height="9.5930004"
+         id="rect83081-7" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="318.323"
+         clip-path="url(#SVGID_4654_-2)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect83083-5" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="318.99701"
+         clip-path="url(#SVGID_4654_-2)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect83085-8" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="319.65399"
+         clip-path="url(#SVGID_4654_-2)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect83087-9" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="320.83499"
+         clip-path="url(#SVGID_4654_-2)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83089-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83091-0"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="45.671291">
+      <defs
+         id="defs83093-8">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4655_-6"
+           d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69" />
+      </defs>
+      <clipPath
+         id="clipPath102313-1">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4655_-6"
+           overflow="visible"
+           id="use102315-0" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102317-3"
+         gradientUnits="userSpaceOnUse"
+         x1="255.37621"
+         y1="-148.4601"
+         x2="256.37631"
+         y2="-148.4601"
+         gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102319-0" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102321-7" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4657_-5)"
+         x="-588.81299"
+         y="320.42899"
+         clip-path="url(#SVGID_4656_-5)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83104-3" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4666,-25.59059)"
+       id="g83336-4"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83338-2">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4690_-8"
+           d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102502-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4690_-8"
+           overflow="visible"
+           id="use102504-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102506-5"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3544"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102508-0" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102510-4" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4692_-5)"
+         x="-672.61401"
+         y="331.974"
+         clip-path="url(#SVGID_4691_-8)"
+         width="5.3839998"
+         height="5.3860002"
+         id="rect83349-8" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83351-8"
+       inkscape:transform-center-x="592.57619"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83353-8">
+        <rect
+           id="SVGID_4693_-2"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102516-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4693_-2"
+           overflow="visible"
+           id="use102518-7" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4694_-6)"
+         d="m -670.553,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83359-7" />
+      <rect
+         style="fill:#ffffff"
+         x="-662.745"
+         y="329.87"
+         clip-path="url(#SVGID_4694_-6)"
+         width="9.592"
+         height="9.592"
+         id="rect83361-9" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-662.74597"
+         y="329.87"
+         clip-path="url(#SVGID_4694_-6)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83363-3" />
+      <rect
+         style="fill:#81d0db"
+         x="-662.07397"
+         y="330.543"
+         clip-path="url(#SVGID_4694_-6)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83365-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-661.414"
+         y="331.20099"
+         clip-path="url(#SVGID_4694_-6)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83367-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-660.23499"
+         y="332.38199"
+         clip-path="url(#SVGID_4694_-6)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83369-3" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83371-6"
+       inkscape:transform-center-x="584.03412"
+       inkscape:transform-center-y="71.648681">
+      <defs
+         id="defs83373-8">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4695_-3"
+           d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102529-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4695_-3"
+           overflow="visible"
+           id="use102531-5" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102533-6"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.35419"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102535-6" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102537-0" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4697_-7)"
+         x="-660.64203"
+         y="331.974"
+         clip-path="url(#SVGID_4696_-9)"
+         width="5.3839998"
+         height="5.3850002"
+         id="rect83384-7" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83386-5"
+       inkscape:transform-center-x="565.64033"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83388-6">
+        <rect
+           id="SVGID_4698_-1"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102543-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4698_-1"
+           overflow="visible"
+           id="use102545-4" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4699_-07)"
+         d="m -658.582,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83394-3" />
+      <rect
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="329.87"
+         clip-path="url(#SVGID_4699_-07)"
+         width="9.592"
+         height="9.592"
+         id="rect83396-6" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="329.87"
+         clip-path="url(#SVGID_4699_-07)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83398-1" />
+      <rect
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="330.543"
+         clip-path="url(#SVGID_4699_-07)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83400-3" />
+      <rect
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="331.20099"
+         clip-path="url(#SVGID_4699_-07)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83402-2" />
+      <rect
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="332.38199"
+         clip-path="url(#SVGID_4699_-07)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83404-1" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83406-2"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83408-0">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4700_-3"
+           d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102556-3">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4700_-3"
+           overflow="visible"
+           id="use102558-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102560-3"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3544"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102562-2" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102564-2" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4702_-3)"
+         x="-648.67102"
+         y="331.974"
+         clip-path="url(#SVGID_4701_-9)"
+         width="5.3839998"
+         height="5.3860002"
+         id="rect83419-9" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83421-8"
+       inkscape:transform-center-x="538.70558"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83423-5">
+        <rect
+           id="SVGID_4703_-5"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102570-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4703_-5"
+           overflow="visible"
+           id="use102572-0" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4704_-1)"
+         d="m -646.611,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83429-3" />
+      <rect
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="329.87"
+         clip-path="url(#SVGID_4704_-1)"
+         width="9.592"
+         height="9.592"
+         id="rect83431-4" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="329.87"
+         clip-path="url(#SVGID_4704_-1)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83433-7" />
+      <rect
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="330.543"
+         clip-path="url(#SVGID_4704_-1)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83435-2" />
+      <rect
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="331.20099"
+         clip-path="url(#SVGID_4704_-1)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83437-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="332.38199"
+         clip-path="url(#SVGID_4704_-1)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83439-4" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83441-7"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83443-2">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4705_-7"
+           d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102583-7">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4705_-7"
+           overflow="visible"
+           id="use102585-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102587-0"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.3544"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102589-5" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102591-0" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4707_-8)"
+         x="-636.69897"
+         y="331.974"
+         clip-path="url(#SVGID_4706_-25)"
+         width="5.3839998"
+         height="5.3860002"
+         id="rect83454-4" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83456-8"
+       inkscape:transform-center-x="498.30125"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83458-2">
+        <rect
+           id="SVGID_4708_-8"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102597-0">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4708_-8"
+           overflow="visible"
+           id="use102599-7" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4709_-6)"
+         d="m -634.639,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83464-3" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="329.87"
+         clip-path="url(#SVGID_4709_-6)"
+         width="9.5930004"
+         height="9.592"
+         id="rect83466-8" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="329.87"
+         clip-path="url(#SVGID_4709_-6)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.592"
+         id="rect83468-0" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="330.543"
+         clip-path="url(#SVGID_4709_-6)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83470-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="331.20099"
+         clip-path="url(#SVGID_4709_-6)"
+         width="6.9310002"
+         height="6.9299998"
+         id="rect83472-2" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="332.38199"
+         clip-path="url(#SVGID_4709_-6)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83474-0" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83476-5"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83478-8">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4710_-7"
+           d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102610-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4710_-7"
+           overflow="visible"
+           id="use102612-0" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102614-3"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3544"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102616-0" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102618-7" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4712_-3)"
+         x="-612.75598"
+         y="331.974"
+         clip-path="url(#SVGID_4711_-5)"
+         width="5.3829999"
+         height="5.3860002"
+         id="rect83489-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83491-9"
+       inkscape:transform-center-x="457.89686"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83493-3">
+        <rect
+           id="SVGID_4713_-2"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102624-1">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4713_-2"
+           overflow="visible"
+           id="use102626-1" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4714_-7)"
+         d="m -610.696,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83499-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-602.888"
+         y="329.87"
+         clip-path="url(#SVGID_4714_-7)"
+         width="9.592"
+         height="9.592"
+         id="rect83501-0" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-602.888"
+         y="329.87"
+         clip-path="url(#SVGID_4714_-7)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83503-1" />
+      <rect
+         style="fill:#81d0db"
+         x="-602.21698"
+         y="330.543"
+         clip-path="url(#SVGID_4714_-7)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83505-7" />
+      <rect
+         style="fill:#ffffff"
+         x="-601.55701"
+         y="331.20099"
+         clip-path="url(#SVGID_4714_-7)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83507-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-600.37799"
+         y="332.38199"
+         clip-path="url(#SVGID_4714_-7)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83509-7" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83511-7"
+       inkscape:transform-center-x="449.35694"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83513-5">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4715_-7"
+           d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102637-7">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4715_-7"
+           overflow="visible"
+           id="use102639-2" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102641-0"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3544"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102643-7" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102645-3" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4717_-52)"
+         x="-600.78497"
+         y="331.974"
+         clip-path="url(#SVGID_4716_-5)"
+         width="5.3829999"
+         height="5.3860002"
+         id="rect83524-7" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83526-2"
+       inkscape:transform-center-x="430.96208"
+       inkscape:transform-center-y="71.647547">
+      <defs
+         id="defs83528-5">
+        <rect
+           id="SVGID_4718_-5"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102651-0">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4718_-5"
+           overflow="visible"
+           id="use102653-4" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4719_-0)"
+         d="m -598.725,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83534-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="329.87"
+         clip-path="url(#SVGID_4719_-0)"
+         width="9.592"
+         height="9.592"
+         id="rect83536-2" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="329.87"
+         clip-path="url(#SVGID_4719_-0)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83538-7" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="330.543"
+         clip-path="url(#SVGID_4719_-0)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83540-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="331.20099"
+         clip-path="url(#SVGID_4719_-0)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83542-2" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="332.38199"
+         clip-path="url(#SVGID_4719_-0)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83544-4" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83546-3"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="71.649806">
+      <defs
+         id="defs83548-5">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4720_-7"
+           d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102664-4">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4720_-7"
+           overflow="visible"
+           id="use102666-8" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102668-0"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3544"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102670-7" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102672-2" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4722_-33)"
+         x="-588.81299"
+         y="331.974"
+         clip-path="url(#SVGID_4721_-50)"
+         width="5.3829999"
+         height="5.3860002"
+         id="rect83559-7" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4666,-25.59059)"
+       id="g83756-0"
+       inkscape:transform-center-x="610.97111"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83758-9">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4750_-6"
+           d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102826-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4750_-6"
+           overflow="visible"
+           id="use102828-9" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102830-6"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3541"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102832-7" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102834-9" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4752_-4)"
+         x="-672.61401"
+         y="343.75699"
+         clip-path="url(#SVGID_4751_-1)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83769-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83771-2"
+       inkscape:transform-center-x="592.57619"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83773-9">
+        <rect
+           id="SVGID_4753_-7"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102840-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4753_-7"
+           overflow="visible"
+           id="use102842-4" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4754_-0)"
+         d="m -670.553,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83779-9" />
+      <rect
+         style="fill:#ffffff"
+         x="-662.745"
+         y="341.65302"
+         clip-path="url(#SVGID_4754_-0)"
+         width="9.592"
+         height="9.592"
+         id="rect83781-6" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-662.74597"
+         y="341.65302"
+         clip-path="url(#SVGID_4754_-0)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83783-5" />
+      <rect
+         style="fill:#81d0db"
+         x="-662.07397"
+         y="342.32599"
+         clip-path="url(#SVGID_4754_-0)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83785-2" />
+      <rect
+         style="fill:#ffffff"
+         x="-661.414"
+         y="342.98401"
+         clip-path="url(#SVGID_4754_-0)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83787-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-660.23499"
+         y="344.164"
+         clip-path="url(#SVGID_4754_-0)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83789-9" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83791-4"
+       inkscape:transform-center-x="584.03412"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83793-0">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4755_-2"
+           d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102853-1">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4755_-2"
+           overflow="visible"
+           id="use102855-9" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102857-9"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.3541"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102859-0" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102861-9" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4757_-6)"
+         x="-660.64203"
+         y="343.75699"
+         clip-path="url(#SVGID_4756_-57)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83804-6" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83806-2"
+       inkscape:transform-center-x="565.64033"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83808-9">
+        <rect
+           id="SVGID_4758_-6"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102867-3">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4758_-6"
+           overflow="visible"
+           id="use102869-5" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4759_-5)"
+         d="m -658.582,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83814-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="341.65302"
+         clip-path="url(#SVGID_4759_-5)"
+         width="9.592"
+         height="9.592"
+         id="rect83816-2" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="341.65302"
+         clip-path="url(#SVGID_4759_-5)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83818-3" />
+      <rect
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="342.32599"
+         clip-path="url(#SVGID_4759_-5)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83820-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="342.98401"
+         clip-path="url(#SVGID_4759_-5)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83822-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="344.164"
+         clip-path="url(#SVGID_4759_-5)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83824-9" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83826-5"
+       inkscape:transform-center-x="557.09937"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83828-3">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4760_-8"
+           d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102880-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4760_-8"
+           overflow="visible"
+           id="use102882-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102884-8"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102886-2" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102888-2" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4762_-0)"
+         x="-648.67102"
+         y="343.75699"
+         clip-path="url(#SVGID_4761_-32)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83839-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83841-0"
+       inkscape:transform-center-x="538.70558"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83843-2">
+        <rect
+           id="SVGID_4763_-6"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102894-0">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4763_-6"
+           overflow="visible"
+           id="use102896-6" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4764_-8)"
+         d="m -646.611,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83849-9" />
+      <rect
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="341.65302"
+         clip-path="url(#SVGID_4764_-8)"
+         width="9.592"
+         height="9.592"
+         id="rect83851-9" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="341.65302"
+         clip-path="url(#SVGID_4764_-8)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83853-5" />
+      <rect
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="342.32599"
+         clip-path="url(#SVGID_4764_-8)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83855-9" />
+      <rect
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="342.98401"
+         clip-path="url(#SVGID_4764_-8)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83857-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="344.164"
+         clip-path="url(#SVGID_4764_-8)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83859-1" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83861-1"
+       inkscape:transform-center-x="530.16231"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83863-9">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4765_-7"
+           d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102907-7">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4765_-7"
+           overflow="visible"
+           id="use102909-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102911-0"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4299"
+         x2="256.3541"
+         y2="-148.4299"
+         gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102913-9" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102915-0" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4767_-9)"
+         x="-636.69897"
+         y="343.75699"
+         clip-path="url(#SVGID_4766_-0)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83874-3" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83876-5"
+       inkscape:transform-center-x="511.76858"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83878-1">
+        <rect
+           id="SVGID_4768_-0"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102921-8">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4768_-0"
+           overflow="visible"
+           id="use102923-0" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4769_-5)"
+         d="m -634.639,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83884-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-626.83099"
+         y="341.65302"
+         clip-path="url(#SVGID_4769_-5)"
+         width="9.592"
+         height="9.592"
+         id="rect83886-7" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-626.83099"
+         y="341.65302"
+         clip-path="url(#SVGID_4769_-5)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83888-0" />
+      <rect
+         style="fill:#81d0db"
+         x="-626.15997"
+         y="342.32599"
+         clip-path="url(#SVGID_4769_-5)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83890-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-625.5"
+         y="342.98401"
+         clip-path="url(#SVGID_4769_-5)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83892-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-624.32098"
+         y="344.164"
+         clip-path="url(#SVGID_4769_-5)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83894-2" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83896-1"
+       inkscape:transform-center-x="503.22762"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83898-4">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4770_-0"
+           d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102934-3">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4770_-0"
+           overflow="visible"
+           id="use102936-2" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102938-9"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102940-4" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102942-8" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4772_-5)"
+         x="-624.72803"
+         y="343.75699"
+         clip-path="url(#SVGID_4771_-8)"
+         width="5.3839998"
+         height="5.3839998"
+         id="rect83909-9" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83911-4"
+       inkscape:transform-center-x="484.83387"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83913-1">
+        <rect
+           id="SVGID_4773_-2"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102948-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4773_-2"
+           overflow="visible"
+           id="use102950-1" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4774_-60)"
+         d="m -622.668,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83919-9" />
+      <rect
+         style="fill:#ffffff"
+         x="-614.85999"
+         y="341.65302"
+         clip-path="url(#SVGID_4774_-60)"
+         width="9.5930004"
+         height="9.592"
+         id="rect83921-3" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-614.86102"
+         y="341.65302"
+         clip-path="url(#SVGID_4774_-60)"
+         stroke-miterlimit="10"
+         width="9.5930004"
+         height="9.592"
+         id="rect83923-1" />
+      <rect
+         style="fill:#81d0db"
+         x="-614.18799"
+         y="342.32599"
+         clip-path="url(#SVGID_4774_-60)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83925-1" />
+      <rect
+         style="fill:#ffffff"
+         x="-613.52899"
+         y="342.98401"
+         clip-path="url(#SVGID_4774_-60)"
+         width="6.9310002"
+         height="6.9299998"
+         id="rect83927-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-612.349"
+         y="344.164"
+         clip-path="url(#SVGID_4774_-60)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83929-6" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83931-6"
+       inkscape:transform-center-x="476.2917"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83933-7">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4775_-6"
+           d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102961-7">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4775_-6"
+           overflow="visible"
+           id="use102963-9" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102965-3"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102967-4" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102969-9" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4777_-42)"
+         x="-612.75598"
+         y="343.75699"
+         clip-path="url(#SVGID_4776_-8)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83944-6" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83946-6"
+       inkscape:transform-center-x="457.89686"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83948-3">
+        <rect
+           id="SVGID_4778_-7"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath102975-2">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4778_-7"
+           overflow="visible"
+           id="use102977-3" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4779_-83)"
+         d="m -610.696,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83954-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-602.888"
+         y="341.65302"
+         clip-path="url(#SVGID_4779_-83)"
+         width="9.592"
+         height="9.592"
+         id="rect83956-5" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-602.888"
+         y="341.65302"
+         clip-path="url(#SVGID_4779_-83)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83958-2" />
+      <rect
+         style="fill:#81d0db"
+         x="-602.21698"
+         y="342.32599"
+         clip-path="url(#SVGID_4779_-83)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83960-4" />
+      <rect
+         style="fill:#ffffff"
+         x="-601.55701"
+         y="342.98401"
+         clip-path="url(#SVGID_4779_-83)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83962-5" />
+      <rect
+         style="fill:#ffffff"
+         x="-600.37799"
+         y="344.164"
+         clip-path="url(#SVGID_4779_-83)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83964-3" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83966-0"
+       inkscape:transform-center-x="449.35694"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs83968-6">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4780_-6"
+           d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath102988-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4780_-6"
+           overflow="visible"
+           id="use102990-7" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient102992-7"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.4301"
+         x2="256.3541"
+         y2="-148.4301"
+         gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop102994-1" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop102996-1" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4782_-6)"
+         x="-600.78497"
+         y="343.75699"
+         clip-path="url(#SVGID_4781_-0)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect83979-0" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g83981-7"
+       inkscape:transform-center-x="430.96208"
+       inkscape:transform-center-y="98.159342">
+      <defs
+         id="defs83983-7">
+        <rect
+           id="SVGID_4783_-9"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103002-6">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4783_-9"
+           overflow="visible"
+           id="use103004-4" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4784_-5)"
+         d="m -598.725,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path83989-6" />
+      <rect
+         style="fill:#ffffff"
+         x="-590.91699"
+         y="341.65302"
+         clip-path="url(#SVGID_4784_-5)"
+         width="9.592"
+         height="9.592"
+         id="rect83991-7" />
+      <rect
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-590.91699"
+         y="341.65302"
+         clip-path="url(#SVGID_4784_-5)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.592"
+         id="rect83993-9" />
+      <rect
+         style="fill:#81d0db"
+         x="-590.24597"
+         y="342.32599"
+         clip-path="url(#SVGID_4784_-5)"
+         width="8.2480001"
+         height="8.2469997"
+         id="rect83995-0" />
+      <rect
+         style="fill:#ffffff"
+         x="-589.586"
+         y="342.98401"
+         clip-path="url(#SVGID_4784_-5)"
+         width="6.9299998"
+         height="6.9299998"
+         id="rect83997-8" />
+      <rect
+         style="fill:#ffffff"
+         x="-588.40698"
+         y="344.164"
+         clip-path="url(#SVGID_4784_-5)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect83999-5" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g84001-7"
+       inkscape:transform-center-x="422.41995"
+       inkscape:transform-center-y="98.159295">
+      <defs
+         id="defs84003-1">
+        <path
+           inkscape:connector-curvature="0"
+           id="SVGID_4785_-4"
+           d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692" />
+      </defs>
+      <clipPath
+         id="clipPath103015-1">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4785_-4"
+           overflow="visible"
+           id="use103017-4" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103019-6"
+         gradientUnits="userSpaceOnUse"
+         x1="255.3541"
+         y1="-148.42999"
+         x2="256.3541"
+         y2="-148.42999"
+         gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop103021-6" />
+        <stop
+           offset="1"
+           style="stop-color:#81D1DB"
+           id="stop103023-8" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4787_-8)"
+         x="-588.81299"
+         y="343.75699"
+         clip-path="url(#SVGID_4786_-1)"
+         width="5.3829999"
+         height="5.3839998"
+         id="rect84014-2" />
+    </g>
+    <text
+       y="567.96027"
+       x="435.21774"
+       id="text84236-1"
+       inkscape:transform-center-x="587.42372"
+       inkscape:transform-center-y="-90.601429"
+       style="font-size:27px">
+      <tspan
+         style="font-size:8px;fill:#37424b;font-family:ApexSans-Medium"
+         x="435.21774"
+         y="567.96027"
+         font-size="3.4203"
+         id="tspan84238-2">EU-EAST</tspan>
+    </text>
+    <rect
+       style="fill:#f15d57"
+       x="399.26007"
+       y="492.96008"
+       width="103.6395"
+       height="3.8114998"
+       id="rect84318-4"
+       inkscape:transform-center-x="587.03108"
+       inkscape:transform-center-y="-160.89453" />
+    <g
+       transform="translate(328.69122,-0.03041)"
+       id="g9328-2">
+      <line
+         id="line84244-3-6"
+         y2="533.36865"
+         x2="121.81088"
+         y1="315.62341"
+         x1="121.81088"
+         stroke-miterlimit="10"
+         style="fill:none;stroke:#5e6a71;stroke-width:1.0268178;stroke-miterlimit:10;stroke-dasharray:3.07565499, 3.07565499" />
+      <g
+         id="g82107-4-5"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs82109-6-6">
+          <polygon
+             points="-504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 "
+             id="SVGID_4519_-5-8" />
+        </defs>
+        <clipPath
+           id="clipPath126820-6-9">
+          <use
+             id="use126822-8-2"
+             overflow="visible"
+             xlink:href="#SVGID_4519_-5-8"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+           y2="146.6937"
+           x2="41.840599"
+           y1="146.6937"
+           x1="40.840599"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient126824-4-4">
+          <stop
+             id="stop126826-2-0"
+             style="stop-color:#37424B"
+             offset="0" />
+          <stop
+             id="stop126828-3-6"
+             style="stop-color:#37424B"
+             offset="0.12" />
+          <stop
+             id="stop126830-7-8"
+             style="stop-color:#5E6A71"
+             offset="0.88" />
+          <stop
+             id="stop126832-6-2"
+             style="stop-color:#5E6A71"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82124-4-8"
+           height="10.191"
+           width="42.327"
+           clip-path="url(#SVGID_4520_-5-6-7)"
+           y="188.287"
+           x="-547.302"
+           style="fill:url(#linearGradient126904-61-3)" />
+      </g>
+      <g
+         id="g82126-0-8"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs82128-8-2">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4522_-8-1" />
+        </defs>
+        <clipPath
+           id="clipPath126838-9-7">
+          <use
+             id="use126840-87-3"
+             overflow="visible"
+             xlink:href="#SVGID_4522_-8-1"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82134-5-4"
+           d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <path
+           id="path82136-0-8"
+           d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <circle
+           id="circle82138-2-3"
+           r="0.63999999"
+           cy="191.26801"
+           cx="-541.625"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           d="m -540.985,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+           sodipodi:cx="-541.625"
+           sodipodi:cy="191.26801"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <circle
+           id="circle82140-3-7"
+           r="0.63999999"
+           cy="193.623"
+           cx="-541.625"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           d="m -540.985,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+           sodipodi:cx="-541.625"
+           sodipodi:cy="193.623"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <circle
+           id="circle82142-3-6"
+           r="0.63999999"
+           cy="191.26801"
+           cx="-543.85303"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           d="m -543.21303,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+           sodipodi:cx="-543.85303"
+           sodipodi:cy="191.26801"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <circle
+           id="circle82144-4-4"
+           r="0.63999999"
+           cy="193.623"
+           cx="-543.854"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           d="m -543.214,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35347,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28653,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+           sodipodi:cx="-543.854"
+           sodipodi:cy="193.623"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <path
+           id="path82146-1-5"
+           d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <path
+           id="path82148-5-2"
+           d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
+           clip-path="url(#SVGID_4523_-1-5-1)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+      </g>
+      <text
+         style="font-size:40.5px"
+         id="text82150-7-1"
+         x="112.11884"
+         y="319.30515">
+        <tspan
+           id="tspan82152-4-3"
+           font-size="3.2027"
+           y="319.30515"
+           x="112.11884"
+           style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium">AP</tspan>
+        <tspan
+           id="tspan82154-9-7"
+           font-size="3.2027"
+           y="319.30515"
+           x="125.80093"
+           style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium">P</tspan>
+      </text>
+      <g
+         id="g84638-4-9"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs84640-9-8">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4852_-4-9" />
+        </defs>
+        <clipPath
+           id="clipPath126879-0-5">
+          <use
+             id="use126881-7-3"
+             overflow="visible"
+             xlink:href="#SVGID_4852_-4-9"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path84646-0-7"
+           d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4853_-8-0-4)"
+           inkscape:connector-curvature="0"
+           style="fill:#5e6a71" />
+        <line
+           id="line84648-6-5"
+           y2="205.991"
+           x2="-523.14398"
+           y1="205.991"
+           x1="-526.03998"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4853_-8-0-4)"
+           style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10" />
+      </g>
+      <g
+         id="g84650-5-5"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs84652-4-9">
+          <polygon
+             points="-521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 -507.673,203.458 "
+             id="SVGID_4854_-1-2" />
+        </defs>
+        <clipPath
+           id="clipPath126888-1-5">
+          <use
+             id="use126890-4-7"
+             overflow="visible"
+             xlink:href="#SVGID_4854_-1-2"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)"
+           y2="249.94031"
+           x2="-33.205101"
+           y1="249.94031"
+           x1="-34.205299"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient126892-7-0">
+          <stop
+             id="stop126894-5-7"
+             style="stop-color:#E6E8E7"
+             offset="0" />
+          <stop
+             id="stop126896-6-7"
+             style="stop-color:#FFFFFF"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect84663-7-0"
+           height="5.066"
+           width="15.759"
+           clip-path="url(#SVGID_4855_-2-24-5)"
+           y="203.45799"
+           x="-523.43201"
+           style="fill:url(#SVGID_4856_-4-1-0)" />
+      </g>
+      <polygon
+         id="polygon84665-6-1"
+         points="-521.64,203.459 -523.433,206 -521.64,208.524 -507.674,208.524 -507.674,203.459 "
+         stroke-miterlimit="10"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)"
+         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10" />
+      <text
+         style="font-size:40.5px"
+         id="text84667-5-9"
+         x="151.0986"
+         y="363.4711">
+        <tspan
+           id="tspan84669-5-9"
+           font-size="2.5652"
+           y="363.4711"
+           x="151.0986"
+           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">RE</tspan>
+        <tspan
+           id="tspan84671-5-4"
+           font-size="2.5652"
+           y="363.4711"
+           x="160.27521"
+           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">S</tspan>
+        <tspan
+           id="tspan84673-2-5"
+           font-size="2.5652"
+           y="363.4711"
+           x="164.41296"
+           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">T</tspan>
+      </text>
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g84320-7"
+       inkscape:transform-center-x="587.03111"
+       inkscape:transform-center-y="-131.54432">
+      <defs
+         id="defs84322-0">
+        <polygon
+           id="SVGID_4826_-2"
+           points="-659.342,256.788 -636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 " />
+      </defs>
+      <clipPath
+         id="clipPath103260-5">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4826_-2"
+           overflow="visible"
+           id="use103262-4" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103264-9"
+         gradientUnits="userSpaceOnUse"
+         x1="145.3168"
+         y1="2.8518"
+         x2="146.3168"
+         y2="2.8518"
+         gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+        <stop
+           offset="0"
+           style="stop-color:#FFFFFF"
+           id="stop103266-7" />
+        <stop
+           offset="0.23"
+           style="stop-color:#FFFFFF"
+           id="stop103268-8" />
+        <stop
+           offset="0.5671"
+           style="stop-color:#F9F9F9"
+           id="stop103270-3" />
+        <stop
+           offset="0.8674"
+           style="stop-color:#EDEEEE"
+           id="stop103272-6" />
+        <stop
+           offset="1"
+           style="stop-color:#E6E8E7"
+           id="stop103274-7" />
+      </linearGradient>
+      <polygon
+         style="fill:url(#SVGID_4828_-8)"
+         clip-path="url(#SVGID_4827_-1)"
+         points="-682.238,231.929 -636.356,231.874 -636.326,256.788 -682.208,256.843 "
+         id="polygon84339-1" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 399.73931,496.49039 102.67875,0.009 10e-4,43.1055 -51.4755,12.33 -51.20775,-12.46725 0.002,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.687,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.6395,-0.009 z"
+       id="path84341-5"
+       inkscape:transform-center-x="587.03109"
+       inkscape:transform-center-y="-131.54096" />
+    <text
+       y="513.25391"
+       x="422.89722"
+       id="text84343-4"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px">
+      <tspan
+         style="font-size:11px;fill:#37424b;font-family:ApexSans-Book"
+         x="422.89722"
+         y="513.25391"
+         font-size="5.1244"
+         id="tspan84345-6">RADOSGW</tspan>
+    </text>
+    <line
+       style="fill:none;stroke:#5e6a71;stroke-width:0.48150003;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
+       stroke-miterlimit="10"
+       x1="450.98538"
+       y1="577.31482"
+       x2="450.98538"
+       y2="631.69733"
+       id="line84349-2"
+       inkscape:transform-center-x="587.12555"
+       inkscape:transform-center-y="-51.254289" />
+    <polyline
+       style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       stroke-miterlimit="10"
+       points="  -669.837,292.128 -669.837,283.832 -648.812,283.832 -648.812,292.128 "
+       id="polyline84351-0"
+       inkscape:transform-center-x="587.12673"
+       inkscape:transform-center-y="-33.395941" />
+    <polygon
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       points="-657.251,267.424 -661.37,267.424 -659.319,269.217 "
+       id="polygon84353-1"
+       inkscape:transform-center-x="587.09523"
+       inkscape:transform-center-y="-77.629816" />
+    <polygon
+       id="polygon84546-2"
+       points="-671.896,292.47 -669.845,294.263 -667.777,292.47 "
+       clip-path="url(#SVGID_4843_-5)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <polygon
+       id="polygon84548-8"
+       points="-661.384,292.47 -659.333,294.263 -657.265,292.47 "
+       clip-path="url(#SVGID_4843_-5)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <polygon
+       id="polygon84550-0"
+       points="-650.871,292.47 -648.82,294.263 -646.752,292.47 "
+       clip-path="url(#SVGID_4843_-5)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g84753-5"
+       inkscape:transform-center-x="584.45598"
+       inkscape:transform-center-y="-60.127066">
+      <defs
+         id="defs84755-4">
+        <rect
+           id="SVGID_4867_-0"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103568-9">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4867_-0"
+           overflow="visible"
+           id="use103570-2" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4868_-1)"
+         d="m -659.955,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84761-2" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#SVGID_4868_-1)"
+         stroke-miterlimit="10"
+         x1="-659.323"
+         y1="276.099"
+         x2="-656.427"
+         y2="276.099"
+         id="line84763-3" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       id="g84765-0"
+       inkscape:transform-center-x="563.5265"
+       inkscape:transform-center-y="-60.127083">
+      <defs
+         id="defs84767-2">
+        <polygon
+           id="SVGID_4869_-7"
+           points="-656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 " />
+      </defs>
+      <clipPath
+         id="clipPath103577-0">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4869_-7"
+           overflow="visible"
+           id="use103579-1" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103581-2"
+         gradientUnits="userSpaceOnUse"
+         x1="-34.205299"
+         y1="249.94051"
+         x2="-33.205299"
+         y2="249.94051"
+         gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+        <stop
+           offset="0"
+           style="stop-color:#E6E8E7"
+           id="stop103583-7" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop103585-7" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4871_-4)"
+         x="-656.71503"
+         y="273.56699"
+         clip-path="url(#SVGID_4870_-0)"
+         width="15.759"
+         height="5.0650001"
+         id="rect84778-5" />
+    </g>
+    <polygon
+       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1934.4644,-25.59059)"
+       stroke-miterlimit="10"
+       points="-656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 "
+       id="polygon84780-4"
+       inkscape:transform-center-x="563.52648"
+       inkscape:transform-center-y="-60.127066" />
+    <text
+       y="597.59412"
+       x="466.59583"
+       id="text84782-6"
+       inkscape:transform-center-x="562.26258"
+       inkscape:transform-center-y="-60.270044"
+       style="font-size:27px">
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="466.59583"
+         y="597.59412"
+         font-size="2.5652"
+         id="tspan84784-6">N</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="470.47482"
+         y="597.59412"
+         font-size="2.5652"
+         id="tspan84786-0">A</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="473.54385"
+         y="597.59412"
+         font-size="2.5652"
+         id="tspan84788-6">TIV</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="481.25684"
+         y="597.59412"
+         font-size="2.5652"
+         id="tspan84790-4">E</tspan>
+    </text>
+    <g
+       transform="matrix(1.3542118,0,0,2.25,1325.4162,-31.59059)"
+       id="g84792-1"
+       inkscape:transform-center-x="262.77489"
+       inkscape:transform-center-y="141.90493">
+      <defs
+         id="defs84794-1">
+        <rect
+           id="SVGID_4872_-8"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103597-2">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4872_-8"
+           overflow="visible"
+           id="use103599-5" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4873_-98)"
+         d="m -438.652,188.287 c 0,0.349 -0.282,0.632 -0.632,0.632 -0.349,0 -0.632,-0.283 -0.632,-0.632 0,-0.35 0.283,-0.633 0.632,-0.633 0.35,0 0.632,0.284 0.632,0.633"
+         id="path84800-2" />
+      <g
+         clip-path="url(#SVGID_4873_-98)"
+         id="g84802-7">
+        <g
+           id="g84804-9">
+          <defs
+             id="defs84806-7">
+            <rect
+               id="SVGID_4874_-4"
+               x="-679.90002"
+               y="360.13901"
+               width="174.95799"
+               height="10.152" />
+          </defs>
+          <clipPath
+             id="clipPath103606-3">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4874_-4"
+               overflow="visible"
+               id="use103608-9" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4875_-1)"
+             id="g84812-3">
+            <defs
+               id="defs84814-8">
+              <rect
+                 id="SVGID_4876_-1"
+                 x="-679.90002"
+                 y="360.13901"
+                 width="174.95799"
+                 height="10.152" />
+            </defs>
+            <clipPath
+               id="clipPath103613-6">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4876_-1"
+                 overflow="visible"
+                 id="use103615-0" />
+            </clipPath>
+            <linearGradient
+               id="linearGradient103617-6"
+               gradientUnits="userSpaceOnUse"
+               x1="40.563"
+               y1="147.0757"
+               x2="41.563"
+               y2="147.0757"
+               gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+              <stop
+                 offset="0"
+                 style="stop-color:#55AEB9"
+                 id="stop103619-5" />
+              <stop
+                 offset="0.486"
+                 style="stop-color:#B0D2D9"
+                 id="stop103621-2" />
+              <stop
+                 offset="0.8287"
+                 style="stop-color:#E6EFF1"
+                 id="stop103623-9" />
+              <stop
+                 offset="0.9939"
+                 style="stop-color:#FFFFFF"
+                 id="stop103625-9" />
+              <stop
+                 offset="1"
+                 style="stop-color:#FFFFFF"
+                 id="stop103627-0" />
+            </linearGradient>
+            <rect
+               style="fill:url(#SVGID_4878_-2)"
+               x="-679.90002"
+               y="360.138"
+               clip-path="url(#SVGID_4877_-4)"
+               width="174.95799"
+               height="10.153"
+               id="rect84831-7" />
+          </g>
+        </g>
+      </g>
+      <g
+         clip-path="url(#SVGID_4873_-98)"
+         id="g84833-5">
+        <g
+           id="g84835-6">
+          <defs
+             id="defs84837-5">
+            <rect
+               id="SVGID_4879_-3"
+               x="-679.88898"
+               y="360.13901"
+               width="174.94701"
+               height="10.152" />
+          </defs>
+          <clipPath
+             id="clipPath103634-6">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4879_-3"
+               overflow="visible"
+               id="use103636-3" />
+          </clipPath>
+          <g
+             clip-path="url(#SVGID_4880_-2)"
+             id="g84843-9">
+            <defs
+               id="defs84845-0">
+              <rect
+                 id="SVGID_4881_-4"
+                 x="-679.88898"
+                 y="360.138"
+                 width="174.94701"
+                 height="10.153" />
+            </defs>
+            <clipPath
+               id="clipPath103641-9">
+              <use
+                 height="1052.3622"
+                 width="744.09448"
+                 y="0"
+                 x="0"
+                 style="overflow:visible"
+                 xlink:href="#SVGID_4881_-4"
+                 overflow="visible"
+                 id="use103643-2" />
+            </clipPath>
+            <polygon
+               style="fill:#f15d57"
+               clip-path="url(#SVGID_4882_-3)"
+               points="-504.943,360.138 -679.89,360.139 -679.89,364.81 -679.89,367.139 -679.89,370.291 -504.943,370.291 "
+               id="polygon84851-1" />
+          </g>
+        </g>
+      </g>
+      <rect
+         style="fill:#f15d57"
+         x="-679.90198"
+         y="360.267"
+         clip-path="url(#SVGID_4873_-98)"
+         width="174.96001"
+         height="2.641"
+         id="rect84853-2" />
+      <rect
+         style="fill:#55aeb9"
+         x="-679.88898"
+         y="370.29199"
+         clip-path="url(#SVGID_4873_-98)"
+         width="174.94701"
+         height="1.352"
+         id="rect84855-1" />
+    </g>
+    <text
+       y="832.0752"
+       x="571.10132"
+       id="text84343-2-09"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="526.12915"
+         y="832.0752"
+         font-size="5.1244"
+         id="tspan84345-2-7">SECONDARY REGION</tspan>
+    </text>
+    <polygon
+       id="polygon84546-9-3-6"
+       points="-667.777,292.47 -671.896,292.47 -669.845,294.263 "
+       clip-path="url(#SVGID_4843_-9-6-5)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1917.6233,-169.74298)" />
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="450.92264"
+       y="529.61548"
+       id="text126655-6-3"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan126657-2-8"
+         x="450.92264"
+         y="529.61548">MASTER</tspan><tspan
+         sodipodi:role="line"
+         x="450.92264"
+         y="540.86548"
+         id="tspan126659-4-8">ZONE</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="363.76648"
+       y="400.13824"
+       id="text127418-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan127420-8"
+         x="363.76648"
+         y="400.13824">METADATA</tspan><tspan
+         sodipodi:role="line"
+         x="363.76648"
+         y="411.38824"
+         id="tspan127422-7">SYNC</tspan></text>
+    <text
+       y="247.57471"
+       x="491.10132"
+       id="text84343-2-0-2"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="446.12915"
+         y="247.57471"
+         font-size="5.1244"
+         id="tspan84345-2-6-0">SECONDARY REGION</tspan>
+    </text>
+    <text
+       y="705.34888"
+       x="583.92261"
+       style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+       font-size="4.3343"
+       id="text82351-9-7"
+       inkscape:transform-center-x="450.06672"
+       inkscape:transform-center-y="45.543285">M</text>
+    <g
+       id="g9504-6"
+       transform="translate(98.691216,33.96959)">
+      <g
+         inkscape:transform-center-y="45.666809"
+         inkscape:transform-center-x="449.81598"
+         id="g82339-6-5"
+         transform="matrix(2.25,0,0,2.25,1701.0081,-85.193202)">
+        <defs
+           id="defs82341-9-3">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4549_-8-0" />
+        </defs>
+        <clipPath
+           id="clipPath101738-3-9">
+          <use
+             id="use101740-3-4"
+             overflow="visible"
+             xlink:href="#SVGID_4549_-8-0"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82347-9-8"
+           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           clip-path="url(#SVGID_4550_-6-4)"
+           inkscape:connector-curvature="0"
+           style="fill:#f15d57" />
+        <path
+           id="path82349-9-3"
+           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4550_-6-4)"
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+      </g>
+      <text
+         inkscape:transform-center-y="45.543285"
+         inkscape:transform-center-x="450.06672"
+         id="text82351-9-4-7"
+         font-size="4.3343"
+         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="350.6293"
+         y="645.37921">M</text>
+    </g>
+    <path
+       id="path82449-2-4"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-39)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,2096.2338,-25.49647)" />
+    <path
+       id="path82449-2-2-4"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-3-3)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,1907.5274,-25.10599)" />
+    <path
+       id="path82449-2-0-6"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-9-8)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,2096.2338,0.56753)" />
+    <path
+       id="path82449-2-0-1-9"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-9-3-43)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,2096.3338,26.56753)" />
+    <path
+       id="path82449-2-0-1-5-7"
+       d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+       clip-path="url(#SVGID_4564_-7-9-3-4-4)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(2.25,0,0,2.25,2096.4335,53.16753)" />
+    <text
+       y="293.44104"
+       x="496.78619"
+       id="text84343-2-0-4-8"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="451.81403"
+         y="293.44104"
+         font-size="5.1244"
+         id="tspan84345-2-6-5-9">WRITE / READ</tspan>
+    </text>
+    <text
+       y="262.3537"
+       x="490.88916"
+       id="text84343-2-0-4-6-1"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="445.91699"
+         y="262.3537"
+         font-size="5.1244"
+         id="tspan84345-2-6-5-6-6">(Europe)</tspan>
+    </text>
+    <g
+       id="g15866"
+       transform="translate(66.384186,10.199929)">
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82381-2-3"
+         height="21.584251"
+         width="21.581999"
+         y="680.3775"
+         x="349.96692"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82383-1-0"
+         height="21.584251"
+         width="21.581999"
+         stroke-miterlimit="10"
+         y="680.3775"
+         x="349.96692"
+         style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10" />
+      <rect
+         inkscape:transform-center-y="19.598295"
+         inkscape:transform-center-x="610.97115"
+         id="rect82385-3-3"
+         height="18.553501"
+         width="18.557999"
+         y="681.89398"
+         x="351.47656"
+         style="fill:#81d0db" />
+      <rect
+         inkscape:transform-center-y="19.597131"
+         inkscape:transform-center-x="610.96883"
+         id="rect82387-5-5"
+         height="15.594751"
+         width="15.592501"
+         y="683.37219"
+         x="352.96164"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.595982"
+         inkscape:transform-center-x="610.97103"
+         id="rect82389-9-0"
+         height="10.278"
+         width="10.282501"
+         y="686.02936"
+         x="355.61444"
+         style="fill:#ffffff" />
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="610.97111"
+         id="g82391-8-0"
+         transform="matrix(2.25,0,0,2.25,1868.0802,-9.7784893)">
+        <defs
+           id="defs82393-4-0">
+          <path
+             d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4555_-7-9"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101773-5-5">
+          <use
+             id="use101775-6-5"
+             overflow="visible"
+             xlink:href="#SVGID_4555_-7-9"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+           y2="-148.46021"
+           x2="256.3761"
+           y1="-148.46021"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101777-2-8">
+          <stop
+             id="stop101779-4-4"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101781-1-3"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82404-9-9"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4556_-9-2)"
+           y="308.841"
+           x="-672.61401"
+           style="fill:url(#linearGradient15887)" />
+      </g>
+      <path
+         transform="matrix(2.25,0,0,2.25,1841.021,-9.2938893)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-3-3-7)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-2-4-4" />
+    </g>
+    <g
+       id="g15866-2"
+       transform="translate(66.384186,36.234929)">
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82381-2-3-5"
+         height="21.584251"
+         width="21.581999"
+         y="680.3775"
+         x="349.96692"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82383-1-0-2"
+         height="21.584251"
+         width="21.581999"
+         stroke-miterlimit="10"
+         y="680.3775"
+         x="349.96692"
+         style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10" />
+      <rect
+         inkscape:transform-center-y="19.598295"
+         inkscape:transform-center-x="610.97115"
+         id="rect82385-3-3-6"
+         height="18.553501"
+         width="18.557999"
+         y="681.89398"
+         x="351.47656"
+         style="fill:#81d0db" />
+      <rect
+         inkscape:transform-center-y="19.597131"
+         inkscape:transform-center-x="610.96883"
+         id="rect82387-5-5-5"
+         height="15.594751"
+         width="15.592501"
+         y="683.37219"
+         x="352.96164"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.595982"
+         inkscape:transform-center-x="610.97103"
+         id="rect82389-9-0-6"
+         height="10.278"
+         width="10.282501"
+         y="686.02936"
+         x="355.61444"
+         style="fill:#ffffff" />
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="610.97111"
+         id="g82391-8-0-8"
+         transform="matrix(2.25,0,0,2.25,1868.0802,-9.7784893)">
+        <defs
+           id="defs82393-4-0-3">
+          <path
+             d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4555_-7-9-1"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101773-5-5-0">
+          <use
+             id="use101775-6-5-6"
+             overflow="visible"
+             xlink:href="#SVGID_4555_-7-9-1"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+           y2="-148.46021"
+           x2="256.3761"
+           y1="-148.46021"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101777-2-8-6">
+          <stop
+             id="stop101779-4-4-3"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101781-1-3-8"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82404-9-9-8"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4556_-9-2-5)"
+           y="308.841"
+           x="-672.61401"
+           style="fill:url(#linearGradient15887-0)" />
+      </g>
+      <path
+         transform="matrix(2.25,0,0,2.25,1841.021,-9.2938893)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-3-3-7-5)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-2-4-4-2" />
+    </g>
+    <g
+       id="g15866-2-3"
+       transform="translate(66.384186,62.334929)">
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82381-2-3-5-9"
+         height="21.584251"
+         width="21.581999"
+         y="680.3775"
+         x="349.96692"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82383-1-0-2-8"
+         height="21.584251"
+         width="21.581999"
+         stroke-miterlimit="10"
+         y="680.3775"
+         x="349.96692"
+         style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10" />
+      <rect
+         inkscape:transform-center-y="19.598295"
+         inkscape:transform-center-x="610.97115"
+         id="rect82385-3-3-6-8"
+         height="18.553501"
+         width="18.557999"
+         y="681.89398"
+         x="351.47656"
+         style="fill:#81d0db" />
+      <rect
+         inkscape:transform-center-y="19.597131"
+         inkscape:transform-center-x="610.96883"
+         id="rect82387-5-5-5-5"
+         height="15.594751"
+         width="15.592501"
+         y="683.37219"
+         x="352.96164"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.595982"
+         inkscape:transform-center-x="610.97103"
+         id="rect82389-9-0-6-5"
+         height="10.278"
+         width="10.282501"
+         y="686.02936"
+         x="355.61444"
+         style="fill:#ffffff" />
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="610.97111"
+         id="g82391-8-0-8-1"
+         transform="matrix(2.25,0,0,2.25,1868.0802,-9.7784893)">
+        <defs
+           id="defs82393-4-0-3-9">
+          <path
+             d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4555_-7-9-1-0"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101773-5-5-0-4">
+          <use
+             id="use101775-6-5-6-5"
+             overflow="visible"
+             xlink:href="#SVGID_4555_-7-9-1-0"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+           y2="-148.46021"
+           x2="256.3761"
+           y1="-148.46021"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101777-2-8-6-8">
+          <stop
+             id="stop101779-4-4-3-2"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101781-1-3-8-5"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82404-9-9-8-1"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4556_-9-2-5-8)"
+           y="308.841"
+           x="-672.61401"
+           style="fill:url(#linearGradient15887-0-3)" />
+      </g>
+      <path
+         transform="matrix(2.25,0,0,2.25,1841.021,-9.2938893)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-3-3-7-5-3)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-2-4-4-2-3" />
+    </g>
+  </g>
+</svg>
diff --git a/doc/images/stack.png b/doc/images/stack.png
new file mode 100644
index 0000000..38eac41
Binary files /dev/null and b/doc/images/stack.png differ
diff --git a/doc/images/zone-sync.png b/doc/images/zone-sync.png
new file mode 100644
index 0000000..c7bf9ef
Binary files /dev/null and b/doc/images/zone-sync.png differ
diff --git a/doc/images/zone-sync.svg b/doc/images/zone-sync.svg
new file mode 100644
index 0000000..e0bcb0c
--- /dev/null
+++ b/doc/images/zone-sync.svg
@@ -0,0 +1,21935 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg104536"
+   version="1.1"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="zone-sync.svg"
+   inkscape:export-filename="/home/john/Pictures/zone-sync.png"
+   inkscape:export-xdpi="90"
+   inkscape:export-ydpi="90">
+  <defs
+     id="defs104538">
+    <linearGradient
+       id="linearGradient126200"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4884_">
+      <rect
+         height="11.504"
+         width="174.63"
+         y="360.13901"
+         x="-679.57202"
+         id="use84863" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4886_">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use84873" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4888_">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use84881" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4890_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-535.73901"
+         id="use84891" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4892_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-535.73901"
+         id="use84899" />
+    </clipPath>
+    <clipPath
+       id="clipPath99071">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99073" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4894_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-536.966"
+         id="use84911" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4896_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-536.966"
+         id="use84919" />
+    </clipPath>
+    <clipPath
+       id="clipPath99079">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99081" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4898_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-538.19202"
+         id="use84931" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4900_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-538.19202"
+         id="use84939" />
+    </clipPath>
+    <clipPath
+       id="clipPath99087">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99089" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4902_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-539.41901"
+         id="use84951" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4904_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-539.41901"
+         id="use84959" />
+    </clipPath>
+    <clipPath
+       id="clipPath99095">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99097" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4906_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-540.646"
+         id="use84971" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4908_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-540.646"
+         id="use84979" />
+    </clipPath>
+    <clipPath
+       id="clipPath99103">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99105" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4910_">
+      <rect
+         height="67.402"
+         width="42.448002"
+         y="350.939"
+         x="-541.87299"
+         id="use84991" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4912_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-541.87299"
+         id="use84999" />
+    </clipPath>
+    <clipPath
+       id="clipPath99111">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99113" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4914_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-543.099"
+         id="use85011" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4916_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-543.099"
+         id="use85019" />
+    </clipPath>
+    <clipPath
+       id="clipPath99119">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99121" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4918_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-544.32599"
+         id="use85031" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4920_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-544.32599"
+         id="use85039" />
+    </clipPath>
+    <clipPath
+       id="clipPath99127">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99129" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4922_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-545.55298"
+         id="use85051" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4924_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-545.55298"
+         id="use85059" />
+    </clipPath>
+    <clipPath
+       id="clipPath99135">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99137" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4926_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-546.77899"
+         id="use85071" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4928_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-546.77899"
+         id="use85079" />
+    </clipPath>
+    <clipPath
+       id="clipPath99143">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99145" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4930_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-548.00598"
+         id="use85091" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4932_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-548.00598"
+         id="use85099" />
+    </clipPath>
+    <clipPath
+       id="clipPath99151">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99153" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4934_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-549.23297"
+         id="use85111" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4936_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-549.23297"
+         id="use85119" />
+    </clipPath>
+    <clipPath
+       id="clipPath99159">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99161" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4938_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-550.46002"
+         id="use85131" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4940_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-550.46002"
+         id="use85139" />
+    </clipPath>
+    <clipPath
+       id="clipPath99167">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99169" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4942_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-551.68597"
+         id="use85151" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4944_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-551.68597"
+         id="use85159" />
+    </clipPath>
+    <clipPath
+       id="clipPath99175">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99177" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4946_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-552.91302"
+         id="use85171" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4948_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-552.91302"
+         id="use85179" />
+    </clipPath>
+    <clipPath
+       id="clipPath99183">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99185" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4950_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-554.14001"
+         id="use85191" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4952_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-554.14001"
+         id="use85199" />
+    </clipPath>
+    <clipPath
+       id="clipPath99191">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99193" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4954_">
+      <rect
+         height="67.402"
+         width="42.446999"
+         y="350.939"
+         x="-555.367"
+         id="use85211" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4956_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-555.367"
+         id="use85219" />
+    </clipPath>
+    <clipPath
+       id="clipPath99199">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99201" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4958_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-556.59302"
+         id="use85231" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4960_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-556.59302"
+         id="use85239" />
+    </clipPath>
+    <clipPath
+       id="clipPath99207">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99209" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4962_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-557.82001"
+         id="use85251" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4964_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-557.82001"
+         id="use85259" />
+    </clipPath>
+    <clipPath
+       id="clipPath99215">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99217" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4966_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-559.047"
+         id="use85271" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4968_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-559.047"
+         id="use85279" />
+    </clipPath>
+    <clipPath
+       id="clipPath99223">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99225" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4970_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-560.27301"
+         id="use85291" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4972_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-560.27301"
+         id="use85299" />
+    </clipPath>
+    <clipPath
+       id="clipPath99231">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99233" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4974_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-561.5"
+         id="use85311" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4976_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-561.5"
+         id="use85319" />
+    </clipPath>
+    <clipPath
+       id="clipPath99239">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99241" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4978_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-562.72699"
+         id="use85331" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4980_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-562.72699"
+         id="use85339" />
+    </clipPath>
+    <clipPath
+       id="clipPath99247">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99249" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4982_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-563.95398"
+         id="use85351" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4984_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-563.95398"
+         id="use85359" />
+    </clipPath>
+    <clipPath
+       id="clipPath99255">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99257" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4986_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-565.17999"
+         id="use85371" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4988_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-565.17999"
+         id="use85379" />
+    </clipPath>
+    <clipPath
+       id="clipPath99263">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99265" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4990_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-566.40698"
+         id="use85391" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4992_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-566.40698"
+         id="use85399" />
+    </clipPath>
+    <clipPath
+       id="clipPath99271">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99273" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4994_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-567.63397"
+         id="use85411" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4996_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-567.63397"
+         id="use85419" />
+    </clipPath>
+    <clipPath
+       id="clipPath99279">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99281" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4998_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-568.86102"
+         id="use85431" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5000_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-568.86102"
+         id="use85439" />
+    </clipPath>
+    <clipPath
+       id="clipPath99287">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99289" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5002_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-570.08698"
+         id="use85451" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5004_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-570.08698"
+         id="use85459" />
+    </clipPath>
+    <clipPath
+       id="clipPath99295">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99297" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5006_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-571.315"
+         id="use85471" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5008_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-571.31403"
+         id="use85479" />
+    </clipPath>
+    <clipPath
+       id="clipPath99303">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99305" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5010_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-572.54102"
+         id="use85491" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5012_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-572.54102"
+         id="use85499" />
+    </clipPath>
+    <clipPath
+       id="clipPath99311">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99313" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5014_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-573.76801"
+         id="use85511" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5016_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-573.76801"
+         id="use85519" />
+    </clipPath>
+    <clipPath
+       id="clipPath99319">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99321" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5018_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-574.99402"
+         id="use85531" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5020_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-574.99402"
+         id="use85539" />
+    </clipPath>
+    <clipPath
+       id="clipPath99327">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99329" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5022_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-576.22101"
+         id="use85551" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5024_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-576.22101"
+         id="use85559" />
+    </clipPath>
+    <clipPath
+       id="clipPath99335">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99337" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5026_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-577.448"
+         id="use85571" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5028_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-577.448"
+         id="use85579" />
+    </clipPath>
+    <clipPath
+       id="clipPath99343">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99345" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5030_">
+      <rect
+         height="67.402"
+         width="42.445999"
+         y="350.939"
+         x="-578.67499"
+         id="use85591" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5032_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-578.67499"
+         id="use85599" />
+    </clipPath>
+    <clipPath
+       id="clipPath99351">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99353" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5034_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-579.901"
+         id="use85611" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5036_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-579.901"
+         id="use85619" />
+    </clipPath>
+    <clipPath
+       id="clipPath99359">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99361" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5038_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-581.12799"
+         id="use85631" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5040_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-581.12799"
+         id="use85639" />
+    </clipPath>
+    <clipPath
+       id="clipPath99367">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99369" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5042_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-582.35498"
+         id="use85651" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5044_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-582.35498"
+         id="use85659" />
+    </clipPath>
+    <clipPath
+       id="clipPath99375">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99377" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5046_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-583.58197"
+         id="use85671" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5048_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-583.58197"
+         id="use85679" />
+    </clipPath>
+    <clipPath
+       id="clipPath99383">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99385" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5050_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-584.80798"
+         id="use85691" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5052_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-584.80798"
+         id="use85699" />
+    </clipPath>
+    <clipPath
+       id="clipPath99391">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99393" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5054_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-586.03497"
+         id="use85711" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5056_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-586.03497"
+         id="use85719" />
+    </clipPath>
+    <clipPath
+       id="clipPath99399">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99401" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5058_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-587.26202"
+         id="use85731" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5060_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-587.26202"
+         id="use85739" />
+    </clipPath>
+    <clipPath
+       id="clipPath99407">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99409" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5062_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-588.48901"
+         id="use85751" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5064_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-588.48901"
+         id="use85759" />
+    </clipPath>
+    <clipPath
+       id="clipPath99415">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99417" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5066_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-589.71503"
+         id="use85771" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5068_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-589.71503"
+         id="use85779" />
+    </clipPath>
+    <clipPath
+       id="clipPath99423">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99425" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5070_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-590.94202"
+         id="use85791" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5072_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-590.94202"
+         id="use85799" />
+    </clipPath>
+    <clipPath
+       id="clipPath99431">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99433" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5074_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-592.16901"
+         id="use85811" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5076_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-592.16901"
+         id="use85819" />
+    </clipPath>
+    <clipPath
+       id="clipPath99439">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99441" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5078_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-593.396"
+         id="use85831" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5080_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-593.396"
+         id="use85839" />
+    </clipPath>
+    <clipPath
+       id="clipPath99447">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99449" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5082_">
+      <rect
+         height="67.402"
+         width="42.445"
+         y="350.939"
+         x="-594.62299"
+         id="use85851" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5084_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-594.62299"
+         id="use85859" />
+    </clipPath>
+    <clipPath
+       id="clipPath99455">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99457" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5086_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-595.849"
+         id="use85871" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5088_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-595.849"
+         id="use85879" />
+    </clipPath>
+    <clipPath
+       id="clipPath99463">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99465" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5090_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-597.07599"
+         id="use85891" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5092_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-597.07599"
+         id="use85899" />
+    </clipPath>
+    <clipPath
+       id="clipPath99471">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99473" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5094_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-598.30298"
+         id="use85911" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5096_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-598.30298"
+         id="use85919" />
+    </clipPath>
+    <clipPath
+       id="clipPath99479">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99481" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5098_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-599.53003"
+         id="use85931" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5100_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-599.53003"
+         id="use85939" />
+    </clipPath>
+    <clipPath
+       id="clipPath99487">
+      <rect
+         height="67.402"
+         width="107.465"
+         y="350.939"
+         x="-600.75598"
+         id="use99489" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5102_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-600.75598"
+         id="use85951" />
+    </clipPath>
+    <clipPath
+       id="SVGID_5104_">
+      <rect
+         height="67.402"
+         width="42.444"
+         y="350.939"
+         x="-600.75598"
+         id="use85959" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4873_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use84798" />
+    </clipPath>
+    <clipPath
+       id="clipPath99497">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99499" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4874_"
+         overflow="visible"
+         id="use84810" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4876_"
+         overflow="visible"
+         id="use84818" />
+    </clipPath>
+    <clipPath
+       id="clipPath99511">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99513" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4879_"
+         overflow="visible"
+         id="use84841" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4881_"
+         overflow="visible"
+         id="use84849" />
+    </clipPath>
+    <clipPath
+       id="clipPath99519">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99521" />
+    </clipPath>
+    <clipPath
+       id="clipPath99523">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4872_"
+         overflow="visible"
+         id="use99525" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4869_"
+         overflow="visible"
+         id="use84771" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4867_"
+         overflow="visible"
+         id="use84759" />
+    </clipPath>
+    <clipPath
+       id="clipPath99534">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4867_"
+         overflow="visible"
+         id="use99536" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4864_"
+         overflow="visible"
+         id="use84732" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4862_"
+         overflow="visible"
+         id="use84720" />
+    </clipPath>
+    <clipPath
+       id="clipPath99545">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4862_"
+         overflow="visible"
+         id="use99547" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4861_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205299"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84696" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84698" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4860_">
+      <polygon
+         points="-521.64,278.632 -507.673,278.632 -507.673,273.567 -521.64,273.567 -523.432,276.108 "
+         id="use84693" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4858_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84681" />
+    </clipPath>
+    <clipPath
+       id="clipPath99556">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99558" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_">
+      <polygon
+         points="-521.64,208.524 -507.673,208.524 -507.673,203.458 -521.64,203.458 -523.432,206 "
+         id="use84656" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84644" />
+    </clipPath>
+    <clipPath
+       id="clipPath99567">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99569" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4851_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205101"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84622" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84624" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4850_">
+      <polygon
+         points="-588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 -574.322,203.458 "
+         id="use84619" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4848_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84607" />
+    </clipPath>
+    <clipPath
+       id="clipPath99578">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99580" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4846_"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205101"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84585" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84587" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4845_">
+      <polygon
+         points="-654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 -640.956,203.458 "
+         id="use84582" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500" />
+    </clipPath>
+    <clipPath
+       id="clipPath99589">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99591" />
+    </clipPath>
+    <clipPath
+       id="clipPath99593">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99595" />
+    </clipPath>
+    <clipPath
+       id="clipPath99597">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99599" />
+    </clipPath>
+    <clipPath
+       id="clipPath99601">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99603" />
+    </clipPath>
+    <clipPath
+       id="clipPath99605">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99607" />
+    </clipPath>
+    <clipPath
+       id="clipPath99609">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99611" />
+    </clipPath>
+    <clipPath
+       id="clipPath99613">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99615" />
+    </clipPath>
+    <clipPath
+       id="clipPath99617">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99619" />
+    </clipPath>
+    <clipPath
+       id="clipPath99621">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99623" />
+    </clipPath>
+    <clipPath
+       id="clipPath99625">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99627" />
+    </clipPath>
+    <clipPath
+       id="clipPath99629">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99631" />
+    </clipPath>
+    <clipPath
+       id="clipPath99633">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99635" />
+    </clipPath>
+    <clipPath
+       id="clipPath99637">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99639" />
+    </clipPath>
+    <clipPath
+       id="clipPath99641">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99643" />
+    </clipPath>
+    <clipPath
+       id="clipPath99645">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99647" />
+    </clipPath>
+    <clipPath
+       id="clipPath99649">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99651" />
+    </clipPath>
+    <clipPath
+       id="clipPath99653">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99655" />
+    </clipPath>
+    <clipPath
+       id="clipPath99657">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99659" />
+    </clipPath>
+    <clipPath
+       id="clipPath99661">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99663" />
+    </clipPath>
+    <clipPath
+       id="clipPath99665">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99667" />
+    </clipPath>
+    <clipPath
+       id="clipPath99669">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99671" />
+    </clipPath>
+    <clipPath
+       id="clipPath99673">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99675" />
+    </clipPath>
+    <clipPath
+       id="clipPath99677">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99679" />
+    </clipPath>
+    <clipPath
+       id="clipPath99681">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99683" />
+    </clipPath>
+    <clipPath
+       id="clipPath99685">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99687" />
+    </clipPath>
+    <clipPath
+       id="clipPath99689">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99691" />
+    </clipPath>
+    <clipPath
+       id="clipPath99693">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99695" />
+    </clipPath>
+    <clipPath
+       id="clipPath99697">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99699" />
+    </clipPath>
+    <clipPath
+       id="clipPath99701">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99703" />
+    </clipPath>
+    <clipPath
+       id="clipPath99705">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99707" />
+    </clipPath>
+    <clipPath
+       id="clipPath99709">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99711" />
+    </clipPath>
+    <clipPath
+       id="clipPath99713">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99715" />
+    </clipPath>
+    <clipPath
+       id="clipPath99717">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99719" />
+    </clipPath>
+    <clipPath
+       id="clipPath99721">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99723" />
+    </clipPath>
+    <clipPath
+       id="clipPath99725">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99727" />
+    </clipPath>
+    <clipPath
+       id="clipPath99729">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use99731" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4841_"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,942.8785,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84478" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84480" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84482" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84484" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84486" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4840_">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-531.92297"
+         id="use84475" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4838_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84445" />
+    </clipPath>
+    <clipPath
+       id="clipPath99743">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99745" />
+    </clipPath>
+    <clipPath
+       id="clipPath99747">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99749" />
+    </clipPath>
+    <clipPath
+       id="clipPath99751">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99753" />
+    </clipPath>
+    <clipPath
+       id="clipPath99755">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99757" />
+    </clipPath>
+    <clipPath
+       id="clipPath99759">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99761" />
+    </clipPath>
+    <clipPath
+       id="clipPath99763">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99765" />
+    </clipPath>
+    <clipPath
+       id="clipPath99767">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99769" />
+    </clipPath>
+    <clipPath
+       id="clipPath99771">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99773" />
+    </clipPath>
+    <clipPath
+       id="clipPath99775">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99777" />
+    </clipPath>
+    <clipPath
+       id="clipPath99779">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99781" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4836_"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.8129"
+       x2="37.392799"
+       y2="152.8129"
+       gradientTransform="matrix(0,-9.614,-9.614,0,876.3496,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84423" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84425" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84427" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84429" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84431" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4835_">
+      <rect
+         height="9.6140003"
+         width="11.315"
+         y="214.106"
+         x="-598.45099"
+         id="use84420" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4833_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84390" />
+    </clipPath>
+    <clipPath
+       id="clipPath99793">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99795" />
+    </clipPath>
+    <clipPath
+       id="clipPath99797">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99799" />
+    </clipPath>
+    <clipPath
+       id="clipPath99801">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99803" />
+    </clipPath>
+    <clipPath
+       id="clipPath99805">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99807" />
+    </clipPath>
+    <clipPath
+       id="clipPath99809">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99811" />
+    </clipPath>
+    <clipPath
+       id="clipPath99813">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99815" />
+    </clipPath>
+    <clipPath
+       id="clipPath99817">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99819" />
+    </clipPath>
+    <clipPath
+       id="clipPath99821">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99823" />
+    </clipPath>
+    <clipPath
+       id="clipPath99825">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99827" />
+    </clipPath>
+    <clipPath
+       id="clipPath99829">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99831" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4831_"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,809.7396,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84368" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84370" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84372" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84374" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84376" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4830_">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-665.06201"
+         id="use84365" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4826_"
+         overflow="visible"
+         id="use84326" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4823_"
+         overflow="visible"
+         id="use84295" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4822_"
+       gradientUnits="userSpaceOnUse"
+       x1="145.317"
+       y1="2.8515"
+       x2="146.317"
+       y2="2.8515"
+       gradientTransform="matrix(0.0299,24.8863,24.8863,-0.0299,-601.3687,-3384.4197)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84267" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84269" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84271" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84273" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84275" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4821_">
+      <polygon
+         points="-503.122,251.283 -503.124,231.934 -548.973,231.929 -548.973,251.221 -526.108,256.788 "
+         id="use84264" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4819_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84232" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4817_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,284.9195,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84220" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84222" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4816_">
+      <path
+         d="m -516.985,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84217"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4814_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84197" />
+    </clipPath>
+    <clipPath
+       id="clipPath99874">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99876" />
+    </clipPath>
+    <clipPath
+       id="clipPath99878">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99880" />
+    </clipPath>
+    <clipPath
+       id="clipPath99882">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99884" />
+    </clipPath>
+    <clipPath
+       id="clipPath99886">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99888" />
+    </clipPath>
+    <clipPath
+       id="clipPath99890">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99892" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4812_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,272.9481,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84185" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84187" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4811_">
+      <path
+         d="m -528.956,346.449 c 0,1.487 1.205,2.692 2.691,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use84182"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4809_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84162" />
+    </clipPath>
+    <clipPath
+       id="clipPath99901">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99903" />
+    </clipPath>
+    <clipPath
+       id="clipPath99905">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99907" />
+    </clipPath>
+    <clipPath
+       id="clipPath99909">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99911" />
+    </clipPath>
+    <clipPath
+       id="clipPath99913">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99915" />
+    </clipPath>
+    <clipPath
+       id="clipPath99917">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99919" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4807_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,260.9767,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84150" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84152" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4806_">
+      <path
+         d="m -540.927,346.449 c 0,1.487 1.205,2.692 2.691,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use84147"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4804_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84127" />
+    </clipPath>
+    <clipPath
+       id="clipPath99928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99930" />
+    </clipPath>
+    <clipPath
+       id="clipPath99932">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99934" />
+    </clipPath>
+    <clipPath
+       id="clipPath99936">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99938" />
+    </clipPath>
+    <clipPath
+       id="clipPath99940">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99942" />
+    </clipPath>
+    <clipPath
+       id="clipPath99944">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99946" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4802_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,249.0053,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84115" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84117" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4801_">
+      <path
+         d="m -552.899,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use84112"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4799_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84092" />
+    </clipPath>
+    <clipPath
+       id="clipPath99955">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99957" />
+    </clipPath>
+    <clipPath
+       id="clipPath99959">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99961" />
+    </clipPath>
+    <clipPath
+       id="clipPath99963">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99965" />
+    </clipPath>
+    <clipPath
+       id="clipPath99967">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99969" />
+    </clipPath>
+    <clipPath
+       id="clipPath99971">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99973" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4797_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,237.034,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84080" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84082" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4796_">
+      <path
+         d="m -564.87,346.449 c 0,1.487 1.205,2.692 2.691,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use84077"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4794_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84057" />
+    </clipPath>
+    <clipPath
+       id="clipPath99982">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99984" />
+    </clipPath>
+    <clipPath
+       id="clipPath99986">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99988" />
+    </clipPath>
+    <clipPath
+       id="clipPath99990">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99992" />
+    </clipPath>
+    <clipPath
+       id="clipPath99994">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use99996" />
+    </clipPath>
+    <clipPath
+       id="clipPath99998">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100000" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4792_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,225.0626,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84045" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84047" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4791_">
+      <path
+         d="m -576.842,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use84042"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4789_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84022" />
+    </clipPath>
+    <clipPath
+       id="clipPath100009">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100011" />
+    </clipPath>
+    <clipPath
+       id="clipPath100013">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100015" />
+    </clipPath>
+    <clipPath
+       id="clipPath100017">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100019" />
+    </clipPath>
+    <clipPath
+       id="clipPath100021">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100023" />
+    </clipPath>
+    <clipPath
+       id="clipPath100025">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100027" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4785_"
+         overflow="visible"
+         id="use84007" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use83987" />
+    </clipPath>
+    <clipPath
+       id="clipPath100036">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100038" />
+    </clipPath>
+    <clipPath
+       id="clipPath100040">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100042" />
+    </clipPath>
+    <clipPath
+       id="clipPath100044">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100046" />
+    </clipPath>
+    <clipPath
+       id="clipPath100048">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100050" />
+    </clipPath>
+    <clipPath
+       id="clipPath100052">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4783_"
+         overflow="visible"
+         id="use100054" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4780_"
+         overflow="visible"
+         id="use83972" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use83952" />
+    </clipPath>
+    <clipPath
+       id="clipPath100063">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100065" />
+    </clipPath>
+    <clipPath
+       id="clipPath100067">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100069" />
+    </clipPath>
+    <clipPath
+       id="clipPath100071">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100073" />
+    </clipPath>
+    <clipPath
+       id="clipPath100075">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100077" />
+    </clipPath>
+    <clipPath
+       id="clipPath100079">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4778_"
+         overflow="visible"
+         id="use100081" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4775_"
+         overflow="visible"
+         id="use83937" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use83917" />
+    </clipPath>
+    <clipPath
+       id="clipPath100090">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100092" />
+    </clipPath>
+    <clipPath
+       id="clipPath100094">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100096" />
+    </clipPath>
+    <clipPath
+       id="clipPath100098">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100100" />
+    </clipPath>
+    <clipPath
+       id="clipPath100102">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100104" />
+    </clipPath>
+    <clipPath
+       id="clipPath100106">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4773_"
+         overflow="visible"
+         id="use100108" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4770_"
+         overflow="visible"
+         id="use83902" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use83882" />
+    </clipPath>
+    <clipPath
+       id="clipPath100117">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100119" />
+    </clipPath>
+    <clipPath
+       id="clipPath100121">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100123" />
+    </clipPath>
+    <clipPath
+       id="clipPath100125">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100127" />
+    </clipPath>
+    <clipPath
+       id="clipPath100129">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100131" />
+    </clipPath>
+    <clipPath
+       id="clipPath100133">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4768_"
+         overflow="visible"
+         id="use100135" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4765_"
+         overflow="visible"
+         id="use83867" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use83847" />
+    </clipPath>
+    <clipPath
+       id="clipPath100144">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100146" />
+    </clipPath>
+    <clipPath
+       id="clipPath100148">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100150" />
+    </clipPath>
+    <clipPath
+       id="clipPath100152">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100154" />
+    </clipPath>
+    <clipPath
+       id="clipPath100156">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100158" />
+    </clipPath>
+    <clipPath
+       id="clipPath100160">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4763_"
+         overflow="visible"
+         id="use100162" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4760_"
+         overflow="visible"
+         id="use83832" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use83812" />
+    </clipPath>
+    <clipPath
+       id="clipPath100171">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100173" />
+    </clipPath>
+    <clipPath
+       id="clipPath100175">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100177" />
+    </clipPath>
+    <clipPath
+       id="clipPath100179">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100181" />
+    </clipPath>
+    <clipPath
+       id="clipPath100183">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100185" />
+    </clipPath>
+    <clipPath
+       id="clipPath100187">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4758_"
+         overflow="visible"
+         id="use100189" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4755_"
+         overflow="visible"
+         id="use83797" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use83777" />
+    </clipPath>
+    <clipPath
+       id="clipPath100198">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100200" />
+    </clipPath>
+    <clipPath
+       id="clipPath100202">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100204" />
+    </clipPath>
+    <clipPath
+       id="clipPath100206">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100208" />
+    </clipPath>
+    <clipPath
+       id="clipPath100210">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100212" />
+    </clipPath>
+    <clipPath
+       id="clipPath100214">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4753_"
+         overflow="visible"
+         id="use100216" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4750_"
+         overflow="visible"
+         id="use83762" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4749_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use83742" />
+    </clipPath>
+    <clipPath
+       id="clipPath100225">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100227" />
+    </clipPath>
+    <clipPath
+       id="clipPath100229">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100231" />
+    </clipPath>
+    <clipPath
+       id="clipPath100233">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100235" />
+    </clipPath>
+    <clipPath
+       id="clipPath100237">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100239" />
+    </clipPath>
+    <clipPath
+       id="clipPath100241">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4748_"
+         overflow="visible"
+         id="use100243" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4747_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,284.9195,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83730" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83732" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4746_">
+      <path
+         d="m -516.985,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83727"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4744_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83707" />
+    </clipPath>
+    <clipPath
+       id="clipPath100252">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100254" />
+    </clipPath>
+    <clipPath
+       id="clipPath100256">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100258" />
+    </clipPath>
+    <clipPath
+       id="clipPath100260">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100262" />
+    </clipPath>
+    <clipPath
+       id="clipPath100264">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100266" />
+    </clipPath>
+    <clipPath
+       id="clipPath100268">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100270" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4742_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,272.9481,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83695" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83697" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4741_">
+      <path
+         d="m -528.956,334.666 c 0,1.488 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use83692"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4739_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83672" />
+    </clipPath>
+    <clipPath
+       id="clipPath100279">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100281" />
+    </clipPath>
+    <clipPath
+       id="clipPath100283">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100285" />
+    </clipPath>
+    <clipPath
+       id="clipPath100287">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100289" />
+    </clipPath>
+    <clipPath
+       id="clipPath100291">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100293" />
+    </clipPath>
+    <clipPath
+       id="clipPath100295">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100297" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4737_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,260.9767,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83660" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83662" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4736_">
+      <path
+         d="m -540.927,334.666 c 0,1.488 1.205,2.694 2.691,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.691,1.206 -2.691,2.692"
+         id="use83657"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4734_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83637" />
+    </clipPath>
+    <clipPath
+       id="clipPath100306">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100308" />
+    </clipPath>
+    <clipPath
+       id="clipPath100310">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100312" />
+    </clipPath>
+    <clipPath
+       id="clipPath100314">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100316" />
+    </clipPath>
+    <clipPath
+       id="clipPath100318">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100320" />
+    </clipPath>
+    <clipPath
+       id="clipPath100322">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100324" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4732_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,249.0053,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83625" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83627" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4731_">
+      <path
+         d="m -552.899,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83622"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4729_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83602" />
+    </clipPath>
+    <clipPath
+       id="clipPath100333">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100335" />
+    </clipPath>
+    <clipPath
+       id="clipPath100337">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100339" />
+    </clipPath>
+    <clipPath
+       id="clipPath100341">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100343" />
+    </clipPath>
+    <clipPath
+       id="clipPath100345">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100347" />
+    </clipPath>
+    <clipPath
+       id="clipPath100349">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100351" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4727_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,225.0626,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83590" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83592" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4726_">
+      <path
+         d="m -576.842,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83587"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4724_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83567" />
+    </clipPath>
+    <clipPath
+       id="clipPath100360">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100362" />
+    </clipPath>
+    <clipPath
+       id="clipPath100364">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100366" />
+    </clipPath>
+    <clipPath
+       id="clipPath100368">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100370" />
+    </clipPath>
+    <clipPath
+       id="clipPath100372">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100374" />
+    </clipPath>
+    <clipPath
+       id="clipPath100376">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100378" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4720_"
+         overflow="visible"
+         id="use83552" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use83532" />
+    </clipPath>
+    <clipPath
+       id="clipPath100387">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100389" />
+    </clipPath>
+    <clipPath
+       id="clipPath100391">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100393" />
+    </clipPath>
+    <clipPath
+       id="clipPath100395">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100397" />
+    </clipPath>
+    <clipPath
+       id="clipPath100399">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100401" />
+    </clipPath>
+    <clipPath
+       id="clipPath100403">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4718_"
+         overflow="visible"
+         id="use100405" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4715_"
+         overflow="visible"
+         id="use83517" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use83497" />
+    </clipPath>
+    <clipPath
+       id="clipPath100414">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100416" />
+    </clipPath>
+    <clipPath
+       id="clipPath100418">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100420" />
+    </clipPath>
+    <clipPath
+       id="clipPath100422">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100424" />
+    </clipPath>
+    <clipPath
+       id="clipPath100426">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100428" />
+    </clipPath>
+    <clipPath
+       id="clipPath100430">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4713_"
+         overflow="visible"
+         id="use100432" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4710_"
+         overflow="visible"
+         id="use83482" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use83462" />
+    </clipPath>
+    <clipPath
+       id="clipPath100441">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100443" />
+    </clipPath>
+    <clipPath
+       id="clipPath100445">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100447" />
+    </clipPath>
+    <clipPath
+       id="clipPath100449">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100451" />
+    </clipPath>
+    <clipPath
+       id="clipPath100453">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100455" />
+    </clipPath>
+    <clipPath
+       id="clipPath100457">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4708_"
+         overflow="visible"
+         id="use100459" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4705_"
+         overflow="visible"
+         id="use83447" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use83427" />
+    </clipPath>
+    <clipPath
+       id="clipPath100468">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100470" />
+    </clipPath>
+    <clipPath
+       id="clipPath100472">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100474" />
+    </clipPath>
+    <clipPath
+       id="clipPath100476">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100478" />
+    </clipPath>
+    <clipPath
+       id="clipPath100480">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100482" />
+    </clipPath>
+    <clipPath
+       id="clipPath100484">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4703_"
+         overflow="visible"
+         id="use100486" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4700_"
+         overflow="visible"
+         id="use83412" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use83392" />
+    </clipPath>
+    <clipPath
+       id="clipPath100495">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100497" />
+    </clipPath>
+    <clipPath
+       id="clipPath100499">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100501" />
+    </clipPath>
+    <clipPath
+       id="clipPath100503">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100505" />
+    </clipPath>
+    <clipPath
+       id="clipPath100507">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100509" />
+    </clipPath>
+    <clipPath
+       id="clipPath100511">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4698_"
+         overflow="visible"
+         id="use100513" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4695_"
+         overflow="visible"
+         id="use83377" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use83357" />
+    </clipPath>
+    <clipPath
+       id="clipPath100522">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100524" />
+    </clipPath>
+    <clipPath
+       id="clipPath100526">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100528" />
+    </clipPath>
+    <clipPath
+       id="clipPath100530">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100532" />
+    </clipPath>
+    <clipPath
+       id="clipPath100534">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100536" />
+    </clipPath>
+    <clipPath
+       id="clipPath100538">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4693_"
+         overflow="visible"
+         id="use100540" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4690_"
+         overflow="visible"
+         id="use83342" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4689_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use83322" />
+    </clipPath>
+    <clipPath
+       id="clipPath100549">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100551" />
+    </clipPath>
+    <clipPath
+       id="clipPath100553">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100555" />
+    </clipPath>
+    <clipPath
+       id="clipPath100557">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100559" />
+    </clipPath>
+    <clipPath
+       id="clipPath100561">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100563" />
+    </clipPath>
+    <clipPath
+       id="clipPath100565">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4688_"
+         overflow="visible"
+         id="use100567" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4687_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,284.9569,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83310" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83312" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4686_">
+      <path
+         d="m -516.985,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83307"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4684_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83287" />
+    </clipPath>
+    <clipPath
+       id="clipPath100576">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100578" />
+    </clipPath>
+    <clipPath
+       id="clipPath100580">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100582" />
+    </clipPath>
+    <clipPath
+       id="clipPath100584">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100586" />
+    </clipPath>
+    <clipPath
+       id="clipPath100588">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100590" />
+    </clipPath>
+    <clipPath
+       id="clipPath100592">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100594" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4682_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,272.9856,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83275" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83277" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4681_">
+      <path
+         d="m -528.956,323.119 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.204 -2.691,2.69"
+         id="use83272"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4679_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83252" />
+    </clipPath>
+    <clipPath
+       id="clipPath100603">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100605" />
+    </clipPath>
+    <clipPath
+       id="clipPath100607">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100609" />
+    </clipPath>
+    <clipPath
+       id="clipPath100611">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100613" />
+    </clipPath>
+    <clipPath
+       id="clipPath100615">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100617" />
+    </clipPath>
+    <clipPath
+       id="clipPath100619">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100621" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4677_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,261.0142,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83240" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83242" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4676_">
+      <path
+         d="m -540.927,323.119 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.691,1.204 -2.691,2.69"
+         id="use83237"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4674_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83217" />
+    </clipPath>
+    <clipPath
+       id="clipPath100630">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100632" />
+    </clipPath>
+    <clipPath
+       id="clipPath100634">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100636" />
+    </clipPath>
+    <clipPath
+       id="clipPath100638">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100640" />
+    </clipPath>
+    <clipPath
+       id="clipPath100642">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100644" />
+    </clipPath>
+    <clipPath
+       id="clipPath100646">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100648" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4672_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,249.0428,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83205" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83207" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4671_">
+      <path
+         d="m -552.899,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83202"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4669_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83182" />
+    </clipPath>
+    <clipPath
+       id="clipPath100657">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100659" />
+    </clipPath>
+    <clipPath
+       id="clipPath100661">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100663" />
+    </clipPath>
+    <clipPath
+       id="clipPath100665">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100667" />
+    </clipPath>
+    <clipPath
+       id="clipPath100669">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100671" />
+    </clipPath>
+    <clipPath
+       id="clipPath100673">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100675" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4667_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,237.0715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83170" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83172" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4666_">
+      <path
+         d="m -564.87,323.119 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.204 -2.691,2.69"
+         id="use83167"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4664_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83147" />
+    </clipPath>
+    <clipPath
+       id="clipPath100684">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100686" />
+    </clipPath>
+    <clipPath
+       id="clipPath100688">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100690" />
+    </clipPath>
+    <clipPath
+       id="clipPath100692">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100694" />
+    </clipPath>
+    <clipPath
+       id="clipPath100696">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100698" />
+    </clipPath>
+    <clipPath
+       id="clipPath100700">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100702" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4662_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,225.1001,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83135" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83137" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4661_">
+      <path
+         d="m -576.842,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83132"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4659_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83112" />
+    </clipPath>
+    <clipPath
+       id="clipPath100711">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100713" />
+    </clipPath>
+    <clipPath
+       id="clipPath100715">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100717" />
+    </clipPath>
+    <clipPath
+       id="clipPath100719">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100721" />
+    </clipPath>
+    <clipPath
+       id="clipPath100723">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100725" />
+    </clipPath>
+    <clipPath
+       id="clipPath100727">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100729" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4655_"
+         overflow="visible"
+         id="use83097" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use83077" />
+    </clipPath>
+    <clipPath
+       id="clipPath100738">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100740" />
+    </clipPath>
+    <clipPath
+       id="clipPath100742">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100744" />
+    </clipPath>
+    <clipPath
+       id="clipPath100746">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100748" />
+    </clipPath>
+    <clipPath
+       id="clipPath100750">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100752" />
+    </clipPath>
+    <clipPath
+       id="clipPath100754">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4653_"
+         overflow="visible"
+         id="use100756" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4650_"
+         overflow="visible"
+         id="use83062" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use83042" />
+    </clipPath>
+    <clipPath
+       id="clipPath100765">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100767" />
+    </clipPath>
+    <clipPath
+       id="clipPath100769">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100771" />
+    </clipPath>
+    <clipPath
+       id="clipPath100773">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100775" />
+    </clipPath>
+    <clipPath
+       id="clipPath100777">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100779" />
+    </clipPath>
+    <clipPath
+       id="clipPath100781">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4648_"
+         overflow="visible"
+         id="use100783" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4645_"
+         overflow="visible"
+         id="use83027" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use83007" />
+    </clipPath>
+    <clipPath
+       id="clipPath100792">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100794" />
+    </clipPath>
+    <clipPath
+       id="clipPath100796">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100798" />
+    </clipPath>
+    <clipPath
+       id="clipPath100800">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100802" />
+    </clipPath>
+    <clipPath
+       id="clipPath100804">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100806" />
+    </clipPath>
+    <clipPath
+       id="clipPath100808">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4643_"
+         overflow="visible"
+         id="use100810" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4640_"
+         overflow="visible"
+         id="use82992" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use82972" />
+    </clipPath>
+    <clipPath
+       id="clipPath100819">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100821" />
+    </clipPath>
+    <clipPath
+       id="clipPath100823">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100825" />
+    </clipPath>
+    <clipPath
+       id="clipPath100827">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100829" />
+    </clipPath>
+    <clipPath
+       id="clipPath100831">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100833" />
+    </clipPath>
+    <clipPath
+       id="clipPath100835">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4638_"
+         overflow="visible"
+         id="use100837" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4635_"
+         overflow="visible"
+         id="use82957" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use82937" />
+    </clipPath>
+    <clipPath
+       id="clipPath100846">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100848" />
+    </clipPath>
+    <clipPath
+       id="clipPath100850">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100852" />
+    </clipPath>
+    <clipPath
+       id="clipPath100854">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100856" />
+    </clipPath>
+    <clipPath
+       id="clipPath100858">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100860" />
+    </clipPath>
+    <clipPath
+       id="clipPath100862">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4633_"
+         overflow="visible"
+         id="use100864" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4630_"
+         overflow="visible"
+         id="use82922" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use82902" />
+    </clipPath>
+    <clipPath
+       id="clipPath100873">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100875" />
+    </clipPath>
+    <clipPath
+       id="clipPath100877">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100879" />
+    </clipPath>
+    <clipPath
+       id="clipPath100881">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100883" />
+    </clipPath>
+    <clipPath
+       id="clipPath100885">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100887" />
+    </clipPath>
+    <clipPath
+       id="clipPath100889">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4628_"
+         overflow="visible"
+         id="use100891" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4625_"
+         overflow="visible"
+         id="use82887" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4624_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use82867" />
+    </clipPath>
+    <clipPath
+       id="clipPath100900">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100902" />
+    </clipPath>
+    <clipPath
+       id="clipPath100904">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100906" />
+    </clipPath>
+    <clipPath
+       id="clipPath100908">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100910" />
+    </clipPath>
+    <clipPath
+       id="clipPath100912">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100914" />
+    </clipPath>
+    <clipPath
+       id="clipPath100916">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4623_"
+         overflow="visible"
+         id="use100918" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4622_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,284.9569,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82855" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82857" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4621_">
+      <path
+         d="m -516.985,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="use82852"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4619_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82832" />
+    </clipPath>
+    <clipPath
+       id="clipPath100927">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100929" />
+    </clipPath>
+    <clipPath
+       id="clipPath100931">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100933" />
+    </clipPath>
+    <clipPath
+       id="clipPath100935">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100937" />
+    </clipPath>
+    <clipPath
+       id="clipPath100939">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100941" />
+    </clipPath>
+    <clipPath
+       id="clipPath100943">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100945" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4617_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,272.9856,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82820" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82822" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4616_">
+      <path
+         d="m -528.956,311.531 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.205 -2.691,2.69"
+         id="use82817"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4614_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82797" />
+    </clipPath>
+    <clipPath
+       id="clipPath100954">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100956" />
+    </clipPath>
+    <clipPath
+       id="clipPath100958">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100960" />
+    </clipPath>
+    <clipPath
+       id="clipPath100962">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100964" />
+    </clipPath>
+    <clipPath
+       id="clipPath100966">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100968" />
+    </clipPath>
+    <clipPath
+       id="clipPath100970">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100972" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4612_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,261.0142,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82785" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82787" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4611_">
+      <path
+         d="m -540.927,311.531 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.691,1.205 -2.691,2.69"
+         id="use82782"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4609_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82762" />
+    </clipPath>
+    <clipPath
+       id="clipPath100981">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100983" />
+    </clipPath>
+    <clipPath
+       id="clipPath100985">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100987" />
+    </clipPath>
+    <clipPath
+       id="clipPath100989">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100991" />
+    </clipPath>
+    <clipPath
+       id="clipPath100993">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100995" />
+    </clipPath>
+    <clipPath
+       id="clipPath100997">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use100999" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4607_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,249.0428,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82750" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82752" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4606_">
+      <path
+         d="m -552.899,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82747"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4604_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82727" />
+    </clipPath>
+    <clipPath
+       id="clipPath101008">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101010" />
+    </clipPath>
+    <clipPath
+       id="clipPath101012">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101014" />
+    </clipPath>
+    <clipPath
+       id="clipPath101016">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101018" />
+    </clipPath>
+    <clipPath
+       id="clipPath101020">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101022" />
+    </clipPath>
+    <clipPath
+       id="clipPath101024">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101026" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4602_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,237.0715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82715" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82717" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4601_">
+      <path
+         d="m -564.87,311.531 c 0,1.487 1.205,2.694 2.691,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.691,1.205 -2.691,2.69"
+         id="use82712"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4599_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82692" />
+    </clipPath>
+    <clipPath
+       id="clipPath101035">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101037" />
+    </clipPath>
+    <clipPath
+       id="clipPath101039">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101041" />
+    </clipPath>
+    <clipPath
+       id="clipPath101043">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101045" />
+    </clipPath>
+    <clipPath
+       id="clipPath101047">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101049" />
+    </clipPath>
+    <clipPath
+       id="clipPath101051">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101053" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4597_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,225.1001,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82680" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82682" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4596_">
+      <path
+         d="m -576.842,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82677"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4594_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82657" />
+    </clipPath>
+    <clipPath
+       id="clipPath101062">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101064" />
+    </clipPath>
+    <clipPath
+       id="clipPath101066">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101068" />
+    </clipPath>
+    <clipPath
+       id="clipPath101070">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101072" />
+    </clipPath>
+    <clipPath
+       id="clipPath101074">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101076" />
+    </clipPath>
+    <clipPath
+       id="clipPath101078">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101080" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4590_"
+         overflow="visible"
+         id="use82642" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use82622" />
+    </clipPath>
+    <clipPath
+       id="clipPath101089">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101091" />
+    </clipPath>
+    <clipPath
+       id="clipPath101093">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101095" />
+    </clipPath>
+    <clipPath
+       id="clipPath101097">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101099" />
+    </clipPath>
+    <clipPath
+       id="clipPath101101">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101103" />
+    </clipPath>
+    <clipPath
+       id="clipPath101105">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4588_"
+         overflow="visible"
+         id="use101107" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4585_"
+         overflow="visible"
+         id="use82607" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use82587" />
+    </clipPath>
+    <clipPath
+       id="clipPath101116">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101118" />
+    </clipPath>
+    <clipPath
+       id="clipPath101120">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101122" />
+    </clipPath>
+    <clipPath
+       id="clipPath101124">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101126" />
+    </clipPath>
+    <clipPath
+       id="clipPath101128">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101130" />
+    </clipPath>
+    <clipPath
+       id="clipPath101132">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4583_"
+         overflow="visible"
+         id="use101134" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4580_"
+         overflow="visible"
+         id="use82572" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use82552" />
+    </clipPath>
+    <clipPath
+       id="clipPath101143">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101145" />
+    </clipPath>
+    <clipPath
+       id="clipPath101147">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101149" />
+    </clipPath>
+    <clipPath
+       id="clipPath101151">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101153" />
+    </clipPath>
+    <clipPath
+       id="clipPath101155">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101157" />
+    </clipPath>
+    <clipPath
+       id="clipPath101159">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4578_"
+         overflow="visible"
+         id="use101161" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4575_"
+         overflow="visible"
+         id="use82537" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use82517" />
+    </clipPath>
+    <clipPath
+       id="clipPath101170">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101172" />
+    </clipPath>
+    <clipPath
+       id="clipPath101174">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101176" />
+    </clipPath>
+    <clipPath
+       id="clipPath101178">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101180" />
+    </clipPath>
+    <clipPath
+       id="clipPath101182">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101184" />
+    </clipPath>
+    <clipPath
+       id="clipPath101186">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4573_"
+         overflow="visible"
+         id="use101188" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4570_"
+         overflow="visible"
+         id="use82502" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use82482" />
+    </clipPath>
+    <clipPath
+       id="clipPath101197">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101199" />
+    </clipPath>
+    <clipPath
+       id="clipPath101201">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101203" />
+    </clipPath>
+    <clipPath
+       id="clipPath101205">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101207" />
+    </clipPath>
+    <clipPath
+       id="clipPath101209">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101211" />
+    </clipPath>
+    <clipPath
+       id="clipPath101213">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4568_"
+         overflow="visible"
+         id="use101215" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4565_"
+         overflow="visible"
+         id="use82467" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447" />
+    </clipPath>
+    <clipPath
+       id="clipPath101224">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101226" />
+    </clipPath>
+    <clipPath
+       id="clipPath101228">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101230" />
+    </clipPath>
+    <clipPath
+       id="clipPath101232">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101234" />
+    </clipPath>
+    <clipPath
+       id="clipPath101236">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101238" />
+    </clipPath>
+    <clipPath
+       id="clipPath101240">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use101242" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4562_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82435" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82437" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4561_">
+      <path
+         d="m -660.642,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82432"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412" />
+    </clipPath>
+    <clipPath
+       id="clipPath101251">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101253" />
+    </clipPath>
+    <clipPath
+       id="clipPath101255">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101257" />
+    </clipPath>
+    <clipPath
+       id="clipPath101259">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101261" />
+    </clipPath>
+    <clipPath
+       id="clipPath101263">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101265" />
+    </clipPath>
+    <clipPath
+       id="clipPath101267">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101269" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4555_"
+         overflow="visible"
+         id="use82397" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4554_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82373" />
+    </clipPath>
+    <clipPath
+       id="clipPath101278">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101280" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4551_"
+         overflow="visible"
+         id="use82359" />
+    </clipPath>
+    <clipPath
+       id="clipPath101284">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4551_"
+         overflow="visible"
+         id="use101286" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_"
+         overflow="visible"
+         id="use82345" />
+    </clipPath>
+    <clipPath
+       id="clipPath101290">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_"
+         overflow="visible"
+         id="use101292" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4546_"
+         overflow="visible"
+         id="use82316" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4543_"
+         overflow="visible"
+         id="use82287" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4542_"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1387.9897,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82261" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82263" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82265" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82267" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82269" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82271" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82273" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82275" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4541_">
+      <polygon
+         points="-547.185,267.353 -504.831,267.32 -504.824,253.133 -526.362,258.293 -547.178,253.224 "
+         id="use82258" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4524_"
+         overflow="visible"
+         id="use82164" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4526_"
+         overflow="visible"
+         id="use82174" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4528_"
+         overflow="visible"
+         id="use82182" />
+    </clipPath>
+    <clipPath
+       id="clipPath101336">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4526_"
+         overflow="visible"
+         id="use101338" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4531_"
+         overflow="visible"
+         id="use82197" />
+    </clipPath>
+    <clipPath
+       id="clipPath101342">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4524_"
+         overflow="visible"
+         id="use101344" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4533_"
+         overflow="visible"
+         id="use82209" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4535_"
+         overflow="visible"
+         id="use82217" />
+    </clipPath>
+    <clipPath
+       id="clipPath101353">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4533_"
+         overflow="visible"
+         id="use101355" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4538_"
+         overflow="visible"
+         id="use82232" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82132" />
+    </clipPath>
+    <clipPath
+       id="clipPath101361">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101363" />
+    </clipPath>
+    <clipPath
+       id="clipPath101365">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101367" />
+    </clipPath>
+    <clipPath
+       id="clipPath101369">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101371" />
+    </clipPath>
+    <clipPath
+       id="clipPath101373">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101375" />
+    </clipPath>
+    <clipPath
+       id="clipPath101377">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101379" />
+    </clipPath>
+    <clipPath
+       id="clipPath101381">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101383" />
+    </clipPath>
+    <clipPath
+       id="clipPath101385">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101387" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4521_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_">
+      <polygon
+         points="-547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 "
+         id="use82113" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4518_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82083" />
+    </clipPath>
+    <clipPath
+       id="clipPath101398">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101400" />
+    </clipPath>
+    <clipPath
+       id="clipPath101402">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101404" />
+    </clipPath>
+    <clipPath
+       id="clipPath101406">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101408" />
+    </clipPath>
+    <clipPath
+       id="clipPath101410">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101412" />
+    </clipPath>
+    <clipPath
+       id="clipPath101414">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101416" />
+    </clipPath>
+    <clipPath
+       id="clipPath101418">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101420" />
+    </clipPath>
+    <clipPath
+       id="clipPath101422">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101424" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4516_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,902.0769,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82067" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82069" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82071" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82073" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4515_">
+      <polygon
+         points="-590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 "
+         id="use82064" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4511_">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82010" />
+    </clipPath>
+    <clipPath
+       id="clipPath101435">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101437" />
+    </clipPath>
+    <clipPath
+       id="clipPath101439">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101441" />
+    </clipPath>
+    <clipPath
+       id="clipPath101443">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101445" />
+    </clipPath>
+    <clipPath
+       id="clipPath101447">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101449" />
+    </clipPath>
+    <clipPath
+       id="clipPath101451">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101453" />
+    </clipPath>
+    <clipPath
+       id="clipPath101455">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101457" />
+    </clipPath>
+    <clipPath
+       id="clipPath101459">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use101461" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4509_"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop81994" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop81996" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop81998" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82000" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4508_">
+      <polygon
+         points="-657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 "
+         id="use81991" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient104534"
+       xlink:href="#SVGID_4509_"
+       inkscape:collect="always" />
+    <defs
+       id="defs84496">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4842_" />
+    </defs>
+    <clipPath
+       id="clipPath103391">
+      <use
+         id="use103393"
+         overflow="visible"
+         xlink:href="#SVGID_4842_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4873_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84798-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath113428">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113430" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_-9">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84810-6" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821-2" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823-4" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825-9" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827-7" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_-0">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84818-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath113442">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113444" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_-0">
+      <rect
+         height="10.152"
+         width="174.94701"
+         y="360.13901"
+         x="-679.88898"
+         id="use84841-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_-9">
+      <rect
+         height="10.153"
+         width="174.94701"
+         y="360.138"
+         x="-679.88898"
+         id="use84849-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath113450">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113452" />
+    </clipPath>
+    <clipPath
+       id="clipPath113454">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113456" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_-6">
+      <polygon
+         points="-654.922,273.567 -656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 "
+         id="use84771-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84759-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113465">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113467" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735-4" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_-6">
+      <polygon
+         points="-588.288,273.567 -590.081,276.108 -588.288,278.632 -574.322,278.632 -574.322,273.567 "
+         id="use84732-8" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84720-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113476">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113478" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4851_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205101"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84622-4" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84624-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4850_-1">
+      <polygon
+         points="-588.288,203.458 -590.081,206 -588.288,208.524 -574.322,208.524 -574.322,203.458 "
+         id="use84619-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4848_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84607-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113487">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113489" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4846_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205101"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84585-1" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84587-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4845_-3">
+      <polygon
+         points="-654.922,203.458 -656.715,206 -654.922,208.524 -640.956,208.524 -640.956,203.458 "
+         id="use84582-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113498">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113500" />
+    </clipPath>
+    <clipPath
+       id="clipPath113502">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113504" />
+    </clipPath>
+    <clipPath
+       id="clipPath113506">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113508" />
+    </clipPath>
+    <clipPath
+       id="clipPath113510">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113512" />
+    </clipPath>
+    <clipPath
+       id="clipPath113514">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113516" />
+    </clipPath>
+    <clipPath
+       id="clipPath113518">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113520" />
+    </clipPath>
+    <clipPath
+       id="clipPath113522">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use113524" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4838_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84445-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath113528">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113530" />
+    </clipPath>
+    <clipPath
+       id="clipPath113532">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113534" />
+    </clipPath>
+    <clipPath
+       id="clipPath113536">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113538" />
+    </clipPath>
+    <clipPath
+       id="clipPath113540">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113542" />
+    </clipPath>
+    <clipPath
+       id="clipPath113544">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113546" />
+    </clipPath>
+    <clipPath
+       id="clipPath113548">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113550" />
+    </clipPath>
+    <clipPath
+       id="clipPath113552">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113554" />
+    </clipPath>
+    <clipPath
+       id="clipPath113556">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113558" />
+    </clipPath>
+    <clipPath
+       id="clipPath113560">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113562" />
+    </clipPath>
+    <clipPath
+       id="clipPath113564">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113566" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4836_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.8129"
+       x2="37.392799"
+       y2="152.8129"
+       gradientTransform="matrix(0,-9.614,-9.614,0,876.3496,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84423-1" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84425-8" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84427-7" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84429-9" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84431-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4835_-5">
+      <rect
+         height="9.6140003"
+         width="11.315"
+         y="214.106"
+         x="-598.45099"
+         id="use84420-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4833_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84390-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath113578">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113580" />
+    </clipPath>
+    <clipPath
+       id="clipPath113582">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113584" />
+    </clipPath>
+    <clipPath
+       id="clipPath113586">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113588" />
+    </clipPath>
+    <clipPath
+       id="clipPath113590">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113592" />
+    </clipPath>
+    <clipPath
+       id="clipPath113594">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113596" />
+    </clipPath>
+    <clipPath
+       id="clipPath113598">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113600" />
+    </clipPath>
+    <clipPath
+       id="clipPath113602">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113604" />
+    </clipPath>
+    <clipPath
+       id="clipPath113606">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113608" />
+    </clipPath>
+    <clipPath
+       id="clipPath113610">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113612" />
+    </clipPath>
+    <clipPath
+       id="clipPath113614">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113616" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4831_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,809.7396,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84368-9" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84370-7" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84372-0" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84374-4" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84376-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4830_-7">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-665.06201"
+         id="use84365-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329-2" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331-0" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333-0" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335-1" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_-3">
+      <polygon
+         points="-682.208,251.221 -659.342,256.788 -636.356,251.283 -636.358,231.934 -682.207,231.929 "
+         id="use84326-6" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298-6" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300-1" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302-6" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304-9" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_-9">
+      <polygon
+         points="-615.653,251.221 -592.788,256.788 -569.802,251.283 -569.804,231.934 -615.653,231.929 "
+         id="use84295-9" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_-8">
+      <path
+         d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84007-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83987-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath113649">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113651" />
+    </clipPath>
+    <clipPath
+       id="clipPath113653">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113655" />
+    </clipPath>
+    <clipPath
+       id="clipPath113657">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113659" />
+    </clipPath>
+    <clipPath
+       id="clipPath113661">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113663" />
+    </clipPath>
+    <clipPath
+       id="clipPath113665">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113667" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_-3">
+      <path
+         d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83972-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83952-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath113676">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113678" />
+    </clipPath>
+    <clipPath
+       id="clipPath113680">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113682" />
+    </clipPath>
+    <clipPath
+       id="clipPath113684">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113686" />
+    </clipPath>
+    <clipPath
+       id="clipPath113688">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113690" />
+    </clipPath>
+    <clipPath
+       id="clipPath113692">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113694" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_-4">
+      <path
+         d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83937-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83917-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath113703">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113705" />
+    </clipPath>
+    <clipPath
+       id="clipPath113707">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113709" />
+    </clipPath>
+    <clipPath
+       id="clipPath113711">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113713" />
+    </clipPath>
+    <clipPath
+       id="clipPath113715">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113717" />
+    </clipPath>
+    <clipPath
+       id="clipPath113719">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113721" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_-5">
+      <path
+         d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
+         id="use83902-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83882-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath113730">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113732" />
+    </clipPath>
+    <clipPath
+       id="clipPath113734">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113736" />
+    </clipPath>
+    <clipPath
+       id="clipPath113738">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113740" />
+    </clipPath>
+    <clipPath
+       id="clipPath113742">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113744" />
+    </clipPath>
+    <clipPath
+       id="clipPath113746">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113748" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_-5">
+      <path
+         d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83867-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83847-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113757">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113759" />
+    </clipPath>
+    <clipPath
+       id="clipPath113761">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113763" />
+    </clipPath>
+    <clipPath
+       id="clipPath113765">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113767" />
+    </clipPath>
+    <clipPath
+       id="clipPath113769">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113771" />
+    </clipPath>
+    <clipPath
+       id="clipPath113773">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113775" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_-9">
+      <path
+         d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83832-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83812-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113784">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113786" />
+    </clipPath>
+    <clipPath
+       id="clipPath113788">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113790" />
+    </clipPath>
+    <clipPath
+       id="clipPath113792">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113794" />
+    </clipPath>
+    <clipPath
+       id="clipPath113796">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113798" />
+    </clipPath>
+    <clipPath
+       id="clipPath113800">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113802" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_-5">
+      <path
+         d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83797-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83777-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath113811">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113813" />
+    </clipPath>
+    <clipPath
+       id="clipPath113815">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113817" />
+    </clipPath>
+    <clipPath
+       id="clipPath113819">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113821" />
+    </clipPath>
+    <clipPath
+       id="clipPath113823">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113825" />
+    </clipPath>
+    <clipPath
+       id="clipPath113827">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113829" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_-0">
+      <path
+         d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83762-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_-5">
+      <path
+         d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83552-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83532-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath113843">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113845" />
+    </clipPath>
+    <clipPath
+       id="clipPath113847">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113849" />
+    </clipPath>
+    <clipPath
+       id="clipPath113851">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113853" />
+    </clipPath>
+    <clipPath
+       id="clipPath113855">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113857" />
+    </clipPath>
+    <clipPath
+       id="clipPath113859">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113861" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_-1">
+      <path
+         d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83517-1"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83497-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath113870">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113872" />
+    </clipPath>
+    <clipPath
+       id="clipPath113874">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113876" />
+    </clipPath>
+    <clipPath
+       id="clipPath113878">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113880" />
+    </clipPath>
+    <clipPath
+       id="clipPath113882">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113884" />
+    </clipPath>
+    <clipPath
+       id="clipPath113886">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113888" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_-6">
+      <path
+         d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83482-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83462-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath113897">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113899" />
+    </clipPath>
+    <clipPath
+       id="clipPath113901">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113903" />
+    </clipPath>
+    <clipPath
+       id="clipPath113905">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113907" />
+    </clipPath>
+    <clipPath
+       id="clipPath113909">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113911" />
+    </clipPath>
+    <clipPath
+       id="clipPath113913">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113915" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_-5">
+      <path
+         d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83447-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83427-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath113924">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113926" />
+    </clipPath>
+    <clipPath
+       id="clipPath113928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113930" />
+    </clipPath>
+    <clipPath
+       id="clipPath113932">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113934" />
+    </clipPath>
+    <clipPath
+       id="clipPath113936">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113938" />
+    </clipPath>
+    <clipPath
+       id="clipPath113940">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113942" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_-3">
+      <path
+         d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83412-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83392-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath113951">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113953" />
+    </clipPath>
+    <clipPath
+       id="clipPath113955">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113957" />
+    </clipPath>
+    <clipPath
+       id="clipPath113959">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113961" />
+    </clipPath>
+    <clipPath
+       id="clipPath113963">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113965" />
+    </clipPath>
+    <clipPath
+       id="clipPath113967">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113969" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_-2">
+      <path
+         d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83377-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83357-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath113978">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113980" />
+    </clipPath>
+    <clipPath
+       id="clipPath113982">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113984" />
+    </clipPath>
+    <clipPath
+       id="clipPath113986">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113988" />
+    </clipPath>
+    <clipPath
+       id="clipPath113990">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113992" />
+    </clipPath>
+    <clipPath
+       id="clipPath113994">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use113996" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_-2">
+      <path
+         d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83342-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-1">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83097-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83077-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114010">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114012" />
+    </clipPath>
+    <clipPath
+       id="clipPath114014">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114016" />
+    </clipPath>
+    <clipPath
+       id="clipPath114018">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114020" />
+    </clipPath>
+    <clipPath
+       id="clipPath114022">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114024" />
+    </clipPath>
+    <clipPath
+       id="clipPath114026">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114028" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_-4">
+      <path
+         d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83062-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83042-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath114037">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114039" />
+    </clipPath>
+    <clipPath
+       id="clipPath114041">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114043" />
+    </clipPath>
+    <clipPath
+       id="clipPath114045">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114047" />
+    </clipPath>
+    <clipPath
+       id="clipPath114049">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114051" />
+    </clipPath>
+    <clipPath
+       id="clipPath114053">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114055" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_-1">
+      <path
+         d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
+         id="use83027-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83007-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath114064">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114066" />
+    </clipPath>
+    <clipPath
+       id="clipPath114068">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114070" />
+    </clipPath>
+    <clipPath
+       id="clipPath114072">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114074" />
+    </clipPath>
+    <clipPath
+       id="clipPath114076">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114078" />
+    </clipPath>
+    <clipPath
+       id="clipPath114080">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114082" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_-8">
+      <path
+         d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82992-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82972-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114091">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114093" />
+    </clipPath>
+    <clipPath
+       id="clipPath114095">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114097" />
+    </clipPath>
+    <clipPath
+       id="clipPath114099">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114101" />
+    </clipPath>
+    <clipPath
+       id="clipPath114103">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114105" />
+    </clipPath>
+    <clipPath
+       id="clipPath114107">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114109" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_-6">
+      <path
+         d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82957-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82937-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath114118">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114120" />
+    </clipPath>
+    <clipPath
+       id="clipPath114122">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114124" />
+    </clipPath>
+    <clipPath
+       id="clipPath114126">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114128" />
+    </clipPath>
+    <clipPath
+       id="clipPath114130">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114132" />
+    </clipPath>
+    <clipPath
+       id="clipPath114134">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114136" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_-1">
+      <path
+         d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82922-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82902-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath114145">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114147" />
+    </clipPath>
+    <clipPath
+       id="clipPath114149">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114151" />
+    </clipPath>
+    <clipPath
+       id="clipPath114153">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114155" />
+    </clipPath>
+    <clipPath
+       id="clipPath114157">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114159" />
+    </clipPath>
+    <clipPath
+       id="clipPath114161">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114163" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_-6">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82887-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_-6">
+      <path
+         d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="use82642-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82622-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114177">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114179" />
+    </clipPath>
+    <clipPath
+       id="clipPath114181">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114183" />
+    </clipPath>
+    <clipPath
+       id="clipPath114185">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114187" />
+    </clipPath>
+    <clipPath
+       id="clipPath114189">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114191" />
+    </clipPath>
+    <clipPath
+       id="clipPath114193">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114195" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_-0">
+      <path
+         d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82607-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82587-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath114204">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114206" />
+    </clipPath>
+    <clipPath
+       id="clipPath114208">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114210" />
+    </clipPath>
+    <clipPath
+       id="clipPath114212">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114214" />
+    </clipPath>
+    <clipPath
+       id="clipPath114216">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114218" />
+    </clipPath>
+    <clipPath
+       id="clipPath114220">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114222" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_-6">
+      <path
+         d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82572-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82552-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath114231">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114233" />
+    </clipPath>
+    <clipPath
+       id="clipPath114235">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114237" />
+    </clipPath>
+    <clipPath
+       id="clipPath114239">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114241" />
+    </clipPath>
+    <clipPath
+       id="clipPath114243">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114245" />
+    </clipPath>
+    <clipPath
+       id="clipPath114247">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114249" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_-2">
+      <path
+         d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
+         id="use82537-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82517-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114258">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114260" />
+    </clipPath>
+    <clipPath
+       id="clipPath114262">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114264" />
+    </clipPath>
+    <clipPath
+       id="clipPath114266">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114268" />
+    </clipPath>
+    <clipPath
+       id="clipPath114270">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114272" />
+    </clipPath>
+    <clipPath
+       id="clipPath114274">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114276" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_-1">
+      <path
+         d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82502-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82482-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114285">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114287" />
+    </clipPath>
+    <clipPath
+       id="clipPath114289">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114291" />
+    </clipPath>
+    <clipPath
+       id="clipPath114293">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114295" />
+    </clipPath>
+    <clipPath
+       id="clipPath114297">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114299" />
+    </clipPath>
+    <clipPath
+       id="clipPath114301">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114303" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_-1">
+      <path
+         d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82467-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82447-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath114312">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114314" />
+    </clipPath>
+    <clipPath
+       id="clipPath114316">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114318" />
+    </clipPath>
+    <clipPath
+       id="clipPath114320">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114322" />
+    </clipPath>
+    <clipPath
+       id="clipPath114324">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114326" />
+    </clipPath>
+    <clipPath
+       id="clipPath114328">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114330" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4562_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82435-2" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82437-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4561_-1">
+      <path
+         d="m -660.642,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82432-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath114339">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114341" />
+    </clipPath>
+    <clipPath
+       id="clipPath114343">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114345" />
+    </clipPath>
+    <clipPath
+       id="clipPath114347">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114349" />
+    </clipPath>
+    <clipPath
+       id="clipPath114351">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114353" />
+    </clipPath>
+    <clipPath
+       id="clipPath114355">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114357" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-5">
+      <path
+         d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82397-5"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82359-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath114366">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114368" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-0">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82345-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114372">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114374" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319-4" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321-6" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323-0" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325-7" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327-0" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329-5" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_-4">
+      <polygon
+         points="-659.18,258.293 -679.997,253.224 -680.004,267.353 -637.65,267.32 -637.642,253.133 "
+         id="use82316-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290-3" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292-3" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294-2" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296-5" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298-7" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300-2" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_-2">
+      <polygon
+         points="-593.085,258.293 -613.901,253.224 -613.908,267.353 -571.554,267.32 -571.547,253.133 "
+         id="use82287-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82164-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_-8">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82174-4" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185-5" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_-6">
+      <rect
+         height="64.037003"
+         width="174.953"
+         y="293.367"
+         x="-679.57202"
+         id="use82182-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath114407">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use114409" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_-7">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82197-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114413">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114415" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_-4">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82209-7" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_-8">
+      <rect
+         height="64.037003"
+         width="45.659"
+         y="293.367"
+         x="-441.45999"
+         id="use82217-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114424">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use114426" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_-9">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82232-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4518_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82083-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114432">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114434" />
+    </clipPath>
+    <clipPath
+       id="clipPath114436">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114438" />
+    </clipPath>
+    <clipPath
+       id="clipPath114440">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114442" />
+    </clipPath>
+    <clipPath
+       id="clipPath114444">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114446" />
+    </clipPath>
+    <clipPath
+       id="clipPath114448">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114450" />
+    </clipPath>
+    <clipPath
+       id="clipPath114452">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114454" />
+    </clipPath>
+    <clipPath
+       id="clipPath114456">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114458" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4516_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,902.0769,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82067-5" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82069-0" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82071-8" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82073-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4515_-1">
+      <polygon
+         points="-613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 -590.704,196.685 -571.658,196.685 -571.658,188.287 "
+         id="use82064-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4511_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82010-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath114469">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114471" />
+    </clipPath>
+    <clipPath
+       id="clipPath114473">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114475" />
+    </clipPath>
+    <clipPath
+       id="clipPath114477">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114479" />
+    </clipPath>
+    <clipPath
+       id="clipPath114481">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114483" />
+    </clipPath>
+    <clipPath
+       id="clipPath114485">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114487" />
+    </clipPath>
+    <clipPath
+       id="clipPath114489">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114491" />
+    </clipPath>
+    <clipPath
+       id="clipPath114493">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use114495" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient104534-0"
+       xlink:href="#SVGID_4509_-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4509_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop81994-0" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop81996-4" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop81998-3" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82000-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4508_-0">
+      <polygon
+         points="-680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 -657.048,196.685 -638.002,196.685 -638.002,188.287 "
+         id="use81991-1" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient115446"
+       xlink:href="#SVGID_4509_-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4657_-1-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-8-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-8-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-1-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4655_-2-7"
+         overflow="visible"
+         id="use83097-8-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-0-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82345-2-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath118798">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use118800" />
+    </clipPath>
+    <defs
+       id="defs83093-1-3">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="SVGID_4655_-2-7"
+         inkscape:connector-curvature="0" />
+    </defs>
+    <clipPath
+       id="clipPath102313-6-0">
+      <use
+         id="use102315-6-2"
+         overflow="visible"
+         xlink:href="#SVGID_4655_-2-7"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)"
+       y2="-148.4601"
+       x2="256.37631"
+       y1="-148.4601"
+       x1="255.37621"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient102317-9-1">
+      <stop
+         id="stop102319-7-7"
+         style="stop-color:#55AEB9"
+         offset="0" />
+      <stop
+         id="stop102321-3-3"
+         style="stop-color:#81D1DB"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4873_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84798-79" />
+    </clipPath>
+    <clipPath
+       id="clipPath119610">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119612" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4875_-5">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84810-0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4878_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.563"
+       y1="147.0757"
+       x2="41.563"
+       y2="147.0757"
+       gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84821-4" />
+      <stop
+         offset="0.486"
+         style="stop-color:#B0D2D9"
+         id="stop84823-2" />
+      <stop
+         offset="0.8287"
+         style="stop-color:#E6EFF1"
+         id="stop84825-99" />
+      <stop
+         offset="0.9939"
+         style="stop-color:#FFFFFF"
+         id="stop84827-79" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84829-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4877_-3">
+      <rect
+         height="10.152"
+         width="174.95799"
+         y="360.13901"
+         x="-679.90002"
+         id="use84818-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119624">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119626" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4880_-1">
+      <rect
+         height="10.152"
+         width="174.94701"
+         y="360.13901"
+         x="-679.88898"
+         id="use84841-0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4882_-6">
+      <rect
+         height="10.153"
+         width="174.94701"
+         y="360.138"
+         x="-679.88898"
+         id="use84849-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath119632">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119634" />
+    </clipPath>
+    <clipPath
+       id="clipPath119636">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119638" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4871_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205299"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84774-61" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84776-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4870_-2">
+      <polygon
+         points="-654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 -656.715,276.108 "
+         id="use84771-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4868_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84759-44" />
+    </clipPath>
+    <clipPath
+       id="clipPath119647">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119649" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4866_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205299"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84735-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84737-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4865_-0">
+      <polygon
+         points="-588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 -590.081,276.108 "
+         id="use84732-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4863_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84720-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119658">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119660" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4851_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.9404"
+       x2="-33.205101"
+       y2="249.9404"
+       gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84622-0" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84624-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4850_-19">
+      <polygon
+         points="-588.288,208.524 -574.322,208.524 -574.322,203.458 -588.288,203.458 -590.081,206 "
+         id="use84619-38" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4848_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84607-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath119669">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119671" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4846_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94051"
+       x2="-33.205101"
+       y2="249.94051"
+       gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84585-6" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84587-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4845_-4">
+      <polygon
+         points="-654.922,208.524 -640.956,208.524 -640.956,203.458 -654.922,203.458 -656.715,206 "
+         id="use84582-3" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath119680">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119682" />
+    </clipPath>
+    <clipPath
+       id="clipPath119684">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119686" />
+    </clipPath>
+    <clipPath
+       id="clipPath119688">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119690" />
+    </clipPath>
+    <clipPath
+       id="clipPath119692">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119694" />
+    </clipPath>
+    <clipPath
+       id="clipPath119696">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119698" />
+    </clipPath>
+    <clipPath
+       id="clipPath119700">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119702" />
+    </clipPath>
+    <clipPath
+       id="clipPath119704">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use119706" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4838_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84445-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath119710">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119712" />
+    </clipPath>
+    <clipPath
+       id="clipPath119714">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119716" />
+    </clipPath>
+    <clipPath
+       id="clipPath119718">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119720" />
+    </clipPath>
+    <clipPath
+       id="clipPath119722">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119724" />
+    </clipPath>
+    <clipPath
+       id="clipPath119726">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119728" />
+    </clipPath>
+    <clipPath
+       id="clipPath119730">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119732" />
+    </clipPath>
+    <clipPath
+       id="clipPath119734">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119736" />
+    </clipPath>
+    <clipPath
+       id="clipPath119738">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119740" />
+    </clipPath>
+    <clipPath
+       id="clipPath119742">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119744" />
+    </clipPath>
+    <clipPath
+       id="clipPath119746">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119748" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4836_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.8129"
+       x2="37.392799"
+       y2="152.8129"
+       gradientTransform="matrix(0,-9.614,-9.614,0,876.3496,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84423-5" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84425-7" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84427-8" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84429-1" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84431-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4835_-3">
+      <rect
+         height="9.6140003"
+         width="11.315"
+         y="214.106"
+         x="-598.45099"
+         id="use84420-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4833_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84390-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119760">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119762" />
+    </clipPath>
+    <clipPath
+       id="clipPath119764">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119766" />
+    </clipPath>
+    <clipPath
+       id="clipPath119768">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119770" />
+    </clipPath>
+    <clipPath
+       id="clipPath119772">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119774" />
+    </clipPath>
+    <clipPath
+       id="clipPath119776">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119778" />
+    </clipPath>
+    <clipPath
+       id="clipPath119780">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119782" />
+    </clipPath>
+    <clipPath
+       id="clipPath119784">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119786" />
+    </clipPath>
+    <clipPath
+       id="clipPath119788">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119790" />
+    </clipPath>
+    <clipPath
+       id="clipPath119792">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119794" />
+    </clipPath>
+    <clipPath
+       id="clipPath119796">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119798" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4831_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,809.7396,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84368-1" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84370-0" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84372-8" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84374-42" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84376-15" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4830_-5">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-665.06201"
+         id="use84365-9" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4828_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84329-5" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84331-2" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84333-3" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84335-9" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84337-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4827_-8">
+      <polygon
+         points="-636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 -659.342,256.788 "
+         id="use84326-1" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4825_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="145.3168"
+       y1="2.8518"
+       x2="146.3168"
+       y2="2.8518"
+       gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+      <stop
+         offset="0"
+         style="stop-color:#FFFFFF"
+         id="stop84298-1" />
+      <stop
+         offset="0.23"
+         style="stop-color:#FFFFFF"
+         id="stop84300-7" />
+      <stop
+         offset="0.5671"
+         style="stop-color:#F9F9F9"
+         id="stop84302-5" />
+      <stop
+         offset="0.8674"
+         style="stop-color:#EDEEEE"
+         id="stop84304-7" />
+      <stop
+         offset="1"
+         style="stop-color:#E6E8E7"
+         id="stop84306-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4824_-6">
+      <polygon
+         points="-569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 -592.788,256.788 "
+         id="use84295-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4787_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop84010-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop84012-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4786_-2">
+      <path
+         d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use84007-5"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4784_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83987-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath119831">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119833" />
+    </clipPath>
+    <clipPath
+       id="clipPath119835">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119837" />
+    </clipPath>
+    <clipPath
+       id="clipPath119839">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119841" />
+    </clipPath>
+    <clipPath
+       id="clipPath119843">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119845" />
+    </clipPath>
+    <clipPath
+       id="clipPath119847">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119849" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4782_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83975-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83977-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4781_-1">
+      <path
+         d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83972-45"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4779_-85">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83952-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath119858">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119860" />
+    </clipPath>
+    <clipPath
+       id="clipPath119862">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119864" />
+    </clipPath>
+    <clipPath
+       id="clipPath119866">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119868" />
+    </clipPath>
+    <clipPath
+       id="clipPath119870">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119872" />
+    </clipPath>
+    <clipPath
+       id="clipPath119874">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119876" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4777_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83940-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83942-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4776_-7">
+      <path
+         d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83937-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4774_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83917-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath119885">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119887" />
+    </clipPath>
+    <clipPath
+       id="clipPath119889">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119891" />
+    </clipPath>
+    <clipPath
+       id="clipPath119893">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119895" />
+    </clipPath>
+    <clipPath
+       id="clipPath119897">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119899" />
+    </clipPath>
+    <clipPath
+       id="clipPath119901">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119903" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4772_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83905-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83907-6" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4771_-2">
+      <path
+         d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
+         id="use83902-70"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4769_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83882-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath119912">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119914" />
+    </clipPath>
+    <clipPath
+       id="clipPath119916">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119918" />
+    </clipPath>
+    <clipPath
+       id="clipPath119920">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119922" />
+    </clipPath>
+    <clipPath
+       id="clipPath119924">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119926" />
+    </clipPath>
+    <clipPath
+       id="clipPath119928">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119930" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4767_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83870-91" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83872-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4766_-6">
+      <path
+         d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83867-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4764_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83847-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath119939">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119941" />
+    </clipPath>
+    <clipPath
+       id="clipPath119943">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119945" />
+    </clipPath>
+    <clipPath
+       id="clipPath119947">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119949" />
+    </clipPath>
+    <clipPath
+       id="clipPath119951">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119953" />
+    </clipPath>
+    <clipPath
+       id="clipPath119955">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119957" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4762_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3541"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83835-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83837-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4761_-3">
+      <path
+         d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83832-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4759_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83812-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath119966">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119968" />
+    </clipPath>
+    <clipPath
+       id="clipPath119970">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119972" />
+    </clipPath>
+    <clipPath
+       id="clipPath119974">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119976" />
+    </clipPath>
+    <clipPath
+       id="clipPath119978">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119980" />
+    </clipPath>
+    <clipPath
+       id="clipPath119982">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119984" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4757_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3541"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83800-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83802-76" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4756_-1">
+      <path
+         d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83797-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4754_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83777-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath119993">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119995" />
+    </clipPath>
+    <clipPath
+       id="clipPath119997">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use119999" />
+    </clipPath>
+    <clipPath
+       id="clipPath120001">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120003" />
+    </clipPath>
+    <clipPath
+       id="clipPath120005">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120007" />
+    </clipPath>
+    <clipPath
+       id="clipPath120009">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120011" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4752_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3541"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83765-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83767-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4751_-6">
+      <path
+         d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83762-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4749_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83742-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath120020">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120022" />
+    </clipPath>
+    <clipPath
+       id="clipPath120024">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120026" />
+    </clipPath>
+    <clipPath
+       id="clipPath120028">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120030" />
+    </clipPath>
+    <clipPath
+       id="clipPath120032">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120034" />
+    </clipPath>
+    <clipPath
+       id="clipPath120036">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120038" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4722_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83555-85" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83557-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4721_-8">
+      <path
+         d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+         id="use83552-2"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4719_-85">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83532-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath120047">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120049" />
+    </clipPath>
+    <clipPath
+       id="clipPath120051">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120053" />
+    </clipPath>
+    <clipPath
+       id="clipPath120055">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120057" />
+    </clipPath>
+    <clipPath
+       id="clipPath120059">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120061" />
+    </clipPath>
+    <clipPath
+       id="clipPath120063">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120065" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4717_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83520-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83522-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4716_-0">
+      <path
+         d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83517-0"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4714_-3">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83497-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath120074">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120076" />
+    </clipPath>
+    <clipPath
+       id="clipPath120078">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120080" />
+    </clipPath>
+    <clipPath
+       id="clipPath120082">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120084" />
+    </clipPath>
+    <clipPath
+       id="clipPath120086">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120088" />
+    </clipPath>
+    <clipPath
+       id="clipPath120090">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120092" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4712_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83485-7" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83487-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4711_-68">
+      <path
+         d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83482-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4709_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83462-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120101">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120103" />
+    </clipPath>
+    <clipPath
+       id="clipPath120105">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120107" />
+    </clipPath>
+    <clipPath
+       id="clipPath120109">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120111" />
+    </clipPath>
+    <clipPath
+       id="clipPath120113">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120115" />
+    </clipPath>
+    <clipPath
+       id="clipPath120117">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120119" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4707_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.3544"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83450-77" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83452-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4706_-2">
+      <path
+         d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83447-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4704_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83427-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120128">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120130" />
+    </clipPath>
+    <clipPath
+       id="clipPath120132">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120134" />
+    </clipPath>
+    <clipPath
+       id="clipPath120136">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120138" />
+    </clipPath>
+    <clipPath
+       id="clipPath120140">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120142" />
+    </clipPath>
+    <clipPath
+       id="clipPath120144">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120146" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4702_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.42999"
+       x2="256.3544"
+       y2="-148.42999"
+       gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83415-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83417-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4701_-5">
+      <path
+         d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83412-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4699_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83392-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120155">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120157" />
+    </clipPath>
+    <clipPath
+       id="clipPath120159">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120161" />
+    </clipPath>
+    <clipPath
+       id="clipPath120163">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120165" />
+    </clipPath>
+    <clipPath
+       id="clipPath120167">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120169" />
+    </clipPath>
+    <clipPath
+       id="clipPath120171">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120173" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4697_-62"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4299"
+       x2="256.35419"
+       y2="-148.4299"
+       gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83380-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83382-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4696_-20">
+      <path
+         d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83377-7"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4694_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83357-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath120182">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120184" />
+    </clipPath>
+    <clipPath
+       id="clipPath120186">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120188" />
+    </clipPath>
+    <clipPath
+       id="clipPath120190">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120192" />
+    </clipPath>
+    <clipPath
+       id="clipPath120194">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120196" />
+    </clipPath>
+    <clipPath
+       id="clipPath120198">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120200" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4692_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3541"
+       y1="-148.4301"
+       x2="256.3544"
+       y2="-148.4301"
+       gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83345-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83347-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4691_-7">
+      <path
+         d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+         id="use83342-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4689_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83322-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath120209">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120211" />
+    </clipPath>
+    <clipPath
+       id="clipPath120213">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120215" />
+    </clipPath>
+    <clipPath
+       id="clipPath120217">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120219" />
+    </clipPath>
+    <clipPath
+       id="clipPath120221">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120223" />
+    </clipPath>
+    <clipPath
+       id="clipPath120225">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120227" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4657_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83100-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83102-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4656_-7">
+      <path
+         d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+         id="use83097-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4654_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83077-8" />
+    </clipPath>
+    <clipPath
+       id="clipPath120236">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120238" />
+    </clipPath>
+    <clipPath
+       id="clipPath120240">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120242" />
+    </clipPath>
+    <clipPath
+       id="clipPath120244">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120246" />
+    </clipPath>
+    <clipPath
+       id="clipPath120248">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120250" />
+    </clipPath>
+    <clipPath
+       id="clipPath120252">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120254" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4652_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83065-42" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83067-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4651_-1">
+      <path
+         d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use83062-1"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4649_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83042-49" />
+    </clipPath>
+    <clipPath
+       id="clipPath120263">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120265" />
+    </clipPath>
+    <clipPath
+       id="clipPath120267">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120269" />
+    </clipPath>
+    <clipPath
+       id="clipPath120271">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120273" />
+    </clipPath>
+    <clipPath
+       id="clipPath120275">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120277" />
+    </clipPath>
+    <clipPath
+       id="clipPath120279">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120281" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4647_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop83030-6" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop83032-35" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4646_-8">
+      <path
+         d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
+         id="use83027-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4644_-8">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use83007-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120290">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120292" />
+    </clipPath>
+    <clipPath
+       id="clipPath120294">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120296" />
+    </clipPath>
+    <clipPath
+       id="clipPath120298">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120300" />
+    </clipPath>
+    <clipPath
+       id="clipPath120302">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120304" />
+    </clipPath>
+    <clipPath
+       id="clipPath120306">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120308" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4642_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46001"
+       x2="256.37631"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82995-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82997-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4641_-9">
+      <path
+         d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82992-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4639_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82972-97" />
+    </clipPath>
+    <clipPath
+       id="clipPath120317">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120319" />
+    </clipPath>
+    <clipPath
+       id="clipPath120321">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120323" />
+    </clipPath>
+    <clipPath
+       id="clipPath120325">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120327" />
+    </clipPath>
+    <clipPath
+       id="clipPath120329">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120331" />
+    </clipPath>
+    <clipPath
+       id="clipPath120333">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120335" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4637_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82960-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82962-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4636_-2">
+      <path
+         d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82957-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4634_-2">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82937-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120344">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120346" />
+    </clipPath>
+    <clipPath
+       id="clipPath120348">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120350" />
+    </clipPath>
+    <clipPath
+       id="clipPath120352">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120354" />
+    </clipPath>
+    <clipPath
+       id="clipPath120356">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120358" />
+    </clipPath>
+    <clipPath
+       id="clipPath120360">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120362" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4632_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.4601"
+       x2="256.37631"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82925-64" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82927-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4631_-9">
+      <path
+         d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82922-36"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4629_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82902-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath120371">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120373" />
+    </clipPath>
+    <clipPath
+       id="clipPath120375">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120377" />
+    </clipPath>
+    <clipPath
+       id="clipPath120379">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120381" />
+    </clipPath>
+    <clipPath
+       id="clipPath120383">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120385" />
+    </clipPath>
+    <clipPath
+       id="clipPath120387">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120389" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4627_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="255.37621"
+       y1="-148.46021"
+       x2="256.37631"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82890-4" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82892-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4626_-2">
+      <path
+         d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+         id="use82887-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4624_-1">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82867-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath120398">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120400" />
+    </clipPath>
+    <clipPath
+       id="clipPath120402">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120404" />
+    </clipPath>
+    <clipPath
+       id="clipPath120406">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120408" />
+    </clipPath>
+    <clipPath
+       id="clipPath120410">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120412" />
+    </clipPath>
+    <clipPath
+       id="clipPath120414">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120416" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4592_-1"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82645-1" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82647-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4591_-1">
+      <path
+         d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+         id="use82642-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4589_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82622-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120425">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120427" />
+    </clipPath>
+    <clipPath
+       id="clipPath120429">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120431" />
+    </clipPath>
+    <clipPath
+       id="clipPath120433">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120435" />
+    </clipPath>
+    <clipPath
+       id="clipPath120437">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120439" />
+    </clipPath>
+    <clipPath
+       id="clipPath120441">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120443" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4587_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82610-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82612-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4586_-7">
+      <path
+         d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82607-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4584_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82587-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath120452">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120454" />
+    </clipPath>
+    <clipPath
+       id="clipPath120456">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120458" />
+    </clipPath>
+    <clipPath
+       id="clipPath120460">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120462" />
+    </clipPath>
+    <clipPath
+       id="clipPath120464">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120466" />
+    </clipPath>
+    <clipPath
+       id="clipPath120468">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120470" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4582_-6"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82575-5" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82577-03" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4581_-7">
+      <path
+         d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82572-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4579_-65">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82552-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath120479">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120481" />
+    </clipPath>
+    <clipPath
+       id="clipPath120483">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120485" />
+    </clipPath>
+    <clipPath
+       id="clipPath120487">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120489" />
+    </clipPath>
+    <clipPath
+       id="clipPath120491">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120493" />
+    </clipPath>
+    <clipPath
+       id="clipPath120495">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120497" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4577_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82540-0" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82542-7" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4576_-5">
+      <path
+         d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
+         id="use82537-4"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4574_-6">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82517-7" />
+    </clipPath>
+    <clipPath
+       id="clipPath120506">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120508" />
+    </clipPath>
+    <clipPath
+       id="clipPath120510">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120512" />
+    </clipPath>
+    <clipPath
+       id="clipPath120514">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120516" />
+    </clipPath>
+    <clipPath
+       id="clipPath120518">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120520" />
+    </clipPath>
+    <clipPath
+       id="clipPath120522">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120524" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4572_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46001"
+       x2="256.3761"
+       y2="-148.46001"
+       gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82505-8" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82507-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4571_-3">
+      <path
+         d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82502-9"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4569_-54">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82482-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath120533">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120535" />
+    </clipPath>
+    <clipPath
+       id="clipPath120537">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120539" />
+    </clipPath>
+    <clipPath
+       id="clipPath120541">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120543" />
+    </clipPath>
+    <clipPath
+       id="clipPath120545">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120547" />
+    </clipPath>
+    <clipPath
+       id="clipPath120549">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120551" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4567_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82470-3" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82472-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4566_-8">
+      <path
+         d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82467-6"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82447-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath120560">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120562" />
+    </clipPath>
+    <clipPath
+       id="clipPath120564">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120566" />
+    </clipPath>
+    <clipPath
+       id="clipPath120568">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120570" />
+    </clipPath>
+    <clipPath
+       id="clipPath120572">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120574" />
+    </clipPath>
+    <clipPath
+       id="clipPath120576">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120578" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4562_-5"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.4601"
+       x2="256.3761"
+       y2="-148.4601"
+       gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82435-29" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82437-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4561_-11">
+      <path
+         d="m -660.642,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82432-8"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_-7">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath120587">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120589" />
+    </clipPath>
+    <clipPath
+       id="clipPath120591">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120593" />
+    </clipPath>
+    <clipPath
+       id="clipPath120595">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120597" />
+    </clipPath>
+    <clipPath
+       id="clipPath120599">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120601" />
+    </clipPath>
+    <clipPath
+       id="clipPath120603">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120605" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4557_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="255.3761"
+       y1="-148.46021"
+       x2="256.3761"
+       y2="-148.46021"
+       gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82400-9" />
+      <stop
+         offset="1"
+         style="stop-color:#81D1DB"
+         id="stop82402-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4556_-7">
+      <path
+         d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+         id="use82397-3"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4552_-54">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82359-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath120614">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120616" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4550_-5">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82345-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath120620">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120622" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4548_-8"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82319-6" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82321-0" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82323-4" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82325-70" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82327-00" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82329-8" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82331-67" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82333-8" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4547_-3">
+      <polygon
+         points="-680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 -679.997,253.224 "
+         id="use82316-0" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4545_-93"
+       gradientUnits="userSpaceOnUse"
+       x1="76.3899"
+       y1="97.785698"
+       x2="77.3899"
+       y2="97.785698"
+       gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+      <stop
+         offset="0"
+         style="stop-color:#55AEB9"
+         id="stop82290-1" />
+      <stop
+         offset="0.0507"
+         style="stop-color:#68B4BF"
+         id="stop82292-0" />
+      <stop
+         offset="0.2116"
+         style="stop-color:#96C6CF"
+         id="stop82294-1" />
+      <stop
+         offset="0.3736"
+         style="stop-color:#BAD8DD"
+         id="stop82296-0" />
+      <stop
+         offset="0.5342"
+         style="stop-color:#D7E6EA"
+         id="stop82298-2" />
+      <stop
+         offset="0.693"
+         style="stop-color:#EBF2F3"
+         id="stop82300-3" />
+      <stop
+         offset="0.8492"
+         style="stop-color:#F8FBFB"
+         id="stop82302-1" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82304-2" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4544_-1">
+      <polygon
+         points="-613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 -613.901,253.224 "
+         id="use82287-5" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4525_-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82164-7" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4527_-9">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82174-42" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4530_-9"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82185-2" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82187-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4529_-4">
+      <rect
+         height="64.037003"
+         width="174.953"
+         y="293.367"
+         x="-679.57202"
+         id="use82182-9" />
+    </clipPath>
+    <clipPath
+       id="clipPath120655">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use120657" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4532_-5">
+      <rect
+         height="64.251999"
+         width="175.168"
+         y="293.259"
+         x="-679.67902"
+         id="use82197-4" />
+    </clipPath>
+    <clipPath
+       id="clipPath120661">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120663" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4534_-1">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82209-3" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4537_-2"
+       gradientUnits="userSpaceOnUse"
+       x1="126.8011"
+       y1="60.902401"
+       x2="127.8011"
+       y2="60.902401"
+       gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop82220-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop82222-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4536_-89">
+      <rect
+         height="64.037003"
+         width="45.659"
+         y="293.367"
+         x="-441.45999"
+         id="use82217-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120672">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use120674" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4539_-1">
+      <rect
+         height="64.251999"
+         width="45.873001"
+         y="293.259"
+         x="-441.56699"
+         id="use82232-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4518_-35">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82083-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath120680">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120682" />
+    </clipPath>
+    <clipPath
+       id="clipPath120684">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120686" />
+    </clipPath>
+    <clipPath
+       id="clipPath120688">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120690" />
+    </clipPath>
+    <clipPath
+       id="clipPath120692">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120694" />
+    </clipPath>
+    <clipPath
+       id="clipPath120696">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120698" />
+    </clipPath>
+    <clipPath
+       id="clipPath120700">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120702" />
+    </clipPath>
+    <clipPath
+       id="clipPath120704">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120706" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4516_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,902.0769,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82067-0" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82069-6" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82071-2" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82073-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4515_-11">
+      <polygon
+         points="-590.704,196.685 -571.658,196.685 -571.658,188.287 -613.986,188.287 -613.986,196.684 -594.94,196.685 -592.822,198.478 "
+         id="use82064-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4511_-38">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82010-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath120717">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120719" />
+    </clipPath>
+    <clipPath
+       id="clipPath120721">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120723" />
+    </clipPath>
+    <clipPath
+       id="clipPath120725">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120727" />
+    </clipPath>
+    <clipPath
+       id="clipPath120729">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120731" />
+    </clipPath>
+    <clipPath
+       id="clipPath120733">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120735" />
+    </clipPath>
+    <clipPath
+       id="clipPath120737">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120739" />
+    </clipPath>
+    <clipPath
+       id="clipPath120741">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use120743" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient104534-4"
+       xlink:href="#SVGID_4509_-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4509_-0"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop81994-08" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop81996-2" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop81998-7" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82000-4" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4508_-3">
+      <polygon
+         points="-657.048,196.685 -638.002,196.685 -638.002,188.287 -680.33,188.287 -680.33,196.684 -661.285,196.685 -659.167,198.478 "
+         id="use81991-0" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,835.7324,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient121727"
+       xlink:href="#SVGID_4509_-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200"
+       id="linearGradient126204"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200"
+       id="linearGradient126210"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-7"
+       id="linearGradient126210-7"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-7"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-2" />
+    </linearGradient>
+    <linearGradient
+       y2="442.86218"
+       x2="219"
+       y1="442.86218"
+       x1="111"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126228"
+       xlink:href="#linearGradient126200-7"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2"
+       id="linearGradient126210-9"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7" />
+    </linearGradient>
+    <linearGradient
+       y2="442.86218"
+       x2="219"
+       y1="442.86218"
+       x1="111"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126435"
+       xlink:href="#linearGradient126200-2"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2"
+       id="linearGradient126487"
+       gradientUnits="userSpaceOnUse"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218"
+       gradientTransform="translate(190.5,52.1205)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2"
+       id="linearGradient126520"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(190.5,52.1205)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-0"
+       id="linearGradient126520-9"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(190.5,52.1205)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2-0"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7-1" />
+    </linearGradient>
+    <linearGradient
+       y2="442.86218"
+       x2="219"
+       y1="442.86218"
+       x1="111"
+       gradientTransform="translate(190.5,52.1205)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126539"
+       xlink:href="#linearGradient126200-2-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-2"
+       id="linearGradient126520-4"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(190.5,52.1205)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       id="linearGradient126200-2-2"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop126202-7-2" />
+    </linearGradient>
+    <linearGradient
+       y2="442.86218"
+       x2="219"
+       y1="442.86218"
+       x1="111"
+       gradientTransform="translate(190.5,52.1205)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126539-0"
+       xlink:href="#linearGradient126200-2-2"
+       inkscape:collect="always" />
+    <clipPath
+       id="SVGID_4843_-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-1-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-9-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4843_-9-6-8-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4842_"
+         overflow="visible"
+         id="use84500-60-1-2-2" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_-4"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4854_"
+         overflow="visible"
+         id="use84656-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_"
+         overflow="visible"
+         id="use84644-1" />
+    </clipPath>
+    <clipPath
+       id="clipPath126768">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_"
+         overflow="visible"
+         id="use126770" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4841_-7"
+       gradientUnits="userSpaceOnUse"
+       x1="36.392799"
+       y1="152.813"
+       x2="37.392799"
+       y2="152.813"
+       gradientTransform="matrix(0,-9.614,-9.614,0,942.8785,573.6009)">
+      <stop
+         offset="0"
+         style="stop-color:#5E6A71"
+         id="stop84478-8" />
+      <stop
+         offset="0.1421"
+         style="stop-color:#667077"
+         id="stop84480-2" />
+      <stop
+         offset="0.3823"
+         style="stop-color:#7A8187"
+         id="stop84482-3" />
+      <stop
+         offset="0.6911"
+         style="stop-color:#9EA1A6"
+         id="stop84484-9" />
+      <stop
+         offset="1"
+         style="stop-color:#CECED1"
+         id="stop84486-5" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4840_-7">
+      <rect
+         height="9.6140003"
+         width="11.316"
+         y="214.106"
+         x="-531.92297"
+         id="use84475-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use82132-5" />
+    </clipPath>
+    <clipPath
+       id="clipPath126782">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126784" />
+    </clipPath>
+    <clipPath
+       id="clipPath126786">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126788" />
+    </clipPath>
+    <clipPath
+       id="clipPath126790">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126792" />
+    </clipPath>
+    <clipPath
+       id="clipPath126794">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126796" />
+    </clipPath>
+    <clipPath
+       id="clipPath126798">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126800" />
+    </clipPath>
+    <clipPath
+       id="clipPath126802">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126804" />
+    </clipPath>
+    <clipPath
+       id="clipPath126806">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_"
+         overflow="visible"
+         id="use126808" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4521_-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4519_"
+         overflow="visible"
+         id="use82113-2" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904"
+       xlink:href="#SVGID_4521_-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4856_-4-6"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2-0" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1-9" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2-2">
+      <polygon
+         points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 "
+         id="use84656-1-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use84644-1-3" />
+    </clipPath>
+    <clipPath
+       id="clipPath127140">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127142" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1-9">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82132-5-2" />
+    </clipPath>
+    <clipPath
+       id="clipPath127146">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127148" />
+    </clipPath>
+    <clipPath
+       id="clipPath127150">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127152" />
+    </clipPath>
+    <clipPath
+       id="clipPath127154">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127156" />
+    </clipPath>
+    <clipPath
+       id="clipPath127158">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127160" />
+    </clipPath>
+    <clipPath
+       id="clipPath127162">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127164" />
+    </clipPath>
+    <clipPath
+       id="clipPath127166">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127168" />
+    </clipPath>
+    <clipPath
+       id="clipPath127170">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use127172" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904-6"
+       xlink:href="#SVGID_4521_-3-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4521_-3-3"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6-3" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6-5" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5-4" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9-3" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5-3">
+      <polygon
+         points="-524.02,196.685 -504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 "
+         id="use82113-2-8" />
+    </clipPath>
+    <linearGradient
+       id="SVGID_4856_-4-1"
+       gradientUnits="userSpaceOnUse"
+       x1="-34.205299"
+       y1="249.94031"
+       x2="-33.205101"
+       y2="249.94031"
+       gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+      <stop
+         offset="0"
+         style="stop-color:#E6E8E7"
+         id="stop84659-2-9" />
+      <stop
+         offset="1"
+         style="stop-color:#FFFFFF"
+         id="stop84661-1-0" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4855_-2-24">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4854_-1"
+         overflow="visible"
+         id="use84656-1-9" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4853_-8-0">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_-4"
+         overflow="visible"
+         id="use84644-1-6" />
+    </clipPath>
+    <clipPath
+       id="clipPath9068">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4852_-4"
+         overflow="visible"
+         id="use9070" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4523_-1-5">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use82132-5-25" />
+    </clipPath>
+    <clipPath
+       id="clipPath9074">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9076" />
+    </clipPath>
+    <clipPath
+       id="clipPath9078">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9080" />
+    </clipPath>
+    <clipPath
+       id="clipPath9082">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9084" />
+    </clipPath>
+    <clipPath
+       id="clipPath9086">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9088" />
+    </clipPath>
+    <clipPath
+       id="clipPath9090">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9092" />
+    </clipPath>
+    <clipPath
+       id="clipPath9094">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9096" />
+    </clipPath>
+    <clipPath
+       id="clipPath9098">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4522_-8"
+         overflow="visible"
+         id="use9100" />
+    </clipPath>
+    <linearGradient
+       y2="146.6937"
+       x2="41.840599"
+       y1="146.6937"
+       x1="40.840599"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient126904-61"
+       xlink:href="#SVGID_4521_-3-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="SVGID_4521_-3-0"
+       gradientUnits="userSpaceOnUse"
+       x1="40.840599"
+       y1="146.6937"
+       x2="41.840599"
+       y2="146.6937"
+       gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+      <stop
+         offset="0"
+         style="stop-color:#37424B"
+         id="stop82116-6-7" />
+      <stop
+         offset="0.12"
+         style="stop-color:#37424B"
+         id="stop82118-6-2" />
+      <stop
+         offset="0.88"
+         style="stop-color:#5E6A71"
+         id="stop82120-5-1" />
+      <stop
+         offset="1"
+         style="stop-color:#5E6A71"
+         id="stop82122-9-34" />
+    </linearGradient>
+    <clipPath
+       id="SVGID_4520_-5-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4519_-5"
+         overflow="visible"
+         id="use82113-2-5" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-0"
+       id="linearGradient9379"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(190.5,52.1205)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient126200-2-0"
+       id="linearGradient9382"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(28.50002,64.927434)"
+       x1="111"
+       y1="442.86218"
+       x2="219"
+       y2="442.86218" />
+    <clipPath
+       id="SVGID_4550_-6">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8"
+         overflow="visible"
+         id="use82345-0" />
+    </clipPath>
+    <clipPath
+       id="clipPath9448">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4549_-8"
+         overflow="visible"
+         id="use9450" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4559_-4">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use82412-03" />
+    </clipPath>
+    <clipPath
+       id="clipPath9526">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9528" />
+    </clipPath>
+    <clipPath
+       id="clipPath9530">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9532" />
+    </clipPath>
+    <clipPath
+       id="clipPath9534">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9536" />
+    </clipPath>
+    <clipPath
+       id="clipPath9538">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9540" />
+    </clipPath>
+    <clipPath
+       id="clipPath9542">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="use9544" />
+    </clipPath>
+    <defs
+       id="defs82478">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4568_" />
+    </defs>
+    <clipPath
+       id="clipPath101841">
+      <use
+         id="use101843"
+         overflow="visible"
+         xlink:href="#SVGID_4568_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <defs
+       id="defs82443">
+      <rect
+         height="205.44099"
+         width="200.271"
+         y="181.315"
+         x="-682.31403"
+         id="SVGID_4563_" />
+    </defs>
+    <clipPath
+       id="clipPath101814">
+      <use
+         id="use101816"
+         overflow="visible"
+         xlink:href="#SVGID_4563_"
+         style="overflow:visible"
+         x="0"
+         y="0"
+         width="744.09448"
+         height="1052.3622" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-2">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-4" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-2" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6" />
+    </clipPath>
+    <clipPath
+       id="SVGID_4564_-7-9-3-4">
+      <use
+         height="1052.3622"
+         width="744.09448"
+         y="0"
+         x="0"
+         style="overflow:visible"
+         xlink:href="#SVGID_4563_"
+         overflow="visible"
+         id="use82447-2-1-6-0" />
+    </clipPath>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.0729879"
+     inkscape:cx="202.21003"
+     inkscape:cy="536.61458"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1535"
+     inkscape:window-height="876"
+     inkscape:window-x="65"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata104541">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <line
+       style="fill:none;stroke:#5e6a71;stroke-width:1.0268178;stroke-miterlimit:10;stroke-dasharray:3.07565499, 3.07565499"
+       stroke-miterlimit="10"
+       x1="277.38089"
+       y1="315.69797"
+       x2="277.38089"
+       y2="533.44318"
+       id="line84244" />
+    <rect
+       style="fill:none;stroke:#5e6a71;stroke-width:0.48500001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+       id="rect125410-1-2"
+       width="94.101288"
+       height="87.10128"
+       x="151.94936"
+       y="418.6185" />
+    <rect
+       style="fill:url(#linearGradient9382);fill-opacity:1;stroke:none"
+       id="rect126198-3-8"
+       width="108"
+       height="27"
+       x="139.50002"
+       y="494.28964" />
+    <rect
+       style="fill:#f15d57"
+       x="75.523293"
+       y="574.69031"
+       width="95.778"
+       height="3.0712502"
+       id="rect82236"
+       inkscape:transform-center-x="586.0074"
+       inkscape:transform-center-y="-79.564828" />
+    <rect
+       style="fill:#f15d57"
+       x="224.23932"
+       y="574.69031"
+       width="95.793755"
+       height="3.0712502"
+       id="rect82238"
+       inkscape:transform-center-x="437.28349"
+       inkscape:transform-center-y="-79.564828" />
+    <line
+       style="fill:none;stroke:#5e6a71;stroke-width:0.48150003;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
+       stroke-miterlimit="10"
+       x1="272.20041"
+       y1="577.34521"
+       x2="272.20041"
+       y2="631.72772"
+       id="line82244"
+       inkscape:transform-center-x="437.21928"
+       inkscape:transform-center-y="-51.254289" />
+    <polyline
+       style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       stroke-miterlimit="10"
+       points="  -603.212,292.128 -603.212,283.832 -582.187,283.832 -582.187,292.128 "
+       id="polyline82246"
+       inkscape:transform-center-x="437.22048"
+       inkscape:transform-center-y="-33.395941" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82281"
+       inkscape:transform-center-x="437.2835"
+       inkscape:transform-center-y="-95.804196">
+      <defs
+         id="defs82283">
+        <polygon
+           id="SVGID_4543_"
+           points="-613.901,253.224 -613.908,267.353 -571.554,267.32 -571.547,253.133 -593.085,258.293 " />
+      </defs>
+      <clipPath
+         id="clipPath101684">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4543_"
+           overflow="visible"
+           id="use101686" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101688"
+         gradientUnits="userSpaceOnUse"
+         x1="76.3899"
+         y1="97.785698"
+         x2="77.3899"
+         y2="97.785698"
+         gradientTransform="matrix(0,-19.5733,-19.5733,0,1321.2666,1762.5587)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101690" />
+        <stop
+           offset="0.0507"
+           style="stop-color:#68B4BF"
+           id="stop101692" />
+        <stop
+           offset="0.2116"
+           style="stop-color:#96C6CF"
+           id="stop101694" />
+        <stop
+           offset="0.3736"
+           style="stop-color:#BAD8DD"
+           id="stop101696" />
+        <stop
+           offset="0.5342"
+           style="stop-color:#D7E6EA"
+           id="stop101698" />
+        <stop
+           offset="0.693"
+           style="stop-color:#EBF2F3"
+           id="stop101700" />
+        <stop
+           offset="0.8492"
+           style="stop-color:#F8FBFB"
+           id="stop101702" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop101704" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4545_)"
+         x="-613.90802"
+         y="253.133"
+         clip-path="url(#SVGID_4544_)"
+         width="42.361"
+         height="14.22"
+         id="rect82306" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 319.54934,544.29505 -0.0157,31.37625 -94.815,0.072 0.0157,-31.2435 46.48275,11.31975 0.1125,0.027 0.11475,-0.027 48.105,-11.5245 z m 0.4815,-0.60975 -48.699,11.66625 -47.079,-11.46375 -0.0135,32.337 95.77575,-0.0743 0.0158,-32.46525 z"
+       id="path82308"
+       inkscape:transform-center-x="437.28456"
+       inkscape:transform-center-y="-95.835733" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g82310"
+       inkscape:transform-center-x="585.9972"
+       inkscape:transform-center-y="-95.804196">
+      <defs
+         id="defs82312">
+        <polygon
+           id="SVGID_4546_"
+           points="-679.997,253.224 -680.004,267.353 -637.65,267.32 -637.642,253.133 -659.18,258.293 " />
+      </defs>
+      <clipPath
+         id="clipPath101711">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4546_"
+           overflow="visible"
+           id="use101713" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient101715"
+         gradientUnits="userSpaceOnUse"
+         x1="76.3899"
+         y1="97.785698"
+         x2="77.3899"
+         y2="97.785698"
+         gradientTransform="matrix(0,-19.5733,-19.5733,0,1255.1711,1762.5587)">
+        <stop
+           offset="0"
+           style="stop-color:#55AEB9"
+           id="stop101717" />
+        <stop
+           offset="0.0507"
+           style="stop-color:#68B4BF"
+           id="stop101719" />
+        <stop
+           offset="0.2116"
+           style="stop-color:#96C6CF"
+           id="stop101721" />
+        <stop
+           offset="0.3736"
+           style="stop-color:#BAD8DD"
+           id="stop101723" />
+        <stop
+           offset="0.5342"
+           style="stop-color:#D7E6EA"
+           id="stop101725" />
+        <stop
+           offset="0.693"
+           style="stop-color:#EBF2F3"
+           id="stop101727" />
+        <stop
+           offset="0.8492"
+           style="stop-color:#F8FBFB"
+           id="stop101729" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop101731" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4548_)"
+         x="-680.00299"
+         y="253.133"
+         clip-path="url(#SVGID_4547_)"
+         width="42.361"
+         height="14.22"
+         id="rect82335" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 170.83559,544.29505 -0.0157,31.37625 -94.814996,0.072 0.01575,-31.2435 46.482736,11.31975 0.1125,0.027 0.11475,-0.027 48.10501,-11.5245 z m 0.4815,-0.60975 -48.699,11.66625 -47.078996,-11.46375 -0.0135,32.337 95.775746,-0.0743 0.0157,-32.46525 z"
+       id="path82337"
+       inkscape:transform-center-x="585.99834"
+       inkscape:transform-center-y="-95.835733" />
+    <text
+       y="567.99066"
+       x="104.52653"
+       id="text84236"
+       inkscape:transform-center-x="587.42372"
+       inkscape:transform-center-y="-90.601429"
+       style="font-size:27px">
+      <tspan
+         style="font-size:8px;fill:#37424b;font-family:ApexSans-Medium"
+         x="104.52653"
+         y="567.99066"
+         font-size="3.4203"
+         id="tspan84238">US-WEST</tspan>
+    </text>
+    <text
+       y="567.99066"
+       x="255.24185"
+       id="text84246"
+       inkscape:transform-center-x="438.70839"
+       inkscape:transform-center-y="-90.601429"
+       style="font-size:27px"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90"
+       inkscape:export-filename="/home/john/Pictures/zone-sync.png">
+      <tspan
+         style="font-size:8px;fill:#37424b;font-family:ApexSans-Medium"
+         x="255.24185"
+         y="567.99066"
+         font-size="3.4203"
+         id="tspan84248">US-EAST</tspan>
+    </text>
+    <rect
+       style="fill:#f15d57"
+       x="220.3154"
+       y="492.99048"
+       width="103.6395"
+       height="3.8114998"
+       id="rect84287"
+       inkscape:transform-center-x="437.28453"
+       inkscape:transform-center-y="-160.89453" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84289"
+       inkscape:transform-center-x="437.28348"
+       inkscape:transform-center-y="-131.54432">
+      <defs
+         id="defs84291">
+        <polygon
+           id="SVGID_4823_"
+           points="-592.788,256.788 -569.802,251.283 -569.804,231.934 -615.653,231.929 -615.653,251.221 " />
+      </defs>
+      <clipPath
+         id="clipPath103235">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4823_"
+           overflow="visible"
+           id="use103237" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103239"
+         gradientUnits="userSpaceOnUse"
+         x1="145.3168"
+         y1="2.8518"
+         x2="146.3168"
+         y2="2.8518"
+         gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-668.057,-3384.4426)">
+        <stop
+           offset="0"
+           style="stop-color:#FFFFFF"
+           id="stop103241" />
+        <stop
+           offset="0.23"
+           style="stop-color:#FFFFFF"
+           id="stop103243" />
+        <stop
+           offset="0.5671"
+           style="stop-color:#F9F9F9"
+           id="stop103245" />
+        <stop
+           offset="0.8674"
+           style="stop-color:#EDEEEE"
+           id="stop103247" />
+        <stop
+           offset="1"
+           style="stop-color:#E6E8E7"
+           id="stop103249" />
+      </linearGradient>
+      <polygon
+         style="fill:url(#SVGID_4825_)"
+         clip-path="url(#SVGID_4824_)"
+         points="-615.683,231.929 -569.802,231.874 -569.772,256.788 -615.653,256.843 "
+         id="polygon84308" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 220.79459,496.5208 102.67875,0.009 10e-4,43.1055 -51.4755,12.33 -51.20775,-12.46725 0.003,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.687,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.6395,-0.009 z"
+       id="path84310"
+       inkscape:transform-center-x="437.28484"
+       inkscape:transform-center-y="-131.54096" />
+    <text
+       y="513.2843"
+       x="243.95297"
+       id="text84312"
+       inkscape:transform-center-x="437.86922"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px">
+      <tspan
+         style="font-size:11px;fill:#37424b;font-family:ApexSans-Book"
+         x="243.95297"
+         y="513.2843"
+         font-size="5.1244"
+         id="tspan84314">RADOSGW</tspan>
+    </text>
+    <rect
+       style="fill:#f15d57"
+       x="70.568871"
+       y="492.99048"
+       width="103.6395"
+       height="3.8114998"
+       id="rect84318"
+       inkscape:transform-center-x="587.03108"
+       inkscape:transform-center-y="-160.89453" />
+    <g
+       id="g9328">
+      <line
+         id="line84244-3"
+         y2="533.36865"
+         x2="121.81088"
+         y1="315.62341"
+         x1="121.81088"
+         stroke-miterlimit="10"
+         style="fill:none;stroke:#5e6a71;stroke-width:1.0268178;stroke-miterlimit:10;stroke-dasharray:3.07565499, 3.07565499" />
+      <g
+         id="g82107-4"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs82109-6">
+          <polygon
+             points="-547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 -504.975,196.685 -504.975,188.287 "
+             id="SVGID_4519_-5" />
+        </defs>
+        <clipPath
+           id="clipPath126820-6">
+          <use
+             id="use126822-8"
+             overflow="visible"
+             xlink:href="#SVGID_4519_-5"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)"
+           y2="146.6937"
+           x2="41.840599"
+           y1="146.6937"
+           x1="40.840599"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient126824-4">
+          <stop
+             id="stop126826-2"
+             style="stop-color:#37424B"
+             offset="0" />
+          <stop
+             id="stop126828-3"
+             style="stop-color:#37424B"
+             offset="0.12" />
+          <stop
+             id="stop126830-7"
+             style="stop-color:#5E6A71"
+             offset="0.88" />
+          <stop
+             id="stop126832-6"
+             style="stop-color:#5E6A71"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82124-4"
+           height="10.191"
+           width="42.327"
+           clip-path="url(#SVGID_4520_-5-6)"
+           y="188.287"
+           x="-547.302"
+           style="fill:url(#linearGradient126904-61)" />
+      </g>
+      <g
+         id="g82126-0"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs82128-8">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4522_-8" />
+        </defs>
+        <clipPath
+           id="clipPath126838-9">
+          <use
+             id="use126840-87"
+             overflow="visible"
+             xlink:href="#SVGID_4522_-8"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82134-5"
+           d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
+           clip-path="url(#SVGID_4523_-1-5)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <path
+           id="path82136-0"
+           d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
+           clip-path="url(#SVGID_4523_-1-5)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <circle
+           id="circle82138-2"
+           r="0.63999999"
+           cy="191.26801"
+           cx="-541.625"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5)"
+           d="m -540.985,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+           sodipodi:cx="-541.625"
+           sodipodi:cy="191.26801"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <circle
+           id="circle82140-3"
+           r="0.63999999"
+           cy="193.623"
+           cx="-541.625"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5)"
+           d="m -540.985,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+           sodipodi:cx="-541.625"
+           sodipodi:cy="193.623"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <circle
+           id="circle82142-3"
+           r="0.63999999"
+           cy="191.26801"
+           cx="-543.85303"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5)"
+           d="m -543.21303,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+           sodipodi:cx="-543.85303"
+           sodipodi:cy="191.26801"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <circle
+           id="circle82144-4"
+           r="0.63999999"
+           cy="193.623"
+           cx="-543.854"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4523_-1-5)"
+           d="m -543.214,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35347,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28653,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+           sodipodi:cx="-543.854"
+           sodipodi:cy="193.623"
+           sodipodi:rx="0.63999999"
+           sodipodi:ry="0.63999999"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+        <path
+           id="path82146-1"
+           d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
+           clip-path="url(#SVGID_4523_-1-5)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <path
+           id="path82148-5"
+           d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
+           clip-path="url(#SVGID_4523_-1-5)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+      </g>
+      <text
+         style="font-size:40.5px"
+         id="text82150-7"
+         x="112.11884"
+         y="319.30515">
+        <tspan
+           id="tspan82152-4"
+           font-size="3.2027"
+           y="319.30515"
+           x="112.11884"
+           style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium">AP</tspan>
+        <tspan
+           id="tspan82154-9"
+           font-size="3.2027"
+           y="319.30515"
+           x="125.80093"
+           style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium">P</tspan>
+      </text>
+      <g
+         id="g84638-4"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs84640-9">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4852_-4" />
+        </defs>
+        <clipPath
+           id="clipPath126879-0">
+          <use
+             id="use126881-7"
+             overflow="visible"
+             xlink:href="#SVGID_4852_-4"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path84646-0"
+           d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4853_-8-0)"
+           inkscape:connector-curvature="0"
+           style="fill:#5e6a71" />
+        <line
+           id="line84648-6"
+           y2="205.991"
+           x2="-523.14398"
+           y1="205.991"
+           x1="-526.03998"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4853_-8-0)"
+           style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10" />
+      </g>
+      <g
+         id="g84650-5"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)">
+        <defs
+           id="defs84652-4">
+          <polygon
+             points="-521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 -507.673,203.458 "
+             id="SVGID_4854_-1" />
+        </defs>
+        <clipPath
+           id="clipPath126888-1">
+          <use
+             id="use126890-4"
+             overflow="visible"
+             xlink:href="#SVGID_4854_-1"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)"
+           y2="249.94031"
+           x2="-33.205101"
+           y1="249.94031"
+           x1="-34.205299"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient126892-7">
+          <stop
+             id="stop126894-5"
+             style="stop-color:#E6E8E7"
+             offset="0" />
+          <stop
+             id="stop126896-6"
+             style="stop-color:#FFFFFF"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect84663-7"
+           height="5.066"
+           width="15.759"
+           clip-path="url(#SVGID_4855_-2-24)"
+           y="203.45799"
+           x="-523.43201"
+           style="fill:url(#SVGID_4856_-4-1)" />
+      </g>
+      <polygon
+         id="polygon84665-6"
+         points="-521.64,203.459 -523.433,206 -521.64,208.524 -507.674,208.524 -507.674,203.459 "
+         stroke-miterlimit="10"
+         transform="matrix(3.375,0,0,3.375,1898.5131,-334.69083)"
+         style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10" />
+      <text
+         style="font-size:40.5px"
+         id="text84667-5"
+         x="151.0986"
+         y="363.4711">
+        <tspan
+           id="tspan84669-5"
+           font-size="2.5652"
+           y="363.4711"
+           x="151.0986"
+           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">RE</tspan>
+        <tspan
+           id="tspan84671-5"
+           font-size="2.5652"
+           y="363.4711"
+           x="160.27521"
+           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">S</tspan>
+        <tspan
+           id="tspan84673-2"
+           font-size="2.5652"
+           y="363.4711"
+           x="164.41296"
+           style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book">T</tspan>
+      </text>
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84320"
+       inkscape:transform-center-x="587.03111"
+       inkscape:transform-center-y="-131.54432">
+      <defs
+         id="defs84322">
+        <polygon
+           id="SVGID_4826_"
+           points="-659.342,256.788 -636.356,251.283 -636.358,231.934 -682.207,231.929 -682.208,251.221 " />
+      </defs>
+      <clipPath
+         id="clipPath103260">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4826_"
+           overflow="visible"
+           id="use103262" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103264"
+         gradientUnits="userSpaceOnUse"
+         x1="145.3168"
+         y1="2.8518"
+         x2="146.3168"
+         y2="2.8518"
+         gradientTransform="matrix(0.0299,24.8865,24.8865,-0.0299,-734.6116,-3384.4426)">
+        <stop
+           offset="0"
+           style="stop-color:#FFFFFF"
+           id="stop103266" />
+        <stop
+           offset="0.23"
+           style="stop-color:#FFFFFF"
+           id="stop103268" />
+        <stop
+           offset="0.5671"
+           style="stop-color:#F9F9F9"
+           id="stop103270" />
+        <stop
+           offset="0.8674"
+           style="stop-color:#EDEEEE"
+           id="stop103272" />
+        <stop
+           offset="1"
+           style="stop-color:#E6E8E7"
+           id="stop103274" />
+      </linearGradient>
+      <polygon
+         style="fill:url(#SVGID_4828_)"
+         clip-path="url(#SVGID_4827_)"
+         points="-682.238,231.929 -636.356,231.874 -636.326,256.788 -682.208,256.843 "
+         id="polygon84339" />
+    </g>
+    <path
+       style="fill:#e6e8e8"
+       inkscape:connector-curvature="0"
+       d="m 71.048094,496.5208 102.678746,0.009 10e-4,43.1055 -51.4755,12.33 -51.207746,-12.46725 0.0023,-42.97725 z m -0.4815,-0.4815 v 43.83675 l 51.686996,12.58425 51.957,-12.44475 -0.005,-43.96725 -103.639496,-0.009 z"
+       id="path84341"
+       inkscape:transform-center-x="587.03109"
+       inkscape:transform-center-y="-131.54096" />
+    <text
+       y="513.2843"
+       x="94.206009"
+       id="text84343"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px">
+      <tspan
+         style="font-size:11px;fill:#37424b;font-family:ApexSans-Book"
+         x="94.206009"
+         y="513.2843"
+         font-size="5.1244"
+         id="tspan84345">RADOSGW</tspan>
+    </text>
+    <line
+       style="fill:none;stroke:#5e6a71;stroke-width:0.48150003;stroke-miterlimit:10;stroke-dasharray:1.44225, 1.44225"
+       stroke-miterlimit="10"
+       x1="122.29416"
+       y1="577.34521"
+       x2="122.29416"
+       y2="631.72772"
+       id="line84349"
+       inkscape:transform-center-x="587.12555"
+       inkscape:transform-center-y="-51.254289" />
+    <polyline
+       style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10;stroke-dasharray:0.641, 0.641"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       stroke-miterlimit="10"
+       points="  -669.837,292.128 -669.837,283.832 -648.812,283.832 -648.812,292.128 "
+       id="polyline84351"
+       inkscape:transform-center-x="587.12673"
+       inkscape:transform-center-y="-33.395941" />
+    <polygon
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       points="-659.319,269.217 -657.251,267.424 -661.37,267.424 "
+       id="polygon84353"
+       inkscape:transform-center-x="587.09523"
+       inkscape:transform-center-y="-77.629816" />
+    <polygon
+       style="fill:#81d0db"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       points="-592.696,269.217 -590.628,267.424 -594.747,267.424 "
+       id="polygon84355"
+       inkscape:transform-center-x="437.19348"
+       inkscape:transform-center-y="-77.629816" />
+    <path
+       id="path84524"
+       d="m -365.856,302.434 c 0,-2.331 1.892,-4.222 4.225,-4.222 2.334,0 4.223,1.891 4.223,4.222 0,2.334 -1.889,4.226 -4.223,4.226 -2.333,0 -4.225,-1.892 -4.225,-4.226"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84526"
+       d="m -361.631,301.547 c 0.488,0 0.888,0.398 0.888,0.887 0,0.493 -0.4,0.892 -0.888,0.89 -0.491,0 -0.888,-0.397 -0.888,-0.89 0,-0.489 0.397,-0.887 0.888,-0.887"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84528"
+       d="m -347.575,299.54 c 0.487,0 0.886,0.395 0.886,0.886 0,0.494 -0.399,0.891 -0.886,0.891 -0.493,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.395,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84530"
+       d="m -350.839,302.809 c 0.49,0 0.886,0.397 0.886,0.886 0,0.494 -0.396,0.893 -0.886,0.893 -0.491,0 -0.889,-0.399 -0.889,-0.893 0,-0.489 0.398,-0.886 0.889,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84532"
+       d="m -350.838,299.54 c 0.489,0 0.885,0.395 0.885,0.886 0,0.494 -0.396,0.891 -0.885,0.891 -0.492,0 -0.89,-0.397 -0.89,-0.891 0,-0.491 0.398,-0.886 0.89,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84534"
+       d="m -347.576,302.809 c 0.488,0 0.888,0.397 0.888,0.886 0,0.494 -0.4,0.893 -0.888,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84536"
+       d="m -344.311,302.809 c 0.488,0 0.886,0.397 0.886,0.886 0,0.494 -0.398,0.893 -0.886,0.893 -0.491,0 -0.888,-0.399 -0.888,-0.893 0,-0.489 0.397,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <path
+       id="path84538"
+       d="m -344.31,299.54 c 0.487,0 0.885,0.395 0.885,0.886 0,0.494 -0.398,0.891 -0.885,0.891 -0.492,0 -0.888,-0.397 -0.888,-0.891 0,-0.491 0.396,-0.886 0.888,-0.886"
+       clip-path="url(#SVGID_4843_)"
+       inkscape:connector-curvature="0"
+       style="fill:#ffffff"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <line
+       id="line84540"
+       y2="308.98499"
+       x2="-343.42499"
+       y1="308.98499"
+       x1="-365.664"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4843_)"
+       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <line
+       id="line84542"
+       y2="311.16699"
+       x2="-343.42499"
+       y1="311.16699"
+       x1="-365.664"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4843_)"
+       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <line
+       id="line84544"
+       y2="313.35001"
+       x2="-343.42499"
+       y1="313.35001"
+       x1="-365.664"
+       stroke-miterlimit="10"
+       clip-path="url(#SVGID_4843_)"
+       style="fill:none;stroke:#ffffff;stroke-width:0.428;stroke-miterlimit:10"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84564"
+       points="-436.6,208.359 -434.532,206.566 -438.651,206.566 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84566"
+       points="-426.089,208.359 -424.021,206.566 -428.14,206.566 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84568"
+       points="-415.575,208.359 -413.507,206.566 -417.626,206.566 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <polygon
+       id="polygon84570"
+       points="-296.627,290.885 -294.559,289.091 -298.678,289.091 "
+       clip-path="url(#SVGID_4843_)"
+       style="fill:#f15d57"
+       transform="matrix(1.5,0,0,1.5,1063.2832,192.41394)" />
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84714"
+       inkscape:transform-center-x="434.5295"
+       inkscape:transform-center-y="-60.127066">
+      <defs
+         id="defs84716">
+        <rect
+           id="SVGID_4862_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103539">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4862_"
+           overflow="visible"
+           id="use103541" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4863_)"
+         d="m -593.321,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84722" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#SVGID_4863_)"
+         stroke-miterlimit="10"
+         x1="-592.68903"
+         y1="276.099"
+         x2="-589.79303"
+         y2="276.099"
+         id="line84724" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84726"
+       inkscape:transform-center-x="413.59995"
+       inkscape:transform-center-y="-60.127083">
+      <defs
+         id="defs84728">
+        <polygon
+           id="SVGID_4864_"
+           points="-590.081,276.108 -588.288,278.632 -574.322,278.632 -574.322,273.567 -588.288,273.567 " />
+      </defs>
+      <clipPath
+         id="clipPath103548">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4864_"
+           overflow="visible"
+           id="use103550" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103552"
+         gradientUnits="userSpaceOnUse"
+         x1="-34.205299"
+         y1="249.9404"
+         x2="-33.205299"
+         y2="249.9404"
+         gradientTransform="matrix(0,-5.065,-5.065,0,683.7546,105.3813)">
+        <stop
+           offset="0"
+           style="stop-color:#E6E8E7"
+           id="stop103554" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop103556" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4866_)"
+         x="-590.08099"
+         y="273.56699"
+         clip-path="url(#SVGID_4865_)"
+         width="15.759"
+         height="5.0650001"
+         id="rect84739" />
+    </g>
+    <polygon
+       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       stroke-miterlimit="10"
+       points="-590.082,276.108 -588.289,278.632 -574.323,278.632 -574.323,273.567 -588.289,273.567 "
+       id="polygon84741"
+       inkscape:transform-center-x="413.60223"
+       inkscape:transform-center-y="-60.127066" />
+    <text
+       y="597.62451"
+       x="287.82977"
+       id="text84743"
+       inkscape:transform-center-x="412.33742"
+       inkscape:transform-center-y="-60.270044"
+       style="font-size:27px">
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="287.82977"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84745">N</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="291.70874"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84747">A</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="294.77774"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84749">TIV</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="302.49078"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84751">E</tspan>
+    </text>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84753"
+       inkscape:transform-center-x="584.45598"
+       inkscape:transform-center-y="-60.127066">
+      <defs
+         id="defs84755">
+        <rect
+           id="SVGID_4867_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath103568">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4867_"
+           overflow="visible"
+           id="use103570" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4868_)"
+         d="m -659.955,276.099 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84761" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#SVGID_4868_)"
+         stroke-miterlimit="10"
+         x1="-659.323"
+         y1="276.099"
+         x2="-656.427"
+         y2="276.099"
+         id="line84763" />
+    </g>
+    <g
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       id="g84765"
+       inkscape:transform-center-x="563.5265"
+       inkscape:transform-center-y="-60.127083">
+      <defs
+         id="defs84767">
+        <polygon
+           id="SVGID_4869_"
+           points="-656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 " />
+      </defs>
+      <clipPath
+         id="clipPath103577">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4869_"
+           overflow="visible"
+           id="use103579" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient103581"
+         gradientUnits="userSpaceOnUse"
+         x1="-34.205299"
+         y1="249.94051"
+         x2="-33.205299"
+         y2="249.94051"
+         gradientTransform="matrix(0,-5.065,-5.065,0,617.1209,105.3813)">
+        <stop
+           offset="0"
+           style="stop-color:#E6E8E7"
+           id="stop103583" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop103585" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4871_)"
+         x="-656.71503"
+         y="273.56699"
+         clip-path="url(#SVGID_4870_)"
+         width="15.759"
+         height="5.0650001"
+         id="rect84778" />
+    </g>
+    <polygon
+       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+       transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+       stroke-miterlimit="10"
+       points="-656.715,276.108 -654.922,278.632 -640.956,278.632 -640.956,273.567 -654.922,273.567 "
+       id="polygon84780"
+       inkscape:transform-center-x="563.52648"
+       inkscape:transform-center-y="-60.127066" />
+    <text
+       y="597.62451"
+       x="137.9046"
+       id="text84782"
+       inkscape:transform-center-x="562.26258"
+       inkscape:transform-center-y="-60.270044"
+       style="font-size:27px">
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="137.9046"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84784">N</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="141.7836"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84786">A</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="144.85263"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84788">TIV</tspan>
+      <tspan
+         style="font-size:5.77170038px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="152.56561"
+         y="597.62451"
+         font-size="2.5652"
+         id="tspan84790">E</tspan>
+    </text>
+    <text
+       xml:space="preserve"
+       style="font-size:8px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="285.86542"
+       y="577.40869"
+       id="text113406"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan113408"
+         x="285.86542"
+         y="577.40869" /></text>
+    <text
+       y="832.10559"
+       x="242.41013"
+       id="text84343-2"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="197.43796"
+         y="832.10559"
+         font-size="5.1244"
+         id="tspan84345-2">MASTER REGION</tspan>
+    </text>
+    <text
+       y="926.36633"
+       x="288.45654"
+       id="text84343-2-6"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="249.24219"
+         y="926.36633"
+         font-size="5.1244"
+         id="tspan84345-2-5" />
+    </text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot126352"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
+         id="flowRegion126354"><rect
+           id="rect126356"
+           width="0"
+           height="51"
+           x="247"
+           y="928.36218" /></flowRegion><flowPara
+         id="flowPara126358" /></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot126403"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
+         id="flowRegion126405"><rect
+           id="rect126407"
+           width="185"
+           height="81"
+           x="286"
+           y="941.36218" /></flowRegion><flowPara
+         id="flowPara126409" /></flowRoot>    <flowRoot
+       xml:space="preserve"
+       id="flowRoot126411"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:9px;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;text-align:center"><flowRegion
+         id="flowRegion126413"><rect
+           id="rect126415"
+           width="89"
+           height="64"
+           x="285"
+           y="943.36218" /></flowRegion><flowPara
+         id="flowPara126417" /></flowRoot>    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="272"
+       y="529.64587"
+       id="text126456"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan126458"
+         x="272"
+         y="529.64587">MASTER</tspan><tspan
+         sodipodi:role="line"
+         x="272"
+         y="540.89587"
+         id="tspan126460">ZONE</tspan></text>
+    <polygon
+       id="polygon84546-9-3"
+       points="-667.777,292.47 -671.896,292.47 -669.845,294.263 "
+       clip-path="url(#SVGID_4843_-9-6)"
+       style="fill:#f15d57"
+       transform="matrix(2.25,0,0,2.25,1658.932,-169.71257)" />
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="122.23143"
+       y="529.64587"
+       id="text126655-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan126657-2"
+         x="122.23143"
+         y="529.64587">SECONDARY</tspan><tspan
+         sodipodi:role="line"
+         x="122.23143"
+         y="540.89587"
+         id="tspan126659-4">ZONE</tspan></text>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g82107">
+      <defs
+         id="defs82109">
+        <polygon
+           id="SVGID_4519_"
+           points="-504.975,196.685 -504.975,188.287 -547.302,188.287 -547.302,196.684 -528.257,196.685 -526.139,198.478 -524.02,196.685 " />
+      </defs>
+      <clipPath
+         id="clipPath126820">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4519_"
+           overflow="visible"
+           id="use126822" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient126824"
+         gradientUnits="userSpaceOnUse"
+         x1="40.840599"
+         y1="146.6937"
+         x2="41.840599"
+         y2="146.6937"
+         gradientTransform="matrix(0,-10.1906,-10.1906,0,968.7597,614.6687)">
+        <stop
+           offset="0"
+           style="stop-color:#37424B"
+           id="stop126826" />
+        <stop
+           offset="0.12"
+           style="stop-color:#37424B"
+           id="stop126828" />
+        <stop
+           offset="0.88"
+           style="stop-color:#5E6A71"
+           id="stop126830" />
+        <stop
+           offset="1"
+           style="stop-color:#5E6A71"
+           id="stop126832" />
+      </linearGradient>
+      <rect
+         style="fill:url(#linearGradient126904)"
+         x="-547.302"
+         y="188.287"
+         clip-path="url(#SVGID_4520_-5)"
+         width="42.327"
+         height="10.191"
+         id="rect82124" />
+    </g>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g82126">
+      <defs
+         id="defs82128">
+        <rect
+           id="SVGID_4522_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath126838">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4522_"
+           overflow="visible"
+           id="use126840" />
+      </clipPath>
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -539.397,191.908 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.287,-0.642 0.64,-0.641 0.354,0 0.639,0.287 0.639,0.641 0,0.353 -0.285,0.639 -0.639,0.639"
+         id="path82134" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -539.397,194.263 c -0.353,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.287,-0.642 0.64,-0.642 0.354,0 0.639,0.287 0.639,0.642 0,0.353 -0.285,0.639 -0.639,0.639"
+         id="path82136" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="191.26801"
+         sodipodi:cx="-541.625"
+         d="m -540.985,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-541.625"
+         cy="191.26801"
+         r="0.63999999"
+         id="circle82138" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="193.623"
+         sodipodi:cx="-541.625"
+         d="m -540.985,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-541.625"
+         cy="193.623"
+         r="0.63999999"
+         id="circle82140" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="191.26801"
+         sodipodi:cx="-543.85303"
+         d="m -543.21303,191.26801 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35346,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35347 0.28654,-0.64 0.64,-0.64 0.35346,0 0.64,0.28653 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-543.85303"
+         cy="191.26801"
+         r="0.63999999"
+         id="circle82142" />
+      <circle
+         style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+         sodipodi:ry="0.63999999"
+         sodipodi:rx="0.63999999"
+         sodipodi:cy="193.623"
+         sodipodi:cx="-543.854"
+         d="m -543.214,193.623 c 0,0.35346 -0.28654,0.64 -0.64,0.64 -0.35347,0 -0.64,-0.28654 -0.64,-0.64 0,-0.35346 0.28653,-0.64 0.64,-0.64 0.35346,0 0.64,0.28654 0.64,0.64 z"
+         clip-path="url(#SVGID_4523_-1)"
+         stroke-miterlimit="10"
+         cx="-543.854"
+         cy="193.623"
+         r="0.63999999"
+         id="circle82144" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -537.169,191.908 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.354 0.286,-0.642 0.64,-0.641 0.354,0 0.64,0.287 0.64,0.641 0,0.353 -0.286,0.639 -0.64,0.639"
+         id="path82146" />
+      <path
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4523_-1)"
+         d="m -537.169,194.263 c -0.354,0 -0.64,-0.286 -0.64,-0.639 0,-0.355 0.286,-0.642 0.64,-0.642 0.354,0 0.64,0.287 0.64,0.642 0,0.353 -0.286,0.639 -0.64,0.639"
+         id="path82148" />
+    </g>
+    <text
+       y="319.3797"
+       x="267.68884"
+       id="text82150"
+       style="font-size:40.5px">
+      <tspan
+         style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="267.68884"
+         y="319.3797"
+         font-size="3.2027"
+         id="tspan82152">AP</tspan>
+      <tspan
+         style="font-size:10.80911255px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="281.37094"
+         y="319.3797"
+         font-size="3.2027"
+         id="tspan82154">P</tspan>
+    </text>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g84638">
+      <defs
+         id="defs84640">
+        <rect
+           id="SVGID_4852_"
+           x="-682.31403"
+           y="181.315"
+           width="200.271"
+           height="205.44099" />
+      </defs>
+      <clipPath
+         id="clipPath126879">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4852_"
+           overflow="visible"
+           id="use126881" />
+      </clipPath>
+      <path
+         style="fill:#5e6a71"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4853_-8)"
+         d="m -526.673,205.991 c 0,-0.349 0.282,-0.632 0.632,-0.632 0.349,0 0.632,0.283 0.632,0.632 0,0.35 -0.283,0.633 -0.632,0.633 -0.35,0 -0.632,-0.283 -0.632,-0.633"
+         id="path84646" />
+      <line
+         style="fill:none;stroke:#5e6a71;stroke-width:0.214;stroke-miterlimit:10"
+         clip-path="url(#SVGID_4853_-8)"
+         stroke-miterlimit="10"
+         x1="-526.03998"
+         y1="205.991"
+         x2="-523.14398"
+         y2="205.991"
+         id="line84648" />
+    </g>
+    <g
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       id="g84650">
+      <defs
+         id="defs84652">
+        <polygon
+           id="SVGID_4854_"
+           points="-507.673,203.458 -521.64,203.458 -523.432,206 -521.64,208.524 -507.673,208.524 " />
+      </defs>
+      <clipPath
+         id="clipPath126888">
+        <use
+           height="1052.3622"
+           width="744.09448"
+           y="0"
+           x="0"
+           style="overflow:visible"
+           xlink:href="#SVGID_4854_"
+           overflow="visible"
+           id="use126890" />
+      </clipPath>
+      <linearGradient
+         id="linearGradient126892"
+         gradientUnits="userSpaceOnUse"
+         x1="-34.205299"
+         y1="249.94031"
+         x2="-33.205101"
+         y2="249.94031"
+         gradientTransform="matrix(0,-5.065,-5.065,0,750.4031,35.2731)">
+        <stop
+           offset="0"
+           style="stop-color:#E6E8E7"
+           id="stop126894" />
+        <stop
+           offset="1"
+           style="stop-color:#FFFFFF"
+           id="stop126896" />
+      </linearGradient>
+      <rect
+         style="fill:url(#SVGID_4856_-4)"
+         x="-523.43201"
+         y="203.45799"
+         clip-path="url(#SVGID_4855_-2)"
+         width="15.759"
+         height="5.066"
+         id="rect84663" />
+    </g>
+    <polygon
+       style="fill:none;stroke:#e6e8e8;stroke-width:0.214;stroke-miterlimit:10"
+       transform="matrix(3.375,0,0,3.375,2054.0831,-334.61629)"
+       stroke-miterlimit="10"
+       points="-507.674,203.459 -521.64,203.459 -523.433,206 -521.64,208.524 -507.674,208.524 "
+       id="polygon84665" />
+    <text
+       y="363.54565"
+       x="306.66861"
+       id="text84667"
+       style="font-size:40.5px">
+      <tspan
+         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="306.66861"
+         y="363.54565"
+         font-size="2.5652"
+         id="tspan84669">RE</tspan>
+      <tspan
+         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="315.84521"
+         y="363.54565"
+         font-size="2.5652"
+         id="tspan84671">S</tspan>
+      <tspan
+         style="font-size:8.65755081px;fill:#5e6a71;font-family:ApexSans-Book"
+         x="319.98297"
+         y="363.54565"
+         font-size="2.5652"
+         id="tspan84673">T</tspan>
+    </text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="197.07527"
+       y="438.16864"
+       id="text127418"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan127420"
+         x="197.07527"
+         y="438.16864">DATA</tspan><tspan
+         sodipodi:role="line"
+         x="197.07527"
+         y="449.41864"
+         id="tspan127422">SYNC</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:9px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="232.25806"
+       y="178.16862"
+       id="text127482"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan127484"
+         x="232.25806"
+         y="178.16862" /></text>
+    <text
+       y="247.60512"
+       x="242.41013"
+       id="text84343-2-0"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="197.43796"
+         y="247.60512"
+         font-size="5.1244"
+         id="tspan84345-2-6">MASTER REGION</tspan>
+    </text>
+    <g
+       id="g17978">
+      <g
+         inkscape:transform-center-y="50.765304"
+         inkscape:transform-center-x="262.3321"
+         id="g82158"
+         transform="matrix(1.3542118,0,0,2.25,996.72494,-25.560183)">
+        <defs
+           id="defs82160">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4524_" />
+        </defs>
+        <clipPath
+           id="clipPath101582">
+          <use
+             id="use101584"
+             overflow="visible"
+             xlink:href="#SVGID_4524_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <g
+           id="g82166"
+           clip-path="url(#SVGID_4525_)">
+          <g
+             id="g82168">
+            <defs
+               id="defs82170">
+              <rect
+                 height="64.251999"
+                 width="175.168"
+                 y="293.259"
+                 x="-679.67902"
+                 id="SVGID_4526_" />
+            </defs>
+            <clipPath
+               id="clipPath101590">
+              <use
+                 id="use101592"
+                 overflow="visible"
+                 xlink:href="#SVGID_4526_"
+                 style="overflow:visible"
+                 x="0"
+                 y="0"
+                 width="744.09448"
+                 height="1052.3622" />
+            </clipPath>
+            <g
+               id="g82176"
+               clip-path="url(#SVGID_4527_)">
+              <defs
+                 id="defs82178">
+                <rect
+                   height="64.037003"
+                   width="174.953"
+                   y="293.367"
+                   x="-679.57202"
+                   id="SVGID_4528_" />
+              </defs>
+              <clipPath
+                 id="clipPath101597">
+                <use
+                   id="use101599"
+                   overflow="visible"
+                   xlink:href="#SVGID_4528_"
+                   style="overflow:visible"
+                   x="0"
+                   y="0"
+                   width="744.09448"
+                   height="1052.3622" />
+              </clipPath>
+              <linearGradient
+                 gradientTransform="matrix(0,64.0388,-64.0388,0,3308.0217,-7826.8223)"
+                 y2="60.902401"
+                 x2="127.8011"
+                 y1="60.902401"
+                 x1="126.8011"
+                 gradientUnits="userSpaceOnUse"
+                 id="linearGradient101601">
+                <stop
+                   id="stop101603"
+                   style="stop-color:#E6E8E7"
+                   offset="0" />
+                <stop
+                   id="stop101605"
+                   style="stop-color:#FFFFFF"
+                   offset="1" />
+              </linearGradient>
+              <rect
+                 id="rect82189"
+                 height="64.038002"
+                 width="174.953"
+                 clip-path="url(#SVGID_4529_)"
+                 y="293.366"
+                 x="-679.57202"
+                 style="fill:url(#SVGID_4530_)" />
+            </g>
+            <g
+               id="g82191"
+               clip-path="url(#SVGID_4527_)">
+              <defs
+                 id="defs82193">
+                <rect
+                   height="64.251999"
+                   width="175.168"
+                   y="293.259"
+                   x="-679.67902"
+                   id="SVGID_4531_" />
+              </defs>
+              <clipPath
+                 id="clipPath101611">
+                <use
+                   id="use101613"
+                   overflow="visible"
+                   xlink:href="#SVGID_4531_"
+                   style="overflow:visible"
+                   x="0"
+                   y="0"
+                   width="744.09448"
+                   height="1052.3622" />
+              </clipPath>
+              <rect
+                 id="rect82199"
+                 height="64.038002"
+                 width="174.953"
+                 stroke-miterlimit="10"
+                 clip-path="url(#SVGID_4532_)"
+                 y="293.366"
+                 x="-679.57202"
+                 style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="g82201"
+           clip-path="url(#SVGID_4525_)">
+          <g
+             id="g82203">
+            <defs
+               id="defs82205">
+              <rect
+                 height="64.251999"
+                 width="45.873001"
+                 y="293.259"
+                 x="-441.56699"
+                 id="SVGID_4533_" />
+            </defs>
+            <clipPath
+               id="clipPath101620">
+              <use
+                 id="use101622"
+                 overflow="visible"
+                 xlink:href="#SVGID_4533_"
+                 style="overflow:visible"
+                 x="0"
+                 y="0"
+                 width="744.09448"
+                 height="1052.3622" />
+            </clipPath>
+            <g
+               id="g82211"
+               clip-path="url(#SVGID_4534_)">
+              <defs
+                 id="defs82213">
+                <rect
+                   height="64.037003"
+                   width="45.659"
+                   y="293.367"
+                   x="-441.45999"
+                   id="SVGID_4535_" />
+              </defs>
+              <clipPath
+                 id="clipPath101627">
+                <use
+                   id="use101629"
+                   overflow="visible"
+                   xlink:href="#SVGID_4535_"
+                   style="overflow:visible"
+                   x="0"
+                   y="0"
+                   width="744.09448"
+                   height="1052.3622" />
+              </clipPath>
+              <linearGradient
+                 gradientTransform="matrix(0,64.0388,-64.0388,0,3481.4861,-7826.8223)"
+                 y2="60.902401"
+                 x2="127.8011"
+                 y1="60.902401"
+                 x1="126.8011"
+                 gradientUnits="userSpaceOnUse"
+                 id="linearGradient101631">
+                <stop
+                   id="stop101633"
+                   style="stop-color:#E6E8E7"
+                   offset="0" />
+                <stop
+                   id="stop101635"
+                   style="stop-color:#FFFFFF"
+                   offset="1" />
+              </linearGradient>
+              <rect
+                 id="rect82224"
+                 height="64.038002"
+                 width="45.659"
+                 clip-path="url(#SVGID_4536_)"
+                 y="293.366"
+                 x="-441.45999"
+                 style="fill:url(#SVGID_4537_)" />
+            </g>
+            <g
+               id="g82226"
+               clip-path="url(#SVGID_4534_)">
+              <defs
+                 id="defs82228">
+                <rect
+                   height="64.251999"
+                   width="45.873001"
+                   y="293.259"
+                   x="-441.56699"
+                   id="SVGID_4538_" />
+              </defs>
+              <clipPath
+                 id="clipPath101641">
+                <use
+                   id="use101643"
+                   overflow="visible"
+                   xlink:href="#SVGID_4538_"
+                   style="overflow:visible"
+                   x="0"
+                   y="0"
+                   width="744.09448"
+                   height="1052.3622" />
+              </clipPath>
+              <rect
+                 id="rect82234"
+                 height="64.038002"
+                 width="45.659"
+                 stroke-miterlimit="10"
+                 clip-path="url(#SVGID_4539_)"
+                 y="293.366"
+                 x="-441.45999"
+                 style="fill:none;stroke:#f15d57;stroke-width:0.214;stroke-miterlimit:10" />
+            </g>
+          </g>
+        </g>
+      </g>
+      <g
+         inkscape:transform-center-y="45.666809"
+         inkscape:transform-center-x="449.81598"
+         id="g82339"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82341">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4549_" />
+        </defs>
+        <clipPath
+           id="clipPath101738">
+          <use
+             id="use101740"
+             overflow="visible"
+             xlink:href="#SVGID_4549_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82347"
+           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           clip-path="url(#SVGID_4550_)"
+           inkscape:connector-curvature="0"
+           style="fill:#f15d57" />
+        <path
+           id="path82349"
+           d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4550_)"
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+      </g>
+      <text
+         inkscape:transform-center-y="45.543285"
+         inkscape:transform-center-x="450.06672"
+         id="text82351"
+         font-size="4.3343"
+         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="275.14355"
+         y="704.88873">M</text>
+      <g
+         inkscape:transform-center-y="71.647559"
+         inkscape:transform-center-x="503.22873"
+         id="g82353"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82355">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4551_" />
+        </defs>
+        <clipPath
+           id="clipPath101748">
+          <use
+             id="use101750"
+             overflow="visible"
+             xlink:href="#SVGID_4551_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82361"
+           d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           clip-path="url(#SVGID_4552_)"
+           inkscape:connector-curvature="0"
+           style="fill:#f15d57" />
+        <path
+           id="path82363"
+           d="m -625.77,338.014 c 0,0.213 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.172 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4552_)"
+           inkscape:connector-curvature="0"
+           style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10" />
+      </g>
+      <text
+         inkscape:transform-center-y="71.524915"
+         inkscape:transform-center-x="503.47899"
+         id="text82365"
+         font-size="4.3343"
+         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="201.73129"
+         y="730.87036">M</text>
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82381"
+         height="21.584251"
+         width="21.581999"
+         y="664.59583"
+         x="87.659889"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.597191"
+         inkscape:transform-center-x="610.96881"
+         id="rect82383"
+         height="21.584251"
+         width="21.581999"
+         stroke-miterlimit="10"
+         y="664.59583"
+         x="87.659889"
+         style="fill:none;stroke:#81d0db;stroke-width:0.96300006;stroke-miterlimit:10" />
+      <rect
+         inkscape:transform-center-y="19.598295"
+         inkscape:transform-center-x="610.97115"
+         id="rect82385"
+         height="18.553501"
+         width="18.557999"
+         y="666.1123"
+         x="89.169548"
+         style="fill:#81d0db" />
+      <rect
+         inkscape:transform-center-y="19.597131"
+         inkscape:transform-center-x="610.96883"
+         id="rect82387"
+         height="15.594751"
+         width="15.592501"
+         y="667.59052"
+         x="90.654625"
+         style="fill:#ffffff" />
+      <rect
+         inkscape:transform-center-y="19.595982"
+         inkscape:transform-center-x="610.97103"
+         id="rect82389"
+         height="10.278"
+         width="10.282501"
+         y="670.24774"
+         x="93.307411"
+         style="fill:#ffffff" />
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="610.97111"
+         id="g82391"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82393">
+          <path
+             d="m -672.614,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4555_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101773">
+          <use
+             id="use101775"
+             overflow="visible"
+             xlink:href="#SVGID_4555_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1066.0031)"
+           y2="-148.46021"
+           x2="256.3761"
+           y1="-148.46021"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101777">
+          <stop
+             id="stop101779"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101781"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82404"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4556_)"
+           y="308.841"
+           x="-672.61401"
+           style="fill:url(#SVGID_4557_)" />
+      </g>
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         x="-650.77399"
+         y="306.73599"
+         clip-path="url(#SVGID_4564_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82451" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-650.77399"
+         y="306.73599"
+         clip-path="url(#SVGID_4564_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82453" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#81d0db"
+         x="-650.10303"
+         y="307.41"
+         clip-path="url(#SVGID_4564_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82455" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         x="-649.44299"
+         y="308.06699"
+         clip-path="url(#SVGID_4564_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82457" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         x="-648.26398"
+         y="309.24799"
+         clip-path="url(#SVGID_4564_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82459" />
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="557.09937"
+         id="g82461"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82463">
+          <path
+             d="m -648.671,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4565_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101827">
+          <use
+             id="use101829"
+             overflow="visible"
+             xlink:href="#SVGID_4565_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1066.0031)"
+           y2="-148.4601"
+           x2="256.3761"
+           y1="-148.4601"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101831">
+          <stop
+             id="stop101833"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101835"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82474"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4566_)"
+           y="308.841"
+           x="-648.67102"
+           style="fill:url(#SVGID_4567_)" />
+      </g>
+      <path
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4569_)"
+         d="m -646.611,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82484" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         x="-638.80298"
+         y="306.73599"
+         clip-path="url(#SVGID_4569_)"
+         width="9.592"
+         height="9.5930004"
+         id="rect82486" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10"
+         x="-638.80298"
+         y="306.73599"
+         clip-path="url(#SVGID_4569_)"
+         stroke-miterlimit="10"
+         width="9.592"
+         height="9.5930004"
+         id="rect82488" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#81d0db"
+         x="-638.13202"
+         y="307.41"
+         clip-path="url(#SVGID_4569_)"
+         width="8.2480001"
+         height="8.2460003"
+         id="rect82490" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         x="-637.47198"
+         y="308.06699"
+         clip-path="url(#SVGID_4569_)"
+         width="6.9299998"
+         height="6.9310002"
+         id="rect82492" />
+      <rect
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#ffffff"
+         x="-636.29199"
+         y="309.24799"
+         clip-path="url(#SVGID_4569_)"
+         width="4.5700002"
+         height="4.5679998"
+         id="rect82494" />
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="530.16231"
+         id="g82496"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82498">
+          <path
+             d="m -636.699,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.485 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4570_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101854">
+          <use
+             id="use101856"
+             overflow="visible"
+             xlink:href="#SVGID_4570_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1066.0031)"
+           y2="-148.46001"
+           x2="256.3761"
+           y1="-148.46001"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101858">
+          <stop
+             id="stop101860"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101862"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82509"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4571_)"
+           y="308.841"
+           x="-636.69897"
+           style="fill:url(#SVGID_4572_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.597166"
+         inkscape:transform-center-x="511.76858"
+         id="g82511"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82513">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4573_" />
+        </defs>
+        <clipPath
+           id="clipPath101868">
+          <use
+             id="use101870"
+             overflow="visible"
+             xlink:href="#SVGID_4573_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82519"
+           d="m -634.639,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4574_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82521"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4574_)"
+           y="306.73599"
+           x="-626.83099"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82523"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4574_)"
+           y="306.73599"
+           x="-626.83099"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82525"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4574_)"
+           y="307.41"
+           x="-626.15997"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82527"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4574_)"
+           y="308.06699"
+           x="-625.5"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82529"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4574_)"
+           y="309.24799"
+           x="-624.32098"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="503.22762"
+         id="g82531"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82533">
+          <path
+             d="m -624.728,311.531 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.205 -2.693,2.69"
+             id="SVGID_4575_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101881">
+          <use
+             id="use101883"
+             overflow="visible"
+             xlink:href="#SVGID_4575_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1066.0031)"
+           y2="-148.4601"
+           x2="256.3761"
+           y1="-148.4601"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101885">
+          <stop
+             id="stop101887"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101889"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82544"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4576_)"
+           y="308.841"
+           x="-624.72803"
+           style="fill:url(#SVGID_4577_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.597166"
+         inkscape:transform-center-x="484.83387"
+         id="g82546"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82548">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4578_" />
+        </defs>
+        <clipPath
+           id="clipPath101895">
+          <use
+             id="use101897"
+             overflow="visible"
+             xlink:href="#SVGID_4578_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82554"
+           d="m -622.668,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4579_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82556"
+           height="9.5930004"
+           width="9.5930004"
+           clip-path="url(#SVGID_4579_)"
+           y="306.73599"
+           x="-614.85999"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82558"
+           height="9.5930004"
+           width="9.5930004"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4579_)"
+           y="306.73599"
+           x="-614.86102"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82560"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4579_)"
+           y="307.41"
+           x="-614.18799"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82562"
+           height="6.9310002"
+           width="6.9310002"
+           clip-path="url(#SVGID_4579_)"
+           y="308.06699"
+           x="-613.52899"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82564"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4579_)"
+           y="309.24799"
+           x="-612.349"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="476.2917"
+         id="g82566"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82568">
+          <path
+             d="m -612.756,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4580_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101908">
+          <use
+             id="use101910"
+             overflow="visible"
+             xlink:href="#SVGID_4580_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1066.0031)"
+           y2="-148.4601"
+           x2="256.3761"
+           y1="-148.4601"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101912">
+          <stop
+             id="stop101914"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101916"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82579"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4581_)"
+           y="308.841"
+           x="-612.75598"
+           style="fill:url(#SVGID_4582_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.597166"
+         inkscape:transform-center-x="457.89686"
+         id="g82581"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82583">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4583_" />
+        </defs>
+        <clipPath
+           id="clipPath101922">
+          <use
+             id="use101924"
+             overflow="visible"
+             xlink:href="#SVGID_4583_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82589"
+           d="m -610.696,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4584_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82591"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4584_)"
+           y="306.73599"
+           x="-602.888"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82593"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4584_)"
+           y="306.73599"
+           x="-602.888"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82595"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4584_)"
+           y="307.41"
+           x="-602.21698"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82597"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4584_)"
+           y="308.06699"
+           x="-601.55701"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82599"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4584_)"
+           y="309.24799"
+           x="-600.37799"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="449.35694"
+         id="g82601"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82603">
+          <path
+             d="m -600.785,311.531 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.203,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4585_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101935">
+          <use
+             id="use101937"
+             overflow="visible"
+             xlink:href="#SVGID_4585_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,201.1574,-1066.0031)"
+           y2="-148.46021"
+           x2="256.3761"
+           y1="-148.46021"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101939">
+          <stop
+             id="stop101941"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101943"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82614"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4586_)"
+           y="308.841"
+           x="-600.78497"
+           style="fill:url(#SVGID_4587_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.597166"
+         inkscape:transform-center-x="430.96208"
+         id="g82616"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82618">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4588_" />
+        </defs>
+        <clipPath
+           id="clipPath101949">
+          <use
+             id="use101951"
+             overflow="visible"
+             xlink:href="#SVGID_4588_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82624"
+           d="m -598.725,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4589_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82626"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4589_)"
+           y="306.73599"
+           x="-590.91699"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82628"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4589_)"
+           y="306.73599"
+           x="-590.91699"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82630"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4589_)"
+           y="307.41"
+           x="-590.24597"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82632"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4589_)"
+           y="308.06699"
+           x="-589.586"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82634"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4589_)"
+           y="309.24799"
+           x="-588.40698"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="19.598312"
+         inkscape:transform-center-x="422.41995"
+         id="g82636"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82638">
+          <path
+             d="m -588.813,311.531 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.485 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.205 -2.692,2.69"
+             id="SVGID_4590_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath101962">
+          <use
+             id="use101964"
+             overflow="visible"
+             xlink:href="#SVGID_4590_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1066.0031)"
+           y2="-148.4601"
+           x2="256.3761"
+           y1="-148.4601"
+           x1="255.3761"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient101966">
+          <stop
+             id="stop101968"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop101970"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82649"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4591_)"
+           y="308.841"
+           x="-588.81299"
+           style="fill:url(#SVGID_4592_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="37.558931"
+         inkscape:transform-center-x="440.81033"
+         id="g82861"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82863">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4623_" />
+        </defs>
+        <clipPath
+           id="clipPath102138">
+          <use
+             id="use102140"
+             overflow="visible"
+             xlink:href="#SVGID_4623_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82869"
+           d="m -514.925,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4624_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82871"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4624_)"
+           y="318.323"
+           x="-674.71698"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82873"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4624_)"
+           y="318.323"
+           x="-674.71698"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82875"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4624_)"
+           y="318.99701"
+           x="-674.04602"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82877"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4624_)"
+           y="319.65399"
+           x="-673.38599"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82879"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4624_)"
+           y="320.83499"
+           x="-672.20697"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="610.97111"
+         id="g82881"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82883">
+          <path
+             d="m -672.614,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+             id="SVGID_4625_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102151">
+          <use
+             id="use102153"
+             overflow="visible"
+             xlink:href="#SVGID_4625_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,129.3288,-1054.4158)"
+           y2="-148.46021"
+           x2="256.37631"
+           y1="-148.46021"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102155">
+          <stop
+             id="stop102157"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102159"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82894"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4626_)"
+           y="320.42899"
+           x="-672.61401"
+           style="fill:url(#SVGID_4627_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.667929"
+         inkscape:transform-center-x="592.57619"
+         id="g82896"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82898">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4628_" />
+        </defs>
+        <clipPath
+           id="clipPath102165">
+          <use
+             id="use102167"
+             overflow="visible"
+             xlink:href="#SVGID_4628_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82904"
+           d="m -670.553,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4629_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82906"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4629_)"
+           y="318.323"
+           x="-662.745"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82908"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4629_)"
+           y="318.323"
+           x="-662.74597"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82910"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4629_)"
+           y="318.99701"
+           x="-662.07397"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82912"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4629_)"
+           y="319.65399"
+           x="-661.414"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82914"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4629_)"
+           y="320.83499"
+           x="-660.23499"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="584.03412"
+         id="g82916"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82918">
+          <path
+             d="m -660.642,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+             id="SVGID_4630_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102178">
+          <use
+             id="use102180"
+             overflow="visible"
+             xlink:href="#SVGID_4630_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,141.3002,-1054.4158)"
+           y2="-148.4601"
+           x2="256.37631"
+           y1="-148.4601"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102182">
+          <stop
+             id="stop102184"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102186"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82929"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4631_)"
+           y="320.42899"
+           x="-660.64203"
+           style="fill:url(#SVGID_4632_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.667929"
+         inkscape:transform-center-x="565.64033"
+         id="g82931"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82933">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4633_" />
+        </defs>
+        <clipPath
+           id="clipPath102192">
+          <use
+             id="use102194"
+             overflow="visible"
+             xlink:href="#SVGID_4633_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82939"
+           d="m -658.582,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4634_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82941"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4634_)"
+           y="318.323"
+           x="-650.77399"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82943"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4634_)"
+           y="318.323"
+           x="-650.77399"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82945"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4634_)"
+           y="318.99701"
+           x="-650.10303"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82947"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4634_)"
+           y="319.65399"
+           x="-649.44299"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82949"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4634_)"
+           y="320.83499"
+           x="-648.26398"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="557.09937"
+         id="g82951"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82953">
+          <path
+             d="m -648.671,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.204,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+             id="SVGID_4635_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102205">
+          <use
+             id="use102207"
+             overflow="visible"
+             xlink:href="#SVGID_4635_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,153.2715,-1054.4158)"
+           y2="-148.4601"
+           x2="256.37631"
+           y1="-148.4601"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102209">
+          <stop
+             id="stop102211"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102213"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82964"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4636_)"
+           y="320.42899"
+           x="-648.67102"
+           style="fill:url(#SVGID_4637_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.667929"
+         inkscape:transform-center-x="538.70558"
+         id="g82966"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82968">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4638_" />
+        </defs>
+        <clipPath
+           id="clipPath102219">
+          <use
+             id="use102221"
+             overflow="visible"
+             xlink:href="#SVGID_4638_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path82974"
+           d="m -646.611,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4639_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82976"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4639_)"
+           y="318.323"
+           x="-638.80298"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82978"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4639_)"
+           y="318.323"
+           x="-638.80298"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect82980"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4639_)"
+           y="318.99701"
+           x="-638.13202"
+           style="fill:#81d0db" />
+        <rect
+           id="rect82982"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4639_)"
+           y="319.65399"
+           x="-637.47198"
+           style="fill:#ffffff" />
+        <rect
+           id="rect82984"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4639_)"
+           y="320.83499"
+           x="-636.29199"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="530.16231"
+         id="g82986"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs82988">
+          <path
+             d="m -636.699,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.207 2.692,-2.694 0,-1.486 -1.205,-2.69 -2.692,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+             id="SVGID_4640_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102232">
+          <use
+             id="use102234"
+             overflow="visible"
+             xlink:href="#SVGID_4640_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,165.2429,-1054.4158)"
+           y2="-148.46001"
+           x2="256.37631"
+           y1="-148.46001"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102236">
+          <stop
+             id="stop102238"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102240"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect82999"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4641_)"
+           y="320.42899"
+           x="-636.69897"
+           style="fill:url(#SVGID_4642_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.667929"
+         inkscape:transform-center-x="511.76858"
+         id="g83001"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83003">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4643_" />
+        </defs>
+        <clipPath
+           id="clipPath102246">
+          <use
+             id="use102248"
+             overflow="visible"
+             xlink:href="#SVGID_4643_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83009"
+           d="m -634.639,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4644_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83011"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4644_)"
+           y="318.323"
+           x="-626.83099"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83013"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4644_)"
+           y="318.323"
+           x="-626.83099"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83015"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4644_)"
+           y="318.99701"
+           x="-626.15997"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83017"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4644_)"
+           y="319.65399"
+           x="-625.5"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83019"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4644_)"
+           y="320.83499"
+           x="-624.32098"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="503.22762"
+         id="g83021"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83023">
+          <path
+             d="m -624.728,323.119 c 0,1.487 1.206,2.694 2.693,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.693,1.204 -2.693,2.69"
+             id="SVGID_4645_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102259">
+          <use
+             id="use102261"
+             overflow="visible"
+             xlink:href="#SVGID_4645_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,177.2143,-1054.4158)"
+           y2="-148.4601"
+           x2="256.37631"
+           y1="-148.4601"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102263">
+          <stop
+             id="stop102265"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102267"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83034"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4646_)"
+           y="320.42899"
+           x="-624.72803"
+           style="fill:url(#SVGID_4647_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.667929"
+         inkscape:transform-center-x="484.83387"
+         id="g83036"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83038">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4648_" />
+        </defs>
+        <clipPath
+           id="clipPath102273">
+          <use
+             id="use102275"
+             overflow="visible"
+             xlink:href="#SVGID_4648_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83044"
+           d="m -622.668,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4649_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83046"
+           height="9.5930004"
+           width="9.5930004"
+           clip-path="url(#SVGID_4649_)"
+           y="318.323"
+           x="-614.85999"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83048"
+           height="9.5930004"
+           width="9.5930004"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4649_)"
+           y="318.323"
+           x="-614.86102"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83050"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4649_)"
+           y="318.99701"
+           x="-614.18799"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83052"
+           height="6.9310002"
+           width="6.9310002"
+           clip-path="url(#SVGID_4649_)"
+           y="319.65399"
+           x="-613.52899"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83054"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4649_)"
+           y="320.83499"
+           x="-612.349"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="476.2917"
+         id="g83056"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83058">
+          <path
+             d="m -612.756,323.119 c 0,1.487 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.486,0 -2.692,1.204 -2.692,2.69"
+             id="SVGID_4650_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102286">
+          <use
+             id="use102288"
+             overflow="visible"
+             xlink:href="#SVGID_4650_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,189.1858,-1054.4158)"
+           y2="-148.4601"
+           x2="256.37631"
+           y1="-148.4601"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102290">
+          <stop
+             id="stop102292"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102294"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83069"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4651_)"
+           y="320.42899"
+           x="-612.75598"
+           style="fill:url(#SVGID_4652_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.667929"
+         inkscape:transform-center-x="444.42945"
+         id="g83071"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83073">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4653_" />
+        </defs>
+        <clipPath
+           id="clipPath102300">
+          <use
+             id="use102302"
+             overflow="visible"
+             xlink:href="#SVGID_4653_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83079"
+           d="m -610.696,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4654_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83081"
+           height="9.5930004"
+           width="9.592"
+           clip-path="url(#SVGID_4654_)"
+           y="318.323"
+           x="-590.91699"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83083"
+           height="9.5930004"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4654_)"
+           y="318.323"
+           x="-590.91699"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83085"
+           height="8.2460003"
+           width="8.2480001"
+           clip-path="url(#SVGID_4654_)"
+           y="318.99701"
+           x="-590.24597"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83087"
+           height="6.9310002"
+           width="6.9299998"
+           clip-path="url(#SVGID_4654_)"
+           y="319.65399"
+           x="-589.586"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83089"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4654_)"
+           y="320.83499"
+           x="-588.40698"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="45.671291"
+         inkscape:transform-center-x="422.41995"
+         id="g83091"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83093">
+          <path
+             d="m -588.813,323.119 c 0,1.487 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.207 2.691,-2.694 0,-1.486 -1.204,-2.69 -2.691,-2.69 -1.487,0 -2.692,1.204 -2.692,2.69"
+             id="SVGID_4655_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102313">
+          <use
+             id="use102315"
+             overflow="visible"
+             xlink:href="#SVGID_4655_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3836,5.3836,0,213.1288,-1054.4158)"
+           y2="-148.4601"
+           x2="256.37631"
+           y1="-148.4601"
+           x1="255.37621"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102317">
+          <stop
+             id="stop102319"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102321"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83104"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4656_)"
+           y="320.42899"
+           x="-588.81299"
+           style="fill:url(#SVGID_4657_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="63.583551"
+         inkscape:transform-center-x="440.81033"
+         id="g83316"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83318">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4688_" />
+        </defs>
+        <clipPath
+           id="clipPath102489">
+          <use
+             id="use102491"
+             overflow="visible"
+             xlink:href="#SVGID_4688_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83324"
+           d="m -514.925,323.119 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4689_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83326"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4689_)"
+           y="329.87"
+           x="-674.71698"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83328"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4689_)"
+           y="329.87"
+           x="-674.71698"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83330"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4689_)"
+           y="330.543"
+           x="-674.04602"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83332"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4689_)"
+           y="331.20099"
+           x="-673.38599"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83334"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4689_)"
+           y="332.38199"
+           x="-672.20697"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.649806"
+         inkscape:transform-center-x="610.97111"
+         id="g83336"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83338">
+          <path
+             d="m -672.614,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4690_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102502">
+          <use
+             id="use102504"
+             overflow="visible"
+             xlink:href="#SVGID_4690_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1042.9659)"
+           y2="-148.4301"
+           x2="256.3544"
+           y1="-148.4301"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102506">
+          <stop
+             id="stop102508"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102510"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83349"
+           height="5.3860002"
+           width="5.3839998"
+           clip-path="url(#SVGID_4691_)"
+           y="331.974"
+           x="-672.61401"
+           style="fill:url(#SVGID_4692_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.647547"
+         inkscape:transform-center-x="592.57619"
+         id="g83351"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83353">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4693_" />
+        </defs>
+        <clipPath
+           id="clipPath102516">
+          <use
+             id="use102518"
+             overflow="visible"
+             xlink:href="#SVGID_4693_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83359"
+           d="m -670.553,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4694_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83361"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4694_)"
+           y="329.87"
+           x="-662.745"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83363"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4694_)"
+           y="329.87"
+           x="-662.74597"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83365"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4694_)"
+           y="330.543"
+           x="-662.07397"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83367"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4694_)"
+           y="331.20099"
+           x="-661.414"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83369"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4694_)"
+           y="332.38199"
+           x="-660.23499"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.648681"
+         inkscape:transform-center-x="584.03412"
+         id="g83371"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83373">
+          <path
+             d="m -660.642,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4695_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102529">
+          <use
+             id="use102531"
+             overflow="visible"
+             xlink:href="#SVGID_4695_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1042.9659)"
+           y2="-148.4299"
+           x2="256.35419"
+           y1="-148.4299"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102533">
+          <stop
+             id="stop102535"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102537"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83384"
+           height="5.3850002"
+           width="5.3839998"
+           clip-path="url(#SVGID_4696_)"
+           y="331.974"
+           x="-660.64203"
+           style="fill:url(#SVGID_4697_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.647547"
+         inkscape:transform-center-x="565.64033"
+         id="g83386"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83388">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4698_" />
+        </defs>
+        <clipPath
+           id="clipPath102543">
+          <use
+             id="use102545"
+             overflow="visible"
+             xlink:href="#SVGID_4698_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83394"
+           d="m -658.582,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4699_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83396"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4699_)"
+           y="329.87"
+           x="-650.77399"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83398"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4699_)"
+           y="329.87"
+           x="-650.77399"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83400"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4699_)"
+           y="330.543"
+           x="-650.10303"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83402"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4699_)"
+           y="331.20099"
+           x="-649.44299"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83404"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4699_)"
+           y="332.38199"
+           x="-648.26398"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.649806"
+         inkscape:transform-center-x="557.09937"
+         id="g83406"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83408">
+          <path
+             d="m -648.671,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4700_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102556">
+          <use
+             id="use102558"
+             overflow="visible"
+             xlink:href="#SVGID_4700_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1042.9659)"
+           y2="-148.42999"
+           x2="256.3544"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102560">
+          <stop
+             id="stop102562"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102564"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83419"
+           height="5.3860002"
+           width="5.3839998"
+           clip-path="url(#SVGID_4701_)"
+           y="331.974"
+           x="-648.67102"
+           style="fill:url(#SVGID_4702_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.647547"
+         inkscape:transform-center-x="538.70558"
+         id="g83421"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83423">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4703_" />
+        </defs>
+        <clipPath
+           id="clipPath102570">
+          <use
+             id="use102572"
+             overflow="visible"
+             xlink:href="#SVGID_4703_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83429"
+           d="m -646.611,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4704_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83431"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4704_)"
+           y="329.87"
+           x="-638.80298"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83433"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4704_)"
+           y="329.87"
+           x="-638.80298"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83435"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4704_)"
+           y="330.543"
+           x="-638.13202"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83437"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4704_)"
+           y="331.20099"
+           x="-637.47198"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83439"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4704_)"
+           y="332.38199"
+           x="-636.29199"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.649806"
+         inkscape:transform-center-x="530.16231"
+         id="g83441"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83443">
+          <path
+             d="m -636.699,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.692,-1.206 2.692,-2.694 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4705_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102583">
+          <use
+             id="use102585"
+             overflow="visible"
+             xlink:href="#SVGID_4705_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1042.9659)"
+           y2="-148.4299"
+           x2="256.3544"
+           y1="-148.4299"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102587">
+          <stop
+             id="stop102589"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102591"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83454"
+           height="5.3860002"
+           width="5.3839998"
+           clip-path="url(#SVGID_4706_)"
+           y="331.974"
+           x="-636.69897"
+           style="fill:url(#SVGID_4707_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.647547"
+         inkscape:transform-center-x="498.30125"
+         id="g83456"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83458">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4708_" />
+        </defs>
+        <clipPath
+           id="clipPath102597">
+          <use
+             id="use102599"
+             overflow="visible"
+             xlink:href="#SVGID_4708_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83464"
+           d="m -634.639,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4709_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83466"
+           height="9.592"
+           width="9.5930004"
+           clip-path="url(#SVGID_4709_)"
+           y="329.87"
+           x="-614.85999"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83468"
+           height="9.592"
+           width="9.5930004"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4709_)"
+           y="329.87"
+           x="-614.86102"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83470"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4709_)"
+           y="330.543"
+           x="-614.18799"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83472"
+           height="6.9299998"
+           width="6.9310002"
+           clip-path="url(#SVGID_4709_)"
+           y="331.20099"
+           x="-613.52899"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83474"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4709_)"
+           y="332.38199"
+           x="-612.349"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.649806"
+         inkscape:transform-center-x="476.2917"
+         id="g83476"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83478">
+          <path
+             d="m -612.756,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4710_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102610">
+          <use
+             id="use102612"
+             overflow="visible"
+             xlink:href="#SVGID_4710_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1042.9659)"
+           y2="-148.42999"
+           x2="256.3544"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102614">
+          <stop
+             id="stop102616"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102618"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83489"
+           height="5.3860002"
+           width="5.3829999"
+           clip-path="url(#SVGID_4711_)"
+           y="331.974"
+           x="-612.75598"
+           style="fill:url(#SVGID_4712_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.647547"
+         inkscape:transform-center-x="457.89686"
+         id="g83491"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83493">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4713_" />
+        </defs>
+        <clipPath
+           id="clipPath102624">
+          <use
+             id="use102626"
+             overflow="visible"
+             xlink:href="#SVGID_4713_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83499"
+           d="m -610.696,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4714_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83501"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4714_)"
+           y="329.87"
+           x="-602.888"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83503"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4714_)"
+           y="329.87"
+           x="-602.888"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83505"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4714_)"
+           y="330.543"
+           x="-602.21698"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83507"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4714_)"
+           y="331.20099"
+           x="-601.55701"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83509"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4714_)"
+           y="332.38199"
+           x="-600.37799"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.649806"
+         inkscape:transform-center-x="449.35694"
+         id="g83511"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83513">
+          <path
+             d="m -600.785,334.666 c 0,1.488 1.206,2.694 2.692,2.694 1.488,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4715_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102637">
+          <use
+             id="use102639"
+             overflow="visible"
+             xlink:href="#SVGID_4715_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1042.9659)"
+           y2="-148.4301"
+           x2="256.3544"
+           y1="-148.4301"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102641">
+          <stop
+             id="stop102643"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102645"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83524"
+           height="5.3860002"
+           width="5.3829999"
+           clip-path="url(#SVGID_4716_)"
+           y="331.974"
+           x="-600.78497"
+           style="fill:url(#SVGID_4717_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.647547"
+         inkscape:transform-center-x="430.96208"
+         id="g83526"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83528">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4718_" />
+        </defs>
+        <clipPath
+           id="clipPath102651">
+          <use
+             id="use102653"
+             overflow="visible"
+             xlink:href="#SVGID_4718_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83534"
+           d="m -598.725,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4719_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83536"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4719_)"
+           y="329.87"
+           x="-590.91699"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83538"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4719_)"
+           y="329.87"
+           x="-590.91699"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83540"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4719_)"
+           y="330.543"
+           x="-590.24597"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83542"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4719_)"
+           y="331.20099"
+           x="-589.586"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83544"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4719_)"
+           y="332.38199"
+           x="-588.40698"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="71.649806"
+         inkscape:transform-center-x="422.41995"
+         id="g83546"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83548">
+          <path
+             d="m -588.813,334.666 c 0,1.488 1.205,2.694 2.692,2.694 1.487,0 2.691,-1.206 2.691,-2.694 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4720_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102664">
+          <use
+             id="use102666"
+             overflow="visible"
+             xlink:href="#SVGID_4720_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1042.9659)"
+           y2="-148.42999"
+           x2="256.3544"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102668">
+          <stop
+             id="stop102670"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102672"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83559"
+           height="5.3860002"
+           width="5.3829999"
+           clip-path="url(#SVGID_4721_)"
+           y="331.974"
+           x="-588.81299"
+           style="fill:url(#SVGID_4722_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="89.828699"
+         inkscape:transform-center-x="440.81033"
+         id="g83736"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83738">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4748_" />
+        </defs>
+        <clipPath
+           id="clipPath102813">
+          <use
+             id="use102815"
+             overflow="visible"
+             xlink:href="#SVGID_4748_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83744"
+           d="m -514.925,334.666 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4749_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83746"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4749_)"
+           y="341.65302"
+           x="-674.71698"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83748"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4749_)"
+           y="341.65302"
+           x="-674.71698"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83750"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4749_)"
+           y="342.32599"
+           x="-674.04602"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83752"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4749_)"
+           y="342.98401"
+           x="-673.38599"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83754"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4749_)"
+           y="344.164"
+           x="-672.20697"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="610.97111"
+         id="g83756"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83758">
+          <path
+             d="m -672.614,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4750_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102826">
+          <use
+             id="use102828"
+             overflow="visible"
+             xlink:href="#SVGID_4750_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,129.2913,-1031.1833)"
+           y2="-148.4301"
+           x2="256.3541"
+           y1="-148.4301"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102830">
+          <stop
+             id="stop102832"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102834"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83769"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4751_)"
+           y="343.75699"
+           x="-672.61401"
+           style="fill:url(#SVGID_4752_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="592.57619"
+         id="g83771"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83773">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4753_" />
+        </defs>
+        <clipPath
+           id="clipPath102840">
+          <use
+             id="use102842"
+             overflow="visible"
+             xlink:href="#SVGID_4753_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83779"
+           d="m -670.553,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4754_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83781"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4754_)"
+           y="341.65302"
+           x="-662.745"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83783"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4754_)"
+           y="341.65302"
+           x="-662.74597"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83785"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4754_)"
+           y="342.32599"
+           x="-662.07397"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83787"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4754_)"
+           y="342.98401"
+           x="-661.414"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83789"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4754_)"
+           y="344.164"
+           x="-660.23499"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="584.03412"
+         id="g83791"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83793">
+          <path
+             d="m -660.642,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4755_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102853">
+          <use
+             id="use102855"
+             overflow="visible"
+             xlink:href="#SVGID_4755_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,141.2627,-1031.1833)"
+           y2="-148.4299"
+           x2="256.3541"
+           y1="-148.4299"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102857">
+          <stop
+             id="stop102859"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102861"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83804"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4756_)"
+           y="343.75699"
+           x="-660.64203"
+           style="fill:url(#SVGID_4757_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="565.64033"
+         id="g83806"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83808">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4758_" />
+        </defs>
+        <clipPath
+           id="clipPath102867">
+          <use
+             id="use102869"
+             overflow="visible"
+             xlink:href="#SVGID_4758_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83814"
+           d="m -658.582,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4759_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83816"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4759_)"
+           y="341.65302"
+           x="-650.77399"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83818"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4759_)"
+           y="341.65302"
+           x="-650.77399"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83820"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4759_)"
+           y="342.32599"
+           x="-650.10303"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83822"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4759_)"
+           y="342.98401"
+           x="-649.44299"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83824"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4759_)"
+           y="344.164"
+           x="-648.26398"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="557.09937"
+         id="g83826"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83828">
+          <path
+             d="m -648.671,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.204,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4760_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102880">
+          <use
+             id="use102882"
+             overflow="visible"
+             xlink:href="#SVGID_4760_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,153.234,-1031.1833)"
+           y2="-148.42999"
+           x2="256.3541"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102884">
+          <stop
+             id="stop102886"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102888"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83839"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4761_)"
+           y="343.75699"
+           x="-648.67102"
+           style="fill:url(#SVGID_4762_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="538.70558"
+         id="g83841"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83843">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4763_" />
+        </defs>
+        <clipPath
+           id="clipPath102894">
+          <use
+             id="use102896"
+             overflow="visible"
+             xlink:href="#SVGID_4763_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83849"
+           d="m -646.611,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4764_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83851"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4764_)"
+           y="341.65302"
+           x="-638.80298"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83853"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4764_)"
+           y="341.65302"
+           x="-638.80298"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83855"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4764_)"
+           y="342.32599"
+           x="-638.13202"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83857"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4764_)"
+           y="342.98401"
+           x="-637.47198"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83859"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4764_)"
+           y="344.164"
+           x="-636.29199"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="530.16231"
+         id="g83861"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83863">
+          <path
+             d="m -636.699,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.692,-1.205 2.692,-2.692 0,-1.486 -1.205,-2.692 -2.692,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4765_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102907">
+          <use
+             id="use102909"
+             overflow="visible"
+             xlink:href="#SVGID_4765_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,165.2054,-1031.1833)"
+           y2="-148.4299"
+           x2="256.3541"
+           y1="-148.4299"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102911">
+          <stop
+             id="stop102913"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102915"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83874"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4766_)"
+           y="343.75699"
+           x="-636.69897"
+           style="fill:url(#SVGID_4767_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="511.76858"
+         id="g83876"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83878">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4768_" />
+        </defs>
+        <clipPath
+           id="clipPath102921">
+          <use
+             id="use102923"
+             overflow="visible"
+             xlink:href="#SVGID_4768_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83884"
+           d="m -634.639,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4769_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83886"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4769_)"
+           y="341.65302"
+           x="-626.83099"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83888"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4769_)"
+           y="341.65302"
+           x="-626.83099"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83890"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4769_)"
+           y="342.32599"
+           x="-626.15997"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83892"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4769_)"
+           y="342.98401"
+           x="-625.5"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83894"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4769_)"
+           y="344.164"
+           x="-624.32098"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="503.22762"
+         id="g83896"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83898">
+          <path
+             d="m -624.728,346.449 c 0,1.487 1.206,2.692 2.693,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.693,1.206 -2.693,2.692"
+             id="SVGID_4770_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102934">
+          <use
+             id="use102936"
+             overflow="visible"
+             xlink:href="#SVGID_4770_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,177.1768,-1031.1833)"
+           y2="-148.42999"
+           x2="256.3541"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102938">
+          <stop
+             id="stop102940"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102942"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83909"
+           height="5.3839998"
+           width="5.3839998"
+           clip-path="url(#SVGID_4771_)"
+           y="343.75699"
+           x="-624.72803"
+           style="fill:url(#SVGID_4772_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="484.83387"
+         id="g83911"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83913">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4773_" />
+        </defs>
+        <clipPath
+           id="clipPath102948">
+          <use
+             id="use102950"
+             overflow="visible"
+             xlink:href="#SVGID_4773_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83919"
+           d="m -622.668,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4774_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83921"
+           height="9.592"
+           width="9.5930004"
+           clip-path="url(#SVGID_4774_)"
+           y="341.65302"
+           x="-614.85999"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83923"
+           height="9.592"
+           width="9.5930004"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4774_)"
+           y="341.65302"
+           x="-614.86102"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83925"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4774_)"
+           y="342.32599"
+           x="-614.18799"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83927"
+           height="6.9299998"
+           width="6.9310002"
+           clip-path="url(#SVGID_4774_)"
+           y="342.98401"
+           x="-613.52899"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83929"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4774_)"
+           y="344.164"
+           x="-612.349"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="476.2917"
+         id="g83931"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83933">
+          <path
+             d="m -612.756,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4775_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102961">
+          <use
+             id="use102963"
+             overflow="visible"
+             xlink:href="#SVGID_4775_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,189.1483,-1031.1833)"
+           y2="-148.42999"
+           x2="256.3541"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102965">
+          <stop
+             id="stop102967"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102969"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83944"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4776_)"
+           y="343.75699"
+           x="-612.75598"
+           style="fill:url(#SVGID_4777_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="457.89686"
+         id="g83946"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83948">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4778_" />
+        </defs>
+        <clipPath
+           id="clipPath102975">
+          <use
+             id="use102977"
+             overflow="visible"
+             xlink:href="#SVGID_4778_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83954"
+           d="m -610.696,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4779_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83956"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4779_)"
+           y="341.65302"
+           x="-602.888"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83958"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4779_)"
+           y="341.65302"
+           x="-602.888"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83960"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4779_)"
+           y="342.32599"
+           x="-602.21698"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83962"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4779_)"
+           y="342.98401"
+           x="-601.55701"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83964"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4779_)"
+           y="344.164"
+           x="-600.37799"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="449.35694"
+         id="g83966"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83968">
+          <path
+             d="m -600.785,346.449 c 0,1.487 1.206,2.692 2.692,2.692 1.488,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.203,-2.692 -2.691,-2.692 -1.486,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4780_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath102988">
+          <use
+             id="use102990"
+             overflow="visible"
+             xlink:href="#SVGID_4780_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,201.1199,-1031.1833)"
+           y2="-148.4301"
+           x2="256.3541"
+           y1="-148.4301"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient102992">
+          <stop
+             id="stop102994"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop102996"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect83979"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4781_)"
+           y="343.75699"
+           x="-600.78497"
+           style="fill:url(#SVGID_4782_)" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159342"
+         inkscape:transform-center-x="430.96208"
+         id="g83981"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs83983">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4783_" />
+        </defs>
+        <clipPath
+           id="clipPath103002">
+          <use
+             id="use103004"
+             overflow="visible"
+             xlink:href="#SVGID_4783_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path83989"
+           d="m -598.725,346.449 c 0,-0.349 0.283,-0.632 0.632,-0.632 0.351,0 0.634,0.283 0.634,0.632 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+           clip-path="url(#SVGID_4784_)"
+           inkscape:connector-curvature="0"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83991"
+           height="9.592"
+           width="9.592"
+           clip-path="url(#SVGID_4784_)"
+           y="341.65302"
+           x="-590.91699"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83993"
+           height="9.592"
+           width="9.592"
+           stroke-miterlimit="10"
+           clip-path="url(#SVGID_4784_)"
+           y="341.65302"
+           x="-590.91699"
+           style="fill:none;stroke:#81d0db;stroke-width:0.428;stroke-miterlimit:10" />
+        <rect
+           id="rect83995"
+           height="8.2469997"
+           width="8.2480001"
+           clip-path="url(#SVGID_4784_)"
+           y="342.32599"
+           x="-590.24597"
+           style="fill:#81d0db" />
+        <rect
+           id="rect83997"
+           height="6.9299998"
+           width="6.9299998"
+           clip-path="url(#SVGID_4784_)"
+           y="342.98401"
+           x="-589.586"
+           style="fill:#ffffff" />
+        <rect
+           id="rect83999"
+           height="4.5679998"
+           width="4.5700002"
+           clip-path="url(#SVGID_4784_)"
+           y="344.164"
+           x="-588.40698"
+           style="fill:#ffffff" />
+      </g>
+      <g
+         inkscape:transform-center-y="98.159295"
+         inkscape:transform-center-x="422.41995"
+         id="g84001"
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)">
+        <defs
+           id="defs84003">
+          <path
+             d="m -588.813,346.449 c 0,1.487 1.205,2.692 2.692,2.692 1.487,0 2.691,-1.205 2.691,-2.692 0,-1.486 -1.204,-2.692 -2.691,-2.692 -1.487,0 -2.692,1.206 -2.692,2.692"
+             id="SVGID_4785_"
+             inkscape:connector-curvature="0" />
+        </defs>
+        <clipPath
+           id="clipPath103015">
+          <use
+             id="use103017"
+             overflow="visible"
+             xlink:href="#SVGID_4785_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <linearGradient
+           gradientTransform="matrix(0,5.3844,5.3844,0,213.0913,-1031.1833)"
+           y2="-148.42999"
+           x2="256.3541"
+           y1="-148.42999"
+           x1="255.3541"
+           gradientUnits="userSpaceOnUse"
+           id="linearGradient103019">
+          <stop
+             id="stop103021"
+             style="stop-color:#55AEB9"
+             offset="0" />
+          <stop
+             id="stop103023"
+             style="stop-color:#81D1DB"
+             offset="1" />
+        </linearGradient>
+        <rect
+           id="rect84014"
+           height="5.3839998"
+           width="5.3829999"
+           clip-path="url(#SVGID_4786_)"
+           y="343.75699"
+           x="-588.81299"
+           style="fill:url(#SVGID_4787_)" />
+      </g>
+      <polygon
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#f15d57"
+         clip-path="url(#SVGID_4843_)"
+         points="-667.777,292.47 -671.896,292.47 -669.845,294.263 "
+         id="polygon84546" />
+      <polygon
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#f15d57"
+         clip-path="url(#SVGID_4843_)"
+         points="-657.265,292.47 -661.384,292.47 -659.333,294.263 "
+         id="polygon84548" />
+      <polygon
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#f15d57"
+         clip-path="url(#SVGID_4843_)"
+         points="-646.752,292.47 -650.871,292.47 -648.82,294.263 "
+         id="polygon84550" />
+      <polygon
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#f15d57"
+         clip-path="url(#SVGID_4843_)"
+         points="-601.13,292.47 -605.249,292.47 -603.198,294.263 "
+         id="polygon84552" />
+      <polygon
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#f15d57"
+         clip-path="url(#SVGID_4843_)"
+         points="-590.618,292.47 -594.737,292.47 -592.686,294.263 "
+         id="polygon84554" />
+      <polygon
+         transform="matrix(2.25,0,0,2.25,1605.7731,-25.560183)"
+         style="fill:#f15d57"
+         clip-path="url(#SVGID_4843_)"
+         points="-580.105,292.47 -584.224,292.47 -582.173,294.263 "
+         id="polygon84556" />
+      <g
+         inkscape:transform-center-y="141.90493"
+         inkscape:transform-center-x="262.77489"
+         id="g84792"
+         transform="matrix(1.3542118,0,0,2.25,996.72494,-31.560183)">
+        <defs
+           id="defs84794">
+          <rect
+             height="205.44099"
+             width="200.271"
+             y="181.315"
+             x="-682.31403"
+             id="SVGID_4872_" />
+        </defs>
+        <clipPath
+           id="clipPath103597">
+          <use
+             id="use103599"
+             overflow="visible"
+             xlink:href="#SVGID_4872_"
+             style="overflow:visible"
+             x="0"
+             y="0"
+             width="744.09448"
+             height="1052.3622" />
+        </clipPath>
+        <path
+           id="path84800"
+           d="m -438.652,188.287 c 0,0.349 -0.282,0.632 -0.632,0.632 -0.349,0 -0.632,-0.283 -0.632,-0.632 0,-0.35 0.283,-0.633 0.632,-0.633 0.35,0 0.632,0.284 0.632,0.633"
+           clip-path="url(#SVGID_4873_)"
+           inkscape:connector-curvature="0"
+           style="fill:#5e6a71" />
+        <g
+           id="g84802"
+           clip-path="url(#SVGID_4873_)">
+          <g
+             id="g84804">
+            <defs
+               id="defs84806">
+              <rect
+                 height="10.152"
+                 width="174.95799"
+                 y="360.13901"
+                 x="-679.90002"
+                 id="SVGID_4874_" />
+            </defs>
+            <clipPath
+               id="clipPath103606">
+              <use
+                 id="use103608"
+                 overflow="visible"
+                 xlink:href="#SVGID_4874_"
+                 style="overflow:visible"
+                 x="0"
+                 y="0"
+                 width="744.09448"
+                 height="1052.3622" />
+            </clipPath>
+            <g
+               id="g84812"
+               clip-path="url(#SVGID_4875_)">
+              <defs
+                 id="defs84814">
+                <rect
+                   height="10.152"
+                   width="174.95799"
+                   y="360.13901"
+                   x="-679.90002"
+                   id="SVGID_4876_" />
+              </defs>
+              <clipPath
+                 id="clipPath103613">
+                <use
+                   id="use103615"
+                   overflow="visible"
+                   xlink:href="#SVGID_4876_"
+                   style="overflow:visible"
+                   x="0"
+                   y="0"
+                   width="744.09448"
+                   height="1052.3622" />
+              </clipPath>
+              <linearGradient
+                 gradientTransform="matrix(0,-10.1526,-10.1526,0,900.78,782.1111)"
+                 y2="147.0757"
+                 x2="41.563"
+                 y1="147.0757"
+                 x1="40.563"
+                 gradientUnits="userSpaceOnUse"
+                 id="linearGradient103617">
+                <stop
+                   id="stop103619"
+                   style="stop-color:#55AEB9"
+                   offset="0" />
+                <stop
+                   id="stop103621"
+                   style="stop-color:#B0D2D9"
+                   offset="0.486" />
+                <stop
+                   id="stop103623"
+                   style="stop-color:#E6EFF1"
+                   offset="0.8287" />
+                <stop
+                   id="stop103625"
+                   style="stop-color:#FFFFFF"
+                   offset="0.9939" />
+                <stop
+                   id="stop103627"
+                   style="stop-color:#FFFFFF"
+                   offset="1" />
+              </linearGradient>
+              <rect
+                 id="rect84831"
+                 height="10.153"
+                 width="174.95799"
+                 clip-path="url(#SVGID_4877_)"
+                 y="360.138"
+                 x="-679.90002"
+                 style="fill:url(#SVGID_4878_)" />
+            </g>
+          </g>
+        </g>
+        <g
+           id="g84833"
+           clip-path="url(#SVGID_4873_)">
+          <g
+             id="g84835">
+            <defs
+               id="defs84837">
+              <rect
+                 height="10.152"
+                 width="174.94701"
+                 y="360.13901"
+                 x="-679.88898"
+                 id="SVGID_4879_" />
+            </defs>
+            <clipPath
+               id="clipPath103634">
+              <use
+                 id="use103636"
+                 overflow="visible"
+                 xlink:href="#SVGID_4879_"
+                 style="overflow:visible"
+                 x="0"
+                 y="0"
+                 width="744.09448"
+                 height="1052.3622" />
+            </clipPath>
+            <g
+               id="g84843"
+               clip-path="url(#SVGID_4880_)">
+              <defs
+                 id="defs84845">
+                <rect
+                   height="10.153"
+                   width="174.94701"
+                   y="360.138"
+                   x="-679.88898"
+                   id="SVGID_4881_" />
+              </defs>
+              <clipPath
+                 id="clipPath103641">
+                <use
+                   id="use103643"
+                   overflow="visible"
+                   xlink:href="#SVGID_4881_"
+                   style="overflow:visible"
+                   x="0"
+                   y="0"
+                   width="744.09448"
+                   height="1052.3622" />
+              </clipPath>
+              <polygon
+                 id="polygon84851"
+                 points="-679.89,364.81 -679.89,367.139 -679.89,370.291 -504.943,370.291 -504.943,360.138 -679.89,360.139 "
+                 clip-path="url(#SVGID_4882_)"
+                 style="fill:#f15d57" />
+            </g>
+          </g>
+        </g>
+        <rect
+           id="rect84853"
+           height="2.641"
+           width="174.96001"
+           clip-path="url(#SVGID_4873_)"
+           y="360.267"
+           x="-679.90198"
+           style="fill:#f15d57" />
+        <rect
+           id="rect84855"
+           height="1.352"
+           width="174.94701"
+           clip-path="url(#SVGID_4873_)"
+           y="370.29199"
+           x="-679.88898"
+           style="fill:#55aeb9" />
+      </g>
+      <text
+         inkscape:transform-center-y="45.543285"
+         inkscape:transform-center-x="450.06672"
+         id="text82351-9"
+         font-size="4.3343"
+         style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+         x="255.23141"
+         y="705.37921">M</text>
+      <g
+         transform="translate(-230,34)"
+         id="g9504">
+        <g
+           transform="matrix(2.25,0,0,2.25,1701.0081,-85.193202)"
+           id="g82339-6"
+           inkscape:transform-center-x="449.81598"
+           inkscape:transform-center-y="45.666809">
+          <defs
+             id="defs82341-9">
+            <rect
+               id="SVGID_4549_-8"
+               x="-682.31403"
+               y="181.315"
+               width="200.271"
+               height="205.44099" />
+          </defs>
+          <clipPath
+             id="clipPath101738-3">
+            <use
+               height="1052.3622"
+               width="744.09448"
+               y="0"
+               x="0"
+               style="overflow:visible"
+               xlink:href="#SVGID_4549_-8"
+               overflow="visible"
+               id="use101740-3" />
+          </clipPath>
+          <path
+             style="fill:#f15d57"
+             inkscape:connector-curvature="0"
+             clip-path="url(#SVGID_4550_-6)"
+             d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+             id="path82347-9" />
+          <path
+             style="fill:none;stroke:#ffffff;stroke-width:0.32100001;stroke-miterlimit:10"
+             inkscape:connector-curvature="0"
+             clip-path="url(#SVGID_4550_-6)"
+             stroke-miterlimit="10"
+             d="m -602.031,326.467 c 0,0.212 0.172,0.385 0.385,0.385 h 6.697 c 0.212,0 0.385,-0.173 0.385,-0.385 v -6.696 c 0,-0.213 -0.173,-0.385 -0.385,-0.385 h -6.697 c -0.213,0 -0.385,0.172 -0.385,0.385 v 6.696 z"
+             id="path82349-9" />
+        </g>
+        <text
+           y="645.37921"
+           x="350.6293"
+           style="font-size:9.75217533px;fill:#ffffff;font-family:ApexSans-Medium"
+           font-size="4.3343"
+           id="text82351-9-4"
+           inkscape:transform-center-x="450.06672"
+           inkscape:transform-center-y="45.543285">M</text>
+      </g>
+      <path
+         transform="matrix(2.25,0,0,2.25,1767.5425,-25.466067)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2" />
+      <path
+         transform="matrix(2.25,0,0,2.25,1578.7139,-25.075587)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-3)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-2" />
+      <path
+         transform="matrix(2.25,0,0,2.25,1767.5425,0.59793262)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-9)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-0" />
+      <path
+         transform="matrix(2.25,0,0,2.25,1767.6425,26.597933)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-9-3)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-0-1" />
+      <path
+         transform="matrix(2.25,0,0,2.25,1767.7422,53.197933)"
+         style="fill:#ffffff"
+         inkscape:connector-curvature="0"
+         clip-path="url(#SVGID_4564_-7-9-3-4)"
+         d="m -658.582,311.532 c 0,-0.349 0.283,-0.631 0.632,-0.631 0.351,0 0.634,0.282 0.634,0.631 0,0.35 -0.283,0.633 -0.634,0.633 -0.349,0 -0.632,-0.283 -0.632,-0.633"
+         id="path82449-2-0-1-5" />
+    </g>
+    <text
+       y="293.47144"
+       x="168.09497"
+       id="text84343-2-0-4"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="123.1228"
+         y="293.47144"
+         font-size="5.1244"
+         id="tspan84345-2-6-5">READ ONLY</tspan>
+    </text>
+    <text
+       y="292.96655"
+       x="321.78174"
+       id="text84343-2-0-4-3"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="276.80957"
+         y="292.96655"
+         font-size="5.1244"
+         id="tspan84345-2-6-5-3">WRITE / READ</tspan>
+    </text>
+    <text
+       y="262.38412"
+       x="242.19797"
+       id="text84343-2-0-4-6"
+       inkscape:transform-center-x="587.62742"
+       inkscape:transform-center-y="-134.7035"
+       style="font-size:27px;text-align:center;text-anchor:middle">
+      <tspan
+         style="font-size:11px;text-align:center;text-anchor:middle;fill:#37424b;font-family:ApexSans-Book"
+         x="197.2258"
+         y="262.38412"
+         font-size="5.1244"
+         id="tspan84345-2-6-5-6">(United States)</tspan>
+    </text>
+  </g>
+</svg>
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..20b81c5
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,106 @@
+=================
+ Welcome to Ceph
+=================
+
+Ceph uniquely delivers **object, block, and file storage in one unified
+system**. 
+
+.. raw:: html
+
+	<style type="text/css">div.body h3{margin:5px 0px 0px 0px;}</style>
+	<table cellpadding="10"><colgroup><col width="33%"><col width="33%"><col width="33%"></colgroup><tbody valign="top"><tr><td><h3>Ceph Object Store</h3>
+
+- RESTful Interface
+- S3- and Swift-compliant APIs
+- S3-style subdomains
+- Unified S3/Swift namespace
+- User management
+- Usage tracking
+- Striped objects
+- Cloud solution integration
+- Multi-site deployment
+- Disaster recovery
+
+.. raw:: html 
+
+	</td><td><h3>Ceph Block Device</h3>
+
+
+- Thin-provisioned
+- Images up to 16 exabytes
+- Configurable striping
+- In-memory caching
+- Snapshots
+- Copy-on-write cloning
+- Kernel driver support
+- KVM/libvirt support
+- Back-end for cloud solutions
+- Incremental backup
+- Disaster recovery
+
+.. raw:: html 
+
+	</td><td><h3>Ceph Filesystem</h3>
+	
+- POSIX-compliant semantics
+- Separates metadata from data
+- Dynamic rebalancing
+- Subdirectory snapshots
+- Configurable striping 
+- Kernel driver support
+- FUSE support
+- NFS/CIFS deployable
+- Use with Hadoop (replace HDFS)
+
+.. raw:: html
+
+	</td></tr><tr><td>
+	
+See `Ceph Object Store`_ for additional details.
+
+.. raw:: html
+
+	</td><td>
+	
+See `Ceph Block Device`_ for additional details.
+	
+.. raw:: html
+
+	</td><td>
+	
+See `Ceph Filesystem`_ for additional details.	
+	
+.. raw::	html 
+
+	</td></tr></tbody></table>
+
+Ceph is highly reliable, easy to manage, and free. The power of Ceph
+can transform your company's IT infrastructure and your ability to manage vast
+amounts of data. To try Ceph, see our `Getting Started`_ guides. To learn more
+about Ceph, see our `Architecture`_ section.
+
+
+
+.. _Ceph Object Store: radosgw
+.. _Ceph Block Device: rbd/rbd
+.. _Ceph Filesystem: cephfs
+.. _Getting Started: start
+.. _Architecture: architecture
+
+.. toctree::
+   :maxdepth: 1
+   :hidden:
+
+   start/intro
+   start/index
+   install/index
+   rados/index
+   cephfs/index
+   rbd/rbd
+   radosgw/index
+   api/index
+   architecture
+   Development <dev/index>
+   release-notes
+   releases
+   Glossary <glossary>
diff --git a/doc/install/build-ceph.rst b/doc/install/build-ceph.rst
new file mode 100644
index 0000000..d5bcae2
--- /dev/null
+++ b/doc/install/build-ceph.rst
@@ -0,0 +1,103 @@
+============
+ Build Ceph
+============
+
+You can get Ceph software by retrieving Ceph source code and building it yourself.
+To build Ceph, you need to set up a development environment, compile Ceph, 
+and then either install in user space or build packages and install the packages. 
+
+Build Prerequisites
+===================
+
+
+.. tip:: Check this section to see if there are specific prerequisites for your 
+   Linux/Unix distribution.
+
+Before you can build Ceph source code, you need to install several libraries
+and tools::
+
+	./install-deps.sh
+
+.. note:: Some distributions that support Google's memory profiler tool may use
+   a different package name (e.g., ``libgoogle-perftools4``).
+
+Build Ceph
+==========
+
+Ceph provides ``automake`` and ``configure`` scripts to streamline the build 
+process. To build Ceph, navigate to your cloned Ceph repository and execute the 
+following::
+
+	cd ceph
+	./autogen.sh
+	./configure
+	make
+
+.. topic:: Hyperthreading
+
+	You can use ``make -j`` to execute multiple jobs depending upon your system. For 
+	example, ``make -j4`` for a dual core processor may build faster.
+
+See `Installing a Build`_ to install a build in user space.
+
+Build Ceph Packages
+===================
+
+To build packages, you must clone the `Ceph`_ repository. You can create 
+installation packages from the latest code using ``dpkg-buildpackage`` for 
+Debian/Ubuntu or ``rpmbuild`` for the RPM Package Manager.
+
+.. tip:: When building on a multi-core CPU, use the ``-j`` and the number of 
+   cores * 2. For example, use ``-j4`` for a dual-core processor to accelerate 
+   the build.
+
+
+Advanced Package Tool (APT)
+---------------------------
+
+To create ``.deb`` packages for Debian/Ubuntu, ensure that you have cloned the 
+`Ceph`_ repository, installed the `Build Prerequisites`_ and installed 
+``debhelper``::
+
+	sudo apt-get install debhelper
+
+Once you have installed debhelper, you can build the packages::
+
+	sudo dpkg-buildpackage
+
+For multi-processor CPUs use the ``-j`` option to accelerate the build.
+
+
+RPM Package Manager
+-------------------
+
+To create ``.rpm`` packages, ensure that you have cloned the `Ceph`_ repository,
+installed the `Build Prerequisites`_ and installed ``rpm-build`` and 
+``rpmdevtools``::
+
+	yum install rpm-build rpmdevtools
+
+Once you have installed the tools, setup an RPM compilation environment::
+
+	rpmdev-setuptree
+
+Fetch the source tarball for the RPM compilation environment::
+
+	wget -P ~/rpmbuild/SOURCES/ http://ceph.com/download/ceph-<version>.tar.bz2
+
+Or from the EU mirror::
+
+	wget -P ~/rpmbuild/SOURCES/ http://eu.ceph.com/download/ceph-<version>.tar.bz2
+
+Extract the specfile::
+
+    tar --strip-components=1 -C ~/rpmbuild/SPECS/ --no-anchored -xvjf ~/rpmbuild/SOURCES/ceph-<version>.tar.bz2 "ceph.spec"
+
+Build the RPM packages::
+
+	rpmbuild -ba ~/rpmbuild/SPECS/ceph.spec
+
+For multi-processor CPUs use the ``-j`` option to accelerate the build.
+
+.. _Ceph: ../clone-source
+.. _Installing a Build: ../install-storage-cluster#installing-a-build
diff --git a/doc/install/clone-source.rst b/doc/install/clone-source.rst
new file mode 100644
index 0000000..fe67857
--- /dev/null
+++ b/doc/install/clone-source.rst
@@ -0,0 +1,101 @@
+=========================================
+ Cloning the Ceph Source Code Repository
+=========================================
+
+You may clone a Ceph branch of the Ceph source code by going to `github Ceph
+Repository`_,  selecting a branch (``master`` by default), and clicking the
+**Download ZIP** button.
+
+.. _github Ceph Repository: https://github.com/ceph/ceph
+
+
+To clone the entire git repository, install and configure ``git``.
+
+
+Install Git
+===========
+
+To install ``git`` on Debian/Ubuntu, execute::
+
+	sudo apt-get install git
+
+
+To install ``git`` on CentOS/RHEL, execute::
+
+	sudo yum install git
+
+
+You must also have a ``github`` account. If you do not have a
+``github`` account, go to `github.com`_ and register.
+Follow the directions for setting up git at 
+`Set Up Git`_.
+
+.. _github.com: http://github.com
+.. _Set Up Git: http://help.github.com/linux-set-up-git
+
+
+Add SSH Keys (Optional)
+=======================
+
+If you intend to commit code to Ceph or to clone using SSH
+(``git at github.com:ceph/ceph.git``), you must generate SSH keys for github. 
+
+.. tip:: If you only intend to clone the repository, you may 
+   use ``git clone --recursive https://github.com/ceph/ceph.git`` 
+   without generating SSH keys.
+
+To generate SSH keys for ``github``, execute::
+
+	ssh-keygen
+
+Get the key to add to your ``github`` account (the following example
+assumes you used the default file path)::
+
+	cat .ssh/id_rsa.pub
+
+Copy the public key.
+
+Go to your your ``github`` account, click on "Account Settings" (i.e., the
+'tools' icon); then, click "SSH Keys" on the left side navbar.
+
+Click "Add SSH key" in the "SSH Keys" list, enter a name for the key, paste the
+key you generated, and press the "Add key" button.
+
+
+Clone the Source
+================
+
+To clone the Ceph source code repository, execute::
+
+	git clone --recursive https://github.com/ceph/ceph.git
+
+Once ``git clone`` executes, you should have a full copy of the Ceph 
+repository.
+
+.. tip:: Make sure you maintain the latest copies of the submodules
+   included in the repository. Running ``git status`` will tell you if
+   the submodules are out of date.
+
+::
+
+	cd ceph
+	git status
+
+If your submodules are out of date, run::
+
+	git submodule update --force --init --recursive
+
+Choose a Branch
+===============
+
+Once you clone the source code and submodules, your Ceph repository 
+will be on the ``master`` branch by default, which is the unstable 
+development branch. You may choose other branches too.
+
+- ``master``: The unstable development branch.
+- ``stable``: The bugfix branch.
+- ``next``: The release candidate branch.
+
+::
+
+	git checkout master
diff --git a/doc/install/get-packages.rst b/doc/install/get-packages.rst
new file mode 100644
index 0000000..0dfd9b2
--- /dev/null
+++ b/doc/install/get-packages.rst
@@ -0,0 +1,467 @@
+==============
+ Get Packages
+==============
+
+To install Ceph and other enabling software, you need to retrieve packages from
+the Ceph repository. Follow this guide to get packages; then, proceed to the
+`Install Ceph Object Storage`_.
+
+
+Getting Packages
+================
+
+There are two ways to get packages:
+
+- **Add Repositories:** Adding repositories is the easiest way to get packages,
+  because package management tools will retrieve the packages and all enabling
+  software for you in most cases. However, to use this approach, each
+  :term:`Ceph Node` in your cluster must have internet access.
+
+- **Download Packages Manually:** Downloading packages manually is a convenient
+  way to install Ceph if your environment does not allow a :term:`Ceph Node` to
+  access the internet.
+
+
+Requirements
+============
+
+All Ceph deployments require Ceph packages (except for development). You should
+also add keys and recommended packages.
+
+- **Keys: (Recommended)** Whether you add repositories or download packages
+  manually, you should download keys to verify the packages. If you do not get
+  the keys, you may encounter security warnings. There are two keys: one for
+  releases (common) and one for development (programmers and QA only). Choose
+  the key that suits your needs. See `Add Keys`_ for details.
+
+- **Ceph: (Required)** All Ceph deployments require Ceph release packages,
+  except for deployments that use development packages (development, QA, and
+  bleeding edge deployments only). See `Add Ceph`_ for details.
+
+- **Ceph Development: (Optional)** If you are developing for Ceph, testing Ceph
+  development builds, or if you want features from the bleeding edge of Ceph
+  development, you may get Ceph development packages. See
+  `Add Ceph Development`_ for details.
+
+- **Apache/FastCGI: (Optional)** If you are deploying a
+  :term:`Ceph Object Storage` service, you must install Apache and FastCGI.
+  Ceph provides Apache and FastCGI builds that are identical to those available
+  from Apache, but with 100-continue support. If you want to enable
+  :term:`Ceph Object Gateway` daemons with 100-continue support, you must
+  retrieve Apache/FastCGI packages from the Ceph repository.
+  See `Add Apache/FastCGI`_ for details.
+
+
+If you intend to download packages manually, see Section `Download Packages`_.
+
+
+Add Keys
+========
+
+Add a key to your system's list of trusted keys to avoid a security warning. For
+major releases (e.g., ``dumpling``, ``emperor``, ``firefly``) and development
+releases (``release-name-rc1``, ``release-name-rc2``), use the ``release.asc``
+key. For development testing packages, use the ``autobuild.asc`` key (developers
+and QA).
+
+
+APT
+---
+
+To install the ``release.asc`` key, execute the following::
+
+	wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
+
+
+To install the ``autobuild.asc`` key, execute the following
+(QA and developers only)::
+
+	wget -q -O- 'https://download.ceph.com/keys/autobuild.asc' | sudo apt-key add -
+
+
+RPM
+---
+
+To install the ``release.asc`` key, execute the following::
+
+	sudo rpm --import 'https://download.ceph.com/keys/release.asc'
+
+To install the ``autobuild.asc`` key, execute the following
+(QA and developers only)::
+
+	sudo rpm --import 'https://download.ceph.com/keys/autobuild.asc'
+
+
+Add Ceph
+========
+
+Release repositories use the ``release.asc`` key to verify packages.
+To install Ceph packages with the Advanced Package Tool (APT) or
+Yellowdog Updater, Modified (YUM), you must add Ceph repositories.
+
+You may find releases for Debian/Ubuntu (installed with APT) at::
+
+	http://download.ceph.com/debian-{release-name}
+
+You may find releases for CentOS/RHEL and others (installed with YUM) at::
+
+	http://download.ceph.com/rpm-{release-name}
+
+The major releases of Ceph include:
+
+- **Hammer:** Hammer is the most recent, and is also the eighth major release
+  of Ceph.  These packages are recommended for anyone deploying Ceph in a
+  production environment. Critical bug fixes are backported and point releases
+  are made as necessary.
+
+- **Giant:** Giant is the seventh major release of Ceph. These packages are
+  recommended for anyone deploying Ceph in a production environment.  Critical
+  bug fixes are backported and point releases are made as necessary.
+
+- **Firefly:** Firefly is the sixth major release of Ceph. These packages
+  are recommended for anyone deploying Ceph in a production environment.
+  Firefly is a long-term stable release, so critical bug fixes are backported
+  and point releases are made as necessary.
+
+- **Emperor:** Emperor is the fifth major release of Ceph. These packages
+  are are old and no longer maintained, so we recommend that users upgrade to
+  Firefly immediately.
+
+- **Argonaut, Bobtail, Cuttlefish, Dumpling:** These are the first four
+  releases of Ceph. These packages are old and no longer maintained (Dumpling
+  was retired in May 2015), so we recommend that users upgrade to a more
+  recent version.
+
+.. tip:: For international users: There might be a mirror close to you where download Ceph from. For more information see: `Ceph Mirrors`_.
+
+Debian Packages
+---------------
+
+Add a Ceph package repository to your system's list of APT sources. For newer
+versions of Debian/Ubuntu, call ``lsb_release -sc`` on the command line to
+get the short codename, and replace ``{codename}`` in the following command. ::
+
+	sudo apt-add-repository 'deb http://download.ceph.com/debian-firefly/ {codename} main'
+
+For early Linux distributions, you may execute the following command::
+
+	echo deb http://download.ceph.com/debian-firefly/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+For earlier Ceph releases, replace ``{release-name}`` with the name  with the
+name of the Ceph release. You may call ``lsb_release -sc`` on the command  line
+to get the short codename, and replace ``{codename}`` in the following command.
+::
+
+	sudo apt-add-repository 'deb http://download.ceph.com/debian-{release-name}/ {codename} main'
+
+For older Linux distributions, replace ``{release-name}`` with the name of the
+release::
+
+	echo deb http://download.ceph.com/debian-{release-name}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+Ceph on ARM processors requires Google's memory profiling tools (``google-perftools``).
+The Ceph repository should have a copy at
+http://download.ceph.com/packages/google-perftools/debian. ::
+
+	echo deb http://download.ceph.com/packages/google-perftools/debian  $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/google-perftools.list
+
+
+For development release packages, add our package repository to your system's
+list of APT sources.  See `the testing Debian repository`_ for a complete list
+of Debian and Ubuntu releases supported. ::
+
+	echo deb http://download.ceph.com/debian-testing/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+.. tip:: For international users: There might be a mirror close to you where download Ceph from. For more information see: `Ceph Mirrors`_.
+
+RPM Packages
+------------
+
+For major releases, you may add a Ceph entry to the ``/etc/yum.repos.d``
+directory. Create a ``ceph.repo`` file. In the example below, replace
+``{ceph-release}`` with  a major release of Ceph (e.g., ``dumpling``,
+``emperor``, etc.) and ``{distro}`` with your Linux distribution (e.g., ``el6``,
+``rhel6``, etc.).  You may view http://download.ceph.com/rpm-{ceph-release}/ directory to
+see which  distributions Ceph supports. Some Ceph packages (e.g., EPEL) must
+take priority over standard packages, so you must ensure that you set
+``priority=2``. ::
+
+	[ceph]
+	name=Ceph packages for $basearch
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/$basearch
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+	[ceph-noarch]
+	name=Ceph noarch packages
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/noarch
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+	[ceph-source]
+	name=Ceph source packages
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/SRPMS
+	enabled=0
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+For development release packages, you may specify the repository
+for development releases instead. ::
+
+	[ceph]
+	name=Ceph packages for $basearch/$releasever
+	baseurl=http://download.ceph.com/rpm-testing/{distro}/$basearch
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+	[ceph-noarch]
+	name=Ceph noarch packages
+	baseurl=http://download.ceph.com/rpm-testing/{distro}/noarch
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+	[ceph-source]
+	name=Ceph source packages
+	baseurl=http://download.ceph.com/rpm-testing/{distro}/SRPMS
+	enabled=0
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+For specific packages, you may retrieve them by specifically downloading the
+release package by name. Our development process generates a new release of Ceph
+every 3-4 weeks. These packages are faster-moving than the major releases.
+Development packages have new features integrated quickly, while still
+undergoing several weeks of QA prior to release.
+
+The repository package installs the repository details on your local system for
+use with ``yum`` or ``up2date``. Replace ``{distro}`` with your Linux distribution,
+and ``{release}`` with the specific release of Ceph::
+
+    su -c 'rpm -Uvh http://download.ceph.com/rpms/{distro}/x86_64/ceph-{release}.el6.noarch.rpm'
+
+You can download the RPMs directly from::
+
+     http://download.ceph.com/rpm-testing
+
+.. tip:: For international users: There might be a mirror close to you where download Ceph from. For more information see: `Ceph Mirrors`_.
+
+
+Add Ceph Development
+====================
+
+Development repositories use the ``autobuild.asc`` key to verify packages.
+If you are developing Ceph and need to deploy and test specific Ceph branches,
+ensure that you remove repository entries for major releases first.
+
+
+Debian Packages
+---------------
+
+We automatically build Debian and Ubuntu packages for current
+development branches in the Ceph source code repository.  These
+packages are intended for developers and QA only.
+
+Add our package repository to your system's list of APT sources, but
+replace ``{BRANCH}`` with the branch you'd like to use (e.g., chef-3,
+wip-hack, master).  See `the gitbuilder page`_ for a complete
+list of distributions we build. ::
+
+	echo deb http://gitbuilder.ceph.com/ceph-deb-$(lsb_release -sc)-x86_64-basic/ref/{BRANCH} $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+
+RPM Packages
+------------
+
+For current development branches, you may add a Ceph entry to the
+``/etc/yum.repos.d`` directory. Create a ``ceph.repo`` file. In the example
+below, replace ``{distro}`` with your Linux distribution (e.g., ``centos6``,
+``rhel6``, etc.), and ``{branch}`` with the name of the branch you want to
+install. ::
+
+
+	[ceph-source]
+	name=Ceph source packages
+	baseurl=http://gitbuilder.ceph.com/ceph-rpm-{distro}-x86_64-basic/ref/{branch}/SRPMS
+	enabled=0
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/autobuild.asc
+
+
+You may view http://gitbuilder.ceph.com directory to see which distributions
+Ceph supports.
+
+
+Add Apache/FastCGI
+==================
+
+Ceph Object Gateway works with ordinary Apache and FastCGI libraries. However,
+Ceph builds Apache and FastCGI packages that support 100-continue. To use the
+Ceph Apache and FastCGI packages, add them to your repository.
+
+
+Debian Packages
+---------------
+
+Add our Apache and FastCGI packages to your system's list of APT sources if you intend to
+use 100-continue. ::
+
+	echo deb http://gitbuilder.ceph.com/apache2-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-apache.list
+	echo deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-$(lsb_release -sc)-x86_64-basic/ref/master $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph-fastcgi.list
+
+
+RPM Packages
+------------
+
+You may add a Ceph entry to the ``/etc/yum.repos.d`` directory. Create a
+``ceph-apache.repo`` file. In the example below, replace ``{distro}`` with your
+Linux distribution (e.g., ``el6``, ``rhel6``, etc.).  You may view
+http://gitbuilder.ceph.com directory to see which distributions Ceph supports.
+::
+
+
+	[apache2-ceph-noarch]
+	name=Apache noarch packages for Ceph
+	baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/autobuild.asc
+
+	[apache2-ceph-source]
+	name=Apache source packages for Ceph
+	baseurl=http://gitbuilder.ceph.com/apache2-rpm-{distro}-x86_64-basic/ref/master
+	enabled=0
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/autobuild.asc
+
+
+Repeat the forgoing process by creating a ``ceph-fastcgi.repo`` file. ::
+
+	[fastcgi-ceph-basearch]
+	name=FastCGI basearch packages for Ceph
+	baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/autobuild.asc
+
+	[fastcgi-ceph-noarch]
+	name=FastCGI noarch packages for Ceph
+	baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/autobuild.asc
+
+	[fastcgi-ceph-source]
+	name=FastCGI source packages for Ceph
+	baseurl=http://gitbuilder.ceph.com/mod_fastcgi-rpm-{distro}-x86_64-basic/ref/master
+	enabled=0
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/autobuild.asc
+
+
+Download Packages
+=================
+
+If you are attempting to install behind a firewall in an environment without internet
+access, you must retrieve the packages (mirrored with all the necessary dependencies)
+before attempting an install.
+
+Debian Packages
+---------------
+
+Ceph requires additional additional third party libraries.
+
+- libaio1
+- libsnappy1
+- libcurl3
+- curl
+- libgoogle-perftools4
+- google-perftools
+- libleveldb1
+
+
+The repository package installs the repository details on your local system for
+use with ``apt``. Replace ``{release}`` with the latest Ceph release. Replace
+``{version}`` with the latest Ceph version number. Replace ``{distro}`` with
+your Linux distribution codename. Replace ``{arch}`` with the CPU architecture.
+
+::
+
+	wget -q http://download.ceph.com/debian-{release}/pool/main/c/ceph/ceph_{version}{distro}_{arch}.deb
+
+
+RPM Packages
+------------
+
+Ceph requires additional additional third party libraries.
+To add the EPEL repository, execute the following::
+
+   su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
+
+Ceph requires the following packages:
+
+- snappy
+- leveldb
+- gdisk
+- python-argparse
+- gperftools-libs
+
+
+Packages are currently built for the RHEL/CentOS6 (``el6``), Fedora 18 and 19
+(``f18`` and ``f19``), OpenSUSE 12.2 (``opensuse12.2``), and SLES (``sles11``)
+platforms. The repository package installs the repository details on your local
+system for use with ``yum`` or ``up2date``. Replace ``{distro}`` with your
+distribution. ::
+
+    su -c 'rpm -Uvh http://download.ceph.com/rpm-firefly/{distro}/noarch/ceph-{version}.{distro}.noarch.rpm'
+
+For example, for CentOS 6  (``el6``)::
+
+    su -c 'rpm -Uvh http://download.ceph.com/rpm-firefly/el6/noarch/ceph-release-1-0.el6.noarch.rpm'
+
+You can download the RPMs directly from::
+
+	http://download.ceph.com/rpm-firefly
+
+
+For earlier Ceph releases, replace ``{release-name}`` with the name
+with the name of the Ceph release. You may call ``lsb_release -sc`` on the command
+line to get the short codename. ::
+
+	su -c 'rpm -Uvh http://download.ceph.com/rpm-{release-name}/{distro}/noarch/ceph-{version}.{distro}.noarch.rpm'
+
+
+
+
+.. _Install Ceph Object Storage: ../install-storage-cluster
+.. _the testing Debian repository: http://download.ceph.com/debian-testing/dists
+.. _the gitbuilder page: http://gitbuilder.ceph.com
+.. _Ceph Mirrors: ../mirrors
diff --git a/doc/install/get-tarballs.rst b/doc/install/get-tarballs.rst
new file mode 100644
index 0000000..93b7752
--- /dev/null
+++ b/doc/install/get-tarballs.rst
@@ -0,0 +1,14 @@
+====================================
+ Downloading a Ceph Release Tarball
+====================================
+
+As Ceph development progresses, the Ceph team releases new versions of the
+source code. You may download source code tarballs for Ceph releases here:
+
+`Ceph Release Tarballs`_
+
+.. tip:: For international users: There might be a mirror close to you where download Ceph from. For more information see: `Ceph Mirrors`_.
+
+
+.. _Ceph Release Tarballs: http://ceph.com/download/
+.. _Ceph Mirrors: ../mirrors
diff --git a/doc/install/index.rst b/doc/install/index.rst
new file mode 100644
index 0000000..033d597
--- /dev/null
+++ b/doc/install/index.rst
@@ -0,0 +1,70 @@
+=======================
+ Installation (Manual)
+=======================
+
+
+Get Software
+============
+
+There are several methods for getting Ceph software. The easiest and most common
+method is to `get packages`_ by adding repositories for use with package
+management tools such as the Advanced Package Tool (APT) or Yellowdog Updater,
+Modified (YUM). You may also retrieve pre-compiled packages from the Ceph
+repository. Finally, you can retrieve tarballs or clone the Ceph source code
+repository and build Ceph yourself.
+
+
+.. toctree::
+   :maxdepth: 1
+
+	Get Packages <get-packages>
+	Get Tarballs <get-tarballs>
+	Clone Source <clone-source>
+	Build Ceph <build-ceph>
+    Ceph Mirrors <mirrors>
+
+
+Install Software
+================
+
+Once you have the Ceph software (or added repositories), installing the software
+is easy. To install packages on each :term:`Ceph Node` in your cluster. You may
+use  ``ceph-deploy`` to install Ceph for your storage cluster, or use package
+management tools. You should install Yum Priorities for RHEL/CentOS and other
+distributions that use Yum if you intend to install the Ceph Object Gateway or
+QEMU.
+
+.. toctree::
+   :maxdepth: 1
+
+	Install ceph-deploy <install-ceph-deploy>
+   Install Ceph Storage Cluster <install-storage-cluster>
+	Install Ceph Object Gateway <install-ceph-gateway>
+	Install Virtualization for Block <install-vm-cloud>
+
+
+Deploy a Cluster Manually
+=========================
+
+Once you have Ceph installed on your nodes, you can deploy a cluster manually.
+The manual procedure is primarily for exemplary purposes for those developing
+deployment scripts with Chef, Juju, Puppet, etc.
+
+.. toctree::
+
+   Manual Deployment <manual-deployment>
+
+Upgrade Software
+================
+
+As new versions of Ceph become available, you may upgrade your cluster to take
+advantage of new functionality. Read the upgrade documentation before you
+upgrade your cluster. Sometimes upgrading Ceph requires you to follow an upgrade
+sequence.
+
+.. toctree::
+   :maxdepth: 2
+
+   Upgrading Ceph <upgrading-ceph>
+
+.. _get packages: ../install/get-packages
diff --git a/doc/install/install-ceph-deploy.rst b/doc/install/install-ceph-deploy.rst
new file mode 100644
index 0000000..d6516ad
--- /dev/null
+++ b/doc/install/install-ceph-deploy.rst
@@ -0,0 +1,23 @@
+=====================
+ Install Ceph Deploy
+=====================
+
+The ``ceph-deploy`` tool enables you to set up and tear down Ceph clusters
+for development, testing and proof-of-concept projects.
+
+
+APT
+---
+
+To install ``ceph-deploy`` with ``apt``, execute the following:: 
+
+	sudo apt-get update && sudo apt-get install ceph-deploy
+
+
+RPM
+---
+
+To install ``ceph-deploy`` with ``yum``, execute the following:: 
+
+	sudo yum install ceph-deploy
+
diff --git a/doc/install/install-ceph-gateway.rst b/doc/install/install-ceph-gateway.rst
new file mode 100644
index 0000000..29a25da
--- /dev/null
+++ b/doc/install/install-ceph-gateway.rst
@@ -0,0 +1,583 @@
+===========================
+Install Ceph Object Gateway
+===========================
+
+As of `firefly` (v0.80), Ceph Object Gateway is running on Civetweb (embedded
+into the ``ceph-radosgw`` daemon) instead of Apache and FastCGI. Using Civetweb
+simplifies the Ceph Object Gateway installation and configuration.
+
+.. note:: To run the Ceph Object Gateway service, you should have a running
+          Ceph storage cluster, and the gateway host should have access to the 
+          public network.
+
+.. note:: In version 0.80, the Ceph Object Gateway does not support SSL. You
+          may setup a reverse proxy server with SSL to dispatch HTTPS requests 
+          as HTTP requests to CivetWeb.
+
+Execute the Pre-Installation Procedure
+--------------------------------------
+
+See Preflight_ and execute the pre-installation procedures on your Ceph Object
+Gateway node. Specifically, you should disable ``requiretty`` on your Ceph
+Deploy user, set SELinux to ``Permissive`` and set up a Ceph Deploy user with
+password-less ``sudo``. For Ceph Object Gateways, you will need to open the
+port that Civetweb will use in production.
+
+.. note:: Civetweb runs on port ``7480`` by default.
+
+Install Ceph Object Gateway
+---------------------------
+
+From the working directory of your administration server, install the Ceph
+Object Gateway package on the Ceph Object Gateway node. For example::
+
+ ceph-deploy install --rgw <gateway-node1> [<gateway-node2> ...]
+
+The ``ceph-common`` package is a dependency, so ``ceph-deploy`` will install
+this too. The ``ceph`` CLI tools are intended for administrators. To make your
+Ceph Object Gateway node an administrator node, execute the following from the
+working directory of your administration server::
+
+ ceph-deploy admin <node-name>
+
+Create a Gateway Instance
+-------------------------
+
+From the working directory of your administration server, create an instance of
+the Ceph Object Gateway on the Ceph Object Gateway. For example::
+
+ ceph-deploy rgw create <gateway-node1>
+
+Once the gateway is running, you should be able to access it on port ``7480``
+with an unauthenticated request like this::
+
+ http://client-node:7480
+
+If the gateway instance is working properly, you should receive a response like
+this::
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+        <Owner>
+ 		<ID>anonymous</ID>
+ 		<DisplayName></DisplayName>
+ 	</Owner>
+ 	<Buckets>
+ 	</Buckets>
+ </ListAllMyBucketsResult>
+
+If at any point you run into trouble and you want to start over, execute the
+following to purge the configuration::
+
+ ceph-deploy purge <gateway-node1> [<gateway-node2>]
+ ceph-deploy purgedata <gateway-node1> [<gateway-node2>]
+
+If you execute ``purge``, you must re-install Ceph.
+
+Change the Default Port
+-----------------------
+
+Civetweb runs on port ``7480`` by default. To change the default port (e.g,. to
+port ``80``), modify your Ceph configuration file in the working directory of
+your administration server. Add a section entitled
+``[client.rgw.<gateway-node>]``, replacing ``<gateway-node>`` with the short
+node name of your Ceph Object Gateway node (i.e., ``hostname -s``).
+
+.. note:: In version 0.94, the Ceph Object Gateway does not support SSL. You
+          may setup a reverse proxy web server with SSL to dispatch HTTPS 
+          requests as HTTP requests to CivetWeb.
+
+For example, if your node name is ``gateway-node1``, add a section like this
+after the ``[global]`` section::
+
+ [client.rgw.gateway-node1]
+ rgw_frontends = "civetweb port=80"
+
+.. note:: Ensure that you leave no whitespace between ``port=<port-number>`` in
+          the ``rgw_frontends`` key/value pair. The ``[client.rgw.gateway-node1]``
+          heading identifies this portion of the Ceph configuration file as 
+          configuring a Ceph Storage Cluster client where the client type is a Ceph
+          Object Gateway (i.e., ``rgw``), and the name of the instance is )
+          ``gateway-node1``.
+
+Push the updated configuration file to your Ceph Object Gateway node
+(and other Ceph nodes)::
+
+ ceph-deploy --overwrite-conf config push <gateway-node> [<other-nodes>]
+
+To make the new port setting take effect, restart the Ceph Object
+Gateway::
+
+ sudo systemctl restart ceph-radosgw.service
+
+Finally, check to ensure that the port you selected is open on the node's
+firewall (e.g., port ``80``). If it is not open, add the port and reload the
+firewall configuration. If you use the ``firewald``, daemon execute::
+
+  sudo firewall-cmd --list-all
+  sudo firewall-cmd --zone=public --add-port 80/tcp --permanent
+  sudo firewall-cmd --reload
+
+If you use ``iptables``, execute::
+
+  sudo iptables --list
+  sudo iptables -I INPUT 1 -i <iface> -p tcp -s <ip-address>/<netmask> --dport 80 -j ACCEPT
+
+Replace ``<iface>`` and ``<ip-address>/<netmask>`` with the relevant values for
+your Ceph Object Gateway node.
+
+Once you have finished configuring ``iptables``, ensure that you make the
+change persistent so that it will be in effect when your Ceph Object Gateway
+node reboots. Execute::
+
+  sudo apt-get install iptables-persistent
+
+A terminal UI will open up. Select ``yes`` for the prompts to save current
+``IPv4`` iptables rules to ``/etc/iptables/rules.v4`` and current ``IPv6``
+iptables rules to ``/etc/iptables/rules.v6``.
+
+The ``IPv4`` iptables rule that you set in the earlier step will be loaded in
+``/etc/iptables/rules.v4`` and will be persistent across reboots.
+
+If you add a new ``IPv4`` iptables rule after installing
+``iptables-persistent`` you will have to add it to the rule file. In such case,
+execute the following as the ``root`` user::
+
+ iptables-save > /etc/iptables/rules.v4
+
+Migrating from Apache to Civetweb
+---------------------------------
+
+If you're running the Ceph Object Gateway on Apache and FastCGI with Ceph
+Storage v0.80 or above, you're already running Civetweb--it starts with the
+``ceph-radosgw`` daemon and it's running on port 7480 by default so that it
+doesn't conflict with your Apache and FastCGI installation and other commonly
+used web service ports. Migrating to use Civetweb basically involves removing
+your Apache installation. Then, you must remove Apache and FastCGI settings
+from your Ceph configuration file and reset ``rgw_frontends`` to Civetweb.
+
+Referring back to the description for installing a Ceph Object Gateway with
+``ceph-deploy``, notice that the configuration file only has one setting
+``rgw_frontends`` (and that's assuming you elected to change the default port).
+The ``ceph-deploy`` utility generates the data directory and the keyring for
+you--placing the keyring in ``/var/lib/ceph/radosgw/{rgw-intance}``. The daemon
+looks in default locations, whereas you may have specified different settings
+in your Ceph configuration file. Since you already have keys and a data
+directory, you will want to maintain those paths in your Ceph configuration
+file if you used something other than default paths.
+
+A typical Ceph Object Gateway configuration file for an Apache-based deployment
+looks something similar as the following::
+
+On Red Hat Enterprise Linux::
+
+ [client.radosgw.gateway-node1]
+ host = {hostname}
+ keyring = /etc/ceph/ceph.client.radosgw.keyring
+ rgw socket path = ""
+ log file = /var/log/radosgw/client.radosgw.gateway-node1.log
+ rgw frontends = fastcgi socket\_port=9000 socket\_host=0.0.0.0
+ rgw print continue = false
+
+On Ubuntu::
+
+ [client.radosgw.gateway-node]
+ host = {hostname}
+ keyring = /etc/ceph/ceph.client.radosgw.keyring
+ rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
+ log file = /var/log/radosgw/client.radosgw.gateway-node1.log
+
+To modify it for use with Civetweb, simply remove the Apache-specific settings
+such as ``rgw_socket_path`` and ``rgw_print_continue``. Then, change the
+``rgw_frontends`` setting to reflect Civetweb rather than the Apache FastCGI
+front end and specify the port number you intend to use. For example::
+
+ [client.radosgw.gateway-node1]
+ host = {hostname}
+ keyring = /etc/ceph/ceph.client.radosgw.keyring
+ log file = /var/log/radosgw/client.radosgw.gateway-node1.log
+ rgw_frontends = civetweb port=80
+
+Finally, restart the Ceph Object Gateway. On Red Hat Enterprise Linux execute::
+
+ sudo systemctl restart ceph-radosgw.service
+
+On Ubuntu execute::
+
+ sudo service radosgw restart id=rgw.<short-hostname>
+
+If you used a port number that is not open, you will also need to open that
+port on your firewall.
+
+Configure Bucket Sharding
+-------------------------
+
+A Ceph Object Gateway stores bucket index data in the ``index_pool``, which
+defaults to ``.rgw.buckets.index``. Sometimes users like to put many objects
+(hundreds of thousands to millions of objects) in a single bucket. If you do
+not use the gateway administration interface to set quotas for the maximum
+number of objects per bucket, the bucket index can suffer significant
+performance degradation when users place large numbers of objects into a
+bucket.
+
+In Ceph 0.94, you may shard bucket indices to help prevent performance
+bottlenecks when you allow a high number of objects per bucket. The
+``rgw_override_bucket_index_max_shards`` setting allows you to set a maximum
+number of shards per bucket. The default value is ``0``, which means bucket
+index sharding is off by default.
+
+To turn bucket index sharding on, set ``rgw_override_bucket_index_max_shards``
+to a value greater than ``0``.
+
+For simple configurations, you may add ``rgw_override_bucket_index_max_shards``
+to your Ceph configuration file. Add it under ``[global]`` to create a
+system-wide value. You can also set it for each instance in your Ceph
+configuration file.
+
+Once you have changed your bucket sharding configuration in your Ceph
+configuration file, restart your gateway. On Red Hat Enteprise Linux execute::
+
+ sudo systemctl restart ceph-radosgw.service
+
+On Ubuntu execute::
+
+ sudo service radosgw restart id=rgw.<short-hostname>sudo service radosgw restart id=rgw.<short-hostname>
+
+For federated configurations, each zone may have a different ``index_pool``
+setting for failover. To make the value consistent for a region's zones, you
+may set ``rgw_override_bucket_index_max_shards`` in a gateway's region
+configuration. For example::
+
+  radosgw-admin region get > region.json
+
+Open the ``region.json`` file and edit the ``bucket_index_max_shards`` setting
+for each named zone. Save the ``region.json`` file and reset the region. For
+example::
+
+   radosgw-admin region set < region.json
+
+Once you've updated your region, update the region map. For example::
+
+   radosgw-admin regionmap update --name client.rgw.ceph-client
+
+Where ``client.rgw.ceph-client`` is the name of the gateway user.
+
+.. note:: Mapping the index pool (for each zone, if applicable) to a CRUSH
+          ruleset of SSD-based OSDs may also help with bucket index performance.
+
+Add Wildcard to DNS
+-------------------
+
+To use Ceph with S3-style subdomains (e.g., bucket-name.domain-name.com), you
+need to add a wildcard to the DNS record of the DNS server you use with the
+``ceph-radosgw`` daemon.
+
+The address of the DNS must also be specified in the Ceph configuration file
+with the ``rgw dns name = {hostname}`` setting.
+
+For ``dnsmasq``, add the following address setting with a dot (.) prepended to
+the host name::
+
+ address=/.{hostname-or-fqdn}/{host-ip-address}
+
+For example::
+
+ address=/.gateway-node1/192.168.122.75
+
+
+For ``bind``, add a wildcard to the DNS record. For example::
+
+ $TTL    604800
+ @       IN      SOA     gateway-node1. root.gateway-node1. (
+                               2         ; Serial
+                          604800         ; Refresh
+                           86400         ; Retry
+                         2419200         ; Expire
+                          604800 )       ; Negative Cache TTL
+ ;
+ @       IN      NS      gateway-node1.
+ @       IN      A       192.168.122.113
+ *       IN      CNAME   @
+
+Restart your DNS server and ping your server with a subdomain to ensure that
+your ``ceph-radosgw`` daemon can process the subdomain requests::
+
+ ping mybucket.{hostname}
+
+For example::
+
+ ping mybucket.gateway-node1
+
+Add Debugging (if needed)
+-------------------------
+
+Once you finish the setup procedure, if you encounter issues with your
+configuration, you can add debugging to the ``[global]`` section of your Ceph
+configuration file and restart the gateway(s) to help troubleshoot any
+configuration issues. For example::
+
+ [global]
+ #append the following in the global section.
+ debug ms = 1
+ debug rgw = 20
+
+Using the Gateway
+-----------------
+
+To use the REST interfaces, first create an initial Ceph Object Gateway user
+for the S3 interface. Then, create a subuser for the Swift interface. You then
+need to verify if the created users are able to access the gateway.
+
+Create a RADOSGW User for S3 Access
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A ``radosgw`` user needs to be created and granted access. The command ``man
+radosgw-admin`` will provide information on additional command options.
+
+To create the user, execute the following on the ``gateway host``::
+
+ sudo radosgw-admin user create --uid="testuser" --display-name="First User"
+
+The output of the command will be something like the following::
+
+ {
+	 "user_id": "testuser",
+	 "display_name": "First User",
+	 "email": "",
+	 "suspended": 0,
+	 "max_buckets": 1000,
+	 "auid": 0,
+	 "subusers": [],
+	 "keys": [{
+		 "user": "testuser",
+		 "access_key": "I0PJDPCIYZ665MW88W9R",
+		 "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
+	 }],
+	 "swift_keys": [],
+	 "caps": [],
+	 "op_mask": "read, write, delete",
+	 "default_placement": "",
+	 "placement_tags": [],
+	 "bucket_quota": {
+		 "enabled": false,
+		 "max_size_kb": -1,
+		 "max_objects": -1
+	 },
+	 "user_quota": {
+		 "enabled": false,
+		 "max_size_kb": -1,
+		 "max_objects": -1
+	 },
+	 "temp_url_keys": []
+ }
+
+.. note:: The values of ``keys->access_key`` and ``keys->secret_key`` are
+          needed for access validation.
+
+.. important:: Check the key output. Sometimes ``radosgw-admin`` generates a
+               JSON escape character ``\`` in ``access_key`` or ``secret_key``
+               and some clients do not know how to handle JSON escape 
+               characters. Remedies include removing the JSON escape character
+               ``\``, encapsulating the string in quotes, regenerating the key 
+               and ensuring that it does not have a JSON escape character or 
+               specify the key and secret manually. Also, if ``radosgw-admin``
+               generates a JSON escape character ``\`` and a forward slash ``/``
+               together in a key, like ``\/``, only remove the JSON escape 
+               character ``\``. Do not remove the forward slash ``/`` as it is 
+               a valid character in the key.
+
+Create a Swift User
+^^^^^^^^^^^^^^^^^^^
+
+A Swift subuser needs to be created if this kind of access is needed. Creating
+a Swift user is a two step process. The first step is to create the user. The
+second is to create the secret key.
+
+Execute the following steps on the ``gateway host``:
+
+Create the Swift user::
+
+ sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
+
+The output will be something like the following::
+
+ {
+	 "user_id": "testuser",
+	 "display_name": "First User",
+	 "email": "",
+	 "suspended": 0,
+	 "max_buckets": 1000,
+	 "auid": 0,
+	 "subusers": [{
+		 "id": "testuser:swift",
+		 "permissions": "full-control"
+	 }],
+	 "keys": [{
+		 "user": "testuser:swift",
+		 "access_key": "3Y1LNW4Q6X0Y53A52DET",
+		 "secret_key": ""
+	 }, {
+		 "user": "testuser",
+		 "access_key": "I0PJDPCIYZ665MW88W9R",
+		 "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
+	 }],
+	 "swift_keys": [],
+	 "caps": [],
+	 "op_mask": "read, write, delete",
+	 "default_placement": "",
+	 "placement_tags": [],
+	 "bucket_quota": {
+		 "enabled": false,
+		 "max_size_kb": -1,
+		 "max_objects": -1
+	 },
+	 "user_quota": {
+		 "enabled": false,
+		 "max_size_kb": -1,
+		 "max_objects": -1
+	 },
+	 "temp_url_keys": []
+  }
+
+Create the secret key::
+
+ sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
+
+The output will be something like the following::
+
+ {
+	 "user_id": "testuser",
+	 "display_name": "First User",
+	 "email": "",
+	 "suspended": 0,
+	 "max_buckets": 1000,
+	 "auid": 0,
+	 "subusers": [{
+		 "id": "testuser:swift",
+		 "permissions": "full-control"
+	 }],
+	 "keys": [{
+		 "user": "testuser:swift",
+		 "access_key": "3Y1LNW4Q6X0Y53A52DET",
+		 "secret_key": ""
+	 }, {
+		 "user": "testuser",
+		 "access_key": "I0PJDPCIYZ665MW88W9R",
+		 "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"
+	 }],
+	 "swift_keys": [{
+		 "user": "testuser:swift",
+		 "secret_key": "244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF\/IA"
+	 }],
+	 "caps": [],
+	 "op_mask": "read, write, delete",
+	 "default_placement": "",
+	 "placement_tags": [],
+	 "bucket_quota": {
+		 "enabled": false,
+		 "max_size_kb": -1,
+		 "max_objects": -1
+	 },
+	 "user_quota": {
+		 "enabled": false,
+		 "max_size_kb": -1,
+		 "max_objects": -1
+	 },
+	 "temp_url_keys": []
+ }
+
+Access Verification
+^^^^^^^^^^^^^^^^^^^
+
+Test S3 Access
+""""""""""""""
+
+You need to write and run a Python test script for verifying S3 access. The S3
+access test script will connect to the ``radosgw``, create a new bucket and
+list all buckets. The values for ``aws_access_key_id`` and
+``aws_secret_access_key`` are taken from the values of ``access_key`` and
+``secret_key`` returned by the ``radosgw_admin`` command.
+
+Execute the following steps:
+
+#. You will need to install the ``python-boto`` package::
+
+    sudo yum install python-boto
+
+#. Create the Python script::
+
+    vi s3test.py
+
+#. Add the following contents to the file::
+
+    import boto
+    import boto.s3.connection
+
+    access_key = 'I0PJDPCIYZ665MW88W9R'
+    secret_key = 'dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA'
+    conn = boto.connect_s3(
+            aws_access_key_id = access_key,
+            aws_secret_access_key = secret_key,
+            host = '{hostname}', port = {port},
+            is_secure=False, calling_format = boto.s3.connection.OrdinaryCallingFormat(),
+            )
+
+    bucket = conn.create_bucket('my-new-bucket')
+        for bucket in conn.get_all_buckets():
+                print "{name} {created}".format(
+                        name = bucket.name,
+                        created = bucket.creation_date,
+     )
+
+   Replace ``{hostname}`` with the hostname of the host where you have
+   configured the gateway service i.e, the ``gateway host``. Replace {port}
+   with the port number you are using with Civetweb.
+
+#. Run the script::
+
+    python s3test.py
+
+   The output will be something like the following::
+
+    my-new-bucket 2015-02-16T17:09:10.000Z
+
+Test swift access
+"""""""""""""""""
+
+Swift access can be verified via the ``swift`` command line client. The command
+``man swift`` will provide more information on available command line options.
+
+To install ``swift`` client, execute the following commands. On Red Hat
+Enterprise Linux::
+
+ sudo yum install python-setuptools
+ sudo easy_install pip
+ sudo pip install --upgrade setuptools
+ sudo pip install --upgrade python-swiftclient
+
+On Debian-based distributions::
+
+ sudo apt-get install python-setuptools
+ sudo easy_install pip
+ sudo pip install --upgrade setuptools
+ sudo pip install --upgrade python-swiftclient
+
+To test swift access, execute the following::
+
+ swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list
+
+Replace ``{IP ADDRESS}`` with the public IP address of the gateway server and
+``{swift_secret_key}`` with its value from the output of ``radosgw-admin key
+create`` command executed for the ``swift`` user. Replace {port} with the port
+number you are using with Civetweb (e.g., ``7480`` is the default). If you
+don't replace the port, it will default to port ``80``.
+
+For example::
+
+ swift -A http://10.19.143.116:7480/auth/1.0 -U testuser:swift -K '244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF/IA' list
+
+The output should be::
+
+ my-new-bucket
+
+.. _Preflight:  ../../start/quick-start-preflight
diff --git a/doc/install/install-storage-cluster.rst b/doc/install/install-storage-cluster.rst
new file mode 100644
index 0000000..f346353
--- /dev/null
+++ b/doc/install/install-storage-cluster.rst
@@ -0,0 +1,94 @@
+==============================
+ Install Ceph Storage Cluster
+==============================
+
+This guide describes installing Ceph packages manually. This procedure
+is only for users who are not installing with a deployment tool such as
+``ceph-deploy``, ``chef``, ``juju``, etc. 
+
+.. tip:: You can also use ``ceph-deploy`` to install Ceph packages, which may
+   be more convenient since you can install ``ceph`` on multiple hosts with
+   a single command.
+
+
+Installing with APT
+===================
+
+Once you have added either release or development packages to APT, you should
+update APT's database and install Ceph::
+
+	sudo apt-get update && sudo apt-get install ceph ceph-mds
+
+
+Installing with RPM
+===================
+
+To install Ceph with RPMs, execute the following steps:
+
+
+#. Install ``yum-plugin-priorities``. ::
+
+	sudo yum install yum-plugin-priorities
+
+#. Ensure ``/etc/yum/pluginconf.d/priorities.conf`` exists.
+
+#. Ensure ``priorities.conf`` enables the plugin. :: 
+
+	[main]
+	enabled = 1
+
+#. Ensure your YUM ``ceph.repo`` entry includes ``priority=2``. See
+   `Get Packages`_ for details::
+
+	[ceph]
+	name=Ceph packages for $basearch
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/$basearch
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+	[ceph-noarch]
+	name=Ceph noarch packages
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/noarch
+	enabled=1
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+	[ceph-source]
+	name=Ceph source packages
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/SRPMS
+	enabled=0
+	priority=2
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+#. Install pre-requisite packages::  
+
+	sudo yum install snappy leveldb gdisk python-argparse gperftools-libs
+
+
+Once you have added either release or development packages, or added a
+``ceph.repo`` file to ``/etc/yum.repos.d``, you can install Ceph packages. :: 
+
+	sudo yum install ceph
+
+
+Installing a Build
+==================
+
+If you build Ceph from source code, you may install Ceph in user space
+by executing the following:: 
+
+	sudo make install
+
+If you install Ceph locally, ``make`` will place the executables in
+``usr/local/bin``. You may add the Ceph configuration file to the
+``usr/local/bin`` directory to run Ceph from a single directory.
+
+.. _Get Packages: ../get-packages
diff --git a/doc/install/install-vm-cloud.rst b/doc/install/install-vm-cloud.rst
new file mode 100644
index 0000000..a28a76a
--- /dev/null
+++ b/doc/install/install-vm-cloud.rst
@@ -0,0 +1,128 @@
+=========================================
+ Install Virtualization for Block Device
+=========================================
+
+If you intend to use Ceph Block Devices and the Ceph Storage Cluster as a
+backend for Virtual Machines (VMs) or  :term:`Cloud Platforms` the QEMU/KVM and
+``libvirt`` packages are important for enabling VMs and cloud platforms.
+Examples of VMs include: QEMU/KVM, XEN, VMWare, LXC, VirtualBox, etc. Examples
+of Cloud Platforms include OpenStack, CloudStack, OpenNebula, etc.
+
+
+.. ditaa::  +---------------------------------------------------+
+            |                     libvirt                       |
+            +------------------------+--------------------------+
+                                     |
+                                     | configures
+                                     v
+            +---------------------------------------------------+
+            |                       QEMU                        |
+            +---------------------------------------------------+
+            |                      librbd                       |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+
+
+
+Install QEMU
+============
+
+QEMU KVM can interact with Ceph Block Devices via ``librbd``, which is an
+important feature for using Ceph with cloud platforms. Once you install QEMU,
+see `QEMU and Block Devices`_ for usage.
+
+
+Debian Packages
+---------------
+
+QEMU packages are incorporated into Ubuntu 12.04 Precise Pangolin and later
+versions. To  install QEMU, execute the following::
+
+	sudo apt-get install qemu
+
+
+RPM Packages
+------------
+
+To install QEMU, execute the following:
+
+
+#. Update your repositories. ::
+
+	sudo yum update
+
+#. Install QEMU for Ceph. ::
+
+	sudo yum install qemu-kvm qemu-kvm-tools qemu-img
+
+#. Install additional QEMU packages (optional)::
+
+	sudo yum install qemu-guest-agent qemu-guest-agent-win32
+
+
+Building QEMU
+-------------
+
+To build QEMU from source, use the following procedure::
+
+	cd {your-development-directory}
+	git clone git://git.qemu.org/qemu.git
+	cd qemu
+	./configure --enable-rbd
+	make; make install
+
+
+
+Install libvirt
+===============
+
+To use ``libvirt`` with Ceph, you must have a running Ceph Storage Cluster, and
+you must have installed and configured QEMU. See `Using libvirt with Ceph Block
+Device`_ for usage.
+
+
+Debian Packages
+---------------
+
+``libvirt`` packages are incorporated into Ubuntu 12.04 Precise Pangolin and
+later versions of Ubuntu. To install ``libvirt`` on these distributions,
+execute the following::
+
+	sudo apt-get update && sudo apt-get install libvirt-bin
+
+
+RPM Packages
+------------
+
+To use ``libvirt`` with a Ceph Storage Cluster, you must  have a running Ceph
+Storage Cluster and you must also install a version of QEMU with ``rbd`` format
+support.  See `Install QEMU`_ for details.
+
+
+``libvirt`` packages are incorporated into the recent CentOS/RHEL distributions.
+To install ``libvirt``, execute the following::
+
+	sudo yum install libvirt
+
+
+Building ``libvirt``
+--------------------
+
+To build ``libvirt`` from source, clone the ``libvirt`` repository and use
+`AutoGen`_ to generate the build. Then, execute ``make`` and ``make install`` to
+complete the installation. For example::
+
+	git clone git://libvirt.org/libvirt.git
+	cd libvirt
+	./autogen.sh
+	make
+	sudo make install
+
+See `libvirt Installation`_ for details.
+
+
+
+.. _libvirt Installation: http://www.libvirt.org/compiling.html
+.. _AutoGen: http://www.gnu.org/software/autogen/
+.. _QEMU and Block Devices: ../../rbd/qemu-rbd
+.. _Using libvirt with Ceph Block Device: ../../rbd/libvirt
diff --git a/doc/install/manual-deployment.rst b/doc/install/manual-deployment.rst
new file mode 100644
index 0000000..b5d6b77
--- /dev/null
+++ b/doc/install/manual-deployment.rst
@@ -0,0 +1,488 @@
+===================
+ Manual Deployment
+===================
+
+All Ceph clusters require at least one monitor, and at least as many OSDs as
+copies of an object stored on the cluster.  Bootstrapping the initial monitor(s)
+is the first step in deploying a Ceph Storage Cluster. Monitor deployment also
+sets important criteria for the entire cluster, such as the number of replicas
+for pools, the number of placement groups per OSD, the heartbeat intervals,
+whether authentication is required, etc. Most of these values are set by
+default, so it's useful to know about them when setting up your cluster for
+production.
+
+Following the same configuration as `Installation (Quick)`_, we will set up a
+cluster with ``node1`` as  the monitor node, and ``node2`` and ``node3`` for 
+OSD nodes.
+
+
+
+.. ditaa:: 
+           /------------------\         /----------------\
+           |    Admin Node    |         |     node1      |
+           |                  +-------->+                |
+           |                  |         | cCCC           |
+           \---------+--------/         \----------------/
+                     |
+                     |                  /----------------\
+                     |                  |     node2      |
+                     +----------------->+                |
+                     |                  | cCCC           |
+                     |                  \----------------/
+                     |
+                     |                  /----------------\
+                     |                  |     node3      |
+                     +----------------->|                |
+                                        | cCCC           |
+                                        \----------------/
+
+
+Monitor Bootstrapping
+=====================
+
+Bootstrapping a monitor (a Ceph Storage Cluster, in theory) requires
+a number of things:
+
+- **Unique Identifier:** The ``fsid`` is a unique identifier for the cluster, 
+  and stands for File System ID from the days when the Ceph Storage Cluster was 
+  principally for the Ceph Filesystem. Ceph now supports native interfaces, 
+  block devices, and object storage gateway interfaces too, so ``fsid`` is a 
+  bit of a misnomer.
+
+- **Cluster Name:** Ceph clusters have a cluster name, which is a simple string
+  without spaces. The default cluster name is ``ceph``, but you may specify
+  a different cluster name. Overriding the default cluster name is 
+  especially useful when you are working with multiple clusters and you need to 
+  clearly understand which cluster your are working with. 
+  
+  For example, when you run multiple clusters in a `federated architecture`_, 
+  the cluster name (e.g., ``us-west``, ``us-east``) identifies the cluster for
+  the current CLI session. **Note:** To identify the cluster name on the 
+  command line interface, specify the a Ceph configuration file with the 
+  cluster name (e.g., ``ceph.conf``, ``us-west.conf``, ``us-east.conf``, etc.).
+  Also see CLI usage (``ceph --cluster {cluster-name}``).
+  
+- **Monitor Name:** Each monitor instance within a cluster has a unique name. 
+  In common practice, the Ceph Monitor name is the host name (we recommend one
+  Ceph Monitor per host, and no commingling of Ceph OSD Daemons with 
+  Ceph Monitors). You may retrieve the short hostname with ``hostname -s``.
+
+- **Monitor Map:** Bootstrapping the initial monitor(s) requires you to 
+  generate a monitor map. The monitor map requires the ``fsid``, the cluster 
+  name (or uses the default), and at least one host name and its IP address.
+
+- **Monitor Keyring**: Monitors communicate with each other via a 
+  secret key. You must generate a keyring with a monitor secret and provide 
+  it when bootstrapping the initial monitor(s).
+  
+- **Administrator Keyring**: To use the ``ceph`` CLI tools, you must have
+  a ``client.admin`` user. So you must generate the admin user and keyring,
+  and you must also add the ``client.admin`` user to the monitor keyring.
+
+The foregoing requirements do not imply the creation of a Ceph Configuration 
+file. However, as a best practice, we recommend creating a Ceph configuration 
+file and populating it with the ``fsid``, the ``mon initial members`` and the
+``mon host`` settings.
+
+You can get and set all of the monitor settings at runtime as well. However,
+a Ceph Configuration file may contain only those settings that override the 
+default values. When you add settings to a Ceph configuration file, these
+settings override the default settings. Maintaining those settings in a 
+Ceph configuration file makes it easier to maintain your cluster.
+
+The procedure is as follows:
+
+
+#. Log in to the initial monitor node(s)::
+
+	ssh {hostname}
+
+   For example:: 
+
+	ssh node1
+
+
+#. Ensure you have a directory for the Ceph configuration file. By default, 
+   Ceph uses ``/etc/ceph``. When you install ``ceph``, the installer will 
+   create the ``/etc/ceph`` directory automatically. ::
+
+	ls /etc/ceph   
+
+   **Note:** Deployment tools may remove this directory when purging a
+   cluster (e.g., ``ceph-deploy purgedata {node-name}``, ``ceph-deploy purge
+   {node-name}``).
+
+#. Create a Ceph configuration file. By default, Ceph uses 
+   ``ceph.conf``, where ``ceph`` reflects the cluster name. ::
+
+	sudo vim /etc/ceph/ceph.conf
+
+
+#. Generate a unique ID (i.e., ``fsid``) for your cluster. :: 
+
+	uuidgen
+	
+
+#. Add the unique ID to your Ceph configuration file. :: 
+
+	fsid = {UUID}
+
+   For example:: 
+
+	fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
+
+
+#. Add the initial monitor(s) to your Ceph configuration file. :: 
+
+	mon initial members = {hostname}[,{hostname}]
+
+   For example:: 
+
+	mon initial members = node1
+
+
+#. Add the IP address(es) of the initial monitor(s) to your Ceph configuration 
+   file and save the file. :: 
+
+	mon host = {ip-address}[,{ip-address}]
+
+   For example::
+
+	mon host = 192.168.0.1
+
+   **Note:** You may use IPv6 addresses too, but you must set ``ms bind ipv6`` 
+   to ``true``. See `Network Configuration Reference`_ for details about 
+   network configuration.
+
+#. Create a keyring for your cluster and generate a monitor secret key. ::
+
+	ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
+
+
+#. Generate an administrator keyring, generate a ``client.admin`` user and add
+   the user to the keyring. :: 
+
+	ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key -n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'
+
+
+#. Add the ``client.admin`` key to the ``ceph.mon.keyring``. :: 
+
+	ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
+
+
+#. Generate a monitor map using the hostname(s), host IP address(es) and the FSID. 
+   Save it as ``/tmp/monmap``:: 
+
+	monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap
+
+   For example::
+
+	monmaptool --create --add node1 192.168.0.1 --fsid a7f64266-0894-4f1e-a635-d0aeaca0e993 /tmp/monmap
+
+
+#. Create a default data directory (or directories) on the monitor host(s). ::
+
+	sudo mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}
+
+   For example::
+
+	sudo mkdir /var/lib/ceph/mon/ceph-node1
+
+   See `Monitor Config Reference - Data`_ for details.
+
+#. Populate the monitor daemon(s) with the monitor map and keyring. ::
+
+	ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
+
+   For example::
+
+	ceph-mon --mkfs -i node1 --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
+
+
+#. Consider settings for a Ceph configuration file. Common settings include 
+   the following::
+
+	[global]
+	fsid = {cluster-id}
+	mon initial members = {hostname}[, {hostname}]
+	mon host = {ip-address}[, {ip-address}]
+	public network = {network}[, {network}]
+	cluster network = {network}[, {network}]
+	auth cluster required = cephx
+	auth service required = cephx
+	auth client required = cephx
+	osd journal size = {n}
+	osd pool default size = {n}  # Write an object n times.
+	osd pool default min size = {n} # Allow writing n copy in a degraded state.
+	osd pool default pg num = {n}
+	osd pool default pgp num = {n}	
+	osd crush chooseleaf type = {n}
+
+   In the foregoing example, the ``[global]`` section of the configuration might
+   look like this::
+
+	[global]
+	fsid = a7f64266-0894-4f1e-a635-d0aeaca0e993
+	mon initial members = node1
+	mon host = 192.168.0.1
+	public network = 192.168.0.0/24
+	auth cluster required = cephx
+	auth service required = cephx
+	auth client required = cephx
+	osd journal size = 1024
+	osd pool default size = 2
+	osd pool default min size = 1
+	osd pool default pg num = 333
+	osd pool default pgp num = 333	
+	osd crush chooseleaf type = 1
+
+#. Touch the ``done`` file.
+
+   Mark that the monitor is created and ready to be started::
+
+	sudo touch /var/lib/ceph/mon/ceph-node1/done
+
+#. Start the monitor(s).
+
+   For Ubuntu, use Upstart::
+
+	sudo start ceph-mon id=node1 [cluster={cluster-name}]
+
+   In this case, to allow the start of the daemon at each reboot you
+   must create two empty files like this::
+
+	sudo touch /var/lib/ceph/mon/{cluster-name}-{hostname}/upstart
+
+   For example::
+
+	sudo touch /var/lib/ceph/mon/ceph-node1/upstart
+
+   For Debian/CentOS/RHEL, use sysvinit::
+
+	sudo /etc/init.d/ceph start mon.node1
+
+
+#. Verify that Ceph created the default pools. ::
+
+	ceph osd lspools
+
+   You should see output like this::
+
+	0 data,1 metadata,2 rbd,
+
+
+#. Verify that the monitor is running. :: 
+
+	ceph -s
+
+   You should see output that the monitor you started is up and running, and
+   you should see a health error indicating that placement groups are stuck
+   inactive. It should look something like this:: 
+
+	cluster a7f64266-0894-4f1e-a635-d0aeaca0e993
+	  health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck unclean; no osds
+	  monmap e1: 1 mons at {node1=192.168.0.1:6789/0}, election epoch 1, quorum 0 node1
+	  osdmap e1: 0 osds: 0 up, 0 in
+	  pgmap v2: 192 pgs, 3 pools, 0 bytes data, 0 objects
+	     0 kB used, 0 kB / 0 kB avail
+	     192 creating
+
+   **Note:** Once you add OSDs and start them, the placement group health errors
+   should disappear. See the next section for details.
+
+
+Adding OSDs
+===========
+
+Once you have your initial monitor(s) running, you should add OSDs. Your cluster
+cannot reach an ``active + clean`` state until you have enough OSDs to handle the
+number of copies of an object (e.g., ``osd pool default size = 2`` requires at
+least two OSDs). After bootstrapping your monitor, your cluster has a default
+CRUSH map; however, the CRUSH map doesn't have any Ceph OSD Daemons mapped to 
+a Ceph Node.
+
+
+Short Form
+----------
+
+Ceph provides the ``ceph-disk`` utility, which can prepare a disk, partition or
+directory for use with Ceph. The ``ceph-disk`` utility creates the OSD ID by
+incrementing the index. Additionally, ``ceph-disk`` will add the new OSD to the
+CRUSH map under the host for you. Execute ``ceph-disk -h`` for CLI details. 
+The ``ceph-disk`` utility automates the steps of the `Long Form`_ below. To
+create the first two OSDs with the short form procedure, execute the following
+on  ``node2`` and ``node3``:
+
+
+#. Prepare the OSD. ::
+
+	ssh {node-name}
+	sudo ceph-disk prepare --cluster {cluster-name} --cluster-uuid {uuid} --fs-type {ext4|xfs|btrfs} {data-path} [{journal-path}]
+
+   For example::
+
+	ssh node1
+	sudo ceph-disk prepare --cluster ceph --cluster-uuid a7f64266-0894-4f1e-a635-d0aeaca0e993 --fs-type ext4 /dev/hdd1
+
+
+#. Activate the OSD::
+
+	sudo ceph-disk activate {data-path} [--activate-key {path}]
+
+   For example:: 
+
+	sudo ceph-disk activate /dev/hdd1
+
+   **Note:** Use the ``--activate-key`` argument if you do not have a copy
+   of ``/var/lib/ceph/bootstrap-osd/{cluster}.keyring`` on the Ceph Node.
+
+
+Long Form
+---------
+
+Without the benefit of any helper utilities, creating an OSD and adding it to
+the cluster and CRUSH map the following procedure. To create the first two 
+OSDs with the long form procedure, execute the following on ``node2`` and 
+``node3``:
+
+#. Connect to the OSD host. :: 
+
+	ssh {node-name}
+
+#. Generate a UUID for the OSD. ::
+
+	uuidgen
+
+
+#. Create the OSD. If no UUID is given, it will be set automatically when the 
+   OSD starts up. The following command will output the OSD number, which you 
+   will need for subsequent steps. ::
+	
+	ceph osd create [{uuid} [{id}]]
+
+
+#. Create the default directory on your new OSD. :: 
+
+	ssh {new-osd-host}
+	sudo mkdir /var/lib/ceph/osd/{cluster-name}-{osd-number}
+	
+
+#. If the OSD is for a drive other than the OS drive, prepare it 
+   for use with Ceph, and mount it to the directory you just created:: 
+
+	ssh {new-osd-host}
+	sudo mkfs -t {fstype} /dev/{hdd}
+	sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/{cluster-name}-{osd-number}
+
+	
+#. Initialize the OSD data directory. :: 
+
+	ssh {new-osd-host}
+	sudo ceph-osd -i {osd-num} --mkfs --mkkey --osd-uuid [{uuid}]
+	
+   The directory must be empty before you can run ``ceph-osd`` with the 
+   ``--mkkey`` option. In addition, the ceph-osd tool requires specification
+   of custom cluster names with the ``--cluster`` option.
+
+
+#. Register the OSD authentication key. The value of ``ceph`` for 
+   ``ceph-{osd-num}`` in the path is the ``$cluster-$id``.  If your 
+   cluster name differs from ``ceph``, use your cluster name instead.::
+
+	sudo ceph auth add osd.{osd-num} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/{cluster-name}-{osd-num}/keyring
+
+
+#. Add your Ceph Node to the CRUSH map. ::
+
+	ceph [--cluster {cluster-name}] osd crush add-bucket {hostname} host
+
+   For example::
+
+	ceph osd crush add-bucket node1 host
+
+
+#. Place the Ceph Node under the root ``default``. ::
+
+	ceph osd crush move node1 root=default
+
+
+#. Add the OSD to the CRUSH map so that it can begin receiving data. You may
+   also decompile the CRUSH map, add the OSD to the device list, add the host as a
+   bucket (if it's not already in the CRUSH map), add the device as an item in the
+   host, assign it a weight, recompile it and set it. ::
+
+	ceph [--cluster {cluster-name}] osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]
+
+   For example::
+
+	ceph osd crush add osd.0 1.0 host=node1
+
+
+#. After you add an OSD to Ceph, the OSD is in your configuration. However, 
+   it is not yet running. The OSD is ``down`` and ``in``. You must start 
+   your new OSD before it can begin receiving data.
+
+   For Ubuntu, use Upstart::
+
+	sudo start ceph-osd id={osd-num} [cluster={cluster-name}]
+
+   For example::
+
+	sudo start ceph-osd id=0
+	sudo start ceph-osd id=1
+
+   For Debian/CentOS/RHEL, use sysvinit::
+
+	sudo /etc/init.d/ceph start osd.{osd-num} [--cluster {cluster-name}]
+
+   For example::
+
+	sudo /etc/init.d/ceph start osd.0
+	sudo /etc/init.d/ceph start osd.1
+
+   In this case, to allow the start of the daemon at each reboot you
+   must create an empty file like this::
+
+	sudo touch /var/lib/ceph/osd/{cluster-name}-{osd-num}/sysvinit
+
+   For example::
+
+	sudo touch /var/lib/ceph/osd/ceph-0/sysvinit
+	sudo touch /var/lib/ceph/osd/ceph-1/sysvinit
+
+   Once you start your OSD, it is ``up`` and ``in``.
+
+
+
+
+Summary
+=======
+
+Once you have your monitor and two OSDs up and running, you can watch the
+placement groups peer by executing the following:: 
+
+	ceph -w
+
+To view the tree, execute the following:: 
+
+	ceph osd tree
+	
+You should see output that looks something like this:: 
+
+	# id	weight	type name	up/down	reweight
+	-1	2	root default
+	-2	2		host node1
+	0	1			osd.0	up	1
+	-3	1		host node2
+	1	1			osd.1	up	1	
+
+To add (or remove) additional monitors, see `Add/Remove Monitors`_. 
+To add (or remove) additional Ceph OSD Daemons, see `Add/Remove OSDs`_.
+
+
+.. _federated architecture: ../../radosgw/federated-config
+.. _Installation (Quick): ../../start
+.. _Add/Remove Monitors: ../../rados/operations/add-or-rm-mons
+.. _Add/Remove OSDs: ../../rados/operations/add-or-rm-osds
+.. _Network Configuration Reference: ../../rados/configuration/network-config-ref
+.. _Monitor Config Reference - Data: ../../rados/configuration/mon-config-ref#data
diff --git a/doc/install/mirrors.rst b/doc/install/mirrors.rst
new file mode 100644
index 0000000..23f5fe5
--- /dev/null
+++ b/doc/install/mirrors.rst
@@ -0,0 +1,65 @@
+=============
+ Ceph Mirrors
+=============
+
+For improved user experience multiple mirrors for Ceph are available around the
+world.
+
+These mirrors are kindly sponsored by various companies who want to support the
+Ceph project.
+
+
+Locations
+=========
+
+These mirrors are available on the following locations:
+
+- **EU: Netherlands**: http://eu.ceph.com/
+- **AU: Australia**: http://au.ceph.com/
+- **CZ: Czech Republic**: http://cz.ceph.com/
+- **SE: Sweden**: http://se.ceph.com/
+- **DE: Germany**: http://de.ceph.com/
+- **HK: Hong Kong**: http://hk.ceph.com/
+- **FR: France**: http://fr.ceph.com/
+- **US-East: US East Coast**: http://us-east.ceph.com/
+- **US-West: US West Coast**: http://us-west.ceph.com/
+
+You can replace all download.ceph.com URLs with any of the mirrors, for example:
+
+  http://download.ceph.com/tarballs/
+  http://download.ceph.com/debian-hammer/
+  http://download.ceph.com/rpm-hammer/
+
+Change this to:
+
+  http://eu.ceph.com/tarballs/
+  http://eu.ceph.com/debian-hammer/
+  http://eu.ceph.com/rpm-hammer/
+
+
+Mirroring
+=========
+
+You can easily mirror Ceph yourself using a Bash script and rsync. A easy to use
+script can be found at `Github`_.
+
+When mirroring Ceph, please keep the following guidelines in mind:
+
+- Choose a mirror close to you
+- Do not sync in a interval shorter than 3 hours
+- Avoid syncing at minute 0 of the hour, use something between 0 and 59
+
+
+Becoming a mirror
+=================
+
+If you want to provide a public mirror for other users of Ceph you can opt to
+become a official mirror.
+
+To make sure all mirrors meet the same standards some requirements have been
+set for all mirrors. These can be found on `Github`_.
+
+If you want to apply for an official mirror, please contact the ceph-users mailinglist.
+
+
+.. _Github: https://github.com/ceph/ceph/tree/master/mirroring
diff --git a/doc/install/upgrading-ceph.rst b/doc/install/upgrading-ceph.rst
new file mode 100644
index 0000000..3ff63e2
--- /dev/null
+++ b/doc/install/upgrading-ceph.rst
@@ -0,0 +1,751 @@
+================
+ Upgrading Ceph
+================
+
+Each release of Ceph may have additional steps. Refer to the release-specific
+sections in this document and the `release notes`_ document to identify
+release-specific procedures for your cluster before using the upgrade
+procedures.
+
+
+Summary
+=======
+
+You can upgrade daemons in your Ceph cluster while the cluster is online and in
+service! Certain types of daemons depend upon others. For example, Ceph Metadata
+Servers and Ceph Object Gateways depend upon Ceph Monitors and Ceph OSD Daemons.
+We recommend upgrading in this order:
+
+#. `Ceph Deploy`_
+#. Ceph Monitors
+#. Ceph OSD Daemons
+#. Ceph Metadata Servers
+#. Ceph Object Gateways
+
+As a general rule, we recommend upgrading all the daemons of a specific type
+(e.g., all ``ceph-mon`` daemons, all ``ceph-osd`` daemons, etc.) to ensure that
+they are all on the same release. We also recommend that you upgrade all the
+daemons in your cluster before you try to exercise new functionality in a
+release.
+
+The `Upgrade Procedures`_ are relatively simple, but please look at 
+distribution-specific sections before upgrading. The basic process involves 
+three steps: 
+
+#. Use ``ceph-deploy`` on your admin node to upgrade the packages for 
+   multiple hosts (using the ``ceph-deploy install`` command), or login to each 
+   host and upgrade the Ceph package `manually`_. For example, when 
+   `Upgrading Monitors`_, the ``ceph-deploy`` syntax might look like this::
+   
+	ceph-deploy install --release {release-name} ceph-node1[ ceph-node2]
+	ceph-deploy install --release firefly mon1 mon2 mon3
+
+   **Note:** The ``ceph-deploy install`` command will upgrade the packages 
+   in the specified node(s) from the old release to the release you specify. 
+   There is no ``ceph-deploy upgrade`` command.
+
+#. Login in to each Ceph node and restart each Ceph daemon.
+   See `Operating a Cluster`_ for details.
+
+#. Ensure your cluster is healthy. See `Monitoring a Cluster`_ for details.
+
+.. important:: Once you upgrade a daemon, you cannot downgrade it.
+
+
+Ceph Deploy
+===========
+
+Before upgrading Ceph daemons, upgrade the ``ceph-deploy`` tool. ::
+
+	sudo pip install -U ceph-deploy
+
+Or::
+
+	sudo apt-get install ceph-deploy
+	
+Or::
+
+	sudo yum install ceph-deploy python-pushy
+
+
+Argonaut to Bobtail
+===================
+
+When upgrading from Argonaut to Bobtail, you need to be aware of several things:
+
+#. Authentication now defaults to **ON**, but used to default to **OFF**.
+#. Monitors use a new internal on-wire protocol.
+#. RBD ``format2`` images require upgrading all OSDs before using it.
+
+Ensure that you update package repository paths. For example:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-bobtail/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+See the following sections for additional details.
+
+Authentication
+--------------
+
+The Ceph Bobtail release enables authentication by default. Bobtail also has
+finer-grained authentication configuration settings. In previous versions of
+Ceph (i.e., actually v 0.55 and earlier), you could simply specify:: 
+
+	auth supported = [cephx | none]
+
+This option still works, but is deprecated.  New releases support
+``cluster``, ``service`` and ``client`` authentication settings as
+follows::
+
+	auth cluster required = [cephx | none]  # default cephx
+	auth service required = [cephx | none] # default cephx
+	auth client required = [cephx | none] # default cephx,none
+
+.. important:: If your cluster does not currently have an ``auth
+   supported`` line that enables authentication, you must explicitly
+   turn it off in Bobtail using the settings below.::
+
+	auth cluster required = none
+	auth service required = none
+
+   This will disable authentication on the cluster, but still leave
+   clients with the default configuration where they can talk to a
+   cluster that does enable it, but do not require it.
+
+.. important:: If your cluster already has an ``auth supported`` option defined in
+   the configuration file, no changes are necessary.
+
+See `Ceph Authentication - Backward Compatibility`_ for details.
+
+
+Monitor On-wire Protocol
+------------------------
+
+We recommend upgrading all monitors to Bobtail. A mixture of Bobtail and
+Argonaut monitors will not be able to use the new on-wire protocol, as the
+protocol requires all monitors to be Bobtail or greater. Upgrading  only a
+majority of the nodes (e.g., two out of three) may expose the cluster to a
+situation where a single additional failure may compromise availability (because
+the non-upgraded daemon cannot participate in the new protocol).  We recommend
+not waiting for an extended period of time between ``ceph-mon`` upgrades.
+
+
+RBD Images
+----------
+
+The Bobtail release supports ``format 2`` images! However, you should not create
+or use ``format 2`` RBD images until after all ``ceph-osd`` daemons have been
+upgraded.  Note that ``format 1`` is still the default. You can use the new
+``ceph osd ls`` and ``ceph tell osd.N version`` commands to doublecheck your
+cluster. ``ceph osd ls`` will give a list of all OSD IDs that are part of the
+cluster, and you can use that to write a simple shell loop to display all the
+OSD version strings: ::
+
+      for i in $(ceph osd ls); do
+          ceph tell osd.${i} version
+      done
+
+
+Argonaut to Cuttlefish
+======================
+
+To upgrade your cluster from Argonaut to Cuttlefish, please read this
+section, and the sections on upgrading from Argonaut to Bobtail and
+upgrading from Bobtail to Cuttlefish carefully. When upgrading from
+Argonaut to Cuttlefish, **YOU MUST UPGRADE YOUR MONITORS FROM ARGONAUT
+TO BOBTAIL v0.56.5 FIRST!!!**. All other Ceph daemons can upgrade from
+Argonaut to Cuttlefish without the intermediate upgrade to Bobtail.
+
+.. important:: Ensure that the repository specified points to Bobtail, not
+   Cuttlefish.
+
+For example:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-bobtail/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+We recommend upgrading all monitors to Bobtail before proceeding with the
+upgrade of the monitors to Cuttlefish. A mixture of Bobtail and Argonaut
+monitors will not be able to use the new on-wire protocol, as the protocol
+requires all monitors to be Bobtail or greater. Upgrading only a majority of the
+nodes (e.g., two out of three) may expose the cluster to a situation where a
+single additional failure may compromise availability (because the non-upgraded
+daemon cannot participate in the new protocol).  We recommend not waiting for an
+extended period of time between ``ceph-mon`` upgrades. See `Upgrading 
+Monitors`_ for details.
+
+.. note:: See the `Authentication`_ section and the 
+   `Ceph Authentication - Backward Compatibility`_ for additional information
+   on authentication backward compatibility settings for Bobtail.
+
+Once you complete the upgrade of your monitors from Argonaut to
+Bobtail, and have restarted the monitor daemons, you must upgrade the
+monitors from Bobtail to Cuttlefish. Ensure that you have a quorum
+before beginning this upgrade procedure. Before upgrading, remember to
+replace the reference to the Bobtail repository with a reference to
+the Cuttlefish repository. For example::
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-cuttlefish/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+See `Upgrading Monitors`_ for details.
+
+The architecture of the monitors changed significantly from Argonaut to
+Cuttlefish. See `Monitor Config Reference`_ and `Joao's blog post`_ for details.
+Once you complete the monitor upgrade, you can upgrade the OSD daemons and the
+MDS daemons using the generic procedures. See `Upgrading an OSD`_ and `Upgrading
+a Metadata Server`_ for details.
+
+
+Bobtail to Cuttlefish
+=====================
+
+Upgrading your cluster from Bobtail to Cuttlefish has a few important
+considerations. First, the monitor uses a new architecture, so you should
+upgrade the full set of monitors to use Cuttlefish. Second, if you run multiple
+metadata servers in a cluster, ensure the metadata servers have unique names.
+See the following sections for details.
+
+Replace any ``apt`` reference to older repositories with a reference to the
+Cuttlefish repository. For example:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-cuttlefish/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+
+Monitor
+-------
+
+The architecture of the monitors changed significantly from Bobtail to
+Cuttlefish. See `Monitor Config Reference`_ and `Joao's blog post`_ for 
+details. This means that v0.59 and pre-v0.59 monitors do not talk to each other
+(Cuttlefish is v.0.61). When you upgrade each monitor, it will convert its 
+local data store to the new format. Once you upgrade a majority of monitors, 
+the monitors form a quorum using the new protocol and the old monitors will be
+blocked until they get upgraded. For this reason, we recommend upgrading the
+monitors in immediate succession. 
+
+.. important:: Do not run a mixed-version cluster for an extended period.
+
+
+MDS Unique Names
+----------------
+
+The monitor now enforces that MDS names be unique. If you have multiple metadata
+server daemons that start with the same ID (e.g., mds.a) the second
+metadata server will implicitly mark the first metadata server as ``failed``.
+Multi-MDS configurations with identical names must be adjusted accordingly to
+give daemons unique names. If you run your cluster with one  metadata server,
+you can disregard this notice for now.
+
+
+ceph-deploy
+-----------
+
+The ``ceph-deploy`` tool is now the preferred method of provisioning new clusters.
+For existing clusters created via the obsolete ``mkcephfs`` tool that would like to transition to the
+new tool, there is a migration path, documented at `Transitioning to ceph-deploy`_.
+
+Cuttlefish to Dumpling
+======================
+
+When upgrading from Cuttlefish (v0.61-v0.61.7) you may perform a rolling
+upgrade. However, there are a few important considerations. First, you must
+upgrade the ``ceph`` command line utility, because it has changed significantly.
+Second, you must upgrade the full set of monitors to use Dumpling, because of a
+protocol change.
+
+Replace any reference to older repositories with a reference to the
+Dumpling repository. For example, with ``apt`` perform the following:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-dumpling/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+With CentOS/Red Hat distributions, remove the old repository. :: 
+
+	sudo rm /etc/yum.repos.d/ceph.repo
+
+Then add a new ``ceph.repo`` repository entry with the following contents. 
+
+.. code-block:: ini
+
+	[ceph]
+	name=Ceph Packages and Backports $basearch
+	baseurl=http://download.ceph.com/rpm/el6/$basearch
+	enabled=1
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+.. note:: Ensure you use the correct URL for your distribution. Check the
+   http://download.ceph.com/rpm directory for your distribution. 
+
+.. note:: Since you can upgrade using ``ceph-deploy`` you will only need to add
+   the repository on Ceph Client nodes where you use the ``ceph`` command line 
+   interface or the ``ceph-deploy`` tool.
+
+
+Dumpling to Emperor
+===================
+
+When upgrading from Dumpling (v0.64) you may perform a rolling
+upgrade.
+
+Replace any reference to older repositories with a reference to the
+Emperor repository. For example, with ``apt`` perform the following:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-emperor/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+With CentOS/Red Hat distributions, remove the old repository. :: 
+
+	sudo rm /etc/yum.repos.d/ceph.repo
+
+Then add a new ``ceph.repo`` repository entry with the following contents and
+replace ``{distro}`` with your distribution (e.g., ``el6``, ``rhel6``, etc). 
+
+.. code-block:: ini
+
+	[ceph]
+	name=Ceph Packages and Backports $basearch
+	baseurl=http://download.ceph.com/rpm-emperor/{distro}/$basearch
+	enabled=1
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+.. note:: Ensure you use the correct URL for your distribution. Check the
+   http://download.ceph.com/rpm directory for your distribution. 
+
+.. note:: Since you can upgrade using ``ceph-deploy`` you will only need to add
+   the repository on Ceph Client nodes where you use the ``ceph`` command line 
+   interface or the ``ceph-deploy`` tool.
+
+
+Command Line Utility
+--------------------
+
+In V0.65, the ``ceph`` commandline interface (CLI) utility changed
+significantly. You will not be able to use the old CLI with Dumpling. This means
+that you must upgrade the  ``ceph-common`` library on all nodes that access the
+Ceph Storage Cluster with the ``ceph`` CLI before upgrading Ceph daemons. ::
+
+	sudo apt-get update && sudo apt-get install ceph-common
+	
+Ensure that you have the latest version (v0.67 or later). If you do not, 
+you may need to uninstall, auto remove dependencies and reinstall.
+
+See `v0.65`_ for details on the new command line interface.
+
+.. _v0.65: http://ceph.com/docs/master/release-notes/#v0-65
+
+
+Monitor
+-------
+
+Dumpling (v0.67) ``ceph-mon`` daemons have an internal protocol change. This
+means that v0.67 daemons cannot talk to v0.66 or older daemons.  Once you
+upgrade a majority of monitors,  the monitors form a quorum using the new
+protocol and the old monitors will be blocked until they get upgraded. For this
+reason, we recommend upgrading all monitors at once (or in relatively quick
+succession) to minimize the possibility of downtime.
+
+.. important:: Do not run a mixed-version cluster for an extended period.
+
+
+
+Dumpling to Firefly
+===================
+
+If your existing cluster is running a version older than v0.67 Dumpling, please
+first upgrade to the latest Dumpling release before upgrading to v0.80 Firefly.
+
+
+Monitor
+-------
+
+Dumpling (v0.67) ``ceph-mon`` daemons have an internal protocol change. This
+means that v0.67 daemons cannot talk to v0.66 or older daemons.  Once you
+upgrade a majority of monitors,  the monitors form a quorum using the new
+protocol and the old monitors will be blocked until they get upgraded. For this
+reason, we recommend upgrading all monitors at once (or in relatively quick
+succession) to minimize the possibility of downtime.
+
+.. important:: Do not run a mixed-version cluster for an extended period.
+
+
+Ceph Config File Changes
+------------------------
+
+We recommand adding the following to the ``[mon]`` section of your 
+``ceph.conf`` prior to upgrade::
+
+    mon warn on legacy crush tunables = false
+
+This will prevent health warnings due to the use of legacy CRUSH placement.
+Although it is possible to rebalance existing data across your cluster, we do
+not normally recommend it for production environments as a large amount of data
+will move and there is a significant performance impact from the rebalancing.
+
+
+Command Line Utility
+--------------------
+
+In V0.65, the ``ceph`` commandline interface (CLI) utility changed
+significantly. You will not be able to use the old CLI with Firefly. This means
+that you must upgrade the  ``ceph-common`` library on all nodes that access the
+Ceph Storage Cluster with the ``ceph`` CLI before upgrading Ceph daemons. 
+
+For Debian/Ubuntu, execute::
+
+	sudo apt-get update && sudo apt-get install ceph-common
+
+For CentOS/RHEL, execute:: 
+	
+	sudo yum install ceph-common	
+	
+Ensure that you have the latest version. If you do not, 
+you may need to uninstall, auto remove dependencies and reinstall.
+
+See `v0.65`_ for details on the new command line interface.
+
+.. _v0.65: http://ceph.com/docs/master/release-notes/#v0-65
+
+
+Upgrade Sequence
+----------------
+
+Replace any reference to older repositories with a reference to the
+Firely repository. For example, with ``apt`` perform the following:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-firefly/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+With CentOS/Red Hat distributions, remove the old repository. :: 
+
+	sudo rm /etc/yum.repos.d/ceph.repo
+
+Then add a new ``ceph.repo`` repository entry with the following contents and
+replace ``{distro}`` with your distribution (e.g., ``el6``, ``rhel6``, 
+``rhel7``, etc.). 
+
+.. code-block:: ini
+
+	[ceph]
+	name=Ceph Packages and Backports $basearch
+	baseurl=http://download.ceph.com/rpm-firefly/{distro}/$basearch
+	enabled=1
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+Upgrade daemons in the following order:
+
+#. **Monitors:** If the ``ceph-mon`` daemons are not restarted prior to the 
+   ``ceph-osd`` daemons, the monitors will not correctly register their new 
+   capabilities with the cluster and new features may not be usable until 
+   the monitors are restarted a second time.
+
+#. **OSDs**
+
+#. **MDSs:** If the ``ceph-mds`` daemon is restarted first, it will wait until 
+   all OSDs have been upgraded before finishing its startup sequence.  
+
+#. **Gateways:** Upgrade ``radosgw`` daemons together. There is a subtle change 
+   in behavior for multipart uploads that prevents a multipart request that 
+   was initiated with a new ``radosgw`` from being completed by an old 
+   ``radosgw``.
+   
+.. note:: Make sure you upgrade your **ALL** of your Ceph monitors **AND** 
+   restart them **BEFORE** upgrading and restarting OSDs, MDSs, and gateways!
+   
+
+Emperor to Firefly
+==================
+
+If your existing cluster is running a version older than v0.67 Dumpling, please
+first upgrade to the latest Dumpling release before upgrading to v0.80 Firefly.
+Please refer to `Cuttlefish to Dumpling`_ and the `Firefly release notes`_ for
+details. To upgrade from a post-Emperor point release, see the `Firefly release 
+notes`_ for details.
+
+
+Ceph Config File Changes
+------------------------
+
+We recommand adding the following to the ``[mon]`` section of your 
+``ceph.conf`` prior to upgrade::
+
+    mon warn on legacy crush tunables = false
+
+This will prevent health warnings due to the use of legacy CRUSH placement.
+Although it is possible to rebalance existing data across your cluster, we do
+not normally recommend it for production environments as a large amount of data
+will move and there is a significant performance impact from the rebalancing.
+
+
+Upgrade Sequence
+----------------
+
+Replace any reference to older repositories with a reference to the
+Firefly repository. For example, with ``apt`` perform the following:: 
+
+	sudo rm /etc/apt/sources.list.d/ceph.list
+	echo deb http://download.ceph.com/debian-firefly/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+With CentOS/Red Hat distributions, remove the old repository. :: 
+
+	sudo rm /etc/yum.repos.d/ceph.repo
+
+Then add a new ``ceph.repo`` repository entry with the following contents, but
+replace ``{distro}`` with your distribution (e.g., ``el6``, ``rhel6``,
+``rhel7``, etc.). 
+
+.. code-block:: ini
+
+	[ceph]
+	name=Ceph Packages and Backports $basearch
+	baseurl=http://download.ceph.com/rpm/{distro}/$basearch
+	enabled=1
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+.. note:: Ensure you use the correct URL for your distribution. Check the
+   http://download.ceph.com/rpm directory for your distribution. 
+
+.. note:: Since you can upgrade using ``ceph-deploy`` you will only need to add
+   the repository on Ceph Client nodes where you use the ``ceph`` command line 
+   interface or the ``ceph-deploy`` tool.
+
+
+Upgrade daemons in the following order:
+
+#. **Monitors:** If the ``ceph-mon`` daemons are not restarted prior to the 
+   ``ceph-osd`` daemons, the monitors will not correctly register their new 
+   capabilities with the cluster and new features may not be usable until 
+   the monitors are restarted a second time.
+
+#. **OSDs**
+
+#. **MDSs:** If the ``ceph-mds`` daemon is restarted first, it will wait until 
+   all OSDs have been upgraded before finishing its startup sequence.  
+
+#. **Gateways:** Upgrade ``radosgw`` daemons together. There is a subtle change 
+   in behavior for multipart uploads that prevents a multipart request that 
+   was initiated with a new ``radosgw`` from being completed by an old 
+   ``radosgw``.
+
+
+Upgrade Procedures
+==================
+
+The following sections describe the upgrade process. 
+
+.. important:: Each release of Ceph may have some additional steps. Refer to
+   release-specific sections for details **BEFORE** you begin upgrading daemons.
+
+
+Upgrading Monitors
+------------------
+
+To upgrade monitors, perform the following steps:
+
+#. Upgrade the Ceph package for each daemon instance. 
+
+   You may use ``ceph-deploy`` to address all monitor nodes at once. 
+   For example::
+
+	ceph-deploy install --release {release-name} ceph-node1[ ceph-node2]
+	ceph-deploy install --release hammer mon1 mon2 mon3
+
+   You may also use the package manager for your Linux distribution on 
+   each individual node. To upgrade packages manually on each Debian/Ubuntu 
+   host, perform the following steps . :: 
+
+	ssh {mon-host}
+	sudo apt-get update && sudo apt-get install ceph
+
+   On CentOS/Red Hat hosts, perform the following steps::
+
+	ssh {mon-host}
+	sudo yum update && sudo yum install ceph
+	
+ 
+#. Restart each monitor. For Ubuntu distributions, use:: 
+
+	sudo restart ceph-mon id={hostname}
+
+   For CentOS/Red Hat/Debian distributions, use::
+
+	sudo /etc/init.d/ceph restart {mon-id}
+
+   For CentOS/Red Hat distributions deployed with ``ceph-deploy``, 
+   the monitor ID is usually ``mon.{hostname}``.
+   
+#. Ensure each monitor has rejoined the quorum. ::
+
+	ceph mon stat
+
+Ensure that you have completed the upgrade cycle for all of your Ceph Monitors.
+
+
+Upgrading an OSD
+----------------
+
+To upgrade a Ceph OSD Daemon, perform the following steps:
+
+#. Upgrade the Ceph OSD Daemon package. 
+
+   You may use ``ceph-deploy`` to address all Ceph OSD Daemon nodes at 
+   once. For example::
+
+	ceph-deploy install --release {release-name} ceph-node1[ ceph-node2]
+	ceph-deploy install --release hammer osd1 osd2 osd3
+
+   You may also use the package manager on each node to upgrade packages 
+   manually. For Debian/Ubuntu hosts, perform the following steps on each
+   host. :: 
+
+	ssh {osd-host}
+	sudo apt-get update && sudo apt-get install ceph
+
+   For CentOS/Red Hat hosts, perform the following steps::
+
+	ssh {osd-host}
+	sudo yum update && sudo yum install ceph
+
+
+#. Restart the OSD, where ``N`` is the OSD number. For Ubuntu, use:: 
+
+	sudo restart ceph-osd id=N
+
+   For multiple OSDs on a host, you may restart all of them with Upstart. ::
+
+	sudo restart ceph-osd-all
+	
+   For CentOS/Red Hat/Debian distributions, use::
+
+	sudo /etc/init.d/ceph restart N	
+
+
+#. Ensure each upgraded Ceph OSD Daemon has rejoined the cluster::
+
+	ceph osd stat
+
+Ensure that you have completed the upgrade cycle for all of your 
+Ceph OSD Daemons.
+
+
+Upgrading a Metadata Server
+---------------------------
+
+To upgrade a Ceph Metadata Server, perform the following steps:
+
+#. Upgrade the Ceph Metadata Server package. You may use ``ceph-deploy`` to 
+   address all Ceph Metadata Server nodes at once, or use the package manager 
+   on each node. For example::
+
+	ceph-deploy install --release {release-name} ceph-node1
+	ceph-deploy install --release hammer mds1
+
+   To upgrade packages manually, perform the following steps on each
+   Debian/Ubuntu host. :: 
+
+	ssh {mon-host}
+	sudo apt-get update && sudo apt-get install ceph-mds
+
+   Or the following steps on CentOS/Red Hat hosts::
+
+	ssh {mon-host}
+	sudo yum update && sudo yum install ceph-mds
+
+ 
+#. Restart the metadata server. For Ubuntu, use:: 
+
+	sudo restart ceph-mds id={hostname}
+	
+   For CentOS/Red Hat/Debian distributions, use::
+
+	sudo /etc/init.d/ceph restart mds.{hostname}
+
+   For clusters deployed with ``ceph-deploy``, the name is usually either
+   the name you specified on creation or the hostname.
+
+#. Ensure the metadata server is up and running::
+
+	ceph mds stat
+
+
+Upgrading a Client
+------------------
+
+Once you have upgraded the packages and restarted daemons on your Ceph
+cluster, we recommend upgrading ``ceph-common`` and client libraries
+(``librbd1`` and ``librados2``) on your client nodes too.
+
+#. Upgrade the package:: 
+
+	ssh {client-host}
+	apt-get update && sudo apt-get install ceph-common librados2 librbd1 python-rados python-rbd
+
+#. Ensure that you have the latest version::
+
+	ceph --version
+
+If you do not have the latest version, you may need to uninstall, auto remove
+dependencies and reinstall.
+
+
+Transitioning to ceph-deploy
+============================
+
+If you have an existing cluster that you deployed with ``mkcephfs`` (usually
+Argonaut or Bobtail releases),  you will need to make a few changes to your
+configuration to  ensure that your cluster will work with ``ceph-deploy``.
+
+
+Monitor Keyring
+---------------
+
+You will need to add ``caps mon = "allow *"`` to your monitor keyring if it is
+not already in the keyring. By default, the monitor keyring is located under
+``/var/lib/ceph/mon/ceph-$id/keyring``. When you have added the ``caps``
+setting, your monitor keyring should look something like this::
+
+	[mon.]
+		key = AQBJIHhRuHCwDRAAZjBTSJcIBIoGpdOR9ToiyQ==
+		caps mon = "allow *" 
+		
+Adding ``caps mon = "allow *"`` will ease the transition from ``mkcephfs`` to
+``ceph-deploy`` by allowing ``ceph-create-keys`` to use the ``mon.`` keyring
+file in ``$mon_data`` and get the caps it needs.
+
+
+Use Default Paths
+-----------------
+
+Under the ``/var/lib/ceph`` directory, the ``mon`` and ``osd`` directories need
+to use the default paths.
+
+- **OSDs**: The path should be ``/var/lib/ceph/osd/ceph-$id``
+- **MON**: The path should be  ``/var/lib/ceph/mon/ceph-$id``
+
+Under those directories, the keyring should be in a file named ``keyring``.
+
+
+
+
+.. _Monitor Config Reference: ../../rados/configuration/mon-config-ref
+.. _Joao's blog post: http://ceph.com/dev-notes/cephs-new-monitor-changes 
+.. _Ceph Authentication: ../../rados/operations/authentication/
+.. _Ceph Authentication - Backward Compatibility: ../../rados/operations/authentication/#backward-compatibility
+.. _manually: ../install-storage-cluster/
+.. _Operating a Cluster: ../../rados/operations/operating
+.. _Monitoring a Cluster: ../../rados/operations/monitoring
+.. _Firefly release notes: ../../release-notes/#v0-80-firefly
+.. _release notes: ../../release-notes
diff --git a/doc/logo.png b/doc/logo.png
new file mode 100644
index 0000000..4cd8c7c
Binary files /dev/null and b/doc/logo.png differ
diff --git a/doc/man/8/mount.ceph.rst b/doc/man/8/mount.ceph.rst
index c257a70..e682789 100644
--- a/doc/man/8/mount.ceph.rst
+++ b/doc/man/8/mount.ceph.rst
@@ -46,12 +46,15 @@ Options
 =======
 
 :command:`wsize`
-  int, max write size. Default: none (writeback uses smaller of wsize
+  int (bytes), max write size. Default: none (writeback uses smaller of wsize
   and stripe unit)
 
 :command:`rsize`
-  int (bytes), max readahead, multiple of 1024, Default: 524288
-  (512*1024)
+  int (bytes), max read size. Default: none
+
+:command:`rasize`
+  int (bytes), max readahead, multiple of 1024, Default: 8388608
+  (8192*1024)
 
 :command:`osdtimeout`
   int (seconds), Default: 60
diff --git a/doc/man/8/radosgw-admin.rst b/doc/man/8/radosgw-admin.rst
index 550e551..717ba7f 100644
--- a/doc/man/8/radosgw-admin.rst
+++ b/doc/man/8/radosgw-admin.rst
@@ -414,6 +414,20 @@ Orphans Search Options
 
 	Number of shards to use for keeping the temporary scan info
 
+.. option:: --orphan-stale-secs
+
+        Number of seconds to wait before declaring an object to be an orphan.
+        Default is 86400 (24 hours).
+
+.. option:: --job-id
+
+        Set the job id (for orphans find)
+
+.. option:: --max-concurrent-ios
+
+        Maximum concurrent ios for orphans find.
+        Default is 32.
+
 
 Examples
 ========
diff --git a/doc/man/8/rbd.rst b/doc/man/8/rbd.rst
index b312d02..cfe3b6e 100644
--- a/doc/man/8/rbd.rst
+++ b/doc/man/8/rbd.rst
@@ -10,7 +10,7 @@ Synopsis
 ========
 
 | **rbd** [ -c *ceph.conf* ] [ -m *monaddr* ] [--cluster *cluster name*]
-  [ -p | --pool *pool* ] [--size *size* ] [ --object-size *B/K/M* ] [ *command* ... ] 
+  [ -p | --pool *pool* ] [ *command* ... ]
 
 
 Description
@@ -65,19 +65,21 @@ Parameters
      support for cloning and is more easily extensible to allow more
      features in the future.
 
-.. option:: --size size-in-M/G/T
+.. option:: -s size-in-M/G/T, --size size-in-M/G/T
 
-   Specifies the size (in M/G/T) of the new rbd image.
+   Specifies the size of the new rbd image or the new size of the existing rbd
+   image in M/G/T.  If no suffix is given, unit M is assumed.
 
-.. option:: --object-size B/K/M
-
-   Specifies the object size in B/K/M, it will be rounded up the nearest power of two.
-   The default object size is 4 MB, smallest is 4K and maximum is 32M.
+.. option:: --object-size size-in-B/K/M
 
+   Specifies the object size in B/K/M.  Object size will be rounded up the
+   nearest power of two; if no suffix is given, unit B is assumed.  The default
+   object size is 4M, smallest is 4K and maximum is 32M.
 
 .. option:: --stripe-unit size-in-B/K/M
 
-   Specifies the stripe unit size in B/K/M.  See striping section (below) for more details.
+   Specifies the stripe unit size in B/K/M.  If no suffix is given, unit B is
+   assumed.  See striping section (below) for more details.
 
 .. option:: --stripe-count num
 
@@ -120,11 +122,12 @@ Parameters
 
    Make json or xml formatted output more human-readable.
 
-.. option:: -o map-options, --options map-options
+.. option:: -o krbd-options, --options krbd-options
 
-   Specifies which options to use when mapping an image.  map-options is
-   a comma-separated string of options (similar to mount(8) mount options).
-   See map options section below for more details.
+   Specifies which options to use when mapping or unmapping an image via the
+   rbd kernel driver.  krbd-options is a comma-separated list of options
+   (similar to mount(8) mount options).  See kernel rbd (krbd) options section
+   below for more details.
 
 .. option:: --read-only
 
@@ -182,11 +185,11 @@ Commands
   If image is a clone, information about its parent is also displayed.
   If a snapshot is specified, whether it is protected is shown as well.
 
-:command:`create` (-s | --size *size-in-M/G/T*) [--image-format *format-id*] [--object-size *B/K/M*] [--stripe-unit *size-in-B/K/M* --stripe-count *num*] [--image-feature *feature-name*]... [--image-shared] *image-spec*
+:command:`create` (-s | --size *size-in-M/G/T*) [--image-format *format-id*] [--object-size *size-in-B/K/M*] [--stripe-unit *size-in-B/K/M* --stripe-count *num*] [--image-feature *feature-name*]... [--image-shared] *image-spec*
   Will create a new rbd image. You must also specify the size via --size.  The
   --stripe-unit and --stripe-count arguments are optional, but must be used together.
 
-:command:`clone` [--object-size *B/K/M*] [--stripe-unit *size-in-B/K/M* --stripe-count *num*] [--image-feature *feature-name*] [--image-shared] *parent-snap-spec* *child-image-spec*
+:command:`clone` [--object-size *size-in-B/K/M*] [--stripe-unit *size-in-B/K/M* --stripe-count *num*] [--image-feature *feature-name*] [--image-shared] *parent-snap-spec* *child-image-spec*
   Will create a clone (copy-on-write child) of the parent snapshot.
   Object size will be identical to that of the parent image unless
   specified. Size will be the same as the parent snapshot. The --stripe-unit
@@ -220,7 +223,7 @@ Commands
 :command:`export` (*image-spec* | *snap-spec*) [*dest-path*]
   Exports image to dest path (use - for stdout).
 
-:command:`import` [--image-format *format-id*] [--object-size *B/K/M*] [--stripe-unit *size-in-B/K/M* --stripe-count *num*] [--image-feature *feature-name*]... [--image-shared] *src-path* [*image-spec*]
+:command:`import` [--image-format *format-id*] [--object-size *size-in-B/K/M*] [--stripe-unit *size-in-B/K/M* --stripe-count *num*] [--image-feature *feature-name*]... [--image-shared] *src-path* [*image-spec*]
   Creates a new image and imports its data from path (use - for
   stdin).  The import operation will try to create sparse rbd images 
   if possible.  For import from stdin, the sparsification unit is
@@ -313,10 +316,10 @@ Commands
 
   This requires image format 2.
 
-:command:`map` [-o | --options *map-options* ] [--read-only] *image-spec* | *snap-spec*
+:command:`map` [-o | --options *krbd-options* ] [--read-only] *image-spec* | *snap-spec*
   Maps the specified image to a block device via the rbd kernel module.
 
-:command:`unmap` *image-spec* | *snap-spec* | *device-path*
+:command:`unmap` [-o | --options *krbd-options* ] *image-spec* | *snap-spec* | *device-path*
   Unmaps the block device that was mapped via the rbd kernel module.
 
 :command:`showmapped`
@@ -358,9 +361,10 @@ Commands
   Release a lock on an image. The lock id and locker are
   as output by lock ls.
 
-:command:`bench-write` [--io-size *size-in-B/K/M/G/T*] [--io-threads *num-ios-in-flight*] [--io-total *total-size-to-write-in-B/K/M/G/T*] [--io-pattern seq | rand] *image-spec*
+:command:`bench-write` [--io-size *size-in-B/K/M/G/T*] [--io-threads *num-ios-in-flight*] [--io-total *size-in-B/K/M/G/T*] [--io-pattern seq | rand] *image-spec*
   Generate a series of writes to the image and measure the write throughput and
-  latency.  Defaults are: --io-size 4096, --io-threads 16, --io-total 1G,
+  latency.  If no suffix is given, unit B is assumed for both --io-size and
+  --io-total.  Defaults are: --io-size 4096, --io-threads 16, --io-total 1G,
   --io-pattern seq.
 
 Image and snap specs
@@ -407,14 +411,14 @@ By default, [*stripe_unit*] is the same as the object size and [*stripe_count*]
 used.
 
 
-Map options
-===========
+Kernel rbd (krbd) options
+=========================
 
 Most of these options are useful mainly for debugging and benchmarking.  The
 default values are set in the kernel and may therefore depend on the version of
 the running kernel.
 
-libceph (per client instance) options:
+Per client instance `rbd map` options:
 
 * fsid=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee - FSID that should be assumed by
   the client.
@@ -453,7 +457,7 @@ libceph (per client instance) options:
 
 * osd_idle_ttl=x - OSD idle TTL (default is 60 seconds).
 
-Mapping (per block device) options:
+Per mapping (block device) `rbd map` options:
 
 * rw - Map the image read-write (default).
 
@@ -461,6 +465,15 @@ Mapping (per block device) options:
 
 * queue_depth=x - queue depth (since 4.2, default is 128 requests).
 
+* lock_on_read - Acquire exclusive lock on reads, in addition to writes and
+  discards (since 4.9).
+
+`rbd unmap` options:
+
+* force - Force the unmapping of a block device that is open (since 4.9).  The
+  driver will wait for running requests to complete and then unmap; requests
+  sent to the driver after initiating the unmap will be failed.
+
 
 Examples
 ========
diff --git a/doc/mon/README.txt b/doc/mon/README.txt
new file mode 100644
index 0000000..fa1bf79
--- /dev/null
+++ b/doc/mon/README.txt
@@ -0,0 +1,27 @@
+paxos-call-chain.dot describes to some detail the call chain involved in the
+Paxos algorithm, paying special consideration to the messages involved.
+
+This information is not easily obtainable by Doxygen, as it does not follow
+the call chain when messages are involved, since it becomes an async workflow.
+
+To obtain the graph one should run
+
+  dot -T<format> paxos-call-chain.dot -o paxos-call-chain.<format>
+
+e.g.,
+
+  dot -Tps paxos-call-chain.dot -o paxos-call-chain.ps
+
+or
+
+  dot -Tpng paxos-call-chain.dot -o paxos-call-chain.png
+
+It should do the trick.
+
+Also, for future reference, we consider that:
+  - boxed nodes refer to the Leader;
+  - elliptical nodes refer to the Peon;
+  - diamond shaped nodes refer to state changes;
+  - dotted lines illustrate a message being sent from the Leader to the Peon,
+  or vice-versa.
+
diff --git a/doc/mon/paxos-call-chain.dot b/doc/mon/paxos-call-chain.dot
new file mode 100644
index 0000000..cdca200
--- /dev/null
+++ b/doc/mon/paxos-call-chain.dot
@@ -0,0 +1,82 @@
+digraph Paxos {
+  concentrate=true
+//  subgraph cluster0 {
+    collect -> state_recovering;
+    collect -> send_mmp_collect -> handle_collect [style=dotted];
+    handle_collect -> send_mmp_last;
+    send_mmp_last -> handle_last [style=dotted];
+    handle_last -> collect [label="collect(last_pn)"];
+    handle_last -> send_mmp_commit;
+    handle_last -> state_active;
+    handle_last -> begin;
+    handle_last -> extend_lease;
+
+//    color=grey;
+//    style=filled;
+//    label="Post-Election call chain";
+//  }
+
+  election_finished -> leader_init;
+  leader_init -> collect [label="collect(0)"];
+  send_mmp_commit -> handle_commit [style=dotted];
+
+  begin -> state_updating;
+  begin -> send_mmp_begin;
+  begin -> commit;
+  
+  send_mmp_begin -> handle_begin [style=dotted];
+  handle_begin -> state_updating;
+  handle_begin -> send_mmp_accept;
+  send_mmp_accept -> handle_accept [style=dotted];
+
+  handle_accept -> extend_lease;
+  handle_accept -> state_active;
+  handle_accept -> commit;
+
+  extend_lease -> send_mmp_lease;
+  send_mmp_lease -> handle_lease [style=dotted];
+  handle_lease -> state_active;
+  handle_lease -> send_mmp_lease_ack;
+  send_mmp_lease_ack -> handle_lease_ack [style=dotted];
+
+  commit -> send_mmp_commit;
+  commit -> "last_committed++" [shape=box];
+  send_mmp_commit -> handle_commit [style=dotted];
+
+  handle_commit -> store_state;
+
+  propose_pending -> propose_new_value;
+  propose_new_value -> begin;
+
+  election_finished [label="Election Finished", shape=box, bgcolor=grey, style=filled];
+  collect	    [label="collect()", shape=box];
+  commit	    [label="commit()", shape=box];
+  begin		    [label="begin()", shape=box];
+  extend_lease	    [label="extend_lease()", shape=box];
+  store_state	    [label="store_state()"]; // peon
+
+  propose_pending   [label="PaxosService::propose_pending()"];
+  propose_new_value [label="propose_new_value"];
+
+  send_mmp_collect  [label="send(OP_COLLECT)", shape=box];
+  send_mmp_last	    [label="send(OP_LAST)"];
+  send_mmp_commit   [label="send(OP_COMMIT)", shape=box];
+  send_mmp_begin    [label="send(OP_BEGIN)", shape=box];
+  send_mmp_accept   [label="send(OP_ACCEPT)"];
+  send_mmp_lease    [label="send(OP_LEASE)", shape=box];
+  send_mmp_lease_ack [label="send(OP_LEASE_ACK)"];
+
+  handle_collect    [label="handle_collect()"];
+  handle_last	    [label="handle_last()", shape=box];
+  handle_begin	    [label="handle_begin()"];
+  handle_accept	    [label="handle_accept()", shape=box];
+  handle_lease	    [label="handle_lease()"];
+  handle_lease_ack  [label="handle_lease_ack()", shape=box];
+  handle_commit	    [label="handle_commit()"];
+
+  leader_init	    [label="Paxos::leader_init()", shape=box];
+
+  state_recovering  [label="RECOVERING", shape=diamond];
+  state_active	    [label="ACTIVE", shape=diamond];
+  state_updating    [label="UPDATING", shape=diamond];
+}
diff --git a/doc/rados/api/index.rst b/doc/rados/api/index.rst
new file mode 100644
index 0000000..4030e70
--- /dev/null
+++ b/doc/rados/api/index.rst
@@ -0,0 +1,21 @@
+===========================
+ Ceph Storage Cluster APIs
+===========================
+
+The :term:`Ceph Storage Cluster` has a messaging layer protocol that enables
+clients to interact with a :term:`Ceph Monitor` and a :term:`Ceph OSD Daemon`.
+``librados`` provides this functionality to :term:`Ceph Clients` in the form of
+a library.  All Ceph Clients either use ``librados`` or the same functionality
+encapsulated in ``librados`` to interact with the object store.  For example,
+``librbd`` and ``libcephfs`` leverage this functionality. You may use
+``librados`` to interact with Ceph directly (e.g., an application that talks to
+Ceph, your own interface to Ceph, etc.).
+
+
+.. toctree::
+   :maxdepth: 2 
+
+   Introduction to librados <librados-intro>
+   librados (C) <librados>
+   librados (C++) <libradospp>
+   librados (Python) <python>
\ No newline at end of file
diff --git a/doc/rados/api/librados-intro.rst b/doc/rados/api/librados-intro.rst
new file mode 100644
index 0000000..ba68550
--- /dev/null
+++ b/doc/rados/api/librados-intro.rst
@@ -0,0 +1,992 @@
+==========================
+ Introduction to librados
+==========================
+
+The :term:`Ceph Storage Cluster` provides the basic storage service that allows
+:term:`Ceph` to uniquely deliver **object, block, and file storage** in one
+unified system. However, you are not limited to using the RESTful, block, or
+POSIX interfaces. Based upon :abbr:`RADOS (Reliable Autonomic Distributed Object
+Store)`, the ``librados`` API enables you to create your own interface to the
+Ceph Storage Cluster.
+
+The ``librados`` API enables you to interact with the two types of daemons in
+the Ceph Storage Cluster: 
+
+- The :term:`Ceph Monitor`, which maintains a master copy of the cluster map. 
+- The :term:`Ceph OSD Daemon` (OSD), which stores data as objects on a storage node.
+
+.. ditaa::  
+            +---------------------------------+
+            |  Ceph Storage Cluster Protocol  |
+            |           (librados)            |
+            +---------------------------------+
+            +---------------+ +---------------+
+            |      OSDs     | |    Monitors   |
+            +---------------+ +---------------+
+
+This guide provides a high-level introduction to using ``librados``. 
+Refer to :doc:`../../architecture` for additional details of the Ceph
+Storage Cluster. To use the API, you need a running Ceph Storage Cluster. 
+See `Installation (Quick)`_ for details.
+
+
+Step 1: Getting librados
+========================
+
+Your client application must bind with ``librados`` to connect to the Ceph
+Storage Cluster. You must install ``librados`` and any required packages to
+write applications that use ``librados``. The ``librados`` API is written in
+C++, with additional bindings for C, Python, Java and PHP. 
+
+
+Getting librados for C/C++
+--------------------------
+
+To install ``librados`` development support files for C/C++ on Debian/Ubuntu
+distributions, execute the following::
+
+	sudo apt-get install librados-dev
+
+To install ``librados`` development support files for C/C++ on RHEL/CentOS
+distributions, execute the following::
+
+	sudo yum install librados2-devel
+
+Once you install ``librados`` for developers, you can find the required 
+headers for C/C++ under ``/usr/include/rados``. ::
+
+	ls /usr/include/rados
+
+
+Getting librados for Python
+---------------------------
+
+The ``rados`` module provides ``librados`` support to Python
+applications. The ``librados-dev`` package for Debian/Ubuntu
+and the ``librados2-devel`` package for RHEL/CentOS will install the
+``python-rados`` package for you. You may install ``python-rados``
+directly too.
+
+To install ``librados`` development support files for Python on Debian/Ubuntu
+distributions, execute the following::
+
+	sudo apt-get install python-rados
+
+To install ``librados`` development support files for Python on RHEL/CentOS
+distributions, execute the following::
+
+	sudo yum install python-rados
+
+You can find the module under ``/usr/share/pyshared`` on Debian systems,
+or under ``/usr/lib/python*/site-packages`` on CentOS/RHEL systems.
+
+
+Getting librados for Java
+-------------------------
+
+To install ``librados`` for Java, you need to execute the following procedure:
+
+#. Install ``jna.jar``. For Debian/Ubuntu, execute:: 
+
+	sudo apt-get install libjna-java
+
+   For CentOS/RHEL, execute::
+
+	sudo yum install jna
+
+   The JAR files are located in ``/usr/share/java``.
+
+#. Clone the ``rados-java`` repository::
+
+	git clone --recursive https://github.com/ceph/rados-java.git
+
+#. Build the ``rados-java`` repository:: 
+
+	cd rados-java
+	ant
+
+   The JAR file is located under ``rados-java/target``.
+
+#. Copy the JAR for RADOS to a common location (e.g., ``/usr/share/java``) and 
+   ensure that it and the JNA JAR are in your JVM's classpath. For example::
+
+	sudo cp target/rados-0.1.3.jar /usr/share/java/rados-0.1.3.jar
+	sudo ln -s /usr/share/java/jna-3.2.7.jar /usr/lib/jvm/default-java/jre/lib/ext/jna-3.2.7.jar  
+	sudo ln -s /usr/share/java/rados-0.1.3.jar  /usr/lib/jvm/default-java/jre/lib/ext/rados-0.1.3.jar
+
+To build the documentation, execute the following::
+
+	ant docs
+
+
+Getting librados for PHP
+-------------------------
+
+To install the ``librados`` extension for PHP, you need to execute the following procedure:
+
+#. Install php-dev. For Debian/Ubuntu, execute::
+
+	sudo apt-get install php5-dev build-essential
+
+   For CentOS/RHEL, execute::
+
+	sudo yum install php-devel
+
+#. Clone the ``phprados`` repository::
+
+	git clone https://github.com/ceph/phprados.git
+
+#. Build ``phprados``::
+
+	cd phprados
+	phpize
+	./configure
+	make
+	sudo make install
+
+#. Enable ``phprados`` in php.ini by adding::
+
+	extension=rados.so
+
+
+Step 2: Configuring a Cluster Handle
+====================================
+
+A :term:`Ceph Client`, via ``librados``, interacts directly with OSDs to store
+and retrieve data. To interact with OSDs, the client app must invoke
+``librados``  and connect to a Ceph Monitor. Once connected, ``librados``
+retrieves the  :term:`Cluster Map` from the Ceph Monitor. When the client app
+wants to read or write data, it creates an I/O context and binds to a
+:term:`pool`. The pool has an associated :term:`ruleset` that defines how it
+will place data in the storage cluster. Via the I/O context, the client 
+provides the object name to ``librados``, which takes the object name
+and the cluster map (i.e., the topology of the cluster) and `computes`_ the
+placement group and `OSD`_  for locating the data. Then the client application
+can read or write data. The client app doesn't need to learn about the topology
+of the cluster directly.
+
+.. ditaa:: 
+            +--------+  Retrieves  +---------------+
+            | Client |------------>|  Cluster Map  |
+            +--------+             +---------------+
+                 |
+                 v      Writes
+              /-----\
+              | obj |
+              \-----/
+                 |      To
+                 v
+            +--------+           +---------------+
+            |  Pool  |---------->| CRUSH Ruleset |
+            +--------+  Selects  +---------------+
+
+
+The Ceph Storage Cluster handle encapsulates the client configuration, including:
+
+- The `user ID`_ for ``rados_create()`` or user name for ``rados_create2()`` 
+  (preferred).
+- The :term:`cephx` authentication key
+- The monitor ID and IP address
+- Logging levels
+- Debugging levels
+
+Thus, the first steps in using the cluster from your app are to 1) create
+a cluster handle that your app will use to connect to the storage cluster,
+and then 2) use that handle to connect. To connect to the cluster, the
+app must supply a monitor address, a username and an authentication key
+(cephx is enabled by default).
+
+.. tip:: Talking to different Ceph Storage Clusters – or to the same cluster 
+   with different users – requires different cluster handles.
+
+RADOS provides a number of ways for you to set the required values. For
+the monitor and encryption key settings, an easy way to handle them is to ensure
+that your Ceph configuration file contains a ``keyring`` path to a keyring file
+and at least one monitor address (e.g,. ``mon host``). For example:: 
+
+	[global]
+	mon host = 192.168.1.1
+	keyring = /etc/ceph/ceph.client.admin.keyring
+
+Once you create the handle, you can read a Ceph configuration file to configure
+the handle. You can also pass arguments to your app and parse them with the
+function for parsing command line arguments (e.g., ``rados_conf_parse_argv()``),
+or parse Ceph environment variables (e.g., ``rados_conf_parse_env()``). Some
+wrappers may not implement convenience methods, so you may need to implement
+these capabilities. The following diagram provides a high-level flow for the
+initial connection.
+
+
+.. ditaa:: +---------+     +---------+
+           | Client  |     | Monitor |
+           +---------+     +---------+
+                |               |
+                |-----+ create  |
+                |     | cluster |
+                |<----+ handle  |
+                |               |
+                |-----+ read    |
+                |     | config  |
+                |<----+ file    |
+                |               |
+                |    connect    |
+                |-------------->|
+                |               |
+                |<--------------|
+                |   connected   |
+                |               |
+
+
+Once connected, your app can invoke functions that affect the whole cluster
+with only the cluster handle. For example, once you have a cluster
+handle, you can:
+
+- Get cluster statistics
+- Use Pool Operation (exists, create, list, delete)
+- Get and set the configuration
+
+
+One of the powerful features of Ceph is the ability to bind to different pools.
+Each pool may have a different number of placement groups, object replicas and
+replication strategies. For example, a pool could be set up as a "hot" pool that
+uses SSDs for frequently used objects or a "cold" pool that uses erasure coding.
+
+The main difference in the various ``librados`` bindings is between C and
+the object-oriented bindings for C++, Java and Python. The object-oriented
+bindings use objects to represent cluster handles, IO Contexts, iterators,
+exceptions, etc.
+
+
+C Example
+---------
+
+For C, creating a simple cluster handle using the ``admin`` user, configuring
+it and connecting to the cluster might look something like this: 
+
+.. code-block:: c
+
+	#include <stdio.h>
+	#include <string.h>
+	#include <rados/librados.h>
+
+	int main (int argc, char argv**) 
+	{
+
+		/* Declare the cluster handle and required arguments. */
+		rados_t cluster;
+		char cluster_name[] = "ceph";
+		char user_name[] = "client.admin";
+		uint64_t flags; 
+	
+		/* Initialize the cluster handle with the "ceph" cluster name and the "client.admin" user */  
+		int err;
+		err = rados_create2(&cluster, cluster_name, user_name, flags);
+
+		if (err < 0) {
+			fprintf(stderr, "%s: Couldn't create the cluster handle! %s\n", argv[0], strerror(-err));
+			exit(EXIT_FAILURE);
+		} else {
+			printf("\nCreated a cluster handle.\n");
+		}
+
+
+		/* Read a Ceph configuration file to configure the cluster handle. */
+		err = rados_conf_read_file(cluster, "/etc/ceph/ceph.conf");
+		if (err < 0) {
+			fprintf(stderr, "%s: cannot read config file: %s\n", argv[0], strerror(-err));
+			exit(EXIT_FAILURE);
+		} else {
+			printf("\nRead the config file.\n");
+		}
+
+		/* Read command line arguments */
+		err = rados_conf_parse_argv(cluster, argc, argv);
+		if (err < 0) {
+			fprintf(stderr, "%s: cannot parse command line arguments: %s\n", argv[0], strerror(-err));
+			exit(EXIT_FAILURE);
+		} else {
+			printf("\nRead the command line arguments.\n");
+		}
+
+		/* Connect to the cluster */
+		err = rados_connect(cluster);
+		if (err < 0) {
+			fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0], strerror(-err));
+			exit(EXIT_FAILURE);
+		} else {
+			printf("\nConnected to the cluster.\n");
+		}
+
+	}
+
+Compile your client and link to ``librados`` using ``-lrados``. For example:: 
+
+	gcc ceph-client.c -lrados -o ceph-client
+
+
+C++ Example
+-----------
+
+The Ceph project provides a C++ example in the ``ceph/examples/librados``
+directory. For C++, a simple cluster handle using the ``admin`` user requires
+you to initialize a ``librados::Rados`` cluster handle object:
+
+.. code-block:: c++
+
+	#include <iostream>
+	#include <string>
+	#include <rados/librados.hpp>
+
+	int main(int argc, const char **argv)
+	{
+
+		int ret = 0;
+
+		/* Declare the cluster handle and required variables. */	
+		librados::Rados cluster;
+		char cluster_name[] = "ceph";
+		char user_name[] = "client.admin";
+		uint64_t flags; 
+	
+		/* Initialize the cluster handle with the "ceph" cluster name and "client.admin" user */ 
+		{
+			ret = cluster.init2(user_name, cluster_name, flags);
+			if (ret < 0) {
+				std::cerr << "Couldn't initialize the cluster handle! error " << ret << std::endl;
+				return EXIT_FAILURE;
+			} else {
+				std::cout << "Created a cluster handle." << std::endl;
+			}
+		}
+
+		/* Read a Ceph configuration file to configure the cluster handle. */	
+		{	
+			ret = cluster.conf_read_file("/etc/ceph/ceph.conf");	
+			if (ret < 0) {
+				std::cerr << "Couldn't read the Ceph configuration file! error " << ret << std::endl;
+				return EXIT_FAILURE;
+			} else {
+				std::cout << "Read the Ceph configuration file." << std::endl;
+			}
+		}
+		
+		/* Read command line arguments */
+		{
+			ret = cluster.conf_parse_argv(argc, argv);
+			if (ret < 0) {
+				std::cerr << "Couldn't parse command line options! error " << ret << std::endl;
+				return EXIT_FAILURE;
+			} else {
+				std::cout << "Parsed command line options." << std::endl;
+			}
+		}
+	
+		/* Connect to the cluster */
+		{
+			ret = cluster.connect();
+			if (ret < 0) {
+				std::cerr << "Couldn't connect to cluster! error " << ret << std::endl;
+				return EXIT_FAILURE;
+			} else {
+				std::cout << "Connected to the cluster." << std::endl;
+			}
+		}
+	
+		return 0;
+	}
+	
+
+Compile the source; then, link ``librados`` using ``-lrados``. 
+For example::
+
+	g++ -g -c ceph-client.cc -o ceph-client.o
+	g++ -g ceph-client.o -lrados -o ceph-client
+
+
+
+Python Example
+--------------
+
+Python uses the ``admin`` id and the ``ceph`` cluster name by default, and
+will read the standard ``ceph.conf`` file if the conffile parameter is
+set to the empty string. The Python binding converts C++ errors
+into exceptions.
+
+
+.. code-block:: python
+
+	import rados
+
+	try:
+		cluster = rados.Rados(conffile='')
+	except TypeError as e:
+		print 'Argument validation error: ', e
+		raise e
+		
+	print "Created cluster handle."
+
+	try:
+		cluster.connect()
+	except Exception as e:
+		print "connection error: ", e
+		raise e
+	finally:
+		print "Connected to the cluster."
+
+
+Execute the example to verify that it connects to your cluster. ::
+
+	python ceph-client.py
+
+
+Java Example
+------------
+
+Java requires you to specify the user ID (``admin``) or user name
+(``client.admin``), and uses the ``ceph`` cluster name by default . The Java
+binding converts C++-based errors into exceptions.
+
+.. code-block:: java
+
+	import com.ceph.rados.Rados;
+	import com.ceph.rados.RadosException;
+	
+	import java.io.File;
+	
+	public class CephClient {
+		public static void main (String args[]){
+	
+			try {
+				Rados cluster = new Rados("admin");
+				System.out.println("Created cluster handle.");
+	            
+				File f = new File("/etc/ceph/ceph.conf");
+				cluster.confReadFile(f);
+				System.out.println("Read the configuration file.");
+
+				cluster.connect();
+				System.out.println("Connected to the cluster.");            
+
+			} catch (RadosException e) {
+				System.out.println(e.getMessage() + ": " + e.getReturnValue());
+			}
+		}
+	}
+
+
+Compile the source; then, run it. If you have copied the JAR to
+``/usr/share/java`` and sym linked from your ``ext`` directory, you won't need
+to specify the classpath. For example::
+
+	javac CephClient.java
+	java CephClient
+
+
+PHP Example
+------------
+
+With the RADOS extension enabled in PHP you can start creating a new cluster handle very easily:
+
+.. code-block:: php
+
+	<?php
+
+	$r = rados_create();
+	rados_conf_read_file($r, '/etc/ceph/ceph.conf');
+	if (!rados_connect($r)) {
+		echo "Failed to connect to Ceph cluster";
+	} else {
+		echo "Successfully connected to Ceph cluster";
+	}
+
+
+Save this as rados.php and run the code::
+
+	php rados.php
+
+
+Step 3: Creating an I/O Context
+===============================
+
+Once your app has a cluster handle and a connection to a Ceph Storage Cluster,
+you may create an I/O Context and begin reading and writing data. An I/O Context
+binds the connection to a specific pool. The user must have appropriate
+`CAPS`_ permissions to access the specified pool. For example, a user with read
+access but not write access will only be able to read data. I/O Context 
+functionality includes:
+
+- Write/read data and extended attributes
+- List and iterate over objects and extended attributes
+- Snapshot pools, list snapshots, etc.
+
+
+.. ditaa:: +---------+     +---------+     +---------+
+           | Client  |     | Monitor |     |   OSD   |
+           +---------+     +---------+     +---------+
+                |               |               |
+                |-----+ create  |               |
+                |     | I/O     |               | 
+                |<----+ context |               |              
+                |               |               |
+                |  write data   |               |
+                |---------------+-------------->|
+                |               |               |
+                |  write ack    |               |
+                |<--------------+---------------|
+                |               |               |
+                |  write xattr  |               |
+                |---------------+-------------->|
+                |               |               |
+                |  xattr ack    |               |
+                |<--------------+---------------|
+                |               |               |
+                |   read data   |               |
+                |---------------+-------------->|
+                |               |               |
+                |   read ack    |               |
+                |<--------------+---------------|
+                |               |               |
+                |  remove data  |               |
+                |---------------+-------------->|
+                |               |               |
+                |  remove ack   |               |
+                |<--------------+---------------|
+
+
+
+RADOS enables you to interact both synchronously and asynchronously. Once your
+app has an I/O Context, read/write operations only require you to know the
+object/xattr name. The CRUSH algorithm encapsulated in ``librados`` uses the
+cluster map to identify the appropriate OSD. OSD daemons handle the replication,
+as described in `Smart Daemons Enable Hyperscale`_. The ``librados`` library also 
+maps objects to placement groups, as described in  `Calculating PG IDs`_.
+
+The following examples use the default ``data`` pool. However, you may also
+use the API to list pools, ensure they exist, or create and delete pools. For 
+the write operations, the examples illustrate how to use synchronous mode. For
+the read operations, the examples illustrate how to use asynchronous mode.
+
+.. important:: Use caution when deleting pools with this API. If you delete
+   a pool, the pool and ALL DATA in the pool will be lost.
+
+
+C Example
+---------
+
+
+.. code-block:: c
+
+	#include <stdio.h>
+	#include <string.h>
+	#include <rados/librados.h>
+
+	int main (int argc, const char argv**) 
+	{
+		/* 
+		 * Continued from previous C example, where cluster handle and
+		 * connection are established. First declare an I/O Context. 
+		 */
+
+		rados_ioctx_t io;
+		char *poolname = "data";
+	
+		err = rados_ioctx_create(cluster, poolname, &io);
+		if (err < 0) {
+			fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0], poolname, strerror(-err));
+			rados_shutdown(cluster);
+			exit(EXIT_FAILURE);
+		} else {
+			printf("\nCreated I/O context.\n");
+		}
+
+		/* Write data to the cluster synchronously. */	
+		err = rados_write(io, "hw", "Hello World!", 12, 0);
+		if (err < 0) {
+			fprintf(stderr, "%s: Cannot write object \"hw\" to pool %s: %s\n", argv[0], poolname, strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nWrote \"Hello World\" to object \"hw\".\n");
+		}
+	
+		char xattr[] = "en_US";
+		err = rados_setxattr(io, "hw", "lang", xattr, 5);
+		if (err < 0) {
+			fprintf(stderr, "%s: Cannot write xattr to pool %s: %s\n", argv[0], poolname, strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nWrote \"en_US\" to xattr \"lang\" for object \"hw\".\n");
+		}
+	
+		/*
+		 * Read data from the cluster asynchronously. 
+		 * First, set up asynchronous I/O completion.
+		 */
+		rados_completion_t comp;
+		err = rados_aio_create_completion(NULL, NULL, NULL, &comp);
+		if (err < 0) {
+			fprintf(stderr, "%s: Could not create aio completion: %s\n", argv[0], strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nCreated AIO completion.\n");
+		}
+
+		/* Next, read data using rados_aio_read. */
+		char read_res[100];
+		err = rados_aio_read(io, "hw", comp, read_res, 12, 0);
+		if (err < 0) {
+			fprintf(stderr, "%s: Cannot read object. %s %s\n", argv[0], poolname, strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nRead object \"hw\". The contents are:\n %s \n", read_res);
+		}
+		
+		/* Wait for the operation to complete */
+		rados_wait_for_complete(comp);
+		
+		/* Release the asynchronous I/O complete handle to avoid memory leaks. */
+		rados_aio_release(comp);		
+		
+	
+		char xattr_res[100];
+		err = rados_getxattr(io, "hw", "lang", xattr_res, 5);
+		if (err < 0) {
+			fprintf(stderr, "%s: Cannot read xattr. %s %s\n", argv[0], poolname, strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nRead xattr \"lang\" for object \"hw\". The contents are:\n %s \n", xattr_res);
+		}
+
+		err = rados_rmxattr(io, "hw", "lang");
+		if (err < 0) {
+			fprintf(stderr, "%s: Cannot remove xattr. %s %s\n", argv[0], poolname, strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nRemoved xattr \"lang\" for object \"hw\".\n");
+		}
+
+		err = rados_remove(io, "hw");
+		if (err < 0) {
+			fprintf(stderr, "%s: Cannot remove object. %s %s\n", argv[0], poolname, strerror(-err));
+			rados_ioctx_destroy(io);
+			rados_shutdown(cluster);
+			exit(1);
+		} else {
+			printf("\nRemoved object \"hw\".\n");
+		}
+
+	}
+
+
+
+C++ Example
+-----------
+
+
+.. code-block:: c++
+
+	#include <iostream>
+	#include <string>
+	#include <rados/librados.hpp>
+
+	int main(int argc, const char **argv)
+	{
+
+		/* Continued from previous C++ example, where cluster handle and
+		 * connection are established. First declare an I/O Context. 
+		 */
+
+		librados::IoCtx io_ctx;
+		const char *pool_name = "data";
+		
+		{
+			ret = cluster.ioctx_create(pool_name, io_ctx);
+			if (ret < 0) {
+				std::cerr << "Couldn't set up ioctx! error " << ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Created an ioctx for the pool." << std::endl;
+			}
+		}
+		
+
+		/* Write an object synchronously. */
+		{
+			librados::bufferlist bl;
+			bl.append("Hello World!");
+			ret = io_ctx.write_full("hw", bl);
+			if (ret < 0) {
+				std::cerr << "Couldn't write object! error " << ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Wrote new object 'hw' " << std::endl;
+			}
+		}
+		
+		
+		/*
+		 * Add an xattr to the object.
+		 */
+		{
+			librados::bufferlist lang_bl;
+			lang_bl.append("en_US");
+			ret = io_ctx.setxattr("hw", "lang", lang_bl);
+			if (ret < 0) {
+				std::cerr << "failed to set xattr version entry! error "
+				<< ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Set the xattr 'lang' on our object!" << std::endl;
+			}
+		}
+		
+		
+		/*
+		 * Read the object back asynchronously.
+		 */
+		{
+			librados::bufferlist read_buf;
+			int read_len = 4194304;
+
+			//Create I/O Completion.
+			librados::AioCompletion *read_completion = librados::Rados::aio_create_completion();
+			
+			//Send read request.
+			ret = io_ctx.aio_read("hw", read_completion, &read_buf, read_len, 0);
+			if (ret < 0) {
+				std::cerr << "Couldn't start read object! error " << ret << std::endl;
+				exit(EXIT_FAILURE);
+			}
+
+			// Wait for the request to complete, and check that it succeeded.
+			read_completion->wait_for_complete();
+			ret = read_completion->get_return_value();
+			if (ret < 0) {
+				std::cerr << "Couldn't read object! error " << ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Read object hw asynchronously with contents.\n"
+				<< read_buf.c_str() << std::endl;
+			}
+		}
+		
+		
+		/*
+		 * Read the xattr.
+		 */
+		{
+			librados::bufferlist lang_res;
+			ret = io_ctx.getxattr("hw", "lang", lang_res);
+			if (ret < 0) {
+				std::cerr << "failed to get xattr version entry! error "
+				<< ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Got the xattr 'lang' from object hw!"
+				<< lang_res.c_str() << std::endl;
+			}
+		}
+		
+		
+		/*
+		 * Remove the xattr.
+		 */
+		{
+			ret = io_ctx.rmxattr("hw", "lang");
+			if (ret < 0) {
+				std::cerr << "Failed to remove xattr! error "
+				<< ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Removed the xattr 'lang' from our object!" << std::endl;
+			}
+		}
+		
+		/*
+		 * Remove the object.
+		 */
+		{
+			ret = io_ctx.remove("hw");
+			if (ret < 0) {
+				std::cerr << "Couldn't remove object! error " << ret << std::endl;
+				exit(EXIT_FAILURE);
+			} else {
+				std::cout << "Removed object 'hw'." << std::endl;
+			}
+		}
+	}
+
+
+
+Python Example
+--------------
+
+.. code-block:: python
+
+	print "\n\nI/O Context and Object Operations"
+	print "================================="
+	
+	print "\nCreating a context for the 'data' pool"
+	if not cluster.pool_exists('data'):
+		raise RuntimeError('No data pool exists')
+	ioctx = cluster.open_ioctx('data')
+	
+	print "\nWriting object 'hw' with contents 'Hello World!' to pool 'data'."
+	ioctx.write("hw", "Hello World!")
+	print "Writing XATTR 'lang' with value 'en_US' to object 'hw'"
+	ioctx.set_xattr("hw", "lang", "en_US")
+	
+	
+	print "\nWriting object 'bm' with contents 'Bonjour tout le monde!' to pool 'data'."
+	ioctx.write("bm", "Bonjour tout le monde!")
+	print "Writing XATTR 'lang' with value 'fr_FR' to object 'bm'"
+	ioctx.set_xattr("bm", "lang", "fr_FR")
+	
+	print "\nContents of object 'hw'\n------------------------"
+	print ioctx.read("hw")
+	
+	print "\n\nGetting XATTR 'lang' from object 'hw'"
+	print ioctx.get_xattr("hw", "lang")
+	
+	print "\nContents of object 'bm'\n------------------------"
+	print ioctx.read("bm")
+	
+	print "Getting XATTR 'lang' from object 'bm'"
+	print ioctx.get_xattr("bm", "lang")
+	
+	
+	print "\nRemoving object 'hw'"
+	ioctx.remove_object("hw")
+	
+	print "Removing object 'bm'"
+	ioctx.remove_object("bm")
+
+
+Java-Example
+------------
+
+.. code-block:: java
+
+	import com.ceph.rados.Rados;
+	import com.ceph.rados.RadosException;
+
+	import java.io.File;
+	import com.ceph.rados.IoCTX;
+
+	public class CephClient {
+        	public static void main (String args[]){
+
+                	try {
+				Rados cluster = new Rados("admin");
+				System.out.println("Created cluster handle.");
+
+                        	File f = new File("/etc/ceph/ceph.conf");
+                        	cluster.confReadFile(f);
+                        	System.out.println("Read the configuration file.");
+
+                        	cluster.connect();
+                        	System.out.println("Connected to the cluster.");
+
+				IoCTX io = cluster.ioCtxCreate("data");
+
+				String oidone = "hw";
+				String contentone = "Hello World!";
+				io.write(oidone, contentone); 
+
+				String oidtwo = "bm";
+				String contenttwo = "Bonjour tout le monde!";
+				io.write(oidtwo, contenttwo); 
+
+				String[] objects = io.listObjects();
+                       		for (String object: objects)
+					System.out.println(object);
+
+				io.remove(oidone);
+				io.remove(oidtwo);
+
+				cluster.ioCtxDestroy(io);
+
+                	} catch (RadosException e) {
+                        	System.out.println(e.getMessage() + ": " + e.getReturnValue());
+                	}
+        	}
+	}
+
+
+PHP Example
+-----------
+
+.. code-block:: php
+
+	<?php
+
+	$io = rados_ioctx_create($r, "mypool");
+	rados_write_full($io, "oidOne", "mycontents");
+	rados_remove("oidOne");
+	rados_ioctx_destroy($io);
+
+
+Step 4: Closing Sessions
+========================
+
+Once your app finishes with the I/O Context and cluster handle, the app should
+close the connection and shutdown the handle. For asynchronous I/O, the app
+should also ensure that pending asynchronous operations have completed.
+
+
+C Example
+---------
+
+.. code-block:: c
+
+	rados_ioctx_destroy(io);
+	rados_shutdown(cluster);	
+
+
+C++ Example
+-----------
+
+.. code-block:: c++
+
+	io_ctx.close();
+	cluster.shutdown();
+
+
+Python Example
+--------------
+
+.. code-block:: python
+
+	print "\nClosing the connection."
+	ioctx.close()
+	
+	print "Shutting down the handle."
+	cluster.shutdown()
+
+PHP Example
+-----------
+
+.. code-block:: php
+
+	rados_shutdown($r);
+
+
+
+.. _user ID: ../../operations/authentication#cephx-commandline-options
+.. _CAPS: ../../operations/auth-intro#ceph-authorization-caps
+.. _Installation (Quick): ../../../start
+.. _Smart Daemons Enable Hyperscale: ../../../architecture#smart-daemons-enable-hyperscale
+.. _Calculating PG IDs: ../../../architecture#calculating-pg-ids
+.. _computes: ../../../architecture#calculating-pg-ids
+.. _OSD: ../../../architecture#mapping-pgs-to-osds
diff --git a/doc/rados/api/librados.rst b/doc/rados/api/librados.rst
new file mode 100644
index 0000000..483ef8e
--- /dev/null
+++ b/doc/rados/api/librados.rst
@@ -0,0 +1,187 @@
+==============
+ Librados (C)
+==============
+
+.. highlight:: c
+
+`librados` provides low-level access to the RADOS service. For an
+overview of RADOS, see :doc:`../../architecture`.
+
+
+Example: connecting and writing an object
+=========================================
+
+To use `Librados`, you instantiate a :c:type:`rados_t` variable (a cluster handle) and
+call :c:func:`rados_create()` with a pointer to it::
+
+	int err;
+	rados_t cluster;
+
+	err = rados_create(&cluster, NULL);
+	if (err < 0) {
+		fprintf(stderr, "%s: cannot create a cluster handle: %s\n", argv[0], strerror(-err));
+		exit(1);
+	}
+
+Then you configure your :c:type:`rados_t` to connect to your cluster,
+either by setting individual values (:c:func:`rados_conf_set()`),
+using a configuration file (:c:func:`rados_conf_read_file()`), using
+command line options (:c:func:`rados_conf_parse_argv`), or an
+environment variable (:c:func:`rados_conf_parse_env()`)::
+
+	err = rados_conf_read_file(cluster, "/path/to/myceph.conf");
+	if (err < 0) {
+		fprintf(stderr, "%s: cannot read config file: %s\n", argv[0], strerror(-err));
+		exit(1);
+	}
+
+Once the cluster handle is configured, you can connect to the cluster with :c:func:`rados_connect()`::
+
+	err = rados_connect(cluster);
+	if (err < 0) {
+		fprintf(stderr, "%s: cannot connect to cluster: %s\n", argv[0], strerror(-err));
+		exit(1);
+	}
+
+Then you open an "IO context", a :c:type:`rados_ioctx_t`, with :c:func:`rados_ioctx_create()`::
+
+	rados_ioctx_t io;
+	char *poolname = "mypool";
+
+	err = rados_ioctx_create(cluster, poolname, &io);
+	if (err < 0) {
+		fprintf(stderr, "%s: cannot open rados pool %s: %s\n", argv[0], poolname, strerror(-err));
+		rados_shutdown(cluster);
+		exit(1);
+	}
+
+Note that the pool you try to access must exist.
+
+Then you can use the RADOS data manipulation functions, for example
+write into an object called ``greeting`` with
+:c:func:`rados_write_full()`::
+
+	err = rados_write_full(io, "greeting", "hello", 5);
+	if (err < 0) {
+		fprintf(stderr, "%s: cannot write pool %s: %s\n", argv[0], poolname, strerror(-err));
+		rados_ioctx_destroy(io);
+		rados_shutdown(cluster);
+		exit(1);
+	}
+
+In the end, you'll want to close your IO context and connection to RADOS with :c:func:`rados_ioctx_destroy()` and :c:func:`rados_shutdown()`::
+
+	rados_ioctx_destroy(io);
+	rados_shutdown(cluster);
+
+
+Asychronous IO
+==============
+
+When doing lots of IO, you often don't need to wait for one operation
+to complete before starting the next one. `Librados` provides
+asynchronous versions of several operations:
+
+* :c:func:`rados_aio_write`
+* :c:func:`rados_aio_append`
+* :c:func:`rados_aio_write_full`
+* :c:func:`rados_aio_read`
+
+For each operation, you must first create a
+:c:type:`rados_completion_t` that represents what to do when the
+operation is safe or complete by calling
+:c:func:`rados_aio_create_completion`. If you don't need anything
+special to happen, you can pass NULL::
+
+	rados_completion_t comp;
+	err = rados_aio_create_completion(NULL, NULL, NULL, &comp);
+	if (err < 0) {
+		fprintf(stderr, "%s: could not create aio completion: %s\n", argv[0], strerror(-err));
+		rados_ioctx_destroy(io);
+		rados_shutdown(cluster);
+		exit(1);
+	}
+
+Now you can call any of the aio operations, and wait for it to
+be in memory or on disk on all replicas::
+
+	err = rados_aio_write(io, "foo", comp, "bar", 3, 0);
+	if (err < 0) {
+		fprintf(stderr, "%s: could not schedule aio write: %s\n", argv[0], strerror(-err));
+		rados_aio_release(comp);
+		rados_ioctx_destroy(io);
+		rados_shutdown(cluster);
+		exit(1);
+	}
+	rados_wait_for_complete(comp); // in memory
+	rados_wait_for_safe(comp); // on disk
+
+Finally, we need to free the memory used by the completion with :c:func:`rados_aio_release`::
+
+	rados_aio_release(comp);
+
+You can use the callbacks to tell your application when writes are
+durable, or when read buffers are full. For example, if you wanted to
+measure the latency of each operation when appending to several
+objects, you could schedule several writes and store the ack and
+commit time in the corresponding callback, then wait for all of them
+to complete using :c:func:`rados_aio_flush` before analyzing the
+latencies::
+
+	typedef struct {
+		struct timeval start;
+		struct timeval ack_end;
+		struct timeval commit_end;
+	} req_duration;
+
+	void ack_callback(rados_completion_t comp, void *arg) {
+		req_duration *dur = (req_duration *) arg;
+		gettimeofday(&dur->ack_end, NULL);
+	}
+
+	void commit_callback(rados_completion_t comp, void *arg) {
+		req_duration *dur = (req_duration *) arg;
+		gettimeofday(&dur->commit_end, NULL);
+	}
+
+	int output_append_latency(rados_ioctx_t io, const char *data, size_t len, size_t num_writes) {
+		req_duration times[num_writes];
+		rados_completion_t comps[num_writes];
+		for (size_t i = 0; i < num_writes; ++i) {
+			gettimeofday(&times[i].start, NULL);
+			int err = rados_aio_create_completion((void*) &times[i], ack_callback, commit_callback, &comps[i]);
+			if (err < 0) {
+				fprintf(stderr, "Error creating rados completion: %s\n", strerror(-err));
+				return err;
+			}
+			char obj_name[100];
+			snprintf(obj_name, sizeof(obj_name), "foo%ld", (unsigned long)i);
+			err = rados_aio_append(io, obj_name, comps[i], data, len);
+			if (err < 0) {
+				fprintf(stderr, "Error from rados_aio_append: %s", strerror(-err));
+				return err;
+			}
+		}
+		// wait until all requests finish *and* the callbacks complete
+		rados_aio_flush(io);
+		// the latencies can now be analyzed
+		printf("Request # | Ack latency (s) | Commit latency (s)\n");
+		for (size_t i = 0; i < num_writes; ++i) {
+			// don't forget to free the completions
+			rados_aio_release(comps[i]);
+			struct timeval ack_lat, commit_lat;
+			timersub(&times[i].ack_end, &times[i].start, &ack_lat);
+			timersub(&times[i].commit_end, &times[i].start, &commit_lat);
+			printf("%9ld | %8ld.%06ld | %10ld.%06ld\n", (unsigned long) i, ack_lat.tv_sec, ack_lat.tv_usec, commit_lat.tv_sec, commit_lat.tv_usec);
+		}
+		return 0;
+	}
+
+Note that all the :c:type:`rados_completion_t` must be freed with :c:func:`rados_aio_release` to avoid leaking memory.
+
+
+API calls
+=========
+
+ .. autodoxygenfile:: rados_types.h
+ .. autodoxygenfile:: librados.h
diff --git a/doc/rados/api/libradospp.rst b/doc/rados/api/libradospp.rst
new file mode 100644
index 0000000..27d3fa7
--- /dev/null
+++ b/doc/rados/api/libradospp.rst
@@ -0,0 +1,5 @@
+==================
+ LibradosPP (C++)
+==================
+
+.. todo:: write me!
diff --git a/doc/rados/api/python.rst b/doc/rados/api/python.rst
new file mode 100644
index 0000000..b4fd7e0
--- /dev/null
+++ b/doc/rados/api/python.rst
@@ -0,0 +1,397 @@
+===================
+ Librados (Python)
+===================
+
+The ``rados`` module is a thin Python wrapper for ``librados``.
+
+Installation
+============
+
+To install Python libraries for Ceph, see `Getting librados for Python`_.
+
+
+Getting Started
+===============
+
+You can create your own Ceph client using Python. The following tutorial will
+show you how to import the Ceph Python module, connect to a Ceph cluster,  and
+perform object operations as a ``client.admin`` user. 
+
+.. note:: To use the Ceph Python bindings, you must have access to a 
+   running Ceph cluster. To set one up quickly, see `Getting Started`_.
+
+First, create a Python source file for your Ceph client. ::
+   :linenos:
+   
+	sudo vim client.py
+
+
+Import the Module
+-----------------
+
+To use the ``rados`` module, import it into your source file.
+
+.. code-block:: python
+   :linenos:
+
+	import rados
+
+
+Configure a Cluster Handle
+--------------------------
+
+Before connecting to the Ceph Storage Cluster, create a cluster handle. By
+default, the cluster handle assumes a cluster named ``ceph`` (i.e., the default
+for deployment tools, and our Getting Started guides too),  and a
+``client.admin`` user name. You may change these defaults to suit your needs.
+
+To connect to the Ceph Storage Cluster, your application needs to know where to
+find the  Ceph Monitor. Provide this information to your application by
+specifying the path to your Ceph configuration file, which contains the location
+of the initial Ceph monitors.
+
+.. code-block:: python
+   :linenos:
+
+	import rados, sys
+	
+	#Create Handle Examples.
+	cluster = rados.Rados(conffile='ceph.conf')
+	cluster = rados.Rados(conffile=sys.argv[1])
+	cluster = rados.Rados(conffile = 'ceph.conf', conf = dict (keyring = '/path/to/keyring'))
+
+Ensure that the ``conffile`` argument provides the path and file name of your
+Ceph configuration file. You may use the ``sys`` module to avoid hard-coding the
+Ceph configuration path and file name. 
+
+Your Python client also requires a client keyring. For this example, we use the
+``client.admin`` key by default. If you would like to specify the keyring when
+creating the cluster handle, you may use the ``conf`` argument. Alternatively,
+you may specify the keyring path in your Ceph configuration file. For example, 
+you may add something like the following line to you Ceph configuration file:: 
+
+	keyring = /path/to/ceph.client.admin.keyring
+
+For additional details on modifying your configuration via Python, see `Configuration`_.
+
+
+Connect to the Cluster
+----------------------
+
+Once you have a cluster handle configured, you may connect to the cluster. 
+With a connection to the cluster, you may execute methods that return
+information about the cluster.
+
+.. code-block:: python
+   :linenos:
+   :emphasize-lines: 7
+
+	import rados, sys
+	
+	cluster = rados.Rados(conffile='ceph.conf')
+	print "\nlibrados version: " + str(cluster.version())
+	print "Will attempt to connect to: " + str(cluster.conf_get('mon initial members'))	
+	
+	cluster.connect()
+	print "\nCluster ID: " + cluster.get_fsid()
+
+	print "\n\nCluster Statistics"
+	print "=================="
+	cluster_stats = cluster.get_cluster_stats()
+
+	for key, value in cluster_stats.iteritems():
+		print key, value
+
+
+By default, Ceph authentication is ``on``. Your application will need to know
+the location of the keyring. The ``python-ceph`` module doesn't have the default
+location, so you need to specify the keyring path. The easiest way to specify
+the keyring is to add it to the Ceph configuration file. The following Ceph
+configuration file example uses the ``client.admin`` keyring you generated with
+``ceph-deploy``.
+
+.. code-block:: ini
+   :linenos:
+   
+	[global]
+	...
+	keyring=/path/to/keyring/ceph.client.admin.keyring
+
+
+Manage Pools
+------------
+
+When connected to the cluster, the ``Rados`` API allows you to manage pools. You
+can list pools, check for the existence of a pool, create a pool and delete a
+pool. 
+
+.. code-block:: python
+   :linenos:
+   :emphasize-lines: 6, 13, 18, 25
+
+	print "\n\nPool Operations"
+	print "==============="
+
+	print "\nAvailable Pools"
+	print "----------------"
+	pools = cluster.list_pools()
+
+	for pool in pools:
+		print pool
+
+	print "\nCreate 'test' Pool"
+	print "------------------"
+	cluster.create_pool('test')
+
+	print "\nPool named 'test' exists: " + str(cluster.pool_exists('test'))
+	print "\nVerify 'test' Pool Exists"
+	print "-------------------------"
+	pools = cluster.list_pools()
+
+	for pool in pools:
+		print pool
+
+	print "\nDelete 'test' Pool"
+	print "------------------"
+	cluster.delete_pool('test')
+	print "\nPool named 'test' exists: " + str(cluster.pool_exists('test'))
+
+
+
+Input/Output Context
+--------------------
+
+Reading from and writing to the Ceph Storage Cluster requires an input/output
+context (ioctx). You can create an ioctx with the ``open_ioctx()`` method of the
+``Rados`` class. The ``ioctx_name`` parameter is the name of the  pool you wish
+to use.
+
+.. code-block:: python
+   :linenos:
+
+	ioctx = cluster.open_ioctx('data')
+
+
+Once you have an I/O context, you can read/write objects, extended attributes,
+and perform a number of other operations. After you complete operations, ensure
+that you close the connection. For example: 
+
+.. code-block:: python
+   :linenos:
+
+	print "\nClosing the connection."
+	ioctx.close()
+
+
+Writing, Reading and Removing Objects
+-------------------------------------
+
+Once you create an I/O context, you can write objects to the cluster. If you
+write to an object that doesn't exist, Ceph creates it. If you write to an
+object that exists, Ceph overwrites it (except when you specify a range, and
+then it only overwrites the range). You may read objects (and object ranges)
+from the cluster. You may also remove objects from the cluster. For example: 
+
+.. code-block:: python
+	:linenos:
+	:emphasize-lines: 2, 5, 8
+	
+	print "\nWriting object 'hw' with contents 'Hello World!' to pool 'data'."
+	ioctx.write_full("hw", "Hello World!")
+
+	print "\n\nContents of object 'hw'\n------------------------\n"
+	print ioctx.read("hw")
+	
+	print "\nRemoving object 'hw'"
+	ioctx.remove_object("hw")
+
+
+Writing and Reading XATTRS
+--------------------------
+
+Once you create an object, you can write extended attributes (XATTRs) to
+the object and read XATTRs from the object. For example: 
+
+.. code-block:: python
+	:linenos:
+	:emphasize-lines: 2, 5
+
+	print "\n\nWriting XATTR 'lang' with value 'en_US' to object 'hw'"
+	ioctx.set_xattr("hw", "lang", "en_US")
+
+	print "\n\nGetting XATTR 'lang' from object 'hw'\n"
+	print ioctx.get_xattr("hw", "lang")
+
+
+Listing Objects
+---------------
+
+If you want to examine the list of objects in a pool, you may 
+retrieve the list of objects and iterate over them with the object iterator.
+For example:
+
+.. code-block:: python
+	:linenos:
+	:emphasize-lines: 1, 6, 7
+
+	object_iterator = ioctx.list_objects()
+
+	while True : 
+	
+		try : 
+			rados_object = object_iterator.next()
+			print "Object contents = " + rados_object.read()
+	
+		except StopIteration :
+			break
+
+The ``Object`` class provides a file-like interface to an object, allowing
+you to read and write content and extended attributes. Object operations using
+the I/O context provide additional functionality and asynchronous capabilities.
+
+
+Cluster Handle API
+==================
+
+The ``Rados`` class provides an interface into the Ceph Storage Daemon.
+
+
+Configuration
+-------------
+
+The ``Rados`` class provides methods for getting and setting configuration
+values, reading the Ceph configuration file, and parsing arguments. You 
+do not need to be connected to the Ceph Storage Cluster to invoke the following
+methods. See `Storage Cluster Configuration`_ for details on settings.
+
+.. currentmodule:: rados
+.. automethod:: Rados.conf_get(option)
+.. automethod:: Rados.conf_set(option, val)
+.. automethod:: Rados.conf_read_file(path=None)
+.. automethod:: Rados.conf_parse_argv(args)
+.. automethod:: Rados.version()   
+
+
+Connection Management
+---------------------
+
+Once you configure your cluster handle, you may connect to the cluster, check
+the cluster ``fsid``, retrieve cluster statistics, and disconnect (shutdown)
+from the cluster. You may also assert that the cluster handle is in a particular
+state (e.g., "configuring", "connecting", etc.).
+
+
+.. automethod:: Rados.connect(timeout=0)
+.. automethod:: Rados.shutdown()
+.. automethod:: Rados.get_fsid()
+.. automethod:: Rados.get_cluster_stats()
+.. automethod:: Rados.require_state(*args)
+
+
+Pool Operations
+---------------
+
+To use pool operation methods, you must connect to the Ceph Storage Cluster
+first.  You may list the available pools, create a pool, check to see if a pool
+exists,  and delete a pool.
+
+.. automethod:: Rados.list_pools()
+.. automethod:: Rados.create_pool(pool_name, auid=None, crush_rule=None)
+.. automethod:: Rados.pool_exists()
+.. automethod:: Rados.delete_pool(pool_name)
+
+
+
+Input/Output Context API
+========================
+
+To write data to and read data from the Ceph Object Store, you must create
+an Input/Output context (ioctx). The `Rados` class provides a `open_ioctx()`
+method. The remaining ``ioctx`` operations involve invoking methods of the 
+`Ioctx` and other classes. 
+
+.. automethod:: Rados.open_ioctx(ioctx_name)
+.. automethod:: Ioctx.require_ioctx_open()
+.. automethod:: Ioctx.get_stats()
+.. automethod:: Ioctx.change_auid(auid)
+.. automethod:: Ioctx.get_last_version()
+.. automethod:: Ioctx.close()
+
+
+.. Pool Snapshots
+.. --------------
+
+.. The Ceph Storage Cluster allows you to make a snapshot of a pool's state.
+.. Whereas, basic pool operations only require a connection to the cluster, 
+.. snapshots require an I/O context.
+
+.. Ioctx.create_snap(self, snap_name)
+.. Ioctx.list_snaps(self)
+.. SnapIterator.next(self)
+.. Snap.get_timestamp(self)
+.. Ioctx.lookup_snap(self, snap_name)
+.. Ioctx.remove_snap(self, snap_name)
+
+.. not published. This doesn't seem ready yet.
+
+Object Operations
+-----------------
+
+The Ceph Storage Cluster stores data as objects. You can read and write objects
+synchronously or asynchronously. You can read and write from offsets. An object
+has a name (or key) and data.
+
+
+.. automethod:: Ioctx.aio_write(object_name, to_write, offset=0, oncomplete=None, onsafe=None)
+.. automethod:: Ioctx.aio_write_full(object_name, to_write, oncomplete=None, onsafe=None)
+.. automethod:: Ioctx.aio_append(object_name, to_append, oncomplete=None, onsafe=None)
+.. automethod:: Ioctx.write(key, data, offset=0)
+.. automethod:: Ioctx.write_full(key, data)
+.. automethod:: Ioctx.aio_flush()
+.. automethod:: Ioctx.set_locator_key(loc_key)
+.. automethod:: Ioctx.aio_read(object_name, length, offset, oncomplete)
+.. automethod:: Ioctx.read(key, length=8192, offset=0)
+.. automethod:: Ioctx.stat(key)
+.. automethod:: Ioctx.trunc(key, size)
+.. automethod:: Ioctx.remove_object(key)
+
+
+Object Extended Attributes
+--------------------------
+
+You may set extended attributes (XATTRs) on an object. You can retrieve a list
+of objects or XATTRs and iterate over them.
+
+.. automethod:: Ioctx.set_xattr(key, xattr_name, xattr_value)
+.. automethod:: Ioctx.get_xattrs(oid)
+.. automethod:: XattrIterator.next()
+.. automethod:: Ioctx.get_xattr(key, xattr_name)
+.. automethod:: Ioctx.rm_xattr(key, xattr_name)
+
+
+
+Object Interface
+================
+
+From an I/O context, you can retrieve a list of objects from a pool and iterate
+over them. The object interface provide makes each object look like a file, and
+you may perform synchronous operations on the  objects. For asynchronous
+operations, you should use the I/O context methods.
+
+.. automethod:: Ioctx.list_objects()
+.. automethod:: ObjectIterator.next()
+.. automethod:: Object.read(length = 1024*1024)
+.. automethod:: Object.write(string_to_write)
+.. automethod:: Object.get_xattrs()
+.. automethod:: Object.get_xattr(xattr_name)
+.. automethod:: Object.set_xattr(xattr_name, xattr_value)
+.. automethod:: Object.rm_xattr(xattr_name)
+.. automethod:: Object.stat()
+.. automethod:: Object.remove()
+
+
+
+
+.. _Getting Started: ../../../start
+.. _Storage Cluster Configuration: ../../configuration
+.. _Getting librados for Python: ../librados-intro#getting-librados-for-python
diff --git a/doc/rados/configuration/auth-config-ref.rst b/doc/rados/configuration/auth-config-ref.rst
new file mode 100644
index 0000000..3beb73b
--- /dev/null
+++ b/doc/rados/configuration/auth-config-ref.rst
@@ -0,0 +1,432 @@
+========================
+ Cephx Config Reference
+========================
+
+The ``cephx`` protocol is enabled by default. Cryptographic authentication has
+some computational costs, though they should generally be quite low.  If the
+network environment connecting your client and server hosts is very safe and 
+you cannot afford authentication, you can turn it off. **This is not generally
+recommended**.
+
+.. note:: If you disable authentication, you are at risk of a man-in-the-middle
+   attack altering your client/server messages, which could lead to disastrous 
+   security effects.
+
+For creating users, see `User Management`_. For details on the architecture
+of Cephx, see `Architecture - High Availability Authentication`_.
+
+
+Deployment Scenarios
+====================
+
+There are two main scenarios for deploying a Ceph cluster, which impact 
+how you initially configure Cephx. Most first time Ceph users use 
+``ceph-deploy`` to create a cluster (easiest). For clusters using
+other deployment tools (e.g., Chef, Juju, Puppet, etc.), you will need
+to use the manual procedures or configure your deployment tool to 
+bootstrap your monitor(s).
+
+ceph-deploy
+-----------
+
+When you deploy a cluster with ``ceph-deploy``, you do not have to bootstrap the
+monitor manually or create the ``client.admin`` user or keyring. The steps you
+execute in the `Storage Cluster Quick Start`_ will invoke ``ceph-deploy`` to do
+that for you.
+
+When you execute ``ceph-deploy new {initial-monitor(s)}``, Ceph will create a
+monitor keyring for you (only used to bootstrap monitors), and it will generate
+an  initial Ceph configuration file for you, which contains the following
+authentication settings, indicating that Ceph enables authentication by
+default::
+
+	auth_cluster_required = cephx
+	auth_service_required = cephx
+	auth_client_required = cephx
+
+When you execute ``ceph-deploy mon create-initial``, Ceph will bootstrap the
+initial monitor(s), retrieve a ``ceph.client.admin.keyring`` file containing the
+key for the  ``client.admin`` user. Additionally, it will also retrieve keyrings
+that give ``ceph-deploy`` and ``ceph-disk`` utilities the ability to prepare and
+activate OSDs and metadata servers.
+
+When you execute ``ceph-deploy admin {node-name}`` (**note:** Ceph must be 
+installed first), you are pushing a Ceph configuration file and the
+``ceph.client.admin.keyring`` to the ``/etc/ceph``  directory of the node. You
+will be able to execute Ceph administrative functions as ``root`` on the command 
+line of that node.
+
+
+Manual Deployment
+-----------------
+
+When you deploy a cluster manually, you have to bootstrap the monitor manually
+and create the ``client.admin`` user and keyring. To bootstrap monitors, follow
+the steps in `Monitor Bootstrapping`_. The steps for monitor bootstrapping are
+the logical steps you must perform when using third party deployment tools like
+Chef, Puppet,  Juju, etc.
+
+
+Enabling/Disabling Cephx
+========================
+
+Enabling Cephx requires that you have deployed keys for your monitors,
+OSDs and metadata servers. If you are simply toggling Cephx on / off, 
+you do not have to repeat the bootstrapping procedures.
+
+
+Enabling Cephx
+--------------
+
+When ``cephx`` is enabled, Ceph will look for the keyring in the default search
+path, which includes ``/etc/ceph/$cluster.$name.keyring``. You can override 
+this location by adding a ``keyring`` option in the ``[global]`` section of 
+your `Ceph configuration`_ file, but this is not recommended.
+
+Execute the following procedures to enable ``cephx`` on a cluster with
+authentication disabled. If you (or your deployment utility) have already
+generated the keys, you may skip the steps related to generating keys.
+
+#. Create a ``client.admin`` key, and save a copy of the key for your client 
+   host::
+
+	ceph auth get-or-create client.admin mon 'allow *' mds 'allow *' osd 'allow *' -o /etc/ceph/ceph.client.admin.keyring
+
+   **Warning:** This will clobber any existing 
+   ``/etc/ceph/client.admin.keyring`` file. Do not perform this step if a 
+   deployment tool has already done it for you. Be careful!
+
+#. Create a keyring for your monitor cluster and generate a monitor 
+   secret key. ::
+
+	ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
+
+#. Copy the monitor keyring into a ``ceph.mon.keyring`` file in every monitor's 
+   ``mon data`` directory. For example, to copy it to ``mon.a`` in cluster ``ceph``, 
+   use the following::
+
+    cp /tmp/ceph.mon.keyring /var/lib/ceph/mon/ceph-a/keyring
+
+#. Generate a secret key for every OSD, where ``{$id}`` is the OSD number::
+
+    ceph auth get-or-create osd.{$id} mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-{$id}/keyring
+
+#. Generate a secret key for every MDS, where ``{$id}`` is the MDS letter::
+
+    ceph auth get-or-create mds.{$id} mon 'allow rwx' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mds/ceph-{$id}/keyring
+
+#. Enable ``cephx`` authentication by setting the following options in the 
+   ``[global]`` section of your `Ceph configuration`_ file::
+
+    auth cluster required = cephx
+    auth service required = cephx
+    auth client required = cephx
+
+
+#. Start or restart the Ceph cluster. See `Operating a Cluster`_ for details. 
+
+For details on bootstrapping a monitor manually, see `Manual Deployment`_.
+
+
+
+Disabling Cephx
+---------------
+
+The following procedure describes how to disable Cephx. If your cluster
+environment is relatively safe, you can offset the computation expense of
+running authentication. **We do not recommend it.** However, it may be easier
+during setup and/or troubleshooting to temporarily disable authentication.
+
+#. Disable ``cephx`` authentication by setting the following options in the 
+   ``[global]`` section of your `Ceph configuration`_ file::
+
+    auth cluster required = none
+    auth service required = none
+    auth client required = none
+
+
+#. Start or restart the Ceph cluster. See `Operating a Cluster`_ for details.
+
+
+Configuration Settings
+======================
+
+Enablement
+----------
+
+
+``auth cluster required``
+
+:Description: If enabled, the Ceph Storage Cluster daemons (i.e., ``ceph-mon``,
+              ``ceph-osd``, and ``ceph-mds``) must authenticate with 
+              each other. Valid settings are ``cephx`` or ``none``.
+
+:Type: String
+:Required: No
+:Default: ``cephx``.
+
+    
+``auth service required``
+
+:Description: If enabled, the Ceph Storage Cluster daemons require Ceph Clients
+              to authenticate with the Ceph Storage Cluster in order to access 
+              Ceph services. Valid settings are ``cephx`` or ``none``.
+
+:Type: String
+:Required: No
+:Default: ``cephx``.
+
+
+``auth client required``
+
+:Description: If enabled, the Ceph Client requires the Ceph Storage Cluster to 
+              authenticate with the Ceph Client. Valid settings are ``cephx`` 
+              or ``none``.
+
+:Type: String
+:Required: No
+:Default: ``cephx``.
+
+
+.. index:: keys; keyring
+
+Keys
+----
+
+When you run Ceph with authentication enabled, ``ceph`` administrative commands
+and Ceph Clients require authentication keys to access the Ceph Storage Cluster.
+
+The most common way to provide these keys to the ``ceph`` administrative
+commands and clients is to include a Ceph keyring under the ``/etc/ceph``
+directory. For Cuttlefish and later releases using ``ceph-deploy``, the filename
+is usually ``ceph.client.admin.keyring`` (or ``$cluster.client.admin.keyring``).
+If you include the keyring under the ``/etc/ceph`` directory, you don't need to
+specify a ``keyring`` entry in your Ceph configuration file.
+
+We recommend copying the Ceph Storage Cluster's keyring file to nodes where you
+will run administrative commands, because it contains the ``client.admin`` key.
+
+You may use ``ceph-deploy admin`` to perform this task. See `Create an Admin
+Host`_ for details. To perform this step manually, execute the following::
+
+	sudo scp {user}@{ceph-cluster-host}:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
+
+.. tip:: Ensure the ``ceph.keyring`` file has appropriate permissions set 
+   (e.g., ``chmod 644``) on your client machine.
+
+You may specify the key itself in the Ceph configuration file using the ``key``
+setting (not recommended), or a path to a keyfile using the ``keyfile`` setting.
+
+
+``keyring``
+
+:Description: The path to the keyring file. 
+:Type: String
+:Required: No
+:Default: ``/etc/ceph/$cluster.$name.keyring,/etc/ceph/$cluster.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin``
+
+
+``keyfile``
+
+:Description: The path to a key file (i.e,. a file containing only the key).
+:Type: String
+:Required: No
+:Default: None
+
+
+``key``
+
+:Description: The key (i.e., the text string of the key itself). Not recommended.
+:Type: String
+:Required: No
+:Default: None
+
+
+Daemon Keyrings
+---------------
+
+Administrative users or deployment tools  (e.g., ``ceph-deploy``) may generate
+daemon keyrings in the same way as generating user keyrings.  By default, Ceph
+stores daemons keyrings inside their data directory. The default keyring
+locations, and the capabilities necessary for the daemon to function, are shown
+below.
+
+``ceph-mon``
+
+:Location: ``$mon_data/keyring``
+:Capabilities: ``mon 'allow *'``
+
+``ceph-osd``
+
+:Location: ``$osd_data/keyring``
+:Capabilities: ``mon 'allow profile osd' osd 'allow *'``
+
+``ceph-mds``
+
+:Location: ``$mds_data/keyring``
+:Capabilities: ``mds 'allow' mon 'allow profile mds' osd 'allow rwx'``
+
+``radosgw``
+
+:Location: ``$rgw_data/keyring``
+:Capabilities: ``mon 'allow rwx' osd 'allow rwx'``
+
+
+.. note:: The monitor keyring (i.e., ``mon.``) contains a key but no 
+   capabilities, and is not part of the cluster ``auth`` database.
+
+The daemon data directory locations default to directories of the form::
+
+  /var/lib/ceph/$type/$cluster-$id
+
+For example, ``osd.12`` would be::
+
+  /var/lib/ceph/osd/ceph-12
+
+You can override these locations, but it is not recommended.
+
+
+.. index:: signatures
+
+Signatures
+----------
+
+In Ceph Bobtail and subsequent versions, we prefer that Ceph authenticate all
+ongoing messages between the entities using the session key set up for that
+initial authentication. However, Argonaut and earlier Ceph daemons do not know
+how to perform ongoing message authentication. To maintain backward
+compatibility (e.g., running both Botbail and Argonaut daemons in the same
+cluster), message signing is **off** by default. If you are running Bobtail or
+later daemons exclusively, configure Ceph to require signatures.
+
+Like other parts of Ceph authentication, Ceph provides fine-grained control so
+you can enable/disable signatures for service messages between the client and
+Ceph, and you can enable/disable signatures for messages between Ceph daemons.
+
+
+``cephx require signatures``
+
+:Description: If set to ``true``, Ceph requires signatures on all message 
+              traffic between the Ceph Client and the Ceph Storage Cluster, and 
+              between daemons comprising the Ceph Storage Cluster. 
+
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``cephx cluster require signatures``
+
+:Description: If set to ``true``, Ceph requires signatures on all message
+              traffic between Ceph daemons comprising the Ceph Storage Cluster. 
+
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``cephx service require signatures``
+
+:Description: If set to ``true``, Ceph requires signatures on all message
+              traffic between Ceph Clients and the Ceph Storage Cluster.
+
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``cephx sign messages``
+
+:Description: If the Ceph version supports message signing, Ceph will sign
+              all messages so they cannot be spoofed.
+
+:Type: Boolean
+:Default: ``true``
+
+
+Time to Live
+------------
+
+``auth service ticket ttl``
+
+:Description: When the Ceph Storage Cluster sends a Ceph Client a ticket for 
+              authentication, the Ceph Storage Cluster assigns the ticket a 
+              time to live.
+
+:Type: Double
+:Default: ``60*60``
+
+
+Backward Compatibility
+======================
+
+For Cuttlefish and earlier releases, see `Cephx`_.
+
+In Ceph Argonaut v0.48 and earlier versions, if you enable ``cephx``
+authentication, Ceph only authenticates the initial communication between the
+client and daemon; Ceph does not authenticate the subsequent messages they send
+to each other, which has security implications. In Ceph Bobtail and subsequent
+versions, Ceph authenticates all ongoing messages between the entities using the
+session key set up for that initial authentication.
+
+We identified a backward compatibility issue between Argonaut v0.48 (and prior
+versions) and Bobtail (and subsequent versions). During testing, if you
+attempted  to use Argonaut (and earlier) daemons with Bobtail (and later)
+daemons, the Argonaut daemons did not know how to perform ongoing message
+authentication, while the Bobtail versions of the daemons insist on
+authenticating message traffic subsequent to the initial
+request/response--making it impossible for Argonaut (and prior) daemons to
+interoperate with Bobtail (and subsequent) daemons.
+
+We have addressed this potential problem by providing a means for Argonaut (and
+prior) systems to interact with Bobtail (and subsequent) systems. Here's how it
+works: by default, the newer systems will not insist on seeing signatures from
+older systems that do not know how to perform them, but will simply accept such
+messages without authenticating them. This new default behavior provides the
+advantage of allowing two different releases to interact. **We do not recommend
+this as a long term solution**. Allowing newer daemons to forgo ongoing
+authentication has the unfortunate security effect that an attacker with control
+of some of your machines or some access to your network can disable session
+security simply by claiming to be unable to sign messages.  
+
+.. note:: Even if you don't actually run any old versions of Ceph, 
+   the attacker may be able to force some messages to be accepted unsigned in the 
+   default scenario. While running Cephx with the default scenario, Ceph still
+   authenticates the initial communication, but you lose desirable session security.
+
+If you know that you are not running older versions of Ceph, or you are willing
+to accept that old servers and new servers will not be able to interoperate, you
+can eliminate this security risk.  If you do so, any Ceph system that is new
+enough to support session authentication and that has Cephx enabled will reject
+unsigned messages.  To preclude new servers from interacting with old servers,
+include the following in the ``[global]`` section of your `Ceph
+configuration`_ file directly below the line that specifies the use of Cephx
+for authentication::
+
+	cephx require signatures = true    ; everywhere possible
+
+You can also selectively require signatures for cluster internal
+communications only, separate from client-facing service::
+
+	cephx cluster require signatures = true    ; for cluster-internal communication
+	cephx service require signatures = true    ; for client-facing service
+
+An option to make a client require signatures from the cluster is not
+yet implemented.
+
+**We recommend migrating all daemons to the newer versions and enabling the 
+foregoing flag** at the nearest practical time so that you may avail yourself 
+of the enhanced authentication.
+
+.. note:: Ceph kernel modules do not support signatures yet.
+
+
+.. _Storage Cluster Quick Start: ../../../start/quick-ceph-deploy/
+.. _Monitor Bootstrapping: ../../../install/manual-deployment#monitor-bootstrapping
+.. _Operating a Cluster: ../../operations/operating
+.. _Manual Deployment: ../../../install/manual-deployment
+.. _Cephx: http://ceph.com/docs/cuttlefish/rados/configuration/auth-config-ref/
+.. _Ceph configuration: ../ceph-conf
+.. _Create an Admin Host: ../../deployment/ceph-deploy-admin
+.. _Architecture - High Availability Authentication: ../../../architecture#high-availability-authentication
+.. _User Management: ../../operations/user-management
\ No newline at end of file
diff --git a/doc/rados/configuration/ceph-conf.rst b/doc/rados/configuration/ceph-conf.rst
new file mode 100644
index 0000000..63edaba
--- /dev/null
+++ b/doc/rados/configuration/ceph-conf.rst
@@ -0,0 +1,528 @@
+==================
+ Configuring Ceph
+==================
+
+When you start the Ceph service, the initialization process activates a series
+of daemons that run in the background. A :term:`Ceph Storage Cluster` runs 
+two types of daemons: 
+
+- :term:`Ceph Monitor` (``ceph-mon``)
+- :term:`Ceph OSD Daemon` (``ceph-osd``)
+
+Ceph Storage Clusters that support the :term:`Ceph Filesystem` run at least one
+:term:`Ceph Metadata Server` (``ceph-mds``). Clusters that support :term:`Ceph
+Object Storage` run Ceph Gateway daemons (``radosgw``). For your convenience,
+each daemon has a series of default values (*i.e.*, many are set by
+``ceph/src/common/config_opts.h``). You may override these settings with a Ceph
+configuration file.
+
+
+.. _ceph-conf-file:
+
+The Configuration File
+======================
+
+When you start a Ceph Storage Cluster, each daemon looks for a Ceph
+configuration file (i.e., ``ceph.conf`` by default) that provides the cluster's
+configuration settings. For manual deployments, you need to create a Ceph
+configuration file. For tools that create configuration files for you (*e.g.*,
+``ceph-deploy``, Chef, etc.), you may use the information contained herein as a
+reference. The Ceph configuration file defines:
+
+- Cluster Identity
+- Authentication settings
+- Cluster membership
+- Host names
+- Host addresses
+- Paths to keyrings
+- Paths to journals
+- Paths to data
+- Other runtime options
+
+The default Ceph configuration file locations in sequential order include:
+
+#. ``$CEPH_CONF`` (*i.e.,* the path following the ``$CEPH_CONF`` 
+   environment variable)
+#. ``-c path/path``  (*i.e.,* the ``-c`` command line argument)
+#. ``/etc/ceph/ceph.conf``
+#. ``~/.ceph/config``
+#. ``./ceph.conf`` (*i.e.,* in the current working directory)
+
+
+The Ceph configuration file uses an *ini* style syntax. You can add comments 
+by preceding comments with a pound sign (#) or a semi-colon (;).  For example:
+
+.. code-block:: ini
+
+	# <--A number (#) sign precedes a comment.
+	; A comment may be anything. 
+	# Comments always follow a semi-colon (;) or a pound (#) on each line.
+	# The end of the line terminates a comment.
+	# We recommend that you provide comments in your configuration file(s).
+
+
+.. _ceph-conf-settings:
+
+Config Sections 
+===============
+
+The configuration file can configure all Ceph daemons in a Ceph Storage Cluster,
+or all Ceph daemons of a particular type. To configure a series of daemons, the
+settings must be included under the processes that will receive the
+configuration as follows: 
+
+``[global]``
+
+:Description: Settings under ``[global]`` affect all daemons in a Ceph Storage
+              Cluster.
+              
+:Example: ``auth supported = cephx``
+
+``[osd]``
+
+:Description: Settings under ``[osd]`` affect all ``ceph-osd`` daemons in 
+              the Ceph Storage Cluster, and override the same setting in 
+              ``[global]``.
+
+:Example: ``osd journal size = 1000``
+
+``[mon]``
+
+:Description: Settings under ``[mon]`` affect all ``ceph-mon`` daemons in 
+              the Ceph Storage Cluster, and override the same setting in 
+              ``[global]``.
+
+:Example: ``mon addr = 10.0.0.101:6789``
+
+
+``[mds]``
+
+:Description: Settings under ``[mds]`` affect all ``ceph-mds`` daemons in 
+              the Ceph Storage Cluster, and override the same setting in 
+              ``[global]``. 
+
+:Example: ``host = myserver01``
+
+``[client]``
+
+:Description: Settings under ``[client]`` affect all Ceph Clients 
+              (e.g., mounted Ceph Filesystems, mounted Ceph Block Devices, 
+              etc.).
+
+:Example: ``log file = /var/log/ceph/radosgw.log``
+
+
+Global settings affect all instances of all daemon in the Ceph Storage Cluster.
+Use the ``[global]`` setting for values that are common for all daemons in the
+Ceph Storage Cluster. You can override each ``[global]`` setting by:
+
+#. Changing the setting in a particular process type 
+   (*e.g.,* ``[osd]``, ``[mon]``, ``[mds]`` ).
+
+#. Changing the setting in a particular process (*e.g.,* ``[osd.1]`` ).
+
+Overriding a global setting affects all child processes, except those that
+you specifically override in a particular daemon. 
+
+A typical global setting involves activating authentication. For example:
+
+.. code-block:: ini
+
+	[global]
+	#Enable authentication between hosts within the cluster.
+	#v 0.54 and earlier
+	auth supported = cephx
+		
+	#v 0.55 and after
+	auth cluster required = cephx
+	auth service required = cephx
+	auth client required = cephx
+
+
+You can specify settings that apply to a particular type of daemon. When you
+specify settings under ``[osd]``, ``[mon]`` or ``[mds]`` without specifying a
+particular instance, the setting will apply to all OSDs, monitors or metadata
+daemons respectively.
+
+A typical daemon-wide setting involves setting journal sizes, filestore
+settings, etc. For example:
+
+.. code-block:: ini
+
+	[osd]
+	osd journal size = 1000
+
+
+You may specify settings for particular instances of a daemon. You may specify
+an instance by entering its type, delimited by a period (.) and by the instance
+ID. The instance ID for a Ceph OSD Daemon is always numeric, but it may be
+alphanumeric for Ceph Monitors and Ceph Metadata Servers.
+
+.. code-block:: ini
+
+	[osd.1]
+	# settings affect osd.1 only.
+		
+	[mon.a]	
+	# settings affect mon.a only.
+		
+	[mds.b]
+	# settings affect mds.b only.
+
+
+If the daemon you specify is a Ceph Gateway client, specify the daemon and the 
+instance, delimited by a period (.). For example:: 
+
+	[client.radosgw.instance-name]
+	# settings affect client.radosgw.instance-name only.
+
+
+
+.. _ceph-metavariables:
+
+Metavariables
+=============
+
+Metavariables simplify Ceph Storage Cluster configuration dramatically. When a
+metavariable is set in a configuration value, Ceph expands the metavariable into
+a concrete value. Metavariables are very powerful when used within the
+``[global]``, ``[osd]``, ``[mon]``, ``[mds]`` or ``[client]`` sections of your 
+configuration file. Ceph metavariables are similar to Bash shell expansion.
+
+Ceph supports the following metavariables: 
+
+
+``$cluster``
+
+:Description: Expands to the Ceph Storage Cluster name. Useful when running 
+              multiple Ceph Storage Clusters on the same hardware.
+
+:Example: ``/etc/ceph/$cluster.keyring``
+:Default: ``ceph``
+
+
+``$type``
+
+:Description: Expands to one of ``mds``, ``osd``, or ``mon``, depending on the 
+              type of the instant daemon.
+
+:Example: ``/var/lib/ceph/$type``
+
+
+``$id``
+
+:Description: Expands to the daemon identifier. For ``osd.0``, this would be 
+              ``0``; for ``mds.a``, it would be ``a``.
+
+:Example: ``/var/lib/ceph/$type/$cluster-$id``
+
+
+``$host``
+
+:Description: Expands to the host name of the instant daemon.
+
+
+``$name``
+
+:Description: Expands to ``$type.$id``.
+:Example: ``/var/run/ceph/$cluster-$name.asok``
+
+
+.. _ceph-conf-common-settings:
+
+Common Settings
+===============
+
+The `Hardware Recommendations`_ section provides some hardware guidelines for
+configuring a Ceph Storage Cluster. It is possible for a single :term:`Ceph
+Node` to run multiple daemons. For example, a single node with multiple drives
+may run one ``ceph-osd`` for each drive. Ideally, you will  have a node for a
+particular type of process. For example, some nodes may run ``ceph-osd``
+daemons, other nodes may run ``ceph-mds`` daemons, and still  other nodes may
+run ``ceph-mon`` daemons.
+
+Each node has a name identified by the ``host`` setting. Monitors also specify
+a network address and port (i.e., domain name or IP address) identified by the
+``addr`` setting.  A basic configuration file will typically specify only
+minimal settings for each instance of monitor daemons. For example:
+
+.. code-block:: ini
+
+	[global]
+	mon_initial_members = ceph1
+	mon_host = 10.0.0.1
+
+
+.. important:: The ``host`` setting is the short name of the node (i.e., not 
+   an fqdn). It is **NOT** an IP address either.  Enter ``hostname -s`` on 
+   the command line to retrieve the name of the node. Do not use ``host`` 
+   settings for anything other than initial monitors unless you are deploying
+   Ceph manually. You **MUST NOT** specify ``host`` under individual daemons 
+   when using deployment tools like ``chef`` or ``ceph-deploy``, as those tools 
+   will enter the appropriate values for you in the cluster map.
+
+
+.. _ceph-network-config:
+
+Networks
+========
+
+See the `Network Configuration Reference`_ for a detailed discussion about
+configuring a network for use with Ceph.
+
+
+Monitors
+========
+
+Ceph production clusters typically deploy with a minimum 3 :term:`Ceph Monitor`
+daemons to ensure high availability should a monitor instance crash. At least
+three (3) monitors ensures that the Paxos algorithm can determine which version
+of the :term:`Ceph Cluster Map` is the most recent from a majority of Ceph
+Monitors in the quorum.
+
+.. note:: You may deploy Ceph with a single monitor, but if the instance fails,
+	       the lack of other monitors may interrupt data service availability.
+
+Ceph Monitors typically listen on port ``6789``. For example:
+
+.. code-block:: ini 
+
+	[mon.a]
+	host = hostName
+	mon addr = 150.140.130.120:6789
+
+By default, Ceph expects that you will store a monitor's data under the
+following path::
+
+	/var/lib/ceph/mon/$cluster-$id
+	
+You or a deployment tool (e.g., ``ceph-deploy``) must create the corresponding
+directory. With metavariables fully  expressed and a cluster named "ceph", the
+foregoing directory would evaluate to:: 
+
+	/var/lib/ceph/mon/ceph-a
+	
+For additional details, see the `Monitor Config Reference`_.
+
+.. _Monitor Config Reference: ../mon-config-ref
+
+
+.. _ceph-osd-config:
+
+
+Authentication
+==============
+
+.. versionadded:: Bobtail 0.56
+
+For Bobtail (v 0.56) and beyond, you should expressly enable or disable
+authentication in the ``[global]`` section of your Ceph configuration file. ::
+
+	auth cluster required = cephx
+	auth service required = cephx
+	auth client required = cephx
+
+Additionally, you should enable message signing. See `Cephx Config Reference`_
+and  `Cephx Authentication`_ for details. 
+
+.. important:: When upgrading, we recommend expressly disabling authentication 
+   first, then perform the upgrade. Once the upgrade is complete, re-enable 
+   authentication.
+
+.. _Cephx Authentication: ../../operations/authentication
+.. _Cephx Config Reference: ../auth-config-ref
+
+
+.. _ceph-monitor-config:
+
+
+OSDs
+====
+
+Ceph production clusters typically deploy :term:`Ceph OSD Daemons` where one node
+has one OSD daemon running a filestore on one storage drive. A typical
+deployment specifies a journal size. For example:
+
+.. code-block:: ini
+
+	[osd]
+	osd journal size = 10000
+		
+	[osd.0]
+	host = {hostname} #manual deployments only.
+
+
+By default, Ceph expects that you will store a Ceph OSD Daemon's data with the 
+following path:: 
+
+	/var/lib/ceph/osd/$cluster-$id
+	
+You or a deployment tool (e.g., ``ceph-deploy``) must create the corresponding
+directory. With metavariables fully  expressed and a cluster named "ceph", the
+foregoing directory would evaluate to:: 
+
+	/var/lib/ceph/osd/ceph-0
+	
+You may override this path using the ``osd data`` setting. We don't recommend 
+changing the default location. Create the default directory on your OSD host.
+
+:: 
+
+	ssh {osd-host}
+	sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}	
+
+The ``osd data`` path ideally leads to a mount point with a hard disk that is
+separate from the hard disk storing and running the operating system and
+daemons. If the OSD is for a disk other than the OS disk, prepare it for
+use with Ceph, and mount it to the directory you just created:: 
+
+	ssh {new-osd-host}
+	sudo mkfs -t {fstype} /dev/{disk}
+	sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
+
+We recommend using the ``xfs`` file system or the ``btrfs`` file system when
+running :command:`mkfs`.
+
+See the `OSD Config Reference`_ for additional configuration details.
+
+
+Heartbeats
+==========
+
+During runtime operations, Ceph OSD Daemons check up on other Ceph OSD Daemons
+and report their  findings to the Ceph Monitor. You do not have to provide any
+settings. However, if you have network latency issues, you may wish to modify
+the settings. 
+
+See `Configuring Monitor/OSD Interaction`_ for additional details.
+
+
+.. _ceph-logging-and-debugging:
+
+Logs / Debugging
+================
+
+Sometimes you may encounter issues with Ceph that require
+modifying logging output and using Ceph's debugging. See `Debugging and
+Logging`_ for details on log rotation.
+
+.. _Debugging and Logging: ../../troubleshooting/log-and-debug
+
+
+Example ceph.conf
+=================
+
+.. literalinclude:: demo-ceph.conf
+   :language: ini
+
+.. _ceph-runtime-config:
+
+Runtime Changes
+===============
+
+Ceph allows you to make changes to the configuration of a ``ceph-osd``,
+``ceph-mon``, or ``ceph-mds`` daemon at runtime. This capability is quite
+useful for increasing/decreasing logging output, enabling/disabling debug
+settings, and even for runtime optimization. The following reflects runtime
+configuration usage::
+
+	ceph tell {daemon-type}.{id or *} injectargs --{name} {value} [--{name} {value}]
+	
+Replace ``{daemon-type}`` with one of ``osd``, ``mon`` or ``mds``. You may apply
+the  runtime setting to all daemons of a particular type with ``*``, or specify
+a specific  daemon's ID (i.e., its number or letter). For example, to increase
+debug logging for a ``ceph-osd`` daemon named ``osd.0``, execute the following::
+
+	ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
+
+In your ``ceph.conf`` file, you may use spaces when specifying a
+setting name.  When specifying a setting name on the command line,
+ensure that you use an underscore or hyphen (``_`` or ``-``) between
+terms (e.g., ``debug osd`` becomes ``--debug-osd``).
+
+
+Viewing a Configuration at Runtime
+==================================
+
+If your Ceph Storage Cluster is running, and you would like to see the
+configuration settings from a running daemon, execute the following:: 
+
+	ceph daemon {daemon-type}.{id} config show | less
+
+If you are on a machine where osd.0 is running, the command would be::
+
+    ceph daemon osd.0 config show | less
+
+
+Running Multiple Clusters
+=========================
+
+With Ceph, you can run multiple Ceph Storage Clusters on the same hardware.
+Running multiple clusters provides a higher level of isolation compared to 
+using different pools on the same cluster with different CRUSH rulesets. A 
+separate cluster will have separate monitor, OSD and metadata server processes. 
+When running Ceph with  default settings, the default cluster name is ``ceph``, 
+which means you would  save your Ceph configuration file with the file name
+``ceph.conf`` in the  ``/etc/ceph`` default directory.
+
+See `ceph-deploy new`_ for details.
+.. _ceph-deploy new:../ceph-deploy-new
+
+When you run multiple clusters, you must name your cluster and save the Ceph
+configuration file with the name of the cluster. For example, a cluster named
+``openstack`` will have a Ceph configuration file with the file name
+``openstack.conf`` in the  ``/etc/ceph`` default directory. 
+
+.. important:: Cluster names must consist of letters a-z and digits 0-9 only.
+
+Separate clusters imply separate data disks and journals, which are not shared
+between clusters. Referring to `Metavariables`_, the ``$cluster``  metavariable
+evaluates to the cluster name (i.e., ``openstack`` in the  foregoing example).
+Various settings use the ``$cluster`` metavariable, including: 
+
+- ``keyring``
+- ``admin socket``
+- ``log file``
+- ``pid file``
+- ``mon data``
+- ``mon cluster log file``
+- ``osd data``
+- ``osd journal``
+- ``mds data``
+- ``rgw data``
+
+See `General Settings`_, `OSD Settings`_, `Monitor Settings`_, `MDS Settings`_, 
+`RGW Settings`_ and `Log Settings`_ for relevant path defaults that use the 
+``$cluster`` metavariable.
+
+.. _General Settings: ../general-config-ref
+.. _OSD Settings: ../osd-config-ref
+.. _Monitor Settings: ../mon-config-ref
+.. _MDS Settings: ../../../cephfs/mds-config-ref
+.. _RGW Settings: ../../../radosgw/config-ref/
+.. _Log Settings: ../../troubleshooting/log-and-debug
+
+
+When creating default directories or files, you should use the cluster
+name at the appropriate places in the path. For example:: 
+
+	sudo mkdir /var/lib/ceph/osd/openstack-0
+	sudo mkdir /var/lib/ceph/mon/openstack-a
+	
+.. important:: When running monitors on the same host, you should use 
+   different ports. By default, monitors use port 6789. If you already 
+   have monitors using port 6789, use a different port for your other cluster(s). 
+
+To invoke a cluster other than the default ``ceph`` cluster, use the 
+``-c {filename}.conf`` option with the ``ceph`` command. For example:: 
+
+	ceph -c {cluster-name}.conf health
+	ceph -c openstack.conf health
+
+
+.. _Hardware Recommendations: ../../../install/hardware-recommendations
+.. _hardware recommendations: ../../../install/hardware-recommendations
+.. _Network Configuration Reference: ../network-config-ref
+.. _OSD Config Reference: ../osd-config-ref
+.. _Configuring Monitor/OSD Interaction: ../mon-osd-interaction
+.. _ceph-deploy new: ../../deployment/ceph-deploy-new#naming-a-cluster
diff --git a/doc/rados/configuration/demo-ceph.conf b/doc/rados/configuration/demo-ceph.conf
new file mode 100644
index 0000000..ba86d53
--- /dev/null
+++ b/doc/rados/configuration/demo-ceph.conf
@@ -0,0 +1,31 @@
+[global]
+fsid = {cluster-id}
+mon initial members = {hostname}[, {hostname}]
+mon host = {ip-address}[, {ip-address}]
+
+#All clusters have a front-side public network.
+#If you have two NICs, you can configure a back side cluster 
+#network for OSD object replication, heart beats, backfilling,
+#recovery, etc.
+public network = {network}[, {network}]
+#cluster network = {network}[, {network}] 
+
+#Clusters require authentication by default.
+auth cluster required = cephx
+auth service required = cephx
+auth client required = cephx
+
+#Choose reasonable numbers for your journals, number of replicas
+#and placement groups.
+osd journal size = {n}
+osd pool default size = {n}  # Write an object n times.
+osd pool default min size = {n} # Allow writing n copy in a degraded state.
+osd pool default pg num = {n}
+osd pool default pgp num = {n}
+
+#Choose a reasonable crush leaf type.
+#0 for a 1-node cluster.
+#1 for a multi node cluster in a single rack
+#2 for a multi node, multi chassis cluster with multiple hosts in a chassis
+#3 for a multi node cluster with hosts across racks, etc.
+osd crush chooseleaf type = {n}
\ No newline at end of file
diff --git a/doc/rados/configuration/filestore-config-ref.rst b/doc/rados/configuration/filestore-config-ref.rst
new file mode 100644
index 0000000..94953c0
--- /dev/null
+++ b/doc/rados/configuration/filestore-config-ref.rst
@@ -0,0 +1,307 @@
+============================
+ Filestore Config Reference
+============================
+
+
+``filestore debug omap check``
+
+:Description: Debugging check on synchronization. Expensive. For debugging only.
+:Type: Boolean
+:Required: No
+:Default: ``0``
+
+
+.. index:: filestore; extended attributes
+
+Extended Attributes
+===================
+
+Extended Attributes (XATTRs) are an important aspect in your configuration. 
+Some file systems have limits on the number of bytes stored in XATTRS. 
+Additionally, in some cases, the filesystem may not be as fast as an alternative
+method of storing XATTRs. The following settings may help improve performance
+by using a method of storing XATTRs that is extrinsic to the underlying filesystem.
+
+Ceph XATTRs are stored as ``inline xattr``, using the XATTRs provided
+by the underlying file system, if it does not impose a size limit. If
+there is a size limit (4KB total on ext4, for instance), some Ceph
+XATTRs will be stored in an key/value database when either the
+``filestore max inline xattr size`` or ``filestore max inline
+xattrs`` threshold is reached.
+
+
+``filestore max inline xattr size``
+
+:Description: The maximimum size of an XATTR stored in the filesystem (i.e., XFS, btrfs, ext4, etc.) per object. Should not be larger than the filesytem can handle.
+:Type: Unsigned 32-bit Integer
+:Required: No
+:Default: ``512``
+
+
+``filestore max inline xattrs``
+
+:Description: The maximum number of XATTRs stored in the fileystem per object.
+:Type: 32-bit Integer
+:Required: No
+:Default: ``2``
+
+.. index:: filestore; synchronization
+
+Synchronization Intervals
+=========================
+
+Periodically, the filestore needs to quiesce writes and synchronize the
+filesystem, which creates a consistent commit point. It can then free journal
+entries up to the commit point. Synchronizing more frequently tends to reduce
+the time required to perform synchronization, and reduces the amount of data
+that needs to remain in the  journal. Less frequent synchronization allows the
+backing filesystem to coalesce  small writes and metadata updates more
+optimally--potentially resulting in more efficient synchronization.
+
+
+``filestore max sync interval``
+
+:Description: The maximum interval in seconds for synchronizing the filestore.
+:Type: Double
+:Required: No
+:Default: ``5``
+
+
+``filestore min sync interval``
+
+:Description: The minimum interval in seconds for synchronizing the filestore.
+:Type: Double
+:Required: No
+:Default: ``.01``
+
+
+.. index:: filestore; flusher
+
+Flusher
+=======
+
+The filestore flusher forces data from large writes to be written out using
+``sync file range`` before the sync in order to (hopefully) reduce the cost of
+the eventual sync. In practice, disabling 'filestore flusher' seems to improve
+performance in some cases.
+
+
+``filestore flusher``
+
+:Description: Enables the filestore flusher.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+.. deprecated:: v.65
+
+``filestore flusher max fds``
+
+:Description: Sets the maximum number of file descriptors for the flusher.
+:Type: Integer
+:Required: No
+:Default: ``512``
+
+.. deprecated:: v.65
+
+``filestore sync flush``
+
+:Description: Enables the synchronization flusher. 
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+.. deprecated:: v.65
+
+``filestore fsync flushes journal data``
+
+:Description: Flush journal data during filesystem synchronization.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+.. index:: filestore; queue
+
+Queue
+=====
+
+The following settings provide limits on the size of filestore queue.
+
+``filestore queue max ops``
+
+:Description: Defines the maximum number of in progress operations the file store accepts before blocking on queuing new operations. 
+:Type: Integer
+:Required: No. Minimal impact on performance.
+:Default: ``500``
+
+
+``filestore queue max bytes``
+
+:Description: The maximum number of bytes for an operation. 
+:Type: Integer
+:Required: No
+:Default: ``100 << 20``
+
+
+``filestore queue committing max ops``
+
+:Description: The maximum number of operations the filestore can commit. 
+:Type: Integer
+:Required: No
+:Default: ``500``
+
+
+``filestore queue committing max bytes``
+
+:Description: The maximum number of bytes the filestore can commit.
+:Type: Integer
+:Required: No
+:Default: ``100 << 20``
+
+
+.. index:: filestore; timeouts
+
+Timeouts
+========
+
+
+``filestore op threads``
+
+:Description: The number of filesystem operation threads that execute in parallel. 
+:Type: Integer
+:Required: No
+:Default: ``2``
+
+
+``filestore op thread timeout``
+
+:Description: The timeout for a filesystem operation thread (in seconds).
+:Type: Integer
+:Required: No
+:Default: ``60``
+
+
+``filestore op thread suicide timeout``
+
+:Description: The timeout for a commit operation before cancelling the commit (in seconds). 
+:Type: Integer
+:Required: No
+:Default: ``180``
+
+
+.. index:: filestore; btrfs
+
+B-Tree Filesystem
+=================
+
+
+``filestore btrfs snap``
+
+:Description: Enable snapshots for a ``btrfs`` filestore.
+:Type: Boolean
+:Required: No. Only used for ``btrfs``.
+:Default: ``true``
+
+
+``filestore btrfs clone range``
+
+:Description: Enable cloning ranges for a ``btrfs`` filestore.
+:Type: Boolean
+:Required: No. Only used for ``btrfs``.
+:Default: ``true``
+
+
+.. index:: filestore; journal
+
+Journal
+=======
+
+
+``filestore journal parallel``
+
+:Description: Enables parallel journaling, default for btrfs.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``filestore journal writeahead``
+
+:Description: Enables writeahead journaling, default for xfs.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``filestore journal trailing``
+
+:Description: Deprecated, never use.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+Misc
+====
+
+
+``filestore merge threshold``
+
+:Description: Min number of files in a subdir before merging into parent
+              NOTE: A negative value means to disable subdir merging
+:Type: Integer
+:Required: No
+:Default: ``10``
+
+
+``filestore split multiple``
+
+:Description:  ``filestore_split_multiple * abs(filestore_merge_threshold) * 16`` 
+               is the maximum number of files in a subdirectory before 
+               splitting into child directories.
+
+:Type: Integer
+:Required: No
+:Default: ``2``
+
+
+``filestore update to``
+
+:Description: Limits filestore auto upgrade to specified version.
+:Type: Integer
+:Required: No
+:Default: ``1000``
+
+
+``filestore blackhole``
+
+:Description: Drop any new transactions on the floor.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``filestore dump file``
+
+:Description: File onto which store transaction dumps.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``filestore kill at``
+
+:Description: inject a failure at the n'th opportunity
+:Type: String
+:Required: No
+:Default: ``false``
+
+
+``filestore fail eio``
+
+:Description: Fail/Crash on eio.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
diff --git a/doc/rados/configuration/filesystem-recommendations.rst b/doc/rados/configuration/filesystem-recommendations.rst
new file mode 100644
index 0000000..e0d558a
--- /dev/null
+++ b/doc/rados/configuration/filesystem-recommendations.rst
@@ -0,0 +1,100 @@
+===========================================
+ Hard Disk and File System Recommendations
+===========================================
+
+.. index:: hard drive preparation
+
+Hard Drive Prep
+===============
+
+Ceph aims for data safety, which means that when the :term:`Ceph Client`
+receives notice that data was written to a storage drive, that data was actually
+written to the storage drive. For old kernels (<2.6.33), disable the write cache
+if the journal is on a raw drive. Newer kernels should work fine.
+
+Use ``hdparm`` to disable write caching on the hard disk::
+
+	sudo hdparm -W 0 /dev/hda 0
+
+In production environments, we recommend running a :term:`Ceph OSD Daemon` with
+separate drives for the operating system and the data. If you run data and an
+operating system on a single disk, we recommend creating a separate partition
+for your data.
+
+.. index:: filesystems
+
+Filesystems
+===========
+
+Ceph OSD Daemons rely heavily upon the stability and performance of the
+underlying filesystem.
+
+Recommended
+-----------
+
+We currently recommend ``XFS`` for production deployments.
+
+We used to recommend ``btrfs`` for testing, development, and any non-critical
+deployments becuase it has the most promising set of features.  However, we
+now plan to avoid using a kernel file system entirely with the new BlueStore
+backend.  ``btrfs`` is still supported and has a comparatively compelling
+set of features, but be mindful of its stability and support status in your
+Linux distribution.
+
+Not recommended
+---------------
+
+We recommend *against* using ``ext4`` due to limitations in the size
+of xattrs it can store, and the problems this causes with the way Ceph
+handles long RADOS object names.  Although these issues will generally
+not surface with Ceph clusters using only short object names (e.g., an
+RBD workload that does not include long RBD image names), other users
+like RGW make extensive use of long object names and can break.
+
+Starting with the Jewel release, the ``ceph-osd`` daemon will refuse
+to start if the configured max object name cannot be safely stored on
+``ext4``.  If the cluster is only being used with short object names
+(e.g., RBD only), you can continue using ``ext4`` by setting the
+following configuration option::
+
+  osd max object name len = 256
+  osd max object namespace len = 64
+
+.. note:: This may result in difficult-to-diagnose errors if you try
+          to use RGW or other librados clients that do not properly
+          handle or politely surface any resulting ENAMETOOLONG
+          errors.
+
+
+Filesystem Background Info
+==========================
+
+The ``XFS``, ``btrfs`` and ``ext4`` file systems provide numerous
+advantages in highly scaled data storage environments when `compared`_
+to ``ext3``.
+
+``XFS``, ``btrfs`` and ``ext4`` are `journaling file systems`_, which means that
+they are more robust when recovering from crashes, power outages, etc. These
+filesystems journal all of the changes they will make before performing writes.
+
+``XFS`` was developed for Silicon Graphics, and is a mature and stable
+filesystem. By contrast, ``btrfs`` is a relatively new file system that aims
+to address the long-standing wishes of system administrators working with 
+large scale data storage environments. ``btrfs`` has some unique features
+and advantages compared to other Linux filesystems. 
+
+``btrfs`` is a `copy-on-write`_ filesystem. It supports file creation
+timestamps and checksums that verify metadata integrity, so it can detect
+bad copies of data and fix them with the good copies. The copy-on-write 
+capability means that ``btrfs`` can support snapshots that are writable.
+``btrfs`` supports transparent compression and other features.
+
+``btrfs`` also incorporates multi-device management into the file system,
+which enables you to support heterogeneous disk storage infrastructure,
+data allocation policies. The community also aims to provide ``fsck``, 
+deduplication, and data encryption support in the future. This compelling 
+list of features makes ``btrfs`` the ideal choice for Ceph clusters.
+
+.. _copy-on-write: http://en.wikipedia.org/wiki/Copy-on-write
+.. _compared: http://en.wikipedia.org/wiki/Comparison_of_file_systems
+.. _journaling file systems: http://en.wikipedia.org/wiki/Journaling_file_system
diff --git a/doc/rados/configuration/general-config-ref.rst b/doc/rados/configuration/general-config-ref.rst
new file mode 100644
index 0000000..ca09ee5
--- /dev/null
+++ b/doc/rados/configuration/general-config-ref.rst
@@ -0,0 +1,66 @@
+==========================
+ General Config Reference
+==========================
+
+
+``fsid``
+
+:Description: The filesystem ID. One per cluster.
+:Type: UUID
+:Required: No. 
+:Default: N/A. Usually generated by deployment tools.
+
+
+``admin socket``
+
+:Description: The socket for executing administrative commands on a daemon, 
+              irrespective of whether Ceph Monitors have established a quorum.
+
+:Type: String
+:Required: No
+:Default: ``/var/run/ceph/$cluster-$name.asok`` 
+
+
+``pid file``
+
+:Description: The file in which the mon, osd or mds will write its
+              PID.  For instance, ``/var/run/$cluster/$type.$id.pid``
+              will create /var/run/ceph/mon.a.pid for the ``mon`` with
+              id ``a`` running in the ``ceph`` cluster. The ``pid
+              file`` is removed when the daemon stops gracefully. If
+              the process is not daemonized (i.e. runs with the ``-f``
+              or ``-d`` option), the ``pid file`` is not created. 
+:Type: String
+:Required: No
+:Default: No
+
+
+``chdir``
+
+:Description: The directory Ceph daemons change to once they are 
+              up and running. Default ``/`` directory recommended.
+
+:Type: String
+:Required: No
+:Default: ``/``
+
+
+``max open files``
+
+:Description: If set, when the :term:`Ceph Storage Cluster` starts, Ceph sets 
+              the  ``max open fds`` at the OS level (i.e., the max # of file 
+              descriptors). It helps prevents Ceph OSD Daemons from running out
+              of file descriptors.
+
+:Type: 64-bit Integer
+:Required: No
+:Default: ``0``
+
+
+``fatal signal handlers``
+
+:Description: If set, we will install signal handlers for SEGV, ABRT, BUS, ILL,
+              FPE, XCPU, XFSZ, SYS signals to generate a useful log message
+
+:Type: Boolean
+:Default: ``true``
diff --git a/doc/rados/configuration/index.rst b/doc/rados/configuration/index.rst
new file mode 100644
index 0000000..8949467
--- /dev/null
+++ b/doc/rados/configuration/index.rst
@@ -0,0 +1,63 @@
+===============
+ Configuration
+===============
+
+Ceph can run with a cluster containing thousands of Object Storage Devices
+(OSDs). A minimal system will have at least two OSDs for data replication. To
+configure OSD clusters, you must provide settings in the configuration file.
+Ceph provides default values for many settings, which you can override in the
+configuration file. Additionally, you can make runtime modification to the
+configuration using command-line utilities.
+
+When Ceph starts, it activates three daemons:
+
+- ``ceph-mon`` (mandatory)
+- ``ceph-osd`` (mandatory)
+- ``ceph-mds`` (mandatory for cephfs only)
+
+Each process, daemon or utility loads the host's configuration file. A process
+may have information about more than one daemon instance (*i.e.,* multiple
+contexts). A daemon or utility only has information about a single daemon
+instance (a single context).
+
+.. note:: Ceph can run on a single host for evaluation purposes.
+
+
+.. raw:: html
+
+	<table cellpadding="10"><colgroup><col width="50%"><col width="50%"></colgroup><tbody valign="top"><tr><td><h3>Configuring the Object Store</h3>
+
+For general object store configuration, refer to the following:
+
+.. toctree::
+   :maxdepth: 1
+
+   Disks and Filesystems <filesystem-recommendations>
+   ceph-conf
+
+
+.. raw:: html 
+
+	</td><td><h3>Reference</h3>
+
+To optimize the performance of your cluster, refer to the following:
+
+.. toctree::
+	:maxdepth: 1
+
+	Network Settings <network-config-ref>
+	Auth Settings <auth-config-ref>
+	Monitor Settings <mon-config-ref>
+	Heartbeat Settings <mon-osd-interaction>
+	OSD Settings <osd-config-ref>
+	Filestore Settings <filestore-config-ref>
+	Key/Value Store Settings <keyvaluestore-config-ref>
+	Journal Settings <journal-ref>
+	Pool, PG & CRUSH Settings <pool-pg-config-ref.rst>
+	Messaging Settings <ms-ref>	
+	General Settings <general-config-ref>
+
+   
+.. raw:: html
+
+	</td></tr></tbody></table>
diff --git a/doc/rados/configuration/journal-ref.rst b/doc/rados/configuration/journal-ref.rst
new file mode 100644
index 0000000..97300f4
--- /dev/null
+++ b/doc/rados/configuration/journal-ref.rst
@@ -0,0 +1,116 @@
+==========================
+ Journal Config Reference
+==========================
+
+.. index:: journal; journal configuration
+
+Ceph OSDs use a journal for two reasons: speed and consistency.  
+
+- **Speed:** The journal enables the Ceph OSD Daemon to commit small writes 
+  quickly. Ceph writes small, random i/o to the journal sequentially, which 
+  tends to speed up bursty workloads by allowing the backing filesystem more 
+  time to coalesce writes. The Ceph OSD Daemon's journal, however, can lead 
+  to spiky performance with short spurts of high-speed writes followed by 
+  periods without any write progress as the filesystem catches up to the 
+  journal.
+
+- **Consistency:** Ceph OSD Daemons require a filesystem interface that 
+  guarantees atomic compound operations. Ceph OSD Daemons write a description 
+  of the operation to the journal and apply the operation to the filesystem. 
+  This enables atomic updates to an object (for example, placement group 
+  metadata). Every few seconds--between ``filestore max sync interval`` and
+  ``filestore min sync interval``--the Ceph OSD Daemon stops writes and 
+  synchronizes the journal with the filesystem, allowing Ceph OSD Daemons to 
+  trim operations from the journal and reuse the space. On failure, Ceph 
+  OSD Daemons replay the journal starting after the last synchronization 
+  operation.
+
+Ceph OSD Daemons support the following journal settings: 
+
+
+``journal dio``
+
+:Description: Enables direct i/o to the journal. Requires ``journal block 
+              align`` set to ``true``.
+              
+:Type: Boolean
+:Required: Yes when using ``aio``.
+:Default: ``true``
+
+
+
+``journal aio``
+
+.. versionchanged:: 0.61 Cuttlefish
+
+:Description: Enables using ``libaio`` for asynchronous writes to the journal. 
+              Requires ``journal dio`` set to ``true``.
+
+:Type: Boolean 
+:Required: No.
+:Default: Version 0.61 and later, ``true``. Version 0.60 and earlier, ``false``.
+
+
+``journal block align``
+
+:Description: Block aligns write operations. Required for ``dio`` and ``aio``.
+:Type: Boolean
+:Required: Yes when using ``dio`` and ``aio``.
+:Default: ``true``
+
+
+``journal max write bytes``
+
+:Description: The maximum number of bytes the journal will write at 
+              any one time.
+
+:Type: Integer
+:Required: No
+:Default: ``10 << 20``
+
+
+``journal max write entries``
+
+:Description: The maximum number of entries the journal will write at 
+              any one time.
+
+:Type: Integer
+:Required: No
+:Default: ``100``
+
+
+``journal queue max ops``
+
+:Description: The maximum number of operations allowed in the queue at 
+              any one time.
+
+:Type: Integer
+:Required: No
+:Default: ``500``
+
+
+``journal queue max bytes``
+
+:Description: The maximum number of bytes allowed in the queue at 
+              any one time.
+
+:Type: Integer
+:Required: No
+:Default: ``10 << 20``
+
+
+``journal align min size``
+
+:Description: Align data payloads greater than the specified minimum.
+:Type: Integer
+:Required: No
+:Default: ``64 << 10``
+
+
+``journal zero on create``
+
+:Description: Causes the file store to overwrite the entire journal with 
+              ``0``'s during ``mkfs``.
+:Type: Boolean
+:Required: No
+:Default: ``false``
diff --git a/doc/rados/configuration/mon-config-ref.rst b/doc/rados/configuration/mon-config-ref.rst
new file mode 100644
index 0000000..d4658cc
--- /dev/null
+++ b/doc/rados/configuration/mon-config-ref.rst
@@ -0,0 +1,879 @@
+==========================
+ Monitor Config Reference
+==========================
+
+Understanding how to configure a :term:`Ceph Monitor` is an important part of
+building a reliable :term:`Ceph Storage Cluster`. **All Ceph Storage Clusters
+have at least one monitor**. A monitor configuration usually remains fairly
+consistent, but you can add, remove or replace a monitor in a cluster. See
+`Adding/Removing a Monitor`_ and `Add/Remove a Monitor (ceph-deploy)`_ for
+details.
+
+
+.. index:: Ceph Monitor; Paxos
+
+Background
+==========
+
+Ceph Monitors maintain a "master copy" of the :term:`cluster map`, which means a
+:term:`Ceph Client` can determine the location of all Ceph Monitors, Ceph OSD
+Daemons, and Ceph Metadata Servers just by connecting to one Ceph Monitor and
+retrieving a current cluster map. Before Ceph Clients can read from or write to
+Ceph OSD Daemons or Ceph Metadata Servers, they must connect to a Ceph Monitor
+first. With a current copy of the cluster map and the CRUSH algorithm, a Ceph
+Client can compute the location for any object. The ability to compute object
+locations allows a Ceph Client to talk directly to Ceph OSD Daemons, which is a
+very important aspect of Ceph's high scalability and performance. See 
+`Scalability and High Availability`_ for additional details.
+
+The primary role of the Ceph Monitor is to maintain a master copy of the cluster
+map. Ceph Monitors also provide authentication and logging services. Ceph
+Monitors write all changes in the monitor services to a single Paxos instance,
+and Paxos writes the changes to a key/value store for strong consistency. Ceph
+Monitors can query the most recent version of the cluster map during sync
+operations. Ceph Monitors leverage the key/value store's snapshots and iterators
+(using leveldb) to perform store-wide synchronization.
+
+.. ditaa:: 
+
+ /-------------\               /-------------\
+ |   Monitor   | Write Changes |    Paxos    |
+ |   cCCC      +-------------->+   cCCC      |
+ |             |               |             |
+ +-------------+               \------+------/
+ |    Auth     |                      |
+ +-------------+                      | Write Changes
+ |    Log      |                      |
+ +-------------+                      v
+ | Monitor Map |               /------+------\
+ +-------------+               | Key / Value |
+ |   OSD Map   |               |    Store    |
+ +-------------+               |  cCCC       |
+ |   PG Map    |               \------+------/
+ +-------------+                      ^
+ |   MDS Map   |                      | Read Changes
+ +-------------+                      |
+ |    cCCC     |*---------------------+
+ \-------------/
+
+
+.. deprecated:: version 0.58
+
+In Ceph versions 0.58 and earlier, Ceph Monitors use a Paxos instance for
+each service and store the map as a file. 
+
+.. index:: Ceph Monitor; cluster map
+
+Cluster Maps
+------------
+
+The cluster map is a composite of maps, including the monitor map, the OSD map,
+the placement group map and the metadata server map. The cluster map tracks a
+number of important things: which processes are ``in`` the Ceph Storage Cluster;
+which processes that are ``in`` the Ceph Storage Cluster are ``up`` and running
+or ``down``; whether, the placement groups are ``active`` or ``inactive``, and
+``clean`` or in some other state; and, other details that reflect the current
+state of the cluster such as the total amount of storage space, and the amount
+of storage used.
+
+When there is a significant change in the state of the cluster--e.g., a Ceph OSD
+Daemon goes down, a placement group falls into a degraded state, etc.--the
+cluster map gets updated to reflect the current state of the cluster.
+Additionally, the Ceph Monitor also maintains a history of the prior states of
+the cluster. The monitor map, OSD map, placement group map and metadata server
+map each maintain a history of their map versions. We call each version an
+"epoch."
+
+When operating your Ceph Storage Cluster, keeping track of these states is an
+important part of your system administration duties. See `Monitoring a Cluster`_
+and `Monitoring OSDs and PGs`_ for additional details.
+
+.. index:: high availability; quorum
+
+Monitor Quorum
+--------------
+
+Our Getting Started section provides a trivial `Ceph configuration file`_ that
+provides for one monitor in the test cluster. A cluster will run fine with a
+single monitor; however, **a single monitor is a single-point-of-failure**. To
+ensure high availability in a production Ceph Storage Cluster, you should run
+Ceph with multiple monitors so that the failure of a single monitor **WILL NOT**
+bring down your entire cluster.
+
+When a Ceph Storage Cluster runs multiple Ceph Monitors for high availability,
+Ceph Monitors use `Paxos`_ to establish consensus about the master cluster map.
+A consensus requires a majority of monitors running to establish a quorum for
+consensus about the cluster map (e.g., 1; 2 out of 3; 3 out of 5; 4 out of 6;
+etc.).
+
+
+.. index:: Ceph Monitor; consistency
+
+Consistency
+-----------
+
+When you add monitor settings to your Ceph configuration file, you need to be
+aware of some of the architectural aspects of Ceph Monitors. **Ceph imposes
+strict consistency requirements** for a Ceph monitor when discovering another
+Ceph Monitor within the cluster. Whereas, Ceph Clients and other Ceph daemons
+use the Ceph configuration file to discover monitors, monitors discover each
+other using the monitor map (monmap), not the Ceph configuration file.
+
+A Ceph Monitor always refers to the local copy of the monmap when discovering
+other Ceph Monitors in the Ceph Storage Cluster. Using the monmap instead of the
+Ceph configuration file avoids errors that could break the cluster (e.g., typos
+in ``ceph.conf`` when specifying a monitor address or port). Since monitors use
+monmaps for discovery and they share monmaps with clients and other Ceph
+daemons, **the monmap provides monitors with a strict guarantee that their
+consensus is valid.**
+
+Strict consistency also applies to updates to the monmap. As with any other
+updates on the Ceph Monitor, changes to the monmap always run through a
+distributed consensus algorithm called `Paxos`_. The Ceph Monitors must agree on
+each update to the monmap, such as adding or removing a Ceph Monitor, to ensure
+that each monitor in the quorum has the same version of the monmap. Updates to
+the monmap are incremental so that Ceph Monitors have the latest agreed upon
+version, and a set of previous versions. Maintaining a history enables a Ceph
+Monitor that has an older version of the monmap to catch up with the current
+state of the Ceph Storage Cluster.
+
+If Ceph Monitors discovered each other through the Ceph configuration file
+instead of through the monmap, it would introduce additional risks because the
+Ceph configuration files aren't updated and distributed automatically. Ceph
+Monitors might inadvertently use an older Ceph configuration file, fail to
+recognize a Ceph Monitor, fall out of a quorum, or develop a situation where
+`Paxos`_ isn't able to determine the current state of the system accurately.
+
+
+.. index:: Ceph Monitor; bootstrapping monitors
+
+Bootstrapping Monitors
+----------------------
+
+In most configuration and deployment cases, tools that deploy Ceph may help
+bootstrap the Ceph Monitors by generating a monitor map for you (e.g.,
+``ceph-deploy``, etc). A Ceph Monitor requires a few explicit
+settings:
+
+- **Filesystem ID**: The ``fsid`` is the unique identifier for your
+  object store. Since you can run multiple clusters on the same
+  hardware, you must specify the unique ID of the object store when
+  bootstrapping a monitor.  Deployment tools usually do this for you
+  (e.g., ``ceph-deploy`` can call a tool like ``uuidgen``), but you
+  may specify the ``fsid`` manually too.
+  
+- **Monitor ID**: A monitor ID is a unique ID assigned to each monitor within 
+  the cluster. It is an alphanumeric value, and by convention the identifier 
+  usually follows an alphabetical increment (e.g., ``a``, ``b``, etc.). This 
+  can be set in a Ceph configuration file (e.g., ``[mon.a]``, ``[mon.b]``, etc.), 
+  by a deployment tool, or using the ``ceph`` commandline.
+
+- **Keys**: The monitor must have secret keys. A deployment tool such as 
+  ``ceph-deploy`` usually does this for you, but you may
+  perform this step manually too. See `Monitor Keyrings`_ for details.
+
+For additional details on bootstrapping, see `Bootstrapping a Monitor`_.
+
+.. index:: Ceph Monitor; configuring monitors
+
+Configuring Monitors
+====================
+
+To apply configuration settings to the entire cluster, enter the configuration
+settings under ``[global]``. To apply configuration settings to all monitors in
+your cluster, enter the configuration settings under ``[mon]``. To apply
+configuration settings to specific monitors, specify the monitor instance 
+(e.g., ``[mon.a]``). By convention, monitor instance names use alpha notation.
+
+.. code-block:: ini
+
+	[global]
+
+	[mon]		
+		
+	[mon.a]
+		
+	[mon.b]
+		
+	[mon.c]
+
+
+Minimum Configuration
+---------------------
+
+The bare minimum monitor settings for a Ceph monitor via the Ceph configuration
+file include a hostname and a monitor address for each monitor. You can configure
+these under ``[mon]`` or under the entry for a specific monitor.
+
+.. code-block:: ini
+
+	[mon]
+		mon host = hostname1,hostname2,hostname3
+		mon addr = 10.0.0.10:6789,10.0.0.11:6789,10.0.0.12:6789
+
+
+.. code-block:: ini
+
+	[mon.a]
+		host = hostname1
+		mon addr = 10.0.0.10:6789
+
+See the `Network Configuration Reference`_ for details.
+
+.. note:: This minimum configuration for monitors assumes that a deployment 
+   tool generates the ``fsid`` and the ``mon.`` key for you.
+
+Once you deploy a Ceph cluster, you **SHOULD NOT** change the IP address of
+the monitors. However, if you decide to change the monitor's IP address, you
+must follow a specific procedure. See `Changing a Monitor's IP Address`_ for
+details.
+
+
+Cluster ID
+----------
+
+Each Ceph Storage Cluster has a unique identifier (``fsid``). If specified, it
+usually appears under the ``[global]`` section of the configuration file.
+Deployment tools usually generate the ``fsid`` and store it in the monitor map,
+so the value may not appear in a configuration file. The ``fsid`` makes it
+possible to run daemons for multiple clusters on the same hardware.
+
+``fsid``
+
+:Description: The cluster ID. One per cluster.
+:Type: UUID
+:Required: Yes.
+:Default: N/A. May be generated by a deployment tool if not specified.
+
+.. note:: Do not set this value if you use a deployment tool that does
+   it for you.
+
+
+.. index:: Ceph Monitor; initial members
+
+Initial Members
+---------------
+
+We recommend running a production Ceph Storage Cluster with at least three Ceph
+Monitors to ensure high availability. When you run multiple monitors, you may
+specify the initial monitors that must be members of the cluster in order to
+establish a quorum. This may reduce the time it takes for your cluster to come
+online.
+
+.. code-block:: ini
+
+	[mon]		
+		mon initial members = a,b,c
+
+
+``mon initial members``
+
+:Description: The IDs of initial monitors in a cluster during startup. If 
+              specified, Ceph requires an odd number of monitors to form an 
+              initial quorum (e.g., 3). 
+
+:Type: String
+:Default: None
+
+.. note:: A *majority* of monitors in your cluster must be able to reach 
+   each other in order to establish a quorum. You can decrease the initial 
+   number of monitors to establish a quorum with this setting.
+
+.. index:: Ceph Monitor; data path
+
+Data
+----
+
+Ceph provides a default path where Ceph Monitors store data. For optimal
+performance in a production Ceph Storage Cluster, we recommend running Ceph
+Monitors on separate hosts and drives from Ceph OSD Daemons. As leveldb is using
+``mmap()`` for writing the data, Ceph Monitors flush their data from memory to disk
+very often, which can interfere with Ceph OSD Daemon workloads if the data
+store is co-located with the OSD Daemons.
+
+In Ceph versions 0.58 and earlier, Ceph Monitors store their data in files. This 
+approach allows users to inspect monitor data with common tools like ``ls``
+and ``cat``. However, it doesn't provide strong consistency.
+
+In Ceph versions 0.59 and later, Ceph Monitors store their data as key/value
+pairs. Ceph Monitors require `ACID`_ transactions. Using a data store prevents
+recovering Ceph Monitors from running corrupted versions through Paxos, and it
+enables multiple modification operations in one single atomic batch, among other
+advantages.
+
+Generally, we do not recommend changing the default data location. If you modify
+the default location, we recommend that you make it uniform across Ceph Monitors
+by setting it in the ``[mon]`` section of the configuration file.
+
+
+``mon data`` 
+
+:Description: The monitor's data location.
+:Type: String
+:Default: ``/var/lib/ceph/mon/$cluster-$id``
+
+
+.. index:: Ceph Storage Cluster; capacity planning, Ceph Monitor; capacity planning
+
+Storage Capacity
+----------------
+
+When a Ceph Storage Cluster gets close to its maximum capacity (i.e., ``mon osd
+full ratio``),  Ceph prevents you from writing to or reading from Ceph OSD
+Daemons as a safety measure to prevent data loss. Therefore, letting a
+production Ceph Storage Cluster approach its full ratio is not a good practice,
+because it sacrifices high availability. The default full ratio is ``.95``, or
+95% of capacity. This a very aggressive setting for a test cluster with a small
+number of OSDs.
+
+.. tip:: When monitoring your cluster, be alert to warnings related to the 
+   ``nearfull`` ratio. This means that a failure of some OSDs could result
+   in a temporary service disruption if one or more OSDs fails. Consider adding
+   more OSDs to increase storage capacity.
+
+A common scenario for test clusters involves a system administrator removing a
+Ceph OSD Daemon from the Ceph Storage Cluster to watch the cluster rebalance;
+then, removing another Ceph OSD Daemon, and so on until the Ceph Storage Cluster
+eventually reaches the full ratio and locks up. We recommend a bit of capacity
+planning even with a test cluster. Planning enables you to gauge how much spare
+capacity you will need in order to maintain high availability. Ideally, you want
+to plan for a series of Ceph OSD Daemon failures where the cluster can recover
+to an ``active + clean`` state without replacing those Ceph OSD Daemons
+immediately. You can run a cluster in an ``active + degraded`` state, but this
+is not ideal for normal operating conditions.
+
+The following diagram depicts a simplistic Ceph Storage Cluster containing 33
+Ceph Nodes with one Ceph OSD Daemon per host, each Ceph OSD Daemon reading from
+and writing to a 3TB drive. So this exemplary Ceph Storage Cluster has a maximum
+actual capacity of 99TB. With a ``mon osd full ratio`` of ``0.95``, if the Ceph
+Storage Cluster falls to 5TB of remaining capacity, the cluster will not allow
+Ceph Clients to read and write data. So the Ceph Storage Cluster's operating
+capacity is 95TB, not 99TB.
+
+.. ditaa::
+
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | Rack 1 |  | Rack 2 |  | Rack 3 |  | Rack 4 |  | Rack 5 |  | Rack 6 |
+ | cCCC   |  | cF00   |  | cCCC   |  | cCCC   |  | cCCC   |  | cCCC   |
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | OSD 1  |  | OSD 7  |  | OSD 13 |  | OSD 19 |  | OSD 25 |  | OSD 31 |
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | OSD 2  |  | OSD 8  |  | OSD 14 |  | OSD 20 |  | OSD 26 |  | OSD 32 |
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | OSD 3  |  | OSD 9  |  | OSD 15 |  | OSD 21 |  | OSD 27 |  | OSD 33 |
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | OSD 4  |  | OSD 10 |  | OSD 16 |  | OSD 22 |  | OSD 28 |  | Spare  | 
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | OSD 5  |  | OSD 11 |  | OSD 17 |  | OSD 23 |  | OSD 29 |  | Spare  |
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+ | OSD 6  |  | OSD 12 |  | OSD 18 |  | OSD 24 |  | OSD 30 |  | Spare  |
+ +--------+  +--------+  +--------+  +--------+  +--------+  +--------+
+
+It is normal in such a cluster for one or two OSDs to fail. A less frequent but
+reasonable scenario involves a rack's router or power supply failing, which
+brings down multiple OSDs simultaneously (e.g., OSDs 7-12). In such a scenario,
+you should still strive for a cluster that can remain operational and achieve an
+``active + clean`` state--even if that means adding a few hosts with additional
+OSDs in short order. If your capacity utilization is too high, you may not lose
+data, but you could still sacrifice data availability while resolving an outage
+within a failure domain if capacity utilization of the cluster exceeds the full
+ratio. For this reason, we recommend at least some rough capacity planning.
+
+Identify two numbers for your cluster:
+
+#. The number of OSDs. 
+#. The total capacity of the cluster 
+
+If you divide the total capacity of your cluster by the number of OSDs in your
+cluster, you will find the mean average capacity of an OSD within your cluster.
+Consider multiplying that number by the number of OSDs you expect will fail
+simultaneously during normal operations (a relatively small number). Finally
+multiply the capacity of the cluster by the full ratio to arrive at a maximum
+operating capacity; then, subtract the number of amount of data from the OSDs
+you expect to fail to arrive at a reasonable full ratio. Repeat the foregoing
+process with a higher number of OSD failures (e.g., a rack of OSDs) to arrive at
+a reasonable number for a near full ratio.
+
+.. code-block:: ini
+
+	[global]
+		
+		mon osd full ratio = .80
+		mon osd nearfull ratio = .70
+
+
+``mon osd full ratio`` 
+
+:Description: The percentage of disk space used before an OSD is 
+              considered ``full``.
+
+:Type: Float
+:Default: ``.95``
+
+
+``mon osd nearfull ratio`` 
+
+:Description: The percentage of disk space used before an OSD is 
+              considered ``nearfull``.
+
+:Type: Float
+:Default: ``.85``
+
+
+.. tip:: If some OSDs are nearfull, but others have plenty of capacity, you 
+         may have a problem with the CRUSH weight for the nearfull OSDs.
+
+.. index:: heartbeat
+
+Heartbeat
+---------
+
+Ceph monitors know about the cluster by requiring reports from each OSD, and by
+receiving reports from OSDs about the status of their neighboring OSDs. Ceph
+provides reasonable default settings for monitor/OSD interaction; however,  you
+may modify them as needed. See `Monitor/OSD Interaction`_ for details.
+
+
+.. index:: Ceph Monitor; leader, Ceph Monitor; provider, Ceph Monitor; requester, Ceph Monitor; synchronization
+
+Monitor Store Synchronization
+-----------------------------
+
+When you run a production cluster with multiple monitors (recommended), each
+monitor checks to see if a neighboring monitor has a more recent version of the
+cluster map (e.g., a map in a neighboring monitor with one or more epoch numbers
+higher than the most current epoch in the map of the instant monitor).
+Periodically, one monitor in the cluster may fall behind the other monitors to
+the point where it must leave the quorum, synchronize to retrieve the most
+current information about the cluster, and then rejoin the quorum. For the
+purposes of synchronization, monitors may assume one of three roles: 
+
+#. **Leader**: The `Leader` is the first monitor to achieve the most recent
+   Paxos version of the cluster map.
+
+#. **Provider**: The `Provider` is a monitor that has the most recent version
+   of the cluster map, but wasn't the first to achieve the most recent version.
+
+#. **Requester:** A `Requester` is a monitor that has fallen behind the leader
+   and must synchronize in order to retrieve the most recent information about
+   the cluster before it can rejoin the quorum.
+
+These roles enable a leader to delegate synchronization duties to a provider,
+which prevents synchronization requests from overloading the leader--improving
+performance. In the following diagram, the requester has learned that it has
+fallen behind the other monitors. The requester asks the leader to synchronize,
+and the leader tells the requester to synchronize with a provider.
+
+
+.. ditaa:: +-----------+          +---------+          +----------+
+           | Requester |          | Leader  |          | Provider |
+           +-----------+          +---------+          +----------+
+                  |                    |                     |
+                  |                    |                     |
+                  | Ask to Synchronize |                     |
+                  |------------------->|                     |
+                  |                    |                     |
+                  |<-------------------|                     |
+                  | Tell Requester to  |                     |
+                  | Sync with Provider |                     |
+                  |                    |                     |
+                  |               Synchronize                |
+                  |--------------------+-------------------->|
+                  |                    |                     |
+                  |<-------------------+---------------------|
+                  |        Send Chunk to Requester           |
+                  |         (repeat as necessary)            |
+                  |    Requester Acks Chuck to Provider      |
+                  |--------------------+-------------------->|
+                  |                    |
+                  |   Sync Complete    |
+                  |    Notification    |
+                  |------------------->|
+                  |                    |
+                  |<-------------------|
+                  |        Ack         |
+                  |                    |
+
+
+Synchronization always occurs when a new monitor joins the cluster. During
+runtime operations, monitors may receive updates to the cluster map at different
+times. This means the leader and provider roles may migrate from one monitor to
+another. If this happens while synchronizing (e.g., a provider falls behind the
+leader), the provider can terminate synchronization with a requester.
+
+Once synchronization is complete, Ceph requires trimming across the cluster. 
+Trimming requires that the placement groups are ``active + clean``.
+
+
+``mon sync trim timeout``
+
+:Description: 
+:Type: Double
+:Default: ``30.0``
+
+
+``mon sync heartbeat timeout``
+
+:Description: 
+:Type: Double
+:Default: ``30.0``
+
+
+``mon sync heartbeat interval``
+
+:Description: 
+:Type: Double
+:Default: ``5.0``
+
+
+``mon sync backoff timeout``
+
+:Description: 
+:Type: Double
+:Default: ``30.0``
+
+
+``mon sync timeout``
+
+:Description: 
+:Type: Double
+:Default: ``30.0``
+
+
+``mon sync max retries``
+
+:Description: 
+:Type: Integer
+:Default: ``5``
+
+
+``mon sync max payload size``
+
+:Description: The maximum size for a sync payload.
+:Type: 32-bit Integer
+:Default: ``1045676``
+
+
+``mon accept timeout`` 
+
+:Description: Number of seconds the Leader will wait for the Requester(s) to 
+              accept a Paxos update. It is also used during the Paxos recovery 
+              phase for similar purposes.
+
+:Type: Float
+:Default: ``10.0`` 
+
+
+``paxos propose interval``
+
+:Description: Gather updates for this time interval before proposing 
+              a map update. 
+
+:Type: Double
+:Default: ``1.0``
+
+
+``paxos min wait``
+
+:Description: The minimum amount of time to gather updates after a period of 
+              inactivity.
+
+:Type: Double
+:Default: ``0.05``
+
+
+``paxos trim tolerance``
+
+:Description: The number of extra proposals tolerated before trimming.
+:Type: Integer
+:Default: ``30``
+
+
+``paxos trim disabled max versions``
+
+:Description: The maximimum number of version allowed to pass without trimming.
+:Type: Integer
+:Default: ``100``
+
+
+``mon lease`` 
+
+:Description: The length (in seconds) of the lease on the monitor's versions.
+:Type: Float
+:Default: ``5``
+
+
+``mon lease renew interval`` 
+
+:Description: The interval (in seconds) for the Leader to renew the other 
+              monitor's leases.
+              
+:Type: Float
+:Default: ``3``
+
+
+``mon lease ack timeout`` 
+
+:Description: The number of seconds the Leader will wait for the Providers to 
+              acknowledge the lease extension.
+              
+:Type: Float
+:Default: ``10.0``
+
+
+``mon min osdmap epochs`` 
+
+:Description: Minimum number of OSD map epochs to keep at all times.
+:Type: 32-bit Integer
+:Default: ``500``
+
+
+``mon max pgmap epochs`` 
+
+:Description: Maximum number of PG map epochs the monitor should keep.
+:Type: 32-bit Integer
+:Default: ``500``
+
+
+``mon max log epochs`` 
+
+:Description: Maximum number of Log epochs the monitor should keep.
+:Type: 32-bit Integer
+:Default: ``500``
+
+
+
+
+Slurp
+-----
+
+In Ceph version 0.58 and earlier, when a Paxos service drifts beyond a given
+number of versions, Ceph triggers the `slurp` mechanism, which establishes a
+connection with the quorum Leader and obtains every single version the Leader
+has for every service that has drifted. In Ceph versions 0.59 and later, slurp
+will not work, because there is a single Paxos instance for all services.
+
+.. deprecated:: 0.58
+
+``paxos max join drift``
+
+:Description: The maximum Paxos iterations before we must first sync the
+              monitor data stores.
+:Type: Integer
+:Default: ``10`` 
+
+
+``mon slurp timeout`` 
+
+:Description: The number of seconds the monitor has to recover using slurp 
+              before the process is aborted and the monitor bootstraps.
+
+:Type: Double
+:Default: ``10.0``
+
+
+``mon slurp bytes``
+
+:Description: Limits the slurp messages to the specified number of bytes.
+:Type: 32-bit Integer
+:Default: ``256 * 1024``
+
+
+.. index:: Ceph Monitor; clock
+
+Clock
+-----
+
+Ceph daemons pass critical messages to each other, which must be processed
+before daemons reach a timeout threshold. If the clocks in Ceph monitors
+are not synchronized, it can lead to a number of anomalies. For example:
+
+- Daemons ignoring received messages (e.g., timestamps outdated)
+- Timeouts triggered too soon/late when a message wasn't received in time.
+
+See `Monitor Store Synchronization`_ and `Slurp`_ for details.
+
+
+.. tip:: You SHOULD install NTP on your Ceph monitor hosts to 
+         ensure that the monitor cluster operates with synchronized clocks.
+
+Clock drift may still be noticeable with NTP even though the discrepancy isn't
+yet harmful. Ceph's clock drift / clock skew warnings may get triggered even 
+though NTP maintains a reasonable level of synchronization. Increasing your 
+clock drift may be tolerable under such circumstances; however, a number of 
+factors such as workload, network latency, configuring overrides to default 
+timeouts and the `Monitor Store Synchronization`_ settings may influence 
+the level of acceptable clock drift without compromising Paxos guarantees.
+
+Ceph provides the following tunable options to allow you to find 
+acceptable values.
+
+
+``clock offset``
+
+:Description: How much to offset the system clock. See ``Clock.cc`` for details.
+:Type: Double
+:Default: ``0``
+
+
+.. deprecated:: 0.58
+
+``mon tick interval`` 
+
+:Description: A monitor's tick interval in seconds. 
+:Type: 32-bit Integer
+:Default: ``5`` 
+
+
+``mon clock drift allowed`` 
+
+:Description: The clock drift in seconds allowed between monitors.
+:Type: Float
+:Default: ``.050``
+
+
+``mon clock drift warn backoff`` 
+
+:Description: Exponential backoff for clock drift warnings
+:Type: Float
+:Default: ``5``
+
+
+``mon timecheck interval``
+
+:Description: The time check interval (clock drift check) in seconds 
+              for the leader.
+
+:Type: Float
+:Default: ``300.0``
+
+
+
+Client
+------
+
+``mon client hunt interval``
+
+:Description: The client will try a new monitor every ``N`` seconds until it
+              establishes a connection.
+              
+:Type: Double
+:Default: ``3.0``
+
+
+``mon client ping interval``
+
+:Description: The client will ping the monitor every ``N`` seconds.
+:Type: Double
+:Default: ``10.0``
+
+
+``mon client max log entries per message``
+
+:Description: The maximum number of log entries a monitor will generate 
+              per client message.
+
+:Type: Integer
+:Default: ``1000``
+
+
+``mon client bytes``
+
+:Description: The amount of client message data allowed in memory (in bytes).
+:Type: 64-bit Integer Unsigned
+:Default: ``100ul << 20``
+
+
+
+Miscellaneous
+=============
+
+
+``mon max osd``
+
+:Description: The maximum number of OSDs allowed in the cluster.
+:Type: 32-bit Integer
+:Default: ``10000``
+
+``mon globalid prealloc`` 
+
+:Description: The number of global IDs to pre-allocate for clients and daemons in the cluster.
+:Type: 32-bit Integer
+:Default: ``100``
+
+``mon sync fs threshold`` 
+
+:Description: Synchronize with the filesystem when writing the specified number of objects. Set it to ``0`` to disable it.
+:Type: 32-bit Integer
+:Default: ``5`` 
+
+``mon subscribe interval`` 
+
+:Description: The refresh interval (in seconds) for subscriptions. The 
+              subscription mechanism enables obtaining the cluster maps 
+              and log information.
+
+:Type: Double
+:Default: ``300`` 
+
+
+``mon stat smooth intervals``
+
+:Description: Ceph will smooth statistics over the last ``N`` PG maps.
+:Type: Integer
+:Default: ``2``
+
+
+``mon probe timeout`` 
+
+:Description: Number of seconds the monitor will wait to find peers before bootstrapping.
+:Type: Double
+:Default: ``2.0``
+
+
+``mon daemon bytes``
+
+:Description: The message memory cap for metadata server and OSD messages (in bytes).
+:Type: 64-bit Integer Unsigned
+:Default: ``400ul << 20``
+
+
+``mon max log entries per event``
+
+:Description: The maximum number of log entries per event. 
+:Type: Integer
+:Default: ``4096``
+
+
+``mon osd prime pg temp``
+
+:Description: Enables or disable priming the PGMap with the previous OSDs when an out
+              OSD comes back into the cluster. With the ``true`` setting the clients
+              will continue to use the previous OSDs until the newly in OSDs as that
+              PG peered.
+:Type: Boolean
+:Default: ``true``
+
+
+``mon osd prime pg temp max time``
+
+:Description: How much time in seconds the monitor should spend trying to prime the
+              PGMap when an out OSD comes back into the cluster.
+:Type: Float
+:Default: ``0.5``
+
+
+
+.. _Paxos: http://en.wikipedia.org/wiki/Paxos_(computer_science)
+.. _Monitor Keyrings: ../../operations/authentication#monitor-keyrings
+.. _Ceph configuration file: ../../../start/quick-start/#add-a-configuration-file
+.. _Network Configuration Reference: ../network-config-ref
+.. _ACID: http://en.wikipedia.org/wiki/ACID
+.. _Adding/Removing a Monitor: ../../operations/add-or-rm-mons
+.. _Add/Remove a Monitor (ceph-deploy): ../../deployment/ceph-deploy-mon
+.. _Monitoring a Cluster: ../../operations/monitoring
+.. _Monitoring OSDs and PGs: ../../operations/monitoring-osd-pg
+.. _Bootstrapping a Monitor: ../../../dev/mon-bootstrap
+.. _Changing a Monitor's IP Address: ../../operations/add-or-rm-mons#changing-a-monitor-s-ip-address
+.. _Monitor/OSD Interaction: ../mon-osd-interaction
+.. _Scalability and High Availability: ../../../architecture#scalability-and-high-availability
diff --git a/doc/rados/configuration/mon-osd-interaction.rst b/doc/rados/configuration/mon-osd-interaction.rst
new file mode 100644
index 0000000..be12236
--- /dev/null
+++ b/doc/rados/configuration/mon-osd-interaction.rst
@@ -0,0 +1,392 @@
+=====================================
+ Configuring Monitor/OSD Interaction
+=====================================
+
+.. index:: heartbeat
+
+After you have completed your initial Ceph configuration, you may deploy and run
+Ceph.  When you execute a command such as ``ceph health`` or ``ceph -s``,  the
+:term:`Ceph Monitor` reports on the current state of the :term:`Ceph Storage
+Cluster`. The Ceph Monitor knows about the Ceph Storage Cluster by requiring
+reports from each :term:`Ceph OSD Daemon`, and by receiving reports from Ceph
+OSD Daemons about the status of their neighboring Ceph OSD Daemons. If the Ceph
+Monitor doesn't receive reports, or if it receives reports of changes in the
+Ceph Storage Cluster, the Ceph Monitor updates the status of the :term:`Ceph
+Cluster Map`.
+
+Ceph provides reasonable default settings for Ceph Monitor/Ceph OSD Daemon
+interaction. However, you may override the defaults. The following sections
+describe how Ceph Monitors and Ceph OSD Daemons interact for the purposes of
+monitoring the Ceph Storage Cluster.
+
+.. index:: heartbeat interval
+
+OSDs Check Heartbeats
+=====================
+
+Each Ceph OSD Daemon checks the heartbeat of other Ceph OSD Daemons every 6
+seconds. You can change the heartbeat interval by adding an ``osd heartbeat
+interval`` setting under the ``[osd]`` section of your Ceph configuration file,
+or by setting the value at runtime. If a neighboring Ceph OSD Daemon doesn't
+show a heartbeat within a 20 second grace period, the Ceph OSD Daemon may
+consider the neighboring Ceph OSD Daemon ``down`` and report it back to a Ceph
+Monitor, which will update the Ceph Cluster Map. You may change this grace
+period by adding an ``osd heartbeat grace`` setting under the ``[osd]`` section
+of your Ceph configuration file, or by setting the value at runtime.
+
+
+.. ditaa:: +---------+          +---------+
+           |  OSD 1  |          |  OSD 2  |
+           +---------+          +---------+
+                |                    |
+                |----+ Heartbeat     |
+                |    | Interval      |
+                |<---+ Exceeded      |
+                |                    |
+                |       Check        |
+                |     Heartbeat      |
+                |------------------->|
+                |                    |
+                |<-------------------|
+                |   Heart Beating    |
+                |                    |
+                |----+ Heartbeat     |
+                |    | Interval      |
+                |<---+ Exceeded      |
+                |                    |
+                |       Check        |
+                |     Heartbeat      |
+                |------------------->|
+                |                    |
+                |----+ Grace         |
+                |    | Period        |
+                |<---+ Exceeded      |
+                |                    |
+                |----+ Mark          |
+                |    | OSD 2         |
+                |<---+ Down          |
+                
+
+.. index:: OSD down report
+
+OSDs Report Down OSDs
+=====================
+
+By default, a Ceph OSD Daemon must report to the Ceph Monitors that another Ceph
+OSD Daemon is ``down`` three times before the Ceph Monitors acknowledge that the
+reported Ceph OSD Daemon is ``down``.  You can change the minimum number of
+``osd down`` reports by adding an ``mon osd min down reports`` setting (``osd
+min down reports`` prior to v0.62) under the ``[mon]`` section of your Ceph
+configuration file, or by setting the value at runtime. By default, only one
+Ceph OSD Daemon is required to report another Ceph OSD Daemon ``down``. You can
+change the number of Ceph OSD Daemones required to report a Ceph OSD Daemon
+``down`` to a Ceph Monitor by adding an ``mon osd min down reporters`` setting
+(``osd min down reporters`` prior to v0.62) under the ``[mon]`` section of your
+Ceph configuration file, or by setting the value at runtime.
+
+
+.. ditaa:: +---------+     +---------+
+           |  OSD 1  |     | Monitor |
+           +---------+     +---------+
+                |               |             
+                | OSD 2 Is Down |
+                |-------------->|
+                |               |             
+                | OSD 2 Is Down |
+                |-------------->|
+                |               |             
+                | OSD 2 Is Down |
+                |-------------->|
+                |               |             
+                |               |----------+ Mark
+                |               |          | OSD 2                
+                |               |<---------+ Down
+
+
+.. index:: peering failure
+
+OSDs Report Peering Failure
+===========================
+
+If a Ceph OSD Daemon cannot peer with any of the Ceph OSD Daemons defined in its
+Ceph configuration file (or the cluster map), it will ping a Ceph Monitor for
+the most recent copy of the cluster map every 30 seconds. You can change the
+Ceph Monitor heartbeat interval by adding an ``osd mon heartbeat interval``
+setting under the ``[osd]`` section of your Ceph configuration file, or by
+setting the value at runtime.
+
+.. ditaa:: +---------+     +---------+     +-------+     +---------+
+           |  OSD 1  |     |  OSD 2  |     | OSD 3 |     | Monitor |
+           +---------+     +---------+     +-------+     +---------+
+                |               |              |              |
+                |  Request To   |              |              |
+                |     Peer      |              |              |               
+                |-------------->|              |              |
+                |<--------------|              |              |
+                |    Peering                   |              |
+                |                              |              |
+                |  Request To                  |              |
+                |     Peer                     |              |               
+                |----------------------------->|              |
+                |                                             |
+                |----+ OSD Monitor                            |
+                |    | Heartbeat                              |
+                |<---+ Interval Exceeded                      |
+                |                                             |
+                |         Failed to Peer with OSD 3           |
+                |-------------------------------------------->|
+                |<--------------------------------------------|
+                |          Receive New Cluster Map            |
+ 
+
+.. index:: OSD status
+
+OSDs Report Their Status
+========================
+
+If an Ceph OSD Daemon doesn't report to a Ceph Monitor, the Ceph Monitor will
+consider the Ceph OSD Daemon ``down`` after the  ``mon osd report timeout``
+elapses. A Ceph OSD Daemon sends a report to a Ceph Monitor when a reportable
+event such as a failure, a change in placement group stats, a change in
+``up_thru`` or when it boots within 5 seconds. You can change the Ceph OSD
+Daemon minimum report interval by adding an ``osd mon report interval min``
+setting under the ``[osd]`` section of your Ceph configuration file, or by
+setting the value at runtime. A Ceph OSD Daemon sends a report to a Ceph 
+Monitor every 120 seconds irrespective of whether any notable changes occur. 
+You can change the Ceph Monitor report interval by adding an ``osd mon report 
+interval max`` setting under the ``[osd]`` section of your Ceph configuration 
+file, or by setting the value at runtime.
+
+
+.. ditaa:: +---------+          +---------+
+           |  OSD 1  |          | Monitor |
+           +---------+          +---------+
+                |                    |
+                |----+ Report Min    |
+                |    | Interval      |
+                |<---+ Exceeded      |
+                |                    |
+                |----+ Reportable    |
+                |    | Event         |
+                |<---+ Occurs        |
+                |                    |
+                |     Report To      |
+                |      Monitor       |
+                |------------------->|
+                |                    |
+                |----+ Report Max    |
+                |    | Interval      |
+                |<---+ Exceeded      |
+                |                    |
+                |     Report To      |
+                |      Monitor       |
+                |------------------->|
+                |                    |
+                |----+ Monitor       |
+                |    | Fails         |
+                |<---+               |
+                                     +----+ Monitor OSD
+                                     |    | Report Timeout
+                                     |<---+ Exceeded
+                                     |
+                                     +----+ Mark
+                                     |    | OSD 1
+                                     |<---+ Down
+
+
+
+
+Configuration Settings
+======================
+
+When modifying heartbeat settings, you should include them in the ``[global]``
+section of your configuration file.
+
+.. index:: monitor heartbeat
+
+Monitor Settings
+----------------
+
+``mon osd min up ratio``
+
+:Description: The minimum ratio of ``up`` Ceph OSD Daemons before Ceph will 
+              mark Ceph OSD Daemons ``down``.
+              
+:Type: Double
+:Default: ``.3``
+
+
+``mon osd min in ratio``
+
+:Description: The minimum ratio of ``in`` Ceph OSD Daemons before Ceph will 
+              mark Ceph OSD Daemons ``out``.
+              
+:Type: Double
+:Default: ``.3``
+
+
+``mon osd laggy halflife``
+
+:Description: The number of seconds laggy estimates will decay.
+:Type: Integer
+:Default: ``60*60``
+
+
+``mon osd laggy weight``
+
+:Description: The weight for new samples in laggy estimation decay.
+:Type: Double
+:Default: ``0.3``
+
+
+``mon osd adjust heartbeat grace``
+
+:Description: If set to ``true``, Ceph will scale based on laggy estimations.
+:Type: Boolean
+:Default: ``true``
+
+
+``mon osd adjust down out interval``
+
+:Description: If set to ``true``, Ceph will scaled based on laggy estimations.
+:Type: Boolean
+:Default: ``true``
+
+
+``mon osd auto mark in`` 
+
+:Description: Ceph will mark any booting Ceph OSD Daemons as ``in`` 
+              the Ceph Storage Cluster.
+
+:Type: Boolean
+:Default: ``false``
+
+
+``mon osd auto mark auto out in`` 
+
+:Description: Ceph will mark booting Ceph OSD Daemons auto marked ``out`` 
+              of the Ceph Storage Cluster as ``in`` the cluster.
+              
+:Type: Boolean
+:Default: ``true`` 
+
+
+``mon osd auto mark new in`` 
+
+:Description: Ceph will mark booting new Ceph OSD Daemons as ``in`` the 
+              Ceph Storage Cluster.
+              
+:Type: Boolean
+:Default: ``true`` 
+
+
+``mon osd down out interval`` 
+
+:Description: The number of seconds Ceph waits before marking a Ceph OSD Daemon
+              ``down`` and ``out`` if it doesn't respond.
+              
+:Type: 32-bit Integer
+:Default: ``300``
+
+
+``mon osd down out subtree limit``
+
+:Description: The smallest :term:`CRUSH` unit type that Ceph will **not**
+              automatically mark out. For instance, if set to ``host`` and if
+              all OSDs of a host are down, Ceph will not automatically mark out
+              these OSDs.
+
+:Type: String
+:Default: ``rack``
+
+
+``mon osd report timeout`` 
+
+:Description: The grace period in seconds before declaring 
+              unresponsive Ceph OSD Daemons ``down``.
+
+:Type: 32-bit Integer
+:Default: ``900``
+
+``mon osd min down reporters`` 
+
+:Description: The minimum number of Ceph OSD Daemons required to report a 
+              ``down`` Ceph OSD Daemon.
+
+:Type: 32-bit Integer
+:Default: ``1``
+
+
+``mon osd min down reports`` 
+
+:Description: The minimum number of times a Ceph OSD Daemon must report 
+              that another Ceph OSD Daemon is ``down``.
+
+:Type: 32-bit Integer
+:Default: ``3`` 
+
+.. index:: OSD hearbeat
+
+OSD Settings
+------------
+
+``osd heartbeat address``
+
+:Description: An Ceph OSD Daemon's network address for heartbeats. 
+:Type: Address
+:Default: The host address.
+
+
+``osd heartbeat interval`` 
+
+:Description: How often an Ceph OSD Daemon pings its peers (in seconds).
+:Type: 32-bit Integer
+:Default: ``6``
+
+
+``osd heartbeat grace`` 
+
+:Description: The elapsed time when a Ceph OSD Daemon hasn't shown a heartbeat
+              that the Ceph Storage Cluster considers it ``down``.
+ 
+:Type: 32-bit Integer
+:Default: ``20``
+
+
+``osd mon heartbeat interval`` 
+
+:Description: How often the Ceph OSD Daemon pings a Ceph Monitor if it has no 
+              Ceph OSD Daemon peers.
+
+:Type: 32-bit Integer
+:Default: ``30`` 
+
+
+``osd mon report interval max`` 
+
+:Description: The maximum time in seconds that a Ceph OSD Daemon can wait before
+              it must report to a Ceph Monitor.
+
+:Type: 32-bit Integer
+:Default: ``120`` 
+
+
+``osd mon report interval min`` 
+
+:Description: The minimum number of seconds a Ceph OSD Daemon may wait
+              from startup or another reportable event before reporting 
+              to a Ceph Monitor.
+
+:Type: 32-bit Integer
+:Default: ``5``
+:Valid Range: Should be less than ``osd mon report interval max`` 
+
+
+``osd mon ack timeout`` 
+
+:Description: The number of seconds to wait for a Ceph Monitor to acknowledge a 
+              request for statistics.
+
+:Type: 32-bit Integer
+:Default: ``30`` 
+
diff --git a/doc/rados/configuration/ms-ref.rst b/doc/rados/configuration/ms-ref.rst
new file mode 100644
index 0000000..d0b1b17
--- /dev/null
+++ b/doc/rados/configuration/ms-ref.rst
@@ -0,0 +1,83 @@
+===========
+ Messaging
+===========
+
+
+``ms tcp nodelay``
+
+:Description: Disables nagle's algorithm on messenger tcp sessions.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``ms initial backoff``
+
+:Description: The initial time to wait before reconnecting on a fault.
+:Type: Double
+:Required: No
+:Default: ``.2``
+
+
+``ms max backoff``
+
+:Description: The maximum time to wait before reconnecting on a fault.
+:Type: Double
+:Required: No
+:Default: ``15.0``
+
+
+``ms nocrc``
+
+:Description: Disables crc on network messages.  May increase performance if cpu limited.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``ms die on bad msg``
+
+:Description: Debug option; do not configure.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``ms dispatch throttle bytes``
+
+:Description: Throttles total size of messages waiting to be dispatched.
+:Type: 64-bit Unsigned Integer
+:Required: No
+:Default: ``100 << 20``
+
+
+``ms bind ipv6``
+
+:Description: Enable if you want your daemons to bind to IPv6 address instead of IPv4 ones. (Not required if you specify a daemon or cluster IP.)
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``ms rwthread stack bytes``
+
+:Description: Debug option for stack size; do not configure.
+:Type: 64-bit Unsigned Integer
+:Required: No
+:Default: ``1024 << 10``
+
+
+``ms tcp read timeout``
+
+:Description: Controls how long (in seconds) the messenger will wait before closing an idle connection.
+:Type: 64-bit Unsigned Integer
+:Required: No
+:Default: ``900``
+
+
+``ms inject socket failures``
+
+:Description: Debug option; do not configure.
+:Type: 64-bit Unsigned Integer
+:Required: No
+:Default: ``0``
diff --git a/doc/rados/configuration/network-config-ref.rst b/doc/rados/configuration/network-config-ref.rst
new file mode 100644
index 0000000..b7b6baa
--- /dev/null
+++ b/doc/rados/configuration/network-config-ref.rst
@@ -0,0 +1,467 @@
+=================================
+ Network Configuration Reference
+=================================
+
+Network configuration is critical for building a high performance  :term:`Ceph
+Storage Cluster`. The Ceph Storage Cluster does not perform  request routing or
+dispatching on behalf of the :term:`Ceph Client`. Instead, Ceph Clients make
+requests directly to Ceph OSD Daemons. Ceph OSD Daemons perform data replication
+on behalf of Ceph Clients, which means replication and other factors impose
+additional loads on Ceph Storage Cluster networks.
+
+Our Quick Start configurations provide a trivial `Ceph configuration file`_ that
+sets monitor IP addresses and daemon host names only. Unless you specify a
+cluster network, Ceph assumes a single "public" network. Ceph functions just
+fine with a public network only, but you may see significant performance
+improvement with a second "cluster" network in a large cluster.
+
+We recommend running a Ceph Storage Cluster with two networks: a public
+(front-side) network and a cluster (back-side) network. To support two networks,
+each :term:`Ceph Node` will need to have more than one NIC. See `Hardware
+Recommendations -  Networks`_ for additional details.
+
+.. ditaa::
+                               +-------------+
+                               | Ceph Client |
+                               +----*--*-----+
+                                    |  ^
+                            Request |  : Response
+                                    v  |
+ /----------------------------------*--*-------------------------------------\
+ |                              Public Network                               |
+ \---*--*------------*--*-------------*--*------------*--*------------*--*---/
+     ^  ^            ^  ^             ^  ^            ^  ^            ^  ^
+     |  |            |  |             |  |            |  |            |  |
+     |  :            |  :             |  :            |  :            |  :
+     v  v            v  v             v  v            v  v            v  v
+ +---*--*---+    +---*--*---+     +---*--*---+    +---*--*---+    +---*--*---+
+ | Ceph MON |    | Ceph MDS |     | Ceph OSD |    | Ceph OSD |    | Ceph OSD |
+ +----------+    +----------+     +---*--*---+    +---*--*---+    +---*--*---+
+                                      ^  ^            ^  ^            ^  ^
+     The cluster network relieves     |  |            |  |            |  |
+     OSD replication and heartbeat    |  :            |  :            |  :
+     traffic from the public network. v  v            v  v            v  v
+ /------------------------------------*--*------------*--*------------*--*---\
+ |   cCCC                      Cluster Network                               |
+ \---------------------------------------------------------------------------/
+
+
+There are several reasons to consider operating two separate networks:
+
+#. **Performance:** Ceph OSD Daemons handle data replication for the Ceph 
+   Clients. When Ceph OSD Daemons replicate data more than once, the network 
+   load between Ceph OSD Daemons easily dwarfs the network load between Ceph 
+   Clients and the Ceph Storage Cluster. This can introduce latency and 
+   create a performance problem. Recovery and rebalancing can 
+   also introduce significant latency on the public network. See 
+   `Scalability and High Availability`_ for additional details on how Ceph 
+   replicates data. See `Monitor / OSD Interaction`_  for details on heartbeat 
+   traffic.
+
+#. **Security**: While most people are generally civil, a very tiny segment of 
+   the population likes to engage in what's known as a Denial of Service (DoS) 
+   attack. When traffic between Ceph OSD Daemons gets disrupted, placement 
+   groups may no longer reflect an ``active + clean`` state, which may prevent 
+   users from reading and writing data. A great way to defeat this type of 
+   attack is to maintain a completely separate cluster network that doesn't 
+   connect directly to the internet. Also, consider using `Message Signatures`_ 
+   to defeat spoofing attacks.
+
+
+IP Tables
+=========
+
+By default, daemons `bind`_ to ports within the ``6800:7300`` range. You may
+configure this range at your discretion. Before configuring your IP tables,
+check the default ``iptables`` configuration.
+
+	sudo iptables -L
+
+Some Linux distributions include rules that reject all inbound requests
+except SSH from all network interfaces. For example:: 
+
+	REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
+
+You will need to delete these rules on both your public and cluster networks
+initially, and replace them with appropriate rules when you are ready to 
+harden the ports on your Ceph Nodes.
+
+
+Monitor IP Tables
+-----------------
+
+Ceph Monitors listen on port ``6789`` by default. Additionally, Ceph Monitors
+always operate on the public network. When you add the rule using the example
+below, make sure you replace ``{iface}`` with the public network interface
+(e.g., ``eth0``, ``eth1``, etc.), ``{ip-address}`` with  the IP address of the
+public network and ``{netmask}`` with the netmask for the public network. ::
+
+   sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
+
+
+MDS IP Tables
+-------------
+
+A :term:`Ceph Metadata Server` listens on the first available port on the public
+network beginning at port 6800. Note that this behavior is not deterministic, so
+if you are running more than one OSD or MDS on the same host, or if you restart
+the daemons within a short window of time, the daemons will bind to higher
+ports. You should open the entire 6800-7300 range by default.  When you add the
+rule using the example below, make sure you replace ``{iface}`` with the public
+network interface (e.g., ``eth0``, ``eth1``, etc.), ``{ip-address}`` with the IP
+address of the public network and ``{netmask}`` with the netmask of the public
+network.
+
+For example:: 
+
+	sudo iptables -A INPUT -i {iface} -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
+
+
+OSD IP Tables
+-------------
+
+By default, Ceph OSD Daemons `bind`_ to the first available ports on a Ceph Node
+beginning at port 6800.  Note that this behavior is not deterministic, so if you
+are running more than one OSD or MDS on the same host, or if you restart the
+daemons within a short window of time, the daemons will bind to higher ports.
+Each Ceph OSD Daemon on a Ceph Node may use up to four ports:
+
+#. One for talking to clients and monitors.
+#. One for sending data to other OSDs.
+#. Two for heartbeating on each interface.
+
+.. ditaa:: 
+              /---------------\
+              |      OSD      |
+              |           +---+----------------+-----------+
+              |           | Clients & Monitors | Heartbeat |
+              |           +---+----------------+-----------+
+              |               |
+              |           +---+----------------+-----------+
+              |           | Data Replication   | Heartbeat |
+              |           +---+----------------+-----------+
+              | cCCC          |
+              \---------------/
+
+When a daemon fails and restarts without letting go of the port, the restarted
+daemon will bind to a new port. You should open the entire 6800-7300 port range
+to handle this possibility.
+
+If you set up separate public and cluster networks, you must add rules for both
+the public network and the cluster network, because clients will connect using
+the public network and other Ceph OSD Daemons will connect using the cluster
+network. When you add the rule using the example below, make sure you replace
+``{iface}`` with the network interface (e.g., ``eth0``, ``eth1``, etc.),
+``{ip-address}`` with the IP address and ``{netmask}`` with the netmask of the
+public or cluster network. For example:: 
+
+	sudo iptables -A INPUT -i {iface}  -m multiport -p tcp -s {ip-address}/{netmask} --dports 6800:7300 -j ACCEPT
+
+.. tip:: If you run Ceph Metadata Servers on the same Ceph Node as the 
+   Ceph OSD Daemons, you can consolidate the public network configuration step. 
+
+
+Ceph Networks
+=============
+
+To configure Ceph networks, you must add a network configuration to the
+``[global]`` section of the configuration file. Our 5-minute Quick Start
+provides a trivial `Ceph configuration file`_ that assumes one public network
+with client and server on the same network and subnet. Ceph functions just fine
+with a public network only. However, Ceph allows you to establish much more
+specific criteria, including multiple IP network and subnet masks for your
+public network. You can also establish a separate cluster network to handle OSD
+heartbeat, object replication and recovery traffic. Don't confuse the IP
+addresses you set in your configuration with the public-facing IP addresses
+network clients may use to access your service. Typical internal IP networks are
+often ``192.168.0.0`` or ``10.0.0.0``.
+
+.. tip:: If you specify more than one IP address and subnet mask for
+   either the public or the cluster network, the subnets within the network
+   must be capable of routing to each other. Additionally, make sure you
+   include each IP address/subnet in your IP tables and open ports for them
+   as necessary.
+
+.. note:: Ceph uses `CIDR`_ notation for subnets (e.g., ``10.0.0.0/24``).
+
+When you've configured your networks, you may restart your cluster or restart
+each daemon. Ceph daemons bind dynamically, so you do not have to restart the
+entire cluster at once if you change your network configuration.
+
+
+Public Network
+--------------
+
+To configure a public network, add the following option to the ``[global]``
+section of your Ceph configuration file. 
+
+.. code-block:: ini
+
+	[global]
+		...
+		public network = {public-network/netmask}
+
+
+Cluster Network
+---------------
+
+If you declare a cluster network, OSDs will route heartbeat, object replication
+and recovery traffic over the cluster network. This may improve performance
+compared to using a single network. To configure a cluster network, add the
+following option to the ``[global]`` section of your Ceph configuration file. 
+
+.. code-block:: ini
+
+	[global]
+		...
+		cluster network = {cluster-network/netmask}
+
+We prefer that the cluster network is **NOT** reachable from the public network
+or the Internet for added security.
+
+
+Ceph Daemons
+============
+
+Ceph has one network configuration requirement that applies to all daemons: the
+Ceph configuration file **MUST** specify the ``host`` for each daemon. Ceph also
+requires that a Ceph configuration file specify the monitor IP address and its
+port.
+
+.. important:: Some deployment tools (e.g., ``ceph-deploy``, Chef) may create a
+   configuration file for you. **DO NOT** set these values if the deployment 
+   tool does it for you.
+
+.. tip:: The ``host`` setting is the short name of the host (i.e., not 
+   an fqdn). It is **NOT** an IP address either.  Enter ``hostname -s`` on 
+   the command line to retrieve the name of the host.
+
+
+.. code-block:: ini
+
+	[mon.a]
+	
+		host = {hostname}
+		mon addr = {ip-address}:6789
+
+	[osd.0]
+		host = {hostname}
+
+
+You do not have to set the host IP address for a daemon. If you have a static IP
+configuration and both public and cluster networks running, the Ceph
+configuration file may specify the IP address of the host for each daemon. To
+set a static IP address for a daemon, the following option(s) should appear in
+the daemon instance sections of your ``ceph.conf`` file.
+
+.. code-block:: ini
+
+	[osd.0]
+		public addr = {host-public-ip-address}
+		cluster addr = {host-cluster-ip-address}
+
+
+.. topic:: One NIC OSD in a Two Network Cluster
+
+   Generally, we do not recommend deploying an OSD host with a single NIC in a 
+   cluster with two networks. However, you may accomplish this by forcing the 
+   OSD host to operate on the public network by adding a ``public addr`` entry
+   to the ``[osd.n]`` section of the Ceph configuration file, where ``n`` 
+   refers to the number of the OSD with one NIC. Additionally, the public
+   network and cluster network must be able to route traffic to each other, 
+   which we don't recommend for security reasons.
+
+
+Network Config Settings
+=======================
+
+Network configuration settings are not required. Ceph assumes a public network
+with all hosts operating on it unless you specifically configure a cluster 
+network.
+
+
+Public Network
+--------------
+
+The public network configuration allows you specifically define IP addresses
+and subnets for the public network. You may specifically assign static IP 
+addresses or override ``public network`` settings using the ``public addr``
+setting for a specific daemon.
+
+``public network``
+
+:Description: The IP address and netmask of the public (front-side) network 
+              (e.g., ``192.168.0.0/24``). Set in ``[global]``. You may specify
+              comma-delimited subnets.
+
+:Type: ``{ip-address}/{netmask} [, {ip-address}/{netmask}]``
+:Required: No
+:Default: N/A
+
+
+``public addr``
+
+:Description: The IP address for the public (front-side) network. 
+              Set for each daemon.
+
+:Type: IP Address
+:Required: No
+:Default: N/A
+
+
+
+Cluster Network
+---------------
+
+The cluster network configuration allows you to declare a cluster network, and
+specifically define IP addresses and subnets for the cluster network. You may
+specifically assign static IP  addresses or override ``cluster network``
+settings using the ``cluster addr`` setting for specific OSD daemons.
+
+
+``cluster network``
+
+:Description: The IP address and netmask of the cluster (back-side) network 
+              (e.g., ``10.0.0.0/24``).  Set in ``[global]``. You may specify
+              comma-delimited subnets.
+
+:Type: ``{ip-address}/{netmask} [, {ip-address}/{netmask}]``
+:Required: No
+:Default: N/A
+
+
+``cluster addr``
+
+:Description: The IP address for the cluster (back-side) network. 
+              Set for each daemon.
+
+:Type: Address
+:Required: No
+:Default: N/A
+
+
+Bind
+----
+
+Bind settings set the default port ranges Ceph OSD and MDS daemons use. The
+default range is ``6800:7300``. Ensure that your `IP Tables`_ configuration
+allows you to use the configured port range.
+
+You may also enable Ceph daemons to bind to IPv6 addresses.
+
+
+``ms bind port min``
+
+:Description: The minimum port number to which an OSD or MDS daemon will bind.
+:Type: 32-bit Integer
+:Default: ``6800``
+:Required: No
+
+
+``ms bind port max``
+
+:Description: The maximum port number to which an OSD or MDS daemon will bind.
+:Type: 32-bit Integer
+:Default: ``7300``
+:Required: No. 
+
+
+``ms bind ipv6``
+
+:Description: Enables Ceph daemons to bind to IPv6 addresses.
+:Type: Boolean
+:Default: ``false``
+:Required: No
+
+
+
+Hosts
+-----
+
+Ceph expects at least one monitor declared in the Ceph configuration file, with
+a ``mon addr`` setting under each declared monitor. Ceph expects a ``host``
+setting under each declared monitor, metadata server and OSD in the Ceph
+configuration file.
+
+
+``mon addr``
+
+:Description: A list of ``{hostname}:{port}`` entries that clients can use to 
+              connect to a Ceph monitor. If not set, Ceph searches ``[mon.*]`` 
+              sections. 
+
+:Type: String
+:Required: No
+:Default: N/A
+
+
+``host``
+
+:Description: The hostname. Use this setting for specific daemon instances 
+              (e.g., ``[osd.0]``).
+
+:Type: String
+:Required: Yes, for daemon instances.
+:Default: ``localhost``
+
+.. tip:: Do not use ``localhost``. To get your host name, execute 
+         ``hostname -s`` on your command line and use the name of your host 
+         (to the first period, not the fully-qualified domain name).
+
+.. important:: You should not specify any value for ``host`` when using a third
+               party deployment system that retrieves the host name for you.
+
+
+
+TCP
+---
+
+Ceph disables TCP buffering by default.
+
+
+``ms tcp nodelay``
+
+:Description: Ceph enables ``ms tcp nodelay`` so that each request is sent 
+              immediately (no buffering). Disabling `Nagle's algorithm`_
+              increases network traffic, which can introduce latency. If you 
+              experience large numbers of small packets, you may try 
+              disabling ``ms tcp nodelay``. 
+
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+
+``ms tcp rcvbuf``
+
+:Description: The size of the socket buffer on the receiving end of a network
+              connection. Disable by default.
+
+:Type: 32-bit Integer
+:Required: No
+:Default: ``0``
+
+
+
+``ms tcp read timeout``
+
+:Description: If a client or daemon makes a request to another Ceph daemon and
+              does not drop an unused connection, the ``ms tcp read timeout`` 
+              defines the connection as idle after the specified number 
+              of seconds.
+
+:Type: Unsigned 64-bit Integer
+:Required: No
+:Default: ``900`` 15 minutes.
+
+
+
+.. _Scalability and High Availability: ../../../architecture#scalability-and-high-availability
+.. _Hardware Recommendations - Networks: ../../../start/hardware-recommendations#networks
+.. _Ceph configuration file: ../../../start/quick-ceph-deploy/#create-a-cluster
+.. _hardware recommendations: ../../../start/hardware-recommendations
+.. _Monitor / OSD Interaction: ../mon-osd-interaction
+.. _Message Signatures: ../auth-config-ref#signatures
+.. _CIDR: http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing
+.. _Nagle's Algorithm: http://en.wikipedia.org/wiki/Nagle's_algorithm
diff --git a/doc/rados/configuration/osd-config-ref.rst b/doc/rados/configuration/osd-config-ref.rst
new file mode 100644
index 0000000..68b140f
--- /dev/null
+++ b/doc/rados/configuration/osd-config-ref.rst
@@ -0,0 +1,724 @@
+======================
+ OSD Config Reference
+======================
+
+.. index:: OSD; configuration
+
+You can configure Ceph OSD Daemons in the Ceph configuration file, but Ceph OSD
+Daemons can use the default values and a very minimal configuration. A minimal
+Ceph OSD Daemon configuration sets ``osd journal size`` and ``host``,  and
+uses default values for nearly everything else.
+
+Ceph OSD Daemons are numerically identified in incremental fashion, beginning
+with ``0`` using the following convention. ::
+
+	osd.0
+	osd.1
+	osd.2
+
+In a configuration file, you may specify settings for all Ceph OSD Daemons in
+the cluster by adding configuration settings to the ``[osd]`` section of your
+configuration file. To add settings directly to a specific Ceph OSD Daemon
+(e.g., ``host``), enter  it in an OSD-specific section of your configuration
+file. For example:
+
+.. code-block:: ini
+	
+	[osd]
+		osd journal size = 1024
+	
+	[osd.0]
+		host = osd-host-a
+		
+	[osd.1]
+		host = osd-host-b
+
+
+.. index:: OSD; config settings
+
+General Settings
+================
+
+The following settings provide an Ceph OSD Daemon's ID, and determine paths to
+data and journals. Ceph deployment scripts typically generate the UUID
+automatically. We **DO NOT** recommend changing the default paths for data or
+journals, as it makes it more problematic to troubleshoot Ceph later. 
+
+The journal size should be at least twice the product of the expected drive
+speed multiplied by ``filestore max sync interval``. However, the most common
+practice is to partition the journal drive (often an SSD), and mount it such
+that Ceph uses the entire partition for the journal.
+
+
+``osd uuid``
+
+:Description: The universally unique identifier (UUID) for the Ceph OSD Daemon.
+:Type: UUID
+:Default: The UUID.
+:Note: The ``osd uuid`` applies to a single Ceph OSD Daemon. The ``fsid`` 
+       applies to the entire cluster.
+
+
+``osd data`` 
+
+:Description: The path to the OSDs data. You must create the directory when 
+              deploying Ceph. You should mount a drive for OSD data at this 
+              mount point. We do not recommend changing the default. 
+
+:Type: String
+:Default: ``/var/lib/ceph/osd/$cluster-$id``
+
+
+``osd max write size`` 
+
+:Description: The maximum size of a write in megabytes.
+:Type: 32-bit Integer
+:Default: ``90``
+
+
+``osd client message size cap`` 
+
+:Description: The largest client data message allowed in memory.
+:Type: 64-bit Integer Unsigned
+:Default: 500MB default. ``500*1024L*1024L`` 
+
+
+``osd class dir`` 
+
+:Description: The class path for RADOS class plug-ins.
+:Type: String
+:Default: ``$libdir/rados-classes``
+
+
+.. index:: OSD; file system
+
+File System Settings
+====================
+Ceph builds and mounts file systems which are used for Ceph OSDs.
+
+``osd mkfs options {fs-type}`` 
+
+:Description: Options used when creating a new Ceph OSD of type {fs-type}.
+
+:Type: String
+:Default for xfs: ``-f -i 2048``
+:Default for other file systems: {empty string}
+
+For example::
+  ``osd mkfs options xfs = -f -d agcount=24``
+
+``osd mount options {fs-type}`` 
+
+:Description: Options used when mounting a Ceph OSD of type {fs-type}.
+
+:Type: String
+:Default for xfs: ``rw,noatime,inode64``
+:Default for other file systems: ``rw, noatime``
+
+For example::
+  ``osd mount options xfs = rw, noatime, inode64, logbufs=8``
+
+
+.. index:: OSD; journal settings
+
+Journal Settings
+================
+
+By default, Ceph expects that you will store an Ceph OSD Daemons journal with
+the  following path::
+
+	/var/lib/ceph/osd/$cluster-$id/journal
+
+Without performance optimization, Ceph stores the journal on the same disk as
+the Ceph OSD Daemons data. An Ceph OSD Daemon optimized for performance may use
+a separate disk to store journal data (e.g., a solid state drive delivers high
+performance journaling).
+
+Ceph's default ``osd journal size`` is 0, so you will need to set this in your
+``ceph.conf`` file. A journal size should find the product of the ``filestore
+max sync interval`` and the expected throughput, and multiply the product by
+two (2)::  
+	  
+	osd journal size = {2 * (expected throughput * filestore max sync interval)}
+
+The expected throughput number should include the expected disk throughput
+(i.e., sustained data transfer rate), and network throughput. For example, 
+a 7200 RPM disk will likely have approximately 100 MB/s. Taking the ``min()``
+of the disk and network throughput should provide a reasonable expected 
+throughput. Some users just start off with a 10GB journal size. For 
+example::
+
+	osd journal size = 10000
+
+
+``osd journal`` 
+
+:Description: The path to the OSD's journal. This may be a path to a file or a
+              block device (such as a partition of an SSD). If it is a file, 
+              you must create the directory to contain it. We recommend using a
+              drive separate from the ``osd data`` drive.
+
+:Type: String
+:Default: ``/var/lib/ceph/osd/$cluster-$id/journal``
+
+
+``osd journal size`` 
+
+:Description: The size of the journal in megabytes. If this is 0, and the 
+              journal is a block device, the entire block device is used. 
+              Since v0.54, this is ignored if the journal is a block device, 
+              and the entire block device is used.
+
+:Type: 32-bit Integer
+:Default: ``5120``
+:Recommended: Begin with 1GB. Should be at least twice the product of the 
+              expected speed multiplied by ``filestore max sync interval``.
+
+
+See `Journal Config Reference`_ for additional details.
+
+
+Monitor OSD Interaction
+=======================
+
+Ceph OSD Daemons check each other's heartbeats and report to monitors
+periodically. Ceph can use default values in many cases. However, if your
+network  has latency issues, you may need to adopt longer intervals. See
+`Configuring Monitor/OSD Interaction`_ for a detailed discussion of heartbeats.
+
+
+Data Placement
+==============
+
+See `Pool & PG Config Reference`_ for details.
+
+
+.. index:: OSD; scrubbing
+
+Scrubbing
+=========
+
+In addition to making multiple copies of objects, Ceph insures data integrity by
+scrubbing placement groups. Ceph scrubbing is analogous to ``fsck`` on the
+object storage layer. For each placement group, Ceph generates a catalog of all
+objects and compares each primary object and its replicas to ensure that no
+objects are missing or mismatched. Light scrubbing (daily) checks the object
+size and attributes.  Deep scrubbing (weekly) reads the data and uses checksums
+to ensure data integrity.
+
+Scrubbing is important for maintaining data integrity, but it can reduce
+performance. You can adjust the following settings to increase or decrease
+scrubbing operations.
+
+
+``osd max scrubs`` 
+
+:Description: The maximum number of simultaneous scrub operations for 
+              a Ceph OSD Daemon.
+
+:Type: 32-bit Int
+:Default: ``1`` 
+
+``osd scrub begin hour``
+
+:Description: The time of day for the lower bound when a scheduled scrub can be
+              performed.
+:Type: Integer in the range of 0 to 24
+:Default: ``0``
+
+
+``osd scrub end hour``
+
+:Description: The time of day for the upper bound when a scheduled scrub can be
+              performed. Along with ``osd scrub begin hour``, they define a time
+              window, in which the scrubs can happen. But a scrub will be performed
+              no matter the time window allows or not, as long as the placement
+              group's scrub interval exceeds ``osd scrub max interval``.
+:Type: Integer in the range of 0 to 24
+:Default: ``24``
+
+``osd scrub thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a scrub thread.
+:Type: 32-bit Integer
+:Default: ``60`` 
+
+
+``osd scrub finalize thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a scrub finalize 
+              thread.
+
+:Type: 32-bit Integer
+:Default: ``60*10``
+
+
+``osd scrub load threshold`` 
+
+:Description: The maximum load. Ceph will not scrub when the system load 
+              (as defined by ``getloadavg()``) is higher than this number. 
+              Default is ``0.5``.
+
+:Type: Float
+:Default: ``0.5`` 
+
+
+``osd scrub min interval`` 
+
+:Description: The maximum interval in seconds for scrubbing the Ceph OSD Daemon
+              when the Ceph Storage Cluster load is low.
+
+:Type: Float
+:Default: Once per day. ``60*60*24``
+
+
+``osd scrub max interval`` 
+
+:Description: The maximum interval in seconds for scrubbing the Ceph OSD Daemon 
+              irrespective of cluster load.
+
+:Type: Float
+:Default: Once per week. ``7*60*60*24``
+
+
+``osd deep scrub interval``
+
+:Description: The interval for "deep" scrubbing (fully reading all data). The 
+              ``osd scrub load threshold`` does not affect this setting.
+
+:Type: Float
+:Default: Once per week.  ``60*60*24*7``
+
+
+``osd scrub interval randomize ratio``
+
+:Description: Add a random delay to ``osd scrub min interval`` when scheduling
+              the next scrub job for a placement group. The delay is a random
+              value less than ``osd scrub min interval`` \*
+              ``osd scrub interval randomized ratio``. So the default setting
+              practically randomly spreads the scrubs out in the allowed time
+              window of ``[1, 1.5]`` \* ``osd scrub min interval``.
+:Type: Float
+:Default: ``0.5``
+
+``osd deep scrub stride``
+
+:Description: Read size when doing a deep scrub.
+:Type: 32-bit Integer
+:Default: 512 KB. ``524288``
+
+
+.. index:: OSD; operations settings
+
+Operations
+==========
+
+Operations settings allow you to configure the number of threads for servicing
+requests. If you set ``osd op threads`` to ``0``, it disables multi-threading.
+By default, Ceph  uses two threads with a 30 second timeout and a 30 second
+complaint time if an operation doesn't complete within those time parameters.
+You can set operations priority weights between client operations and
+recovery operations to ensure optimal performance during recovery.
+
+
+``osd op threads`` 
+
+:Description: The number of threads to service Ceph OSD Daemon operations. 
+              Set to ``0`` to disable it. Increasing the number may increase 
+              the request processing rate.
+
+:Type: 32-bit Integer
+:Default: ``2`` 
+
+
+``osd op queue``
+
+:Description: This sets the type of queue to be used for prioritizing ops
+              in the OSDs. Both queues feature a strict sub-queue which is
+              dequeued before the normal queue. The normal queue is different
+              between implementations. The original PrioritizedQueue (``prio``) uses a
+              token bucket system which when there are sufficient tokens will
+              dequeue high priority queues first. If there are not enough
+              tokens available, queues are dequeued low priority to high priority.
+              The new WeightedPriorityQueue (``wpq``) dequeues all priorities in
+              relation to their priorities to prevent starvation of any queue.
+              WPQ should help in cases where a few OSDs are more overloaded
+              than others. Requires a restart.
+
+:Type: String
+:Valid Choices: prio, wpq
+:Default: ``prio``
+
+
+``osd op queue cut off``
+
+:Description: This selects which priority ops will be sent to the strict
+              queue verses the normal queue. The ``low`` setting sends all
+              replication ops and higher to the strict queue, while the ``high``
+              option sends only replication acknowledgement ops and higher to
+              the strict queue. Setting this to ``high`` should help when a few
+              OSDs in the cluster are very busy especially when combined with
+              ``wpq`` in the ``osd op queue`` setting. OSDs that are very busy
+              handling replication traffic could starve primary client traffic
+              on these OSDs without these settings. Requires a restart.
+
+:Type: String
+:Valid Choices: low, high
+:Default: ``low``
+
+
+``osd client op priority``
+
+:Description: The priority set for client operations. It is relative to 
+              ``osd recovery op priority``.
+
+:Type: 32-bit Integer
+:Default: ``63`` 
+:Valid Range: 1-63
+
+
+``osd recovery op priority``
+
+:Description: The priority set for recovery operations. It is relative to 
+              ``osd client op priority``.
+
+:Type: 32-bit Integer
+:Default: ``10`` 
+:Valid Range: 1-63
+
+
+``osd op thread timeout`` 
+
+:Description: The Ceph OSD Daemon operation thread timeout in seconds.
+:Type: 32-bit Integer
+:Default: ``30`` 
+
+
+``osd op complaint time`` 
+
+:Description: An operation becomes complaint worthy after the specified number
+              of seconds have elapsed.
+
+:Type: Float
+:Default: ``30`` 
+
+
+``osd disk threads`` 
+
+:Description: The number of disk threads, which are used to perform background 
+              disk intensive OSD operations such as scrubbing and snap 
+              trimming.
+
+:Type: 32-bit Integer
+:Default: ``1`` 
+
+``osd disk thread ioprio class``
+
+:Description: Warning: it will only be used if both ``osd disk thread
+	      ioprio class`` and ``osd disk thread ioprio priority`` are
+	      set to a non default value.  Sets the ioprio_set(2) I/O
+	      scheduling ``class`` for the disk thread. Acceptable
+	      values are ``idle``, ``be`` or ``rt``. The ``idle``
+	      class means the disk thread will have lower priority
+	      than any other thread in the OSD. This is useful to slow
+	      down scrubbing on an OSD that is busy handling client
+	      operations. ``be`` is the default and is the same
+	      priority as all other threads in the OSD. ``rt`` means
+	      the disk thread will have precendence over all other
+	      threads in the OSD. This is useful if scrubbing is much
+	      needed and must make progress at the expense of client
+	      operations. Note: Only works with the Linux Kernel CFQ
+	      scheduler.
+:Type: String
+:Default: the empty string
+
+``osd disk thread ioprio priority``
+
+:Description: Warning: it will only be used if both ``osd disk thread
+	      ioprio class`` and ``osd disk thread ioprio priority`` are
+	      set to a non default value. It sets the ioprio_set(2)
+	      I/O scheduling ``priority`` of the disk thread ranging
+	      from 0 (highest) to 7 (lowest). If all OSDs on a given
+	      host were in class ``idle`` and compete for I/O
+	      (i.e. due to controller congestion), it can be used to
+	      lower the disk thread priority of one OSD to 7 so that
+	      another OSD with priority 0 can potentially scrub
+	      faster. Note: Only works with the Linux Kernel CFQ
+	      scheduler.
+:Type: Integer in the range of 0 to 7 or -1 if not to be used.
+:Default: ``-1``
+
+``osd op history size``
+
+:Description: The maximum number of completed operations to track.
+:Type: 32-bit Unsigned Integer
+:Default: ``20``
+
+
+``osd op history duration``
+
+:Description: The oldest completed operation to track.
+:Type: 32-bit Unsigned Integer
+:Default: ``600``
+
+
+``osd op log threshold``
+
+:Description: How many operations logs to display at once.
+:Type: 32-bit Integer
+:Default: ``5``
+
+.. index:: OSD; backfilling
+
+Backfilling
+===========
+
+When you add or remove Ceph OSD Daemons to a cluster, the CRUSH algorithm will
+want to rebalance the cluster by moving placement groups to or from Ceph OSD
+Daemons to restore the balance. The process of migrating placement groups and
+the objects they contain can reduce the cluster's operational performance
+considerably. To maintain operational performance, Ceph performs this migration
+with 'backfilling', which allows Ceph to set backfill operations to a lower
+priority than requests to read or write data. 
+
+
+``osd max backfills``
+
+:Description: The maximum number of backfills allowed to or from a single OSD.
+:Type: 64-bit Unsigned Integer
+:Default: ``10``
+
+
+``osd backfill scan min`` 
+
+:Description: The minimum number of objects per backfill scan.
+
+:Type: 32-bit Integer
+:Default: ``64`` 
+
+
+``osd backfill scan max`` 
+
+:Description: The maximum number of objects per backfill scan.
+
+:Type: 32-bit Integer
+:Default: ``512`` 
+
+
+``osd backfill full ratio``
+
+:Description: Refuse to accept backfill requests when the Ceph OSD Daemon's 
+              full ratio is above this value.
+
+:Type: Float
+:Default: ``0.85``
+
+
+``osd backfill retry interval``
+
+:Description: The number of seconds to wait before retrying backfill requests.
+:Type: Double
+:Default: ``10.0``
+
+.. index:: OSD; osdmap
+
+OSD Map
+=======
+
+OSD maps reflect the OSD daemons operating in the cluster. Over time, the 
+number of map epochs increases. Ceph provides some settings to ensure that
+Ceph performs well as the OSD map grows larger.
+
+
+``osd map dedup``
+
+:Description: Enable removing duplicates in the OSD map. 
+:Type: Boolean
+:Default: ``true``
+
+
+``osd map cache size`` 
+
+:Description: The number of OSD maps to keep cached.
+:Type: 32-bit Integer
+:Default: ``500``
+
+
+``osd map cache bl size``
+
+:Description: The size of the in-memory OSD map cache in OSD daemons. 
+:Type: 32-bit Integer
+:Default: ``50``
+
+
+``osd map cache bl inc size``
+
+:Description: The size of the in-memory OSD map cache incrementals in 
+              OSD daemons.
+
+:Type: 32-bit Integer
+:Default: ``100``
+
+
+``osd map message max`` 
+
+:Description: The maximum map entries allowed per MOSDMap message.
+:Type: 32-bit Integer
+:Default: ``100``
+
+
+
+.. index:: OSD; recovery
+
+Recovery
+========
+
+When the cluster starts or when a Ceph OSD Daemon crashes and restarts, the OSD
+begins peering with other Ceph OSD Daemons before writes can occur.  See
+`Monitoring OSDs and PGs`_ for details.
+
+If a Ceph OSD Daemon crashes and comes back online, usually it will be out of
+sync with other Ceph OSD Daemons containing more recent versions of objects in
+the placement groups. When this happens, the Ceph OSD Daemon goes into recovery
+mode and seeks to get the latest copy of the data and bring its map back up to
+date. Depending upon how long the Ceph OSD Daemon was down, the OSD's objects
+and placement groups may be significantly out of date. Also, if a failure domain
+went down (e.g., a rack), more than one Ceph OSD Daemon may come back online at
+the same time. This can make the recovery process time consuming and resource
+intensive.
+
+To maintain operational performance, Ceph performs recovery with limitations on
+the number recovery requests, threads and object chunk sizes which allows Ceph
+perform well in a degraded state. 
+
+
+``osd recovery delay start`` 
+
+:Description: After peering completes, Ceph will delay for the specified number 
+              of seconds before starting to recover objects.
+
+:Type: Float
+:Default: ``0`` 
+
+
+``osd recovery max active`` 
+
+:Description: The number of active recovery requests per OSD at one time. More 
+              requests will accelerate recovery, but the requests places an 
+              increased load on the cluster.
+
+:Type: 32-bit Integer
+:Default: ``15``
+
+
+``osd recovery max chunk`` 
+
+:Description: The maximum size of a recovered chunk of data to push. 
+:Type: 64-bit Integer Unsigned
+:Default: ``8 << 20`` 
+
+
+``osd recovery threads`` 
+
+:Description: The number of threads for recovering data.
+:Type: 32-bit Integer
+:Default: ``1``
+
+
+``osd recovery thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a recovery thread.
+:Type: 32-bit Integer
+:Default: ``30``
+
+
+``osd recover clone overlap``
+
+:Description: Preserves clone overlap during recovery. Should always be set 
+              to ``true``.
+
+:Type: Boolean
+:Default: ``true``
+
+
+
+Miscellaneous
+=============
+
+
+``osd snap trim thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a snap trim thread.
+:Type: 32-bit Integer
+:Default: ``60*60*1`` 
+
+
+``osd backlog thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a backlog thread.
+:Type: 32-bit Integer
+:Default: ``60*60*1`` 
+
+
+``osd default notify timeout`` 
+
+:Description: The OSD default notification timeout (in seconds).
+:Type: 32-bit Integer Unsigned
+:Default: ``30`` 
+
+
+``osd check for log corruption`` 
+
+:Description: Check log files for corruption. Can be computationally expensive.
+:Type: Boolean
+:Default: ``false`` 
+
+
+``osd remove thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a remove OSD thread.
+:Type: 32-bit Integer
+:Default: ``60*60``
+
+
+``osd command thread timeout`` 
+
+:Description: The maximum time in seconds before timing out a command thread.
+:Type: 32-bit Integer
+:Default: ``10*60`` 
+
+
+``osd command max records`` 
+
+:Description: Limits the number of lost objects to return. 
+:Type: 32-bit Integer
+:Default: ``256`` 
+
+
+``osd auto upgrade tmap`` 
+
+:Description: Uses ``tmap`` for ``omap`` on old objects.
+:Type: Boolean
+:Default: ``true``
+ 
+
+``osd tmapput sets users tmap`` 
+
+:Description: Uses ``tmap`` for debugging only.
+:Type: Boolean
+:Default: ``false`` 
+
+
+``osd preserve trimmed log``
+
+:Description: Preserves trimmed log files, but uses more disk space.
+:Type: Boolean
+:Default: ``false``
+
+
+
+.. _pool: ../../operations/pools
+.. _Configuring Monitor/OSD Interaction: ../mon-osd-interaction
+.. _Monitoring OSDs and PGs: ../../operations/monitoring-osd-pg#peering
+.. _Pool & PG Config Reference: ../pool-pg-config-ref
+.. _Journal Config Reference: ../journal-ref
diff --git a/doc/rados/configuration/pool-pg-config-ref.rst b/doc/rados/configuration/pool-pg-config-ref.rst
new file mode 100644
index 0000000..9f84141
--- /dev/null
+++ b/doc/rados/configuration/pool-pg-config-ref.rst
@@ -0,0 +1,177 @@
+======================================
+ Pool, PG and CRUSH Config Reference
+======================================
+
+.. index:: pools; configuration
+
+When you create pools and set the number of placement groups for the pool, Ceph
+uses default values when you don't specifically override the defaults. **We
+recommend** overridding some of the defaults. Specifically, we recommend setting
+a pool's replica size and overriding the default number of placement groups. You
+can specifically set these values when running `pool`_ commands. You can also
+override the defaults by adding new ones in the ``[global]`` section of  your
+Ceph configuration file. 
+
+
+.. literalinclude:: pool-pg.conf
+   :language: ini
+
+
+
+``mon max pool pg num``
+
+:Description: The maximum number of placement groups per pool.
+:Type: Integer
+:Default: ``65536``
+
+
+``mon pg create interval`` 
+
+:Description: Number of seconds between PG creation in the same 
+              Ceph OSD Daemon.
+
+:Type: Float
+:Default: ``30.0``
+
+
+``mon pg stuck threshold`` 
+
+:Description: Number of seconds after which PGs can be considered as 
+              being stuck.
+
+:Type: 32-bit Integer
+:Default: ``300``
+
+
+``osd pg bits`` 
+
+:Description: Placement group bits per Ceph OSD Daemon.
+:Type: 32-bit Integer
+:Default: ``6`` 
+
+
+``osd pgp bits`` 
+
+:Description: The number of bits per Ceph OSD Daemon for PGPs.
+:Type: 32-bit Integer
+:Default: ``6``
+
+
+``osd crush chooseleaf type``
+
+:Description: The bucket type to use for ``chooseleaf`` in a CRUSH rule. Uses 
+              ordinal rank rather than name.
+
+:Type: 32-bit Integer
+:Default: ``1``. Typically a host containing one or more Ceph OSD Daemons.
+
+
+``osd crush initial weight``
+
+:Description: The initial crush weight for newly added osds into crushmap.
+
+:Type: Double
+:Default: ``the size of newly added osd in TB``. By default, the initial crush
+          weight for the newly added osd is set to its volume size in TB.
+          See `Weighting Bucket Items`_ for details.
+
+
+``osd pool default crush replicated ruleset`` 
+
+:Description: The default CRUSH ruleset to use when creating a replicated pool.
+:Type: 8-bit Integer
+:Default: ``CEPH_DEFAULT_CRUSH_REPLICATED_RULESET``, which means "pick
+          a ruleset with the lowest numerical ID and use that".  This is to
+          make pool creation work in the absence of ruleset 0.
+
+
+``osd pool erasure code stripe width`` 
+
+:Description: Sets the desired size, in bytes, of an object stripe on every
+              erasure coded pools. Every object if size S will be stored as 
+              N stripes and each stripe will be encoded/decoded individually.
+
+:Type: Unsigned 32-bit Integer
+:Default: ``4096`` 
+
+
+``osd pool default size``
+
+:Description: Sets the number of replicas for objects in the pool. The default
+              value is the same as
+              ``ceph osd pool set {pool-name} size {size}``.
+
+:Type: 32-bit Integer
+:Default: ``3``
+
+
+``osd pool default min size``
+
+:Description: Sets the minimum number of written replicas for objects in the 
+             pool in order to acknowledge a write operation to the client. 
+             If minimum is not met, Ceph will not acknowledge the write to the 
+             client. This setting ensures a minimum number of replicas when 
+             operating in ``degraded`` mode.
+
+:Type: 32-bit Integer
+:Default: ``0``, which means no particular minimum. If ``0``, 
+          minimum is ``size - (size / 2)``.
+
+
+``osd pool default pg num`` 
+
+:Description: The default number of placement groups for a pool. The default 
+              value is the same as ``pg_num`` with ``mkpool``.
+
+:Type: 32-bit Integer
+:Default: ``8`` 
+
+
+``osd pool default pgp num`` 
+
+:Description: The default number of placement groups for placement for a pool. 
+              The default value is the same as ``pgp_num`` with ``mkpool``. 
+              PG and PGP should be equal (for now).
+
+:Type: 32-bit Integer
+:Default: ``8``
+
+
+``osd pool default flags``
+
+:Description: The default flags for new pools. 
+:Type: 32-bit Integer
+:Default: ``0``
+
+
+``osd max pgls``
+
+:Description: The maximum number of placement groups to list. A client 
+              requesting a large number can tie up the Ceph OSD Daemon.
+
+:Type: Unsigned 64-bit Integer
+:Default: ``1024``
+:Note: Default should be fine.
+
+
+``osd min pg log entries`` 
+
+:Description: The minimum number of placement group logs to maintain 
+              when trimming log files.
+
+:Type: 32-bit Int Unsigned
+:Default: ``1000``
+
+
+``osd default data pool replay window``
+
+:Description: The time (in seconds) for an OSD to wait for a client to replay
+              a request.
+
+:Type: 32-bit Integer
+:Default: ``45``
+
+
+.. _pool: ../../operations/pools
+.. _Monitoring OSDs and PGs: ../../operations/monitoring-osd-pg#peering
+.. _Weighting Bucket Items: ../../operations/crush-map#weightingbucketitems
diff --git a/doc/rados/configuration/pool-pg.conf b/doc/rados/configuration/pool-pg.conf
new file mode 100644
index 0000000..5f1b3b7
--- /dev/null
+++ b/doc/rados/configuration/pool-pg.conf
@@ -0,0 +1,20 @@
+[global]
+
+	# By default, Ceph makes 3 replicas of objects. If you want to make four 
+	# copies of an object the default value--a primary copy and three replica 
+	# copies--reset the default values as shown in 'osd pool default size'.
+	# If you want to allow Ceph to write a lesser number of copies in a degraded 
+	# state, set 'osd pool default min size' to a number less than the
+	# 'osd pool default size' value.
+
+	osd pool default size = 4  # Write an object 4 times.
+	osd pool default min size = 1 # Allow writing one copy in a degraded state.
+
+	# Ensure you have a realistic number of placement groups. We recommend
+	# approximately 100 per OSD. E.g., total number of OSDs multiplied by 100 
+	# divided by the number of replicas (i.e., osd pool default size). So for
+	# 10 OSDs and osd pool default size = 4, we'd recommend approximately
+	# (100 * 10) / 4 = 250.
+
+	osd pool default pg num = 250
+	osd pool default pgp num = 250
diff --git a/doc/rados/deployment/ceph-deploy-admin.rst b/doc/rados/deployment/ceph-deploy-admin.rst
new file mode 100644
index 0000000..a91f69c
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-admin.rst
@@ -0,0 +1,38 @@
+=============
+ Admin Tasks
+=============
+
+Once you have set up a cluster with ``ceph-deploy``, you may 
+provide the client admin key and the Ceph configuration file
+to another host so that a user on the host may use the ``ceph``
+command line as an administrative user.
+
+
+Create an Admin Host
+====================
+
+To enable a host to execute ceph commands with administrator
+privileges, use the ``admin`` command. ::
+
+	ceph-deploy admin {host-name [host-name]...}
+	
+
+Deploy Config File
+==================
+
+To send an updated copy of the Ceph configuration file to hosts
+in your cluster, use the ``config push`` command. ::
+
+	ceph-deploy config push {host-name [host-name]...}
+	
+.. tip:: With a base name and increment host-naming convention, 
+   it is easy to deploy configuration files via simple scripts
+   (e.g., ``ceph-deploy config hostname{1,2,3,4,5}``).
+
+Retrieve Config File
+====================
+
+To retrieve a copy of the Ceph configuration file from a host
+in your cluster, use the ``config pull`` command. ::
+
+	ceph-deploy config pull {host-name [host-name]...}
diff --git a/doc/rados/deployment/ceph-deploy-install.rst b/doc/rados/deployment/ceph-deploy-install.rst
new file mode 100644
index 0000000..849d68e
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-install.rst
@@ -0,0 +1,46 @@
+====================
+ Package Management
+====================
+
+Install
+=======
+
+To install Ceph packages on your cluster hosts, open a command line on your
+client machine and type the following::
+
+	ceph-deploy install {hostname [hostname] ...}
+
+Without additional arguments, ``ceph-deploy`` will install the most recent
+major release of Ceph to the cluster host(s). To specify a particular package, 
+you may select from the following:
+
+- ``--release <code-name>`` 
+- ``--testing`` 
+- ``--dev <branch-or-tag>`` 
+
+For example:: 
+
+	ceph-deploy install --release cuttlefish hostname1
+	ceph-deploy install --testing hostname2
+	ceph-deploy install --dev wip-some-branch hostname{1,2,3,4,5}
+	
+For additional usage, execute:: 
+
+	ceph-deploy install -h
+
+
+Uninstall
+=========
+
+To uninstall Ceph packages from your cluster hosts, open a terminal on
+your admin host and type the following:: 
+
+	ceph-deploy uninstall {hostname [hostname] ...}
+
+On a Debian or Ubuntu system, you may also::
+
+	ceph-deploy purge {hostname [hostname] ...}
+
+The tool will unininstall ``ceph`` packages from the specified hosts.  Purge
+additionally removes configuration files.
+
diff --git a/doc/rados/deployment/ceph-deploy-keys.rst b/doc/rados/deployment/ceph-deploy-keys.rst
new file mode 100644
index 0000000..6cba154
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-keys.rst
@@ -0,0 +1,32 @@
+=================
+ Keys Management
+=================
+
+
+Gather Keys
+===========
+
+Before you can provision a host to run OSDs or metadata servers, you must gather
+monitor keys and the OSD and MDS bootstrap keyrings. To gather keys, enter the
+following:: 
+
+	ceph-deploy gatherkeys {monitor-host}
+
+
+.. note:: To retrieve the keys, you specify a host that has a
+   Ceph monitor. 
+
+.. note:: If you have specified multiple monitors in the setup of the cluster,
+   make sure, that all monitors are up and running. If the monitors haven't
+   formed quorum, ``ceph-create-keys`` will not finish and the keys aren't 
+   generated.
+
+Forget Keys
+===========
+
+When you are no longer using ``ceph-deploy`` (or if you are recreating a
+cluster),  you should delete the keys in the local directory of your admin host.
+To delete keys, enter the following:: 
+
+	ceph-deploy forgetkeys
+
diff --git a/doc/rados/deployment/ceph-deploy-mds.rst b/doc/rados/deployment/ceph-deploy-mds.rst
new file mode 100644
index 0000000..4447c60
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-mds.rst
@@ -0,0 +1,46 @@
+============================
+ Add/Remove Metadata Server
+============================
+
+With ``ceph-deploy``, adding and removing metadata servers is a simple task. You
+just add or remove one or more metadata servers on the command line with one
+command.
+
+.. important:: You must deploy at least one metadata server to use CephFS.
+    There is experimental support for running multiple metadata servers.
+    Do not run multiple metadata servers in production.
+
+See `MDS Config Reference`_ for details on configuring metadata servers.
+
+
+Add a Metadata Server
+=====================
+
+Once you deploy monitors and OSDs you may deploy the metadata server(s). ::
+
+	ceph-deploy mds create {host-name}[:{daemon-name}] [{host-name}[:{daemon-name}] ...]
+
+You may specify a daemon instance a name (optional) if you would like to run
+multiple daemons on a single server.
+
+
+Remove a Metadata Server
+========================
+
+Coming soon...
+
+.. If you have a metadata server in your cluster that you'd like to remove, you may use 
+.. the ``destroy`` option. :: 
+
+..	ceph-deploy mds destroy {host-name}[:{daemon-name}] [{host-name}[:{daemon-name}] ...]
+
+.. You may specify a daemon instance a name (optional) if you would like to destroy
+.. a particular daemon that runs on a single server with multiple MDS daemons.
+ 
+.. .. note:: Ensure that if you remove a metadata server, the remaining metadata
+   servers will be able to service requests from CephFS clients. If that is not
+   possible, consider adding a metadata server before destroying the metadata 
+   server you would like to take offline.
+
+
+.. _MDS Config Reference: ../../../cephfs/mds-config-ref
diff --git a/doc/rados/deployment/ceph-deploy-mon.rst b/doc/rados/deployment/ceph-deploy-mon.rst
new file mode 100644
index 0000000..bda34fe
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-mon.rst
@@ -0,0 +1,56 @@
+=====================
+ Add/Remove Monitors
+=====================
+
+With ``ceph-deploy``, adding and removing monitors is a simple task. You just
+add or remove one or more monitors on the command line with one command. Before
+``ceph-deploy``,  the process of `adding and removing monitors`_ involved
+numerous manual steps. Using ``ceph-deploy`` imposes a restriction:  **you may
+only install one monitor per host.**
+
+.. note:: We do not recommend comingling monitors and OSDs on 
+   the same host.
+
+For high availability, you should run a production Ceph cluster with **AT
+LEAST** three monitors. Ceph uses the Paxos algorithm, which requires a
+consensus among the majority of monitors in a quorum. With Paxos, the monitors
+cannot determine a majority for establishing a quorum with only two monitors. A
+majority of monitors must be counted as such: 1:1, 2:3, 3:4, 3:5, 4:6, etc.
+
+See `Monitor Config Reference`_ for details on configuring monitors.
+
+
+Add a Monitor
+=============
+
+Once you create a cluster and install Ceph packages to the monitor host(s), you
+may deploy the monitor(s) to the monitor host(s). When using ``ceph-deploy``,
+the tool enforces a single monitor per host. ::
+
+	ceph-deploy mon create {host-name [host-name]...}
+
+
+.. note:: Ensure that you add monitors such that they may arrive at a consensus
+   among a majority of monitors, otherwise other steps (like ``ceph-deploy gatherkeys``)
+   will fail.
+
+.. note::  When adding a monitor on a host that was not in hosts initially defined
+   with the ``ceph-deploy new`` command, a ``public network`` statement needs
+   to be added to the ceph.conf file.
+
+Remove a Monitor
+================
+
+If you have a monitor in your cluster that you'd like to remove, you may use 
+the ``destroy`` option. :: 
+
+	ceph-deploy mon destroy {host-name [host-name]...}
+
+
+.. note:: Ensure that if you remove a monitor, the remaining monitors will be 
+   able to establish a consensus. If that is not possible, consider adding a 
+   monitor before removing the monitor you would like to take offline.
+
+
+.. _adding and removing monitors: ../../operations/add-or-rm-mons
+.. _Monitor Config Reference: ../../configuration/mon-config-ref
diff --git a/doc/rados/deployment/ceph-deploy-new.rst b/doc/rados/deployment/ceph-deploy-new.rst
new file mode 100644
index 0000000..039ca05
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-new.rst
@@ -0,0 +1,66 @@
+==================
+ Create a Cluster
+==================
+
+The first step in using Ceph with ``ceph-deploy`` is to create a new Ceph
+cluster. A new Ceph cluster has:
+
+- A Ceph configuration file, and
+- A monitor keyring.
+
+The Ceph configuration file consists of at least:
+
+- Its own filesystem ID (``fsid``)
+- The initial monitor(s) hostname(s), and
+- The initial monitor(s) and IP address(es).
+
+For additional details, see the `Monitor Configuration Reference`_.
+
+The ``ceph-deploy`` tool also creates a monitor keyring and populates it with a
+``[mon.]`` key.  For additional details, see the `Cephx Guide`_.
+
+
+Usage
+-----
+
+To create a cluster with ``ceph-deploy``, use the ``new`` command and specify
+the host(s) that will be initial members of the monitor quorum. ::
+
+	ceph-deploy new {host [host], ...}
+
+For example::
+
+	ceph-deploy new mon1.foo.com
+	ceph-deploy new mon{1,2,3}
+
+The ``ceph-deploy`` utility will use DNS to resolve hostnames to IP
+addresses.  The monitors will be named using the first component of
+the name (e.g., ``mon1`` above).  It will add the specified host names
+to the Ceph configuration file. For additional details, execute::
+
+	ceph-deploy new -h
+
+
+Naming a Cluster
+----------------
+
+By default, Ceph clusters have a cluster name of ``ceph``. You can specify
+a cluster name if you want to run multiple clusters on the same hardware. For
+example, if you want to optimize a cluster for use with block devices, and
+another for use with the gateway, you can run two different clusters on the same
+hardware if they have a different ``fsid`` and cluster name. ::
+
+	ceph-deploy --cluster {cluster-name} new {host [host], ...}
+
+For example::
+
+	ceph-deploy --cluster rbdcluster new ceph-mon1
+	ceph-deploy --cluster rbdcluster new ceph-mon{1,2,3}
+
+.. note:: If you run multiple clusters, ensure you adjust the default
+   port settings and open ports for your additional cluster(s) so that
+   the networks of the two different clusters don't conflict with each other.
+
+
+.. _Monitor Configuration Reference: ../../configuration/mon-config-ref
+.. _Cephx Guide: ../../operations/authentication#monitor-keyrings
diff --git a/doc/rados/deployment/ceph-deploy-osd.rst b/doc/rados/deployment/ceph-deploy-osd.rst
new file mode 100644
index 0000000..66054d5
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-osd.rst
@@ -0,0 +1,117 @@
+=================
+ Add/Remove OSDs
+=================
+
+Adding and removing Ceph OSD Daemons to your cluster may involve a few more
+steps when compared to adding and removing other Ceph daemons. Ceph OSD Daemons
+write data to the disk and to journals. So you need to provide a disk for the
+OSD and a path to the journal partition (i.e., this is the most common
+configuration, but you may configure your system to  your own needs).
+
+In Ceph v0.60 and later releases, Ceph supports ``dm-crypt`` on disk encryption.
+You may specify the ``--dmcrypt`` argument when preparing an OSD to tell
+``ceph-deploy`` that you want to use encryption. You may also specify the
+``--dmcrypt-key-dir`` argument to specify the location of ``dm-crypt``
+encryption keys.
+
+You should test various drive configurations to gauge their throughput before
+before building out a large cluster. See `Data Storage`_ for additional details.
+
+
+List Disks
+==========
+
+To list the disks on a node, execute the following command:: 
+
+	ceph-deploy disk list {node-name [node-name]...}
+
+
+Zap Disks
+=========
+
+To zap a disk (delete its partition table) in preparation for use with Ceph,
+execute the following::
+
+	ceph-deploy disk zap {osd-server-name}:{disk-name}
+	ceph-deploy disk zap osdserver1:sdb
+
+.. important:: This will delete all data.
+
+
+Prepare OSDs
+============
+
+Once you create a cluster, install Ceph packages, and gather keys, you
+may prepare the OSDs and deploy them to the OSD node(s). If you need to 
+identify a disk or zap it prior to preparing it for use as an OSD, 
+see `List Disks`_ and `Zap Disks`_. ::
+
+	ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]
+	ceph-deploy osd prepare osdserver1:sdb:/dev/ssd
+	ceph-deploy osd prepare osdserver1:sdc:/dev/ssd
+
+The ``prepare`` command only prepares the OSD. On most operating
+systems, the ``activate`` phase will automatically run when the
+partitions are created on the disk (using Ceph ``udev`` rules). If not
+use the ``activate`` command. See `Activate OSDs`_ for
+details.
+
+The foregoing example assumes a disk dedicated to one Ceph OSD Daemon, and 
+a path to an SSD journal partition. We recommend storing the journal on 
+a separate drive to maximize throughput. You may dedicate a single drive
+for the journal too (which may be expensive) or place the journal on the 
+same disk as the OSD (not recommended as it impairs performance). In the
+foregoing example we store the journal on a partitioned solid state drive.
+
+.. note:: When running multiple Ceph OSD daemons on a single node, and 
+   sharing a partioned journal with each OSD daemon, you should consider
+   the entire node the minimum failure domain for CRUSH purposes, because
+   if the SSD drive fails, all of the Ceph OSD daemons that journal to it
+   will fail too.
+
+
+Activate OSDs
+=============
+
+Once you prepare an OSD you may activate it with the following command.  ::
+
+	ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]
+	ceph-deploy osd activate osdserver1:/dev/sdb1:/dev/ssd1
+	ceph-deploy osd activate osdserver1:/dev/sdc1:/dev/ssd2
+
+The ``activate`` command will cause your OSD to come ``up`` and be placed
+``in`` the cluster. The ``activate`` command uses the path to the partition
+created when running the ``prepare`` command.
+
+
+Create OSDs
+===========
+
+You may prepare OSDs, deploy them to the OSD node(s) and activate them in one
+step with the ``create`` command. The ``create`` command is a convenience method
+for executing the ``prepare`` and ``activate`` command sequentially.  ::
+
+	ceph-deploy osd create {node-name}:{disk}[:{path/to/journal}]
+	ceph-deploy osd create osdserver1:sdb:/dev/ssd1
+
+.. List OSDs
+.. =========
+
+.. To list the OSDs deployed on a node(s), execute the following command:: 
+
+..	ceph-deploy osd list {node-name}
+
+
+Destroy OSDs
+============
+
+.. note:: Coming soon. See `Remove OSDs`_ for manual procedures.
+
+.. To destroy an OSD, execute the following command:: 
+
+..	ceph-deploy osd destroy {node-name}:{path-to-disk}[:{path/to/journal}]
+
+.. Destroying an OSD will take it ``down`` and ``out`` of the cluster.
+
+.. _Data Storage: ../../../start/hardware-recommendations#data-storage
+.. _Remove OSDs: ../../operations/add-or-rm-osds#removing-osds-manual
diff --git a/doc/rados/deployment/ceph-deploy-purge.rst b/doc/rados/deployment/ceph-deploy-purge.rst
new file mode 100644
index 0000000..685c3c4
--- /dev/null
+++ b/doc/rados/deployment/ceph-deploy-purge.rst
@@ -0,0 +1,25 @@
+==============
+ Purge a Host
+==============
+
+When you remove Ceph daemons and uninstall Ceph, there may still be  extraneous
+data from the cluster on your server. The ``purge`` and  ``purgedata`` commands
+provide a convenient means of cleaning up a  host. 
+
+
+Purge Data
+==========
+
+To remove all data from ``/var/lib/ceph`` (but leave Ceph packages intact),
+execute the ``purgedata`` command.
+
+	ceph-deploy purgedata {hostname} [{hostname} ...]
+	
+
+Purge
+=====
+
+To remove all data from ``/var/lib/ceph`` and uninstall Ceph packages, execute
+the ``purge`` command.
+
+	ceph-deploy purge {hostname} [{hostname} ...]
\ No newline at end of file
diff --git a/doc/rados/deployment/index.rst b/doc/rados/deployment/index.rst
new file mode 100644
index 0000000..da12b3d
--- /dev/null
+++ b/doc/rados/deployment/index.rst
@@ -0,0 +1,58 @@
+=================
+ Ceph Deployment
+=================
+
+The ``ceph-deploy`` tool is a way to deploy Ceph relying only upon SSH access to
+the servers, ``sudo``, and some Python. It runs on your workstation, and does
+not require servers, databases, or any other tools. If you set up and
+tear down Ceph clusters a lot, and want minimal extra bureaucracy,
+``ceph-deploy`` is an ideal tool. The ``ceph-deploy`` tool is not a generic
+deployment system. It was designed exclusively for Ceph users who want to get
+Ceph up and running quickly with sensible initial configuration settings without
+the overhead of installing Chef, Puppet or Juju. Users who want fine-control
+over security settings, partitions or directory  locations should use a tool
+such as Juju, Puppet, `Chef`_ or Crowbar. 
+
+
+With ``ceph-deploy``, you can develop scripts to install Ceph packages on remote
+hosts, create a cluster, add monitors, gather (or forget) keys, add OSDs and
+metadata servers, configure admin hosts, and tear down the clusters.
+
+.. raw:: html
+
+	<table cellpadding="10"><tbody valign="top"><tr><td>
+
+.. toctree:: 
+
+   Preflight Checklist <preflight-checklist>	
+	Install Ceph <ceph-deploy-install>
+
+.. raw:: html
+
+	</td><td>	
+	
+.. toctree::
+	
+	Create a Cluster <ceph-deploy-new>
+	Add/Remove Monitor(s) <ceph-deploy-mon>
+	Key Management <ceph-deploy-keys>
+	Add/Remove OSD(s) <ceph-deploy-osd>
+	Add/Remove MDS(s) <ceph-deploy-mds>
+
+
+.. raw:: html
+
+	</td><td>	
+
+.. toctree::
+
+	Purge Hosts <ceph-deploy-purge>
+	Admin Tasks <ceph-deploy-admin>
+
+	
+.. raw:: html
+
+	</td></tr></tbody></table>
+
+
+.. _Chef: http://wiki.ceph.com/02Guides/Deploying_Ceph_with_Chef
\ No newline at end of file
diff --git a/doc/rados/deployment/preflight-checklist.rst b/doc/rados/deployment/preflight-checklist.rst
new file mode 100644
index 0000000..64a669f
--- /dev/null
+++ b/doc/rados/deployment/preflight-checklist.rst
@@ -0,0 +1,109 @@
+=====================
+ Preflight Checklist
+=====================
+
+.. versionadded:: 0.60
+
+This **Preflight Checklist** will help you prepare an admin node for use with
+``ceph-deploy``,  and server nodes for use with passwordless ``ssh`` and
+``sudo``.
+
+Before you can deploy Ceph using ``ceph-deploy``, you need to ensure that you
+have a few things set up first on your admin node and on nodes running Ceph
+daemons.
+ 
+
+Install an Operating System
+===========================
+
+Install a recent release of Debian or Ubuntu (e.g., 12.04 LTS, 14.04 LTS) on
+your nodes. For additional details on operating systems or to use other
+operating systems other than Debian or Ubuntu, see `OS Recommendations`_.
+
+
+Install an SSH Server
+=====================
+
+The ``ceph-deploy`` utility requires ``ssh``, so your server node(s) require an
+SSH server. ::
+
+	sudo apt-get install openssh-server
+
+
+Create a User
+=============
+
+Create a user on nodes running Ceph daemons. 
+
+.. tip:: We recommend a username that brute force attackers won't
+   guess easily (e.g., something other than ``root``, ``ceph``, etc).
+
+::
+
+	ssh user at ceph-server
+	sudo useradd -d /home/ceph -m ceph
+	sudo passwd ceph
+
+
+``ceph-deploy`` installs packages onto your nodes. This means that
+the user you create requires passwordless ``sudo`` privileges. 
+
+.. note:: We **DO NOT** recommend enabling the ``root`` password 
+   for security reasons. 
+
+To provide full privileges to the user, add the following to 
+``/etc/sudoers.d/ceph``. ::
+
+	echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
+	sudo chmod 0440 /etc/sudoers.d/ceph
+
+
+Configure SSH
+=============
+
+Configure your admin machine with password-less SSH access to each node
+running Ceph daemons (leave the passphrase empty). ::
+
+	ssh-keygen
+	Generating public/private key pair.
+	Enter file in which to save the key (/ceph-client/.ssh/id_rsa):
+	Enter passphrase (empty for no passphrase):
+	Enter same passphrase again:
+	Your identification has been saved in /ceph-client/.ssh/id_rsa.
+	Your public key has been saved in /ceph-client/.ssh/id_rsa.pub.
+
+Copy the key to each node running Ceph daemons:: 
+
+	ssh-copy-id ceph at ceph-server
+
+Modify your ~/.ssh/config file of your admin node so that it defaults 
+to logging in as the user you created when no username is specified. ::
+
+	Host ceph-server
+		Hostname ceph-server.fqdn-or-ip-address.com
+		User ceph
+
+
+Install ceph-deploy
+===================
+
+To install ``ceph-deploy``, execute the following:: 
+
+	wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
+	echo deb http://ceph.com/debian-dumpling/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+	sudo apt-get update	
+	sudo apt-get install ceph-deploy
+
+
+Ensure Connectivity
+===================
+
+Ensure that your Admin node has connectivity to the network and to your Server
+node (e.g., ensure ``iptables``, ``ufw`` or other tools that may prevent
+connections, traffic forwarding, etc. to allow what you need).
+
+
+Once you have completed this pre-flight checklist, you are ready to begin using
+``ceph-deploy``.
+
+.. _OS Recommendations: ../../../start/os-recommendations
diff --git a/doc/rados/index.rst b/doc/rados/index.rst
new file mode 100644
index 0000000..9ff756c
--- /dev/null
+++ b/doc/rados/index.rst
@@ -0,0 +1,76 @@
+======================
+ Ceph Storage Cluster
+======================
+
+The :term:`Ceph Storage Cluster` is the foundation for all Ceph deployments.
+Based upon :abbr:`RADOS (Reliable Autonomic Distributed Object Store)`, Ceph
+Storage Clusters consist of two types of daemons: a :term:`Ceph OSD Daemon`
+(OSD) stores data as objects on a storage node; and a :term:`Ceph Monitor` (MON)
+maintains a master copy of the cluster map. A Ceph Storage Cluster may contain
+thousands of storage nodes. A minimal system will have at least one 
+Ceph Monitor and two Ceph OSD Daemons for data replication. 
+
+The Ceph Filesystem, Ceph Object Storage and Ceph Block Devices read data from
+and write data to the Ceph Storage Cluster.
+
+.. raw:: html
+
+	<style type="text/css">div.body h3{margin:5px 0px 0px 0px;}</style>
+	<table cellpadding="10"><colgroup><col width="33%"><col width="33%"><col width="33%"></colgroup><tbody valign="top"><tr><td><h3>Config and Deploy</h3>
+
+Ceph Storage Clusters have a few required settings, but most configuration
+settings have default values. A typical deployment uses a deployment tool 
+to define a cluster and bootstrap a monitor. See `Deployment`_ for details 
+on ``ceph-deploy.``
+
+.. toctree::
+	:maxdepth: 2
+
+	Configuration <configuration/index>
+	Deployment <deployment/index>
+
+.. raw:: html 
+
+	</td><td><h3>Operations</h3>
+
+Once you have a deployed a Ceph Storage Cluster, you may begin operating 
+your cluster.
+
+.. toctree::
+	:maxdepth: 2
+	
+	
+	Operations <operations/index>
+
+.. toctree::
+	:maxdepth: 1
+
+	Man Pages <man/index>
+
+
+.. toctree:: 
+	:hidden:
+	
+	troubleshooting/index
+
+.. raw:: html 
+
+	</td><td><h3>APIs</h3>
+
+Most Ceph deployments use `Ceph Block Devices`_, `Ceph Object Storage`_ and/or the
+`Ceph Filesystem`_. You  may also develop applications that talk directly to
+the Ceph Storage Cluster.
+
+.. toctree::
+	:maxdepth: 2
+
+	APIs <api/index>
+	
+.. raw:: html
+
+	</td></tr></tbody></table>
+
+.. _Ceph Block Devices: ../rbd/rbd
+.. _Ceph Filesystem: ../cephfs/
+.. _Ceph Object Storage: ../radosgw/
+.. _Deployment: ../rados/deployment/
diff --git a/doc/rados/man/index.rst b/doc/rados/man/index.rst
new file mode 100644
index 0000000..3c789f3
--- /dev/null
+++ b/doc/rados/man/index.rst
@@ -0,0 +1,31 @@
+=======================
+ Object Store Manpages
+=======================
+
+.. toctree:: 
+   :maxdepth: 1
+
+   ../../man/8/ceph-disk.rst
+   ../../man/8/ceph.rst
+   ../../man/8/ceph-deploy.rst
+   ../../man/8/ceph-rest-api.rst
+   ../../man/8/ceph-authtool.rst
+   ../../man/8/ceph-clsinfo.rst
+   ../../man/8/ceph-conf.rst
+   ../../man/8/ceph-debugpack.rst
+   ../../man/8/ceph-dencoder.rst
+   ../../man/8/ceph-mon.rst
+   ../../man/8/ceph-osd.rst
+   ../../man/8/ceph-run.rst
+   ../../man/8/ceph-syn.rst
+   ../../man/8/crushtool.rst
+   ../../man/8/librados-config.rst
+   ../../man/8/monmaptool.rst
+   ../../man/8/osdmaptool.rst
+   ../../man/8/rados.rst
+
+
+.. toctree::
+	:hidden:
+	
+	../../man/8/ceph-post-file.rst
diff --git a/doc/rados/operations/add-or-rm-mons.rst b/doc/rados/operations/add-or-rm-mons.rst
new file mode 100644
index 0000000..7a76453
--- /dev/null
+++ b/doc/rados/operations/add-or-rm-mons.rst
@@ -0,0 +1,370 @@
+==========================
+ Adding/Removing Monitors
+==========================
+
+When you have a cluster up and running, you may add or remove monitors
+from the cluster at runtime. To bootstrap a monitor, see `Manual Deployment`_
+or `Monitor Bootstrap`_.
+
+Adding Monitors
+===============
+
+Ceph monitors are light-weight processes that maintain a master copy of the 
+cluster map. You can run a cluster with 1 monitor. We recommend at least 3 
+monitors for a production cluster. Ceph monitors use a variation of the
+`Paxos`_ protocol to establish consensus about maps and other critical
+information across the cluster. Due to the nature of Paxos, Ceph requires
+a majority of monitors running to establish a quorum (thus establishing
+consensus).
+
+It is advisable to run an odd-number of monitors but not mandatory. An
+odd-number of monitors has a higher resiliency to failures than an
+even-number of monitors. For instance, on a 2 monitor deployment, no
+failures can be tolerated in order to maintain a quorum; with 3 monitors,
+one failure can be tolerated; in a 4 monitor deployment, one failure can
+be tolerated; with 5 monitors, two failures can be tolerated.  This is
+why an odd-number is advisable. Summarizing, Ceph needs a majority of
+monitors to be running (and able to communicate with each other), but that
+majority can be achieved using a single monitor, or 2 out of 2 monitors,
+2 out of 3, 3 out of 4, etc.
+
+For an initial deployment of a multi-node Ceph cluster, it is advisable to
+deploy three monitors, increasing the number two at a time if a valid need
+for more than three exists.
+
+Since monitors are light-weight, it is possible to run them on the same 
+host as an OSD; however, we recommend running them on separate hosts,
+because fsync issues with the kernel may impair performance. 
+
+.. note:: A *majority* of monitors in your cluster must be able to 
+   reach each other in order to establish a quorum.
+
+Deploy your Hardware
+--------------------
+
+If you are adding a new host when adding a new monitor,  see `Hardware
+Recommendations`_ for details on minimum recommendations for monitor hardware.
+To add a monitor host to your cluster, first make sure you have an up-to-date
+version of Linux installed (typically Ubuntu 14.04 or RHEL 7). 
+
+Add your monitor host to a rack in your cluster, connect it to the network
+and ensure that it has network connectivity.
+
+.. _Hardware Recommendations: ../../../start/hardware-recommendations
+
+Install the Required Software
+-----------------------------
+
+For manually deployed clusters, you must install Ceph packages
+manually. See `Installing Packages`_ for details.
+You should configure SSH to a user with password-less authentication
+and root permissions.
+
+.. _Installing Packages: ../../../install/install-storage-cluster
+
+
+.. _Adding a Monitor (Manual):
+
+Adding a Monitor (Manual)
+-------------------------
+
+This procedure creates a ``ceph-mon`` data directory, retrieves the monitor map
+and monitor keyring, and adds a ``ceph-mon`` daemon to your cluster.  If
+this results in only two monitor daemons, you may add more monitors by
+repeating this procedure until you have a sufficient number of ``ceph-mon`` 
+daemons to achieve a quorum.
+
+At this point you should define your monitor's id.  Traditionally, monitors 
+have been named with single letters (``a``, ``b``, ``c``, ...), but you are 
+free to define the id as you see fit.  For the purpose of this document, 
+please take into account that ``{mon-id}`` should be the id you chose, 
+without the ``mon.`` prefix (i.e., ``{mon-id}`` should be the ``a`` 
+on ``mon.a``).
+
+#. Create the default directory on the machine that will host your 
+   new monitor. :: 
+
+	ssh {new-mon-host}
+	sudo mkdir /var/lib/ceph/mon/ceph-{mon-id}
+
+#. Create a temporary directory ``{tmp}`` to keep the files needed during 
+   this process. This directory should be different from the monitor's default 
+   directory created in the previous step, and can be removed after all the 
+   steps are executed. :: 
+
+	mkdir {tmp}
+
+#. Retrieve the keyring for your monitors, where ``{tmp}`` is the path to 
+   the retrieved keyring, and ``{key-filename}`` is the name of the file 
+   containing the retrieved monitor key. :: 
+
+	ceph auth get mon. -o {tmp}/{key-filename}
+
+#. Retrieve the monitor map, where ``{tmp}`` is the path to 
+   the retrieved monitor map, and ``{map-filename}`` is the name of the file 
+   containing the retrieved monitor monitor map. :: 
+
+	ceph mon getmap -o {tmp}/{map-filename}
+
+#. Prepare the monitor's data directory created in the first step. You must 
+   specify the path to the monitor map so that you can retrieve the 
+   information about a quorum of monitors and their ``fsid``. You must also 
+   specify a path to the monitor keyring:: 
+
+	sudo ceph-mon -i {mon-id} --mkfs --monmap {tmp}/{map-filename} --keyring {tmp}/{key-filename}
+	
+
+#. Start the new monitor and it will automatically join the cluster.
+   The daemon needs to know which address to bind to, either via
+   ``--public-addr {ip:port}`` or by setting ``mon addr`` in the
+   appropriate section of ``ceph.conf``.  For example::
+
+	ceph-mon -i {mon-id} --public-addr {ip:port}
+
+
+Removing Monitors
+=================
+
+When you remove monitors from a cluster, consider that Ceph monitors use 
+PAXOS to establish consensus about the master cluster map. You must have 
+a sufficient number of monitors to establish a quorum for consensus about 
+the cluster map.
+
+.. _Removing a Monitor (Manual):
+
+Removing a Monitor (Manual)
+---------------------------
+
+This procedure removes a ``ceph-mon`` daemon from your cluster.   If this
+procedure results in only two monitor daemons, you may add or remove another
+monitor until you have a number of ``ceph-mon`` daemons that can achieve a 
+quorum.
+
+#. Stop the monitor. ::
+
+	service ceph -a stop mon.{mon-id}
+	
+#. Remove the monitor from the cluster. ::
+
+	ceph mon remove {mon-id}
+	
+#. Remove the monitor entry from ``ceph.conf``. 
+
+
+Removing Monitors from an Unhealthy Cluster
+-------------------------------------------
+
+This procedure removes a ``ceph-mon`` daemon from an unhealthy
+cluster, for example a cluster where the monitors cannot form a
+quorum.
+
+
+#. Stop all ``ceph-mon`` daemons on all monitor hosts. ::
+
+	ssh {mon-host}
+	service ceph stop mon || stop ceph-mon-all
+	# and repeat for all mons
+
+#. Identify a surviving monitor and log in to that host. :: 
+
+	ssh {mon-host}
+
+#. Extract a copy of the monmap file.  ::
+
+        ceph-mon -i {mon-id} --extract-monmap {map-path}
+        # in most cases, that's
+        ceph-mon -i `hostname` --extract-monmap /tmp/monmap
+
+#. Remove the non-surviving or problematic monitors.  For example, if
+   you have three monitors, ``mon.a``, ``mon.b``, and ``mon.c``, where
+   only ``mon.a`` will survive, follow the example below::
+
+	monmaptool {map-path} --rm {mon-id}
+	# for example,
+	monmaptool /tmp/monmap --rm b
+	monmaptool /tmp/monmap --rm c
+	
+#. Inject the surviving map with the removed monitors into the
+   surviving monitor(s).  For example, to inject a map into monitor
+   ``mon.a``, follow the example below::
+
+	ceph-mon -i {mon-id} --inject-monmap {map-path}
+	# for example,
+	ceph-mon -i a --inject-monmap /tmp/monmap
+
+#. Start only the surviving monitors.
+
+#. Verify the monitors form a quorum (``ceph -s``).
+
+#. You may wish to archive the removed monitors' data directory in
+   ``/var/lib/ceph/mon`` in a safe location, or delete it if you are
+   confident the remaining monitors are healthy and are sufficiently
+   redundant.
+
+.. _Changing a Monitor's IP address:
+
+Changing a Monitor's IP Address
+===============================
+
+.. important:: Existing monitors are not supposed to change their IP addresses.
+
+Monitors are critical components of a Ceph cluster, and they need to maintain a
+quorum for the whole system to work properly. To establish a quorum, the
+monitors need to discover each other. Ceph has strict requirements for
+discovering monitors.
+
+Ceph clients and other Ceph daemons use ``ceph.conf`` to discover monitors.
+However, monitors discover each other using the monitor map, not ``ceph.conf``.
+For example,  if you refer to `Adding a Monitor (Manual)`_ you will see that you
+need to obtain the current monmap for the cluster when creating a new monitor,
+as it is one of the required arguments of ``ceph-mon -i {mon-id} --mkfs``. The
+following sections explain the consistency requirements for Ceph monitors, and a
+few safe ways to change a monitor's IP address.
+
+
+Consistency Requirements
+------------------------
+
+A monitor always refers to the local copy of the monmap  when discovering other
+monitors in the cluster.  Using the monmap instead of ``ceph.conf`` avoids
+errors that could  break the cluster (e.g., typos in ``ceph.conf`` when
+specifying a monitor address or port). Since monitors use monmaps for discovery
+and they share monmaps with clients and other Ceph daemons, the monmap provides
+monitors with a strict guarantee that their consensus is valid.
+
+Strict consistency also applies to updates to the monmap. As with any other
+updates on the monitor, changes to the monmap always run through a distributed
+consensus algorithm called `Paxos`_. The monitors must agree on each update to
+the monmap, such as adding or removing a monitor, to ensure that each monitor in
+the quorum has the same version of the monmap. Updates to the monmap are
+incremental so that monitors have the latest agreed upon version, and a set of
+previous versions, allowing a monitor that has an older version of the monmap to
+catch up with the current state of the cluster.
+
+If monitors discovered each other through the Ceph configuration file instead of
+through the monmap, it would introduce additional risks because the Ceph
+configuration files aren't updated and distributed automatically. Monitors
+might inadvertently use an older ``ceph.conf`` file, fail to recognize a
+monitor, fall out of a quorum, or develop a situation where `Paxos`_ isn't able
+to determine the current state of the system accurately. Consequently,  making
+changes to an existing monitor's IP address must be done with  great care.
+
+
+Changing a Monitor's IP address (The Right Way)
+-----------------------------------------------
+
+Changing a monitor's IP address in ``ceph.conf`` only is not sufficient to
+ensure that other monitors in the cluster will receive the update.  To change a
+monitor's IP address, you must add a new monitor with the IP  address you want
+to use (as described in `Adding a Monitor (Manual)`_),  ensure that the new
+monitor successfully joins the  quorum; then, remove the monitor that uses the
+old IP address. Then, update the ``ceph.conf`` file to ensure that clients and
+other daemons know the IP address of the new monitor.
+
+For example, lets assume there are three monitors in place, such as :: 
+
+	[mon.a]
+		host = host01
+		addr = 10.0.0.1:6789
+	[mon.b]
+		host = host02
+		addr = 10.0.0.2:6789
+	[mon.c]
+		host = host03
+		addr = 10.0.0.3:6789
+
+To change ``mon.c`` to ``host04`` with the IP address  ``10.0.0.4``, follow the
+steps in `Adding a Monitor (Manual)`_ by adding a  new monitor ``mon.d``. Ensure
+that ``mon.d`` is  running before removing ``mon.c``, or it will break the
+quorum. Remove ``mon.c`` as described on  `Removing a Monitor (Manual)`_. Moving
+all three  monitors would thus require repeating this process as many times as
+needed.
+
+
+Changing a Monitor's IP address (The Messy Way)
+-----------------------------------------------
+
+There may come a time when the monitors must be moved to a different network,  a
+different part of the datacenter or a different datacenter altogether. While  it
+is possible to do it, the process becomes a bit more hazardous.
+
+In such a case, the solution is to generate a new monmap with updated IP
+addresses for all the monitors in the cluster, and inject the new map on each
+individual monitor.  This is not the most user-friendly approach, but we do not
+expect this to be something that needs to be done every other week.  As it is
+clearly stated on the top of this section, monitors are not supposed to change
+IP addresses.
+
+Using the previous monitor configuration as an example, assume you want to move
+all the  monitors from the ``10.0.0.x`` range to ``10.1.0.x``, and these
+networks  are unable to communicate.  Use the following procedure:
+
+#. Retrieve the monitor map, where ``{tmp}`` is the path to 
+   the retrieved monitor map, and ``{filename}`` is the name of the file 
+   containing the retrieved monitor monitor map. :: 
+
+	ceph mon getmap -o {tmp}/{filename}
+
+#. The following example demonstrates the contents of the monmap. ::
+
+	$ monmaptool --print {tmp}/{filename}
+	
+	monmaptool: monmap file {tmp}/{filename}
+	epoch 1
+	fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
+	last_changed 2012-12-17 02:46:41.591248
+	created 2012-12-17 02:46:41.591248
+	0: 10.0.0.1:6789/0 mon.a
+	1: 10.0.0.2:6789/0 mon.b
+	2: 10.0.0.3:6789/0 mon.c
+
+#. Remove the existing monitors. ::
+
+	$ monmaptool --rm a --rm b --rm c {tmp}/{filename}
+	
+	monmaptool: monmap file {tmp}/{filename}
+	monmaptool: removing a
+	monmaptool: removing b
+	monmaptool: removing c
+	monmaptool: writing epoch 1 to {tmp}/{filename} (0 monitors)
+
+#. Add the new monitor locations. ::
+
+	$ monmaptool --add a 10.1.0.1:6789 --add b 10.1.0.2:6789 --add c 10.1.0.3:6789 {tmp}/{filename}
+	
+	monmaptool: monmap file {tmp}/{filename}
+	monmaptool: writing epoch 1 to {tmp}/{filename} (3 monitors)
+
+#. Check new contents. ::
+
+	$ monmaptool --print {tmp}/{filename}
+	
+	monmaptool: monmap file {tmp}/{filename}
+	epoch 1
+	fsid 224e376d-c5fe-4504-96bb-ea6332a19e61
+	last_changed 2012-12-17 02:46:41.591248
+	created 2012-12-17 02:46:41.591248
+	0: 10.1.0.1:6789/0 mon.a
+	1: 10.1.0.2:6789/0 mon.b
+	2: 10.1.0.3:6789/0 mon.c
+
+At this point, we assume the monitors (and stores) are installed at the new
+location. The next step is to propagate the modified monmap to the new 
+monitors, and inject the modified monmap into each new monitor.
+
+#. First, make sure to stop all your monitors.  Injection must be done while 
+   the daemon is not running.
+
+#. Inject the monmap. ::
+
+	ceph-mon -i {mon-id} --inject-monmap {tmp}/{filename}
+
+#. Restart the monitors.
+
+After this step, migration to the new location is complete and 
+the monitors should operate successfully.
+
+
+.. _Manual Deployment: ../../../install/manual-deployment
+.. _Monitor Bootstrap: ../../../dev/mon-bootstrap
+.. _Paxos: http://en.wikipedia.org/wiki/Paxos_(computer_science)
diff --git a/doc/rados/operations/add-or-rm-osds.rst b/doc/rados/operations/add-or-rm-osds.rst
new file mode 100644
index 0000000..81c2a6a
--- /dev/null
+++ b/doc/rados/operations/add-or-rm-osds.rst
@@ -0,0 +1,330 @@
+======================
+ Adding/Removing OSDs
+======================
+
+When you have a cluster up and running, you may add OSDs or remove OSDs
+from the cluster at runtime. 
+
+Adding OSDs
+===========
+
+When you want to expand a cluster, you may add an OSD at runtime. With Ceph, an
+OSD is generally one Ceph ``ceph-osd`` daemon for one storage drive within a
+host machine. If your host has multiple storage drives, you may map one
+``ceph-osd`` daemon for each drive.
+
+Generally, it's a good idea to check the capacity of your cluster to see if you
+are reaching the upper end of its capacity. As your cluster reaches its ``near
+full`` ratio, you should add one or more OSDs to expand your cluster's capacity.
+
+.. warning:: Do not let your cluster reach its ``full ratio`` before
+   adding an OSD. OSD failures that occur after the cluster reaches 
+   its ``near full`` ratio may cause the cluster to exceed its
+   ``full ratio``.
+
+Deploy your Hardware
+--------------------
+
+If you are adding a new host when adding a new OSD,  see `Hardware
+Recommendations`_ for details on minimum recommendations for OSD hardware. To
+add an OSD host to your cluster, first make sure you have an up-to-date version
+of Linux installed, and you have made some initial preparations for your 
+storage drives.  See `Filesystem Recommendations`_ for details.
+
+Add your OSD host to a rack in your cluster, connect it to the network
+and ensure that it has network connectivity. See the `Network Configuration
+Reference`_ for details.
+
+.. _Hardware Recommendations: ../../../start/hardware-recommendations
+.. _Filesystem Recommendations: ../../configuration/filesystem-recommendations
+.. _Network Configuration Reference: ../../configuration/network-config-ref
+
+Install the Required Software
+-----------------------------
+
+For manually deployed clusters, you must install Ceph packages
+manually. See `Installing Ceph (Manual)`_ for details.
+You should configure SSH to a user with password-less authentication
+and root permissions.
+
+.. _Installing Ceph (Manual): ../../../install
+
+
+Adding an OSD (Manual)
+----------------------
+
+This procedure sets up a ``ceph-osd`` daemon, configures it to use one drive,
+and configures the cluster to distribute data to the OSD. If your host has
+multiple drives, you may add an OSD for each drive by repeating this procedure.
+
+To add an OSD, create a data directory for it, mount a drive to that directory, 
+add the OSD to the cluster, and then add it to the CRUSH map.
+
+When you add the OSD to the CRUSH map, consider the weight you give to the new
+OSD. Hard drive capacity grows 40% per year, so newer OSD hosts may have larger
+hard drives than older hosts in the cluster (i.e., they may have greater 
+weight).
+
+.. tip:: Ceph prefers uniform hardware across pools. If you are adding drives
+   of dissimilar size, you can adjust their weights. However, for best 
+   performance, consider a CRUSH hierarchy with drives of the same type/size.
+
+#. Create the OSD. If no UUID is given, it will be set automatically when the 
+   OSD starts up. The following command will output the OSD number, which you 
+   will need for subsequent steps. ::
+	
+	ceph osd create [{uuid} [{id}]]
+
+   If the optional parameter {id} is given it will be used as the OSD id.
+   Note, in this case the command may fail if the number is already in use.
+
+   .. warning:: In general, explicitly specifying {id} is not recommended.
+      IDs are allocated as an array, and skipping entries consumes some extra
+      memory. This can become significant if there are large gaps and/or
+      clusters are large. If {id} is not specified, the smallest available is
+      used.
+
+#. Create the default directory on your new OSD. :: 
+
+	ssh {new-osd-host}
+	sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}
+	
+
+#. If the OSD is for a drive other than the OS drive, prepare it 
+   for use with Ceph, and mount it to the directory you just created:: 
+
+	ssh {new-osd-host}
+	sudo mkfs -t {fstype} /dev/{drive}
+	sudo mount -o user_xattr /dev/{hdd} /var/lib/ceph/osd/ceph-{osd-number}
+
+	
+#. Initialize the OSD data directory. :: 
+
+	ssh {new-osd-host}
+	ceph-osd -i {osd-num} --mkfs --mkkey
+	
+   The directory must be empty before you can run ``ceph-osd``.
+
+#. Register the OSD authentication key. The value of ``ceph`` for 
+   ``ceph-{osd-num}`` in the path is the ``$cluster-$id``.  If your 
+   cluster name differs from ``ceph``, use your cluster name instead.::
+
+	ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring
+
+
+#. Add the OSD to the CRUSH map so that the OSD can begin receiving data. The 
+   ``ceph osd crush add`` command allows you to add OSDs to the CRUSH hierarchy 
+   wherever you wish. If you specify at least one bucket, the command 
+   will place the OSD into the most specific bucket you specify, *and* it will 
+   move that bucket underneath any other buckets you specify. **Important:** If 
+   you specify only the root bucket, the command will attach the OSD directly 
+   to the root, but CRUSH rules expect OSDs to be inside of hosts.
+      
+   For Argonaut (v 0.48), execute the following::
+
+	ceph osd crush add {id} {name} {weight}  [{bucket-type}={bucket-name} ...]
+
+   For Bobtail (v 0.56) and later releases, execute the following:: 
+
+	ceph osd crush add {id-or-name} {weight}  [{bucket-type}={bucket-name} ...]
+
+   You may also decompile the CRUSH map, add the OSD to the device list, add the 
+   host as a bucket (if it's not already in the CRUSH map), add the device as an 
+   item in the host, assign it a weight, recompile it and set it. See 
+   `Add/Move an OSD`_ for details.
+
+
+.. topic:: Argonaut (v0.48) Best Practices
+
+ To limit impact on user I/O performance, add an OSD to the CRUSH map
+ with an initial weight of ``0``. Then, ramp up the CRUSH weight a
+ little bit at a time.  For example, to ramp by increments of ``0.2``,
+ start with::
+
+      ceph osd crush reweight {osd-id} .2
+
+ and allow migration to complete before reweighting to ``0.4``,
+ ``0.6``, and so on until the desired CRUSH weight is reached.
+
+ To limit the impact of OSD failures, you can set::
+
+      mon osd down out interval = 0
+
+ which prevents down OSDs from automatically being marked out, and then
+ ramp them down manually with::
+
+      ceph osd reweight {osd-num} .8
+
+ Again, wait for the cluster to finish migrating data, and then adjust
+ the weight further until you reach a weight of 0.  Note that this
+ problem prevents the cluster to automatically re-replicate data after
+ a failure, so please ensure that sufficient monitoring is in place for
+ an administrator to intervene promptly.
+
+ Note that this practice will no longer be necessary in Bobtail and
+ subsequent releases.
+
+
+Starting the OSD
+----------------
+
+After you add an OSD to Ceph, the OSD is in your configuration. However, 
+it is not yet running. The OSD is ``down`` and ``in``. You must start 
+your new OSD before it can begin receiving data. You may use
+``service ceph`` from your admin host or start the OSD from its host
+machine.
+
+For Debian/Ubuntu use Upstart. ::
+
+	sudo start ceph-osd id={osd-num}
+
+For CentOS/RHEL, use sysvinit. ::
+
+	sudo /etc/init.d/ceph start osd.{osd-num}
+
+
+Once you start your OSD, it is ``up`` and ``in``.
+
+
+Observe the Data Migration
+--------------------------
+
+Once you have added your new OSD to the CRUSH map, Ceph  will begin rebalancing
+the server by migrating placement groups to your new OSD. You can observe this
+process with  the `ceph`_ tool. :: 
+
+	ceph -w
+
+You should see the placement group states change from ``active+clean`` to
+``active, some degraded objects``, and finally ``active+clean`` when migration
+completes. (Control-c to exit.)
+
+
+.. _Add/Move an OSD: ../crush-map#addosd
+.. _ceph: ../monitoring
+
+
+
+Removing OSDs (Manual)
+======================
+
+When you want to reduce the size of a cluster or replace hardware, you may
+remove an OSD at runtime. With Ceph, an OSD is generally one Ceph ``ceph-osd``
+daemon for one storage drive within a host machine. If your host has multiple
+storage drives, you may need to remove one ``ceph-osd`` daemon for each drive.
+Generally, it's a good idea to check the capacity of your cluster to see if you
+are reaching the upper end of its capacity. Ensure that when you remove an OSD
+that your cluster is not at its ``near full`` ratio.
+
+.. warning:: Do not let your cluster reach its ``full ratio`` when
+   removing an OSD. Removing OSDs could cause the cluster to reach 
+   or exceed its ``full ratio``.
+   
+
+Take the OSD ``out`` of the Cluster
+-----------------------------------
+
+Before you remove an OSD, it is usually ``up`` and ``in``.  You need to take it
+out of the cluster so that Ceph can begin rebalancing and copying its data to
+other OSDs. :: 
+
+	ceph osd out {osd-num}
+
+
+Observe the Data Migration
+--------------------------
+
+Once you have taken your OSD ``out`` of the cluster, Ceph  will begin
+rebalancing the cluster by migrating placement groups out of the OSD you
+removed. You can observe  this process with  the `ceph`_ tool. :: 
+
+	ceph -w
+
+You should see the placement group states change from ``active+clean`` to
+``active, some degraded objects``, and finally ``active+clean`` when migration
+completes. (Control-c to exit.)
+
+.. note:: Sometimes, typically in a "small" cluster with few hosts (for
+   instance with a small testing cluster), the fact to take ``out`` the
+   OSD can spawn a CRUSH corner case where some PGs remain stuck in the
+   ``active+remapped`` state. If you are in this case, you should mark
+   the OSD ``in`` with:
+
+       ``ceph osd in {osd-num}``
+
+   to come back to the initial state and then, instead of marking ``out``
+   the OSD, set its weight to 0 with:
+
+       ``ceph osd crush reweight osd.{osd-num} 0``
+
+   After that, you can observe the data migration which should come to its
+   end. The difference between marking ``out`` the OSD and reweighting it
+   to 0 is that in the first case the weight of the bucket which contains
+   the OSD isn't changed whereas in the second case the weight of the bucket
+   is updated (and decreased of the OSD weight). The reweight command could
+   be sometimes favoured in the case of a "small" cluster.
+
+
+
+Stopping the OSD
+----------------
+
+After you take an OSD out of the cluster, it may still be running. 
+That is, the OSD may be ``up`` and ``out``. You must stop 
+your OSD before you remove it from the configuration. :: 
+
+	ssh {osd-host}
+	sudo /etc/init.d/ceph stop osd.{osd-num}
+
+Once you stop your OSD, it is ``down``. 
+
+
+Removing the OSD
+----------------
+
+This procedure removes an OSD from a cluster map, removes its authentication
+key, removes the OSD from the OSD map, and removes the OSD from the
+``ceph.conf`` file. If your host has multiple drives, you may need to remove an
+OSD for each drive by repeating this procedure.
+
+
+#. Remove the OSD from the CRUSH map so that it no longer receives data. You may
+   also decompile the CRUSH map, remove the OSD from the device list, remove the
+   device as an item in the host bucket or remove the host  bucket (if it's in the
+   CRUSH map and you intend to remove the host), recompile the map and set it. 
+   See `Remove an OSD`_ for details. :: 
+
+	ceph osd crush remove {name}
+	
+#. Remove the OSD authentication key. ::
+
+	ceph auth del osd.{osd-num}
+	
+   The value of ``ceph`` for ``ceph-{osd-num}`` in the path is the ``$cluster-$id``. 
+   If your cluster name differs from ``ceph``, use your cluster name instead.	
+	
+#. Remove the OSD. ::
+
+	ceph osd rm {osd-num}
+	#for example
+	ceph osd rm 1
+	
+#. Navigate to the host where you keep the master copy of the cluster's 
+   ``ceph.conf`` file. ::
+
+	ssh {admin-host}
+	cd /etc/ceph
+	vim ceph.conf
+
+#. Remove the OSD entry from your ``ceph.conf`` file (if it exists). ::
+
+	[osd.1]
+		host = {hostname}
+ 
+#. From the host where you keep the master copy of the cluster's ``ceph.conf`` file, 
+   copy the updated ``ceph.conf`` file to the ``/etc/ceph`` directory of other 
+   hosts in your cluster.
+   
+		
+	
+.. _Remove an OSD: ../crush-map#removeosd
diff --git a/doc/rados/operations/cache-tiering.rst b/doc/rados/operations/cache-tiering.rst
new file mode 100644
index 0000000..f7fadd0
--- /dev/null
+++ b/doc/rados/operations/cache-tiering.rst
@@ -0,0 +1,412 @@
+===============
+ Cache Tiering
+===============
+
+A cache tier provides Ceph Clients with better I/O performance for a subset of
+the data stored in a backing storage tier. Cache tiering involves creating a
+pool of relatively fast/expensive storage devices (e.g., solid state drives)
+configured to act as a cache tier, and a backing pool of either erasure-coded
+or relatively slower/cheaper devices configured to act as an economical storage
+tier. The Ceph objecter handles where to place the objects and the tiering
+agent determines when to flush objects from the cache to the backing storage
+tier. So the cache tier and the backing storage tier are completely transparent 
+to Ceph clients.
+
+
+.. ditaa:: 
+           +-------------+
+           | Ceph Client |
+           +------+------+
+                  ^
+     Tiering is   |  
+    Transparent   |              Faster I/O
+        to Ceph   |           +---------------+
+     Client Ops   |           |               |   
+                  |    +----->+   Cache Tier  |
+                  |    |      |               |
+                  |    |      +-----+---+-----+
+                  |    |            |   ^ 
+                  v    v            |   |   Active Data in Cache Tier
+           +------+----+--+         |   |
+           |   Objecter   |         |   |
+           +-----------+--+         |   |
+                       ^            |   |   Inactive Data in Storage Tier
+                       |            v   |
+                       |      +-----+---+-----+
+                       |      |               |
+                       +----->|  Storage Tier |
+                              |               |
+                              +---------------+
+                                 Slower I/O
+
+
+The cache tiering agent handles the migration of data between the cache tier 
+and the backing storage tier automatically. However, admins have the ability to
+configure how this migration takes place. There are two main scenarios: 
+
+- **Writeback Mode:** When admins configure tiers with ``writeback`` mode, Ceph
+  clients write data to the cache tier and receive an ACK from the cache tier.
+  In time, the data written to the cache tier migrates to the storage tier
+  and gets flushed from the cache tier. Conceptually, the cache tier is 
+  overlaid "in front" of the backing storage tier. When a Ceph client needs 
+  data that resides in the storage tier, the cache tiering agent migrates the
+  data to the cache tier on read, then it is sent to the Ceph client. 
+  Thereafter, the Ceph client can perform I/O using the cache tier, until the 
+  data becomes inactive. This is ideal for mutable data (e.g., photo/video 
+  editing, transactional data, etc.).
+
+- **Read-only Mode:** When admins configure tiers with ``readonly`` mode, Ceph
+  clients write data to the backing tier. On read, Ceph copies the requested
+  object(s) from the backing tier to the cache tier. Stale objects get removed
+  from the cache tier based on the defined policy. This approach is ideal 
+  for immutable data (e.g., presenting pictures/videos on a social network, 
+  DNA data, X-Ray imaging, etc.), because reading data from a cache pool that 
+  might contain out-of-date data provides weak consistency. Do not use 
+  ``readonly`` mode for mutable data.
+
+And the modes above are accomodated to adapt different configurations:
+
+- **Read-forward Mode:** this mode is the same as the ``writeback`` mode
+  when serving write requests. But when Ceph clients is trying to read objects
+  not yet copied to the cache tier, Ceph **forward** them to the backing tier by
+  replying with a "redirect" message. And the clients will instead turn to the
+  backing tier for the data. If the read performance of the backing tier is on
+  a par with that of its cache tier, while its write performance or endurance
+  falls far behind, this mode might be a better choice.
+
+- **Read-proxy Mode:** this mode is similar to ``readforward`` mode: both
+  of them do not promote/copy the data when the requested object does not
+  exist in the cache tier. But instead of redirecting the Ceph clients to the
+  backing tier when cache misses, the cache tier reads from the backing tier
+  on behalf of the clients. Under some circumstances, this mode can help to
+  reduce the latency.
+
+Since all Ceph clients can use cache tiering, it has the potential to 
+improve I/O performance for Ceph Block Devices, Ceph Object Storage, 
+the Ceph Filesystem and native bindings.
+
+
+Setting Up Pools
+================
+
+To set up cache tiering, you must have two pools. One will act as the 
+backing storage and the other will act as the cache.
+
+
+Setting Up a Backing Storage Pool
+---------------------------------
+
+Setting up a backing storage pool typically involves one of two scenarios: 
+
+- **Standard Storage**: In this scenario, the pool stores multiple copies
+  of an object in the Ceph Storage Cluster.
+
+- **Erasure Coding:** In this scenario, the pool uses erasure coding to 
+  store data much more efficiently with a small performance tradeoff.
+
+In the standard storage scenario, you can setup a CRUSH ruleset to establish 
+the failure domain (e.g., osd, host, chassis, rack, row, etc.). Ceph OSD 
+Daemons perform optimally when all storage drives in the ruleset are of the 
+same size, speed (both RPMs and throughput) and type. See `CRUSH Maps`_ 
+for details on creating a ruleset. Once you have created a ruleset, create 
+a backing storage pool. 
+
+In the erasure coding scenario, the pool creation arguments will generate the
+appropriate ruleset automatically. See `Create a Pool`_ for details.
+
+In subsequent examples, we will refer to the backing storage pool 
+as ``cold-storage``.
+
+
+Setting Up a Cache Pool
+-----------------------
+
+Setting up a cache pool follows the same procedure as the standard storage
+scenario, but with this difference: the drives for the cache tier are typically
+high performance drives that reside in their own servers and have their own
+ruleset.  When setting up a ruleset, it should take account of the hosts that
+have the high performance drives while omitting the hosts that don't. See
+`Placing Different Pools on Different OSDs`_ for details.
+
+
+In subsequent examples, we will refer to the cache pool as ``hot-storage`` and
+the backing pool as ``cold-storage``.
+
+For cache tier configuration and default values, see 
+`Pools - Set Pool Values`_.
+
+
+Creating a Cache Tier
+=====================
+
+Setting up a cache tier involves associating a backing storage pool with
+a cache pool ::
+
+	ceph osd tier add {storagepool} {cachepool}
+
+For example ::
+
+	ceph osd tier add cold-storage hot-storage
+
+To set the cache mode, execute the following::
+
+	ceph osd tier cache-mode {cachepool} {cache-mode}
+
+For example:: 
+
+	ceph osd tier cache-mode hot-storage writeback
+
+The cache tiers overlay the backing storage tier, so they require one
+additional step: you must direct all client traffic from the storage pool to 
+the cache pool. To direct client traffic directly to the cache pool, execute 
+the following:: 
+
+	ceph osd tier set-overlay {storagepool} {cachepool}
+
+For example:: 
+
+	ceph osd tier set-overlay cold-storage hot-storage
+
+
+Configuring a Cache Tier
+========================
+
+Cache tiers have several configuration options. You may set
+cache tier configuration options with the following usage:: 
+
+	ceph osd pool set {cachepool} {key} {value}
+
+See `Pools - Set Pool Values`_ for details.
+
+
+Target Size and Type
+--------------------
+
+Ceph's production cache tiers use a `Bloom Filter`_ for the ``hit_set_type``::
+
+	ceph osd pool set {cachepool} hit_set_type bloom
+
+For example::
+
+	ceph osd pool set hot-storage hit_set_type bloom
+
+The ``hit_set_count`` and ``hit_set_period`` define how much time each HitSet
+should cover, and how many such HitSets to store. ::
+
+	ceph osd pool set {cachepool} hit_set_count 1
+	ceph osd pool set {cachepool} hit_set_period 3600
+	ceph osd pool set {cachepool} target_max_bytes 1000000000000
+
+Binning accesses over time allows Ceph to determine whether a Ceph client
+accessed an object at least once, or more than once over a time period 
+("age" vs "temperature").
+
+The ``min_read_recency_for_promote`` defines how many HitSets to check for the
+existence of an object when handling a read operation. The checking result is
+used to decide whether to promote the object asynchronously. Its value should be
+between 0 and ``hit_set_count``. If it's set to 0, the object is always promoted.
+If it's set to 1, the current HitSet is checked. And if this object is in the
+current HitSet, it's promoted. Otherwise not. For the other values, the exact
+number of archive HitSets are checked. The object is promoted if the object is
+found in any of the most recent ``min_read_recency_for_promote`` HitSets.
+
+A similar parameter can be set for the write operation, which is
+``min_write_recency_for_promote``. ::
+
+	ceph osd pool set {cachepool} min_read_recency_for_promote 1
+	ceph osd pool set {cachepool} min_write_recency_for_promote 1
+
+.. note:: The longer the period and the higher the
+   ``min_read_recency_for_promote``/``min_write_recency_for_promote``, the more
+   RAM the ``ceph-osd`` daemon consumes. In particular, when the agent is active
+   to flush or evict cache objects, all ``hit_set_count`` HitSets are loaded
+   into RAM.
+
+
+Cache Sizing
+------------
+
+The cache tiering agent performs two main functions: 
+
+- **Flushing:** The agent identifies modified (or dirty) objects and forwards
+  them to the storage pool for long-term storage.
+  
+- **Evicting:** The agent identifies objects that haven't been modified 
+  (or clean) and evicts the least recently used among them from the cache.
+
+
+Absolute Sizing
+~~~~~~~~~~~~~~~
+
+The cache tiering agent can flush or evict objects based upon the total number
+of bytes or the total number of objects. To specify a maximum number of bytes,
+execute the following::
+
+	ceph osd pool set {cachepool} target_max_bytes {#bytes}
+
+For example, to flush or evict at 1 TB, execute the following::
+
+	ceph osd pool set hot-storage target_max_bytes 1099511627776
+
+
+To specify the maximum number of objects, execute the following::
+
+	ceph osd pool set {cachepool} target_max_objects {#objects}
+
+For example, to flush or evict at 1M objects, execute the following::
+
+	ceph osd pool set hot-storage target_max_objects 1000000
+
+.. note:: Ceph is not able to determine the size of a cache pool automatically, so
+   the configuration on the absolute size is required here, otherwise the
+   flush/evict will not work. If you specify both limits, the cache tiering
+   agent will begin flushing or evicting when either threshold is triggered.
+
+.. note:: All client requests will be blocked only when  ``target_max_bytes`` or
+   ``target_max_objects`` reached
+
+Relative Sizing
+~~~~~~~~~~~~~~~
+
+The cache tiering agent can flush or evict objects relative to the size of the
+cache pool(specified by ``target_max_bytes`` / ``target_max_objects`` in
+`Absolute sizing`_).  When the cache pool consists of a certain percentage of
+modified (or dirty) objects, the cache tiering agent will flush them to the
+storage pool. To set the ``cache_target_dirty_ratio``, execute the following::
+
+	ceph osd pool set {cachepool} cache_target_dirty_ratio {0.0..1.0}
+
+For example, setting the value to ``0.4`` will begin flushing modified
+(dirty) objects when they reach 40% of the cache pool's capacity:: 
+
+	ceph osd pool set hot-storage cache_target_dirty_ratio 0.4
+
+When the dirty objects reaches a certain percentage of its capacity, flush dirty
+objects with a higher speed. To set the ``cache_target_dirty_high_ratio``::
+
+	ceph osd pool set {cachepool} cache_target_dirty_high_ratio {0.0..1.0}
+
+For example, setting the value to ``0.6`` will begin aggressively flush dirty objects
+when they reach 60% of the cache pool's capacity. obviously, we'd better set the value
+between dirty_ratio and full_ratio::
+
+	ceph osd pool set hot-storage cache_target_dirty_high_ratio 0.6
+
+When the cache pool reaches a certain percentage of its capacity, the cache
+tiering agent will evict objects to maintain free capacity. To set the 
+``cache_target_full_ratio``, execute the following:: 
+
+	ceph osd pool set {cachepool} cache_target_full_ratio {0.0..1.0}
+
+For example, setting the value to ``0.8`` will begin flushing unmodified
+(clean) objects when they reach 80% of the cache pool's capacity:: 
+
+	ceph osd pool set hot-storage cache_target_full_ratio 0.8
+
+
+Cache Age
+---------
+
+You can specify the minimum age of an object before the cache tiering agent 
+flushes a recently modified (or dirty) object to the backing storage pool::
+
+	ceph osd pool set {cachepool} cache_min_flush_age {#seconds}
+
+For example, to flush modified (or dirty) objects after 10 minutes, execute 
+the following:: 
+
+	ceph osd pool set hot-storage cache_min_flush_age 600
+
+You can specify the minimum age of an object before it will be evicted from
+the cache tier::
+
+	ceph osd pool {cache-tier} cache_min_evict_age {#seconds}
+
+For example, to evict objects after 30 minutes, execute the following:: 
+
+	ceph osd pool set hot-storage cache_min_evict_age 1800
+
+
+Removing a Cache Tier
+=====================
+
+Removing a cache tier differs depending on whether it is a writeback 
+cache or a read-only cache.
+
+
+Removing a Read-Only Cache
+--------------------------
+
+Since a read-only cache does not have modified data, you can disable
+and remove it without losing any recent changes to objects in the cache. 
+
+#. Change the cache-mode to ``none`` to disable it. :: 
+
+	ceph osd tier cache-mode {cachepool} none
+
+   For example:: 
+
+	ceph osd tier cache-mode hot-storage none
+
+#. Remove the cache pool from the backing pool. ::
+
+	ceph osd tier remove {storagepool} {cachepool}
+
+   For example::
+
+	ceph osd tier remove cold-storage hot-storage
+
+
+
+Removing a Writeback Cache
+--------------------------
+
+Since a writeback cache may have modified data, you must take steps to ensure 
+that you do not lose any recent changes to objects in the cache before you 
+disable and remove it.
+
+
+#. Change the cache mode to ``forward`` so that new and modified objects will 
+   flush to the backing storage pool. ::
+
+	ceph osd tier cache-mode {cachepool} forward
+
+   For example:: 
+
+	ceph osd tier cache-mode hot-storage forward
+
+
+#. Ensure that the cache pool has been flushed. This may take a few minutes::
+
+	rados -p {cachepool} ls
+
+   If the cache pool still has objects, you can flush them manually. 
+   For example::
+
+	rados -p {cachepool} cache-flush-evict-all
+
+
+#. Remove the overlay so that clients will not direct traffic to the cache. ::
+
+	ceph osd tier remove-overlay {storagetier}
+
+   For example::
+
+	ceph osd tier remove-overlay cold-storage
+
+
+#. Finally, remove the cache tier pool from the backing storage pool. ::
+
+	ceph osd tier remove {storagepool} {cachepool} 
+
+   For example::
+
+	ceph osd tier remove cold-storage hot-storage
+
+
+.. _Create a Pool: ../pools#create-a-pool
+.. _Pools - Set Pool Values: ../pools#set-pool-values
+.. _Placing Different Pools on Different OSDs: ../crush-map/#placing-different-pools-on-different-osds
+.. _Bloom Filter: http://en.wikipedia.org/wiki/Bloom_filter
+.. _CRUSH Maps: ../crush-map
+.. _Absolute Sizing: #absolute-sizing
diff --git a/doc/rados/operations/control.rst b/doc/rados/operations/control.rst
new file mode 100644
index 0000000..0b39c4c
--- /dev/null
+++ b/doc/rados/operations/control.rst
@@ -0,0 +1,405 @@
+.. index:: control, commands
+
+==================
+ Control Commands
+==================
+
+
+Monitor Commands
+================
+
+Monitor commands are issued using the ceph utility::
+
+	ceph [-m monhost] {command}
+
+The command is usually (though not always) of the form::
+
+	ceph {subsystem} {command}
+
+
+System Commands
+===============
+
+Execute the following to display the current status of the cluster.  ::
+
+	ceph -s
+	ceph status
+
+Execute the following to display a running summary of the status of the cluster,
+and major events. ::
+
+	ceph -w
+
+Execute the following to show the monitor quorum, including which monitors are
+participating and which one is the leader. ::
+
+	ceph quorum_status
+
+Execute the following to query the status of a single monitor, including whether
+or not it is in the quorum. ::
+
+	ceph [-m monhost] mon_status
+
+
+Authentication Subsystem
+========================
+
+To add a keyring for an OSD, execute the following::
+
+	ceph auth add {osd} {--in-file|-i} {path-to-osd-keyring}
+
+To list the cluster's keys and their capabilities, execute the following::
+
+	ceph auth list
+
+
+Placement Group Subsystem
+=========================
+
+To display the statistics for all placement groups, execute the following:: 
+
+	ceph pg dump [--format {format}]
+
+The valid formats are ``plain`` (default) and ``json``.
+
+To display the statistics for all placement groups stuck in a specified state, 
+execute the following:: 
+
+	ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format {format}] [-t|--threshold {seconds}]
+
+
+``--format`` may be ``plain`` (default) or ``json``
+
+``--threshold`` defines how many seconds "stuck" is (default: 300)
+
+**Inactive** Placement groups cannot process reads or writes because they are waiting for an OSD
+with the most up-to-date data to come back.
+
+**Unclean** Placement groups contain objects that are not replicated the desired number
+of times. They should be recovering.
+
+**Stale** Placement groups are in an unknown state - the OSDs that host them have not
+reported to the monitor cluster in a while (configured by
+``mon_osd_report_timeout``).
+
+Delete "lost" objects or revert them to their prior state, either a previous version
+or delete them if they were just created. ::
+
+	ceph pg {pgid} mark_unfound_lost revert|delete
+
+
+OSD Subsystem
+=============
+
+Query OSD subsystem status. ::
+
+	ceph osd stat
+
+Write a copy of the most recent OSD map to a file. See
+`osdmaptool`_. ::
+
+	ceph osd getmap -o file
+
+.. _osdmaptool: ../../man/8/osdmaptool
+
+Write a copy of the crush map from the most recent OSD map to
+file. ::
+
+	ceph osd getcrushmap -o file
+
+The foregoing functionally equivalent to ::
+
+	ceph osd getmap -o /tmp/osdmap
+	osdmaptool /tmp/osdmap --export-crush file
+
+Dump the OSD map. Valid formats for ``-f`` are ``plain`` and ``json``. If no
+``--format`` option is given, the OSD map is dumped as plain text. ::
+
+	ceph osd dump [--format {format}]
+
+Dump the OSD map as a tree with one line per OSD containing weight
+and state. ::
+
+	ceph osd tree [--format {format}]
+
+Find out where a specific object is or would be stored in the system::
+
+	ceph osd map <pool-name> <object-name>
+
+Add or move a new item (OSD) with the given id/name/weight at the specified
+location. ::
+
+	ceph osd crush set {id} {weight} [{loc1} [{loc2} ...]]
+
+Remove an existing item (OSD) from the CRUSH map. ::
+
+	ceph osd crush remove {name}
+
+Remove an existing bucket from the CRUSH map. ::
+
+	ceph osd crush remove {bucket-name}
+
+Move an existing bucket from one position in the hierarchy to another.  ::
+
+   ceph osd crush move {id} {loc1} [{loc2} ...]
+
+Set the weight of the item given by ``{name}`` to ``{weight}``. ::
+
+	ceph osd crush reweight {name} {weight}
+
+Create a cluster snapshot. ::
+
+	ceph osd cluster_snap {name}
+
+Mark an OSD as lost. This may result in permanent data loss. Use with caution. ::
+
+	ceph osd lost {id} [--yes-i-really-mean-it]
+
+Create a new OSD. If no UUID is given, it will be set automatically when the OSD
+starts up. ::
+
+	ceph osd create [{uuid}]
+
+Remove the given OSD(s). ::
+
+	ceph osd rm [{id}...]
+
+Query the current max_osd parameter in the OSD map. ::
+
+	ceph osd getmaxosd
+
+Import the given crush map. ::
+
+	ceph osd setcrushmap -i file
+
+Set the ``max_osd`` parameter in the OSD map. This is necessary when
+expanding the storage cluster. ::
+
+	ceph osd setmaxosd
+
+Mark OSD ``{osd-num}`` down. ::
+
+	ceph osd down {osd-num}
+
+Mark OSD ``{osd-num}`` out of the distribution (i.e. allocated no data). ::
+
+	ceph osd out {osd-num}
+
+Mark ``{osd-num}`` in the distribution (i.e. allocated data). ::
+
+	ceph osd in {osd-num}
+
+List classes that are loaded in the ceph cluster. ::
+
+	ceph class list
+
+Set or clear the pause flags in the OSD map. If set, no IO requests
+will be sent to any OSD. Clearing the flags via unpause results in
+resending pending requests. ::
+
+	ceph osd pause
+	ceph osd unpause
+
+Set the weight of ``{osd-num}`` to ``{weight}``. Two OSDs with the
+same weight will receive roughly the same number of I/O requests and
+store approximately the same amount of data. ``ceph osd reweight``
+sets an override weight on the OSD. This value is in the range 0 to 1,
+and forces CRUSH to re-place (1-weight) of the data that would
+otherwise live on this drive. It does not change the weights assigned
+to the buckets above the OSD in the crush map, and is a corrective
+measure in case the normal CRUSH distribution isn't working out quite
+right. For instance, if one of your OSDs is at 90% and the others are
+at 50%, you could reduce this weight to try and compensate for it. ::
+
+	ceph osd reweight {osd-num} {weight}
+
+Reweights all the OSDs by reducing the weight of OSDs which are
+heavily overused. By default it will adjust the weights downward on
+OSDs which have 120% of the average utilization, but if you include
+threshold it will use that percentage instead. ::
+
+	ceph osd reweight-by-utilization [threshold]
+
+Adds/removes the address to/from the blacklist. When adding an address,
+you can specify how long it should be blacklisted in seconds; otherwise,
+it will default to 1 hour. A blacklisted address is prevented from
+connecting to any OSD. Blacklisting is most often used to prevent a
+lagging metadata server from making bad changes to data on the OSDs.
+
+These commands are mostly only useful for failure testing, as
+blacklists are normally maintained automatically and shouldn't need
+manual intervention. ::
+
+	ceph osd blacklist add ADDRESS[:source_port] [TIME]
+	ceph osd blacklist rm ADDRESS[:source_port]
+
+Creates/deletes a snapshot of a pool. ::
+
+	ceph osd pool mksnap {pool-name} {snap-name}
+	ceph osd pool rmsnap {pool-name} {snap-name}
+
+Creates/deletes/renames a storage pool. ::
+
+	ceph osd pool create {pool-name} pg_num [pgp_num]
+	ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
+	ceph osd pool rename {old-name} {new-name}
+
+Changes a pool setting. :: 
+
+	ceph osd pool set {pool-name} {field} {value}
+
+Valid fields are:
+
+	* ``size``: Sets the number of copies of data in the pool.
+	* ``crash_replay_interval``: The number of seconds to allow
+	  clients to replay acknowledged but uncommited requests.
+	* ``pg_num``: The placement group number.
+	* ``pgp_num``: Effective number when calculating pg placement.
+	* ``crush_ruleset``: rule number for mapping placement.
+
+Get the value of a pool setting. ::
+
+	ceph osd pool get {pool-name} {field}
+
+Valid fields are:
+
+	* ``pg_num``: The placement group number.
+	* ``pgp_num``: Effective number of placement groups when calculating placement.
+	* ``lpg_num``: The number of local placement groups.
+	* ``lpgp_num``: The number used for placing the local placement groups.
+
+
+Sends a scrub command to OSD ``{osd-num}``. To send the command to all OSDs, use ``*``. ::
+
+	ceph osd scrub {osd-num}
+
+Sends a repair command to OSD.N. To send the command to all OSDs, use ``*``. ::
+
+	ceph osd repair N
+
+Runs a simple throughput benchmark against OSD.N, writing ``NUMBER_OF_OBJECTS``
+in write requests of ``BYTES_PER_WRITE`` each. By default, the test
+writes 1 GB in total in 4-MB increments.
+The benchmark is non-destructive and will not overwrite existing live
+OSD data, but might temporarily affect the performance of clients
+concurrently accessing the OSD. ::
+
+	ceph tell osd.N bench [NUMER_OF_OBJECTS] [BYTES_PER_WRITE]
+
+
+MDS Subsystem
+=============
+
+Change configuration parameters on a running mds. ::
+
+	ceph tell mds.{mds-id} injectargs --{switch} {value} [--{switch} {value}]
+
+Example::
+
+	ceph tell mds.0 injectargs --debug_ms 1 --debug_mds 10
+
+Enables debug messages. ::
+
+	ceph mds stat
+
+Displays the status of all metadata servers.
+
+	ceph mds fail 0
+
+Marks the active MDS as failed, triggering failover to a standby if present.
+
+.. todo:: ``ceph mds`` subcommands missing docs: set, dump, getmap, stop, setmap
+
+
+Mon Subsystem
+=============
+
+Show monitor stats::
+
+	ceph mon stat
+	
+	2011-12-14 10:40:59.044395 mon {- [mon,stat]
+	2011-12-14 10:40:59.057111 mon.1 -} 'e3: 5 mons at {a=10.1.2.3:6789/0,b=10.1.2.4:6789/0,c=10.1.2.5:6789/0,d=10.1.2.6:6789/0,e=10.1.2.7:6789/0}, election epoch 16, quorum 0,1,2,3' (0)
+
+The ``quorum`` list at the end lists monitor nodes that are part of the current quorum.
+
+This is also available more directly::
+
+	$ ./ceph quorum_status
+	
+	2011-12-14 10:44:20.417705 mon {- [quorum_status]
+	2011-12-14 10:44:20.431890 mon.0 -} 
+
+.. code-block:: javascript	
+	
+	'{ "election_epoch": 10,	
+	  "quorum": [
+	        0,
+	        1,
+	        2],
+	  "monmap": { "epoch": 1,
+	      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
+	      "modified": "2011-12-12 13:28:27.505520",
+	      "created": "2011-12-12 13:28:27.505520",
+	      "mons": [
+	            { "rank": 0,
+	              "name": "a",
+	              "addr": "127.0.0.1:6789\/0"},
+	            { "rank": 1,
+	              "name": "b",
+	              "addr": "127.0.0.1:6790\/0"},
+	            { "rank": 2,
+	              "name": "c",
+	              "addr": "127.0.0.1:6791\/0"}]}}' (0)
+
+The above will block until a quorum is reached.
+
+For a status of just the monitor you connect to (use ``-m HOST:PORT``
+to select)::
+
+	ceph mon_status
+	
+	
+	2011-12-14 10:45:30.644414 mon {- [mon_status]
+	2011-12-14 10:45:30.644632 mon.0 -} 
+
+.. code-block:: javascript
+	
+	'{ "name": "a",
+	  "rank": 0,
+	  "state": "leader",
+	  "election_epoch": 10,
+	  "quorum": [
+	        0,
+	        1,
+	        2],
+	  "outside_quorum": [],
+	  "monmap": { "epoch": 1,
+	      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
+	      "modified": "2011-12-12 13:28:27.505520",
+	      "created": "2011-12-12 13:28:27.505520",
+	      "mons": [
+	            { "rank": 0,
+	              "name": "a",
+	              "addr": "127.0.0.1:6789\/0"},
+	            { "rank": 1,
+	              "name": "b",
+	              "addr": "127.0.0.1:6790\/0"},
+	            { "rank": 2,
+	              "name": "c",
+	              "addr": "127.0.0.1:6791\/0"}]}}' (0)
+
+A dump of the monitor state::
+
+	ceph mon dump
+
+	2011-12-14 10:43:08.015333 mon {- [mon,dump]
+	2011-12-14 10:43:08.015567 mon.0 -} 'dumped monmap epoch 1' (0)
+	epoch 1
+	fsid 444b489c-4f16-4b75-83f0-cb8097468898
+	last_changed 2011-12-12 13:28:27.505520
+	created 2011-12-12 13:28:27.505520
+	0: 127.0.0.1:6789/0 mon.a
+	1: 127.0.0.1:6790/0 mon.b
+	2: 127.0.0.1:6791/0 mon.c
+
diff --git a/doc/rados/operations/crush-map.rst b/doc/rados/operations/crush-map.rst
new file mode 100644
index 0000000..df7ee62
--- /dev/null
+++ b/doc/rados/operations/crush-map.rst
@@ -0,0 +1,1247 @@
+============
+ CRUSH Maps
+============
+
+The :abbr:`CRUSH (Controlled Replication Under Scalable Hashing)` algorithm
+determines how to store and retrieve data by computing data storage locations.
+CRUSH empowers Ceph clients to communicate with OSDs directly rather than
+through a centralized server or broker. With an algorithmically determined
+method of storing and retrieving data, Ceph avoids a single point of failure, a
+performance bottleneck, and a physical limit to its scalability.
+
+CRUSH requires a map of your cluster, and uses the CRUSH map to pseudo-randomly 
+store and retrieve data in OSDs with a uniform distribution of data across the 
+cluster. For a detailed discussion of CRUSH, see 
+`CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data`_
+
+CRUSH maps contain a list of :abbr:`OSDs (Object Storage Devices)`, a list of
+'buckets' for aggregating the devices into physical locations, and a list of
+rules that tell CRUSH how it should replicate data in a Ceph cluster's pools. By
+reflecting the underlying physical organization of the installation, CRUSH can
+model—and thereby address—potential sources of correlated device failures.
+Typical sources include physical proximity, a shared power source, and a shared
+network. By encoding this information into the cluster map, CRUSH placement
+policies can separate object replicas across different failure domains while
+still maintaining the desired distribution. For example, to address the
+possibility of concurrent failures, it may be desirable to ensure that data
+replicas are on devices using different shelves, racks, power supplies,
+controllers, and/or physical locations.
+
+When you create a configuration file and deploy Ceph with ``ceph-deploy``, Ceph
+generates a default CRUSH map for your configuration. The default CRUSH map is
+fine for your Ceph sandbox environment. However, when you deploy a large-scale
+data cluster, you should give significant consideration to developing a custom
+CRUSH map, because it will help you manage your Ceph cluster, improve
+performance and ensure data safety. 
+
+For example, if an OSD goes down, a CRUSH map can help you to locate
+the physical data center, room, row and rack of the host with the failed OSD in
+the event you need to use onsite support or replace hardware. 
+
+Similarly, CRUSH may help you identify faults more quickly. For example, if all
+OSDs in a particular rack go down simultaneously, the fault may lie with a
+network switch or power to the rack rather than the OSDs themselves.
+
+A custom CRUSH map can also help you identify the physical locations where
+Ceph stores redundant copies of data when the placement group(s) associated
+with a failed host are in a degraded state.
+
+.. note:: Lines of code in example boxes may extend past the edge of the box. 
+   Please scroll when reading or copying longer examples.
+
+
+CRUSH Location
+==============
+
+The location of an OSD in terms of the CRUSH map's hierarchy is referred to
+as a 'crush location'.  This location specifier takes the form of a list of
+key and value pairs describing a position.  For example, if an OSD is in a
+particular row, rack, chassis and host, and is part of the 'default' CRUSH 
+tree, its crush location could be described as::
+
+  root=default row=a rack=a2 chassis=a2a host=a2a1
+
+Note:
+
+#. Note that the order of the keys does not matter.
+#. The key name (left of ``=``) must be a valid CRUSH ``type``.  By default
+   these include root, datacenter, room, row, pod, pdu, rack, chassis and host, 
+   but those types can be customized to be anything appropriate by modifying 
+   the CRUSH map.
+#. Not all keys need to be specified.  For example, by default, Ceph
+   automatically sets a ``ceph-osd`` daemon's location to be
+   ``root=default host=HOSTNAME`` (based on the output from ``hostname -s``).
+
+ceph-crush-location hook
+------------------------
+
+By default, the ``ceph-crush-location`` utility will generate a CRUSH
+location string for a given daemon.  The location is based on, in order of
+preference:
+
+#. A ``TYPE crush location`` option in ceph.conf.  For example, this
+   is ``osd crush location`` for OSD daemons.
+#. A ``crush location`` option in ceph.conf.
+#. A default of ``root=default host=HOSTNAME`` where the hostname is
+   generated with the ``hostname -s`` command.
+
+In a typical deployment scenario, provisioning software (or the system
+administrator) can simply set the 'crush location' field in a host's
+ceph.conf to describe that machine's location within the datacenter or
+cluster.  This will provide location awareness to both Ceph daemons
+and clients alike.
+
+It is possible to manage the CRUSH map entirely manually by toggling
+the hook off in the configuration::
+
+  osd crush update on start = false
+
+Custom location hooks
+---------------------
+
+A customized location hook can be used in place of the generic hook for OSD
+daemon placement in the hierarchy.  (On startup, each OSD ensures its position is
+correct.)::
+
+  osd crush location hook = /path/to/script
+
+This hook is passed several arguments (below) and should output a single line
+to stdout with the CRUSH location description.::
+
+  $ ceph-crush-location --cluster CLUSTER --id ID --type TYPE
+
+where the cluster name is typically 'ceph', the id is the daemon
+identifier (the OSD number), and the daemon type is typically ``osd``.
+
+
+Editing a CRUSH Map
+===================
+
+To edit an existing CRUSH map:
+
+#. `Get the CRUSH map`_.
+#. `Decompile`_ the CRUSH map.
+#. Edit at least one of `Devices`_, `Buckets`_ and `Rules`_.
+#. `Recompile`_ the CRUSH map.
+#. `Set the CRUSH map`_.
+
+To activate CRUSH map rules for a specific pool, identify the common ruleset
+number for those rules and specify that ruleset number for the pool. See `Set
+Pool Values`_ for details. 
+
+.. _Get the CRUSH map: #getcrushmap
+.. _Decompile: #decompilecrushmap
+.. _Devices: #crushmapdevices
+.. _Buckets: #crushmapbuckets
+.. _Rules: #crushmaprules
+.. _Recompile: #compilecrushmap
+.. _Set the CRUSH map: #setcrushmap
+.. _Set Pool Values: ../pools#setpoolvalues
+
+.. _getcrushmap:
+
+Get a CRUSH Map
+---------------
+
+To get the CRUSH map for your cluster, execute the following:: 
+
+	ceph osd getcrushmap -o {compiled-crushmap-filename}
+
+Ceph will output (-o) a compiled CRUSH map to the filename you specified. Since
+the CRUSH map is in a compiled form, you must decompile it first before you can
+edit it. 
+
+.. _decompilecrushmap:
+
+Decompile a CRUSH Map
+---------------------
+
+To decompile a CRUSH map, execute the following:: 
+
+	crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}
+
+Ceph will decompile (-d) the compiled CRUSH map and output (-o) it to the 
+filename you specified.
+
+
+.. _compilecrushmap:
+
+Compile a CRUSH Map
+-------------------
+
+To compile a CRUSH map, execute the following:: 
+
+	crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename}
+
+Ceph will store a compiled CRUSH map to the filename you specified. 
+
+
+.. _setcrushmap:
+
+Set a CRUSH Map
+---------------
+
+To set the CRUSH map for your cluster, execute the following:: 
+
+	ceph osd setcrushmap -i  {compiled-crushmap-filename}
+
+Ceph will input the compiled CRUSH map of the filename you specified as the
+CRUSH map for the cluster.
+
+
+
+CRUSH Map Parameters
+====================
+
+There are four main sections to a CRUSH Map. 
+
+#. **Devices:** Devices consist of any object storage device--i.e., the storage
+   drive corresponding to a ``ceph-osd`` daemon. You should have a device for
+   each OSD daemon in your Ceph configuration file.
+   
+#. **Bucket Types**: Bucket ``types`` define the types of buckets used in your 
+   CRUSH hierarchy. Buckets consist of a hierarchical aggregation of storage 
+   locations (e.g., rows, racks, chassis, hosts, etc.) and their assigned 
+   weights.
+
+#. **Bucket Instances:** Once you define bucket types, you must declare bucket 
+   instances for your hosts, and any other failure domain partitioning
+   you choose.
+
+#. **Rules:** Rules consist of the manner of selecting buckets. 
+
+If you launched Ceph using one of our Quick Start guides, you'll notice 
+that you didn't need to create a CRUSH map. Ceph's deployment tools generate 
+a default CRUSH map that lists devices from the OSDs you defined in your 
+Ceph configuration file, and it declares a bucket for each host you specified
+in the ``[osd]`` sections of your Ceph configuration file. You should create
+your own CRUSH maps with buckets that reflect your cluster's failure domains 
+to better ensure data safety and availability.
+
+.. note:: The generated CRUSH map doesn't take your larger grained failure 
+   domains into account. So you should modify your CRUSH map to account for
+   larger grained failure domains such as chassis, racks, rows, data 
+   centers, etc.
+
+
+
+.. _crushmapdevices:
+
+CRUSH Map Devices
+-----------------
+
+To map placement groups to OSDs, a CRUSH map requires a list of OSD devices
+(i.e., the names of the OSD daemons from the Ceph configuration file). The list
+of devices appears first in the CRUSH map. To declare a device in the CRUSH map,
+create a new line under your list of devices, enter ``device`` followed by a
+unique numeric ID, followed by the corresponding ``ceph-osd`` daemon instance.
+
+::
+
+	#devices
+	device {num} {osd.name}
+
+For example:: 
+
+	#devices
+	device 0 osd.0
+	device 1 osd.1
+	device 2 osd.2
+	device 3 osd.3
+	
+As a general rule, an OSD daemon maps to a single storage drive or to a RAID.
+
+
+CRUSH Map Bucket Types
+----------------------
+
+The second list in the CRUSH map defines 'bucket' types. Buckets facilitate
+a hierarchy of nodes and leaves. Node (or non-leaf) buckets typically represent
+physical locations in a hierarchy. Nodes aggregate other nodes or leaves.
+Leaf buckets represent ``ceph-osd`` daemons and their corresponding storage
+media. 
+
+.. tip:: The term "bucket" used in the context of CRUSH means a node in
+   the hierarchy, i.e. a location or a piece of physical hardware. It
+   is a different concept from the term "bucket" when used in the
+   context of RADOS Gateway APIs.
+
+To add a bucket type to the CRUSH map, create a new line under your list of
+bucket types. Enter ``type`` followed by a unique numeric ID and a bucket name.
+By convention, there is one leaf bucket and it is ``type 0``;  however, you may
+give it any name you like (e.g., osd, disk, drive, storage, etc.)::
+
+	#types
+	type {num} {bucket-name}
+
+For example::
+
+	# types
+	type 0 osd
+	type 1 host
+	type 2 chassis
+	type 3 rack
+	type 4 row
+	type 5 pdu
+	type 6 pod
+	type 7 room
+	type 8 datacenter
+	type 9 region
+	type 10 root
+
+
+
+.. _crushmapbuckets:
+
+CRUSH Map Bucket Hierarchy
+--------------------------
+
+The CRUSH algorithm distributes data objects among storage devices according 
+to a per-device weight value, approximating a uniform probability distribution.
+CRUSH distributes objects and their replicas according to the hierarchical 
+cluster map you define. Your CRUSH map represents the available storage 
+devices and the logical elements that contain them.
+
+To map placement groups to OSDs across failure domains, a CRUSH map defines a
+hierarchical list of bucket types (i.e., under ``#types`` in the generated CRUSH
+map). The purpose of creating a bucket hierarchy is to segregate the
+leaf nodes by their failure domains, such as hosts, chassis, racks, power 
+distribution units, pods, rows, rooms, and data centers. With the exception of 
+the leaf nodes representing OSDs, the rest of the hierarchy is arbitrary, and 
+you may define it according to your own needs.
+
+We recommend adapting your CRUSH map to your firms's hardware naming conventions
+and using instances names that reflect the physical hardware. Your naming
+practice can make it easier to administer the cluster and troubleshoot
+problems when an OSD and/or other hardware malfunctions and the administrator
+need access to physical hardware.
+
+In the following example, the bucket hierarchy has a leaf bucket named ``osd``,
+and two node buckets named ``host`` and ``rack`` respectively.
+
+.. ditaa:: 
+                           +-----------+
+                           | {o}rack   | 
+                           |   Bucket  |
+                           +-----+-----+   
+                                 |
+                 +---------------+---------------+             
+                 |                               |
+           +-----+-----+                   +-----+-----+
+           | {o}host   |                   | {o}host   |
+           |   Bucket  |                   |   Bucket  |           
+           +-----+-----+                   +-----+-----+
+                 |                               | 
+         +-------+-------+               +-------+-------+
+         |               |               |               |
+   +-----+-----+   +-----+-----+   +-----+-----+   +-----+-----+
+   |    osd    |   |    osd    |   |    osd    |   |    osd    |
+   |   Bucket  |   |   Bucket  |   |   Bucket  |   |   Bucket  | 
+   +-----------+   +-----------+   +-----------+   +-----------+
+
+.. note:: The higher numbered ``rack`` bucket type aggregates the lower 
+   numbered ``host`` bucket type. 
+
+Since leaf nodes reflect storage devices declared under the ``#devices`` list 
+at the beginning of the CRUSH map, you do not need to declare them as bucket
+instances. The second lowest bucket type in your hierarchy usually aggregates
+the devices (i.e., it's usually the computer containing the storage media, and
+uses whatever term you prefer to describe it, such as  "node", "computer",
+"server," "host", "machine", etc.). In high density environments, it is
+increasingly common to see multiple hosts/nodes per chassis. You should account
+for chassis failure too--e.g., the need to pull a chassis if a node fails may 
+result in bringing down numerous hosts/nodes and their OSDs.
+
+When declaring a bucket instance, you must specify its type, give it a unique
+name (string), assign it a unique ID expressed as a negative integer (optional),
+specify a weight relative to the total capacity/capability of its item(s),
+specify the bucket algorithm (usually ``straw``), and the hash (usually ``0``,
+reflecting hash algorithm ``rjenkins1``). A bucket may have one or more items.
+The items may consist of node buckets or leaves. Items may have a weight that
+reflects the relative weight of the item.
+
+You may declare a node bucket with the following syntax:: 
+
+	[bucket-type] [bucket-name] {
+		id [a unique negative numeric ID]
+		weight [the relative capacity/capability of the item(s)]
+		alg [the bucket type: uniform | list | tree | straw ]
+		hash [the hash type: 0 by default]
+		item [item-name] weight [weight]	
+	}
+
+For example, using the diagram above, we would define two host buckets
+and one rack bucket. The OSDs are declared as items within the host buckets::
+
+	host node1 {
+		id -1
+		alg straw
+		hash 0
+		item osd.0 weight 1.00
+		item osd.1 weight 1.00
+	}
+
+	host node2 {
+		id -2
+		alg straw
+		hash 0
+		item osd.2 weight 1.00
+		item osd.3 weight 1.00
+	}
+
+	rack rack1 {
+		id -3
+		alg straw
+		hash 0
+		item node1 weight 2.00
+		item node2 weight 2.00
+	}
+
+.. note:: In the foregoing example, note that the rack bucket does not contain
+   any OSDs. Rather it contains lower level host buckets, and includes the 
+   sum total of their weight in the item entry.
+
+.. topic:: Bucket Types
+
+   Ceph supports four bucket types, each representing a tradeoff between   
+   performance and reorganization efficiency. If you are unsure of which bucket
+   type to use, we recommend using a ``straw`` bucket.  For a detailed
+   discussion of bucket types, refer to 
+   `CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data`_,
+   and more specifically to **Section 3.4**. The bucket types are: 
+   
+	#. **Uniform:** Uniform buckets aggregate devices with **exactly** the same
+	   weight. For example, when firms commission or decommission hardware, they 
+	   typically do so with many machines that have exactly the same physical
+	   configuration (e.g., bulk purchases). When storage devices have exactly 
+	   the same weight, you may use the ``uniform`` bucket type, which allows 
+	   CRUSH to map replicas into uniform buckets in constant time. With 
+	   non-uniform weights, you should use another bucket algorithm.
+	
+	#. **List**: List buckets aggregate their content as linked lists. Based on 
+	   the :abbr:`RUSH (Replication Under Scalable Hashing)` :sub:`P` algorithm,
+	   a list is a natural and intuitive choice for an **expanding cluster**: 
+	   either an object is relocated to the newest device with some appropriate 
+	   probability, or it remains on the older devices as before. The result is 
+	   optimal data migration when items are added to the bucket. Items removed 
+	   from the middle or tail of the list, however, can result in a significant 
+	   amount of unnecessary movement, making list buckets most suitable for 
+	   circumstances in which they **never (or very rarely) shrink**.
+	   
+	#. **Tree**: Tree buckets use a binary search tree. They are more efficient
+	   than list buckets when a bucket contains a larger set of items. Based on 
+	   the :abbr:`RUSH (Replication Under Scalable Hashing)` :sub:`R` algorithm,
+	   tree buckets reduce the placement time to O(log :sub:`n`), making them 
+	   suitable for managing much larger sets of devices or nested buckets.
+	
+	#. **Straw:** List and Tree buckets use a divide and conquer strategy 
+	   in a way that either gives certain items precedence (e.g., those 
+	   at the beginning of a list) or obviates the need to consider entire 
+	   subtrees of items at all. That improves the performance of the replica 
+	   placement process, but can also introduce suboptimal reorganization 
+	   behavior when the contents of a bucket change due an addition, removal, 
+	   or re-weighting of an item. The straw bucket type allows all items to 
+	   fairly “compete” against each other for replica placement through a 
+	   process analogous to a draw of straws.
+
+.. topic:: Hash
+
+   Each bucket uses a hash algorithm. Currently, Ceph supports ``rjenkins1``.
+   Enter ``0`` as your hash setting to select ``rjenkins1``.
+
+
+.. _weightingbucketitems:
+
+.. topic:: Weighting Bucket Items
+
+   Ceph expresses bucket weights as doubles, which allows for fine
+   weighting. A weight is the relative difference between device capacities. We
+   recommend using ``1.00`` as the relative weight for a 1TB storage device.
+   In such a scenario, a weight of ``0.5`` would represent approximately 500GB,
+   and a weight of ``3.00`` would represent approximately 3TB. Higher level 
+   buckets have a weight that is the sum total of the leaf items aggregated by
+   the bucket.
+   
+   A bucket item weight is one dimensional, but you may also calculate your 
+   item weights to reflect the performance of the storage drive. For example, 
+   if you have many 1TB drives where some have relatively low data transfer 
+   rate and the others have a relatively high data transfer rate, you may 
+   weight them differently, even though they have the same capacity (e.g., 
+   a weight of 0.80 for the first set of drives with lower total throughput, 
+   and 1.20 for the second set of drives with higher total throughput).
+
+
+.. _crushmaprules:
+
+CRUSH Map Rules
+---------------
+
+CRUSH maps support the notion of 'CRUSH rules', which are the rules that
+determine data placement for a pool. For large clusters, you will likely create
+many pools where each pool may have its own CRUSH ruleset and rules. The default
+CRUSH map has a rule for each pool, and one ruleset assigned to each of the
+default pools.
+
+.. note:: In most cases, you will not need to modify the default rules. When
+   you create a new pool, its default ruleset is ``0``.
+
+
+CRUSH rules defines placement and replication strategies or distribution policies
+that allow you to specify exactly how CRUSH places object replicas. For
+example, you might create a rule selecting a pair of targets for 2-way
+mirroring, another rule for selecting three targets in two different data
+centers for 3-way mirroring, and yet another rule for erasure coding over six
+storage devices. For a detailed discussion of CRUSH rules, refer to
+`CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data`_,
+and more specifically to **Section 3.2**.
+
+A rule takes the following form:: 
+
+	rule <rulename> {
+	
+		ruleset <ruleset>
+		type [ replicated | erasure ]
+		min_size <min-size>
+		max_size <max-size>
+		step take <bucket-name>
+		step [choose|chooseleaf] [firstn|indep] <N> <bucket-type>
+		step emit
+	}
+
+
+``ruleset``
+
+:Description: A means of classifying a rule as belonging to a set of rules. 
+              Activated by `setting the ruleset in a pool`_.
+
+:Purpose: A component of the rule mask.
+:Type: Integer
+:Required: Yes
+:Default: 0
+
+.. _setting the ruleset in a pool: ../pools#setpoolvalues
+
+
+``type``
+
+:Description: Describes a rule for either a storage drive (replicated) 
+              or a RAID.
+              
+:Purpose: A component of the rule mask. 
+:Type: String
+:Required: Yes
+:Default: ``replicated``
+:Valid Values: Currently only ``replicated`` and ``erasure``
+
+``min_size``
+
+:Description: If a pool makes fewer replicas than this number, CRUSH will 
+              **NOT** select this rule.
+
+:Type: Integer
+:Purpose: A component of the rule mask.
+:Required: Yes
+:Default: ``1``
+
+``max_size``
+
+:Description: If a pool makes more replicas than this number, CRUSH will 
+              **NOT** select this rule.
+              
+:Type: Integer
+:Purpose: A component of the rule mask.
+:Required: Yes
+:Default: 10
+
+
+``step take <bucket-name>``
+
+:Description: Takes a bucket name, and begins iterating down the tree.
+:Purpose: A component of the rule.
+:Required: Yes
+:Example: ``step take data``
+
+
+``step choose firstn {num} type {bucket-type}``
+
+:Description: Selects the number of buckets of the given type. The number is 
+              usually the number of replicas in the pool (i.e., pool size). 
+
+              - If ``{num} == 0``, choose ``pool-num-replicas`` buckets (all available).
+              - If ``{num} > 0 && < pool-num-replicas``, choose that many buckets.
+              - If ``{num} < 0``, it means ``pool-num-replicas - {num}``.
+
+:Purpose: A component of the rule.
+:Prerequisite: Follows ``step take`` or ``step choose``.  
+:Example: ``step choose firstn 1 type row``
+
+
+``step chooseleaf firstn {num} type {bucket-type}``
+
+:Description: Selects a set of buckets of ``{bucket-type}`` and chooses a leaf 
+              node from the subtree of each bucket in the set of buckets. The 
+              number of buckets in the set is usually the number of replicas in
+              the pool (i.e., pool size).
+
+              - If ``{num} == 0``, choose ``pool-num-replicas`` buckets (all available).
+              - If ``{num} > 0 && < pool-num-replicas``, choose that many buckets.
+              - If ``{num} < 0``, it means ``pool-num-replicas - {num}``.
+
+:Purpose: A component of the rule. Usage removes the need to select a device using two steps.
+:Prerequisite: Follows ``step take`` or ``step choose``.  
+:Example: ``step chooseleaf firstn 0 type row``
+
+
+
+``step emit`` 
+
+:Description: Outputs the current value and empties the stack. Typically used 
+              at the end of a rule, but may also be used to pick from different
+              trees in the same rule.
+              
+:Purpose: A component of the rule.
+:Prerequisite: Follows ``step choose``.
+:Example: ``step emit``
+
+.. important:: To activate one or more rules with a common ruleset number to a 
+   pool, set the ruleset number of the pool.
+
+
+
+Primary Affinity
+================
+
+When a Ceph Client reads or writes data, it always contacts the primary OSD in
+the acting set. For set ``[2, 3, 4]``, ``osd.2`` is the primary. Sometimes an
+OSD isn't well suited to act as a primary compared to other OSDs (e.g., it has 
+a slow disk or a slow controller). To prevent performance bottlenecks 
+(especially on read operations) while maximizing utilization of your hardware,
+you can set a Ceph OSD's primary affinity so that CRUSH is less likely to use 
+the OSD as a primary in an acting set. ::
+
+	ceph osd primary-affinity <osd-id> <weight>
+
+Primary affinity is ``1`` by default (*i.e.,* an OSD may act as a primary). You
+may set the OSD primary range from ``0-1``, where ``0`` means that the OSD may
+**NOT** be used as a primary and ``1`` means that an OSD may be used as a
+primary.  When the weight is ``< 1``, it is less likely that CRUSH will select
+the Ceph OSD Daemon to act as a primary.
+
+
+Placing Different Pools on Different OSDS:
+==========================================
+
+Suppose you want to have most pools default to OSDs backed by large hard drives,
+but have some pools mapped to OSDs backed by fast solid-state drives (SSDs).
+It's possible to have multiple independent CRUSH heirarchies within the same
+CRUSH map. Define two hierarchies with two different root nodes--one for hard
+disks (e.g., "root platter") and one for SSDs (e.g., "root ssd") as shown
+below::
+
+  device 0 osd.0
+  device 1 osd.1
+  device 2 osd.2
+  device 3 osd.3
+  device 4 osd.4
+  device 5 osd.5
+  device 6 osd.6
+  device 7 osd.7
+
+	host ceph-osd-ssd-server-1 {
+		id -1
+		alg straw
+		hash 0
+		item osd.0 weight 1.00
+		item osd.1 weight 1.00
+	}
+
+	host ceph-osd-ssd-server-2 {
+		id -2
+		alg straw
+		hash 0
+		item osd.2 weight 1.00
+		item osd.3 weight 1.00
+	}
+
+	host ceph-osd-platter-server-1 {
+		id -3
+		alg straw
+		hash 0
+		item osd.4 weight 1.00
+		item osd.5 weight 1.00
+	}
+
+	host ceph-osd-platter-server-2 {
+		id -4
+		alg straw
+		hash 0
+		item osd.6 weight 1.00
+		item osd.7 weight 1.00
+	}
+
+	root platter {
+		id -5	
+		alg straw
+		hash 0
+		item ceph-osd-platter-server-1 weight 2.00
+		item ceph-osd-platter-server-2 weight 2.00
+	}
+
+	root ssd {
+		id -6	
+		alg straw
+		hash 0
+		item ceph-osd-ssd-server-1 weight 2.00
+		item ceph-osd-ssd-server-2 weight 2.00
+	}
+
+	rule data {
+		ruleset 0
+		type replicated
+		min_size 2
+		max_size 2
+		step take platter
+		step chooseleaf firstn 0 type host
+		step emit
+	}
+
+	rule metadata {
+		ruleset 1
+		type replicated
+		min_size 0
+		max_size 10
+		step take platter
+		step chooseleaf firstn 0 type host
+		step emit
+	}
+
+	rule rbd {
+		ruleset 2
+		type replicated
+		min_size 0
+		max_size 10
+		step take platter
+		step chooseleaf firstn 0 type host
+		step emit
+	}
+
+	rule platter {
+		ruleset 3
+		type replicated
+		min_size 0
+		max_size 10
+		step take platter
+		step chooseleaf firstn 0 type host
+		step emit
+	}
+
+	rule ssd {
+		ruleset 4
+		type replicated
+		min_size 0
+		max_size 4
+		step take ssd
+		step chooseleaf firstn 0 type host
+		step emit
+	}
+
+	rule ssd-primary {
+		ruleset 5
+		type replicated
+		min_size 5
+		max_size 10
+		step take ssd
+		step chooseleaf firstn 1 type host
+		step emit
+		step take platter
+		step chooseleaf firstn -1 type host
+		step emit
+	}
+
+You can then set a pool to use the SSD rule by::
+
+  ceph osd pool set <poolname> crush_ruleset 4
+
+Similarly, using the ``ssd-primary`` rule will cause each placement group in the
+pool to be placed with an SSD as the primary and platters as the replicas.
+
+.. _addosd:
+
+Add/Move an OSD
+===============
+
+To add or move an OSD in the CRUSH map of a running cluster, execute the 
+``ceph osd crush set``. For Argonaut (v 0.48), execute the following::
+
+	ceph osd crush set {id} {name} {weight} pool={pool-name}  [{bucket-type}={bucket-name} ...]
+	
+For Bobtail (v 0.56), execute the following:: 
+
+	ceph osd crush set {id-or-name} {weight} root={pool-name}  [{bucket-type}={bucket-name} ...]
+
+Where:
+
+``id``
+
+:Description: The numeric ID of the OSD.
+:Type: Integer
+:Required: Yes
+:Example: ``0``
+
+
+``name``
+
+:Description: The full name of the OSD. 
+:Type: String
+:Required: Yes
+:Example: ``osd.0``
+
+
+``weight``
+
+:Description: The CRUSH weight for the OSD. 
+:Type: Double
+:Required: Yes
+:Example: ``2.0``
+
+
+``root``
+
+:Description: The root of the tree in which the OSD resides.
+:Type: Key/value pair.
+:Required: Yes
+:Example: ``root=default``
+
+
+``bucket-type``
+
+:Description: You may specify the OSD's location in the CRUSH hierarchy. 
+:Type: Key/value pairs.
+:Required: No
+:Example: ``datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1``
+
+
+The following example adds ``osd.0`` to the hierarchy, or moves the OSD from a
+previous location. :: 
+
+	ceph osd crush set osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
+
+
+Adjust an OSD's CRUSH Weight
+============================
+
+To adjust an OSD's crush weight in the CRUSH map of a running cluster, execute
+the following::
+
+	ceph osd crush reweight {name} {weight}
+
+Where:
+
+``name``
+
+:Description: The full name of the OSD. 
+:Type: String
+:Required: Yes
+:Example: ``osd.0``
+
+
+``weight``
+
+:Description: The CRUSH weight for the OSD. 
+:Type: Double
+:Required: Yes
+:Example: ``2.0``
+
+
+.. _removeosd:
+
+Remove an OSD
+=============
+
+To remove an OSD from the CRUSH map of a running cluster, execute the following::
+
+	ceph osd crush remove {name}  
+
+Where:
+
+``name``
+
+:Description: The full name of the OSD. 
+:Type: String
+:Required: Yes
+:Example: ``osd.0``
+
+Add a Bucket
+============
+
+To add a bucket in the CRUSH map of a running cluster, execute the ``ceph osd crush add-bucket`` command::
+
+	ceph osd crush add-bucket {bucket-name} {bucket-type}
+
+Where:
+
+``bucket-name``
+
+:Description: The full name of the bucket.
+:Type: String
+:Required: Yes
+:Example: ``rack12``
+
+
+``bucket-type``
+
+:Description: The type of the bucket. The type must already exist in the hierarchy.
+:Type: String
+:Required: Yes
+:Example: ``rack``
+
+
+The following example adds the ``rack12`` bucket to the hierarchy::
+
+	ceph osd crush add-bucket rack12 rack
+
+Move a Bucket
+=============
+
+To move a bucket to a different location or position in the CRUSH map hierarchy,
+execute the following:: 
+
+	ceph osd crush move {bucket-name} {bucket-type}={bucket-name}, [...]
+
+Where:
+
+``bucket-name``
+
+:Description: The name of the bucket to move/reposition.
+:Type: String
+:Required: Yes
+:Example: ``foo-bar-1``
+
+``bucket-type``
+
+:Description: You may specify the bucket's location in the CRUSH hierarchy. 
+:Type: Key/value pairs.
+:Required: No
+:Example: ``datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1``
+
+Remove a Bucket
+===============
+
+To remove a bucket from the CRUSH map hierarchy, execute the following::
+
+	ceph osd crush remove {bucket-name}
+
+.. note:: A bucket must be empty before removing it from the CRUSH hierarchy.
+
+Where:
+
+``bucket-name``
+
+:Description: The name of the bucket that you'd like to remove.
+:Type: String
+:Required: Yes
+:Example: ``rack12``
+
+The following example removes the ``rack12`` bucket from the hierarchy::
+
+	ceph osd crush remove rack12
+
+Tunables
+========
+
+Over time, we have made (and continue to make) improvements to the
+CRUSH algorithm used to calculate the placement of data.  In order to
+support the change in behavior, we have introduced a series of tunable
+options that control whether the legacy or improved variation of the
+algorithm is used.
+
+In order to use newer tunables, both clients and servers must support
+the new version of CRUSH.  For this reason, we have created
+``profiles`` that are named after the Ceph version in which they were
+introduced.  For example, the ``firefly`` tunables are first supported
+in the firefly release, and will not work with older (e.g., dumpling)
+clients.  Once a given set of tunables are changed from the legacy
+default behavior, the ``ceph-mon`` and ``ceph-osd`` will prevent older
+clients who do not support the new CRUSH features from connecting to
+the cluster.
+
+argonaut (legacy)
+-----------------
+
+The legacy CRUSH behavior used by argonaut and older releases works
+fine for most clusters, provided there are not too many OSDs that have
+been marked out.
+
+bobtail
+-------
+
+The bobtail tunable profile (CRUSH_TUNABLES feature) fixes a few key
+misbehaviors:
+
+ * For hierarchies with a small number of devices in the leaf buckets,
+   some PGs map to fewer than the desired number of replicas.  This
+   commonly happens for hierarchies with "host" nodes with a small
+   number (1-3) of OSDs nested beneath each one.
+
+ * For large clusters, some small percentages of PGs map to less than
+   the desired number of OSDs.  This is more prevalent when there are
+   several layers of the hierarchy (e.g., row, rack, host, osd).
+
+ * When some OSDs are marked out, the data tends to get redistributed
+   to nearby OSDs instead of across the entire hierarchy.
+
+The new tunables are:
+
+ * ``choose_local_tries``: Number of local retries.  Legacy value is
+   2, optimal value is 0.
+
+ * ``choose_local_fallback_tries``: Legacy value is 5, optimal value
+   is 0.
+
+ * ``choose_total_tries``: Total number of attempts to choose an item.
+   Legacy value was 19, subsequent testing indicates that a value of
+   50 is more appropriate for typical clusters.  For extremely large
+   clusters, a larger value might be necessary.
+
+ * ``chooseleaf_descend_once``: Whether a recursive chooseleaf attempt
+   will retry, or only try once and allow the original placement to
+   retry.  Legacy default is 0, optimal value is 1.
+
+Migration impact:
+
+ * Moving from argonaut to bobtail tunables triggers a moderate amount
+   of data movement.  Use caution on a cluster that is already
+   populated with data.
+
+firefly
+-------
+
+The firefly tunable profile (CRUSH_TUNABLES2 feature) fixes a problem
+with the ``chooseleaf`` CRUSH rule behavior that tends to result in PG
+mappings with too few results when too many OSDs have been marked out.
+
+The new tunable is:
+
+ * ``chooseleaf_vary_r``: Whether a recursive chooseleaf attempt will
+   start with a non-zero value of r, based on how many attempts the
+   parent has already made.  Legacy default is 0, but with this value
+   CRUSH is sometimes unable to find a mapping.  The optimal value (in
+   terms of computational cost and correctness) is 1.
+
+Migration impact: 
+
+ * For existing clusters that have lots of existing data, changing
+   from 0 to 1 will cause a lot of data to move; a value of 4 or 5
+   will allow CRUSH to find a valid mapping but will make less data
+   move.
+
+straw_calc_version tunable
+--------------------------
+
+There were some problems with the internal weights calculated and
+stored in the CRUSH map for ``straw`` buckets.  Specifically, when
+there were items with a CRUSH weight of 0 or both a mix of weights and
+some duplicated weights CRUSH would distribute data incorrectly (i.e.,
+not in proportion to the weights).
+
+The new tunable is:
+
+ * ``straw_calc_version``: A value of 0 preserves the old, broken
+   internal weight calculation; a value of 1 fixes the behavior.
+
+Migration impact:
+
+ * Moving to straw_calc_version 1 and then adjusting a straw bucket
+   (by adding, removing, or reweighting an item, or by using the
+   reweight-all command) can trigger a small to moderate amount of
+   data movement *if* the cluster has hit one of the problematic
+   conditions.
+
+hammer
+------
+
+The hammer tunable profile (CRUSH_V4 feature) does not affect the
+mapping of existing CRUSH maps simply by changing the profile.  However:
+
+ * There is a new bucket type (``straw2``) supported.  The new
+   ``straw2`` bucket type fixes several limitations in the original
+   ``straw`` bucket.  Specifically, the old ``straw`` buckets would
+   change some mappings that should have changed when a weight was
+   adjusted, while ``straw2`` achieves the original goal of only
+   changing mappings to or from the bucket item whose weight has
+   changed.
+
+ * ``straw2`` is the default for any newly created buckets.
+
+Migration impact:
+
+ * Changing a bucket type from ``straw`` to ``straw2`` will result in
+   a reasonably small amount of data movement, depending on how much
+   the bucket item weights vary from each other.  When the weights are
+   all the same no data will move, and when item weights vary
+   significantly there will be more movement.
+
+jewel
+-----
+
+The jewel tunable profile (CRUSH_TUNABLES5 feature) improves the
+overall behavior of CRUSH such that significantly fewer mappings
+change when an OSD is marked out of the cluster.
+
+The new tunable is:
+
+ * ``chooseleaf_stable``: Whether a recursive chooseleaf attempt will
+   use a better value for an inner loop that greatly reduces the number
+   of mapping changes when an OSD is marked out.  The legacy value is 0,
+   while the new value of 1 uses the new approach.
+
+Migration impact:
+
+ * Changing this value on an existing cluster will result in a very
+   large amount of data movement as almost every PG mapping is likely
+   to change.
+
+
+
+
+Which client versions support CRUSH_TUNABLES
+--------------------------------------------
+
+ * argonaut series, v0.48.1 or later
+ * v0.49 or later
+ * Linux kernel version v3.6 or later (for the file system and RBD kernel clients)
+
+Which client versions support CRUSH_TUNABLES2
+---------------------------------------------
+
+ * v0.55 or later, including bobtail series (v0.56.x)
+ * Linux kernel version v3.9 or later (for the file system and RBD kernel clients)
+
+Which client versions support CRUSH_TUNABLES3
+---------------------------------------------
+
+ * v0.78 (firefly) or later
+ * Linux kernel version v3.15 or later (for the file system and RBD kernel clients)
+
+Which client versions support CRUSH_V4
+--------------------------------------
+
+ * v0.94 (hammer) or later
+ * Linux kernel version v4.1 or later (for the file system and RBD kernel clients)
+
+Which client versions support CRUSH_TUNABLES5
+---------------------------------------------
+
+ * v10.0.2 (jewel) or later
+ * Linux kernel version v4.5 or later (for the file system and RBD kernel clients)
+
+Warning when tunables are non-optimal
+-------------------------------------
+
+Starting with version v0.74, Ceph will issue a health warning if the
+CRUSH tunables are not set to their optimal values (the optimal values are
+the default as of v0.73).  To make this warning go away, you have two options:
+
+1. Adjust the tunables on the existing cluster.  Note that this will
+   result in some data movement (possibly as much as 10%).  This is the
+   preferred route, but should be taken with care on a production cluster
+   where the data movement may affect performance.  You can enable optimal
+   tunables with::
+
+      ceph osd crush tunables optimal
+
+   If things go poorly (e.g., too much load) and not very much
+   progress has been made, or there is a client compatibility problem
+   (old kernel cephfs or rbd clients, or pre-bobtail librados
+   clients), you can switch back with::
+
+      ceph osd crush tunables legacy
+
+2. You can make the warning go away without making any changes to CRUSH by
+   adding the following option to your ceph.conf ``[mon]`` section::
+
+      mon warn on legacy crush tunables = false
+
+   For the change to take effect, you will need to restart the monitors, or
+   apply the option to running monitors with::
+
+      ceph tell mon.\* injectargs --no-mon-warn-on-legacy-crush-tunables
+
+
+A few important points
+----------------------
+
+ * Adjusting these values will result in the shift of some PGs between
+   storage nodes.  If the Ceph cluster is already storing a lot of
+   data, be prepared for some fraction of the data to move.
+ * The ``ceph-osd`` and ``ceph-mon`` daemons will start requiring the
+   feature bits of new connections as soon as they get
+   the updated map.  However, already-connected clients are
+   effectively grandfathered in, and will misbehave if they do not
+   support the new feature.
+ * If the CRUSH tunables are set to non-legacy values and then later
+   changed back to the defult values, ``ceph-osd`` daemons will not be
+   required to support the feature.  However, the OSD peering process
+   requires examining and understanding old maps.  Therefore, you
+   should not run old versions of the ``ceph-osd`` daemon
+   if the cluster has previously used non-legacy CRUSH values, even if
+   the latest version of the map has been switched back to using the
+   legacy defaults.
+
+Tuning CRUSH
+------------
+
+The simplest way to adjust the crush tunables is by changing to a known
+profile.  Those are:
+
+ * ``legacy``: the legacy behavior from argonaut and earlier.
+ * ``argonaut``: the legacy values supported by the original argonaut release
+ * ``bobtail``: the values supported by the bobtail release
+ * ``firefly``: the values supported by the firefly release
+ * ``optimal``: the current best values
+ * ``default``: the current default values for a new cluster
+
+You can select a profile on a running cluster with the command::
+
+ ceph osd crush tunables {PROFILE}
+
+Note that this may result in some data movement.
+
+
+Tuning CRUSH, the hard way
+--------------------------
+
+If you can ensure that all clients are running recent code, you can
+adjust the tunables by extracting the CRUSH map, modifying the values,
+and reinjecting it into the cluster.
+
+* Extract the latest CRUSH map::
+
+	ceph osd getcrushmap -o /tmp/crush
+
+* Adjust tunables.  These values appear to offer the best behavior
+  for both large and small clusters we tested with.  You will need to
+  additionally specify the ``--enable-unsafe-tunables`` argument to
+  ``crushtool`` for this to work.  Please use this option with
+  extreme care.::
+
+	crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.new
+
+* Reinject modified map::
+
+	ceph osd setcrushmap -i /tmp/crush.new
+
+Legacy values
+-------------
+
+For reference, the legacy values for the CRUSH tunables can be set
+with::
+
+   crushtool -i /tmp/crush --set-choose-local-tries 2 --set-choose-local-fallback-tries 5 --set-choose-total-tries 19 --set-chooseleaf-descend-once 0 --set-chooseleaf-vary-r 0 -o /tmp/crush.legacy
+
+Again, the special ``--enable-unsafe-tunables`` option is required.
+Further, as noted above, be careful running old versions of the
+``ceph-osd`` daemon after reverting to legacy values as the feature
+bit is not perfectly enforced.
+
+.. _CRUSH - Controlled, Scalable, Decentralized Placement of Replicated Data: http://ceph.com/papers/weil-crush-sc06.pdf
diff --git a/doc/rados/operations/data-placement.rst b/doc/rados/operations/data-placement.rst
new file mode 100644
index 0000000..660df4f
--- /dev/null
+++ b/doc/rados/operations/data-placement.rst
@@ -0,0 +1,39 @@
+=========================
+ Data Placement Overview
+=========================
+
+Ceph stores, replicates and rebalances data objects across a RADOS cluster
+dynamically.  With many different users storing objects in different pools for
+different purposes on countless OSDs, Ceph operations require some data
+placement planning.  The main data placement planning concepts in Ceph include: 
+
+- **Pools:** Ceph stores data within pools, which are logical groups for storing
+  objects. Pools manage the number of placement groups, the number of replicas,
+  and the ruleset for the pool. To store data in a pool, you must have
+  an authenticated user with permissions for the pool. Ceph can snapshot pools. 
+  See `Pools`_ for additional details.
+  
+- **Placement Groups:** Ceph maps objects to placement groups (PGs). 
+  Placement groups (PGs) are shards or fragments of a logical object pool
+  that place objects as a group into OSDs. Placement groups reduce the amount 
+  of per-object metadata when Ceph stores the data in OSDs. A larger number of 
+  placement groups (e.g., 100 per OSD) leads to better balancing. See 
+  `Placement Groups`_ for additional details.
+
+- **CRUSH Maps:**  CRUSH is a big part of what allows Ceph to scale without 
+  performance bottlenecks, without limitations to scalability, and without a 
+  single point of failure. CRUSH maps provide the physical topology of the 
+  cluster to the CRUSH algorithm to determine where the data for an object 
+  and its replicas should be stored, and how to do so across failure domains 
+  for added data safety among other things. See `CRUSH Maps`_ for additional
+  details.
+  
+When you initially set up a test cluster, you can use the default values. Once
+you begin planning for a large Ceph cluster, refer to pools, placement groups
+and CRUSH for data placement operations. If you find some aspects challenging,
+`Inktank`_ provides excellent  premium support for Ceph.
+
+.. _Pools: ../pools
+.. _Placement Groups: ../placement-groups
+.. _CRUSH Maps: ../crush-map
+.. _Inktank: http://www.inktank.com
\ No newline at end of file
diff --git a/doc/rados/operations/erasure-code-isa.rst b/doc/rados/operations/erasure-code-isa.rst
new file mode 100644
index 0000000..9d4ff7f
--- /dev/null
+++ b/doc/rados/operations/erasure-code-isa.rst
@@ -0,0 +1,94 @@
+=======================
+ISA erasure code plugin
+=======================
+
+The *isa* plugin encapsulates the `ISA
+<https://01.org/intel%C2%AE-storage-acceleration-library-open-source-version/>`_
+library. It only runs on Intel processors.
+
+Create an isa profile
+=====================
+
+To create a new *isa* erasure code profile::
+
+        ceph osd erasure-code-profile set {name} \
+             plugin=isa \
+             technique={reed_sol_van|cauchy} \
+             [k={data-chunks}] \
+             [m={coding-chunks}] \
+             [ruleset-root={root}] \
+             [ruleset-failure-domain={bucket-type}] \
+             [directory={directory}] \
+             [--force]
+
+Where:
+
+``k={data chunks}``
+
+:Description: Each object is split in **data-chunks** parts,
+              each stored on a different OSD.
+
+:Type: Integer
+:Required: No.
+:Default: 7
+
+``m={coding-chunks}``
+
+:Description: Compute **coding chunks** for each object and store them
+              on different OSDs. The number of coding chunks is also
+              the number of OSDs that can be down without losing data.
+
+:Type: Integer
+:Required: No.
+:Default: 3
+
+``technique={reed_sol_van|cauchy}``
+
+:Description: The ISA plugin comes in two `Reed Solomon
+              <https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction>`_
+              forms. If *reed_sol_van* is set, it is `Vandermonde
+              <https://en.wikipedia.org/wiki/Vandermonde_matrix>`_, if
+              *cauchy* is set, it is `Cauchy
+              <https://en.wikipedia.org/wiki/Cauchy_matrix>`_.
+
+:Type: String
+:Required: No.
+:Default: reed_sol_van
+
+``ruleset-root={root}``
+
+:Description: The name of the crush bucket used for the first step of
+              the ruleset. For intance **step take default**.
+
+:Type: String
+:Required: No.
+:Default: default
+
+``ruleset-failure-domain={bucket-type}``
+
+:Description: Ensure that no two chunks are in a bucket with the same
+              failure domain. For instance, if the failure domain is
+              **host** no two chunks will be stored on the same
+              host. It is used to create a ruleset step such as **step
+              chooseleaf host**.
+
+:Type: String
+:Required: No.
+:Default: host
+
+``directory={directory}``
+
+:Description: Set the **directory** name from which the erasure code
+              plugin is loaded.
+
+:Type: String
+:Required: No.
+:Default: /usr/lib/ceph/erasure-code
+
+``--force``
+
+:Description: Override an existing profile by the same name.
+
+:Type: String
+:Required: No.
+
diff --git a/doc/rados/operations/erasure-code-jerasure.rst b/doc/rados/operations/erasure-code-jerasure.rst
new file mode 100644
index 0000000..bd2917e
--- /dev/null
+++ b/doc/rados/operations/erasure-code-jerasure.rst
@@ -0,0 +1,109 @@
+============================
+Jerasure erasure code plugin
+============================
+
+The *jerasure* plugin is the most generic and flexible plugin, it is
+also the default for Ceph erasure coded pools. 
+
+The *jerasure* plugin encapsulates the `Jerasure
+<https://bitbucket.org/jimplank/jerasure/>`_ library. It is
+recommended to read the *jerasure* documentation to get a better
+understanding of the parameters.
+
+Create a jerasure profile
+=========================
+
+To create a new *jerasure* erasure code profile::
+
+        ceph osd erasure-code-profile set {name} \
+             plugin=jerasure \
+             k={data-chunks} \
+             m={coding-chunks} \
+             technique={reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion} \
+             [ruleset-root={root}] \
+             [ruleset-failure-domain={bucket-type}] \
+             [directory={directory}] \
+             [--force]
+
+Where:
+
+``k={data chunks}``
+
+:Description: Each object is split in **data-chunks** parts,
+              each stored on a different OSD.
+
+:Type: Integer
+:Required: Yes.
+:Example: 4
+
+``m={coding-chunks}``
+
+:Description: Compute **coding chunks** for each object and store them
+              on different OSDs. The number of coding chunks is also
+              the number of OSDs that can be down without losing data.
+
+:Type: Integer
+:Required: Yes.
+:Example: 2
+
+``technique={reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion}``
+
+:Description: The more flexible technique is *reed_sol_van* : it is
+              enough to set *k* and *m*. The *cauchy_good* technique
+              can be faster but you need to chose the *packetsize*
+              carefully. All of *reed_sol_r6_op*, *liberation*,
+              *blaum_roth*, *liber8tion* are *RAID6* equivalents in
+              the sense that they can only be configured with *m=2*. 
+
+:Type: String
+:Required: No.
+:Default: reed_sol_van
+
+``packetsize={bytes}``
+
+:Description: The encoding will be done on packets of *bytes* size at
+              a time. Chosing the right packet size is difficult. The
+              *jerasure* documentation contains extensive information
+              on this topic.
+
+:Type: Integer
+:Required: No.
+:Default: 2048
+
+``ruleset-root={root}``
+
+:Description: The name of the crush bucket used for the first step of
+              the ruleset. For intance **step take default**.
+
+:Type: String
+:Required: No.
+:Default: default
+
+``ruleset-failure-domain={bucket-type}``
+
+:Description: Ensure that no two chunks are in a bucket with the same
+              failure domain. For instance, if the failure domain is
+              **host** no two chunks will be stored on the same
+              host. It is used to create a ruleset step such as **step
+              chooseleaf host**.
+
+:Type: String
+:Required: No.
+:Default: host
+
+``directory={directory}``
+
+:Description: Set the **directory** name from which the erasure code
+              plugin is loaded.
+
+:Type: String
+:Required: No.
+:Default: /usr/lib/ceph/erasure-code
+
+``--force``
+
+:Description: Override an existing profile by the same name.
+
+:Type: String
+:Required: No.
+
diff --git a/doc/rados/operations/erasure-code-lrc.rst b/doc/rados/operations/erasure-code-lrc.rst
new file mode 100644
index 0000000..3c9b269
--- /dev/null
+++ b/doc/rados/operations/erasure-code-lrc.rst
@@ -0,0 +1,360 @@
+======================================
+Locally repairable erasure code plugin
+======================================
+
+With the *jerasure* plugin, when an erasure coded object is stored on
+multiple OSDs, recovering from the loss of one OSD requires reading
+from all the others. For instance if *jerasure* is configured with
+*k=8* and *m=4*, losing one OSD requires reading from the eleven
+others to repair.
+
+The *lrc* erasure code plugin creates local parity chunks to be able
+to recover using less OSDs. For instance if *lrc* is configured with
+*k=8*, *m=4* and *l=4*, it will create an additional parity chunk for
+every four OSDs. When a single OSD is lost, it can be recovered with
+only four OSDs instead of eleven.
+
+Erasure code profile examples
+=============================
+
+Reduce recovery bandwidth between hosts
+---------------------------------------
+
+Although it is probably not an interesting use case when all hosts are
+connected to the same switch, reduced bandwidth usage can actually be
+observed.::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             k=4 m=2 l=3 \
+             ruleset-failure-domain=host
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+
+Reduce recovery bandwidth between racks
+---------------------------------------
+
+In Firefly the reduced bandwidth will only be observed if the primary
+OSD is in the same rack as the lost chunk.::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             k=4 m=2 l=3 \
+             ruleset-locality=rack \
+             ruleset-failure-domain=host
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+
+Create an lrc profile
+=====================
+
+To create a new lrc erasure code profile::
+
+        ceph osd erasure-code-profile set {name} \
+             plugin=lrc \
+             k={data-chunks} \
+             m={coding-chunks} \
+             l={locality} \
+             [ruleset-root={root}] \
+             [ruleset-locality={bucket-type}] \
+             [ruleset-failure-domain={bucket-type}] \
+             [directory={directory}] \
+             [--force]
+
+Where:
+
+``k={data chunks}``
+
+:Description: Each object is split in **data-chunks** parts,
+              each stored on a different OSD.
+
+:Type: Integer
+:Required: Yes.
+:Example: 4
+
+``m={coding-chunks}``
+
+:Description: Compute **coding chunks** for each object and store them
+              on different OSDs. The number of coding chunks is also
+              the number of OSDs that can be down without losing data.
+
+:Type: Integer
+:Required: Yes.
+:Example: 2
+
+``l={locality}``
+
+:Description: Group the coding and data chunks into sets of size
+              **locality**. For instance, for **k=4** and **m=2**,
+              when **locality=3** two groups of three are created.
+              Each set can be recovered without reading chunks
+              from another set.
+
+:Type: Integer
+:Required: Yes.
+:Example: 3
+
+``ruleset-root={root}``
+
+:Description: The name of the crush bucket used for the first step of
+              the ruleset. For intance **step take default**.
+
+:Type: String
+:Required: No.
+:Default: default
+
+``ruleset-locality={bucket-type}``
+
+:Description: The type of the crush bucket in which each set of chunks
+              defined by **l** will be stored. For instance, if it is
+              set to **rack**, each group of **l** chunks will be
+              placed in a different rack. It is used to create a
+              ruleset step such as **step choose rack**. If it is not
+              set, no such grouping is done.
+
+:Type: String
+:Required: No.
+
+``ruleset-failure-domain={bucket-type}``
+
+:Description: Ensure that no two chunks are in a bucket with the same
+              failure domain. For instance, if the failure domain is
+              **host** no two chunks will be stored on the same
+              host. It is used to create a ruleset step such as **step
+              chooseleaf host**.
+
+:Type: String
+:Required: No.
+:Default: host
+
+``directory={directory}``
+
+:Description: Set the **directory** name from which the erasure code
+              plugin is loaded.
+
+:Type: String
+:Required: No.
+:Default: /usr/lib/ceph/erasure-code
+
+``--force``
+
+:Description: Override an existing profile by the same name.
+
+:Type: String
+:Required: No.
+
+Low level plugin configuration
+==============================
+
+The sum of **k** and **m** must be a multiple of the **l** parameter.
+The low level configuration parameters do not impose such a
+restriction and it may be more convienient to use it for specific
+purposes. It is for instance possible to define two groups, one with 4
+chunks and another with 3 chunks. It is also possible to recursively
+define locality sets, for instance datacenters and racks into
+datacenters. The **k/m/l** are implemented by generating a low level
+configuration.
+
+The *lrc* erasure code plugin recursively applies erasure code
+techniques so that recovering from the loss of some chunks only
+requires a subset of the available chunks, most of the time.
+
+For instance, when three coding steps are described as::
+
+   chunk nr    01234567
+   step 1      _cDD_cDD
+   step 2      cDDD____
+   step 3      ____cDDD
+
+where *c* are coding chunks calculated from the data chunks *D*, the
+loss of chunk *7* can be recovered with the last four chunks. And the
+loss of chunk *2* chunk can be recovered with the first four
+chunks.
+
+Erasure code profile examples using low level configuration
+===========================================================
+
+Minimal testing
+---------------
+
+It is strictly equivalent to using the default erasure code profile. The *DD*
+implies *K=2*, the *c* implies *M=1* and the *jerasure* plugin is used
+by default.::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             mapping=DD_ \
+             layers='[ [ "DDc", "" ] ]'
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+Reduce recovery bandwidth between hosts
+---------------------------------------
+
+Although it is probably not an interesting use case when all hosts are
+connected to the same switch, reduced bandwidth usage can actually be
+observed. It is equivalent to **k=4**, **m=2** and **l=3** although
+the layout of the chunks is different::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             mapping=__DD__DD \
+             layers='[
+                       [ "_cDD_cDD", "" ],
+                       [ "cDDD____", "" ],
+                       [ "____cDDD", "" ],
+                     ]'
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+
+Reduce recovery bandwidth between racks
+---------------------------------------
+
+In Firefly the reduced bandwidth will only be observed if the primary
+OSD is in the same rack as the lost chunk.::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             mapping=__DD__DD \
+             layers='[
+                       [ "_cDD_cDD", "" ],
+                       [ "cDDD____", "" ],
+                       [ "____cDDD", "" ],
+                     ]' \
+             ruleset-steps='[
+                             [ "choose", "rack", 2 ],
+                             [ "chooseleaf", "host", 4 ],
+                            ]'
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+Testing with different Erasure Code backends
+--------------------------------------------
+
+LRC now uses jerasure as the default EC backend. It is possible to
+specify the EC backend/algorithm on a per layer basis using the low
+level configuration. The second argument in layers='[ [ "DDc", "" ] ]'
+is actually an erasure code profile to be used for this level. The
+example below specifies the ISA backend with the cauchy technique to
+be used in the lrcpool.::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             mapping=DD_ \
+             layers='[ [ "DDc", "plugin=isa technique=cauchy" ] ]'
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+You could also use a different erasure code profile for for each
+layer.::
+
+        $ ceph osd erasure-code-profile set LRCprofile \
+             plugin=lrc \
+             mapping=__DD__DD \
+             layers='[
+                       [ "_cDD_cDD", "plugin=isa technique=cauchy" ],
+                       [ "cDDD____", "plugin=isa" ],
+                       [ "____cDDD", "plugin=jerasure" ],
+                     ]'
+        $ ceph osd pool create lrcpool 12 12 erasure LRCprofile
+
+
+
+Erasure coding and decoding algorithm
+=====================================
+
+The steps found in the layers description::
+
+   chunk nr    01234567
+
+   step 1      _cDD_cDD
+   step 2      cDDD____
+   step 3      ____cDDD
+
+are applied in order. For instance, if a 4K object is encoded, it will
+first go thru *step 1* and be divided in four 1K chunks (the four
+uppercase D). They are stored in the chunks 2, 3, 6 and 7, in
+order. From these, two coding chunks are calculated (the two lowercase
+c). The coding chunks are stored in the chunks 1 and 5, respectively.
+
+The *step 2* re-uses the content created by *step 1* in a similar
+fashion and stores a single coding chunk *c* at position 0. The last four
+chunks, marked with an underscore (*_*) for readability, are ignored.
+
+The *step 3* stores a single coding chunk *c* at position 4. The three
+chunks created by *step 1* are used to compute this coding chunk,
+i.e. the coding chunk from *step 1* becomes a data chunk in *step 3*.
+
+If chunk *2* is lost::
+
+   chunk nr    01234567
+
+   step 1      _c D_cDD
+   step 2      cD D____
+   step 3      __ _cDDD
+
+decoding will attempt to recover it by walking the steps in reverse
+order: *step 3* then *step 2* and finally *step 1*.
+
+The *step 3* knows nothing about chunk *2* (i.e. it is an underscore)
+and is skipped.
+
+The coding chunk from *step 2*, stored in chunk *0*, allows it to
+recover the content of chunk *2*. There are no more chunks to recover
+and the process stops, without considering *step 1*.
+
+Recovering chunk *2* requires reading chunks *0, 1, 3* and writing
+back chunk *2*.
+
+If chunk *2, 3, 6* are lost::
+
+   chunk nr    01234567
+
+   step 1      _c  _c D
+   step 2      cD  __ _
+   step 3      __  cD D
+
+The *step 3* can recover the content of chunk *6*::
+
+   chunk nr    01234567
+
+   step 1      _c  _cDD
+   step 2      cD  ____
+   step 3      __  cDDD
+
+The *step 2* fails to recover and is skipped because there are two
+chunks missing (*2, 3*) and it can only recover from one missing
+chunk.
+
+The coding chunk from *step 1*, stored in chunk *1, 5*, allows it to
+recover the content of chunk *2, 3*::
+
+   chunk nr    01234567
+
+   step 1      _cDD_cDD
+   step 2      cDDD____
+   step 3      ____cDDD
+
+Controlling crush placement
+===========================
+
+The default crush ruleset provides OSDs that are on different hosts. For instance::
+
+   chunk nr    01234567
+
+   step 1      _cDD_cDD
+   step 2      cDDD____
+   step 3      ____cDDD
+
+needs exactly *8* OSDs, one for each chunk. If the hosts are in two
+adjacent racks, the first four chunks can be placed in the first rack
+and the last four in the second rack. So that recovering from the loss
+of a single OSD does not require using bandwidth between the two
+racks.
+
+For instance::
+
+   ruleset-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'
+
+will create a ruleset that will select two crush buckets of type
+*rack* and for each of them choose four OSDs, each of them located in
+different buckets of type *host*.
+
+The ruleset can also be manually crafted for finer control.
diff --git a/doc/rados/operations/erasure-code-profile.rst b/doc/rados/operations/erasure-code-profile.rst
new file mode 100644
index 0000000..3262b3d
--- /dev/null
+++ b/doc/rados/operations/erasure-code-profile.rst
@@ -0,0 +1,103 @@
+=====================
+Erasure code profiles
+=====================
+
+Erasure code is defined by a **profile** and is used when creating an
+erasure coded pool and the associated crush ruleset.
+
+The **default** erasure code profile (which is created when the Ceph
+cluster is initialized) provides the same level of redundancy as two
+copies but requires 25% less disk space. It is described as a profile
+with **k=2** and **m=1**, meaning the information is spread over three
+OSD (k+m == 3) and one of them can be lost.
+
+To improve redundancy without increasing raw storage requirements, a
+new profile can be created. For instance, a profile with **k=10** and
+**m=4** can sustain the loss of four (**m=4**) OSDs by distributing an
+object on fourteen (k+m=14) OSDs. The object is first divided in
+**10** chunks (if the object is 10MB, each chunk is 1MB) and **4**
+coding chunks are computed, for recovery (each coding chunk has the
+same size as the data chunk, i.e. 1MB). The raw space overhead is only
+40% and the object will not be lost even if four OSDs break at the
+same time.
+
+.. _list of available plugins:
+
+.. toctree::
+	:maxdepth: 1
+
+	erasure-code-jerasure
+	erasure-code-isa
+	erasure-code-lrc
+	erasure-code-shec
+
+osd erasure-code-profile set
+============================
+
+To create a new erasure code profile::
+
+	ceph osd erasure-code-profile set {name} \
+             [{directory=directory}] \
+             [{plugin=plugin}] \
+             [{key=value} ...] \
+             [--force]
+
+Where:
+
+``{directory=directory}``
+
+:Description: Set the **directory** name from which the erasure code
+              plugin is loaded.
+
+:Type: String
+:Required: No.
+:Default: /usr/lib/ceph/erasure-code
+
+``{plugin=plugin}``
+
+:Description: Use the erasure code **plugin** to compute coding chunks
+              and recover missing chunks. See the `list of available
+              plugins`_ for more information.
+
+:Type: String
+:Required: No. 
+:Default: jerasure
+
+``{key=value}``
+
+:Description: The semantic of the remaining key/value pairs is defined
+              by the erasure code plugin.
+
+:Type: String
+:Required: No. 
+
+``--force``
+
+:Description: Override an existing profile by the same name.
+
+:Type: String
+:Required: No. 
+
+osd erasure-code-profile rm
+============================
+
+To remove an erasure code profile::
+
+	ceph osd erasure-code-profile rm {name}
+
+If the profile is referenced by a pool, the deletion will fail.
+
+osd erasure-code-profile get
+============================
+
+To display an erasure code profile::
+
+	ceph osd erasure-code-profile get {name}
+
+osd erasure-code-profile ls
+===========================
+
+To list the names of all erasure code profiles::
+
+	ceph osd erasure-code-profile ls
+
diff --git a/doc/rados/operations/erasure-code-shec.rst b/doc/rados/operations/erasure-code-shec.rst
new file mode 100644
index 0000000..2d71ad7
--- /dev/null
+++ b/doc/rados/operations/erasure-code-shec.rst
@@ -0,0 +1,133 @@
+========================
+SHEC erasure code plugin
+========================
+
+The *shec* plugin encapsulates the `multiple SHEC
+<https://wiki.ceph.com/Planning/Blueprints/Hammer/Shingled_Erasure_Code_(SHEC)>`_
+library. It allows ceph to recover data more efficiently than Reed Solomon codes.
+
+Create an SHEC profile
+======================
+
+To create a new *shec* erasure code profile::
+
+        ceph osd erasure-code-profile set {name} \
+             plugin=shec \
+             [k={data-chunks}] \
+             [m={coding-chunks}] \
+             [c={durability-estimator}] \
+             [ruleset-root={root}] \
+             [ruleset-failure-domain={bucket-type}] \
+             [directory={directory}] \
+             [--force]
+
+Where:
+
+``k={data-chunks}``
+
+:Description: Each object is split in **data-chunks** parts,
+              each stored on a different OSD.
+
+:Type: Integer
+:Required: No.
+:Default: 4
+
+``m={coding-chunks}``
+
+:Description: Compute **coding-chunks** for each object and store them on
+              different OSDs. The number of **coding-chunks** does not necessarily
+              equal the number of OSDs that can be down without losing data.
+
+:Type: Integer
+:Required: No.
+:Default: 3
+
+``c={durability-estimator}``
+
+:Description: The number of parity chunks each of which includes each data chunk in its
+              calculation range. The number is used as a **durability estimator**.
+              For instance, if c=2, 2 OSDs can be down without losing data.
+
+:Type: Integer
+:Required: No.
+:Default: 2
+
+``ruleset-root={root}``
+
+:Description: The name of the crush bucket used for the first step of
+              the ruleset. For intance **step take default**.
+
+:Type: String
+:Required: No.
+:Default: default
+
+``ruleset-failure-domain={bucket-type}``
+
+:Description: Ensure that no two chunks are in a bucket with the same
+              failure domain. For instance, if the failure domain is
+              **host** no two chunks will be stored on the same
+              host. It is used to create a ruleset step such as **step
+              chooseleaf host**.
+
+:Type: String
+:Required: No.
+:Default: host
+
+``directory={directory}``
+
+:Description: Set the **directory** name from which the erasure code
+              plugin is loaded.
+
+:Type: String
+:Required: No.
+:Default: /usr/lib/ceph/erasure-code
+
+``--force``
+
+:Description: Override an existing profile by the same name.
+
+:Type: String
+:Required: No.
+
+Brief description of SHEC's layouts
+===================================
+
+Space Efficiency
+----------------
+
+Space efficiency is a ratio of data chunks to all ones in a object and
+represented as k/(k+m).
+In order to improve space efficiency, you should increase k or decrease m.
+
+::
+
+        space efficiency of SHEC(4,3,2) = 4/(4+3) = 0.57
+        SHEC(5,3,2) or SHEC(4,2,2) improves SHEC(4,3,2)'s space efficiency
+
+Durability
+----------
+
+The third parameter of SHEC (=c) is a durability estimator, which approximates
+the number of OSDs that can be down without losing data.
+
+``durability estimator of SHEC(4,3,2) = 2``
+
+Recovery Efficiency
+-------------------
+
+Describing calculation of recovery efficiency is beyond the scope of this document,
+but at least increasing m without increasing c achieves improvement of recovery efficiency.
+(However, we must pay attention to the sacrifice of space efficiency in this case.)
+
+``SHEC(4,2,2) -> SHEC(4,3,2) : achieves improvement of recovery efficiency``
+
+Erasure code profile examples
+=============================
+
+::
+
+        $ ceph osd erasure-code-profile set SHECprofile \
+             plugin=shec \
+             k=8 m=4 c=3 \
+             ruleset-failure-domain=host
+        $ ceph osd pool create shecpool 256 256 erasure SHECprofile
diff --git a/doc/rados/operations/erasure-code.rst b/doc/rados/operations/erasure-code.rst
new file mode 100644
index 0000000..9925e21
--- /dev/null
+++ b/doc/rados/operations/erasure-code.rst
@@ -0,0 +1,174 @@
+=============
+ Erasure code
+=============
+
+A Ceph pool is associated to a type to sustain the loss of an OSD
+(i.e. a disk since most of the time there is one OSD per disk). The
+default choice when `creating a pool <../pools>`_ is *replicated*,
+meaning every object is copied on multiple disks. The `Erasure Code
+<https://en.wikipedia.org/wiki/Erasure_code>`_ pool type can be used
+instead to save space.
+
+Creating a sample erasure coded pool
+------------------------------------
+
+The simplest erasure coded pool is equivalent to `RAID5
+<https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5>`_ and
+requires at least three hosts::
+
+    $ ceph osd pool create ecpool 12 12 erasure
+    pool 'ecpool' created
+    $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
+    $ rados --pool ecpool get NYAN -
+    ABCDEFGHI
+
+.. note:: the 12 in *pool create* stands for 
+          `the number of placement groups <../pools>`_.
+
+Erasure code profiles
+---------------------
+
+The default erasure code profile sustains the loss of a single OSD. It
+is equivalent to a replicated pool of size two but requires 1.5TB
+instead of 2TB to store 1TB of data. The default profile can be
+displayed with::
+
+    $ ceph osd erasure-code-profile get default
+    directory=.libs
+    k=2
+    m=1
+    plugin=jerasure
+    ruleset-failure-domain=host
+    technique=reed_sol_van
+
+Choosing the right profile is important because it cannot be modified
+after the pool is created: a new pool with a different profile needs
+to be created and all objects from the previous pool moved to the new.
+
+The most important parameters of the profile are *K*, *M* and
+*ruleset-failure-domain* because they define the storage overhead and
+the data durability. For instance, if the desired architecture must
+sustain the loss of two racks with a storage overhead of 40% overhead,
+the following profile can be defined::
+
+    $ ceph osd erasure-code-profile set myprofile \
+       k=3 \
+       m=2 \
+       ruleset-failure-domain=rack
+    $ ceph osd pool create ecpool 12 12 erasure myprofile
+    $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
+    $ rados --pool ecpool get NYAN -
+    ABCDEFGHI
+
+The *NYAN* object will be divided in three (*K=3*) and two additional
+*chunks* will be created (*M=2*). The value of *M* defines how many
+OSD can be lost simultaneously without losing any data. The
+*ruleset-failure-domain=rack* will create a CRUSH ruleset that ensures
+no two *chunks* are stored in the same rack.
+
+.. ditaa::
+                            +-------------------+
+                       name |       NYAN        |
+                            +-------------------+
+                    content |     ABCDEFGHI     |
+                            +--------+----------+
+                                     |
+                                     |
+                                     v
+                              +------+------+
+              +---------------+ encode(3,2) +-----------+
+              |               +--+--+---+---+           |
+              |                  |  |   |               |
+              |          +-------+  |   +-----+         |
+              |          |          |         |         |
+           +--v---+   +--v---+   +--v---+  +--v---+  +--v---+
+     name  | NYAN |   | NYAN |   | NYAN |  | NYAN |  | NYAN |
+           +------+   +------+   +------+  +------+  +------+
+    shard  |  1   |   |  2   |   |  3   |  |  4   |  |  5   |
+           +------+   +------+   +------+  +------+  +------+
+  content  | ABC  |   | DEF  |   | GHI  |  | YXY  |  | QGC  |
+           +--+---+   +--+---+   +--+---+  +--+---+  +--+---+
+              |          |          |         |         |
+              |          |          v         |         |
+              |          |       +--+---+     |         |
+              |          |       | OSD1 |     |         |
+              |          |       +------+     |         |
+              |          |                    |         |
+              |          |       +------+     |         |
+              |          +------>| OSD2 |     |         |
+              |                  +------+     |         |
+              |                               |         |
+              |                  +------+     |         |
+              |                  | OSD3 |<----+         |
+              |                  +------+               |
+              |                                         |
+              |                  +------+               |
+              |                  | OSD4 |<--------------+
+              |                  +------+
+              |
+              |                  +------+
+              +----------------->| OSD5 |
+                                 +------+
+
+ 
+More information can be found in the `erasure code profiles
+<../erasure-code-profile>`_ documentation.
+
+Erasure coded pool and cache tiering
+------------------------------------
+
+Erasure coded pools require more resources than replicated pools and
+lack some functionalities such as partial writes. To overcome these
+limitations, it is recommended to set a `cache tier <../cache-tiering>`_
+before the erasure coded pool.
+
+For instance, if the pool *hot-storage* is made of fast storage::
+
+    $ ceph osd tier add ecpool hot-storage
+    $ ceph osd tier cache-mode hot-storage writeback
+    $ ceph osd tier set-overlay ecpool hot-storage
+
+will place the *hot-storage* pool as tier of *ecpool* in *writeback*
+mode so that every write and read to the *ecpool* are actually using
+the *hot-storage* and benefit from its flexibility and speed.
+
+It is not possible to create an RBD image on an erasure coded pool
+because it requires partial writes. It is however possible to create
+an RBD image on an erasure coded pools when a replicated pool tier set
+a cache tier::
+
+    $ rbd create --size 10G ecpool/myvolume
+
+More information can be found in the `cache tiering
+<../cache-tiering>`_ documentation.
+
+Glossary
+--------
+
+*chunk*
+   when the encoding function is called, it returns chunks of the same
+   size. Data chunks which can be concatenated to reconstruct the original
+   object and coding chunks which can be used to rebuild a lost chunk.
+
+*K*
+   the number of data *chunks*, i.e. the number of *chunks* in which the
+   original object is divided. For instance if *K* = 2 a 10KB object
+   will be divided into *K* objects of 5KB each.
+
+*M*
+   the number of coding *chunks*, i.e. the number of additional *chunks*
+   computed by the encoding functions. If there are 2 coding *chunks*,
+   it means 2 OSDs can be out without losing data.
+
+
+Table of content
+----------------
+
+.. toctree::
+	:maxdepth: 1
+
+	erasure-code-profile
+	erasure-code-jerasure
+	erasure-code-isa
+	erasure-code-lrc
+	erasure-code-shec
diff --git a/doc/rados/operations/index.rst b/doc/rados/operations/index.rst
new file mode 100644
index 0000000..a21f12e
--- /dev/null
+++ b/doc/rados/operations/index.rst
@@ -0,0 +1,87 @@
+====================
+ Cluster Operations
+====================
+
+.. raw:: html
+
+	<table><colgroup><col width="50%"><col width="50%"></colgroup><tbody valign="top"><tr><td><h3>High-level Operations</h3>
+
+High-level cluster operations consist primarily of starting, stopping, and
+restarting a cluster with the ``ceph`` service;  checking the cluster's health;
+and, monitoring an operating cluster.
+
+.. toctree::
+	:maxdepth: 1 
+	
+	operating
+	monitoring
+	monitoring-osd-pg
+	user-management
+
+.. raw:: html 
+
+	</td><td><h3>Data Placement</h3>
+
+Once you have your cluster up and running, you may begin working with data
+placement. Ceph supports petabyte-scale data storage clusters, with storage
+pools and placement groups that distribute data across the cluster using Ceph's
+CRUSH algorithm.
+
+.. toctree::
+	:maxdepth: 1
+
+	data-placement
+	pools
+	erasure-code
+	cache-tiering
+	placement-groups
+	crush-map
+
+
+
+.. raw:: html
+
+	</td></tr><tr><td><h3>Low-level Operations</h3>
+
+Low-level cluster operations consist of starting, stopping, and restarting a
+particular daemon within a cluster; changing the settings of a particular
+daemon or subsystem; and, adding a daemon to the cluster or removing a  daemon
+from the cluster. The most common use cases for low-level operations include
+growing or shrinking the Ceph cluster and replacing legacy or failed hardware
+with new hardware.
+
+.. toctree::
+	:maxdepth: 1
+
+	add-or-rm-osds
+	add-or-rm-mons
+	Command Reference <control>
+
+	
+
+.. raw:: html
+
+	</td><td><h3>Troubleshooting</h3>
+
+Ceph is still on the leading edge, so you may encounter situations that require
+you to evaluate your Ceph configuration and modify your logging and debugging
+settings to identify and remedy issues you are encountering with your cluster.
+
+.. toctree::
+	:maxdepth: 1 
+
+	../troubleshooting/community
+	../troubleshooting/troubleshooting-mon
+	../troubleshooting/troubleshooting-osd
+	../troubleshooting/troubleshooting-pg
+	../troubleshooting/log-and-debug
+	../troubleshooting/cpu-profiling
+	../troubleshooting/memory-profiling
+
+
+
+
+.. raw:: html
+
+	</td></tr></tbody></table>
+
diff --git a/doc/rados/operations/monitoring-osd-pg.rst b/doc/rados/operations/monitoring-osd-pg.rst
new file mode 100644
index 0000000..9e1e0bd
--- /dev/null
+++ b/doc/rados/operations/monitoring-osd-pg.rst
@@ -0,0 +1,617 @@
+=========================
+ Monitoring OSDs and PGs
+=========================
+
+High availability and high reliability require a fault-tolerant approach to
+managing hardware and software issues. Ceph has no single point-of-failure, and
+can service requests for data in a "degraded" mode. Ceph's `data placement`_
+introduces a layer of indirection to ensure that data doesn't bind directly to
+particular OSD addresses. This means that tracking down system faults requires
+finding the `placement group`_ and the underlying OSDs at root of the problem.
+
+.. tip:: A fault in one part of the cluster may prevent you from accessing a 
+   particular object, but that doesn't mean that you can't access other objects.
+   When you run into a fault, don't panic. Just follow the steps for monitoring
+   your OSDs and placement groups. Then, begin troubleshooting.
+
+Ceph is generally self-repairing. However, when problems persist, monitoring
+OSDs and placement groups will help you identify the problem.
+
+
+Monitoring OSDs
+===============
+
+An OSD's status is either in the cluster (``in``) or out of the cluster
+(``out``); and, it is either up and running (``up``), or it is down and not
+running (``down``). If an OSD is ``up``, it may be either ``in`` the cluster
+(you can read and write data) or it is ``out`` of the cluster.  If it was
+``in`` the cluster and recently moved ``out`` of the cluster, Ceph will migrate
+placement groups to other OSDs. If an OSD is ``out`` of the cluster, CRUSH will
+not assign placement groups to the OSD. If an OSD is ``down``, it should also be
+``out``.
+
+.. note:: If an OSD is ``down`` and ``in``, there is a problem and the cluster 
+   will not be in a healthy state.
+
+.. ditaa:: +----------------+        +----------------+
+           |                |        |                |
+           |   OSD #n In    |        |   OSD #n Up    |
+           |                |        |                |
+           +----------------+        +----------------+
+                   ^                         ^
+                   |                         |
+                   |                         |
+                   v                         v
+           +----------------+        +----------------+
+           |                |        |                |
+           |   OSD #n Out   |        |   OSD #n Down  |
+           |                |        |                |
+           +----------------+        +----------------+
+
+If you execute a command such as ``ceph health``, ``ceph -s`` or ``ceph -w``,
+you may notice that the cluster does not always echo back ``HEALTH OK``. Don't
+panic. With respect to OSDs, you should expect that the cluster will **NOT**
+echo   ``HEALTH OK`` in a few expected circumstances:
+
+#. You haven't started the cluster yet (it won't respond).
+#. You have just started or restarted the cluster and it's not ready yet,
+   because the placement groups are getting created and the OSDs are in
+   the process of peering.
+#. You just added or removed an OSD.
+#. You just have modified your cluster map.
+
+An important aspect of monitoring OSDs is to ensure that when the cluster
+is up and running that all OSDs that are ``in`` the cluster are ``up`` and
+running, too. To see if all OSDs are running, execute:: 
+
+	ceph osd stat
+
+The result should tell you the map epoch (eNNNN), the total number of OSDs (x),
+how many are ``up`` (y) and how many are ``in`` (z). ::
+
+	eNNNN: x osds: y up, z in
+
+If the number of OSDs that are ``in`` the cluster is more than the number of
+OSDs that are ``up``, execute the following command to identify the ``ceph-osd``
+daemons that aren't running:: 
+
+	ceph osd tree
+
+:: 
+
+	dumped osdmap tree epoch 1
+	# id	weight	type name	up/down	reweight
+	-1	2	pool openstack
+	-3	2		rack dell-2950-rack-A
+	-2	2			host dell-2950-A1
+	0	1				osd.0	up	1	
+	1	1				osd.1	down	1
+
+
+.. tip:: The ability to search through a well-designed CRUSH hierarchy may help
+   you troubleshoot your cluster by identifying the physcial locations faster.
+
+If an OSD is ``down``, start it:: 
+
+	sudo /etc/init.d/ceph -a start osd.1
+
+See `OSD Not Running`_ for problems associated with OSDs that stopped, or won't
+restart.
+	
+
+PG Sets
+=======
+
+When CRUSH assigns placement groups to OSDs, it looks at the number of replicas
+for the pool and assigns the placement group to OSDs such that each replica of
+the placement group gets assigned to a different OSD. For example, if the pool
+requires three replicas of a placement group, CRUSH may assign them to
+``osd.1``, ``osd.2`` and ``osd.3`` respectively. CRUSH actually seeks a
+pseudo-random placement that will take into account failure domains you set in
+your `CRUSH map`_, so you will rarely see placement groups assigned to nearest
+neighbor OSDs in a large cluster. We refer to the set of OSDs that should
+contain the replicas of a particular placement group as the **Acting Set**. In
+some cases, an OSD in the Acting Set is ``down`` or otherwise not able to
+service requests for objects in the placement group. When these situations
+arise, don't panic. Common examples include:
+
+- You added or removed an OSD. Then, CRUSH reassigned the placement group to 
+  other OSDs--thereby changing the composition of the Acting Set and spawning
+  the migration of data with a "backfill" process.
+- An OSD was ``down``, was restarted, and is now ``recovering``.
+- An OSD in the Acting Set is ``down`` or unable to service requests, 
+  and another OSD has temporarily assumed its duties.
+
+Ceph processes a client request using the **Up Set**, which is the set of OSDs
+that will actually handle the requests. In most cases, the Up Set and the Acting
+Set are virtually identical. When they are not, it may indicate that Ceph is
+migrating data, an OSD is recovering, or that there is a problem (i.e., Ceph
+usually echoes a "HEALTH WARN" state with a "stuck stale" message in such
+scenarios).
+
+To retrieve a list of placement groups, execute:: 
+
+	ceph pg dump
+	
+To view which OSDs are within the Acting Set or the Up Set for a given placement
+group, execute:: 
+
+	ceph pg map {pg-num}
+
+The result should tell you the osdmap epoch (eNNN), the placement group number
+({pg-num}),  the OSDs in the Up Set (up[]), and the OSDs in the acting set
+(acting[]). ::
+
+	osdmap eNNN pg {pg-num} -> up [0,1,2] acting [0,1,2]
+
+.. note:: If the Up Set and Acting Set do not match, this may be an indicator
+   that the cluster rebalancing itself or of a potential problem with 
+   the cluster.
+ 
+
+Peering
+=======
+
+Before you can write data to a placement group, it must be in an ``active``
+state, and it  **should** be in a ``clean`` state. For Ceph to determine the
+current state of a placement group, the primary OSD of the placement group
+(i.e., the first OSD in the acting set), peers with the secondary and tertiary
+OSDs to establish agreement on the current state of the placement group
+(assuming a pool with 3 replicas of the PG).
+
+
+.. ditaa:: +---------+     +---------+     +-------+
+           |  OSD 1  |     |  OSD 2  |     | OSD 3 |
+           +---------+     +---------+     +-------+
+                |               |              |
+                |  Request To   |              |
+                |     Peer      |              |             
+                |-------------->|              |
+                |<--------------|              |
+                |    Peering                   |
+                |                              |
+                |         Request To           |
+                |            Peer              | 
+                |----------------------------->|  
+                |<-----------------------------|
+                |          Peering             |
+
+The OSDs also report their status to the monitor. See `Configuring Monitor/OSD
+Interaction`_ for details. To troubleshoot peering issues, see `Peering
+Failure`_.
+
+
+Monitoring Placement Group States
+=================================
+
+If you execute a command such as ``ceph health``, ``ceph -s`` or ``ceph -w``,
+you may notice that the cluster does not always echo back ``HEALTH OK``. After
+you check to see if the OSDs are running, you should also check placement group
+states. You should expect that the cluster will **NOT** echo ``HEALTH OK`` in a
+number of placement group peering-related circumstances:
+
+#. You have just created a pool and placement groups haven't peered yet.
+#. The placement groups are recovering.
+#. You have just added an OSD to or removed an OSD from the cluster.
+#. You have just modified your CRUSH map and your placement groups are migrating.
+#. There is inconsistent data in different replicas of a placement group.
+#. Ceph is scrubbing a placement group's replicas.
+#. Ceph doesn't have enough storage capacity to complete backfilling operations.
+
+If one of the foregoing circumstances causes Ceph to echo ``HEALTH WARN``, don't
+panic. In many cases, the cluster will recover on its own. In some cases, you
+may need to take action. An important aspect of monitoring placement groups is
+to ensure that when the cluster is up and running that all placement groups are
+``active``, and preferably in the ``clean`` state. To see the status of all
+placement groups, execute:: 
+
+	ceph pg stat
+
+The result should tell you the placement group map version (vNNNNNN), the total
+number of placement groups (x), and how many placement groups are in a
+particular state such as ``active+clean`` (y). ::
+
+	vNNNNNN: x pgs: y active+clean; z bytes data, aa MB used, bb GB / cc GB avail
+
+.. note:: It is common for Ceph to report multiple states for placement groups.
+
+In addition to the placement group states, Ceph will also echo back the amount
+of data used (aa), the amount of storage capacity remaining (bb), and the total
+storage capacity for the placement group. These numbers can be important in a
+few cases: 
+
+- You are reaching your ``near full ratio`` or ``full ratio``. 
+- Your data isn't getting distributed across the cluster due to an 
+  error in your CRUSH configuration.
+
+
+.. topic:: Placement Group IDs
+
+   Placement group IDs consist of the pool number (not pool name) followed 
+   by a period (.) and the placement group ID--a hexadecimal number. You
+   can view pool numbers and their names from the output of ``ceph osd 
+   lspools``. For example, the default pool ``rbd`` corresponds to
+   pool number ``0``. A fully qualified placement group ID has the
+   following form::
+   
+   	{pool-num}.{pg-id}
+   
+   And it typically looks like this:: 
+   
+   	0.1f
+   
+
+To retrieve a list of placement groups, execute the following:: 
+
+	ceph pg dump
+	
+You can also format the output in JSON format and save it to a file:: 
+
+	ceph pg dump -o {filename} --format=json
+
+To query a particular placement group, execute the following:: 
+
+	ceph pg {poolnum}.{pg-id} query
+	
+Ceph will output the query in JSON format.
+
+.. code-block:: javascript
+	
+	{
+	  "state": "active+clean",
+	  "up": [
+	    1,
+	    0
+	  ],
+	  "acting": [
+	    1,
+	    0
+	  ],
+	  "info": {
+	    "pgid": "1.e",
+	    "last_update": "4'1",
+	    "last_complete": "4'1",
+	    "log_tail": "0'0",
+	    "last_backfill": "MAX",
+	    "purged_snaps": "[]",
+	    "history": {
+	      "epoch_created": 1,
+	      "last_epoch_started": 537,
+	      "last_epoch_clean": 537,
+	      "last_epoch_split": 534,
+	      "same_up_since": 536,
+	      "same_interval_since": 536,
+	      "same_primary_since": 536,
+	      "last_scrub": "4'1",
+	      "last_scrub_stamp": "2013-01-25 10:12:23.828174"
+	    },
+	    "stats": {
+	      "version": "4'1",
+	      "reported": "536'782",
+	      "state": "active+clean",
+	      "last_fresh": "2013-01-25 10:12:23.828271",
+	      "last_change": "2013-01-25 10:12:23.828271",
+	      "last_active": "2013-01-25 10:12:23.828271",
+	      "last_clean": "2013-01-25 10:12:23.828271",
+	      "last_unstale": "2013-01-25 10:12:23.828271",
+	      "mapping_epoch": 535,
+	      "log_start": "0'0",
+	      "ondisk_log_start": "0'0",
+	      "created": 1,
+	      "last_epoch_clean": 1,
+	      "parent": "0.0",
+	      "parent_split_bits": 0,
+	      "last_scrub": "4'1",
+	      "last_scrub_stamp": "2013-01-25 10:12:23.828174",
+	      "log_size": 128,
+	      "ondisk_log_size": 128,
+	      "stat_sum": {
+	        "num_bytes": 205,
+	        "num_objects": 1,
+	        "num_object_clones": 0,
+	        "num_object_copies": 0,
+	        "num_objects_missing_on_primary": 0,
+	        "num_objects_degraded": 0,
+	        "num_objects_unfound": 0,
+	        "num_read": 1,
+	        "num_read_kb": 0,
+	        "num_write": 3,
+	        "num_write_kb": 1
+	      },
+	      "stat_cat_sum": {
+	        
+	      },
+	      "up": [
+	        1,
+	        0
+	      ],
+	      "acting": [
+	        1,
+	        0
+	      ]
+	    },
+	    "empty": 0,
+	    "dne": 0,
+	    "incomplete": 0
+	  },
+	  "recovery_state": [
+	    {
+	      "name": "Started\/Primary\/Active",
+	      "enter_time": "2013-01-23 09:35:37.594691",
+	      "might_have_unfound": [
+	        
+	      ],
+	      "scrub": {
+	        "scrub_epoch_start": "536",
+	        "scrub_active": 0,
+	        "scrub_block_writes": 0,
+	        "finalizing_scrub": 0,
+	        "scrub_waiting_on": 0,
+	        "scrub_waiting_on_whom": [
+	          
+	        ]
+	      }
+	    },
+	    {
+	      "name": "Started",
+	      "enter_time": "2013-01-23 09:35:31.581160"
+	    }
+	  ]
+	}
+
+
+
+The following subsections describe common states in greater detail.
+
+Creating
+--------
+
+When you create a pool, it will create the number of placement groups you
+specified.  Ceph will echo ``creating`` when it is creating one or more
+placement groups. Once they are created, the OSDs that are part of a placement
+group's Acting Set will peer. Once peering is complete, the placement group
+status should be ``active+clean``, which means a Ceph client can begin writing
+to the placement group.
+
+.. ditaa:: 
+         
+       /-----------\       /-----------\       /-----------\
+       | Creating  |------>|  Peering  |------>|  Active   |
+       \-----------/       \-----------/       \-----------/
+
+Peering
+-------
+
+When Ceph is Peering a placement group, Ceph is bringing the OSDs that
+store the replicas of the placement group into **agreement about the state**
+of the objects and metadata in the placement group. When Ceph completes peering,
+this means that the OSDs that store the placement group agree about the current
+state of the placement group. However, completion of the peering process does
+**NOT** mean that each replica has the latest contents.
+
+.. topic:: Authoratative History
+
+   Ceph will **NOT** acknowledge a write operation to a client, until 
+   all OSDs of the acting set persist the write operation. This practice 
+   ensures that at least one member of the acting set will have a record 
+   of every acknowledged write operation since the last successful 
+   peering operation.
+   
+   With an accurate record of each acknowledged write operation, Ceph can 
+   construct and disseminate a new authoritative history of the placement 
+   group--a complete, and fully ordered set of operations that, if performed, 
+   would bring an OSD’s copy of a placement group up to date.
+
+
+Active
+------
+
+Once Ceph completes the peering process, a placement group may become
+``active``. The ``active`` state means that the data in the placement group is
+generally  available in the primary placement group and the replicas for read
+and write operations. 
+
+
+Clean 
+-----
+
+When a placement group is in the ``clean`` state, the primary OSD and the
+replica OSDs have successfully peered and there are no stray replicas for the
+placement group. Ceph replicated all objects in the placement group the correct 
+number of times.
+
+
+Degraded
+--------
+
+When a client writes an object to the primary OSD, the primary OSD is
+responsible for writing the replicas to the replica OSDs. After the primary OSD
+writes the object to storage, the placement group will remain in a ``degraded``
+state until the primary OSD has received an acknowledgement from the replica
+OSDs that Ceph created the replica objects successfully. 
+
+The reason a placement group can be ``active+degraded`` is that an OSD may be
+``active`` even though it doesn't hold all of the objects yet. If an OSD goes
+``down``, Ceph marks each placement group assigned to the OSD as ``degraded``.
+The OSDs must peer again when the OSD comes back online. However, a client can
+still write a new object to a ``degraded`` placement group if it is ``active``.
+
+If an OSD is ``down`` and the ``degraded`` condition persists, Ceph may mark the
+``down`` OSD as ``out`` of the cluster and remap the data from the ``down`` OSD
+to another OSD. The time between being marked ``down`` and being marked ``out``
+is controlled by ``mon osd down out interval``, which is set to ``300`` seconds
+by default.
+
+A placement group can also be ``degraded``, because Ceph cannot find one or more
+objects that Ceph thinks should be in the placement group. While you cannot
+read or write to unfound objects, you can still access all of the other objects
+in the ``degraded`` placement group.
+
+
+Recovering
+----------
+
+Ceph was designed for fault-tolerance at a scale where hardware and software
+problems are ongoing. When an OSD goes ``down``, its contents may fall behind
+the current state of other replicas in the placement groups. When the OSD is
+back ``up``, the contents of the placement groups must be updated to reflect the
+current state. During that time period, the OSD may reflect a ``recovering``
+state.
+
+Recovery isn't always trivial, because a hardware failure might cause a
+cascading failure of multiple OSDs. For example, a network switch for a rack or
+cabinet may fail, which can cause the OSDs of a number of host machines to fall
+behind the current state  of the cluster. Each one of the OSDs must recover once
+the fault is resolved.
+
+Ceph provides a number of settings to balance the resource contention between
+new service requests and the need to recover data objects and restore the
+placement groups to the current state. The ``osd recovery delay start`` setting
+allows an OSD to restart, re-peer and even process some replay requests before
+starting the recovery process. The ``osd recovery threads`` setting limits the
+number of threads for the recovery process (1 thread by default).  The ``osd
+recovery thread timeout`` sets a thread timeout, because multiple OSDs may fail,
+restart and re-peer at staggered rates. The ``osd recovery max active`` setting
+limits the  number of recovery requests an OSD will entertain simultaneously to
+prevent the OSD from failing to serve . The ``osd recovery max chunk`` setting
+limits the size of the recovered data chunks to prevent network congestion.
+
+
+Back Filling
+------------
+
+When a new OSD joins the cluster, CRUSH will reassign placement groups from OSDs
+in the cluster to the newly added OSD. Forcing the new OSD to accept the
+reassigned placement groups immediately can put excessive load on the new OSD.
+Back filling the OSD with the placement groups allows this process to begin in
+the background.  Once backfilling is complete, the new OSD will begin serving
+requests when it is ready.
+
+During the backfill operations, you may see one of several states:
+``backfill_wait`` indicates that a backfill operation is pending, but isn't
+underway yet; ``backfill`` indicates that a backfill operation is underway;
+and, ``backfill_too_full`` indicates that a backfill operation was requested,
+but couldn't be completed due to insufficient storage capacity. When a 
+placement group can't be backfilled, it may be considered ``incomplete``.
+
+Ceph provides a number of settings to manage the load spike associated with
+reassigning placement groups to an OSD (especially a new OSD). By default,
+``osd_max_backfills`` sets the maximum number of concurrent backfills to or from
+an OSD to 10. The ``osd backfill full ratio`` enables an OSD to refuse a
+backfill request if the OSD is approaching its full ratio (85%, by default).
+If an OSD refuses a backfill request, the ``osd backfill retry interval``
+enables an OSD to retry the request (after 10 seconds, by default). OSDs can
+also set ``osd backfill scan min`` and ``osd backfill scan max`` to manage scan
+intervals (64 and 512, by default).
+
+
+Remapped
+--------
+
+When the Acting Set that services a placement group changes, the data migrates
+from the old acting set to the new acting set. It may take some time for a new
+primary OSD to service requests. So it may ask the old primary to continue to
+service requests until the placement group migration is complete. Once  data
+migration completes, the mapping uses the primary OSD of the new acting set.
+
+
+Stale
+-----
+
+While Ceph uses heartbeats to ensure that hosts and daemons are running, the
+``ceph-osd`` daemons may also get into a ``stuck`` state where they aren't
+reporting statistics in a timely manner (e.g., a temporary network fault). By
+default, OSD daemons report their placement group, up thru, boot and failure
+statistics every half second (i.e., ``0.5``),  which is more frequent than the
+heartbeat thresholds. If the **Primary OSD** of a placement group's acting set
+fails to report to the monitor or if other OSDs have reported the primary OSD
+``down``, the monitors will mark the placement group ``stale``.
+
+When you start your cluster, it is common to see the ``stale`` state until
+the peering process completes. After your cluster has been running for awhile, 
+seeing placement groups in the ``stale`` state indicates that the primary OSD
+for those placement groups is ``down`` or not reporting placement group statistics
+to the monitor.
+
+
+Identifying Troubled PGs
+========================
+
+As previously noted, a placement group isn't necessarily problematic just 
+because its state isn't ``active+clean``. Generally, Ceph's ability to self
+repair may not be working when placement groups get stuck. The stuck states
+include:
+
+- **Unclean**: Placement groups contain objects that are not replicated the 
+  desired number of times. They should be recovering.
+- **Inactive**: Placement groups cannot process reads or writes because they 
+  are waiting for an OSD with the most up-to-date data to come back ``up``.
+- **Stale**: Placement groups are in an unknown state, because the OSDs that 
+  host them have not reported to the monitor cluster in a while (configured 
+  by ``mon osd report timeout``).
+
+To identify stuck placement groups, execute the following:: 
+
+	ceph pg dump_stuck [unclean|inactive|stale|undersized|degraded]
+
+See `Placement Group Subsystem`_ for additional details. To troubleshoot
+stuck placement groups, see `Troubleshooting PG Errors`_.
+
+
+Finding an Object Location
+==========================
+
+To store object data in the Ceph Object Store, a Ceph client must: 
+
+#. Set an object name
+#. Specify a `pool`_
+
+The Ceph client retrieves the latest cluster map and the CRUSH algorithm
+calculates how to map the object to a `placement group`_, and then calculates
+how to assign the placement group to an OSD dynamically. To find the object
+location, all you need is the object name and the pool name. For example:: 
+
+	ceph osd map {poolname} {object-name}
+
+.. topic:: Exercise: Locate an Object
+
+	As an exercise, lets create an object. Specify an object name, a path to a
+	test file containing some object data and a pool name using the 
+	``rados put`` command on the command line. For example::
+   
+		rados put {object-name} {file-path} --pool=data   	
+		rados put test-object-1 testfile.txt --pool=data
+   
+	To verify that the Ceph Object Store stored the object, execute the following::
+   
+		rados -p data ls
+   
+	Now, identify the object location::	
+
+		ceph osd map {pool-name} {object-name}
+		ceph osd map data test-object-1
+   
+	Ceph should output the object's location. For example:: 
+   
+		osdmap e537 pool 'data' (0) object 'test-object-1' -> pg 0.d1743484 (0.4) -> up [1,0] acting [1,0]
+   
+	To remove the test object, simply delete it using the ``rados rm`` command.
+	For example:: 
+   
+		rados rm test-object-1 --pool=data
+   
+
+As the cluster evolves, the object location may change dynamically. One benefit
+of Ceph's dynamic rebalancing is that Ceph relieves you from having to perform
+the migration manually. See the  `Architecture`_ section for details.
+
+.. _data placement: ../data-placement
+.. _pool: ../pools
+.. _placement group: ../placement-groups
+.. _Architecture: ../../../architecture
+.. _OSD Not Running: ../../troubleshooting/troubleshooting-osd#osd-not-running
+.. _Troubleshooting PG Errors: ../../troubleshooting/troubleshooting-pg#troubleshooting-pg-errors
+.. _Peering Failure: ../../troubleshooting/troubleshooting-pg#failures-osd-peering
+.. _CRUSH map: ../crush-map
+.. _Configuring Monitor/OSD Interaction: ../../configuration/mon-osd-interaction/
+.. _Placement Group Subsystem: ../control#placement-group-subsystem
diff --git a/doc/rados/operations/monitoring.rst b/doc/rados/operations/monitoring.rst
new file mode 100644
index 0000000..cc3424b
--- /dev/null
+++ b/doc/rados/operations/monitoring.rst
@@ -0,0 +1,291 @@
+======================
+ Monitoring a Cluster
+======================
+
+Once you have a running cluster, you may use the ``ceph`` tool to monitor your
+cluster. Monitoring a cluster typically involves checking OSD status, monitor 
+status, placement group status and metadata server status.
+
+Interactive Mode
+================
+
+To run the ``ceph`` tool in interactive mode, type ``ceph`` at the command line
+with no arguments.  For example:: 
+
+	ceph
+	ceph> health
+	ceph> status
+	ceph> quorum_status
+	ceph> mon_status
+	
+
+Checking Cluster Health
+=======================
+
+After you start your cluster, and before you start reading and/or
+writing data, check your cluster's health first. You can check on the 
+health of your Ceph cluster with the following::
+
+	ceph health
+
+If you specified non-default locations for your configuration or keyring,
+you may specify their locations::
+
+   ceph -c /path/to/conf -k /path/to/keyring health
+
+Upon starting the Ceph cluster, you will likely encounter a health
+warning such as ``HEALTH_WARN XXX num placement groups stale``. Wait a few moments and check
+it again. When your cluster is ready, ``ceph health`` should return a message
+such as ``HEALTH_OK``. At that point, it is okay to begin using the cluster.
+
+Watching a Cluster
+==================
+
+To watch the cluster's ongoing events, open a new terminal. Then, enter:: 
+
+	ceph -w
+
+Ceph will print each event.  For example, a tiny Ceph cluster consisting of 
+one monitor, and two OSDs may print the following:: 
+
+    cluster b370a29d-9287-4ca3-ab57-3d824f65e339
+     health HEALTH_OK
+     monmap e1: 1 mons at {ceph1=10.0.0.8:6789/0}, election epoch 2, quorum 0 ceph1
+     osdmap e63: 2 osds: 2 up, 2 in
+      pgmap v41338: 952 pgs, 20 pools, 17130 MB data, 2199 objects
+            115 GB used, 167 GB / 297 GB avail
+                 952 active+clean
+
+    2014-06-02 15:45:21.655871 osd.0 [INF] 17.71 deep-scrub ok
+    2014-06-02 15:45:47.880608 osd.1 [INF] 1.0 scrub ok
+    2014-06-02 15:45:48.865375 osd.1 [INF] 1.3 scrub ok
+    2014-06-02 15:45:50.866479 osd.1 [INF] 1.4 scrub ok
+    2014-06-02 15:45:01.345821 mon.0 [INF] pgmap v41339: 952 pgs: 952 active+clean; 17130 MB data, 115 GB used, 167 GB / 297 GB avail
+    2014-06-02 15:45:05.718640 mon.0 [INF] pgmap v41340: 952 pgs: 1 active+clean+scrubbing+deep, 951 active+clean; 17130 MB data, 115 GB used, 167 GB / 297 GB avail
+    2014-06-02 15:45:53.997726 osd.1 [INF] 1.5 scrub ok
+    2014-06-02 15:45:06.734270 mon.0 [INF] pgmap v41341: 952 pgs: 1 active+clean+scrubbing+deep, 951 active+clean; 17130 MB data, 115 GB used, 167 GB / 297 GB avail
+    2014-06-02 15:45:15.722456 mon.0 [INF] pgmap v41342: 952 pgs: 952 active+clean; 17130 MB data, 115 GB used, 167 GB / 297 GB avail
+    2014-06-02 15:46:06.836430 osd.0 [INF] 17.75 deep-scrub ok
+    2014-06-02 15:45:55.720929 mon.0 [INF] pgmap v41343: 952 pgs: 1 active+clean+scrubbing+deep, 951 active+clean; 17130 MB data, 115 GB used, 167 GB / 297 GB avail
+
+
+The output provides:
+
+- Cluster ID
+- Cluster health status
+- The monitor map epoch and the status of the monitor quorum
+- The OSD map epoch and the status of OSDs 
+- The placement group map version
+- The number of placement groups and pools
+- The *notional* amount of data stored and the number of objects stored; and,
+- The total amount of data stored.
+
+.. topic:: How Ceph Calculates Data Usage
+
+   The ``used`` value reflects the *actual* amount of raw storage used. The 
+   ``xxx GB / xxx GB`` value means the amount available (the lesser number)
+   of the overall storage capacity of the cluster. The notional number reflects 
+   the size of the stored data before it is replicated, cloned or snapshotted.
+   Therefore, the amount of data actually stored typically exceeds the notional
+   amount stored, because Ceph creates replicas of the data and may also use 
+   storage capacity for cloning and snapshotting.
+
+
+Checking a Cluster's Usage Stats
+================================
+
+To check a cluster's data usage and data distribution among pools, you can
+use the ``df`` option. It is similar to Linux ``df``. Execute 
+the following::
+
+	ceph df
+
+The **GLOBAL** section of the output provides an overview of the amount of 
+storage your cluster uses for your data.
+
+- **SIZE:** The overall storage capacity of the cluster.
+- **AVAIL:** The amount of free space available in the cluster.
+- **RAW USED:** The amount of raw storage used.
+- **% RAW USED:** The percentage of raw storage used. Use this number in 
+  conjunction with the ``full ratio`` and ``near full ratio`` to ensure that 
+  you are not reaching your cluster's capacity. See `Storage Capacity`_ for 
+  additional details.
+
+The **POOLS** section of the output provides a list of pools and the notional 
+usage of each pool. The output from this section **DOES NOT** reflect replicas,
+clones or snapshots. For example, if you store an object with 1MB of data, the 
+notional usage will be 1MB, but the actual usage may be 2MB or more depending 
+on the number of replicas, clones and snapshots.
+
+- **NAME:** The name of the pool.
+- **ID:** The pool ID.
+- **USED:** The notional amount of data stored in kilobytes, unless the number 
+  appends **M** for megabytes or **G** for gigabytes.
+- **%USED:** The notional percentage of storage used per pool.
+- **Objects:** The notional number of objects stored per pool.
+
+.. note:: The numbers in the **POOLS** section are notional. They are not 
+   inclusive of the number of replicas, shapshots or clones. As a result, 
+   the sum of the **USED** and **%USED** amounts will not add up to the 
+   **RAW USED** and **%RAW USED** amounts in the **GLOBAL** section of the 
+   output.
+
+
+Checking a Cluster's Status
+===========================
+
+To check a cluster's status, execute the following:: 
+
+	ceph status
+	
+Or:: 
+
+	ceph -s
+
+In interactive mode, type ``status`` and press **Enter**. ::
+
+	ceph> status
+
+Ceph will print the cluster status. For example, a tiny Ceph  cluster consisting
+of one monitor, and two OSDs may print the following::
+
+    cluster b370a29d-9287-4ca3-ab57-3d824f65e339
+     health HEALTH_OK
+     monmap e1: 1 mons at {ceph1=10.0.0.8:6789/0}, election epoch 2, quorum 0 ceph1
+     osdmap e63: 2 osds: 2 up, 2 in
+      pgmap v41332: 952 pgs, 20 pools, 17130 MB data, 2199 objects
+            115 GB used, 167 GB / 297 GB avail
+                   1 active+clean+scrubbing+deep
+                 951 active+clean
+
+
+Checking OSD Status
+===================
+
+You can check OSDs to ensure they are ``up`` and ``in`` by executing:: 
+
+	ceph osd stat
+	
+Or:: 
+
+	ceph osd dump
+	
+You can also check view OSDs according to their position in the CRUSH map. :: 
+
+	ceph osd tree
+
+Ceph will print out a CRUSH tree with a host, its OSDs, whether they are up
+and their weight. ::  
+
+	# id	weight	type name	up/down	reweight
+	-1	3	pool default
+	-3	3		rack mainrack
+	-2	3			host osd-host
+	0	1				osd.0	up	1	
+	1	1				osd.1	up	1	
+	2	1				osd.2	up	1
+
+For a detailed discussion, refer to `Monitoring OSDs and Placement Groups`_.
+
+Checking Monitor Status
+=======================
+
+If your cluster has multiple monitors (likely), you should check the monitor
+quorum status after you start the cluster before reading and/or writing data. A
+quorum must be present when multiple monitors are running. You should also check
+monitor status periodically to ensure that they are running.
+
+To see display the monitor map, execute the following::
+
+	ceph mon stat
+	
+Or:: 
+
+	ceph mon dump
+	
+To check the quorum status for the monitor cluster, execute the following:: 
+	
+	ceph quorum_status
+
+Ceph will return the quorum status. For example, a Ceph  cluster consisting of
+three monitors may return the following:
+
+.. code-block:: javascript
+
+	{ "election_epoch": 10,
+	  "quorum": [
+	        0,
+	        1,
+	        2],
+	  "monmap": { "epoch": 1,
+	      "fsid": "444b489c-4f16-4b75-83f0-cb8097468898",
+	      "modified": "2011-12-12 13:28:27.505520",
+	      "created": "2011-12-12 13:28:27.505520",
+	      "mons": [
+	            { "rank": 0,
+	              "name": "a",
+	              "addr": "127.0.0.1:6789\/0"},
+	            { "rank": 1,
+	              "name": "b",
+	              "addr": "127.0.0.1:6790\/0"},
+	            { "rank": 2,
+	              "name": "c",
+	              "addr": "127.0.0.1:6791\/0"}
+	           ]
+	    }
+	}
+
+Checking MDS Status
+===================
+
+Metadata servers provide metadata services for  Ceph FS. Metadata servers have
+two sets of states: ``up | down`` and ``active | inactive``. To ensure your
+metadata servers are ``up`` and ``active``,  execute the following:: 
+
+	ceph mds stat
+	
+To display details of the metadata cluster, execute the following:: 
+
+	ceph mds dump
+
+
+Checking Placement Group States
+===============================
+
+Placement groups map objects to OSDs. When you monitor your
+placement groups,  you will want them to be ``active`` and ``clean``. 
+For a detailed discussion, refer to `Monitoring OSDs and Placement Groups`_.
+
+.. _Monitoring OSDs and Placement Groups: ../monitoring-osd-pg
+
+
+Using the Admin Socket
+======================
+
+The Ceph admin socket allows you to query a daemon via a socket interface. 
+By default, Ceph sockets reside under ``/var/run/ceph``. To access a daemon
+via the admin socket, login to the host running the daemon and use the 
+following command:: 
+
+	ceph daemon {daemon-name}
+	ceph daemon {path-to-socket-file}
+
+For example, the following are equivalent::
+
+    ceph daemon osd.0 foo
+    ceph daemon /var/run/ceph/ceph-osd.0.asok foo
+
+To view the available admin socket commands, execute the following command:: 
+
+	ceph daemon {daemon-name} help
+
+The admin socket command enables you to show and set your configuration at
+runtime. See `Viewing a Configuration at Runtime`_ for details.
+
+Additionally, you can set configuration values at runtime directly (i.e., the
+admin socket bypasses the monitor, unlike ``ceph tell {daemon-type}.{id}
+injectargs``, which relies on the monitor but doesn't require you to login
+directly to the host in question ).
+
+.. _Viewing a Configuration at Runtime: ../../configuration/ceph-conf#ceph-runtime-config
+.. _Storage Capacity: ../../configuration/mon-config-ref#storage-capacity
diff --git a/doc/rados/operations/operating.rst b/doc/rados/operations/operating.rst
new file mode 100644
index 0000000..fd8a4cb
--- /dev/null
+++ b/doc/rados/operations/operating.rst
@@ -0,0 +1,359 @@
+=====================
+ Operating a Cluster
+=====================
+
+.. index:: Upstart; operating a cluster
+
+Running Ceph with Upstart
+=========================
+
+When deploying Ceph Cuttlefish and beyond with ``ceph-deploy`` on Ubuntu, you 
+may start and stop Ceph daemons on a :term:`Ceph Node` using the event-based 
+`Upstart`_.  Upstart does not require you to define daemon instances in the 
+Ceph configuration file.
+
+To list the Ceph Upstart jobs and instances on a node, execute:: 
+
+	sudo initctl list | grep ceph
+
+See `initctl`_ for additional details.
+
+
+Starting all Daemons
+--------------------
+
+To start all daemons on a Ceph Node (irrespective of type), execute the
+following:: 
+
+	sudo start ceph-all
+	
+
+Stopping all Daemons	
+--------------------
+
+To stop all daemons on a Ceph Node (irrespective of type), execute the
+following:: 
+
+	sudo stop ceph-all
+	
+
+Starting all Daemons by Type
+----------------------------
+
+To start all daemons of a particular type on a Ceph Node, execute one of the
+following:: 
+
+	sudo start ceph-osd-all
+	sudo start ceph-mon-all
+	sudo start ceph-mds-all
+
+
+Stopping all Daemons by Type
+----------------------------
+
+To stop all daemons of a particular type on a Ceph Node, execute one of the
+following::
+
+	sudo stop ceph-osd-all
+	sudo stop ceph-mon-all
+	sudo stop ceph-mds-all
+
+
+Starting a Daemon
+-----------------
+
+To start a specific daemon instance on a Ceph Node, execute one of the
+following:: 
+
+	sudo start ceph-osd id={id}
+	sudo start ceph-mon id={hostname}
+	sudo start ceph-mds id={hostname}
+
+For example:: 
+
+	sudo start ceph-osd id=1
+	sudo start ceph-mon id=ceph-server
+	sudo start ceph-mds id=ceph-server
+
+
+Stopping a Daemon
+-----------------
+
+To stop a specific daemon instance on a Ceph Node, execute one of the
+following:: 
+
+	sudo stop ceph-osd id={id}
+	sudo stop ceph-mon id={hostname}
+	sudo stop ceph-mds id={hostname}
+
+For example:: 
+
+	sudo stop ceph-osd id=1
+	sudo start ceph-mon id=ceph-server
+	sudo start ceph-mds id=ceph-server
+
+
+.. index:: Ceph service; sysvinit; operating a cluster
+
+
+Running Ceph
+============
+
+Each time you to **start**, **restart**, and  **stop** Ceph daemons (or your
+entire cluster) you must specify at least one option and one command. You may
+also specify a daemon type or a daemon instance. ::
+
+	{commandline} [options] [commands] [daemons]
+
+
+The ``ceph`` options include:
+
++-----------------+----------+-------------------------------------------------+
+| Option          | Shortcut | Description                                     |
++=================+==========+=================================================+
+| ``--verbose``   |  ``-v``  | Use verbose logging.                            |
++-----------------+----------+-------------------------------------------------+
+| ``--valgrind``  | ``N/A``  | (Dev and QA only) Use `Valgrind`_ debugging.    |
++-----------------+----------+-------------------------------------------------+
+| ``--allhosts``  |  ``-a``  | Execute on all nodes in ``ceph.conf.``          |
+|                 |          | Otherwise, it only executes on ``localhost``.   |
++-----------------+----------+-------------------------------------------------+
+| ``--restart``   | ``N/A``  | Automatically restart daemon if it core dumps.  |
++-----------------+----------+-------------------------------------------------+
+| ``--norestart`` | ``N/A``  | Don't restart a daemon if it core dumps.        |
++-----------------+----------+-------------------------------------------------+
+| ``--conf``      |  ``-c``  | Use an alternate configuration file.            |
++-----------------+----------+-------------------------------------------------+
+
+The ``ceph`` commands include:
+
++------------------+------------------------------------------------------------+
+| Command          | Description                                                |
++==================+============================================================+
+|    ``start``     | Start the daemon(s).                                       |
++------------------+------------------------------------------------------------+
+|    ``stop``      | Stop the daemon(s).                                        |
++------------------+------------------------------------------------------------+
+|  ``forcestop``   | Force the daemon(s) to stop. Same as ``kill -9``           |
++------------------+------------------------------------------------------------+
+|   ``killall``    | Kill all daemons of a particular type.                     | 
++------------------+------------------------------------------------------------+
+|  ``cleanlogs``   | Cleans out the log directory.                              |
++------------------+------------------------------------------------------------+
+| ``cleanalllogs`` | Cleans out **everything** in the log directory.            |
++------------------+------------------------------------------------------------+
+
+For subsystem operations, the ``ceph`` service can target specific daemon types
+by adding a particular daemon type for the ``[daemons]`` option. Daemon types
+include: 
+
+- ``mon``
+- ``osd``
+- ``mds``
+
+
+
+Running Ceph with sysvinit
+--------------------------
+
+Using traditional ``sysvinit`` is the recommended way to run  Ceph with CentOS,
+Red Hat, Fedora, Debian and SLES distributions. You may also use it for older
+distributions of Ubuntu.
+
+
+Starting all Daemons
+~~~~~~~~~~~~~~~~~~~~
+
+To start your Ceph cluster, execute ``ceph`` with the ``start`` command. 
+Use the following syntax:: 
+
+	sudo /etc/init.d/ceph [options] [start|restart] [daemonType|daemonID]
+	
+The following examples illustrates a typical use case::
+
+	sudo /etc/init.d/ceph -a start
+
+Once you execute with ``-a`` (i.e., execute on all nodes), Ceph should begin
+operating.
+
+
+Stopping all Daemons	
+~~~~~~~~~~~~~~~~~~~~
+
+To stop your Ceph cluster, execute ``ceph`` with the ``stop`` command. 
+Use the following syntax:: 
+
+	sudo /etc/init.d/ceph [options] stop [daemonType|daemonID]
+	
+The following examples illustrates a typical use case::
+
+	sudo /etc/init.d/ceph -a stop
+
+Once you execute with ``-a`` (i.e., execute on all nodes), Ceph should stop
+operating.
+
+
+Starting all Daemons by Type
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To start all Ceph daemons of a particular type on the local Ceph Node, use the
+following syntax::
+
+	sudo /etc/init.d/ceph start {daemon-type}
+	sudo /etc/init.d/ceph start osd
+
+To start all Ceph daemons of a particular type on another node, use the
+following syntax:: 
+
+	sudo /etc/init.d/ceph -a start {daemon-type}
+	sudo /etc/init.d/ceph -a start osd
+
+
+Stopping all Daemons by Type
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To stop all Ceph daemons of a particular type on the local Ceph Node, use the
+following syntax::
+
+	sudo /etc/init.d/ceph stop {daemon-type}
+	sudo /etc/init.d/ceph stop osd
+
+To stop all Ceph daemons of a particular type on another node, use the
+following syntax:: 
+
+	sudo /etc/init.d/ceph -a stop {daemon-type}
+	sudo /etc/init.d/ceph -a stop osd
+
+
+Starting a Daemon
+~~~~~~~~~~~~~~~~~
+
+To start a Ceph daemon on the local Ceph Node, use the following syntax::
+
+	sudo /etc/init.d/ceph start {daemon-type}.{instance}
+	sudo /etc/init.d/ceph start osd.0
+
+To start a Ceph daemon on another node, use the following syntax:: 
+
+	sudo /etc/init.d/ceph -a start {daemon-type}.{instance}
+	sudo /etc/init.d/ceph -a start osd.0
+
+
+Stopping a Daemon
+~~~~~~~~~~~~~~~~~
+
+To stop a Ceph daemon on the local Ceph Node, use the following syntax::
+
+	sudo /etc/init.d/ceph stop {daemon-type}.{instance}
+	sudo /etc/init.d/ceph stop osd.0
+
+To stop a Ceph daemon on another node, use the following syntax:: 
+
+	sudo /etc/init.d/ceph -a stop {daemon-type}.{instance}
+	sudo /etc/init.d/ceph -a stop osd.0
+
+
+Running Ceph as a Service
+-------------------------
+
+When you deploy Ceph Argonaut or Bobtail with ``ceph-deploy``, you may operate
+Ceph as a service (you may also use sysvinit).
+
+
+Starting all Daemons
+~~~~~~~~~~~~~~~~~~~~
+
+To start your Ceph cluster, execute ``ceph`` with the ``start`` command. 
+Use the following syntax:: 
+
+	sudo service ceph [options] [start|restart] [daemonType|daemonID]
+	
+The following examples illustrates a typical use case::
+
+	sudo service ceph -a start	
+
+Once you execute with ``-a`` (i.e., execute on all nodes), Ceph should begin
+operating. 
+
+
+Stopping all Daemons	
+~~~~~~~~~~~~~~~~~~~~
+
+To stop your Ceph cluster, execute ``ceph`` with the ``stop`` command. 
+Use the following syntax:: 
+
+	sudo service ceph [options] stop [daemonType|daemonID]
+
+For example:: 
+
+	sudo service ceph -a stop
+	
+Once you execute with ``-a`` (i.e., execute on all nodes), Ceph should shut
+down.
+
+
+Starting all Daemons by Type
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To start all Ceph daemons of a particular type on the local Ceph Node, use the
+following syntax::
+
+	sudo service ceph start {daemon-type}
+	sudo service ceph start osd
+
+To start all Ceph daemons of a particular type on all nodes, use the following
+syntax:: 
+
+	sudo service ceph -a start {daemon-type}
+	sudo service ceph -a start osd
+
+
+Stopping all Daemons by Type
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To stop all Ceph daemons of a particular type on the local Ceph Node, use the
+following syntax::
+
+	sudo service ceph stop {daemon-type}
+	sudo service ceph stop osd
+
+To stop all Ceph daemons of a particular type on all nodes, use the following
+syntax:: 
+
+	sudo service ceph -a stop {daemon-type}
+	sudo service ceph -a stop osd
+
+
+Starting a Daemon
+~~~~~~~~~~~~~~~~~
+
+To start a Ceph daemon on the local Ceph Node,  use the following syntax::
+
+	sudo service ceph start {daemon-type}.{instance}
+	sudo service ceph start osd.0
+
+To start a Ceph daemon on another node, use the following syntax:: 
+
+	sudo service ceph -a start {daemon-type}.{instance}
+	sudo service ceph -a start osd.0
+
+
+Stopping a Daemon
+~~~~~~~~~~~~~~~~~
+
+To stop a Ceph daemon on the local Ceph Node, use the following syntax::
+
+	sudo service ceph stop {daemon-type}.{instance}
+	sudo service ceph stop osd.0
+
+To stop a Ceph daemon on another node, use the following syntax:: 
+
+	sudo service ceph -a stop {daemon-type}.{instance}
+	sudo service ceph -a stop osd.0
+
+
+
+
+.. _Valgrind: http://www.valgrind.org/
+.. _Upstart: http://upstart.ubuntu.com/index.html
+.. _initctl: http://manpages.ubuntu.com/manpages/raring/en/man8/initctl.8.html
diff --git a/doc/rados/operations/pg-concepts.rst b/doc/rados/operations/pg-concepts.rst
new file mode 100644
index 0000000..636d6bf
--- /dev/null
+++ b/doc/rados/operations/pg-concepts.rst
@@ -0,0 +1,102 @@
+==========================
+ Placement Group Concepts
+==========================
+
+When you execute commands like ``ceph -w``, ``ceph osd dump``, and other 
+commands related to placement groups, Ceph may return values using some
+of the following terms: 
+
+*Peering*
+   The process of bringing all of the OSDs that store
+   a Placement Group (PG) into agreement about the state
+   of all of the objects (and their metadata) in that PG.
+   Note that agreeing on the state does not mean that
+   they all have the latest contents.
+
+*Acting Set*
+   The ordered list of OSDs who are (or were as of some epoch)
+   responsible for a particular placement group.
+
+*Up Set*
+   The ordered list of OSDs responsible for a particular placement
+   group for a particular epoch according to CRUSH. Normally this
+   is the same as the *Acting Set*, except when the *Acting Set* has 
+   been explicitly overridden via ``pg_temp`` in the OSD Map.
+
+*Current Interval* or *Past Interval*
+   A sequence of OSD map epochs during which the *Acting Set* and *Up
+   Set* for particular placement group do not change.
+
+*Primary*
+   The member (and by convention first) of the *Acting Set*,
+   that is responsible for coordination peering, and is
+   the only OSD that will accept client-initiated
+   writes to objects in a placement group.
+
+*Replica*
+   A non-primary OSD in the *Acting Set* for a placement group
+   (and who has been recognized as such and *activated* by the primary).
+
+*Stray*
+   An OSD that is not a member of the current *Acting Set*, but
+   has not yet been told that it can delete its copies of a
+   particular placement group.
+
+*Recovery*
+   Ensuring that copies of all of the objects in a placement group
+   are on all of the OSDs in the *Acting Set*.  Once *Peering* has 
+   been performed, the *Primary* can start accepting write operations, 
+   and *Recovery* can proceed in the background.
+
+*PG Info* 
+   Basic metadata about the placement group's creation epoch, the version
+   for the most recent write to the placement group, *last epoch started*, 
+   *last epoch clean*, and the beginning of the *current interval*.  Any
+   inter-OSD communication about placement groups includes the *PG Info*, 
+   such that any OSD that knows a placement group exists (or once existed) 
+   also has a lower bound on *last epoch clean* or *last epoch started*.
+
+*PG Log*
+   A list of recent updates made to objects in a placement group.
+   Note that these logs can be truncated after all OSDs
+   in the *Acting Set* have acknowledged up to a certain
+   point.
+
+*Missing Set*
+   Each OSD notes update log entries and if they imply updates to
+   the contents of an object, adds that object to a list of needed
+   updates.  This list is called the *Missing Set* for that ``<OSD,PG>``.
+
+*Authoritative History*
+   A complete, and fully ordered set of operations that, if
+   performed, would bring an OSD's copy of a placement group
+   up to date.
+
+*Epoch*
+   A (monotonically increasing) OSD map version number
+
+*Last Epoch Start*
+   The last epoch at which all nodes in the *Acting Set*
+   for a particular placement group agreed on an
+   *Authoritative History*.  At this point, *Peering* is
+   deemed to have been successful.
+
+*up_thru*
+   Before a *Primary* can successfully complete the *Peering* process,
+   it must inform a monitor that is alive through the current
+   OSD map *Epoch* by having the monitor set its *up_thru* in the osd
+   map.  This helps *Peering* ignore previous *Acting Sets* for which
+   *Peering* never completed after certain sequences of failures, such as
+   the second interval below:
+
+   - *acting set* = [A,B]
+   - *acting set* = [A]
+   - *acting set* = [] very shortly after (e.g., simultaneous failure, but staggered detection)
+   - *acting set* = [B] (B restarts, A does not)
+
+*Last Epoch Clean*
+   The last *Epoch* at which all nodes in the *Acting set*
+   for a particular placement group were completely
+   up to date (both placement group logs and object contents).
+   At this point, *recovery* is deemed to have been
+   completed.
diff --git a/doc/rados/operations/pg-states.rst b/doc/rados/operations/pg-states.rst
new file mode 100644
index 0000000..8da73bc
--- /dev/null
+++ b/doc/rados/operations/pg-states.rst
@@ -0,0 +1,80 @@
+========================
+ Placement Group States
+========================
+
+When checking a cluster's status (e.g., running ``ceph -w`` or ``ceph -s``), 
+Ceph will report on the status of the placement groups. A placement group has 
+one or more states. The optimum state for placement groups in the placement group
+map is ``active + clean``. 
+
+*Creating*
+  Ceph is still creating the placement group.
+
+*Active*
+  Ceph will process requests to the placement group.
+
+*Clean*
+  Ceph replicated all objects in the placement group the correct number of times.
+
+*Down*
+  A replica with necessary data is down, so the placement group is offline.
+
+*Replay*
+  The placement group is waiting for clients to replay operations after an OSD crashed.
+
+*Splitting*
+  Ceph is splitting the placement group into multiple placement groups. (functional?)
+
+*Scrubbing*
+  Ceph is checking the placement group for inconsistencies.
+
+*Degraded*
+  Ceph has not replicated some objects in the placement group the correct number of times yet.
+
+*Inconsistent*
+  Ceph detects inconsistencies in the one or more replicas of an object in the placement group
+  (e.g. objects are the wrong size, objects are missing from one replica *after* recovery finished, etc.).
+
+*Peering*
+  The placement group is undergoing the peering process
+
+*Repair*
+  Ceph is checking the placement group and repairing any inconsistencies it finds (if possible).
+
+*Recovering*
+  Ceph is migrating/synchronizing objects and their replicas.
+
+*Backfill*
+  Ceph is scanning and synchronizing the entire contents of a placement group
+  instead of inferring what contents need to be synchronized from the logs of
+  recent operations. *Backfill* is a special case of recovery.
+
+*Wait-backfill*
+  The placement group is waiting in line to start backfill.
+
+*Backfill-toofull*
+  A backfill operation is waiting because the destination OSD is over its
+  full ratio.
+
+*Incomplete*
+  Ceph detects that a placement group is missing information about
+  writes that may have occurred, or does not have any healthy
+  copies. If you see this state, try to start any failed OSDs that may
+  contain the needed information or temporarily adjust min_size to
+  allow recovery.
+
+*Stale*
+  The placement group is in an unknown state - the monitors have not received
+  an update for it since the placement group mapping changed.
+
+*Remapped*
+  The placement group is temporarily mapped to a different set of OSDs from what
+  CRUSH specified.
+
+*Undersized*
+  The placement group fewer copies than the configured pool replication level.
+
+*Peered*
+  The placement group has peered, but cannot serve client IO due to not having
+  enough copies to reach the pool's configured min_size parameter.  Recovery
+  may occur in this state, so the pg may heal up to min_size eventually.
diff --git a/doc/rados/operations/placement-groups.rst b/doc/rados/operations/placement-groups.rst
new file mode 100644
index 0000000..05f0751
--- /dev/null
+++ b/doc/rados/operations/placement-groups.rst
@@ -0,0 +1,436 @@
+==================
+ Placement Groups
+==================
+
+.. _preselection:
+
+A preselection of pg_num
+========================
+
+When creating a new pool with::
+
+        ceph osd pool create {pool-name} pg_num
+
+it is mandatory to choose the value of ``pg_num`` because it cannot be
+calculated automatically. Here are a few values commonly used:
+
+- Less than 5 OSDs set ``pg_num`` to 128
+
+- Between 5 and 10 OSDs set ``pg_num`` to 512
+
+- Between 10 and 50 OSDs set ``pg_num`` to 4096
+
+- If you have more than 50 OSDs, you need to understand the tradeoffs
+  and how to calculate the ``pg_num`` value by yourself
+
+- For calculating ``pg_num`` value by yourself please take help of `pgcalc`_ tool 
+
+As the number of OSDs increases, chosing the right value for pg_num
+becomes more important because it has a significant influence on the
+behavior of the cluster as well as the durability of the data when
+something goes wrong (i.e. the probability that a catastrophic event
+leads to data loss).
+
+How are Placement Groups used ?
+===============================
+
+A placement group (PG) aggregates objects within a pool because
+tracking object placement and object metadata on a per-object basis is
+computationally expensive--i.e., a system with millions of objects
+cannot realistically track placement on a per-object basis.
+
+.. ditaa::
+           /-----\  /-----\  /-----\  /-----\  /-----\
+           | obj |  | obj |  | obj |  | obj |  | obj |
+           \-----/  \-----/  \-----/  \-----/  \-----/
+              |        |        |        |        |
+              +--------+--------+        +---+----+
+              |                              |
+              v                              v
+   +-----------------------+      +-----------------------+
+   |  Placement Group #1   |      |  Placement Group #2   |
+   |                       |      |                       |
+   +-----------------------+      +-----------------------+
+               |                              |
+               +------------------------------+
+                             |
+                             v
+                  +-----------------------+
+                  |        Pool           |
+                  |                       |
+                  +-----------------------+
+
+The Ceph client will calculate which placement group an object should
+be in. It does this by hashing the object ID and applying an operation
+based on the number of PGs in the defined pool and the ID of the pool.
+See `Mapping PGs to OSDs`_ for details.
+
+The object's contents within a placement group are stored in a set of
+OSDs. For instance, in a replicated pool of size two, each placement
+group will store objects on two OSDs, as shown below.
+
+.. ditaa::
+
+   +-----------------------+      +-----------------------+
+   |  Placement Group #1   |      |  Placement Group #2   |
+   |                       |      |                       |
+   +-----------------------+      +-----------------------+
+        |             |               |             |
+        v             v               v             v
+   /----------\  /----------\    /----------\  /----------\
+   |          |  |          |    |          |  |          |
+   |  OSD #1  |  |  OSD #2  |    |  OSD #2  |  |  OSD #3  |
+   |          |  |          |    |          |  |          |
+   \----------/  \----------/    \----------/  \----------/
+
+
+Should OSD #2 fail, another will be assigned to Placement Group #1 and
+will be filled with copies of all objects in OSD #1. If the pool size
+is changed from two to three, an additional OSD will be assigned to
+the placement group and will receive copies of all objects in the
+placement group.
+
+Placement groups do not own the OSD, they share it with other
+placement groups from the same pool or even other pools. If OSD #2
+fails, the Placement Group #2 will also have to restore copies of
+objects, using OSD #3.
+
+When the number of placement groups increases, the new placement
+groups will be assigned OSDs. The result of the CRUSH function will
+also change and some objects from the former placement groups will be
+copied over to the new Placement Groups and removed from the old ones.
+
+Placement Groups Tradeoffs
+==========================
+
+Data durability and even distribution among all OSDs call for more
+placement groups but their number should be reduced to the minimum to
+save CPU and memory.
+
+.. _data durability:
+
+Data durability
+---------------
+
+After an OSD fails, the risk of data loss increases until the data it
+contained is fully recovered. Let's imagine a scenario that causes
+permanent data loss in a single placement group:
+
+- The OSD fails and all copies of the object it contains are lost.
+  For all objects within the placement group the number of replica
+  suddently drops from three to two.
+
+- Ceph starts recovery for this placement group by chosing a new OSD
+  to re-create the third copy of all objects.
+
+- Another OSD, within the same placement group, fails before the new
+  OSD is fully populated with the third copy. Some objects will then
+  only have one surviving copies.
+
+- Ceph picks yet another OSD and keeps copying objects to restore the
+  desired number of copies.
+
+- A third OSD, within the same placement group, fails before recovery
+  is complete. If this OSD contained the only remaining copy of an
+  object, it is permanently lost.
+
+In a cluster containing 10 OSDs with 512 placement groups in a three
+replica pool, CRUSH will give each placement groups three OSDs. In the
+end, each OSDs will end up hosting (512 * 3) / 10 = ~150 Placement
+Groups. When the first OSD fails, the above scenario will therefore
+start recovery for all 150 placement groups at the same time.
+
+The 150 placement groups being recovered are likely to be
+homogeneously spread over the 9 remaining OSDs. Each remaining OSD is
+therefore likely to send copies of objects to all others and also
+receive some new objects to be stored because they became part of a
+new placement group.
+
+The amount of time it takes for this recovery to complete entirely
+depends on the architecture of the Ceph cluster. Let say each OSD is
+hosted by a 1TB SSD on a single machine and all of them are connected
+to a 10Gb/s switch and the recovery for a single OSD completes within
+M minutes. If there are two OSDs per machine using spinners with no
+SSD journal and a 1Gb/s switch, it will at least be an order of
+magnitude slower.
+
+In a cluster of this size, the number of placement groups has almost
+no influence on data durability. It could be 128 or 8192 and the
+recovery would not be slower or faster.
+
+However, growing the same Ceph cluster to 20 OSDs instead of 10 OSDs
+is likely to speed up recovery and therefore improve data durability
+significantly. Each OSD now participates in only ~75 placement groups
+instead of ~150 when there were only 10 OSDs and it will still require
+all 19 remaining OSDs to perform the same amount of object copies in
+order to recover. But where 10 OSDs had to copy approximately 100GB
+each, they now have to copy 50GB each instead. If the network was the
+bottleneck, recovery will happen twice as fast. In other words,
+recovery goes faster when the number of OSDs increases.
+
+If this cluster grows to 40 OSDs, each of them will only host ~35
+placement groups. If an OSD dies, recovery will keep going faster
+unless it is blocked by another bottleneck. However, if this cluster
+grows to 200 OSDs, each of them will only host ~7 placement groups. If
+an OSD dies, recovery will happen between at most of ~21 (7 * 3) OSDs
+in these placement groups: recovery will take longer than when there
+were 40 OSDs, meaning the number of placement groups should be
+increased.
+
+No matter how short the recovery time is, there is a chance for a
+second OSD to fail while it is in progress. In the 10 OSDs cluster
+described above, if any of them fail, then ~17 placement groups
+(i.e. ~150 / 9 placement groups being recovered) will only have one
+surviving copy. And if any of the 8 remaining OSD fail, the last
+objects of two placement groups are likely to be lost (i.e. ~17 / 8
+placement groups with only one remaining copy being recovered).
+
+When the size of the cluster grows to 20 OSDs, the number of Placement
+Groups damaged by the loss of three OSDs drops. The second OSD lost
+will degrade ~4 (i.e. ~75 / 19 placement groups being recovered)
+instead of ~17 and the third OSD lost will only lose data if it is one
+of the four OSDs containing the surviving copy. In other words, if the
+probability of losing one OSD is 0.0001% during the recovery time
+frame, it goes from 17 * 10 * 0.0001% in the cluster with 10 OSDs to 4 * 20 * 
+0.0001% in the cluster with 20 OSDs.
+
+In a nutshell, more OSDs mean faster recovery and a lower risk of
+cascading failures leading to the permanent loss of a Placement
+Group. Having 512 or 4096 Placement Groups is roughly equivalent in a
+cluster with less than 50 OSDs as far as data durability is concerned.
+
+Note: It may take a long time for a new OSD added to the cluster to be
+populated with placement groups that were assigned to it. However
+there is no degradation of any object and it has no impact on the
+durability of the data contained in the Cluster.
+
+.. _object distribution:
+
+Object distribution within a pool
+---------------------------------
+
+Ideally objects are evenly distributed in each placement group. Since
+CRUSH computes the placement group for each object, but does not
+actually know how much data is stored in each OSD within this
+placement group, the ratio between the number of placement groups and
+the number of OSDs may influence the distribution of the data
+significantly.
+
+For instance, if there was single a placement group for ten OSDs in a
+three replica pool, only three OSD would be used because CRUSH would
+have no other choice. When more placement groups are available,
+objects are more likely to be evenly spread among them. CRUSH also
+makes every effort to evenly spread OSDs among all existing Placement
+Groups.
+
+As long as there are one or two orders of magnitude more Placement
+Groups than OSDs, the distribution should be even. For instance, 300
+placement groups for 3 OSDs, 1000 placement groups for 10 OSDs etc.
+
+Uneven data distribution can be caused by factors other than the ratio
+between OSDs and placement groups. Since CRUSH does not take into
+account the size of the objects, a few very large objects may create
+an imbalance. Let say one million 4K objects totaling 4GB are evenly
+spread among 1000 placement groups on 10 OSDs. They will use 4GB / 10
+= 400MB on each OSD. If one 400MB object is added to the pool, the
+three OSDs supporting the placement group in which the object has been
+placed will be filled with 400MB + 400MB = 800MB while the seven
+others will remain occupied with only 400MB.
+
+.. _resource usage:
+
+Memory, CPU and network usage
+-----------------------------
+
+For each placement group, OSDs and MONs need memory, network and CPU
+at all times and even more during recovery. Sharing this overhead by
+clustering objects within a placement group is one of the main reasons
+they exist.
+
+Minimizing the number of placement groups saves significant amounts of
+resources.
+
+Choosing the number of Placement Groups
+=======================================
+
+If you have more than 50 OSDs, we recommend approximately 50-100
+placement groups per OSD to balance out resource usage, data
+durability and distribution. If you have less than 50 OSDs, chosing
+among the `preselection`_ above is best. For a single pool of objects,
+you can use the following formula to get a baseline::
+
+                (OSDs * 100)
+   Total PGs =  ------------
+                 pool size
+
+Where **pool size** is either the number of replicas for replicated
+pools or the K+M sum for erasure coded pools (as returned by **ceph
+osd erasure-code-profile get**).
+
+You should then check if the result makes sense with the way you
+designed your Ceph cluster to maximize `data durability`_,
+`object distribution`_ and minimize `resource usage`_.
+
+The result should be **rounded up to the nearest power of two.**
+Rounding up is optional, but recommended for CRUSH to evenly balance
+the number of objects among placement groups.
+
+As an example, for a cluster with 200 OSDs and a pool size of 3
+replicas, you would estimate your number of PGs as follows::
+
+   (200 * 100)
+   ----------- = 6667. Nearest power of 2: 8192
+        3
+
+When using multiple data pools for storing objects, you need to ensure
+that you balance the number of placement groups per pool with the
+number of placement groups per OSD so that you arrive at a reasonable
+total number of placement groups that provides reasonably low variance
+per OSD without taxing system resources or making the peering process
+too slow.
+
+For instance a cluster of 10 pools each with 512 placement groups on
+ten OSDs is a total of 5,120 placement groups spread over ten OSDs,
+that is 512 placement groups per OSD. That does not use too many
+resources. However, if 1,000 pools were created with 512 placement
+groups each, the OSDs will handle ~50,000 placement groups each and it
+would require significantly more resources and time for peering.
+
+.. _setting the number of placement groups:
+
+Set the Number of Placement Groups
+==================================
+
+To set the number of placement groups in a pool, you must specify the
+number of placement groups at the time you create the pool.
+See `Create a Pool`_ for details. Once you've set placement groups for a
+pool, you may increase the number of placement groups (but you cannot
+decrease the number of placement groups). To increase the number of
+placement groups, execute the following::
+
+        ceph osd pool set {pool-name} pg_num {pg_num}
+
+Once you increase the number of placement groups, you must also
+increase the number of placement groups for placement (``pgp_num``)
+before your cluster will rebalance. The ``pgp_num`` will be the number of
+placement groups that will be considered for placement by the CRUSH
+algorithm. Increasing ``pg_num`` splits the placement groups but data
+will not be migrated to the newer placement groups until placement
+groups for placement, ie. ``pgp_num`` is increased. The ``pgp_num``
+should be equal to the ``pg_num``.  To increase the number of
+placement groups for placement, execute the following::
+
+        ceph osd pool set {pool-name} pgp_num {pgp_num}
+
+
+Get the Number of Placement Groups
+==================================
+
+To get the number of placement groups in a pool, execute the following::
+
+        ceph osd pool get {pool-name} pg_num
+
+
+Get a Cluster's PG Statistics
+=============================
+
+To get the statistics for the placement groups in your cluster, execute the following::
+
+        ceph pg dump [--format {format}]
+
+Valid formats are ``plain`` (default) and ``json``.
+
+
+Get Statistics for Stuck PGs
+============================
+
+To get the statistics for all placement groups stuck in a specified state,
+execute the following::
+
+        ceph pg dump_stuck inactive|unclean|stale|undersized|degraded [--format <format>] [-t|--threshold <seconds>]
+
+**Inactive** Placement groups cannot process reads or writes because they are waiting for an OSD
+with the most up-to-date data to come up and in.
+
+**Unclean** Placement groups contain objects that are not replicated the desired number
+of times. They should be recovering.
+
+**Stale** Placement groups are in an unknown state - the OSDs that host them have not
+reported to the monitor cluster in a while (configured by ``mon_osd_report_timeout``).
+
+Valid formats are ``plain`` (default) and ``json``. The threshold defines the minimum number
+of seconds the placement group is stuck before including it in the returned statistics
+(default 300 seconds).
+
+
+Get a PG Map
+============
+
+To get the placement group map for a particular placement group, execute the following::
+
+        ceph pg map {pg-id}
+
+For example::
+
+        ceph pg map 1.6c
+
+Ceph will return the placement group map, the placement group, and the OSD status::
+
+        osdmap e13 pg 1.6c (1.6c) -> up [1,0] acting [1,0]
+
+
+Get a PGs Statistics
+====================
+
+To retrieve statistics for a particular placement group, execute the following::
+
+        ceph pg {pg-id} query
+
+
+Scrub a Placement Group
+=======================
+
+To scrub a placement group, execute the following::
+
+        ceph pg scrub {pg-id}
+
+Ceph checks the primary and any replica nodes, generates a catalog of all objects
+in the placement group and compares them to ensure that no objects are missing
+or mismatched, and their contents are consistent.  Assuming the replicas all
+match, a final semantic sweep ensures that all of the snapshot-related object
+metadata is consistent. Errors are reported via logs.
+
+
+Revert Lost
+===========
+
+If the cluster has lost one or more objects, and you have decided to
+abandon the search for the lost data, you must mark the unfound objects
+as ``lost``.
+
+If all possible locations have been queried and objects are still
+lost, you may have to give up on the lost objects. This is
+possible given unusual combinations of failures that allow the cluster
+to learn about writes that were performed before the writes themselves
+are recovered.
+
+Currently the only supported option is "revert", which will either roll back to
+a previous version of the object or (if it was a new object) forget about it
+entirely. To mark the "unfound" objects as "lost", execute the following::
+
+        ceph pg {pg-id} mark_unfound_lost revert|delete
+
+.. important:: Use this feature with caution, because it may confuse
+   applications that expect the object(s) to exist.
+
+
+.. toctree::
+        :hidden:
+
+        pg-states
+        pg-concepts
+
+
+.. _Create a Pool: ../pools#createpool
+.. _Mapping PGs to OSDs: ../../../architecture#mapping-pgs-to-osds
+.. _pgcalc: http://ceph.com/pgcalc/
diff --git a/doc/rados/operations/pools.rst b/doc/rados/operations/pools.rst
new file mode 100644
index 0000000..de5154d
--- /dev/null
+++ b/doc/rados/operations/pools.rst
@@ -0,0 +1,715 @@
+=======
+ Pools
+=======
+
+When you first deploy a cluster without creating a pool, Ceph uses the default
+pools for storing data. A pool provides you with:
+
+- **Resilience**: You can set how many OSD are allowed to fail without losing data.
+  For replicated pools, it is the desired number of copies/replicas of an object. 
+  A typical configuration stores an object and one additional copy
+  (i.e., ``size = 2``), but you can determine the number of copies/replicas.
+  For `erasure coded pools <../erasure-code>`_, it is the number of coding chunks
+  (i.e. ``m=2`` in the **erasure code profile**)
+  
+- **Placement Groups**: You can set the number of placement groups for the pool.
+  A typical configuration uses approximately 100 placement groups per OSD to 
+  provide optimal balancing without using up too many computing resources. When 
+  setting up multiple pools, be careful to ensure you set a reasonable number of
+  placement groups for both the pool and the cluster as a whole. 
+
+- **CRUSH Rules**: When you store data in a pool, a CRUSH ruleset mapped to the 
+  pool enables CRUSH to identify a rule for the placement of the object 
+  and its replicas (or chunks for erasure coded pools) in your cluster. 
+  You can create a custom CRUSH rule for your pool.
+  
+- **Snapshots**: When you create snapshots with ``ceph osd pool mksnap``, 
+  you effectively take a snapshot of a particular pool.
+  
+- **Set Ownership**: You can set a user ID as the owner of a pool. 
+
+To organize data into pools, you can list, create, and remove pools. 
+You can also view the utilization statistics for each pool.
+
+List Pools
+==========
+
+To list your cluster's pools, execute:: 
+
+	ceph osd lspools
+
+On a freshly installed cluster, only the ``rbd`` pool exists.
+
+
+.. _createpool:
+
+Create a Pool
+=============
+
+Before creating pools, refer to the `Pool, PG and CRUSH Config Reference`_.
+Ideally, you should override the default value for the number of placement
+groups in your Ceph configuration file, as the default is NOT ideal.
+For details on placement group numbers refer to `setting the number of placement groups`_
+
+For example:: 
+
+	osd pool default pg num = 100
+	osd pool default pgp num = 100
+
+To create a pool, execute:: 
+
+	ceph osd pool create {pool-name} {pg-num} [{pgp-num}] [replicated] \
+             [crush-ruleset-name] [expected-num-objects]
+	ceph osd pool create {pool-name} {pg-num}  {pgp-num}   erasure \
+             [erasure-code-profile] [crush-ruleset-name] [expected_num_objects]
+
+Where: 
+
+``{pool-name}``
+
+:Description: The name of the pool. It must be unique.
+:Type: String
+:Required: Yes.
+
+``{pg-num}``
+
+:Description: The total number of placement groups for the pool. See `Placement
+              Groups`_  for details on calculating a suitable number. The 
+              default value ``8`` is NOT suitable for most systems.
+
+:Type: Integer
+:Required: Yes.
+:Default: 8
+
+``{pgp-num}``
+
+:Description: The total number of placement groups for placement purposes. This
+              **should be equal to the total number of placement groups**, except 
+              for placement group splitting scenarios.
+
+:Type: Integer
+:Required: Yes. Picks up default or Ceph configuration value if not specified.
+:Default: 8
+
+``{replicated|erasure}``
+
+:Description: The pool type which may either be **replicated** to
+              recover from lost OSDs by keeping multiple copies of the
+              objects or **erasure** to get a kind of
+              `generalized RAID5 <../erasure-code>`_ capability.
+              The **replicated** pools require more
+              raw storage but implement all Ceph operations. The
+              **erasure** pools require less raw storage but only
+              implement a subset of the available operations.
+
+:Type: String
+:Required: No. 
+:Default: replicated
+
+``[crush-ruleset-name]``
+
+:Description: The name of a CRUSH ruleset to use for this pool.  The specified
+              ruleset must exist.
+
+:Type: String
+:Required: No. 
+:Default: For **replicated** pools it is the ruleset specified by the ``osd
+          pool default crush replicated ruleset`` config variable.  This
+          ruleset must exist.
+          For **erasure** pools it is ``erasure-code`` if the ``default``
+          `erasure code profile`_ is used or ``{pool-name}`` otherwise.  This
+          ruleset will be created implicitly if it doesn't exist already.
+
+
+``[erasure-code-profile=profile]``
+
+.. _erasure code profile: ../erasure-code-profile
+
+:Description: For **erasure** pools only. Use the `erasure code profile`_. It
+              must be an existing profile as defined by 
+              **osd erasure-code-profile set**.
+
+:Type: String
+:Required: No. 
+
+When you create a pool, set the number of placement groups to a reasonable value
+(e.g., ``100``). Consider the total number of placement groups per OSD too.
+Placement groups are computationally expensive, so performance will degrade when
+you have many pools with many placement groups (e.g., 50 pools with 100
+placement groups each). The point of diminishing returns depends upon the power
+of the OSD host.
+
+See `Placement Groups`_ for details on calculating an appropriate number of
+placement groups for your pool.
+
+.. _Placement Groups: ../placement-groups
+
+``[expected-num-objects]``
+
+:Description: The expected number of objects for this pool. By setting this value (
+              together with a negative **filestore merge threshold**), the PG folder
+              splitting would happen at the pool creation time, to avoid the latency
+              impact to do a runtime folder splitting.
+
+:Type: Integer
+:Required: No.
+:Default: 0, no splitting at the pool creation time. 
+
+Set Pool Quotas
+===============
+
+You can set pool quotas for the maximum number of bytes and/or the maximum 
+number of objects per pool. ::
+
+	ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}] 
+
+For example:: 
+
+	ceph osd pool set-quota data max_objects 10000
+
+To remove a quota, set its value to ``0``.
+
+
+Delete a Pool
+=============
+
+To delete a pool, execute::
+
+	ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
+
+	
+If you created your own rulesets and rules for a pool you created,  you should
+consider removing them when you no longer need your pool.  If you created users
+with permissions strictly for a pool that no longer exists, you should consider
+deleting those users too.
+
+
+Rename a Pool
+=============
+
+To rename a pool, execute:: 
+
+	ceph osd pool rename {current-pool-name} {new-pool-name}
+
+If you rename a pool and you have per-pool capabilities for an authenticated 
+user, you must update the user's capabilities (i.e., caps) with the new pool
+name. 
+
+.. note:: Version ``0.48`` Argonaut and above.
+
+Show Pool Statistics
+====================
+
+To show a pool's utilization statistics, execute:: 
+
+	rados df
+	
+
+Make a Snapshot of a Pool
+=========================
+
+To make a snapshot of a pool, execute:: 
+
+	ceph osd pool mksnap {pool-name} {snap-name}	
+	
+.. note:: Version ``0.48`` Argonaut and above.
+
+
+Remove a Snapshot of a Pool
+===========================
+
+To remove a snapshot of a pool, execute:: 
+
+	ceph osd pool rmsnap {pool-name} {snap-name}
+
+.. note:: Version ``0.48`` Argonaut and above.	
+
+.. _setpoolvalues:
+
+
+Set Pool Values
+===============
+
+To set a value to a pool, execute the following:: 
+
+	ceph osd pool set {pool-name} {key} {value}
+	
+You may set values for the following keys: 
+
+.. _size:
+
+``size``
+
+:Description: Sets the number of replicas for objects in the pool. 
+              See `Set the Number of Object Replicas`_ for further details. 
+              Replicated pools only.
+
+:Type: Integer
+
+.. _min_size:
+
+``min_size``
+
+:Description: Sets the minimum number of replicas required for I/O.  
+              See `Set the Number of Object Replicas`_ for further details. 
+              Replicated pools only.
+
+:Type: Integer
+:Version: ``0.54`` and above
+
+.. _crash_replay_interval:
+
+``crash_replay_interval``
+
+:Description: The number of seconds to allow clients to replay acknowledged, 
+              but uncommitted requests.
+              
+:Type: Integer
+
+.. _pgp_num:
+
+``pgp_num``
+
+:Description: The effective number of placement groups to use when calculating 
+              data placement.
+
+:Type: Integer
+:Valid Range: Equal to or less than ``pg_num``.
+
+.. _crush_ruleset:
+
+``crush_ruleset``
+
+:Description: The ruleset to use for mapping object placement in the cluster.
+:Type: Integer
+
+.. _hashpspool:
+
+``hashpspool``
+
+:Description: Set/Unset HASHPSPOOL flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+:Version: Version ``0.48`` Argonaut and above.	
+
+.. _nodelete:
+
+``nodelete``
+
+:Description: Set/Unset NODELETE flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+:Version: Version ``FIXME``
+
+.. _nopgchange:
+
+``nopgchange``
+
+:Description: Set/Unset NOPGCHANGE flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+:Version: Version ``FIXME``
+
+.. _nosizechange:
+
+``nosizechange``
+
+:Description: Set/Unset NOSIZECHANGE flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+:Version: Version ``FIXME``
+
+.. _write_fadvise_dontneed:
+
+``write_fadvise_dontneed``
+
+:Description: Set/Unset WRITE_FADVISE_DONTNEED flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+
+.. _noscrub:
+
+``noscrub``
+
+:Description: Set/Unset NOSCRUB flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+
+.. _nodeep-scrub:
+
+``nodeep-scrub``
+
+:Description: Set/Unset NODEEP_SCRUB flag on a given pool.
+:Type: Integer
+:Valid Range: 1 sets flag, 0 unsets flag
+
+.. _hit_set_type:
+
+``hit_set_type``
+
+:Description: Enables hit set tracking for cache pools.
+              See `Bloom Filter`_ for additional information.
+
+:Type: String
+:Valid Settings: ``bloom``, ``explicit_hash``, ``explicit_object``
+:Default: ``bloom``. Other values are for testing.
+
+.. _hit_set_count:
+
+``hit_set_count``
+
+:Description: The number of hit sets to store for cache pools. The higher 
+              the number, the more RAM consumed by the ``ceph-osd`` daemon.
+
+:Type: Integer
+:Valid Range: ``1``. Agent doesn't handle > 1 yet.
+
+.. _hit_set_period:
+
+``hit_set_period``
+
+:Description: The duration of a hit set period in seconds for cache pools. 
+              The higher the number, the more RAM consumed by the 
+              ``ceph-osd`` daemon.
+
+:Type: Integer
+:Example: ``3600`` 1hr
+
+.. _hit_set_fpp:
+
+``hit_set_fpp``
+
+:Description: The false positive probability for the ``bloom`` hit set type.
+              See `Bloom Filter`_ for additional information.
+
+:Type: Double
+:Valid Range: 0.0 - 1.0
+:Default: ``0.05``
+
+.. _cache_target_dirty_ratio:
+
+``cache_target_dirty_ratio``
+
+:Description: The percentage of the cache pool containing modified (dirty) 
+              objects before the cache tiering agent will flush them to the
+              backing storage pool.
+              
+:Type: Double
+:Default: ``.4``
+
+.. _cache_target_dirty_high_ratio:
+
+``cache_target_dirty_high_ratio``
+
+:Description: The percentage of the cache pool containing modified (dirty)
+              objects before the cache tiering agent will flush them to the
+              backing storage pool with a higher speed.
+
+:Type: Double
+:Default: ``.6``
+
+.. _cache_target_full_ratio:
+
+``cache_target_full_ratio``
+
+:Description: The percentage of the cache pool containing unmodified (clean)
+              objects before the cache tiering agent will evict them from the
+              cache pool.
+             
+:Type: Double
+:Default: ``.8``
+
+.. _target_max_bytes:
+
+``target_max_bytes``
+
+:Description: Ceph will begin flushing or evicting objects when the 
+              ``max_bytes`` threshold is triggered.
+              
+:Type: Integer
+:Example: ``1000000000000``  #1-TB
+
+.. _target_max_objects:
+
+``target_max_objects`` 
+
+:Description: Ceph will begin flushing or evicting objects when the 
+              ``max_objects`` threshold is triggered.
+
+:Type: Integer
+:Example: ``1000000`` #1M objects
+
+
+``hit_set_grade_decay_rate``
+
+:Description: Temperature decay rate between two successive hit_sets
+:Type: Integer
+:Valid Range: 0 - 100
+:Default: ``20``
+
+
+``hit_set_grade_search_last_n``
+
+:Description: Count at most N appearance in hit_sets for temperature calculation
+:Type: Integer
+:Valid Range: 0 - hit_set_count
+:Default: ``1``
+
+
+.. _cache_min_flush_age:
+
+``cache_min_flush_age``
+
+:Description: The time (in seconds) before the cache tiering agent will flush 
+              an object from the cache pool to the storage pool.
+              
+:Type: Integer
+:Example: ``600`` 10min 
+
+.. _cache_min_evict_age:
+
+``cache_min_evict_age``
+
+:Description: The time (in seconds) before the cache tiering agent will evict
+              an object from the cache pool.
+              
+:Type: Integer
+:Example: ``1800`` 30min
+
+.. _fast_read:
+
+``fast_read``
+
+:Description: On Erasure Coding pool, if this flag is turned on, the read request
+              would issue sub reads to all shards, and waits until it receives enough
+              shards to decode to serve the client. In the case of jerasure and isa
+              erasure plugins, once the first K replies return, client's request is
+              served immediately using the data decoded from these replies. This
+              helps to tradeoff some resources for better performance. Currently this
+              flag is only supported for Erasure Coding pool.
+
+:Type: Boolean
+:Defaults: ``0``
+
+.. _scrub_min_interval:
+
+``scrub_min_interval``
+
+:Description: The minimum interval in seconds for pool scrubbing when
+              load is low. If it is 0, the value osd_scrub_min_interval
+              from config is used.
+
+:Type: Double
+:Default: ``0``
+
+.. _scrub_max_interval:
+
+``scrub_max_interval``
+
+:Description: The maximum interval in seconds for pool scrubbing
+              irrespective of cluster load. If it is 0, the value
+              osd_scrub_max_interval from config is used.
+
+:Type: Double
+:Default: ``0``
+
+.. _deep_scrub_interval:
+
+``deep_scrub_interval``
+
+:Description: The interval in seconds for pool “deep” scrubbing. If it
+              is 0, the value osd_deep_scrub_interval from config is used.
+
+:Type: Double
+:Default: ``0``
+
+
+Get Pool Values
+===============
+
+To get a value from a pool, execute the following:: 
+
+	ceph osd pool get {pool-name} {key}
+	
+You may get values for the following keys: 
+
+``size``
+
+:Description: see size_
+
+:Type: Integer
+
+``min_size``
+
+:Description: see min_size_
+
+:Type: Integer
+:Version: ``0.54`` and above
+
+``crash_replay_interval``
+
+:Description: see crash_replay_interval_
+              
+:Type: Integer
+
+
+``pgp_num``
+
+:Description: see pgp_num_
+
+:Type: Integer
+:Valid Range: Equal to or less than ``pg_num``.
+
+
+``crush_ruleset``
+
+:Description: see crush_ruleset_
+
+
+``hit_set_type``
+
+:Description: see hit_set_type_
+
+:Type: String
+:Valid Settings: ``bloom``, ``explicit_hash``, ``explicit_object``
+
+``hit_set_count``
+
+:Description: see hit_set_count_
+
+:Type: Integer
+
+
+``hit_set_period``
+
+:Description: see hit_set_period_
+
+:Type: Integer
+
+
+``hit_set_fpp``
+
+:Description: see hit_set_fpp_
+
+:Type: Double
+
+
+``cache_target_dirty_ratio``
+
+:Description: see cache_target_dirty_ratio_
+
+:Type: Double
+
+
+``cache_target_dirty_high_ratio``
+
+:Description: see cache_target_dirty_high_ratio_
+
+:Type: Double
+
+
+``cache_target_full_ratio``
+
+:Description: see cache_target_full_ratio_
+             
+:Type: Double
+
+
+``target_max_bytes``
+
+:Description: see target_max_bytes_
+              
+:Type: Integer
+
+
+``target_max_objects`` 
+
+:Description: see target_max_objects_
+
+:Type: Integer
+
+
+``cache_min_flush_age``
+
+:Description: see cache_min_flush_age_
+              
+:Type: Integer
+
+
+``cache_min_evict_age``
+
+:Description: see cache_min_evict_age_
+              
+:Type: Integer
+
+
+``fast_read``
+
+:Description: see fast_read_
+
+:Type: Boolean
+
+
+``scrub_min_interval``
+
+:Description: see scrub_min_interval_
+
+:Type: Double
+
+
+``scrub_max_interval``
+
+:Description: see scrub_max_interval_
+
+:Type: Double
+
+
+``deep_scrub_interval``
+
+:Description: see deep_scrub_interval_
+
+:Type: Double
+
+
+Set the Number of Object Replicas
+=================================
+
+To set the number of object replicas on a replicated pool, execute the following:: 
+
+	ceph osd pool set {poolname} size {num-replicas}
+
+.. important:: The ``{num-replicas}`` includes the object itself.
+   If you want the object and two copies of the object for a total of 
+   three instances of the object, specify ``3``.
+   
+For example:: 
+
+	ceph osd pool set data size 3
+
+You may execute this command for each pool. **Note:** An object might accept 
+I/Os in degraded mode with fewer than ``pool size`` replicas.  To set a minimum
+number of required replicas for I/O, you should use the ``min_size`` setting.
+For example::
+
+  ceph osd pool set data min_size 2
+
+This ensures that no object in the data pool will receive I/O with fewer than
+``min_size`` replicas.
+
+
+Get the Number of Object Replicas
+=================================
+
+To get the number of object replicas, execute the following:: 
+
+	ceph osd dump | grep 'replicated size'
+	
+Ceph will list the pools, with the ``replicated size`` attribute highlighted.
+By default, ceph creates two replicas of an object (a total of three copies, or 
+a size of 3).
+
+
+
+.. _Pool, PG and CRUSH Config Reference: ../../configuration/pool-pg-config-ref
+.. _Bloom Filter: http://en.wikipedia.org/wiki/Bloom_filter
+.. _setting the number of placement groups: ../placement-groups#set-the-number-of-placement-groups
diff --git a/doc/rados/operations/user-management.rst b/doc/rados/operations/user-management.rst
new file mode 100644
index 0000000..ccdb097
--- /dev/null
+++ b/doc/rados/operations/user-management.rst
@@ -0,0 +1,655 @@
+=================
+ User Management
+=================
+
+This document describes :term:`Ceph Client` users, and their authentication and
+authorization with the :term:`Ceph Storage Cluster`. Users are either
+individuals or system actors such as applications, which use Ceph clients to
+interact with the Ceph Storage Cluster daemons.
+
+.. ditaa::  +-----+
+            | {o} |
+            |     |
+            +--+--+       /---------\               /---------\
+               |          |  Ceph   |               |  Ceph   |
+            ---+---*----->|         |<------------->|         |
+               |     uses | Clients |               | Servers |
+               |          \---------/               \---------/
+            /--+--\
+            |     |
+            |     |
+             actor                                    
+
+
+When Ceph runs with authentication and authorization enabled (enabled by
+default), you must specify a user name and a keyring containing the secret key
+of the specified user (usually via the command line). If you do not specify a
+user name, Ceph will use ``client.admin`` as the default user name. If you do
+not specify a keyring, Ceph will look for a keyring via the ``keyring`` setting
+in the Ceph configuration. For example, if you execute the ``ceph health`` 
+command without specifying a user or keyring::
+
+	ceph health
+	
+Ceph interprets the command like this::
+
+	ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
+
+Alternatively, you may use the ``CEPH_ARGS`` environment variable to avoid 
+re-entry of the user name and secret.
+
+For details on configuring the Ceph Storage Cluster to use authentication, 
+see `Cephx Config Reference`_. For details on the architecture of Cephx, see
+`Architecture - High Availability Authentication`_.
+
+
+Background
+==========
+
+Irrespective of the type of Ceph client (e.g., Block Device, Object Storage,
+Filesystem, native API, etc.), Ceph stores all data as objects within `pools`_.
+Ceph users must have access to pools in order to read and write data.
+Additionally, Ceph users must have execute permissions to use Ceph's
+administrative commands. The following concepts will help you understand Ceph
+user management.
+
+
+User
+----
+
+A user is either an individual or a system actor such as an application.
+Creating users allows you to control who (or what) can access your Ceph Storage
+Cluster, its pools, and the data within pools.
+
+Ceph has the notion of a ``type`` of user. For the purposes of user management,
+the type will always be ``client``. Ceph identifies users in period (.)
+delimited form consisting of the user type and the user ID: for example,
+``TYPE.ID``, ``client.admin``, or ``client.user1``. The reason for user typing
+is that Ceph Monitors, OSDs, and Metadata Servers also use the Cephx protocol,
+but they are not clients. Distinguishing the user type helps to distinguish
+between client users and other users--streamlining access control, user
+monitoring and traceability.
+
+Sometimes Ceph's user type may seem confusing, because the Ceph command line
+allows you to specify a user with or without the type, depending upon your
+command line usage. If you specify ``--user`` or ``--id``, you can omit the
+type. So ``client.user1`` can be entered simply as ``user1``. If you specify
+``--name`` or ``-n``, you must specify the type and name, such as
+``client.user1``. We recommend using the type and name as a best practice
+wherever possible.
+
+.. note:: A Ceph Storage Cluster user is not the same as a Ceph Object Storage
+   user or a Ceph Filesystem user. The Ceph Object Gateway uses a Ceph Storage 
+   Cluster user to communicate between the gateway daemon and the storage 
+   cluster, but the gateway has its own user management functionality for end 
+   users. The Ceph Filesystem uses POSIX semantics. The user space associated 
+   with the Ceph Filesystem is not the same as a Ceph Storage Cluster user.
+
+
+
+Authorization (Capabilities)
+----------------------------
+
+Ceph uses the term "capabilities" (caps) to describe authorizing an
+authenticated user to exercise the functionality of the monitors, OSDs and
+metadata servers. Capabilities can also restrict access to data within a pool or
+a namespace within a pool. A Ceph administrative user sets a user's
+capabilities when creating or updating a user.
+
+Capability syntax follows the form::
+
+	{daemon-type} 'allow {capability}' [{daemon-type} 'allow {capability}']
+
+
+- **Monitor Caps:** Monitor capabilities include ``r``, ``w``, ``x`` and 
+  ``allow profile {cap}``. For example:: 
+
+	mon 'allow rwx'
+	mon 'allow profile osd'
+
+- **OSD Caps:** OSD capabilities include ``r``, ``w``, ``x``, ``class-read``, 
+  ``class-write`` and ``profile osd``. Additionally, OSD capabilities also 
+  allow for pool and namespace settings. ::
+
+	osd 'allow {capability}' [pool={poolname}] [namespace={namespace-name}]
+
+- **Metadata Server Caps:** Metadata server capability simply requires ``allow``, 
+  or blank and does not parse anything further. :: 
+  
+	mds 'allow'
+
+
+.. note:: The Ceph Object Gateway daemon (``radosgw``) is a client of the 
+          Ceph Storage Cluster, so it isn't represented as a Ceph Storage 
+          Cluster daemon type.
+
+The following entries describe each capability.
+
+``allow``
+
+:Description: Precedes access settings for a daemon. Implies ``rw`` 
+              for MDS only.
+
+
+``r``
+
+:Description: Gives the user read access. Required with monitors to retrieve 
+              the CRUSH map.
+
+
+``w``
+
+:Description: Gives the user write access to objects.
+
+
+``x``
+
+:Description: Gives the user the capability to call class methods 
+              (i.e., both read and write) and to conduct ``auth``
+              operations on monitors.
+
+
+``class-read``
+
+:Descriptions: Gives the user the capability to call class read methods. 
+               Subset of ``x``. 
+
+
+``class-write``
+
+:Description: Gives the user the capability to call class write methods. 
+              Subset of ``x``. 
+
+
+``*``
+
+:Description: Gives the user read, write and execute permissions for a 
+              particular daemon/pool, and the ability to execute 
+              admin commands.
+
+
+``profile osd``
+
+:Description: Gives a user permissions to connect as an OSD to other OSDs or 
+              monitors. Conferred on OSDs to enable OSDs to handle replication
+              heartbeat traffic and status reporting.
+
+
+``profile mds``
+
+:Description: Gives a user permissions to connect as a MDS to other MDSs or 
+              monitors.
+
+
+``profile bootstrap-osd``
+
+:Description: Gives a user permissions to bootstrap an OSD. Conferred on 
+              deployment tools such as ``ceph-disk``, ``ceph-deploy``, etc.
+              so that they have permissions to add keys, etc. when 
+              bootstrapping an OSD.
+
+
+``profile bootstrap-mds``
+
+:Description: Gives a user permissions to bootstrap a metadata server. 
+              Conferred on deployment tools such as ``ceph-deploy``, etc.
+              so they have permissions to add keys, etc. when bootstrapping
+              a metadata server.
+
+
+
+Pool
+----
+
+A pool is a logical partition where users store data.
+In Ceph deployments, it is common to create a pool as a logical partition for
+similar types of data. For example, when deploying Ceph as a backend for
+OpenStack, a typical deployment would have pools for volumes, images, backups
+and virtual machines, and users such as ``client.glance``, ``client.cinder``,
+etc.
+
+
+Namespace
+---------
+
+Objects within a pool can be associated to a namespace--a logical group of
+objects within the pool. A user's access to a pool can be associated with a
+namespace such that reads and writes by the user take place only within the
+namespace. Objects written to a namespace within the pool can only be accessed
+by users who have access to the namespace.
+
+.. note:: Currently (i.e., ``firefly``), namespaces are only useful for 
+   applications written on top of ``librados``. Ceph clients such as block 
+   device, object storage and file system do not currently support this 
+   feature.
+
+The rationale for namespaces is that pools can be a computationally expensive
+method of segregating data sets for the purposes of authorizing separate sets
+of users. For example, a pool should have ~100 placement groups per OSD. So an 
+exemplary cluster with 1000 OSDs would have 100,000 placement groups for one 
+pool. Each pool would create another 100,000 placement groups in the exemplary 
+cluster. By contrast, writing an object to a namespace simply associates the 
+namespace to the object name with out the computational overhead of a separate 
+pool. Rather than creating a separate pool for a user or set of users, you may
+use a namespace. **Note:** Only available using ``librados`` at this time.
+
+
+Managing Users
+==============
+
+User management functionality provides Ceph Storage Cluster administrators with
+the ability to create, update and delete users directly in the Ceph Storage
+Cluster.
+
+When you create or delete users in the Ceph Storage Cluster, you may need to
+distribute keys to clients so that they can be added to keyrings. See `Keyring
+Management`_ for details.
+
+
+List Users
+----------
+
+To list the users in your cluster, execute the following::
+
+	ceph auth list
+
+Ceph will list out all users in your cluster. For example, in a two-node
+exemplary cluster, ``ceph auth list`` will output something that looks like
+this::
+
+	installed auth entries:
+
+	osd.0
+		key: AQCvCbtToC6MDhAATtuT70Sl+DymPCfDSsyV4w==
+		caps: [mon] allow profile osd
+		caps: [osd] allow *
+	osd.1
+		key: AQC4CbtTCFJBChAAVq5spj0ff4eHZICxIOVZeA==
+		caps: [mon] allow profile osd
+		caps: [osd] allow *
+	client.admin
+		key: AQBHCbtT6APDHhAA5W00cBchwkQjh3dkKsyPjw==
+		caps: [mds] allow
+		caps: [mon] allow *
+		caps: [osd] allow *
+	client.bootstrap-mds
+		key: AQBICbtTOK9uGBAAdbe5zcIGHZL3T/u2g6EBww==
+		caps: [mon] allow profile bootstrap-mds
+	client.bootstrap-osd
+		key: AQBHCbtT4GxqORAADE5u7RkpCN/oo4e5W0uBtw==
+		caps: [mon] allow profile bootstrap-osd
+
+
+Note that the ``TYPE.ID`` notation for users applies such that ``osd.0`` is a
+user of type ``osd`` and its ID is ``0``, ``client.admin`` is a user of type
+``client`` and its ID is ``admin`` (i.e., the default ``client.admin`` user).
+Note also that each entry has a ``key: <value>`` entry, and one or more
+``caps:`` entries.
+
+You may use the ``-o {filename}`` option with ``ceph auth list`` to 
+save the output to a file.
+
+
+Get a User
+----------
+
+To retrieve a specific user, key and capabilities, execute the 
+following::
+
+	ceph auth get {TYPE.ID}
+
+For example::
+
+	ceph auth get client.admin
+
+You may also use the ``-o {filename}`` option with ``ceph auth get`` to 
+save the output to a file. Developers may also execute the following::
+
+	ceph auth export {TYPE.ID}
+
+The ``auth export`` command is identical to ``auth get``, but also prints
+out the internal ``auid``, which isn't relevant to end users.
+
+
+
+Add a User
+----------
+
+Adding a user creates a username (i.e., ``TYPE.ID``), a secret key and
+any capabilities included in the command you use to create the user.
+
+A user's key enables the user to authenticate with the Ceph Storage Cluster. 
+The user's capabilities authorize the user to read, write, or execute on Ceph
+monitors (``mon``), Ceph OSDs (``osd``) or Ceph Metadata  Servers (``mds``).
+
+There are a few ways to add a user:
+
+- ``ceph auth add``: This command is the canonical way to add a user. It
+  will create the user, generate a key and add any specified capabilities.
+  
+- ``ceph auth get-or-create``: This command is often the most convenient way
+  to create a user, because it returns a keyfile format with the user name 
+  (in brackets) and the key. If the user already exists, this command
+  simply returns the user name and key in the keyfile format. You may use the 
+  ``-o {filename}`` option to save the output to a file.
+
+- ``ceph auth get-or-create-key``: This command is a convenient way to create
+  a user and return the user's key (only). This is useful for clients that
+  need the key only (e.g., libvirt). If the user already exists, this command
+  simply returns the key. You may use the ``-o {filename}`` option to save the 
+  output to a file.
+
+When creating client users, you may create a user with no capabilities. A user
+with no capabilities is useless beyond mere authentication, because the client
+cannot retrieve the cluster map from the monitor. However, you can create a 
+user with no capabilities if you wish to defer adding capabilities later using 
+the ``ceph auth caps`` command.
+
+A typical user has at least read capabilities on the Ceph monitor and 
+read and write capability on Ceph OSDs. Additionally, a user's OSD permissions
+are often restricted to accessing a particular pool. ::
+
+	ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
+	ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
+	ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
+	ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
+
+
+.. important:: If you provide a user with capabilities to OSDs, but you DO NOT
+   restrict access to particular pools, the user will have access to ALL 
+   pools in the cluster!
+
+
+Modify User Capabilities
+------------------------
+
+The ``ceph auth caps`` command allows you to specify a user and change the 
+user's capabilities. Setting new capabilities will overwrite current capabilities.
+To view current capabilities run ``ceph auth get USERTYPE.USERID``.  To add
+capabilities, you should also specify the existing capabilities when using the form:: 
+
+	ceph auth caps USERTYPE.USERID {daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]' [{daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]']
+
+For example:: 
+
+	ceph auth get client.john
+	ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
+	ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
+	ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
+
+To remove a capability, you may reset the capability. If you want the user
+to have no access to a particular daemon that was previously set, specify 
+an empty string. For example:: 
+
+	ceph auth caps client.ringo mon ' ' osd ' '
+
+See `Authorization (Capabilities)`_ for additional details on capabilities.
+
+
+Delete a User
+-------------
+
+To delete a user, use ``ceph auth del``:: 
+
+	ceph auth del {TYPE}.{ID}
+	
+Where ``{TYPE}`` is one of ``client``, ``osd``, ``mon``, or ``mds``, 
+and ``{ID}`` is the user name or ID of the daemon.
+
+
+Print a User's Key
+------------------
+
+To print a user's authentication key to standard output, execute the following::
+
+	ceph auth print-key {TYPE}.{ID}
+
+Where ``{TYPE}`` is one of ``client``, ``osd``, ``mon``, or ``mds``, 
+and ``{ID}`` is the user name or ID of the daemon.
+
+Printing a user's key is useful when you need to populate client 
+software with a user's key  (e.g., libvirt). ::
+
+	mount -t ceph serverhost:/ mountpoint -o name=client.user,secret=`ceph auth print-key client.user`
+
+
+Import a User(s)
+----------------
+
+To import one or more users, use ``ceph auth import`` and
+specify a keyring:: 
+
+	ceph auth import -i /path/to/keyring
+
+For example:: 
+
+	sudo ceph auth import -i /etc/ceph/ceph.keyring
+
+
+.. note:: The ceph storage cluster will add new users, their keys and their 
+   capabilities and will update existing users, their keys and their 
+   capabilities.
+
+
+Keyring Management
+==================
+
+When you access Ceph via a Ceph client, the Ceph client will look for a local 
+keyring. Ceph presets the ``keyring`` setting with the following four keyring 
+names by default so you don't have to set them in your Ceph configuration file 
+unless you want to override the defaults (not recommended): 
+
+- ``/etc/ceph/$cluster.$name.keyring``
+- ``/etc/ceph/$cluster.keyring``
+- ``/etc/ceph/keyring``
+- ``/etc/ceph/keyring.bin``
+
+The ``$cluster`` metavariable is your Ceph cluster name as defined by the
+name of the Ceph configuration file (i.e., ``ceph.conf`` means the cluster name
+is ``ceph``; thus, ``ceph.keyring``). The ``$name`` metavariable is the user 
+type and user ID (e.g., ``client.admin``; thus, ``ceph.client.admin.keyring``).
+
+.. note:: When executing commands that read or write to ``/etc/ceph``, you may
+   need to use ``sudo`` to execute the command as ``root``.
+
+After you create a user (e.g., ``client.ringo``), you must get the key and add
+it to a keyring on a Ceph client so that the user can access the Ceph Storage
+Cluster.
+
+The `User Management`_ section details how to list, get, add, modify and delete
+users directly in the Ceph Storage Cluster. However, Ceph also provides the
+``ceph-authtool`` utility to allow you to manage keyrings from a Ceph client.
+
+
+Create a Keyring
+----------------
+
+When you use the procedures in the `Managing Users`_ section to create users, 
+you need to provide user keys to the Ceph client(s) so that the Ceph client 
+can retrieve the key for the specified user and authenticate with the Ceph 
+Storage Cluster. Ceph Clients access keyrings to lookup a user name and 
+retrieve the user's key.
+
+The ``ceph-authtool`` utility allows you to create a keyring. To create an 
+empty keyring, use ``--create-keyring`` or ``-C``. For example:: 
+
+	ceph-authtool --create-keyring /path/to/keyring
+
+When creating a keyring with multiple users, we recommend using the cluster name
+(e.g., ``$cluster.keyring``) for the keyring filename and saving it in the
+``/etc/ceph`` directory so that the ``keyring`` configuration default setting
+will pick up the filename without requiring you to specify it in the local copy
+of your Ceph configuration file. For example, create ``ceph.keyring`` by
+executing the following::
+
+	sudo ceph-authtool -C /etc/ceph/ceph.keyring
+
+When creating a keyring with a single user, we recommend using the cluster name,
+the user type and the user name and saving it in the ``/etc/ceph`` directory.
+For example, ``ceph.client.admin.keyring`` for the ``client.admin`` user.
+
+To create a keyring in ``/etc/ceph``, you must do so as ``root``. This means
+the file will have ``rw`` permissions for the ``root`` user only, which is 
+appropriate when the keyring contains administrator keys. However, if you 
+intend to use the keyring for a particular user or group of users, ensure
+that you execute ``chown`` or ``chmod`` to establish appropriate keyring 
+ownership and access.
+
+
+Add a User to a Keyring
+-----------------------
+
+When you  `Add a User`_ to the Ceph Storage Cluster, you can use the `Get a
+User`_ procedure to retrieve a user, key and capabilities and save the user to a
+keyring.
+
+When you only want to use one user per keyring, the `Get a User`_ procedure with
+the ``-o`` option will save the output in the keyring file format. For example, 
+to create a keyring for the ``client.admin`` user, execute the following:: 
+
+	sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
+	
+Notice that we use the recommended file format for an individual user.
+
+When you want to import users to a keyring, you can use ``ceph-authtool``
+to specify the destination keyring and the source keyring.
+For example:: 
+
+	sudo ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
+
+
+Create a User
+-------------
+
+Ceph provides the `Add a User`_ function to create a user directly in the Ceph
+Storage Cluster. However, you can also create a user, keys and capabilities
+directly on a Ceph client keyring. Then, you can import the user to the Ceph
+Storage Cluster. For example::
+
+	sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
+
+See `Authorization (Capabilities)`_ for additional details on capabilities.
+
+You can also create a keyring and add a new user to the keyring simultaneously.
+For example::
+
+	sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
+
+In the foregoing scenarios, the new user ``client.ringo`` is only in the 
+keyring. To add the new user to the Ceph Storage Cluster, you must still add
+the new user to the Ceph Storage Cluster. ::
+
+	sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
+
+
+Modify a User
+-------------
+
+To modify the capabilities of a user record in a keyring, specify the keyring,
+and the user followed by the capabilities. For example::
+
+	sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx'
+
+To update the user to the Ceph Storage Cluster, you must update the user
+in the keyring to the user entry in the the Ceph Storage Cluster. ::
+
+	sudo ceph auth import -i /etc/ceph/ceph.keyring
+
+See `Import a User(s)`_ for details on updating a Ceph Storage Cluster user
+from a keyring.
+
+You may also `Modify User Capabilities`_ directly in the cluster, store the
+results to a keyring file; then, import the keyring into your main
+``ceph.keyring`` file.
+
+
+Command Line Usage
+==================
+
+Ceph supports the following usage for user name and secret:
+
+``--id`` | ``--user``
+
+:Description: Ceph identifies users with a type and an ID (e.g., ``TYPE.ID`` or
+              ``client.admin``, ``client.user1``). The ``id``, ``name`` and 
+              ``-n`` options enable you to specify the ID portion of the user 
+              name (e.g., ``admin``, ``user1``, ``foo``, etc.). You can specify 
+              the user with the ``--id`` and omit the type. For example, 
+              to specify user ``client.foo`` enter the following:: 
+              
+               ceph --id foo --keyring /path/to/keyring health
+               ceph --user foo --keyring /path/to/keyring health
+
+
+``--name`` | ``-n``
+
+:Description: Ceph identifies users with a type and an ID (e.g., ``TYPE.ID`` or
+              ``client.admin``, ``client.user1``). The ``--name`` and ``-n`` 
+              options enables you to specify the fully qualified user name. 
+              You must specify the user type (typically ``client``) with the 
+              user ID. For example:: 
+
+               ceph --name client.foo --keyring /path/to/keyring health
+               ceph -n client.foo --keyring /path/to/keyring health
+
+
+``--keyring``
+
+:Description: The path to the keyring containing one or more user name and 
+              secret. The ``--secret`` option provides the same functionality, 
+              but it does not work with Ceph RADOS Gateway, which uses 
+              ``--secret`` for another purpose. You may retrieve a keyring with 
+              ``ceph auth get-or-create`` and store it locally. This is a 
+              preferred approach, because you can switch user names without 
+              switching the keyring path. For example:: 
+
+               sudo rbd map --id foo --keyring /path/to/keyring mypool/myimage
+
+
+.. _pools: ../pools
+
+
+Limitations
+===========
+
+The ``cephx`` protocol authenticates Ceph clients and servers to each other.  It
+is not intended to handle authentication of human users or application programs
+run on their behalf.  If that effect is required to handle your access control
+needs, you must have another mechanism, which is likely to be specific to the
+front end used to access the Ceph object store.  This other mechanism has the
+role of ensuring that only acceptable users and programs are able to run on the
+machine that Ceph will permit to access its object store. 
+
+The keys used to authenticate Ceph clients and servers are typically stored in
+a plain text file with appropriate permissions in a trusted host.
+
+.. important:: Storing keys in plaintext files has security shortcomings, but 
+   they are difficult to avoid, given the basic authentication methods Ceph 
+   uses in the background. Those setting up Ceph systems should be aware of 
+   these shortcomings.  
+
+In particular, arbitrary user machines, especially portable machines, should not
+be configured to interact directly with Ceph, since that mode of use would
+require the storage of a plaintext authentication key on an insecure machine.
+Anyone  who stole that machine or obtained surreptitious access to it could
+obtain the key that will allow them to authenticate their own machines to Ceph.
+
+Rather than permitting potentially insecure machines to access a Ceph object
+store directly,  users should be required to sign in to a trusted machine in
+your environment using a method  that provides sufficient security for your
+purposes.  That trusted machine will store the plaintext Ceph keys for the
+human users.  A future version of Ceph may address these particular
+authentication issues more fully.
+
+At the moment, none of the Ceph authentication protocols provide secrecy for
+messages in transit. Thus, an eavesdropper on the wire can hear and understand
+all data sent between clients and servers in Ceph, even if it cannot create or
+alter them. Further, Ceph does not include options to encrypt user data in the
+object store. Users can hand-encrypt and store their own data in the Ceph
+object store, of course, but Ceph provides no features to perform object
+encryption itself. Those storing sensitive data in Ceph should consider
+encrypting their data before providing it  to the Ceph system.
+
+
+.. _Architecture - High Availability Authentication: ../../../architecture#high-availability-authentication
+.. _Cephx Config Reference: ../../configuration/auth-config-ref
diff --git a/doc/rados/troubleshooting/community.rst b/doc/rados/troubleshooting/community.rst
new file mode 100644
index 0000000..9faad13
--- /dev/null
+++ b/doc/rados/troubleshooting/community.rst
@@ -0,0 +1,29 @@
+====================
+ The Ceph Community
+====================
+
+The Ceph community is an excellent source of information and help. For
+operational issues with Ceph releases we recommend you `subscribe to the
+ceph-users email list`_. When  you no longer want to receive emails, you can
+`unsubscribe from the ceph-users email list`_.
+
+You may also `subscribe to the ceph-devel email list`_. You should do so if
+your issue is:
+
+- Likely related to a bug
+- Related to a development release package
+- Related to a development testing package
+- Related to your own builds
+
+If you no longer want to receive emails from the ``ceph-devel`` email list, you
+may `unsubscribe from the ceph-devel email list`_.
+
+.. tip:: The Ceph community is growing rapidly, and community members can help
+   you if you provide them with detailed information about your problem. You
+   can attach the output of the ``ceph report`` command to help people understand your issues.
+
+.. _subscribe to the ceph-devel email list: mailto:majordomo at vger.kernel.org?body=subscribe+ceph-devel
+.. _unsubscribe from the ceph-devel email list: mailto:majordomo at vger.kernel.org?body=unsubscribe+ceph-devel
+.. _subscribe to the ceph-users email list: mailto:ceph-users-join at lists.ceph.com
+.. _unsubscribe from the ceph-users email list: mailto:ceph-users-leave at lists.ceph.com
+.. _ceph-devel: ceph-devel at vger.kernel.org
\ No newline at end of file
diff --git a/doc/rados/troubleshooting/cpu-profiling.rst b/doc/rados/troubleshooting/cpu-profiling.rst
new file mode 100644
index 0000000..159f799
--- /dev/null
+++ b/doc/rados/troubleshooting/cpu-profiling.rst
@@ -0,0 +1,67 @@
+===============
+ CPU Profiling
+===============
+
+If you built Ceph from source and compiled Ceph for use with `oprofile`_
+you can profile Ceph's CPU usage. See `Installing Oprofile`_ for details.
+
+
+Initializing oprofile
+=====================
+
+The first time you use ``oprofile`` you need to initialize it. Locate the
+``vmlinux`` image corresponding to the kernel you are now running. :: 
+
+	ls /boot
+	sudo opcontrol --init
+	sudo opcontrol --setup --vmlinux={path-to-image} --separate=library --callgraph=6
+
+
+Starting oprofile
+=================
+
+To start ``oprofile`` execute the following command:: 
+
+	opcontrol --start
+
+Once you start ``oprofile``, you may run some tests with Ceph. 
+
+
+Stopping oprofile
+=================
+
+To stop ``oprofile`` execute the following command:: 
+
+	opcontrol --stop
+	
+	
+Retrieving oprofile Results
+===========================
+
+To retrieve the top ``cmon`` results, execute the following command:: 
+
+	opreport -gal ./cmon | less	
+	
+
+To retrieve the top ``cmon`` results with call graphs attached, execute the
+following command:: 
+
+	opreport -cal ./cmon | less	
+	
+.. important:: After reviewing results, you should reset ``oprofile`` before
+   running it again. Resetting ``oprofile`` removes data from the session 
+   directory.
+
+
+Resetting oprofile
+==================
+
+To reset ``oprofile``, execute the following command:: 
+
+	sudo opcontrol --reset   
+   
+.. important:: You should reset ``oprofile`` after analyzing data so that 
+   you do not commingle results from different tests.
+
+.. _oprofile: http://oprofile.sourceforge.net/about/
+.. _Installing Oprofile: ../../../dev/cpu-profiler
diff --git a/doc/rados/troubleshooting/index.rst b/doc/rados/troubleshooting/index.rst
new file mode 100644
index 0000000..80d14f3
--- /dev/null
+++ b/doc/rados/troubleshooting/index.rst
@@ -0,0 +1,19 @@
+=================
+ Troubleshooting
+=================
+
+Ceph is still on the leading edge, so you may encounter situations that require 
+you to examine your configuration, modify your logging output, troubleshoot
+monitors and OSDs, profile memory and CPU usage, and reach out to the 
+Ceph community for help.
+
+.. toctree::
+   :maxdepth: 1
+   
+   community
+   log-and-debug
+   troubleshooting-mon
+   troubleshooting-osd
+   troubleshooting-pg
+   memory-profiling
+   cpu-profiling
diff --git a/doc/rados/troubleshooting/log-and-debug.rst b/doc/rados/troubleshooting/log-and-debug.rst
new file mode 100644
index 0000000..d618a88
--- /dev/null
+++ b/doc/rados/troubleshooting/log-and-debug.rst
@@ -0,0 +1,557 @@
+=======================
+ Logging and Debugging
+=======================
+
+Typically, when you add debugging to your Ceph configuration, you do so at
+runtime. You can also add Ceph debug logging to your Ceph configuration file if
+you are encountering issues when starting your cluster. You may view Ceph log
+files under ``/var/log/ceph`` (the default location).
+
+.. tip:: When debug output slows down your system, the latency can hide 
+   race conditions.
+
+Logging is resource intensive. If you are encountering a problem in a specific
+area of your cluster, enable logging for that area of the cluster. For example,
+if your OSDs are running fine, but your metadata servers are not, you should
+start by enabling debug logging for the specific metadata server instance(s)
+giving you trouble. Enable logging for each subsystem as needed.
+
+.. important:: Verbose logging can generate over 1GB of data per hour. If your 
+   OS disk reaches its capacity, the node will stop working.
+   
+If you enable or increase the rate of Ceph logging, ensure that you have
+sufficient disk space on your OS disk.  See `Accelerating Log Rotation`_ for
+details on rotating log files. When your system is running well, remove
+unnecessary debugging settings to ensure your cluster runs optimally. Logging
+debug output messages is relatively slow, and a waste of resources when
+operating your cluster.
+
+See `Subsystem, Log and Debug Settings`_ for details on available settings.
+
+Runtime
+=======
+
+If you would like to see the configuration settings at runtime, you must log
+in to a host with a running daemon and execute the following:: 
+
+	ceph daemon {daemon-name} config show | less
+
+For example,::
+
+  ceph daemon osd.0 config show | less
+
+To activate Ceph's debugging output (*i.e.*, ``dout()``) at runtime,  use the
+``ceph tell`` command to inject arguments into the runtime configuration:: 
+
+	ceph tell {daemon-type}.{daemon id or *} injectargs --{name} {value} [--{name} {value}]
+	
+Replace ``{daemon-type}`` with one of ``osd``, ``mon`` or ``mds``. You may apply
+the runtime setting to all daemons of a particular type with ``*``, or specify
+a specific daemon's ID. For example, to increase
+debug logging for a ``ceph-osd`` daemon named ``osd.0``, execute the following:: 
+
+	ceph tell osd.0 injectargs --debug-osd 0/5
+
+The ``ceph tell`` command goes through the monitors. If you cannot bind to the
+monitor, you can still make the change by logging into the host of the daemon
+whose configuration you'd like to change using ``ceph daemon``.
+For example:: 
+
+	sudo ceph daemon osd.0 config set debug_osd 0/5
+
+See `Subsystem, Log and Debug Settings`_ for details on available settings.
+
+
+Boot Time
+=========
+
+To activate Ceph's debugging output (*i.e.*, ``dout()``) at boot time, you must
+add settings to your Ceph configuration file. Subsystems common to each daemon
+may be set under ``[global]`` in your configuration file. Subsystems for
+particular daemons are set under the daemon section in your configuration file
+(*e.g.*, ``[mon]``, ``[osd]``, ``[mds]``). For example::
+
+	[global]
+		debug ms = 1/5
+		
+	[mon]
+		debug mon = 20
+		debug paxos = 1/5
+		debug auth = 2
+		 
+ 	[osd]
+ 		debug osd = 1/5
+ 		debug filestore = 1/5
+ 		debug journal = 1
+ 		debug monc = 5/20
+ 		
+	[mds]
+		debug mds = 1
+		debug mds balancer = 1
+		debug mds log = 1
+		debug mds migrator = 1
+
+
+See `Subsystem, Log and Debug Settings`_ for details.
+
+
+Accelerating Log Rotation
+=========================
+
+If your OS disk is relatively full, you can accelerate log rotation by modifying
+the Ceph log rotation file at ``/etc/logrotate.d/ceph``. Add  a size setting
+after the rotation frequency to accelerate log rotation (via cronjob) if your
+logs exceed the size setting. For example, the  default setting looks like
+this::
+   
+	rotate 7
+  	weekly
+  	compress
+  	sharedscripts
+   	
+Modify it by adding a ``size`` setting. ::
+   
+  	rotate 7
+  	weekly
+  	size 500M
+  	compress
+  	sharedscripts
+
+Then, start the crontab editor for your user space. ::
+   
+  	crontab -e
+	
+Finally, add an entry to check the ``etc/logrotate.d/ceph`` file. ::
+   
+  	30 * * * * /usr/sbin/logrotate /etc/logrotate.d/ceph >/dev/null 2>&1
+
+The preceding example checks the ``etc/logrotate.d/ceph`` file every 30 minutes.
+
+
+Valgrind
+========
+
+Debugging may also require you to track down memory and threading issues. 
+You can run a single daemon, a type of daemon, or the whole cluster with 
+Valgrind. You should only use Valgrind when developing or debugging Ceph. 
+Valgrind is computationally expensive, and will slow down your system otherwise. 
+Valgrind messages are logged to ``stderr``. 
+
+
+Subsystem, Log and Debug Settings
+=================================
+
+In most cases, you will enable debug logging output via subsystems. 
+
+Ceph Subsystems
+---------------
+
+Each subsystem has a logging level for its output logs, and for its logs
+in-memory. You may set different values for each of these subsystems by setting
+a log file level and a memory level for debug logging. Ceph's logging levels
+operate on a scale of ``1`` to ``20``, where ``1`` is terse and ``20`` is
+verbose. In general, the logs in-memory are not sent to the output log unless:
+
+- a fatal signal is raised or
+- an ``assert`` in source code is triggered or
+- upon requested. Please consult `document on admin socket <http://docs.ceph.com/docs/master/man/8/ceph/#daemon>`_ for more details.
+
+A debug logging setting can take a single value for the log level and the
+memory level, which sets them both as the same value. For example, if you
+specify ``debug ms = 5``, Ceph will treat it as a log level and a memory level
+of ``5``. You may also specify them separately. The first setting is the log
+level, and the second setting is the memory level.  You must separate them with
+a forward slash (/). For example, if you want to set the ``ms`` subsystem's
+debug logging level to ``1`` and its memory level to ``5``, you would specify it
+as ``debug ms = 1/5``. For example:
+
+
+
+.. code-block:: ini 
+
+	debug {subsystem} = {log-level}/{memory-level}
+	#for example
+	debug mds log = 1/20
+
+
+The following table provides a list of Ceph subsystems and their default log and
+memory levels. Once you complete your logging efforts, restore the subsystems
+to their default level or to a level suitable for normal operations.
+
+
++--------------------+-----------+--------------+
+| Subsystem          | Log Level | Memory Level |
++====================+===========+==============+
+| ``default``        |     0     |      5       |
++--------------------+-----------+--------------+
+| ``lockdep``        |     0     |      5       |
++--------------------+-----------+--------------+
+| ``context``        |     0     |      5       |
++--------------------+-----------+--------------+
+| ``crush``          |     1     |      5       |
++--------------------+-----------+--------------+
+| ``mds``            |     1     |      5       |
++--------------------+-----------+--------------+
+| ``mds balancer``   |     1     |      5       |
++--------------------+-----------+--------------+
+| ``mds locker``     |     1     |      5       |
++--------------------+-----------+--------------+
+| ``mds log``        |     1     |      5       |
++--------------------+-----------+--------------+
+| ``mds log expire`` |     1     |      5       |
++--------------------+-----------+--------------+
+| ``mds migrator``   |     1     |      5       |
++--------------------+-----------+--------------+
+| ``buffer``         |     0     |      0       |
++--------------------+-----------+--------------+
+| ``timer``          |     0     |      5       |
++--------------------+-----------+--------------+
+| ``filer``          |     0     |      5       |
++--------------------+-----------+--------------+
+| ``objecter``       |     0     |      0       |
++--------------------+-----------+--------------+
+| ``rados``          |     0     |      5       |
++--------------------+-----------+--------------+
+| ``rbd``            |     0     |      5       |
++--------------------+-----------+--------------+
+| ``journaler``      |     0     |      5       |
++--------------------+-----------+--------------+
+| ``objectcacher``   |     0     |      5       |
++--------------------+-----------+--------------+
+| ``client``         |     0     |      5       |
++--------------------+-----------+--------------+
+| ``osd``            |     0     |      5       |
++--------------------+-----------+--------------+
+| ``optracker``      |     0     |      5       |
++--------------------+-----------+--------------+
+| ``objclass``       |     0     |      5       |
++--------------------+-----------+--------------+
+| ``filestore``      |     1     |      5       |
++--------------------+-----------+--------------+
+| ``journal``        |     1     |      5       |
++--------------------+-----------+--------------+
+| ``ms``             |     0     |      5       |
++--------------------+-----------+--------------+
+| ``mon``            |     1     |      5       |
++--------------------+-----------+--------------+
+| ``monc``           |     0     |      5       |
++--------------------+-----------+--------------+
+| ``paxos``          |     0     |      5       |
++--------------------+-----------+--------------+
+| ``tp``             |     0     |      5       |
++--------------------+-----------+--------------+
+| ``auth``           |     1     |      5       |
++--------------------+-----------+--------------+
+| ``finisher``       |     1     |      5       |
++--------------------+-----------+--------------+
+| ``heartbeatmap``   |     1     |      5       |
++--------------------+-----------+--------------+
+| ``perfcounter``    |     1     |      5       |
++--------------------+-----------+--------------+
+| ``rgw``            |     1     |      5       |
++--------------------+-----------+--------------+
+| ``javaclient``     |     1     |      5       |
++--------------------+-----------+--------------+
+| ``asok``           |     1     |      5       |
++--------------------+-----------+--------------+
+| ``throttle``       |     1     |      5       |
++--------------------+-----------+--------------+
+
+
+Logging Settings
+----------------
+
+Logging and debugging settings are not required in a Ceph configuration file,
+but you may override default settings as needed. Ceph supports the following
+settings:
+
+
+``log file``
+
+:Description: The location of the logging file for your cluster.
+:Type: String
+:Required: No
+:Default: ``/var/log/ceph/$cluster-$name.log``
+
+
+``log max new``
+
+:Description: The maximum number of new log files.
+:Type: Integer
+:Required: No
+:Default: ``1000``
+
+
+``log max recent``
+
+:Description: The maximum number of recent events to include in a log file.
+:Type: Integer
+:Required:  No
+:Default: ``1000000``
+
+
+``log to stderr``
+
+:Description: Determines if logging messages should appear in ``stderr``.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``err to stderr``
+
+:Description: Determines if error messages should appear in ``stderr``.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``log to syslog``
+
+:Description: Determines if logging messages should appear in ``syslog``.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``err to syslog``
+
+:Description: Determines if error messages should appear in ``syslog``.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``log flush on exit``
+
+:Description: Determines if Ceph should flush the log files after exit.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``clog to monitors``
+
+:Description: Determines if ``clog`` messages should be sent to monitors.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``clog to syslog``
+
+:Description: Determines if ``clog`` messages should be sent to syslog.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``mon cluster log to syslog``
+
+:Description: Determines if the cluster log should be output to the syslog.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``mon cluster log file``
+
+:Description: The location of the cluster's log file. 
+:Type: String
+:Required: No
+:Default: ``/var/log/ceph/$cluster.log``
+
+
+
+OSD
+---
+
+
+``osd debug drop ping probability``
+
+:Description: ?
+:Type: Double
+:Required: No
+:Default: 0
+
+
+``osd debug drop ping duration``
+
+:Description: 
+:Type: Integer
+:Required: No
+:Default: 0
+
+``osd debug drop pg create probability``
+
+:Description: 
+:Type: Integer
+:Required: No
+:Default: 0
+
+``osd debug drop pg create duration``
+
+:Description: ?
+:Type: Double
+:Required: No
+:Default: 1
+
+``osd preserve trimmed log``
+
+:Description: Preserves trimmed logs after trimming.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``osd tmapput sets uses tmap``
+
+:Description: Uses ``tmap``. For debug only.
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``osd min pg log entries``
+
+:Description: The minimum number of log entries for placement groups. 
+:Type: 32-bit Unsigned Integer
+:Required: No
+:Default: 1000
+
+
+``osd op log threshold``
+
+:Description: How many op log messages to show up in one pass. 
+:Type: Integer
+:Required: No
+:Default: 5
+
+
+
+Filestore
+---------
+
+``filestore debug omap check``
+
+:Description: Debugging check on synchronization. This is an expensive operation.
+:Type: Boolean
+:Required: No
+:Default: 0
+
+
+MDS
+---
+
+
+``mds debug scatterstat``
+
+:Description: Ceph will assert that various recursive stat invariants are true 
+              (for developers only).
+
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``mds debug frag``
+
+:Description: Ceph will verify directory fragmentation invariants when 
+              convenient (developers only).
+
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``mds debug auth pins``
+
+:Description: The debug auth pin invariants (for developers only).
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``mds debug subtrees``
+
+:Description: The debug subtree invariants (for developers only).
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+
+RADOS Gateway
+-------------
+
+
+``rgw log nonexistent bucket``
+
+:Description: Should we log a non-existent buckets?
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``rgw log object name``
+
+:Description: Should an object's name be logged. // man date to see codes (a subset are supported)
+:Type: String
+:Required: No
+:Default: ``%Y-%m-%d-%H-%i-%n``
+
+
+``rgw log object name utc``
+
+:Description: Object log name contains UTC?
+:Type: Boolean
+:Required: No
+:Default: ``false``
+
+
+``rgw enable ops log``
+
+:Description: Enables logging of every RGW operation.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``rgw enable usage log``
+
+:Description: Enable logging of RGW's bandwidth usage.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``rgw usage log flush threshold``
+
+:Description: Threshold to flush pending log data.
+:Type: Integer
+:Required: No
+:Default: ``1024``
+
+
+``rgw usage log tick interval``
+
+:Description: Flush pending log data every ``s`` seconds.
+:Type: Integer
+:Required: No
+:Default: 30
+
+
+``rgw intent log object name``
+
+:Description: 
+:Type: String
+:Required: No
+:Default: ``%Y-%m-%d-%i-%n``
+
+
+``rgw intent log object name utc``
+
+:Description: Include a UTC timestamp in the intent log object name.
+:Type: Boolean
+:Required: No
+:Default: ``false``
diff --git a/doc/rados/troubleshooting/memory-profiling.rst b/doc/rados/troubleshooting/memory-profiling.rst
new file mode 100644
index 0000000..5322e7b
--- /dev/null
+++ b/doc/rados/troubleshooting/memory-profiling.rst
@@ -0,0 +1,142 @@
+==================
+ Memory Profiling
+==================
+
+Ceph MON, OSD and MDS can generate heap profiles using
+``tcmalloc``. To generate heap profiles, ensure you have
+``google-perftools`` installed::
+
+	sudo apt-get install google-perftools
+
+The profiler dumps output to your ``log file`` directory (i.e.,
+``/var/log/ceph``). See `Logging and Debugging`_ for details.
+To view the profiler logs with Google's performance tools, execute the
+following:: 
+
+    google-pprof --text {path-to-daemon}  {log-path/filename}
+
+For example::
+
+    $ ceph tell osd.0 heap start_profiler
+    $ ceph tell osd.0 heap dump
+    osd.0 tcmalloc heap stats:------------------------------------------------
+    MALLOC:        2632288 (    2.5 MiB) Bytes in use by application
+    MALLOC: +       499712 (    0.5 MiB) Bytes in page heap freelist
+    MALLOC: +       543800 (    0.5 MiB) Bytes in central cache freelist
+    MALLOC: +       327680 (    0.3 MiB) Bytes in transfer cache freelist
+    MALLOC: +      1239400 (    1.2 MiB) Bytes in thread cache freelists
+    MALLOC: +      1142936 (    1.1 MiB) Bytes in malloc metadata
+    MALLOC:   ------------
+    MALLOC: =      6385816 (    6.1 MiB) Actual memory used (physical + swap)
+    MALLOC: +            0 (    0.0 MiB) Bytes released to OS (aka unmapped)
+    MALLOC:   ------------
+    MALLOC: =      6385816 (    6.1 MiB) Virtual address space used
+    MALLOC:
+    MALLOC:            231              Spans in use
+    MALLOC:             56              Thread heaps in use
+    MALLOC:           8192              Tcmalloc page size
+    ------------------------------------------------
+    Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).
+    Bytes released to the OS take up virtual address space but no physical memory.
+    $ google-pprof --text \
+                   /usr/bin/ceph-osd  \
+                   /var/log/ceph/ceph-osd.0.profile.0001.heap
+     Total: 3.7 MB
+     1.9  51.1%  51.1%      1.9  51.1% ceph::log::Log::create_entry
+     1.8  47.3%  98.4%      1.8  47.3% std::string::_Rep::_S_create
+     0.0   0.4%  98.9%      0.0   0.6% SimpleMessenger::add_accept_pipe
+     0.0   0.4%  99.2%      0.0   0.6% decode_message
+     ...
+
+Another heap dump on the same daemon will add another file. It is
+convenient to compare to a previous heap dump to show what has grown
+in the interval. For instance::
+
+    $ google-pprof --text --base out/osd.0.profile.0001.heap \
+          ceph-osd out/osd.0.profile.0003.heap
+     Total: 0.2 MB
+     0.1  50.3%  50.3%      0.1  50.3% ceph::log::Log::create_entry
+     0.1  46.6%  96.8%      0.1  46.6% std::string::_Rep::_S_create
+     0.0   0.9%  97.7%      0.0  26.1% ReplicatedPG::do_op
+     0.0   0.8%  98.5%      0.0   0.8% __gnu_cxx::new_allocator::allocate
+
+Refer to `Google Heap Profiler`_ for additional details.
+
+Once you have the heap profiler installed, start your cluster and
+begin using the heap profiler. You may enable or disable the heap
+profiler at runtime, or ensure that it runs continuously. For the
+following commandline usage, replace ``{daemon-type}`` with ``mon``,
+``osd`` or ``mds``, and replace ``{daemon-id}`` with the OSD number or
+the MON or MDS id.
+
+
+Starting the Profiler
+---------------------
+
+To start the heap profiler, execute the following:: 
+
+	ceph tell {daemon-type}.{daemon-id} heap start_profiler
+
+For example:: 
+
+	ceph tell osd.1 heap start_profiler
+
+Alternatively the profile can be started when the daemon starts
+running if the ``CEPH_HEAP_PROFILER_INIT=true`` variable is found in
+the environment.
+
+Printing Stats
+--------------
+
+To print out statistics, execute the following:: 
+
+	ceph  tell {daemon-type}.{daemon-id} heap stats
+
+For example:: 
+
+	ceph tell osd.0 heap stats
+
+.. note:: Printing stats does not require the profiler to be running and does
+   not dump the heap allocation information to a file.
+
+
+Dumping Heap Information
+------------------------
+
+To dump heap information, execute the following:: 
+
+	ceph tell {daemon-type}.{daemon-id} heap dump
+
+For example:: 
+
+	ceph tell mds.a heap dump
+
+.. note:: Dumping heap information only works when the profiler is running.
+
+
+Releasing Memory
+----------------
+
+To release memory that ``tcmalloc`` has allocated but which is not being used by
+the Ceph daemon itself, execute the following:: 
+
+	ceph tell {daemon-type}{daemon-id} heap release
+
+For example:: 
+
+	ceph tell osd.2 heap release
+
+
+Stopping the Profiler
+---------------------
+
+To stop the heap profiler, execute the following:: 
+
+	ceph tell {daemon-type}.{daemon-id} heap stop_profiler
+
+For example:: 
+
+	ceph tell osd.0 heap stop_profiler
+
+.. _Logging and Debugging: ../log-and-debug
+.. _Google Heap Profiler: http://google-perftools.googlecode.com/svn/trunk/doc/heapprofile.html
diff --git a/doc/rados/troubleshooting/troubleshooting-mon.rst b/doc/rados/troubleshooting/troubleshooting-mon.rst
new file mode 100644
index 0000000..a50db4c
--- /dev/null
+++ b/doc/rados/troubleshooting/troubleshooting-mon.rst
@@ -0,0 +1,565 @@
+=================================
+ Troubleshooting Monitors
+=================================
+
+.. index:: monitor, high availability
+
+When a cluster encounters monitor-related troubles there's a tendency to
+panic, and some times with good reason. You should keep in mind that losing
+a monitor, or a bunch of them, don't necessarily mean that your cluster is
+down, as long as a majority is up, running and with a formed quorum.
+Regardless of how bad the situation is, the first thing you should do is to
+calm down, take a breath and try answering our initial troubleshooting script.
+
+
+Initial Troubleshooting
+========================
+
+
+**Are the monitors running?**
+
+  First of all, we need to make sure the monitors are running. You would be
+  amazed by how often people forget to run the monitors, or restart them after
+  an upgrade. There's no shame in that, but let's try not losing a couple of
+  hours chasing an issue that is not there.
+
+**Are you able to connect to the monitor's servers?**
+
+  Doesn't happen often, but sometimes people do have ``iptables`` rules that
+  block accesses to monitor servers or monitor ports. Usually leftovers from
+  monitor stress-testing that were forgotten at some point. Try ssh'ing into
+  the server and, if that succeeds, try connecting to the monitor's port
+  using you tool of choice (telnet, nc,...).
+
+**Does ceph -s run and obtain a reply from the cluster?**
+
+  If the answer is yes then your cluster is up and running.  One thing you
+  can take for granted is that the monitors will only answer to a ``status``
+  request if there is a formed quorum.
+
+  If ``ceph -s`` blocked however, without obtaining a reply from the cluster
+  or showing a lot of ``fault`` messages, then it is likely that your monitors
+  are either down completely or just a portion is up -- a portion that is not
+  enough to form a quorum (keep in mind that a quorum if formed by a majority
+  of monitors).
+
+**What if ceph -s doesn't finish?**
+
+  If you haven't gone through all the steps so far, please go back and do.
+
+  For those running on Emperor 0.72-rc1 and forward, you will be able to
+  contact each monitor individually asking them for their status, regardless
+  of a quorum being formed. This an be achieved using ``ceph ping mon.ID``,
+  ID being the monitor's identifier. You should perform this for each monitor
+  in the cluster. In section `Understanding mon_status`_ we will explain how
+  to interpret the output of this command.
+
+  For the rest of you who don't tread on the bleeding edge, you will need to
+  ssh into the server and use the monitor's admin socket. Please jump to
+  `Using the monitor's admin socket`_.
+
+For other specific issues, keep on reading.
+
+
+Using the monitor's admin socket
+=================================
+
+The admin socket allows you to interact with a given daemon directly using a
+Unix socket file. This file can be found in your monitor's ``run`` directory.
+By default, the admin socket will be kept in ``/var/run/ceph/ceph-mon.ID.asok``
+but this can vary if you defined it otherwise. If you don't find it there,
+please check your ``ceph.conf`` for an alternative path or run::
+
+  ceph-conf --name mon.ID --show-config-value admin_socket
+
+Please bear in mind that the admin socket will only be available while the
+monitor is running. When the monitor is properly shutdown, the admin socket
+will be removed. If however the monitor is not running and the admin socket
+still persists, it is likely that the monitor was improperly shutdown.
+Regardless, if the monitor is not running, you will not be able to use the
+admin socket, with ``ceph`` likely returning ``Error 111: Connection Refused``.
+
+Accessing the admin socket is as simple as telling the ``ceph`` tool to use
+the ``asok`` file.  In pre-Dumpling Ceph, this can be achieved by::
+
+  ceph --admin-daemon /var/run/ceph/ceph-mon.<id>.asok <command>
+
+while in Dumpling and beyond you can use the alternate (and recommended)
+format::
+
+  ceph daemon mon.<id> <command>
+
+Using ``help`` as the command to the ``ceph`` tool will show you the
+supported commands available through the admin socket. Please take a look
+at ``config get``, ``config show``, ``mon_status`` and ``quorum_status``,
+as those can be enlightening when troubleshooting a monitor.
+
+
+Understanding mon_status
+=========================
+
+``mon_status`` can be obtained through the ``ceph`` tool when you have
+a formed quorum, or via the admin socket if you don't. This command will
+output a multitude of information about the monitor, including the same
+output you would get with ``quorum_status``.
+
+Take the following example of ``mon_status``::
+
+  
+  { "name": "c",
+    "rank": 2,
+    "state": "peon",
+    "election_epoch": 38,
+    "quorum": [
+          1,
+          2],
+    "outside_quorum": [],
+    "extra_probe_peers": [],
+    "sync_provider": [],
+    "monmap": { "epoch": 3,
+        "fsid": "5c4e9d53-e2e1-478a-8061-f543f8be4cf8",
+        "modified": "2013-10-30 04:12:01.945629",
+        "created": "2013-10-29 14:14:41.914786",
+        "mons": [
+              { "rank": 0,
+                "name": "a",
+                "addr": "127.0.0.1:6789\/0"},
+              { "rank": 1,
+                "name": "b",
+                "addr": "127.0.0.1:6790\/0"},
+              { "rank": 2,
+                "name": "c",
+                "addr": "127.0.0.1:6795\/0"}]}}
+
+A couple of things are obvious: we have three monitors in the monmap (*a*, *b*
+and *c*), the quorum is formed by only two monitors, and *c* is in the quorum
+as a *peon*.
+
+Which monitor is out of the quorum?
+
+  The answer would be **a**.
+
+Why?
+
+  Take a look at the ``quorum`` set. We have two monitors in this set: *1*
+  and *2*. These are not monitor names. These are monitor ranks, as established
+  in the current monmap. We are missing the monitor with rank 0, and according
+  to the monmap that would be ``mon.a``.
+
+By the way, how are ranks established?
+
+  Ranks are (re)calculated whenever you add or remove monitors and follow a
+  simple rule: the **greater** the ``IP:PORT`` combination, the **lower** the
+  rank is. In this case, considering that ``127.0.0.1:6789`` is lower than all
+  the remaining ``IP:PORT`` combinations, ``mon.a`` has rank 0.
+
+Most Common Monitor Issues
+===========================
+
+Have Quorum but at least one Monitor is down
+---------------------------------------------
+
+When this happens, depending on the version of Ceph you are running,
+you should be seeing something similar to::
+
+      $ ceph health detail
+      [snip]
+      mon.a (rank 0) addr 127.0.0.1:6789/0 is down (out of quorum)
+
+How to troubleshoot this?
+
+  First, make sure ``mon.a`` is running.
+
+  Second, make sure you are able to connect to ``mon.a``'s server from the
+  other monitors' servers. Check the ports as well. Check ``iptables`` on
+  all your monitor nodes and make sure you're not dropping/rejecting
+  connections.
+
+  If this initial troubleshooting doesn't solve your problems, then it's
+  time to go deeper.
+
+  First, check the problematic monitor's ``mon_status`` via the admin
+  socket as explained in `Using the monitor's admin socket`_ and
+  `Understanding mon_status`_.
+
+  Considering the monitor is out of the quorum, its state should be one of
+  ``probing``, ``electing`` or ``synchronizing``. If it happens to be either
+  ``leader`` or ``peon``, then the monitor believes to be in quorum, while
+  the remaining cluster is sure it is not; or maybe it got into the quorum
+  while we were troubleshooting the monitor, so check you ``ceph -s`` again
+  just to make sure. Proceed if the monitor is not yet in the quorum.
+
+What if the state is ``probing``?
+
+  This means the monitor is still looking for the other monitors. Every time
+  you start a monitor, the monitor will stay in this state for some time
+  while trying to find the rest of the monitors specified in the ``monmap``.
+  The time a monitor will spend in this state can vary. For instance, when on
+  a single-monitor cluster, the monitor will pass through the probing state
+  almost instantaneously, since there are no other monitors around. On a
+  multi-monitor cluster, the monitors will stay in this state until they
+  find enough monitors to form a quorum -- this means that if you have 2 out
+  of 3 monitors down, the one remaining monitor will stay in this state
+  indefinitively until you bring one of the other monitors up.
+
+  If you have a quorum, however, the monitor should be able to find the
+  remaining monitors pretty fast, as long as they can be reached. If your
+  monitor is stuck probing and you've gone through with all the communication
+  troubleshooting, then there is a fair chance that the monitor is trying
+  to reach the other monitors on a wrong address. ``mon_status`` outputs the
+  ``monmap`` known to the monitor: check if the other monitor's locations
+  match reality. If they don't, jump to
+  `Recovering a Monitor's Broken monmap`_; if they do, then it may be related
+  to severe clock skews amongst the monitor nodes and you should refer to
+  `Clock Skews`_ first, but if that doesn't solve your problem then it is
+  the time to prepare some logs and reach out to the community (please refer
+  to `Preparing your logs`_ on how to best prepare your logs).
+
+
+What if state is ``electing``?
+
+  This means the monitor is in the middle of an election. These should be
+  fast to complete, but at times the monitors can get stuck electing. This
+  is usually a sign of a clock skew among the monitor nodes; jump to
+  `Clock Skews`_ for more infos on that. If all your clocks are properly
+  synchronized, it is best if you prepare some logs and reach out to the
+  community. This is not a state that is likely to persist and aside from
+  (*really*) old bugs there isn't an obvious reason besides clock skews on
+  why this would happen.
+
+What if state is ``synchronizing``?
+
+  This means the monitor is synchronizing with the rest of the cluster in
+  order to join the quorum. The synchronization process is as faster as
+  smaller your monitor store is, so if you have a big store it may
+  take a while. Don't worry, it should be finished soon enough.
+
+  However, if you notice that the monitor jumps from ``synchronizing`` to
+  ``electing`` and then back to ``synchronizing``, then you do have a
+  problem: the cluster state is advancing (i.e., generating new maps) way
+  too fast for the synchronization process to keep up. This used to be a
+  thing in early Cuttlefish, but since then the synchronization process was
+  quite refactored and enhanced to avoid just this sort of behavior. If this
+  happens in later versions let us know. And bring some logs
+  (see `Preparing your logs`_).
+
+What if state is ``leader`` or ``peon``?
+
+  This should not happen. There is a chance this might happen however, and
+  it has a lot to do with clock skews -- see `Clock Skews`_. If you're not
+  suffering from clock skews, then please prepare your logs (see
+  `Preparing your logs`_) and reach out to us.
+
+
+Recovering a Monitor's Broken monmap
+-------------------------------------
+
+This is how a ``monmap`` usually looks like, depending on the number of
+monitors::
+
+
+      epoch 3
+      fsid 5c4e9d53-e2e1-478a-8061-f543f8be4cf8
+      last_changed 2013-10-30 04:12:01.945629
+      created 2013-10-29 14:14:41.914786
+      0: 127.0.0.1:6789/0 mon.a
+      1: 127.0.0.1:6790/0 mon.b
+      2: 127.0.0.1:6795/0 mon.c
+      
+This may not be what you have however. For instance, in some versions of
+early Cuttlefish there was this one bug that could cause your ``monmap``
+to be nullified.  Completely filled with zeros. This means that not even
+``monmaptool`` would be able to read it because it would find it hard to
+make sense of only-zeros. Some other times, you may end up with a monitor
+with a severely outdated monmap, thus being unable to find the remaining
+monitors (e.g., say ``mon.c`` is down; you add a new monitor ``mon.d``,
+then remove ``mon.a``, then add a new monitor ``mon.e`` and remove
+``mon.b``; you will end up with a totally different monmap from the one
+``mon.c`` knows).
+
+In this sort of situations, you have two possible solutions:
+
+Scrap the monitor and create a new one
+
+  You should only take this route if you are positive that you won't
+  lose the information kept by that monitor; that you have other monitors
+  and that they are running just fine so that your new monitor is able
+  to synchronize from the remaining monitors. Keep in mind that destroying
+  a monitor, if there are no other copies of its contents, may lead to
+  loss of data.
+
+Inject a monmap into the monitor
+
+  Usually the safest path. You should grab the monmap from the remaining
+  monitors and inject it into the monitor with the corrupted/lost monmap.
+
+  These are the basic steps:
+
+  1. Is there a formed quorum? If so, grab the monmap from the quorum::
+
+      $ ceph mon getmap -o /tmp/monmap
+
+  2. No quorum? Grab the monmap directly from another monitor (this
+     assumes the monitor you're grabbing the monmap from has id ID-FOO
+     and has been stopped)::
+
+      $ ceph-mon -i ID-FOO --extract-monmap /tmp/monmap
+
+  3. Stop the monitor you're going to inject the monmap into.
+
+  4. Inject the monmap::
+
+      $ ceph-mon -i ID --inject-monmap /tmp/monmap
+
+  5. Start the monitor
+
+  Please keep in mind that the ability to inject monmaps is a powerful
+  feature that can cause havoc with your monitors if misused as it will
+  overwrite the latest, existing monmap kept by the monitor.
+
+
+Clock Skews
+------------
+
+Monitors can be severely affected by significant clock skews across the
+monitor nodes. This usually translates into weird behavior with no obvious
+cause. To avoid such issues, you should run a clock synchronization tool
+on your monitor nodes.
+
+
+What's the maximum tolerated clock skew?
+
+  By default the monitors will allow clocks to drift up to ``0.05 seconds``.
+
+
+Can I increase the maximum tolerated clock skew?
+
+  This value is configurable via the ``mon-clock-drift-allowed`` option, and
+  although you *CAN* it doesn't mean you *SHOULD*. The clock skew mechanism
+  is in place because clock skewed monitor may not properly behave. We, as
+  developers and QA afficcionados, are comfortable with the current default
+  value, as it will alert the user before the monitors get out hand. Changing
+  this value without testing it first may cause unforeseen effects on the
+  stability of the monitors and overall cluster healthiness, although there is
+  no risk of dataloss.
+
+
+How do I know there's a clock skew?
+
+  The monitors will warn you in the form of a ``HEALTH_WARN``. ``ceph health
+  detail`` should show something in the form of::
+
+      mon.c addr 10.10.0.1:6789/0 clock skew 0.08235s > max 0.05s (latency 0.0045s)
+
+  That means that ``mon.c`` has been flagged as suffering from a clock skew.
+
+
+What should I do if there's a clock skew?
+
+  Synchronize your clocks. Running an NTP client may help. If you are already
+  using one and you hit this sort of issues, check if you are using some NTP
+  server remote to your network and consider hosting your own NTP server on
+  your network.  This last option tends to reduce the amount of issues with
+  monitor clock skews.
+
+
+Client Can't Connect or Mount
+------------------------------
+
+Check your IP tables. Some OS install utilities add a ``REJECT`` rule to
+``iptables``. The rule rejects all clients trying to connect to the host except
+for ``ssh``. If your monitor host's IP tables have such a ``REJECT`` rule in
+place, clients connecting from a separate node will fail to mount with a timeout
+error. You need to address ``iptables`` rules that reject clients trying to
+connect to Ceph daemons.  For example, you would need to address rules that look
+like this appropriately::
+
+	REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
+
+You may also need to add rules to IP tables on your Ceph hosts to ensure
+that clients can access the ports associated with your Ceph monitors (i.e., port
+6789 by default) and Ceph OSDs (i.e., 6800 through 7300 by default). For
+example::
+
+	iptables -A INPUT -m multiport -p tcp -s {ip-address}/{netmask} --dports 6789,6800:7300 -j ACCEPT
+
+Monitor Store Failures
+======================
+
+Symptoms of store corruption
+----------------------------
+
+Ceph monitor stores the `cluster map`_ in a key/value store such as LevelDB. If
+a monitor fails due to the key/value store corruption, following error messages
+might be found in the monitor log::
+
+  Corruption: error in middle of record
+
+or::
+
+  Corruption: 1 missing files; e.g.: /var/lib/ceph/mon/mon.0/store.db/1234567.ldb
+
+Recovery using healthy monitor(s)
+---------------------------------
+
+If there is any survivers, we can always `replace`_ the corrupted one with a
+new one. And after booting up, the new joiner will sync up with a healthy
+peer, and once it is fully sync'ed, it will be able to serve the clients.
+
+Recovery using OSDs
+-------------------
+
+But what if all monitors fail at the same time? Since users are encouraged to
+deploy at least three monitors in a Ceph cluster, the chance of simultaneous
+failure is rare. But unplanned power-downs in a data center with improperly
+configured disk/fs settings could fail the underlying filesystem, and hence
+kill all the monitors. In this case, we can recover the monitor store with the
+information stored in OSDs.::
+
+  ms=/tmp/mon-store
+  mkdir $ms
+  # collect the cluster map from OSDs
+  for host in $hosts; do
+    rsync -avz $ms user at host:$ms
+    rm -rf $ms
+    ssh user at host <<EOF
+      for osd in /var/lib/osd/osd-*; do
+        ceph-objectstore-tool --data-path $osd --op update-mon-db --mon-store-path $ms
+      done
+    EOF
+    rsync -avz user at host:$ms $ms
+  done
+  # rebuild the monitor store from the collected map, if the cluster does not
+  # use cephx authentication, we can skip the following steps to update the
+  # keyring with the caps, and there is no need to pass the "--keyring" option.
+  # i.e. just use "ceph-monstore-tool /tmp/mon-store rebuild" instead
+  ceph-authtool /path/to/admin.keyring -n mon. \
+    --cap mon allow 'allow *'
+  ceph-authtool /path/to/admin.keyring -n client.admin \
+    --cap mon allow 'allow *' --cap osd 'allow *' --cap mds 'allow *'
+  ceph-monstore-tool /tmp/mon-store rebuild -- --keyring /path/to/admin.keyring
+  # backup corrupted store.db just in case
+  mv /var/lib/ceph/mon/mon.0/store.db /var/lib/ceph/mon/mon.0/store.db.corrupted
+  mv /tmp/mon-store/store.db /var/lib/ceph/mon/mon.0/store.db
+
+The steps above
+
+#. collect the map from all OSD hosts,
+#. then rebuild the store,
+#. replace the corrupted store on ``mon.0`` with the recovered copy.
+
+Known limitations
+~~~~~~~~~~~~~~~~~
+
+Following information are not recoverable using the steps above:
+
+- **some added keyrings**: all the OSD keyrings added using ``ceph auth add`` command
+  are recovered from the OSD's copy. And the ``client.admin`` keyring is imported
+  using ``ceph-monstore-tool``. But the MDS keyrings and other keyrings are missing
+  in the recovered monitor store. You might need to re-add them manually.
+
+- **pg settings**: the ``full ratio`` and ``nearfull ratio`` settings configured using
+  ``ceph pg set_full_ratio`` and ``ceph pg set_nearfull_ratio`` will be lost.
+
+- **MDS Maps**: the MDS maps are lost.
+
+
+Everything Failed! Now What?
+=============================
+
+Reaching out for help
+----------------------
+
+You can find us on IRC at #ceph and #ceph-devel at OFTC (server irc.oftc.net)
+and on ``ceph-devel at vger.kernel.org`` and ``ceph-users at lists.ceph.com``. Make
+sure you have grabbed your logs and have them ready if someone asks: the faster
+the interaction and lower the latency in response, the better chances everyone's
+time is optimized.
+
+
+Preparing your logs
+---------------------
+
+Monitor logs are, by default, kept in ``/var/log/ceph/ceph-mon.FOO.log*``. We
+may want them. However, your logs may not have the necessary information. If
+you don't find your monitor logs at their default location, you can check
+where they should be by running::
+
+  ceph-conf --name mon.FOO --show-config-value log_file
+
+The amount of information in the logs are subject to the debug levels being
+enforced by your configuration files. If you have not enforced a specific
+debug level then Ceph is using the default levels and your logs may not
+contain important information to track down you issue.
+A first step in getting relevant information into your logs will be to raise
+debug levels. In this case we will be interested in the information from the
+monitor.
+Similarly to what happens on other components, different parts of the monitor
+will output their debug information on different subsystems.
+
+You will have to raise the debug levels of those subsystems more closely
+related to your issue. This may not be an easy task for someone unfamiliar
+with troubleshooting Ceph. For most situations, setting the following options
+on your monitors will be enough to pinpoint a potential source of the issue::
+
+      debug mon = 10
+      debug ms = 1
+
+If we find that these debug levels are not enough, there's a chance we may
+ask you to raise them or even define other debug subsystems to obtain infos
+from -- but at least we started off with some useful information, instead
+of a massively empty log without much to go on with.
+
+Do I need to restart a monitor to adjust debug levels?
+------------------------------------------------------
+
+No. You may do it in one of two ways:
+
+You have quorum
+
+  Either inject the debug option into the monitor you want to debug::
+
+        ceph tell mon.FOO injectargs --debug_mon 10/10
+
+  or into all monitors at once::
+
+        ceph tell mon.* injectargs --debug_mon 10/10
+
+No quourm
+
+  Use the monitor's admin socket and directly adjust the configuration
+  options::
+
+      ceph daemon mon.FOO config set debug_mon 10/10
+
+
+Going back to default values is as easy as rerunning the above commands
+using the debug level ``1/10`` instead.  You can check your current
+values using the admin socket and the following commands::
+
+      ceph daemon mon.FOO config show
+
+or::
+
+      ceph daemon mon.FOO config get 'OPTION_NAME'
+
+
+Reproduced the problem with appropriate debug levels. Now what?
+----------------------------------------------------------------
+
+Ideally you would send us only the relevant portions of your logs.
+We realise that figuring out the corresponding portion may not be the
+easiest of tasks. Therefore, we won't hold it to you if you provide the
+full log, but common sense should be employed. If your log has hundreds
+of thousands of lines, it may get tricky to go through the whole thing,
+specially if we are not aware at which point, whatever your issue is,
+happened. For instance, when reproducing, keep in mind to write down
+current time and date and to extract the relevant portions of your logs
+based on that.
+
+Finally, you should reach out to us on the mailing lists, on IRC or file
+a new issue on the `tracker`_.
+
+.. _cluster map: ../../architecture#cluster-map
+.. _replace: ../operation/add-or-rm-mons
+.. _tracker: http://tracker.ceph.com/projects/ceph/issues/new
diff --git a/doc/rados/troubleshooting/troubleshooting-osd.rst b/doc/rados/troubleshooting/troubleshooting-osd.rst
new file mode 100644
index 0000000..d771d7d
--- /dev/null
+++ b/doc/rados/troubleshooting/troubleshooting-osd.rst
@@ -0,0 +1,484 @@
+======================
+ Troubleshooting OSDs
+======================
+
+Before troubleshooting your OSDs, check your monitors and network first. If
+you execute ``ceph health`` or ``ceph -s`` on the command line and Ceph returns
+a health status, it means that the monitors have a quorum.
+If you don't have a monitor quorum or if there are errors with the monitor
+status, `address the monitor issues first <../troubleshooting-mon>`_. 
+Check your networks to ensure they
+are running properly, because networks may have a significant impact on OSD
+operation and performance.
+
+
+
+Obtaining Data About OSDs
+=========================
+
+A good first step in troubleshooting your OSDs is to obtain information in
+addition to the information you collected while `monitoring your OSDs`_
+(e.g., ``ceph osd tree``).
+
+
+Ceph Logs
+---------
+
+If you haven't changed the default path, you can find Ceph log files at
+``/var/log/ceph``::
+
+	ls /var/log/ceph
+
+If you don't get enough log detail, you can change your logging level.  See
+`Logging and Debugging`_ for details to ensure that Ceph performs adequately
+under high logging volume.
+
+
+Admin Socket
+------------
+
+Use the admin socket tool to retrieve runtime information. For details, list
+the sockets for your Ceph processes::
+
+	ls /var/run/ceph
+
+Then, execute the following, replacing ``{daemon-name}`` with an actual
+daemon (e.g., ``osd.0``)::
+
+  ceph daemon osd.0 help
+
+Alternatively, you can specify a ``{socket-file}`` (e.g., something in ``/var/run/ceph``)::
+
+  ceph daemon {socket-file} help
+
+
+The admin socket, among other things, allows you to:
+
+- List your configuration at runtime
+- Dump historic operations
+- Dump the operation priority queue state
+- Dump operations in flight
+- Dump perfcounters
+
+
+Display Freespace
+-----------------
+
+Filesystem issues may arise. To display your filesystem's free space, execute
+``df``. ::
+
+	df -h
+
+Execute ``df --help`` for additional usage.
+
+
+I/O Statistics
+--------------
+
+Use `iostat`_ to identify I/O-related issues. ::
+
+	iostat -x
+
+
+Diagnostic Messages
+-------------------
+
+To retrieve diagnostic messages, use ``dmesg`` with ``less``, ``more``, ``grep``
+or ``tail``.  For example::
+
+	dmesg | grep scsi
+
+
+Stopping w/out Rebalancing
+==========================
+
+Periodically, you may need to perform maintenance on a subset of your cluster,
+or resolve a problem that affects a failure domain (e.g., a rack). If you do not
+want CRUSH to automatically rebalance the cluster as you stop OSDs for
+maintenance, set the cluster to ``noout`` first::
+
+	ceph osd set noout
+
+Once the cluster is set to ``noout``, you can begin stopping the OSDs within the
+failure domain that requires maintenance work. ::
+
+	stop ceph-osd id={num}
+
+.. note:: Placement groups within the OSDs you stop will become ``degraded``
+   while you are addressing issues with within the failure domain.
+
+Once you have completed your maintenance, restart the OSDs. ::
+
+	start ceph-osd id={num}
+
+Finally, you must unset the cluster from ``noout``. ::
+
+	ceph osd unset noout
+
+
+
+.. _osd-not-running:
+
+OSD Not Running
+===============
+
+Under normal circumstances, simply restarting the ``ceph-osd`` daemon will
+allow it to rejoin the cluster and recover.
+
+An OSD Won't Start
+------------------
+
+If you start your cluster and an OSD won't start, check the following:
+
+- **Configuration File:** If you were not able to get OSDs running from
+  a new installation, check your configuration file to ensure it conforms
+  (e.g., ``host`` not ``hostname``, etc.).
+
+- **Check Paths:** Check the paths in your configuration, and the actual
+  paths themselves for data and journals. If you separate the OSD data from
+  the journal data and there are errors in your configuration file or in the
+  actual mounts, you may have trouble starting OSDs. If you want to store the
+  journal on a block device, you should partition your journal disk and assign
+  one partition per OSD.
+  
+- **Check Max Threadcount:** If you have a node with a lot of OSDs, you may be
+  hitting the default maximum number of threads (e.g., usually 32k), especially
+  during recovery. You can increase the number of threads using ``sysctl`` to 
+  see if increasing the maximum number of threads to the maximum possible 
+  number of threads allowed (i.e.,  4194303) will help. For example:: 
+
+	sysctl -w kernel.pid_max=4194303
+
+  If increasing the maximum thread count resolves the issue, you can make it
+  permanent by including a ``kernel.pid_max`` setting in the 
+  ``/etc/sysctl.conf`` file. For example:: 
+
+	kernel.pid_max = 4194303
+
+- **Kernel Version:** Identify the kernel version and distribution you
+  are using. Ceph uses some third party tools by default, which may be
+  buggy or may conflict with certain distributions and/or kernel
+  versions (e.g., Google perftools). Check the `OS recommendations`_
+  to ensure you have addressed any issues related to your kernel.
+
+- **Segment Fault:** If there is a segment fault, turn your logging up
+  (if it isn't already), and try again. If it segment faults again,
+  contact the ceph-devel email list and provide your Ceph configuration
+  file, your monitor output and the contents of your log file(s).
+  
+
+
+If you cannot resolve the issue and the email list isn't helpful, you may
+contact `Inktank`_ for support.
+
+
+An OSD Failed
+-------------
+
+When a ``ceph-osd`` process dies, the monitor will learn about the failure
+from surviving ``ceph-osd`` daemons and report it via the ``ceph health``
+command::
+
+	ceph health
+	HEALTH_WARN 1/3 in osds are down
+
+Specifically, you will get a warning whenever there are ``ceph-osd``
+processes that are marked ``in`` and ``down``.  You can identify which
+``ceph-osds`` are ``down`` with::
+
+	ceph health detail
+	HEALTH_WARN 1/3 in osds are down
+	osd.0 is down since epoch 23, last address 192.168.106.220:6800/11080
+
+If there is a disk
+failure or other fault preventing ``ceph-osd`` from functioning or
+restarting, an error message should be present in its log file in
+``/var/log/ceph``.
+
+If the daemon stopped because of a heartbeat failure, the underlying
+kernel file system may be unresponsive. Check ``dmesg`` output for disk
+or other kernel errors.
+
+If the problem is a software error (failed assertion or other
+unexpected error), it should be reported to the `ceph-devel`_ email list.
+
+
+No Free Drive Space
+-------------------
+
+Ceph prevents you from writing to a full OSD so that you don't lose data.
+In an operational cluster, you should receive a warning when your cluster
+is getting near its full ratio. The ``mon osd full ratio`` defaults to
+``0.95``, or 95% of capacity before it stops clients from writing data.
+The ``mon osd nearfull ratio`` defaults to ``0.85``, or 85% of capacity
+when it generates a health warning.
+
+Full cluster issues usually arise when testing how Ceph handles an OSD
+failure on a small cluster. When one node has a high percentage of the
+cluster's data, the cluster can easily eclipse its nearfull and full ratio
+immediately. If you are testing how Ceph reacts to OSD failures on a small
+cluster, you should leave ample free disk space and consider temporarily
+lowering the ``mon osd full ratio`` and ``mon osd nearfull ratio``.
+
+Full ``ceph-osds`` will be reported by ``ceph health``::
+
+	ceph health
+	HEALTH_WARN 1 nearfull osds
+	osd.2 is near full at 85%
+
+Or::
+
+	ceph health
+	HEALTH_ERR 1 nearfull osds, 1 full osds
+	osd.2 is near full at 85%
+	osd.3 is full at 97%
+
+The best way to deal with a full cluster is to add new ``ceph-osds``, allowing
+the cluster to redistribute data to the newly available storage.
+
+If you cannot start an OSD because it is full, you may delete some data by deleting
+some placement group directories in the full OSD.
+
+.. important:: If you choose to delete a placement group directory on a full OSD,
+   **DO NOT** delete the same placement group directory on another full OSD, or
+   **YOU MAY LOSE DATA**. You **MUST** maintain at least one copy of your data on
+   at least one OSD.
+
+See `Monitor Config Reference`_ for additional details.
+
+
+OSDs are Slow/Unresponsive
+==========================
+
+A commonly recurring issue involves slow or unresponsive OSDs. Ensure that you
+have eliminated other troubleshooting possibilities before delving into OSD
+performance issues. For example, ensure that your network(s) is working properly
+and your OSDs are running. Check to see if OSDs are throttling recovery traffic.
+
+.. tip:: Newer versions of Ceph provide better recovery handling by preventing
+   recovering OSDs from using up system resources so that ``up`` and ``in``
+   OSDs aren't available or are otherwise slow.
+
+
+Networking Issues
+-----------------
+
+Ceph is a distributed storage system, so it  depends upon networks to peer with
+OSDs, replicate objects, recover from faults and check heartbeats. Networking
+issues can cause OSD latency and flapping OSDs. See `Flapping OSDs`_ for
+details.
+
+Ensure that Ceph processes and Ceph-dependent processes are connected and/or
+listening. ::
+
+	netstat -a | grep ceph
+	netstat -l | grep ceph
+	sudo netstat -p | grep ceph
+
+Check network statistics. ::
+
+	netstat -s
+
+
+Drive Configuration
+-------------------
+
+A storage drive should only support one OSD. Sequential read and sequential
+write throughput can bottleneck if other processes share the drive, including
+journals, operating systems, monitors, other OSDs and non-Ceph processes.
+
+Ceph acknowledges writes *after* journaling, so fast SSDs are an attractive
+option to accelerate the response time--particularly when using the ``XFS`` or
+``ext4`` filesystems. By contrast, the ``btrfs`` filesystem can write and journal
+simultaneously.
+
+.. note:: Partitioning a drive does not change its total throughput or
+   sequential read/write limits. Running a journal in a separate partition
+   may help, but you should prefer a separate physical drive.
+
+
+Bad Sectors / Fragmented Disk
+-----------------------------
+
+Check your disks for bad sectors and fragmentation. This can cause total throughput
+to drop substantially.
+
+
+Co-resident Monitors/OSDs
+-------------------------
+
+Monitors are generally light-weight processes, but they do lots of ``fsync()``,
+which can interfere with other workloads, particularly if monitors run on the
+same drive as your OSDs. Additionally, if you run monitors on the same host as
+the OSDs, you may incur performance issues related to:
+
+- Running an older kernel (pre-3.0)
+- Running Argonaut with an old ``glibc``
+- Running a kernel with no syncfs(2) syscall.
+
+In these cases, multiple OSDs running on the same host can drag each other down
+by doing lots of commits. That often leads to the bursty writes.
+
+
+Co-resident Processes
+---------------------
+
+Spinning up co-resident processes such as a cloud-based solution, virtual
+machines and other applications that write data to Ceph while operating on the
+same hardware as OSDs can introduce significant OSD latency. Generally, we
+recommend optimizing a host for use with Ceph and using other hosts for other
+processes. The practice of separating Ceph operations from other applications
+may help improve performance and may streamline troubleshooting and maintenance.
+
+
+Logging Levels
+--------------
+
+If you turned logging levels up to track an issue and then forgot to turn
+logging levels back down, the OSD may be putting a lot of logs onto the disk. If
+you intend to keep logging levels high, you may consider mounting a drive to the
+default path for logging (i.e., ``/var/log/ceph/$cluster-$name.log``).
+
+
+Recovery Throttling
+-------------------
+
+Depending upon your configuration, Ceph may reduce recovery rates to maintain
+performance or it may increase recovery rates to the point that recovery
+impacts OSD performance. Check to see if the OSD is recovering.
+
+
+Kernel Version
+--------------
+
+Check the kernel version you are running. Older kernels may not receive
+new backports that Ceph depends upon for better performance.
+
+
+Kernel Issues with SyncFS
+-------------------------
+
+Try running one OSD per host to see if performance improves. Old kernels
+might not have a recent enough version of ``glibc`` to support ``syncfs(2)``.
+
+
+Filesystem Issues
+-----------------
+
+Currently, we recommend deploying clusters with XFS. The btrfs
+filesystem has many attractive features, but bugs in the filesystem may
+lead to performance issues.  We do not recommend ext4 because xattr size
+limitations break our support for long object names (needed for RGW).
+
+For more information, see `Filesystem Recommendations`_.
+
+.. _Filesystem Recommendations: ../configuration/filesystem-recommendations
+
+
+Insufficient RAM
+----------------
+
+We recommend 1GB of RAM per OSD daemon. You may notice that during normal
+operations, the OSD only uses a fraction of that amount (e.g., 100-200MB).
+Unused RAM makes it tempting to use the excess RAM for co-resident applications,
+VMs and so forth. However, when OSDs go into recovery mode, their memory
+utilization spikes. If there is no RAM available, the OSD performance will slow
+considerably.
+
+
+Old Requests or Slow Requests
+-----------------------------
+
+If a ``ceph-osd`` daemon is slow to respond to a request, it will generate log messages
+complaining about requests that are taking too long.  The warning threshold
+defaults to 30 seconds, and is configurable via the ``osd op complaint time``
+option.  When this happens, the cluster log will receive messages.
+
+Legacy versions of Ceph complain about 'old requests`::
+
+	osd.0 192.168.106.220:6800/18813 312 : [WRN] old request osd_op(client.5099.0:790 fatty_26485_object789 [write 0~4096] 2.5e54f643) v4 received at 2012-03-06 15:42:56.054801 currently waiting for sub ops
+
+New versions of Ceph complain about 'slow requests`::
+
+	{date} {osd.num} [WRN] 1 slow requests, 1 included below; oldest blocked for > 30.005692 secs
+	{date} {osd.num}  [WRN] slow request 30.005692 seconds old, received at {date-time}: osd_op(client.4240.0:8 benchmark_data_ceph-1_39426_object7 [write 0~4194304] 0.69848840) v4 currently waiting for subops from [610]
+
+
+Possible causes include:
+
+- A bad drive (check ``dmesg`` output)
+- A bug in the kernel file system bug (check ``dmesg`` output)
+- An overloaded cluster (check system load, iostat, etc.)
+- A bug in the ``ceph-osd`` daemon.
+
+Possible solutions
+
+- Remove VMs Cloud Solutions from Ceph Hosts
+- Upgrade Kernel
+- Upgrade Ceph
+- Restart OSDs
+
+
+
+Flapping OSDs
+=============
+
+We recommend using both a public (front-end) network and a cluster (back-end)
+network so that you can better meet the capacity requirements of object
+replication. Another advantage is that you can run a cluster network such that
+it isn't connected to the internet, thereby preventing some denial of service
+attacks. When OSDs peer and check heartbeats, they use the cluster (back-end)
+network when it's available. See `Monitor/OSD Interaction`_ for details.
+
+However, if the cluster (back-end) network fails or develops significant latency
+while the public (front-end) network operates optimally, OSDs currently do not
+handle this situation well. What happens is that OSDs mark each other ``down``
+on the monitor, while marking themselves ``up``. We call this scenario
+'flapping`.
+
+If something is causing OSDs to 'flap' (repeatedly getting marked ``down`` and
+then ``up`` again), you can force the monitors to stop the flapping with::
+
+	ceph osd set noup      # prevent OSDs from getting marked up
+	ceph osd set nodown    # prevent OSDs from getting marked down
+
+These flags are recorded in the osdmap structure::
+
+	ceph osd dump | grep flags
+	flags no-up,no-down
+
+You can clear the flags with::
+
+	ceph osd unset noup
+	ceph osd unset nodown
+
+Two other flags are supported, ``noin`` and ``noout``, which prevent
+booting OSDs from being marked ``in`` (allocated data) or protect OSDs
+from eventually being marked ``out`` (regardless of what the current value for 
+``mon osd down out interval`` is).
+
+.. note:: ``noup``, ``noout``, and ``nodown`` are temporary in the
+   sense that once the flags are cleared, the action they were blocking
+   should occur shortly after.  The ``noin`` flag, on the other hand,
+   prevents OSDs from being marked ``in`` on boot, and any daemons that
+   started while the flag was set will remain that way.
+
+
+
+
+
+
+.. _iostat: http://en.wikipedia.org/wiki/Iostat
+.. _Ceph Logging and Debugging: ../../configuration/ceph-conf#ceph-logging-and-debugging
+.. _Logging and Debugging: ../log-and-debug
+.. _Debugging and Logging: ../debug
+.. _Monitor/OSD Interaction: ../../configuration/mon-osd-interaction
+.. _Monitor Config Reference: ../../configuration/mon-config-ref
+.. _monitoring your OSDs: ../../operations/monitoring-osd-pg
+.. _subscribe to the ceph-devel email list: mailto:majordomo at vger.kernel.org?body=subscribe+ceph-devel
+.. _unsubscribe from the ceph-devel email list: mailto:majordomo at vger.kernel.org?body=unsubscribe+ceph-devel
+.. _subscribe to the ceph-users email list: mailto:ceph-users-join at lists.ceph.com
+.. _unsubscribe from the ceph-users email list: mailto:ceph-users-leave at lists.ceph.com
+.. _Inktank: http://inktank.com
+.. _OS recommendations: ../../../install/os-recommendations
+.. _ceph-devel: ceph-devel at vger.kernel.org
diff --git a/doc/rados/troubleshooting/troubleshooting-pg.rst b/doc/rados/troubleshooting/troubleshooting-pg.rst
new file mode 100644
index 0000000..0ec2be5
--- /dev/null
+++ b/doc/rados/troubleshooting/troubleshooting-pg.rst
@@ -0,0 +1,565 @@
+=====================
+ Troubleshooting PGs
+=====================
+
+Placement Groups Never Get Clean
+================================
+
+When you create a cluster and your cluster remains in ``active``, 
+``active+remapped`` or ``active+degraded`` status and never achieve an 
+``active+clean`` status, you likely have a problem with your configuration.
+
+You may need to review settings in the `Pool, PG and CRUSH Config Reference`_
+and make appropriate adjustments.
+
+As a general rule, you should run your cluster with more than one OSD and a
+pool size greater than 1 object replica.
+
+One Node Cluster
+----------------
+
+Ceph no longer provides documentation for operating on a single node, because
+you would never deploy a system designed for distributed computing on a single
+node. Additionally, mounting client kernel modules on a single node containing a
+Ceph  daemon may cause a deadlock due to issues with the Linux kernel itself
+(unless you use VMs for the clients). You can experiment with Ceph in a 1-node
+configuration, in spite of the limitations as described herein.
+
+If you are trying to create a cluster on a single node, you must change the
+default of the ``osd crush chooseleaf type`` setting from ``1`` (meaning 
+``host`` or ``node``) to ``0`` (meaning ``osd``) in your Ceph configuration
+file before you create your monitors and OSDs. This tells Ceph that an OSD
+can peer with another OSD on the same host. If you are trying to set up a
+1-node cluster and ``osd crush chooseleaf type`` is greater than ``0``, 
+Ceph will try to peer the PGs of one OSD with the PGs of another OSD on 
+another node, chassis, rack, row, or even datacenter depending on the setting.
+
+.. tip:: DO NOT mount kernel clients directly on the same node as your 
+   Ceph Storage Cluster, because kernel conflicts can arise. However, you 
+   can mount kernel clients within virtual machines (VMs) on a single node.
+
+If you are creating OSDs using a single disk, you must create directories
+for the data manually first. For example:: 
+
+	mkdir /var/local/osd0 /var/local/osd1
+	ceph-deploy osd prepare {localhost-name}:/var/local/osd0 {localhost-name}:/var/local/osd1
+	ceph-deploy osd activate {localhost-name}:/var/local/osd0 {localhost-name}:/var/local/osd1
+
+
+Fewer OSDs than Replicas
+------------------------
+
+If you've brought up two OSDs to an ``up`` and ``in`` state, but you still 
+don't see ``active + clean`` placement groups, you may have an 
+``osd pool default size`` set to greater than ``2``.
+
+There are a few ways to address this situation. If you want to operate your
+cluster in an ``active + degraded`` state with two replicas, you can set the 
+``osd pool default min size`` to ``2`` so that you can write objects in 
+an ``active + degraded`` state. You may also set the ``osd pool default size``
+setting to ``2`` so that you only have two stored replicas (the original and 
+one replica), in which case the cluster should achieve an ``active + clean`` 
+state.
+
+.. note:: You can make the changes at runtime. If you make the changes in 
+   your Ceph configuration file, you may need to restart your cluster.
+
+
+Pool Size = 1
+-------------
+
+If you have the ``osd pool default size`` set to ``1``, you will only have 
+one copy of the object. OSDs rely on other OSDs to tell them which objects 
+they should have. If a first OSD has a copy of an object and there is no
+second copy, then no second OSD can tell the first OSD that it should have
+that copy. For each placement group mapped to the first OSD (see 
+``ceph pg dump``), you can force the first OSD to notice the placement groups
+it needs by running::
+   
+   	ceph pg force_create_pg <pgid>
+   	
+
+CRUSH Map Errors
+----------------
+
+Another candidate for placement groups remaining unclean involves errors 
+in your CRUSH map.
+
+
+Stuck Placement Groups
+======================
+
+It is normal for placement groups to enter states like "degraded" or "peering"
+following a failure.  Normally these states indicate the normal progression
+through the failure recovery process. However, if a placement group stays in one
+of these states for a long time this may be an indication of a larger problem.
+For this reason, the monitor will warn when placement groups get "stuck" in a
+non-optimal state.  Specifically, we check for:
+
+* ``inactive`` - The placement group has not been ``active`` for too long 
+  (i.e., it hasn't been able to service read/write requests).
+  
+* ``unclean`` - The placement group has not been ``clean`` for too long 
+  (i.e., it hasn't been able to completely recover from a previous failure).
+
+* ``stale`` - The placement group status has not been updated by a ``ceph-osd``,
+  indicating that all nodes storing this placement group may be ``down``.
+
+You can explicitly list stuck placement groups with one of::
+
+	ceph pg dump_stuck stale
+	ceph pg dump_stuck inactive
+	ceph pg dump_stuck unclean
+
+For stuck ``stale`` placement groups, it is normally a matter of getting the
+right ``ceph-osd`` daemons running again.  For stuck ``inactive`` placement
+groups, it is usually a peering problem (see :ref:`failures-osd-peering`).  For
+stuck ``unclean`` placement groups, there is usually something preventing
+recovery from completing, like unfound objects (see
+:ref:`failures-osd-unfound`);
+
+
+
+.. _failures-osd-peering:
+
+Placement Group Down - Peering Failure
+======================================
+
+In certain cases, the ``ceph-osd`` `Peering` process can run into
+problems, preventing a PG from becoming active and usable.  For
+example, ``ceph health`` might report::
+
+	ceph health detail
+	HEALTH_ERR 7 pgs degraded; 12 pgs down; 12 pgs peering; 1 pgs recovering; 6 pgs stuck unclean; 114/3300 degraded (3.455%); 1/3 in osds are down
+	...
+	pg 0.5 is down+peering
+	pg 1.4 is down+peering
+	...
+	osd.1 is down since epoch 69, last address 192.168.106.220:6801/8651
+
+We can query the cluster to determine exactly why the PG is marked ``down`` with::
+
+	ceph pg 0.5 query
+
+.. code-block:: javascript
+
+ { "state": "down+peering",
+   ...
+   "recovery_state": [
+        { "name": "Started\/Primary\/Peering\/GetInfo",
+          "enter_time": "2012-03-06 14:40:16.169679",
+          "requested_info_from": []},
+        { "name": "Started\/Primary\/Peering",
+          "enter_time": "2012-03-06 14:40:16.169659",
+          "probing_osds": [
+                0,
+                1],
+          "blocked": "peering is blocked due to down osds",
+          "down_osds_we_would_probe": [
+                1],
+          "peering_blocked_by": [
+                { "osd": 1,
+                  "current_lost_at": 0,
+                  "comment": "starting or marking this osd lost may let us proceed"}]},
+        { "name": "Started",
+          "enter_time": "2012-03-06 14:40:16.169513"}
+    ]
+ }
+
+The ``recovery_state`` section tells us that peering is blocked due to
+down ``ceph-osd`` daemons, specifically ``osd.1``.  In this case, we can start that ``ceph-osd``
+and things will recover.
+
+Alternatively, if there is a catastrophic failure of ``osd.1`` (e.g., disk
+failure), we can tell the cluster that it is ``lost`` and to cope as
+best it can. 
+
+.. important:: This is dangerous in that the cluster cannot
+   guarantee that the other copies of the data are consistent 
+   and up to date.  
+
+To instruct Ceph to continue anyway::
+
+	ceph osd lost 1
+
+Recovery will proceed.
+
+
+.. _failures-osd-unfound:
+
+Unfound Objects
+===============
+
+Under certain combinations of failures Ceph may complain about
+``unfound`` objects::
+
+	ceph health detail
+	HEALTH_WARN 1 pgs degraded; 78/3778 unfound (2.065%)
+	pg 2.4 is active+degraded, 78 unfound
+
+This means that the storage cluster knows that some objects (or newer
+copies of existing objects) exist, but it hasn't found copies of them.
+One example of how this might come about for a PG whose data is on ceph-osds
+1 and 2:
+
+* 1 goes down
+* 2 handles some writes, alone
+* 1 comes up
+* 1 and 2 repeer, and the objects missing on 1 are queued for recovery.
+* Before the new objects are copied, 2 goes down.
+
+Now 1 knows that these object exist, but there is no live ``ceph-osd`` who
+has a copy.  In this case, IO to those objects will block, and the
+cluster will hope that the failed node comes back soon; this is
+assumed to be preferable to returning an IO error to the user.
+
+First, you can identify which objects are unfound with::
+
+	ceph pg 2.4 list_missing [starting offset, in json]
+
+.. code-block:: javascript
+
+ { "offset": { "oid": "",
+      "key": "",
+      "snapid": 0,
+      "hash": 0,
+      "max": 0},
+  "num_missing": 0,
+  "num_unfound": 0,
+  "objects": [
+     { "oid": "object 1",
+       "key": "",
+       "hash": 0,
+       "max": 0 },
+     ...
+  ],
+  "more": 0}
+
+If there are too many objects to list in a single result, the ``more``
+field will be true and you can query for more.  (Eventually the
+command line tool will hide this from you, but not yet.)
+
+Second, you can identify which OSDs have been probed or might contain
+data::
+
+	ceph pg 2.4 query
+
+.. code-block:: javascript
+
+   "recovery_state": [
+        { "name": "Started\/Primary\/Active",
+          "enter_time": "2012-03-06 15:15:46.713212",
+          "might_have_unfound": [
+                { "osd": 1,
+                  "status": "osd is down"}]},
+
+In this case, for example, the cluster knows that ``osd.1`` might have
+data, but it is ``down``.  The full range of possible states include:
+
+* already probed
+* querying
+* OSD is down
+* not queried (yet)
+
+Sometimes it simply takes some time for the cluster to query possible
+locations.  
+
+It is possible that there are other locations where the object can
+exist that are not listed.  For example, if a ceph-osd is stopped and
+taken out of the cluster, the cluster fully recovers, and due to some
+future set of failures ends up with an unfound object, it won't
+consider the long-departed ceph-osd as a potential location to
+consider.  (This scenario, however, is unlikely.)
+
+If all possible locations have been queried and objects are still
+lost, you may have to give up on the lost objects. This, again, is
+possible given unusual combinations of failures that allow the cluster
+to learn about writes that were performed before the writes themselves
+are recovered.  To mark the "unfound" objects as "lost"::
+
+	ceph pg 2.5 mark_unfound_lost revert|delete
+
+This the final argument specifies how the cluster should deal with
+lost objects.  
+
+The "delete" option will forget about them entirely.
+
+The "revert" option (not available for erasure coded pools) will
+either roll back to a previous version of the object or (if it was a
+new object) forget about it entirely.  Use this with caution, as it
+may confuse applications that expected the object to exist.
+
+
+Homeless Placement Groups
+=========================
+
+It is possible for all OSDs that had copies of a given placement groups to fail.
+If that's the case, that subset of the object store is unavailable, and the
+monitor will receive no status updates for those placement groups.  To detect
+this situation, the monitor marks any placement group whose primary OSD has
+failed as ``stale``.  For example::
+
+	ceph health
+	HEALTH_WARN 24 pgs stale; 3/300 in osds are down
+
+You can identify which placement groups are ``stale``, and what the last OSDs to
+store them were, with::
+
+	ceph health detail
+	HEALTH_WARN 24 pgs stale; 3/300 in osds are down
+	...
+	pg 2.5 is stuck stale+active+remapped, last acting [2,0]
+	...
+	osd.10 is down since epoch 23, last address 192.168.106.220:6800/11080
+	osd.11 is down since epoch 13, last address 192.168.106.220:6803/11539
+	osd.12 is down since epoch 24, last address 192.168.106.220:6806/11861
+
+If we want to get placement group 2.5 back online, for example, this tells us that
+it was last managed by ``osd.0`` and ``osd.2``.  Restarting those ``ceph-osd``
+daemons will allow the cluster to recover that placement group (and, presumably,
+many others).
+
+
+Only a Few OSDs Receive Data
+============================
+
+If you have many nodes in your cluster and only a few of them receive data,
+`check`_ the number of placement groups in your pool. Since placement groups get
+mapped to OSDs, a small number of placement groups will not distribute across
+your cluster. Try creating a pool with a placement group count that is a
+multiple of the number of OSDs. See `Placement Groups`_ for details. The default
+placement group count for pools isn't useful, but you can change it `here`_.
+
+
+Can't Write Data
+================
+
+If your cluster is up, but some OSDs are down and you cannot write data, 
+check to ensure that you have the minimum number of OSDs running for the
+placement group. If you don't have the minimum number of OSDs running, 
+Ceph will not allow you to write data because there is no guarantee
+that Ceph can replicate your data. See ``osd pool default min size``
+in the `Pool, PG and CRUSH Config Reference`_ for details.
+
+
+PGs Inconsistent
+================
+
+If you receive an ``active + clean + inconsistent`` state, this may happen
+due to an error during scrubbing. If the inconsistency is due to disk errors,
+check your disks.
+
+You can repair the inconsistent placement group by executing:: 
+
+	ceph pg repair {placement-group-ID}
+
+If you receive ``active + clean + inconsistent`` states periodically due to 
+clock skew, you may consider configuring your `NTP`_ daemons on your 
+monitor hosts to act as peers. See `The Network Time Protocol`_ and Ceph 
+`Clock Settings`_ for additional details.
+
+
+Erasure Coded PGs are not active+clean
+======================================
+
+When CRUSH fails to find enough OSDs to map to a PG, it will show as a
+``2147483647`` which is ITEM_NONE or ``no OSD found``. For instance::
+
+     [2,1,6,0,5,8,2147483647,7,4]
+
+Not enough OSDs
+---------------
+
+If the Ceph cluster only has 8 OSDs and the erasure coded pool needs
+9, that is what it will show. You can either create another erasure
+coded pool that requires less OSDs::
+
+     ceph osd erasure-code-profile set myprofile k=5 m=3
+     ceph osd pool create erasurepool 16 16 erasure myprofile
+
+or add a new OSDs and the PG will automatically use them.
+
+CRUSH constraints cannot be satisfied
+-------------------------------------
+
+If the cluster has enough OSDs, it is possible that the CRUSH ruleset
+imposes constraints that cannot be satisfied. If there are 10 OSDs on
+two hosts and the CRUSH rulesets require that no two OSDs from the
+same host are used in the same PG, the mapping may fail because only
+two OSD will be found. You can check the constraint by displaying the
+ruleset::
+
+    $ ceph osd crush rule ls
+    [
+        "replicated_ruleset",
+        "erasurepool"]
+    $ ceph osd crush rule dump erasurepool
+    { "rule_id": 1,
+      "rule_name": "erasurepool",
+      "ruleset": 1,
+      "type": 3,
+      "min_size": 3,
+      "max_size": 20,
+      "steps": [
+            { "op": "take",
+              "item": -1,
+              "item_name": "default"},
+            { "op": "chooseleaf_indep",
+              "num": 0,
+              "type": "host"},
+            { "op": "emit"}]}
+
+
+You can resolve the problem by creating a new pool in which PGs are allowed
+to have OSDs residing on the same host with::
+
+     ceph osd erasure-code-profile set myprofile ruleset-failure-domain=osd
+     ceph osd pool create erasurepool 16 16 erasure myprofile
+
+CRUSH gives up too soon
+-----------------------
+
+If the Ceph cluster has just enough OSDs to map the PG (for instance a
+cluster with a total of 9 OSDs and an erasure coded pool that requires
+9 OSDs per PG), it is possible that CRUSH gives up before finding a
+mapping. It can be resolved by:
+
+* lowering the erasure coded pool requirements to use less OSDs per PG
+  (that requires the creation of another pool as erasure code profiles
+  cannot be dynamically modified).
+
+* adding more OSDs to the cluster (that does not require the erasure
+  coded pool to be modified, it will become clean automatically)
+
+* use a hand made CRUSH ruleset that tries more times to find a good
+  mapping. It can be done by setting ``set_choose_tries`` to a value
+  greater than the default.
+
+You should first verify the problem with ``crushtool`` after
+extracting the crushmap from the cluster so your experiments do not
+modify the Ceph cluster and only work on a local files::
+
+    $ ceph osd crush rule dump erasurepool
+    { "rule_name": "erasurepool",
+      "ruleset": 1,
+      "type": 3,
+      "min_size": 3,
+      "max_size": 20,
+      "steps": [
+            { "op": "take",
+              "item": -1,
+              "item_name": "default"},
+            { "op": "chooseleaf_indep",
+              "num": 0,
+              "type": "host"},
+            { "op": "emit"}]}
+    $ ceph osd getcrushmap > crush.map
+    got crush map from osdmap epoch 13
+    $ crushtool -i crush.map --test --show-bad-mappings \
+       --rule 1 \
+       --num-rep 9 \
+       --min-x 1 --max-x $((1024 * 1024))
+    bad mapping rule 8 x 43 num_rep 9 result [3,2,7,1,2147483647,8,5,6,0]
+    bad mapping rule 8 x 79 num_rep 9 result [6,0,2,1,4,7,2147483647,5,8]
+    bad mapping rule 8 x 173 num_rep 9 result [0,4,6,8,2,1,3,7,2147483647]
+
+Where ``--num-rep`` is the number of OSDs the erasure code crush
+ruleset needs, ``--rule`` is the value of the ``ruleset`` field
+displayed by ``ceph osd crush rule dump``.  The test will try mapping
+one million values (i.e. the range defined by ``[--min-x,--max-x]``)
+and must display at least one bad mapping. If it outputs nothing it
+means all mappings are successfull and you can stop right there: the
+problem is elsewhere.
+
+The crush ruleset can be edited by decompiling the crush map::
+
+    $ crushtool --decompile crush.map > crush.txt
+
+and adding the following line to the ruleset::
+
+    step set_choose_tries 100
+
+The relevant part of of the ``crush.txt`` file should look something
+like::
+
+     rule erasurepool {
+             ruleset 1
+             type erasure
+             min_size 3
+             max_size 20
+             step set_chooseleaf_tries 5
+             step set_choose_tries 100
+             step take default
+             step chooseleaf indep 0 type host
+             step emit
+     }
+
+It can then be compiled and tested again::
+
+    $ crushtool --compile crush.txt -o better-crush.map
+
+When all mappings succeed, an histogram of the number of tries that
+were necessary to find all of them can be displayed with the
+``--show-choose-tries`` option of ``crushtool``::
+
+    $ crushtool -i better-crush.map --test --show-bad-mappings \
+       --show-choose-tries \
+       --rule 1 \
+       --num-rep 9 \
+       --min-x 1 --max-x $((1024 * 1024))
+    ...
+    11:        42
+    12:        44
+    13:        54
+    14:        45
+    15:        35
+    16:        34
+    17:        30
+    18:        25
+    19:        19
+    20:        22
+    21:        20
+    22:        17
+    23:        13
+    24:        16
+    25:        13
+    26:        11
+    27:        11
+    28:        13
+    29:        11
+    30:        10
+    31:         6
+    32:         5
+    33:        10
+    34:         3
+    35:         7
+    36:         5
+    37:         2
+    38:         5
+    39:         5
+    40:         2
+    41:         5
+    42:         4
+    43:         1
+    44:         2
+    45:         2
+    46:         3
+    47:         1
+    48:         0
+    ...
+    102:         0
+    103:         1
+    104:         0
+    ...
+
+It took 11 tries to map 42 PGs, 12 tries to map 44 PGs etc. The highest number of tries is the minimum value of ``set_choose_tries`` that prevents bad mappings (i.e. 103 in the above output because it did not take more than 103 tries for any PG to be mapped).
+
+.. _check: ../../operations/placement-groups#get-the-number-of-placement-groups
+.. _here: ../../configuration/pool-pg-config-ref
+.. _Placement Groups: ../../operations/placement-groups
+.. _Pool, PG and CRUSH Config Reference: ../../configuration/pool-pg-config-ref
+.. _NTP: http://en.wikipedia.org/wiki/Network_Time_Protocol
+.. _The Network Time Protocol: http://www.ntp.org/
+.. _Clock Settings: ../../configuration/mon-config-ref/#clock
+
+
diff --git a/doc/radosgw/admin.rst b/doc/radosgw/admin.rst
new file mode 100644
index 0000000..5e81a7e
--- /dev/null
+++ b/doc/radosgw/admin.rst
@@ -0,0 +1,480 @@
+=============
+ Admin Guide
+=============
+
+Once you have your Ceph Object Storage service up and running, you may
+administer the service with user management, access controls, quotas 
+and usage tracking among other features.
+
+
+User Management
+===============
+
+Ceph Object Storage user management refers to users of the Ceph Object Storage
+service (i.e., not the Ceph Object Gateway as a user of the Ceph Storage
+Cluster). You must create a user, access key and secret to enable end users to
+interact with Ceph Object Gateway services.
+
+There are two user types: 
+
+- **User:** The term 'user' reflects a user of the S3 interface.
+
+- **Subuser:** The term 'subuser' reflects a user of the Swift interface. A subuser
+  is associated to a user .
+  
+.. ditaa:: +---------+
+           |   User  |
+           +----+----+  
+                |     
+                |     +-----------+
+                +-----+  Subuser  |
+                      +-----------+
+
+You can create, modify, view, suspend and remove users and subusers. In addition
+to user and subuser IDs, you may add a display name and an email address for a
+user.  You can specify a key and secret, or generate a key and secret
+automatically. When generating or specifying keys, note that user IDs correspond
+to an S3 key type and subuser IDs correspond to a swift key type. Swift keys
+also have access levels of ``read``, ``write``, ``readwrite`` and ``full``.
+
+
+Create a User
+-------------
+
+To create a user (S3 interface), execute the following::
+
+	radosgw-admin user create --uid={username} --display-name="{display-name}" [--email={email}]
+
+For example:: 	
+	
+  radosgw-admin user create --uid=johndoe --display-name="John Doe" --email=john at example.com
+  
+.. code-block:: javascript
+  
+  { "user_id": "johndoe",
+    "display_name": "John Doe",
+    "email": "john at example.com",
+    "suspended": 0,
+    "max_buckets": 1000,
+    "auid": 0,
+    "subusers": [],
+    "keys": [
+          { "user": "johndoe",
+            "access_key": "11BS02LGFB6AL6H1ADMW",
+            "secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
+    "swift_keys": [],
+    "caps": [],
+    "op_mask": "read, write, delete",
+    "default_placement": "",
+    "placement_tags": [],
+    "bucket_quota": { "enabled": false,
+        "max_size_kb": -1,
+        "max_objects": -1},
+    "user_quota": { "enabled": false,
+        "max_size_kb": -1,
+        "max_objects": -1},
+    "temp_url_keys": []}
+
+Creating a user also creates an ``access_key`` and ``secret_key`` entry for use
+with any S3 API-compatible client.  
+
+.. important:: Check the key output. Sometimes ``radosgw-admin``
+   generates a JSON escape (``\``) character, and some clients
+   do not know how to handle JSON escape characters. Remedies include 
+   removing the JSON escape character (``\``), encapsulating the string
+   in quotes, regenerating the key and ensuring that it 
+   does not have a JSON escape character or specify the key and secret 
+   manually.
+
+
+Create a Subuser
+----------------
+
+To create a subuser (Swift interface) for the user, you must specify the user ID
+(``--uid={username}``), a subuser ID and the access level for the subuser. ::
+
+  radosgw-admin subuser create --uid={uid} --subuser={uid} --access=[ read | write | readwrite | full ]
+
+For example::
+
+  radosgw-admin subuser create --uid=johndoe --subuser=johndoe:swift --access=full
+
+
+.. note:: ``full`` is not ``readwrite``, as it also includes the access control policy.
+
+.. code-block:: javascript
+
+  { "user_id": "johndoe",
+    "display_name": "John Doe",
+    "email": "john at example.com",
+    "suspended": 0,
+    "max_buckets": 1000,
+    "auid": 0,
+    "subusers": [
+          { "id": "johndoe:swift",
+            "permissions": "full-control"}],
+    "keys": [
+          { "user": "johndoe",
+            "access_key": "11BS02LGFB6AL6H1ADMW",
+            "secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
+    "swift_keys": [],
+    "caps": [],
+    "op_mask": "read, write, delete",
+    "default_placement": "",
+    "placement_tags": [],
+    "bucket_quota": { "enabled": false,
+        "max_size_kb": -1,
+        "max_objects": -1},
+    "user_quota": { "enabled": false,
+        "max_size_kb": -1,
+        "max_objects": -1},
+    "temp_url_keys": []}
+
+
+Get User Info
+-------------
+
+To get information about a user, you must specify ``user info`` and the user ID
+(``--uid={username}``) . :: 
+
+	radosgw-admin user info --uid=johndoe
+
+
+
+Modify User Info
+----------------
+
+To modify information about a user, you must specify the user ID (``--uid={username}``)
+and the attributes you want to modify. Typical modifications are to keys and secrets,
+email addresses, display names and access levels. For example:: 
+
+	radosgw-admin user modify --uid=johndoe --display-name="John E. Doe"
+
+To modify subuser values, specify ``subuser modify`` and the subuser ID. For example::
+
+	radosgw-admin subuser modify --uid=johndoe:swift --access=full
+
+
+User Enable/Suspend
+-------------------
+
+When you create a user, the user is enabled by default. However, you may suspend
+user  privileges and re-enable them at a later time. To suspend a user, specify
+``user suspend`` and the user ID. ::
+
+	radosgw-admin user suspend --uid=johndoe
+
+To re-enable a suspended user, specify ``user enable`` and the user ID. :: 
+
+	radosgw-admin user enable --uid=johndoe
+	
+.. note:: Disabling the user disables the subuser.
+
+
+Remove a User
+-------------
+
+When you remove a user, the user and subuser are removed from the system.
+However, you may remove just the subuser if you wish. To remove a user (and
+subuser), specify ``user rm`` and the user ID. ::
+
+	radosgw-admin user rm --uid=johndoe
+
+To remove the subuser only, specify ``subuser rm`` and the subuser ID. ::
+
+	radosgw-admin subuser rm --subuser=johndoe:swift
+
+
+Options include:
+
+- **Purge Data:** The ``--purge-data`` option purges all data associated 
+  to the UID.
+  
+- **Purge Keys:** The ``--purge-keys`` option purges all keys associated 
+  to the UID.
+
+
+Remove a Subuser
+----------------
+
+When you remove a sub user, you are removing access to the Swift interface. 
+The user will remain in the system. To remove the subuser, specify 
+``subuser rm`` and the subuser ID. ::
+
+	radosgw-admin subuser rm --subuser=johndoe:swift
+
+
+
+Options include:
+  
+- **Purge Keys:** The ``--purge-keys`` option purges all keys associated 
+  to the UID.
+
+
+Create a Key
+------------
+
+To create a key for a user, you must specify ``key create``. For a user, specify
+the user ID and the ``s3`` key type. To create a key for subuser, you must
+specify the subuser ID and the ``swift`` keytype. For example::
+
+	radosgw-admin key create --subuser=johndoe:swift --key-type=swift --gen-secret
+
+.. code-block:: javascript
+
+  { "user_id": "johndoe",
+    "rados_uid": 0,
+    "display_name": "John Doe",
+    "email": "john at example.com",
+    "suspended": 0,
+    "subusers": [
+       { "id": "johndoe:swift",
+         "permissions": "full-control"}],
+    "keys": [
+      { "user": "johndoe",
+        "access_key": "QFAMEDSJP5DEKJO0DDXY",
+        "secret_key": "iaSFLDVvDdQt6lkNzHyW4fPLZugBAI1g17LO0+87"}],
+    "swift_keys": [
+      { "user": "johndoe:swift",
+        "secret_key": "E9T2rUZNu2gxUjcwUBO8n\/Ev4KX6\/GprEuH4qhu1"}]}
+
+
+
+Add / Remove Access Keys
+------------------------
+
+Users and subusers must have access keys to use the S3 and Swift
+interfaces. When you create a user or subuser and you do not specify 
+an access key and secret, the key and secret get generated automatically. 
+You may create a key and either specify or generate the access key and/or
+secret. You may also remove an access key and secret. Options include:
+
+
+- ``--secret=<key>`` specifies a secret key (e.g,. manually generated).
+- ``--gen-access-key`` generates random access key (for S3 user by default).
+- ``--gen-secret`` generates a random secret key.
+- ``--key-type=<type>`` specifies a key type. The options are: swift, s3
+
+
+To add a key, specify the user. ::
+
+	radosgw-admin key create --uid=johndoe --key-type=s3 --gen-access-key --gen-secret
+
+You may also specify a key and a secret.
+
+To remove an access key, specify the user. :: 
+
+	radosgw-admin key rm --uid=johndoe
+
+
+
+Add / Remove Admin Capabilities
+-------------------------------
+
+The Ceph Storage Cluster provides an administrative API that enables  users to
+execute administrative functions via the REST API. By default, users do NOT have
+access to this API. To enable a user to exercise  administrative functionality,
+provide the user with administrative capabilities.
+
+To add administrative capabilities to a user, execute the following:: 
+
+	radosgw-admin caps add --uid={uid} --caps={caps}
+
+
+You can add read, write or all capabilities to users, buckets, metadata and 
+usage (utilization). For example::
+
+	--caps="[users|buckets|metadata|usage|zone]=[*|read|write|read, write]"
+
+For example::
+
+	radosgw-admin caps add --uid=johndoe --caps="users=*"
+
+
+To remove administrative capabilities from a user, execute the following:: 
+
+	radosgw-admin caps rm --uid=johndoe --caps={caps}
+
+
+Quota Management
+================
+
+The Ceph Object Gateway enables you to set quotas on users and buckets owned by
+users. Quotas include the maximum number of objects in a bucket and the maximum
+storage size in megabytes.
+
+- **Bucket:** The ``--bucket`` option allows you to specify a quota for
+  buckets the user owns.
+
+- **Maximum Objects:** The ``--max-objects`` setting allows you to specify
+  the maximum number of objects. A negative value disables this setting.
+  
+- **Maximum Size:** The ``--max-size`` option allows you to specify a quota
+  size in B/K/M/G/T. A negative value disables this setting.
+  
+- **Quota Scope:** The ``--quota-scope`` option sets the scope for the quota.
+  The options are ``bucket`` and ``user``. Bucket quotas apply to buckets a 
+  user owns. User quotas apply to a user.
+
+
+Set User Quota
+--------------
+
+Before you enable a quota, you must first set the quota parameters.
+For example:: 
+
+	radosgw-admin quota set --quota-scope=user --uid=<uid> [--max-objects=<num objects>] [--max-size=<max size>]
+
+For example:: 
+
+	radosgw-admin quota set --quota-scope=user --uid=johndoe --max-objects=1024 --max-size=1024B
+
+
+A negative value for num objects and / or max size means that the
+specific quota attribute check is disabled.
+
+
+Enable/Disable User Quota
+-------------------------
+
+Once you set a user quota, you may enable it. For example:: 
+
+	radosgw-admin quota enable --quota-scope=user --uid=<uid>
+
+You may disable an enabled user quota. For example:: 
+
+	radosgw-admin quota disable --quota-scope=user --uid=<uid>
+
+
+Set Bucket Quota
+----------------
+
+Bucket quotas apply to the buckets owned by the specified ``uid``. They are
+independent of the user. ::
+
+	radosgw-admin quota set --uid=<uid> --quota-scope=bucket [--max-objects=<num objects>] [--max-size=<max size]
+
+A negative value for num objects and / or max size means that the
+specific quota attribute check is disabled.
+
+
+Enable/Disable Bucket Quota
+---------------------------
+
+Once you set a bucket quota, you may enable it. For example:: 
+
+	radosgw-admin quota enable --quota-scope=bucket --uid=<uid>
+
+You may disable an enabled bucket quota. For example:: 
+
+	radosgw-admin quota disable --quota-scope=bucket --uid=<uid>
+
+
+Get Quota Settings
+------------------
+
+You may access each user's quota settings via the user information
+API. To read user quota setting information with the CLI interface, 
+execute the following::
+
+	radosgw-admin user info --uid=<uid>
+
+
+Update Quota Stats
+------------------
+
+Quota stats get updated asynchronously. You can update quota
+statistics for all users and all buckets manually to retrieve
+the latest quota stats. ::
+
+	radosgw-admin user stats --uid=<uid> --sync-stats
+
+
+Get User Usage Stats
+--------------------
+
+To see how much of the quota a user has consumed, execute the following::
+
+	radosgw-admin user stats --uid=<uid>
+
+.. note:: You should execute ``radosgw-admin user stats`` with the 
+   ``--sync-stats`` option to receive the latest data.
+
+Default Quotas
+--------------
+
+You can set default quotas in the config.  These defaults are used when
+creating a new user and have no effect on existing users. If the
+relevant default quota is set in config, then that quota is set on the
+new user, and that quota is enabled.  See ``rgw bucket default quota max objects``,
+``rgw bucket default quota max size``, ``rgw user default quota max objects``, and
+``rgw user default quota max size`` in `Ceph Object Gateway Config Reference`_
+
+Reading / Writing Global Quotas
+-------------------------------
+
+You can read and write quota settings in a region map. To get a
+region map, execute the following. :: 
+
+	radosgw-admin regionmap get > regionmap.json
+
+To set quota settings for the entire region, simply modify the 
+quota settings in the region map. Then, use ``region set`` to 
+update the region map. ::
+
+	radosgw-admin region set < regionmap.json
+
+.. note:: After updating the region map, you must restart the gateway.
+
+
+Usage
+=====
+
+The Ceph Object Gateway logs usage for each user. You can track
+user usage within date ranges too.
+
+Options include: 
+
+- **Start Date:** The ``--start-date`` option allows you to filter usage
+  stats from a particular start date (**format:** ``yyyy-mm-dd[HH:MM:SS]``).
+
+- **End Date:** The ``--end-date`` option allows you to filter usage up
+  to a particular date (**format:** ``yyyy-mm-dd[HH:MM:SS]``). 
+  
+- **Log Entries:** The ``--show-log-entries`` option allows you to specify
+  whether or not to include log entries with the usage stats 
+  (options: ``true`` | ``false``).
+
+.. note:: You may specify time with minutes and seconds, but it is stored 
+   with 1 hour resolution.
+
+
+Show Usage
+----------
+
+To show usage statistics, specify the ``usage show``. To show usage for a
+particular user, you must specify a user ID. You may also specify a start date,
+end date, and whether or not to show log entries.::
+
+	radosgw-admin usage show --uid=johndoe --start-date=2012-03-01 --end-date=2012-04-01
+
+You may also show a summary of usage information for all users by omitting a user ID. ::
+
+	radosgw-admin usage show --show-log-entries=false
+
+
+Trim Usage
+----------
+
+With heavy use, usage logs can begin to take up storage space. You can trim
+usage logs for all users and for specific users. You may also specify date
+ranges for trim operations. ::
+
+	radosgw-admin usage trim --start-date=2010-01-01 --end-date=2010-12-31
+	radosgw-admin usage trim --uid=johndoe	
+	radosgw-admin usage trim --uid=johndoe --end-date=2013-12-31
+
+
+.. _radosgw-admin: ../../man/8/radosgw-admin/
+.. _Pool Configuration: ../../rados/configuration/pool-pg-config-ref/
+.. _Ceph Object Gateway Config Reference: ../config-ref/
diff --git a/doc/radosgw/adminops.rst b/doc/radosgw/adminops.rst
new file mode 100644
index 0000000..1fa6f50
--- /dev/null
+++ b/doc/radosgw/adminops.rst
@@ -0,0 +1,1918 @@
+==================
+ Admin Operations
+==================
+
+An admin API request will be done on a URI that starts with the configurable 'admin'
+resource entry point. Authorization for the admin API duplicates the S3 authorization
+mechanism. Some operations require that the user holds special administrative capabilities.
+The response entity type (XML or JSON) may be specified as the 'format' option in the
+request and defaults to JSON if not specified.
+
+Get Usage
+=========
+
+Request bandwidth usage information.
+
+:caps: usage=read
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/usage?format=json HTTP/1.1
+	Host: {fqdn}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user for which the information is requested. If not specified will apply to all users.
+:Type: String
+:Example: ``foo_user``
+:Required: No
+
+``start``
+
+:Description: Date and (optional) time that specifies the start time of the requested data.
+:Type: String
+:Example: ``2012-09-25 16:00:00``
+:Required: No
+
+``end``
+
+:Description: Date and (optional) time that specifies the end time of the requested data (non-inclusive).
+:Type: String
+:Example: ``2012-09-25 16:00:00``
+:Required: No
+
+
+``show-entries``
+
+:Description: Specifies whether data entries should be returned.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+
+``show-summary``
+
+:Description: Specifies whether data summary should be returned.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the requested information.
+
+``usage``
+
+:Description: A container for the usage information.
+:Type: Container
+
+``entries``
+
+:Description: A container for the usage entries information.
+:Type: Container
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``owner``
+
+:Description: The name of the user that owns the buckets.
+:Type: String
+
+``bucket``
+
+:Description: The bucket name.
+:Type: String
+
+``time``
+
+:Description: Time lower bound for which data is being specified (rounded to the beginning of the first relevant hour).
+:Type: String
+
+``epoch``
+
+:Description: The time specified in seconds since 1/1/1970.
+:Type: String
+
+``categories``
+
+:Description: A container for stats categories.
+:Type: Container
+
+``entry``
+
+:Description: A container for stats entry.
+:Type: Container
+
+``category``
+
+:Description: Name of request category for which the stats are provided.
+:Type: String
+
+``bytes_sent``
+
+:Description: Number of bytes sent by the RADOS Gateway.
+:Type: Integer
+
+``bytes_received``
+
+:Description: Number of bytes received by the RADOS Gateway.
+:Type: Integer
+
+``ops``
+
+:Description: Number of operations.
+:Type: Integer
+
+``successful_ops``
+
+:Description: Number of successful operations.
+:Type: Integer
+
+``summary``
+
+:Description: A container for stats summary.
+:Type: Container
+
+``total``
+
+:Description: A container for stats summary aggregated total.
+:Type: Container
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Trim Usage
+==========
+
+Remove usage information. With no dates specified, removes all usage
+information.
+
+:caps: usage=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/usage?format=json HTTP/1.1
+	Host: {fqdn}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user for which the information is requested. If not specified will apply to all users.
+:Type: String
+:Example: ``foo_user``
+:Required: No
+
+``start``
+
+:Description: Date and (optional) time that specifies the start time of the requested data.
+:Type: String
+:Example: ``2012-09-25 16:00:00``
+:Required: No
+
+``end``
+
+:Description: Date and (optional) time that specifies the end time of the requested data (none inclusive).
+:Type: String
+:Example: ``2012-09-25 16:00:00``
+:Required: No
+
+
+``remove-all``
+
+:Description: Required when uid is not specified, in order to acknowledge multi user data removal.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+TBD.
+
+Get User Info
+=============
+
+Get user information. If no user is specified returns the list of all users along with suspension
+information.
+
+:caps: users=read
+
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/user?format=json HTTP/1.1
+	Host: {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user for which the information is requested.
+:Type: String
+:Example: ``foo_user``
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+:Parent: ``user``
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+:Parent: ``user``
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+:Parent: ``user``
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+:Parent: ``user``
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+:Parent: ``user``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+None.
+
+Create User
+===========
+
+Create a new user. By Default, a S3 key pair will be created automatically
+and returned in the response. If only one of ``access-key`` or ``secret-key``
+is provided, the omitted key will be automatically generated. By default, a
+generated key is added to the keyring without replacing an existing key pair.
+If ``access-key`` is specified and refers to an existing key owned by the user
+then it will be modified.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{admin}/user?format=json HTTP/1.1
+	Host: {fqdn}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to be created.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+``display-name``
+
+:Description: The display name of the user to be created.
+:Type: String
+:Example: ``foo user``
+:Required: Yes
+
+
+``email``
+
+:Description: The email address associated with the user.
+:Type: String
+:Example: ``foo at bar.com``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default).
+:Type: String
+:Example: ``s3`` [``s3``]
+:Required: No
+
+``access-key``
+
+:Description: Specify access key.
+:Type: String
+:Example: ``ABCD0EF12GHIJ2K34LMN``
+:Required: No
+
+
+``secret-key``
+
+:Description: Specify secret key.
+:Type: String
+:Example: ``0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8``
+:Required: No
+
+``user-caps``
+
+:Description: User capabilities.
+:Type: String
+:Example: ``usage=read, write; users=read``
+:Required: No
+
+``generate-key``
+
+:Description: Generate a new key pair and add to the existing keyring.
+:Type: Boolean
+:Example: True [True]
+:Required: No
+
+``max-buckets``
+
+:Description: Specify the maximum number of buckets the user can own.
+:Type: Integer
+:Example: 500 [1000]
+:Required: No
+
+``suspended``
+
+:Description: Specify whether the user should be suspended.
+:Type: Boolean
+:Example: False [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+:Parent: ``user``
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+:Parent: ``user``
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+:Parent: ``user``
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+:Parent: ``user``
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+:Parent: ``user``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``UserExists``
+
+:Description: Attempt to create existing user.
+:Code: 409 Conflict
+
+``InvalidAccessKey``
+
+:Description: Invalid access key specified.
+:Code: 400 Bad Request
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``InvalidSecretKey``
+
+:Description: Invalid secret key specified.
+:Code: 400 Bad Request
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``KeyExists``
+
+:Description: Provided access key exists and belongs to another user.
+:Code: 409 Conflict
+
+``EmailExists``
+
+:Description: Provided email address exists.
+:Code: 409 Conflict
+
+``InvalidCapability``
+
+:Description: Attempt to grant invalid admin capability.
+:Code: 400 Bad Request
+
+
+Modify User
+===========
+
+Modify a user.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	POST /{admin}/user?format=json HTTP/1.1
+	Host: {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to be modified.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+``display-name``
+
+:Description: The display name of the user to be modified.
+:Type: String
+:Example: ``foo user``
+:Required: No
+
+``email``
+
+:Description: The email address to be associated with the user.
+:Type: String
+:Example: ``foo at bar.com``
+:Required: No
+
+``generate-key``
+
+:Description: Generate a new key pair and add to the existing keyring.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+``access-key``
+
+:Description: Specify access key.
+:Type: String
+:Example: ``ABCD0EF12GHIJ2K34LMN``
+:Required: No
+
+``secret-key``
+
+:Description: Specify secret key.
+:Type: String
+:Example: ``0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default).
+:Type: String
+:Example: ``s3``
+:Required: No
+
+``user-caps``
+
+:Description: User capabilities.
+:Type: String
+:Example: ``usage=read, write; users=read``
+:Required: No
+
+``max-buckets``
+
+:Description: Specify the maximum number of buckets the user can own.
+:Type: Integer
+:Example: 500 [1000]
+:Required: No
+
+``suspended``
+
+:Description: Specify whether the user should be suspended.
+:Type: Boolean
+:Example: False [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user information.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+:Parent: ``user``
+
+``display_name``
+
+:Description: Display name for the user.
+:Type: String
+:Parent: ``user``
+
+
+``suspended``
+
+:Description: True if the user is suspended.
+:Type: Boolean
+:Parent: ``user``
+
+
+``max_buckets``
+
+:Description: The maximum number of buckets to be owned by the user.
+:Type: Integer
+:Parent: ``user``
+
+
+``subusers``
+
+:Description: Subusers associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+
+``keys``
+
+:Description: S3 keys associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+
+``swift_keys``
+
+:Description: Swift keys associated with this user account.
+:Type: Container
+:Parent: ``user``
+
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+:Parent: ``user``
+
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``InvalidAccessKey``
+
+:Description: Invalid access key specified.
+:Code: 400 Bad Request
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``InvalidSecretKey``
+
+:Description: Invalid secret key specified.
+:Code: 400 Bad Request
+
+``KeyExists``
+
+:Description: Provided access key exists and belongs to another user.
+:Code: 409 Conflict
+
+``EmailExists``
+
+:Description: Provided email address exists.
+:Code: 409 Conflict
+
+``InvalidCapability``
+
+:Description: Attempt to grant invalid admin capability.
+:Code: 400 Bad Request
+
+Remove User
+===========
+
+Remove an existing user.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/user?format=json HTTP/1.1
+	Host: {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to be removed.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes.
+
+``purge-data``
+
+:Description: When specified the buckets and objects belonging
+              to the user will also be removed.
+:Type: Boolean
+:Example: True
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+None.
+
+Create Subuser
+==============
+
+Create a new subuser (primarily useful for clients using the Swift API).
+Note that either ``gen-subuser`` or ``subuser`` is required for a valid
+request. Note that in general for a subuser to be useful, it must be
+granted permissions by specifying ``access``. As with user creation if
+``subuser`` is specified without ``secret``, then a secret key will
+be automatically generated.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{admin}/user?subuser&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID under which a subuser is to  be created.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+
+``subuser``
+
+:Description: Specify the subuser ID to be created.
+:Type: String
+:Example: ``sub_foo``
+:Required: No
+
+``secret-key``
+
+:Description: Specify secret key.
+:Type: String
+:Example: ``0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift (default), s3.
+:Type: String
+:Example: ``swift`` [``swift``]
+:Required: No
+
+``access``
+
+:Description: Set access permissions for sub-user, should be one
+              of ``read, write, readwrite, full``.
+:Type: String
+:Example: ``read``
+:Required: No
+
+``generate-secret``
+
+:Description: Generate the secret key.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the subuser information.
+
+
+``subusers``
+
+:Description: Subusers associated with the user account.
+:Type: Container
+
+``id``
+
+:Description: Subuser id.
+:Type: String
+:Parent: ``subusers``
+
+``permissions``
+
+:Description: Subuser access to user account.
+:Type: String
+:Parent: ``subusers``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``SubuserExists``
+
+:Description: Specified subuser exists.
+:Code: 409 Conflict
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``InvalidSecretKey``
+
+:Description: Invalid secret key specified.
+:Code: 400 Bad Request
+
+``InvalidAccess``
+
+:Description: Invalid subuser access specified.
+:Code: 400 Bad Request
+
+Modify Subuser
+==============
+
+Modify an existing subuser
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	POST /{admin}/user?subuser&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID under which the subuser is to be modified.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+``subuser``
+
+:Description: The subuser ID to be modified.
+:Type: String
+:Example: ``sub_foo``
+:Required: Yes
+
+``generate-secret``
+
+:Description: Generate a new secret key for the subuser,
+              replacing the existing key.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+``secret``
+
+:Description: Specify secret key.
+:Type: String
+:Example: ``0AbCDEFg1h2i34JklM5nop6QrSTUV+WxyzaBC7D8``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift (default), s3 .
+:Type: String
+:Example: ``swift`` [``swift``]
+:Required: No
+
+``access``
+
+:Description: Set access permissions for sub-user, should be one
+              of ``read, write, readwrite, full``.
+:Type: String
+:Example: ``read``
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the subuser information.
+
+
+``subusers``
+
+:Description: Subusers associated with the user account.
+:Type: Container
+
+``id``
+
+:Description: Subuser id.
+:Type: String
+:Parent: ``subusers``
+
+``permissions``
+
+:Description: Subuser access to user account.
+:Type: String
+:Parent: ``subusers``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``InvalidSecretKey``
+
+:Description: Invalid secret key specified.
+:Code: 400 Bad Request
+
+``InvalidAccess``
+
+:Description: Invalid subuser access specified.
+:Code: 400 Bad Request
+
+Remove Subuser
+==============
+
+Remove an existing subuser
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/user?subuser&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID under which the subuser is to be removed.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+
+``subuser``
+
+:Description: The subuser ID to be removed.
+:Type: String
+:Example: ``sub_foo``
+:Required: Yes
+
+``purge-keys``
+
+:Description: Remove keys belonging to the subuser.
+:Type: Boolean
+:Example: True [True]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+None.
+
+Create Key
+==========
+
+Create a new key. If a ``subuser`` is specified then by default created keys
+will be swift type. If only one of ``access-key`` or ``secret-key`` is provided the
+committed key will be automatically generated, that is if only ``secret-key`` is
+specified then ``access-key`` will be automatically generated. By default, a
+generated key is added to the keyring without replacing an existing key pair.
+If ``access-key`` is specified and refers to an existing key owned by the user
+then it will be modified. The response is a container listing all keys of the same
+type as the key created. Note that when creating a swift key, specifying the option
+``access-key`` will have no effect. Additionally, only one swift key may be held by
+each user or subuser.
+
+:caps: users=write
+
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{admin}/user?key&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to receive the new key.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+``subuser``
+
+:Description: The subuser ID to receive the new key.
+:Type: String
+:Example: ``sub_foo``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be generated, options are: swift, s3 (default).
+:Type: String
+:Example: ``s3`` [``s3``]
+:Required: No
+
+``access-key``
+
+:Description: Specify the access key.
+:Type: String
+:Example: ``AB01C2D3EF45G6H7IJ8K``
+:Required: No
+
+``secret-key``
+
+:Description: Specify the secret key.
+:Type: String
+:Example: ``0ab/CdeFGhij1klmnopqRSTUv1WxyZabcDEFgHij``
+:Required: No
+
+``generate-key``
+
+:Description: Generate a new key pair and add to the existing keyring.
+:Type: Boolean
+:Example: True [``True``]
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+``keys``
+
+:Description: Keys of type created associated with this user account.
+:Type: Container
+
+``user``
+
+:Description: The user account associated with the key.
+:Type: String
+:Parent: ``keys``
+
+``access-key``
+
+:Description: The access key.
+:Type: String
+:Parent: ``keys``
+
+``secret-key``
+
+:Description: The secret key
+:Type: String
+:Parent: ``keys``
+
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``InvalidAccessKey``
+
+:Description: Invalid access key specified.
+:Code: 400 Bad Request
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``InvalidSecretKey``
+
+:Description: Invalid secret key specified.
+:Code: 400 Bad Request
+
+``InvalidKeyType``
+
+:Description: Invalid key type specified.
+:Code: 400 Bad Request
+
+``KeyExists``
+
+:Description: Provided access key exists and belongs to another user.
+:Code: 409 Conflict
+
+Remove Key
+==========
+
+Remove an existing key.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/user?key&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``access-key``
+
+:Description: The S3 access key belonging to the S3 key pair to remove.
+:Type: String
+:Example: ``AB01C2D3EF45G6H7IJ8K``
+:Required: Yes
+
+``uid``
+
+:Description: The user to remove the key from.
+:Type: String
+:Example: ``foo_user``
+:Required: No
+
+``subuser``
+
+:Description: The subuser to remove the key from.
+:Type: String
+:Example: ``sub_foo``
+:Required: No
+
+``key-type``
+
+:Description: Key type to be removed, options are: swift, s3.
+              NOTE: Required to remove swift key.
+:Type: String
+:Example: ``swift``
+:Required: No
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+None.
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None.
+
+Get Bucket Info
+===============
+
+Get information about a subset of the existing buckets. If ``uid`` is specified
+without ``bucket`` then all buckets beloning to the user will be returned. If
+``bucket`` alone is specified, information for that particular bucket will be
+retrieved.
+
+:caps: buckets=read
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/bucket?format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to return info on.
+:Type: String
+:Example: ``foo_bucket``
+:Required: No
+
+``uid``
+
+:Description: The user to retrieve bucket information for.
+:Type: String
+:Example: ``foo_user``
+:Required: No
+
+``stats``
+
+:Description: Return bucket statistics.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful the request returns a buckets container containing
+the desired bucket information.
+
+``stats``
+
+:Description: Per bucket information.
+:Type: Container
+
+``buckets``
+
+:Description: Contains a list of one or more bucket containers.
+:Type: Container
+
+``bucket``
+
+:Description: Container for single bucket information.
+:Type: Container
+:Parent: ``buckets``
+
+``name``
+
+:Description: The name of the bucket.
+:Type: String
+:Parent: ``bucket``
+
+``pool``
+
+:Description: The pool the bucket is stored in.
+:Type: String
+:Parent: ``bucket``
+
+``id``
+
+:Description: The unique bucket id.
+:Type: String
+:Parent: ``bucket``
+
+``marker``
+
+:Description: Internal bucket tag.
+:Type: String
+:Parent: ``bucket``
+
+``owner``
+
+:Description: The user id of the bucket owner.
+:Type: String
+:Parent: ``bucket``
+
+``usage``
+
+:Description: Storage usage information.
+:Type: Container
+:Parent: ``bucket``
+
+``index``
+
+:Description: Status of bucket index.
+:Type: String
+:Parent: ``bucket``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``IndexRepairFailed``
+
+:Description: Bucket index repair failed.
+:Code: 409 Conflict
+
+Check Bucket Index
+==================
+
+Check the index of an existing bucket. NOTE: to check multipart object
+accounting with ``check-objects``, ``fix`` must be set to True.
+
+:caps: buckets=write
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/bucket?index&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to return info on.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``check-objects``
+
+:Description: Check multipart object accounting.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+``fix``
+
+:Description: Also fix the bucket index when checking.
+:Type: Boolean
+:Example: False [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+``index``
+
+:Description: Status of bucket index.
+:Type: String
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``IndexRepairFailed``
+
+:Description: Bucket index repair failed.
+:Code: 409 Conflict
+
+Remove Bucket
+=============
+
+Delete an existing bucket.
+
+:caps: buckets=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/bucket?format=json HTTP/1.1
+	Host {fqdn}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to remove.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``purge-objects``
+
+:Description: Remove a buckets objects before deletion.
+:Type: Boolean
+:Example: True [False]
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``BucketNotEmpty``
+
+:Description: Attempted to delete non-empty bucket.
+:Code: 409 Conflict
+
+``ObjectRemovalFailed``
+
+:Description: Unable to remove objects.
+:Code: 409 Conflict
+
+Unlink Bucket
+=============
+
+Unlink a bucket from a specified user. Primarily useful for changing
+bucket ownership.
+
+:caps: buckets=write
+
+Syntax
+~~~~~~
+
+::
+
+	POST /{admin}/bucket?format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to unlink.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``uid``
+
+:Description: The user ID to unlink the bucket from.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``BucketUnlinkFailed``
+
+:Description: Unable to unlink bucket from specified user.
+:Code: 409 Conflict
+
+Link Bucket
+===========
+
+Link a bucket to a specified user, unlinking the bucket from
+any previous user.
+
+:caps: buckets=write
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{admin}/bucket?format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to unlink.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``uid``
+
+:Description: The user ID to link the bucket to.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: Container for single bucket information.
+:Type: Container
+
+``name``
+
+:Description: The name of the bucket.
+:Type: String
+:Parent: ``bucket``
+
+``pool``
+
+:Description: The pool the bucket is stored in.
+:Type: String
+:Parent: ``bucket``
+
+``id``
+
+:Description: The unique bucket id.
+:Type: String
+:Parent: ``bucket``
+
+``marker``
+
+:Description: Internal bucket tag.
+:Type: String
+:Parent: ``bucket``
+
+``owner``
+
+:Description: The user id of the bucket owner.
+:Type: String
+:Parent: ``bucket``
+
+``usage``
+
+:Description: Storage usage information.
+:Type: Container
+:Parent: ``bucket``
+
+``index``
+
+:Description: Status of bucket index.
+:Type: String
+:Parent: ``bucket``
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``BucketUnlinkFailed``
+
+:Description: Unable to unlink bucket from specified user.
+:Code: 409 Conflict
+
+``BucketLinkFailed``
+
+:Description: Unable to link bucket to specified user.
+:Code: 409 Conflict
+
+Remove Object
+=============
+
+Remove an existing object. NOTE: Does not require owner to be non-suspended.
+
+:caps: buckets=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/bucket?object&format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket containing the object to be removed.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``object``
+
+:Description: The object to remove.
+:Type: String
+:Example: ``foo.txt``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+None.
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``NoSuchObject``
+
+:Description: Specified object does not exist.
+:Code: 404 Not Found
+
+``ObjectRemovalFailed``
+
+:Description: Unable to remove objects.
+:Code: 409 Conflict
+
+
+
+Get Bucket or Object Policy
+===========================
+
+Read the policy of an object or bucket.
+
+:caps: buckets=read
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{admin}/bucket?policy&format=json HTTP/1.1
+	Host {fqdn}
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``bucket``
+
+:Description: The bucket to read the policy from.
+:Type: String
+:Example: ``foo_bucket``
+:Required: Yes
+
+``object``
+
+:Description: The object to read the policy from.
+:Type: String
+:Example: ``foo.txt``
+:Required: No
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, returns the object or bucket policy
+
+``policy``
+
+:Description: Access control policy.
+:Type: Container
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``IncompleteBody``
+
+:Description: Either bucket was not specified for a bucket policy request or bucket
+              and object were not specified for an object policy request.
+:Code: 400 Bad Request
+
+Add A User Capability
+=====================
+
+Add an administrative capability to a specified user.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{admin}/user?caps&format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to add an administrative capability to.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+``user-caps``
+
+:Description: The administrative capability to add to the user.
+:Type: String
+:Example: ``usage=read, write``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user's capabilities.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+:Parent: ``user``
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+:Parent: ``user``
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+:Parent: ``user``
+
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``InvalidCapability``
+
+:Description: Attempt to grant invalid admin capability.
+:Code: 400 Bad Request
+
+Example Request
+~~~~~~~~~~~~~~~
+
+::
+
+	PUT /{admin}/user?caps&format=json HTTP/1.1
+	Host: {fqdn}
+	Content-Type: text/plain
+	Authorization: {your-authorization-token}
+
+	usage=read
+
+
+Remove A User Capability
+========================
+
+Remove an administrative capability from a specified user.
+
+:caps: users=write
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{admin}/user?caps&format=json HTTP/1.1
+	Host {fqdn}
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``uid``
+
+:Description: The user ID to remove an administrative capability from.
+:Type: String
+:Example: ``foo_user``
+:Required: Yes
+
+``user-caps``
+
+:Description: The administrative capabilities to remove from the user.
+:Type: String
+:Example: ``usage=read, write``
+:Required: Yes
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+If successful, the response contains the user's capabilities.
+
+``user``
+
+:Description: A container for the user data information.
+:Type: Container
+:Parent: ``user``
+
+``user_id``
+
+:Description: The user id.
+:Type: String
+:Parent: ``user``
+
+``caps``
+
+:Description: User capabilities.
+:Type: Container
+:Parent: ``user``
+
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+``InvalidCapability``
+
+:Description: Attempt to remove an invalid admin capability.
+:Code: 400 Bad Request
+
+``NoSuchCap``
+
+:Description: User does not possess specified capability.
+:Code: 404 Not Found
+
+Special Error Responses
+~~~~~~~~~~~~~~~~~~~~~~~
+
+None.
+
+
+Quotas
+======
+
+The Admin Operations API enables you to set quotas on users and on bucket owned
+by users. See `Quota Management`_ for additional details. Quotas include the
+maximum number of objects in a bucket and the maximum storage size in megabytes.
+
+To view quotas, the user must have a ``users=read`` capability. To set,
+modify or disable a quota, the user must have ``users=write`` capability.
+See the `Admin Guide`_ for details.
+
+Valid parameters for quotas include:
+
+- **Bucket:** The ``bucket`` option allows you to specify a quota for
+  buckets owned by a user.
+
+- **Maximum Objects:** The ``max-objects`` setting allows you to specify
+  the maximum number of objects. A negative value disables this setting.
+  
+- **Maximum Size:** The ``max-size`` option allows you to specify a quota
+  for the maximum number of bytes. A negative value disables this setting.
+  
+- **Quota Scope:** The ``quota-scope`` option sets the scope for the quota.
+  The options are ``bucket`` and ``user``.
+
+
+
+Get User Quota
+~~~~~~~~~~~~~~
+
+To get a quota, the user must have ``users`` capability set with ``read`` 
+permission. ::
+
+	GET /admin/user?quota&uid=<uid>&quota-type=user
+
+
+Set User Quota
+~~~~~~~~~~~~~~
+
+To set a quota, the user must have ``users`` capability set with ``write`` 
+permission. ::
+
+	PUT /admin/user?quota&uid=<uid>&quota-type=user
+
+
+The content must include a JSON representation of the quota settings
+as encoded in the corresponding read operation.
+
+
+Get Bucket Quota
+~~~~~~~~~~~~~~~~
+
+To get a quota, the user must have ``users`` capability set with ``read`` 
+permission. ::
+
+	GET /admin/user?quota&uid=<uid>&quota-type=bucket
+
+
+Set Bucket Quota
+~~~~~~~~~~~~~~~~
+
+To set a quota, the user must have ``users`` capability set with ``write`` 
+permission. ::
+
+	PUT /admin/user?quota&uid=<uid>&quota-type=bucket
+
+The content must include a JSON representation of the quota settings
+as encoded in the corresponding read operation.
+
+
+
+
+Standard Error Responses
+========================
+
+``AccessDenied``
+
+:Description: Access denied.
+:Code: 403 Forbidden
+
+``InternalError``
+
+:Description: Internal server error.
+:Code: 500 Internal Server Error
+
+``NoSuchUser``
+
+:Description: User does not exist.
+:Code: 404 Not Found
+
+``NoSuchBucket``
+
+:Description: Bucket does not exist.
+:Code: 404 Not Found
+
+``NoSuchKey``
+
+:Description: No such access key.
+:Code: 404 Not Found
+
+
+
+.. _Admin Guide: ../admin
+.. _Quota Management: ../admin#quota-management
\ No newline at end of file
diff --git a/doc/radosgw/config-ref.rst b/doc/radosgw/config-ref.rst
new file mode 100644
index 0000000..b8e4b44
--- /dev/null
+++ b/doc/radosgw/config-ref.rst
@@ -0,0 +1,1043 @@
+======================================
+ Ceph Object Gateway Config Reference
+======================================
+
+The following settings may added to the Ceph configuration file (i.e., usually
+``ceph.conf``) under the ``[client.radosgw.{instance-name}]`` section. The
+settings may contain default values. If you do not specify each setting in the
+Ceph configuration file, the default value will be set automatically.
+
+
+``rgw data``
+
+:Description: Sets the location of the data files for Ceph Object Gateway.
+:Type: String
+:Default: ``/var/lib/ceph/radosgw/$cluster-$id``
+
+
+``rgw enable apis``
+
+:Description: Enables the specified APIs.
+:Type: String
+:Default: ``s3, swift, swift_auth, admin`` All APIs.
+
+
+``rgw cache enabled``
+
+:Description: Whether the Ceph Object Gateway cache is enabled.
+:Type: Boolean
+:Default: ``true``
+
+
+``rgw cache lru size``
+
+:Description: The number of entries in the Ceph Object Gateway cache.
+:Type: Integer
+:Default: ``10000``
+	
+
+``rgw socket path``
+
+:Description: The socket path for the domain socket. ``FastCgiExternalServer`` 
+              uses this socket. If you do not specify a socket path, Ceph 
+              Object Gateway will not run as an external server. The path you 
+              specify here must be the same as the path specified in the 
+              ``rgw.conf`` file.
+
+:Type: String
+:Default: N/A
+
+
+``rgw host``
+
+:Description: The host for the Ceph Object Gateway instance. Can be an IP 
+              address or a hostname.
+
+:Type: String
+:Default: ``0.0.0.0``
+
+
+``rgw port``
+
+:Description: Port the instance listens for requests. If not specified, 
+              Ceph Object Gateway runs external FastCGI.
+              
+:Type: String
+:Default: None
+
+
+``rgw dns name``
+
+:Description: The DNS name of the served domain. See also the ``hostnames`` setting within regions.
+:Type: String 
+:Default: None
+	
+
+``rgw script uri``
+
+:Description: The alternative value for the ``SCRIPT_URI`` if not set
+              in the request.
+
+:Type: String
+:Default: None
+
+
+``rgw request uri``
+
+:Description: The alternative value for the ``REQUEST_URI`` if not set
+              in the request.
+
+:Type: String
+:Default: None
+
+
+``rgw print continue``
+
+:Description: Enable ``100-continue`` if it is operational.
+:Type: Boolean
+:Default: ``true``
+
+
+``rgw remote addr param``
+
+:Description: The remote address parameter. For example, the HTTP field 
+              containing the remote address, or the ``X-Forwarded-For`` 
+              address if a reverse proxy is operational.
+
+:Type: String
+:Default: ``REMOTE_ADDR``
+
+
+``rgw op thread timeout``
+	
+:Description: The timeout in seconds for open threads.
+:Type: Integer
+:Default: 600
+	
+
+``rgw op thread suicide timeout``
+	
+:Description: The time ``timeout`` in seconds before a Ceph Object Gateway 
+              process dies. Disabled if set to ``0``.
+
+:Type: Integer 
+:Default: ``0``
+
+
+``rgw thread pool size``
+
+:Description: The size of the thread pool.
+:Type: Integer 
+:Default: 100 threads.
+
+
+``rgw num rados handles``
+
+:Description: The numer of the `RADOS cluster handles`_ for Ceph Object Gateway.
+              Having a configurable number of RADOS handles is resulting in
+              significant performance boost for all types of workloads. Each RGW
+              worker thread would now get to pick a RADOS handle for its lifetime,
+              from the available bunch.
+
+:Type: Integer
+:Default: ``1``
+
+
+``rgw num control oids``
+
+:Description: The number of notification objects used for cache synchronization
+              between different ``rgw`` instances.
+
+:Type: Integer
+:Default: ``8``
+
+
+``rgw init timeout``
+
+:Description: The number of seconds before Ceph Object Gateway gives up on 
+              initialization.
+
+:Type: Integer
+:Default: ``30``
+
+
+``rgw mime types file``
+
+:Description: The path and location of the MIME types. Used for Swift 
+              auto-detection of object types.
+
+:Type: String
+:Default: ``/etc/mime.types``
+
+
+``rgw gc max objs``
+
+:Description: The maximum number of objects that may be handled by 
+              garbage collection in one garbage collection processing cycle.
+
+:Type: Integer
+:Default: ``32``
+
+
+``rgw gc obj min wait``
+
+:Description: The minimum wait time before the object may be removed 
+              and handled by garbage collection processing.
+              
+:Type: Integer
+:Default: ``2 * 3600``
+
+
+``rgw gc processor max time``
+
+:Description: The maximum time between the beginning of two consecutive garbage 
+              collection processing cycles.
+
+:Type: Integer
+:Default: ``3600``
+
+
+``rgw gc processor period``
+
+:Description: The cycle time for garbage collection processing.
+:Type: Integer
+:Default: ``3600``
+
+
+``rgw s3 success create obj status``
+
+:Description: The alternate success status response for ``create-obj``.
+:Type: Integer
+:Default: ``0``
+
+
+``rgw resolve cname``
+
+:Description: Whether ``rgw`` should use DNS CNAME record of the request 
+              hostname field (if hostname is not equal to ``rgw dns name``).
+
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw obj stripe size``
+
+:Description: The size of an object stripe for Ceph Object Gateway objects.
+              See `Architecture`_ for details on striping.
+
+:Type: Integer
+:Default: ``4 << 20``
+
+
+``rgw extended http attrs``
+
+:Description: Add new set of attributes that could be set on an entity
+              (user, bucket or object). These extra attributes can be set
+              through HTTP header fields when putting the entity or modifying
+              it using POST method. If set, these attributes will return as
+              HTTP  fields when doing GET/HEAD on the entity.
+
+:Type: String
+:Default: None
+:Example: "content_foo, content_bar, x-foo-bar"
+
+
+``rgw exit timeout secs``
+
+:Description: Number of seconds to wait for a process before exiting 
+              unconditionally.
+
+:Type: Integer
+:Default: ``120``
+
+
+``rgw get obj window size``
+
+:Description: The window size in bytes for a single object request.
+:Type: Integer
+:Default: ``16 << 20``
+
+
+``rgw get obj max req size``
+
+:Description: The maximum request size of a single get operation sent to the
+              Ceph Storage Cluster.
+
+:Type: Integer
+:Default: ``4 << 20``
+
+ 
+``rgw relaxed s3 bucket names``
+
+:Description: Enables relaxed S3 bucket names rules for US region buckets.
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw list buckets max chunk``
+
+:Description: The maximum number of buckets to retrieve in a single operation
+              when listing user buckets.
+
+:Type: Integer
+:Default: ``1000``
+
+
+``rgw override bucket index max shards``
+
+:Description: Represents the number of shards for the bucket index object,
+              a value of zero indicates there is no sharding. It is not
+              recommended to set a value too large (e.g. thousand) as it
+              increases the cost for bucket listing.
+
+:Type: Integer
+:Default: ``0``
+
+
+``rgw num zone opstate shards``
+
+:Description: The maximum number of shards for keeping inter-region copy 
+              progress information.
+
+:Type: Integer
+:Default: ``128``
+
+
+``rgw opstate ratelimit sec``
+
+:Description: The minimum time between opstate updates on a single upload. 
+              ``0`` disables the ratelimit.
+
+:Type: Integer
+:Default: ``30``
+
+
+``rgw curl wait timeout ms``
+
+:Description: The timeout in milliseconds for certain ``curl`` calls. 
+:Type: Integer
+:Default: ``1000``
+
+
+``rgw copy obj progress``
+
+:Description: Enables output of object progress during long copy operations.
+:Type: Boolean
+:Default: ``true``
+
+
+``rgw copy obj progress every bytes``
+
+:Description: The minimum bytes between copy progress output.
+:Type: Integer 
+:Default: ``1024 * 1024``
+
+
+``rgw admin entry``
+
+:Description: The entry point for an admin request URL.
+:Type: String
+:Default: ``admin``
+
+
+``rgw content length compat``
+
+:Description: Enable compatability handling of FCGI requests with both CONTENT_LENGTH AND HTTP_CONTENT_LENGTH set.
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw bucket default quota max objects``
+
+:Description: Default max number of objects per bucket. Set on new users,
+              if no other quota is specified. Has no effect on existing users.
+:Type: Integer
+:Default: ``-1``
+
+
+``rgw bucket default quota max size``
+
+:Description: Default max capacity per bucket, in kB. Set on new users,
+              if no other quota is specified. Has no effect on existing users.
+:Type: Integer
+:Default: ``-1``
+
+
+``rgw user default quota max objects``
+
+:Description: Default max number of objects for a user. This includes all
+              objects in all buckets owned by the user. Set on new users,
+              if no other quota is specified. Has no effect on existing users.
+:Type: Integer
+:Default: ``-1``
+
+
+``rgw user default quota max size``
+
+:Description: The value for user max size quota in kB set on new users,
+              if no other quota is specified.  Has no effect on existing users.
+:Type: Integer
+:Default: ``-1``
+
+
+Regions
+=======
+
+In Ceph v0.67 and beyond, Ceph Object Gateway supports federated deployments and
+a global namespace via the notion of regions. A region defines the geographic
+location of one or more Ceph Object Gateway instances within one or more zones. 
+
+
+Configuring regions differs from typical configuration procedures, because not
+all of the settings end up in a Ceph configuration file. In Ceph v0.67 and
+beyond, you can list regions, get a region configuration and set a region
+configuration.
+
+
+List Regions
+------------
+
+A Ceph cluster contains a list of regions. To list the regions, execute:: 
+
+	sudo radosgw-admin region list
+
+The ``radosgw-admin`` returns a JSON formatted list of regions. 
+
+.. code-block:: javascript
+
+	{ "default_info": { "default_region": "default"},
+	  "regions": [
+	        "default"]}
+	        
+
+Get a Region Map
+----------------
+
+To list the details of each region, execute:: 
+
+	sudo radosgw-admin region-map get
+	
+	
+.. note:: If you receive a ``failed to read region map`` error, run
+   ``sudo radosgw-admin region-map update`` first.
+
+
+Get a Region
+------------
+
+To view the configuration of a region, execute:: 
+
+	radosgw-admin region get [--rgw-region=<region>]
+
+The ``default`` region looks like this:
+
+.. code-block:: javascript
+
+   {"name": "default",
+    "api_name": "",
+    "is_master": "true",
+    "endpoints": [],
+    "hostnames": [],
+    "master_zone": "",
+    "zones": [
+      {"name": "default",
+       "endpoints": [],
+       "log_meta": "false",
+       "log_data": "false"}
+     ],
+    "placement_targets": [
+      {"name": "default-placement",
+       "tags": [] }],
+    "default_placement": "default-placement"}
+
+Set a Region
+------------
+
+Defining a region consists of creating a JSON object, specifying at least the
+required settings:
+
+#. ``name``: The name of the region. Required.
+
+#. ``api_name``: The API name for the region. Optional.
+
+#. ``is_master``: Determines if the region is the master region.  Required.
+   **note:** You can only have one master region.
+
+#. ``endpoints``: A list of all the endpoints in the region. For example, 
+   you may use multiple domain names to refer to the same region. Remember to 
+   escape the forward slashes (``\/``). You may also specify a 
+   port (``fqdn:port``) for each endpoint. Optional.
+
+#. ``hostnames``: A list of all the hostnames in the region. For example, 
+   you may use multiple domain names to refer to the same region. Optional.
+   The ``rgw dns name`` setting will automatically be included in this list.
+   You should restart the ``radosgw`` daemon(s) after changing this setting.
+
+#. ``master_zone``: The master zone for the region. Optional. Uses the default
+   zone if not specified. **note:** You can only have one master zone per 
+   region.
+
+#. ``zones``: A list of all zones within the region. Each zone has a 
+   name (required), a list of endpoints (optional), and whether or not the 
+   gateway will log metadata and data operations (false by default).
+
+#. ``placement_targets``: A list of placement targets (optional). Each 
+   placement target contains a name (required) for the placement target 
+   and a list of tags (optional) so that only users with the tag can use
+   the placement target (i.e., the user's ``placement_tags`` field in the 
+   user info). 
+
+#. ``default_placement``: The default placement target for the object 
+   index and object data. Set to ``default-placement`` by default. You 
+   may also set a per-user default placement in the user info for each 
+   user.
+
+To set a region, create a JSON object consisting of the required fields, save
+the object to a file (e.g., ``region.json``); then, execute the following
+command::
+
+	sudo radosgw-admin region set --infile region.json
+
+Where ``region.json`` is the JSON file you created.
+
+
+.. important:: The ``default`` region ``is_master`` setting is ``true`` by
+   default. If you create a new region and want to make it the master region,
+   you must either set the ``default`` region ``is_master`` setting to 
+   ``false``, or delete the ``default`` region.
+
+
+Finally, update the map. :: 
+
+	sudo radosgw-admin region-map update
+
+
+Set a Region Map
+----------------
+
+Setting a region map consists of creating a JSON object consisting of one or more
+regions, and setting the ``master_region`` for the cluster. Each region in the 
+region map consists of a key/value pair, where the ``key`` setting is equivalent to
+the ``name`` setting for an individual region configuration, and the ``val`` is 
+a JSON object consisting of an individual region configuration.
+
+You may only have one region with ``is_master`` equal to ``true``, and it must be
+specified as the ``master_region`` at the end of the region map. The following
+JSON object is an example of a default region map.
+
+
+.. code-block:: javascript
+
+     { "regions": [
+          { "key": "default",
+            "val": { "name": "default",
+            "api_name": "",
+            "is_master": "true",
+            "endpoints": [],
+            "hostnames": [],
+            "master_zone": "",
+            "zones": [
+              { "name": "default",
+                "endpoints": [],
+                "log_meta": "false",
+                 "log_data": "false"}],
+                 "placement_targets": [
+                   { "name": "default-placement",
+                     "tags": []}],
+                     "default_placement": "default-placement"
+                   }
+               }
+            ],
+        "master_region": "default"
+     }
+
+To set a region map, execute the following:: 
+
+	sudo radosgw-admin region-map set --infile regionmap.json
+
+Where ``regionmap.json`` is the JSON file you created. Ensure that you have
+zones created for the ones specified in the region map. Finally, update the map.
+::
+
+	sudo radosgw-admin regionmap update
+
+
+Zones
+=====
+
+In Ceph v0.67 and beyond, Ceph Object Gateway supports the notion of zones. A
+zone defines a logical group consisting of one or more Ceph Object Gateway
+instances.
+
+Configuring zones differs from typical configuration procedures, because not
+all of the settings end up in a Ceph configuration file. In Ceph v0.67 and
+beyond, you can list zones, get a zone configuration and set a zone
+configuration.
+
+
+List Zones
+----------
+
+To list the zones in a cluster, execute::
+
+	sudo radosgw-admin zone list
+
+
+Get a Zone
+----------
+
+To get the configuration of a zone, execute:: 
+
+	sudo radosgw-admin zone get [--rgw-zone=<zone>]
+
+The ``default`` zone looks like this:
+
+.. code-block:: javascript
+
+   { "domain_root": ".rgw",
+     "control_pool": ".rgw.control",
+     "gc_pool": ".rgw.gc",
+     "log_pool": ".log",
+     "intent_log_pool": ".intent-log",
+     "usage_log_pool": ".usage",
+     "user_keys_pool": ".users",
+     "user_email_pool": ".users.email",
+     "user_swift_pool": ".users.swift",
+     "user_uid_pool": ".users.uid",
+     "system_key": { "access_key": "", "secret_key": ""},
+     "placement_pools": [
+         {  "key": "default-placement",
+            "val": { "index_pool": ".rgw.buckets.index",
+                     "data_pool": ".rgw.buckets"}
+         }
+       ]
+     }
+
+
+Set a Zone
+----------
+
+Configuring a zone involves specifying a series of Ceph Object Gateway pools.
+For consistency, we recommend using a pool prefix that is
+the same as the zone name. See `Pools`_ for details of configuring pools.
+
+To set a zone, create a JSON object consisting of the pools, save
+the object to a file (e.g., ``zone.json``); then, execute the following
+command, replacing ``{zone-name}`` with the name of the zone::
+
+	sudo radosgw-admin zone set --rgw-zone={zone-name} --infile zone.json
+
+Where ``zone.json`` is the JSON file you created.
+
+
+Region/Zone Settings
+====================
+
+You may include the following settings in your Ceph configuration
+file under each ``[client.radosgw.{instance-name}]`` instance.
+
+
+.. versionadded:: v.67
+
+``rgw zone``
+
+:Description: The name of the zone for the gateway instance.
+:Type: String
+:Default: None
+
+
+.. versionadded:: v.67
+
+``rgw region``
+
+:Description: The name of the region for the gateway instance.
+:Type: String
+:Default: None
+
+
+.. versionadded:: v.67
+
+``rgw default region info oid``
+
+:Description: The OID for storing the default region. We do not recommend
+              changing this setting.
+              
+:Type: String
+:Default: ``default.region``
+
+
+
+Pools
+=====
+
+Ceph zones map to a series of Ceph Storage Cluster pools. 
+
+.. topic:: Manually Created Pools vs. Generated Pools
+
+   If you provide write capabilities to the user key for your Ceph Object 
+   Gateway, the gateway has the ability to create pools automatically. This 
+   is convenient, but the Ceph Object Storage Cluster uses the default 
+   values for the number of placement groups (which may not be ideal) or the 
+   values you specified in your Ceph configuration file. If you allow the 
+   Ceph Object Gateway to create pools automatically, ensure that you have 
+   reasonable defaults for the number of placement groups. See 
+   `Pool Configuration`_ for details. See `Cluster Pools`_ for details on 
+   creating pools.
+   
+The default pools for the Ceph Object Gateway's default zone include:
+
+- ``.rgw``
+- ``.rgw.control``
+- ``.rgw.gc``
+- ``.log``
+- ``.intent-log``
+- ``.usage``
+- ``.users``
+- ``.users.email``
+- ``.users.swift``
+- ``.users.uid``
+
+You have significant discretion in determining how you want a zone to access
+pools. You can create pools on a per zone basis, or use the same pools for
+multiple zones. As a best practice, we recommend having a separate set of pools
+for your master zone and your secondary zones in each region. When creating
+pools for a specific zone, consider prepending the region name and zone name to
+the default pool names. For example:
+
+- ``.region1-zone1.domain.rgw``
+- ``.region1-zone1.rgw.control``
+- ``.region1-zone1.rgw.gc``
+- ``.region1-zone1.log``
+- ``.region1-zone1.intent-log``
+- ``.region1-zone1.usage``
+- ``.region1-zone1.users``
+- ``.region1-zone1.users.email``
+- ``.region1-zone1.users.swift``
+- ``.region1-zone1.users.uid``
+
+
+Ceph Object Gateways store data for the bucket index (``index_pool``) and bucket
+data (``data_pool``) in placement pools. These may overlap--i.e., you may use
+the same pool for the index and the data. The index pool for default
+placement is ``.rgw.buckets.index`` and for the data pool for default placement
+is ``.rgw.buckets``. See `Zones`_ for details on specifying pools in a zone
+configuration.
+
+
+.. deprecated:: v.67
+
+``rgw cluster root pool``
+
+:Description: The Ceph Storage Cluster pool to store ``radosgw`` metadata for 
+              this instance. Not used in Ceph version v.67 and later. Use
+              ``rgw zone root pool`` instead.
+
+:Type: String
+:Required: No
+:Default: ``.rgw.root``
+:Replaced By: ``rgw zone root pool``
+
+
+.. versionadded:: v.67
+
+``rgw region root pool``
+
+:Description: The pool for storing all region-specific information.
+              Not used in Ceph version ``Jewel``.
+:Type: String
+:Default: ``.rgw.root``
+
+.. versionadded:: Jewel
+
+``rgw zonegroup root pool``
+
+:Description: The pool for storing all zonegroup-specific information.
+:Type: String
+:Default: ``.rgw.root``
+
+
+.. versionadded:: v.67
+
+``rgw zone root pool``
+
+:Description: The pool for storing zone-specific information.
+:Type: String
+:Default: ``.rgw.root``
+
+
+Swift Settings
+==============
+
+``rgw enforce swift acls``
+
+:Description: Enforces the Swift Access Control List (ACL) settings.
+:Type: Boolean
+:Default: ``true``
+	
+	
+``rgw swift token expiration``
+
+:Description: The time in seconds for expiring a Swift token.
+:Type: Integer
+:Default: ``24 * 3600``
+
+
+``rgw swift url``
+
+:Description: The URL for the Ceph Object Gateway Swift API.
+:Type: String
+:Default: None
+	
+
+``rgw swift url prefix``
+
+:Description: The URL prefix for the Swift API. 
+:Default: ``swift``
+:Example: http://fqdn.com/swift
+	
+
+``rgw swift auth url``
+
+:Description: Default URL for verifying v1 auth tokens (if not using internal 
+              Swift auth).
+
+:Type: String
+:Default: None
+
+
+``rgw swift auth entry``
+
+:Description: The entry point for a Swift auth URL.
+:Type: String
+:Default: ``auth``
+
+
+``rgw swift versioning enabled``
+
+:Description: Enables the Object Versioning of OpenStack Object Storage API.
+              This allows clients to put the ``X-Versions-Location`` attribute
+              on containers that should be versioned. The attribute specifies
+              the name of container storing archived versions. It must be owned
+              by the same user that the versioned container due to access
+              control verification - ACLs are NOT taken into consideration.
+              Those containers cannot be versioned by the S3 object versioning
+              mechanism.
+:Type: Boolean
+:Default: ``false``
+
+
+
+Logging Settings
+================
+
+
+``rgw log nonexistent bucket``
+
+:Description: Enables Ceph Object Gateway to log a request for a non-existent 
+              bucket.
+
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw log object name``
+
+:Description: The logging format for an object name. See manpage 
+              :manpage:`date` for details about format specifiers.
+
+:Type: Date
+:Default: ``%Y-%m-%d-%H-%i-%n``
+
+
+``rgw log object name utc``
+
+:Description: Whether a logged object name includes a UTC time. 
+              If ``false``, it uses the local time.
+
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw usage max shards``
+
+:Description: The maximum number of shards for usage logging.
+:Type: Integer
+:Default: ``32``
+
+
+``rgw usage max user shards``
+
+:Description: The maximum number of shards used for a single user's 
+              usage logging.
+
+:Type: Integer
+:Default: ``1``
+
+
+``rgw enable ops log``
+
+:Description: Enable logging for each successful Ceph Object Gateway operation.
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw enable usage log``
+
+:Description: Enable the usage log.
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw ops log rados``
+
+:Description: Whether the operations log should be written to the 
+              Ceph Storage Cluster backend.
+
+:Type: Boolean
+:Default: ``true``
+
+
+``rgw ops log socket path``
+
+:Description: The Unix domain socket for writing operations logs.
+:Type: String
+:Default: None
+
+
+``rgw ops log data backlog``
+
+:Description: The maximum data backlog data size for operations logs written
+              to a Unix domain socket.
+
+:Type: Integer
+:Default: ``5 << 20``
+
+
+``rgw usage log flush threshold``
+
+:Description: The number of dirty merged entries in the usage log before 
+              flushing synchronously.
+
+:Type: Integer
+:Default: 1024
+
+
+``rgw usage log tick interval``
+
+:Description: Flush pending usage log data every ``n`` seconds.
+:Type: Integer
+:Default: ``30``
+
+
+``rgw intent log object name``
+
+:Description: The logging format for the intent log object name. See manpage 
+              :manpage:`date` for details about format specifiers.
+
+:Type: Date
+:Default: ``%Y-%m-%d-%i-%n``
+
+
+``rgw intent log object name utc``
+
+:Description: Whether the intent log object name includes a UTC time. 
+              If ``false``, it uses the local time.
+
+:Type: Boolean
+:Default: ``false``
+
+
+``rgw data log window``
+
+:Description: The data log entries window in seconds.
+:Type: Integer
+:Default: ``30``
+
+
+``rgw data log changes size``
+
+:Description: The number of in-memory entries to hold for the data changes log.
+:Type: Integer
+:Default: ``1000``
+
+
+``rgw data log num shards``
+
+:Description: The number of shards (objects) on which to keep the 
+              data changes log.
+
+:Type: Integer
+:Default: ``128``
+
+
+``rgw data log obj prefix``
+
+:Description: The object name prefix for the data log.
+:Type: String
+:Default: ``data_log``
+
+
+``rgw replica log obj prefix``
+
+:Description: The object name prefix for the replica log.
+:Type: String
+:Default: ``replica log``
+
+
+``rgw md log max shards``
+
+:Description: The maximum number of shards for the metadata log.
+:Type: Integer
+:Default: ``64``
+
+
+
+Keystone Settings
+=================
+
+
+``rgw keystone url``
+
+:Description: The URL for the Keystone server.
+:Type: String
+:Default: None
+
+
+``rgw keystone admin token``
+
+:Description: The Keystone admin token (shared secret).
+:Type: String
+:Default: None
+
+
+``rgw keystone accepted roles``
+
+:Description: The roles requires to serve requests.
+:Type: String
+:Default: ``Member, admin``
+
+
+``rgw keystone token cache size``
+
+:Description: The maximum number of entries in each Keystone token cache.
+:Type: Integer
+:Default: ``10000``
+
+
+``rgw keystone revocation interval``
+
+:Description: The number of seconds between token revocation checks.
+:Type: Integer
+:Default: ``15 * 60``
+
+
+``rgw keystone verify ssl`
+
+:Description: Verify SSL certificates while making token requests to keystone.
+:Type: Boolean
+:Default: ``true``
+
+.. _Architecture: ../../architecture#data-striping
+.. _Pool Configuration: ../../rados/configuration/pool-pg-config-ref/
+.. _Cluster Pools: ../../rados/operations/pools
+.. _Rados cluster handles: ../../rados/api/librados-intro/#step-2-configuring-a-cluster-handle
diff --git a/doc/radosgw/config.rst b/doc/radosgw/config.rst
new file mode 100644
index 0000000..c513cb3
--- /dev/null
+++ b/doc/radosgw/config.rst
@@ -0,0 +1,591 @@
+=================================
+ Configuring Ceph Object Gateway
+=================================
+
+Configuring a Ceph Object Gateway requires a running Ceph Storage Cluster, 
+and an Apache web server with the FastCGI module.
+
+The Ceph Object Gateway is a client of the Ceph Storage Cluster. As a 
+Ceph Storage Cluster client, it requires:
+
+- A name for the gateway instance. We use ``gateway`` in this guide.
+- A storage cluster user name with appropriate permissions in a keyring.
+- Pools to store its data.
+- A data directory for the gateway instance.
+- An instance entry in the Ceph Configuration file.
+- A configuration file for the web server to interact with FastCGI.
+
+
+Create a User and Keyring
+=========================
+
+Each instance must have a user name and key to communicate with a Ceph Storage
+Cluster. In the following steps, we use an admin node to create a keyring. 
+Then, we create a client user name and key. Next, we add the 
+key to the Ceph Storage Cluster. Finally, we distribute the key ring to 
+the node containing the gateway instance.
+
+.. topic:: Monitor Key CAPS
+
+   When you provide CAPS to the key, you MUST provide read capability.
+   However, you have the option of providing write capability for the monitor. 
+   This is an important choice. If you provide write capability to the key, 
+   the Ceph Object Gateway will have the ability to create pools automatically; 
+   however, it will create pools with either the default number of placement 
+   groups (not ideal) or the number of placement groups you specified in your 
+   Ceph configuration file. If you allow the Ceph Object Gateway to create 
+   pools automatically, ensure that you have reasonable defaults for the number
+   of placement groups first. See `Pool Configuration`_ for details.
+
+
+See `User Management`_ for additional details on Ceph authentication.
+
+#. Generate a Ceph Object Gateway user name and key for each instance. For
+   exemplary purposes, we will use the name ``gateway`` after ``client.radosgw``:: 
+
+        sudo ceph auth get-or-create client.radosgw.gateway osd 'allow rwx' mon 'allow rwx' -o /etc/ceph/ceph.client.radosgw.keyring
+
+#. Distribute the keyring to the node with the gateway instance. ::
+
+	sudo scp /etc/ceph/ceph.client.radosgw.keyring  ceph@{hostname}:/home/ceph
+	ssh {hostname}
+	sudo mv ceph.client.radosgw.keyring /etc/ceph/ceph.client.radosgw.keyring
+
+
+   .. note:: The 5th step is optional if ``admin node`` is the ``gateway host``.
+
+Create Pools
+============
+
+Ceph Object Gateways require Ceph Storage Cluster pools to store specific
+gateway data.  If the user you created has permissions, the gateway
+will create the pools automatically. However, you should ensure that you have
+set an appropriate default number of placement groups per pool into your Ceph
+configuration file.
+
+.. note:: Ceph Object Gateways have multiple pools, so don't make the number of
+   PGs too high considering all of the pools assigned to the same CRUSH 
+   hierarchy, or performance may suffer.
+
+When configuring a gateway with the default region and zone, the naming
+convention for pools typically omits region and zone naming, but you can use any
+naming convention you prefer. For example:
+
+
+- ``.rgw.root``
+- ``.rgw.control``
+- ``.rgw.gc``
+- ``.rgw.buckets``
+- ``.rgw.buckets.index``
+- ``.rgw.buckets.extra``
+- ``.log``
+- ``.intent-log``
+- ``.usage``
+- ``.users``
+- ``.users.email``
+- ``.users.swift``
+- ``.users.uid``
+
+
+See `Configuration Reference - Pools`_ for details on the default pools for
+gateways. See `Pools`_ for details on creating pools. As already said, if
+write permission is given, Ceph Object Gateway will create pools automatically.
+To create a pool manually, execute the following::
+
+	ceph osd pool create {poolname} {pg-num} {pgp-num} {replicated | erasure} [{erasure-code-profile}]  {ruleset-name} {ruleset-number}
+
+
+.. tip:: Ceph supports multiple CRUSH hierarchies and CRUSH rulesets, enabling 
+   great flexibility in the way you configure your gateway. Pools such as 
+   ``rgw.buckets.index`` may benefit from a pool of SSDs for fast performance. 
+   Backing storage may benefit from the increased economy of erasure-coded 
+   storage, and/or the improved performance from cache tiering.
+
+When you have completed this step, execute the following to ensure that
+you have created all of the foregoing pools::
+
+	rados lspools
+
+
+Add a Gateway Configuration to Ceph
+===================================
+
+Add the Ceph Object Gateway configuration to your Ceph Configuration file in
+``admin node``. The Ceph Object Gateway configuration requires you to
+identify the Ceph Object Gateway instance. Then, you must specify the host name
+where you installed the Ceph Object Gateway daemon, a keyring (for use with
+cephx), the socket path for FastCGI and a log file.
+
+For distros with Apache 2.2 and early versions of Apache 2.4 (RHEL 6, Ubuntu
+12.04, 14.04 etc), append the following configuration to ``/etc/ceph/ceph.conf``
+in your ``admin node``::
+
+	[client.radosgw.gateway]
+	host = {hostname}
+	keyring = /etc/ceph/ceph.client.radosgw.keyring
+	rgw socket path = ""
+	log file = /var/log/radosgw/client.radosgw.gateway.log
+	rgw frontends = fastcgi socket_port=9000 socket_host=0.0.0.0
+	rgw print continue = false
+
+
+.. note:: Apache 2.2 and early versions of Apache 2.4 do not use Unix Domain
+   Sockets but use localhost TCP.
+
+For distros with Apache 2.4.9 or later (RHEL 7, CentOS 7 etc), append the
+following configuration to ``/etc/ceph/ceph.conf`` in your ``admin node``::
+
+	[client.radosgw.gateway]
+	host = {hostname}
+	keyring = /etc/ceph/ceph.client.radosgw.keyring
+	rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
+	log file = /var/log/radosgw/client.radosgw.gateway.log
+	rgw print continue = false
+
+
+.. note:: ``Apache 2.4.9`` supports Unix Domain Socket (UDS) but as
+   ``Ubuntu 14.04`` ships with ``Apache 2.4.7`` it doesn't have UDS support and
+   has to be configured for use with localhost TCP. A bug has been filed for
+   backporting UDS support in ``Apache 2.4.7`` for ``Ubuntu 14.04``.
+   See: `Backport support for UDS in Ubuntu Trusty`_
+
+Here, ``{hostname}`` is the short hostname (output of command ``hostname -s``)
+of the node that is going to provide the gateway service i.e, the
+``gateway host``.
+
+The ``[client.radosgw.gateway]`` portion of the gateway instance identifies this
+portion of the Ceph configuration file as configuring a Ceph Storage Cluster
+client where the client type is a Ceph Object Gateway (i.e., ``radosgw``).
+
+
+.. note:: The last line in the configuration i.e, ``rgw print continue = false``
+   is added to avoid issues with ``PUT`` operations.
+
+Once you finish the setup procedure, if you encounter issues with your
+configuration, you can add debugging to the ``[global]`` section of your Ceph
+configuration file and restart the gateway to help troubleshoot any
+configuration issues. For example::
+
+	[global]
+	#append the following in the global section.
+	debug ms = 1
+	debug rgw = 20
+
+
+Distribute updated Ceph configuration file
+==========================================
+
+The updated Ceph configuration file needs to be distributed to all Ceph cluster
+nodes from the ``admin node``.
+
+It involves the following steps:
+
+#. Pull the updated ``ceph.conf`` from ``/etc/ceph/`` to the root directory of
+   the cluster in admin node (e.g. ``my-cluster`` directory). The contents of
+   ``ceph.conf`` in ``my-cluster`` will get overwritten. To do so, execute the
+   following::
+
+		ceph-deploy --overwrite-conf config pull {hostname}
+
+   Here, ``{hostname}`` is the short hostname of the Ceph admin node.
+
+#. Push the updated ``ceph.conf`` file from the admin node to all other nodes in
+   the cluster including the ``gateway host``::
+
+		ceph-deploy --overwrite-conf config push [HOST] [HOST...]
+
+   Give the hostnames of the other Ceph nodes in place of ``[HOST] [HOST...]``.
+
+
+Copy ceph.client.admin.keyring from admin node to gateway host
+==============================================================
+
+As the ``gateway host`` can be a different node that is not part of the cluster,
+the ``ceph.client.admin.keyring`` needs to be copied from the ``admin node`` to
+the ``gateway host``. To do so, execute the following on ``admin node``::
+
+	sudo scp /etc/ceph/ceph.client.admin.keyring  ceph@{hostname}:/home/ceph
+	ssh {hostname}
+	sudo mv ceph.client.admin.keyring /etc/ceph/ceph.client.admin.keyring
+
+
+.. note:: The above step need not be executed if ``admin node`` is the
+   ``gateway host``.
+
+
+Create Data Directory
+=====================
+
+Deployment scripts may not create the default Ceph Object Gateway data
+directory. Create data directories for each instance of a ``radosgw``
+daemon (if you haven't done so already). The ``host`` variables in the
+Ceph configuration file determine which host runs each instance of a
+``radosgw`` daemon. The typical form specifies the ``radosgw`` daemon,
+the cluster name and the daemon ID.
+
+To create the directory on the ``gateway host``, execute the following::
+
+	sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.gateway
+
+
+Adjust Socket Directory Permissions
+===================================
+
+On some distros, the ``radosgw`` daemon runs as the unprivileged ``apache``
+UID, and this UID must have write access to the location where it will write
+its socket file.
+
+To grant permissions to the default socket location, execute the following on
+the ``gateway host``::
+
+	sudo chown apache:apache /var/run/ceph
+
+
+Change Log File Owner
+=====================
+
+On some distros, the ``radosgw`` daemon runs as the unprivileged ``apache`` UID,
+but the ``root`` user owns the log file by default. You must change it to the
+``apache`` user so that Apache can populate the log file. To do so, execute
+the following::
+
+	sudo chown apache:apache /var/log/radosgw/client.radosgw.gateway.log
+
+
+Start radosgw service
+=====================
+
+The Ceph Object gateway daemon needs to be started. To do so, execute the
+following on the ``gateway host``:
+
+On Debian-based distros::
+
+	sudo /etc/init.d/radosgw start
+
+On RPM-based distros::
+
+	sudo /etc/init.d/ceph-radosgw start
+
+
+Create a Gateway Configuration file
+===================================
+
+On the host where you installed the Ceph Object Gateway i.e, ``gateway host``,
+create an ``rgw.conf`` file. Place the file in ``/etc/apache2/conf-available``
+directory for ``Debian-based`` distros and in ``/etc/httpd/conf.d`` directory
+for ``RPM-based`` distros. It is a Apache configuration file which is needed
+for the ``radosgw`` service. This file must be readable by the web server.
+
+Execute the following steps:
+
+#. Create the file:
+
+   For Debian-based distros, execute::
+
+	sudo vi /etc/apache2/conf-available/rgw.conf
+
+   For RPM-based distros, execute::
+
+	sudo vi /etc/httpd/conf.d/rgw.conf
+
+#. For distros with Apache 2.2 and early versions of Apache 2.4 that use
+   localhost TCP and do not support Unix Domain Socket, add the following
+   contents to the file::
+
+	<VirtualHost *:80>
+	ServerName localhost
+	DocumentRoot /var/www/html
+
+	ErrorLog /var/log/httpd/rgw_error.log
+	CustomLog /var/log/httpd/rgw_access.log combined
+
+	# LogLevel debug
+
+	RewriteEngine On
+
+	RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+	SetEnv proxy-nokeepalive 1
+
+	ProxyPass / fcgi://localhost:9000/
+
+	</VirtualHost>
+
+   .. note:: For Debian-based distros replace ``/var/log/httpd/``
+      with ``/var/log/apache2``.
+
+#. For distros with Apache 2.4.9 or later that support Unix Domain Socket,
+   add the following contents to the file::
+
+	<VirtualHost *:80>
+	ServerName localhost
+	DocumentRoot /var/www/html
+
+	ErrorLog /var/log/httpd/rgw_error.log
+	CustomLog /var/log/httpd/rgw_access.log combined
+
+	# LogLevel debug
+
+	RewriteEngine On
+
+	RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+	SetEnv proxy-nokeepalive 1
+
+	ProxyPass / unix:///var/run/ceph/ceph.radosgw.gateway.fastcgi.sock|fcgi://localhost:9000/
+
+	</VirtualHost>
+
+
+Restart Apache
+==============
+
+The Apache service needs to be restarted to accept the new configuration.
+
+For Debian-based distros, run::
+
+	sudo service apache2 restart
+
+For RPM-based distros, run::
+
+	sudo service httpd restart
+
+Or::
+
+	sudo systemctl restart httpd
+
+
+Using The Gateway
+=================
+
+To use the REST interfaces, first create an initial Ceph Object Gateway
+user for the S3 interface. Then, create a subuser for the Swift interface.
+See the `Admin Guide`_ for more details on user management.
+
+Create a radosgw user for S3 access
+------------------------------------
+
+A ``radosgw`` user needs to be created and granted access. The command
+``man radosgw-admin`` will provide information on additional command options.
+
+To create the user, execute the following on the ``gateway host``::
+
+	sudo radosgw-admin user create --uid="testuser" --display-name="First User"
+
+The output of the command will be something like the following::
+
+	{"user_id": "testuser",
+	"display_name": "First User",
+	"email": "",
+	"suspended": 0,
+	"max_buckets": 1000,
+	"auid": 0,
+	"subusers": [],
+	"keys": [
+	{ "user": "testuser",
+	"access_key": "I0PJDPCIYZ665MW88W9R",
+	"secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"}],
+	"swift_keys": [],
+	"caps": [],
+	"op_mask": "read, write, delete",
+	"default_placement": "",
+	"placement_tags": [],
+	"bucket_quota": { "enabled": false,
+	"max_size_kb": -1,
+	"max_objects": -1},
+	"user_quota": { "enabled": false,
+	"max_size_kb": -1,
+	"max_objects": -1},
+	"temp_url_keys": []}
+
+
+.. note:: The values of ``keys->access_key`` and ``keys->secret_key`` are
+   needed for access validation.
+
+Create a Swift user
+-------------------
+
+A Swift subuser needs to be created if this kind of access is needed. Creating
+a Swift user is a two step process. The first step is to create the user.
+The second is to create the secret key.
+
+Execute the following steps on the ``gateway host``:
+
+Create the Swift user::
+
+	sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
+
+The output will be something like the following::
+
+	{ "user_id": "testuser",
+	"display_name": "First User",
+	"email": "",
+	"suspended": 0,
+	"max_buckets": 1000,
+	"auid": 0,
+	"subusers": [
+	{ "id": "testuser:swift",
+	"permissions": "full-control"}],
+	"keys": [
+	{ "user": "testuser:swift",
+	"access_key": "3Y1LNW4Q6X0Y53A52DET",
+	"secret_key": ""},
+	{ "user": "testuser",
+	"access_key": "I0PJDPCIYZ665MW88W9R",
+	"secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"}],
+	"swift_keys": [],
+	"caps": [],
+	"op_mask": "read, write, delete",
+	"default_placement": "",
+	"placement_tags": [],
+	"bucket_quota": { "enabled": false,
+	"max_size_kb": -1,
+	"max_objects": -1},
+	"user_quota": { "enabled": false,
+	"max_size_kb": -1,
+	"max_objects": -1},
+	"temp_url_keys": []}
+
+Create the secret key::
+
+	sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
+
+The output will be something like the following::
+
+	{ "user_id": "testuser",
+	"display_name": "First User",
+	"email": "",
+	"suspended": 0,
+	"max_buckets": 1000,
+	"auid": 0,
+	"subusers": [
+	{ "id": "testuser:swift",
+	"permissions": "full-control"}],
+	"keys": [
+	{ "user": "testuser:swift",
+	"access_key": "3Y1LNW4Q6X0Y53A52DET",
+	"secret_key": ""},
+	{ "user": "testuser",
+	"access_key": "I0PJDPCIYZ665MW88W9R",
+	"secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA"}],
+	"swift_keys": [
+	{ "user": "testuser:swift",
+	"secret_key": "244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF\/IA"}],
+	"caps": [],
+	"op_mask": "read, write, delete",
+	"default_placement": "",
+	"placement_tags": [],
+	"bucket_quota": { "enabled": false,
+	"max_size_kb": -1,
+	"max_objects": -1},
+	"user_quota": { "enabled": false,
+	"max_size_kb": -1,
+	"max_objects": -1},
+	"temp_url_keys": []}
+
+Access Verification
+===================
+
+You then need to verify if the created users are able to access the gateway.
+
+Test S3 access
+--------------
+
+You need to write and run a Python test script for verifying S3 access. The S3
+access test script will connect to the ``radosgw``, create a new bucket and list
+all buckets. The values for ``aws_access_key_id`` and ``aws_secret_access_key``
+are taken from the values of ``access_key`` and ``secret_key`` returned by the
+``radosgw_admin`` command.
+
+Execute the following steps:
+
+#. You will need to install the ``python-boto`` package.
+
+   For Debian-based distros, run::
+
+		sudo apt-get install python-boto
+
+   For RPM-based distros, run::
+
+		sudo yum install python-boto
+
+#. Create the Python script::
+
+	vi s3test.py
+
+#. Add the following contents to the file::
+
+	import boto
+	import boto.s3.connection
+	access_key = 'I0PJDPCIYZ665MW88W9R'
+	secret_key = 'dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA'
+	conn = boto.connect_s3(
+	aws_access_key_id = access_key,
+	aws_secret_access_key = secret_key,
+	host = '{hostname}',
+	is_secure=False,
+	calling_format = boto.s3.connection.OrdinaryCallingFormat(),
+	)
+	bucket = conn.create_bucket('my-new-bucket')
+	for bucket in conn.get_all_buckets():
+		print "{name}\t{created}".format(
+			name = bucket.name,
+			created = bucket.creation_date,
+	)
+
+   Replace ``{hostname}`` with the hostname of the host where you have
+   configured the gateway service i.e, the ``gateway host``.
+
+#. Run the script::
+
+	python s3test.py
+
+   The output will be something like the following::
+
+		my-new-bucket 2015-02-16T17:09:10.000Z
+
+Test swift access
+-----------------
+
+Swift access can be verified via the ``swift`` command line client. The command
+``man swift`` will provide more information on available command line options.
+
+To install ``swift`` client, execute the following:
+
+   For Debian-based distros::
+
+		sudo apt-get install python-setuptools
+		sudo easy_install pip
+		sudo pip install --upgrade setuptools
+		sudo pip install --upgrade python-swiftclient
+
+   For RPM-based distros::
+
+		sudo yum install python-setuptools
+		sudo easy_install pip
+		sudo pip install --upgrade setuptools
+		sudo pip install --upgrade python-swiftclient
+
+To test swift access, execute the following::
+
+	swift -A http://{IP ADDRESS}/auth/1.0 -U testuser:swift -K ‘{swift_secret_key}’ list
+
+Replace ``{IP ADDRESS}`` with the public IP address of the gateway server and
+``{swift_secret_key}`` with its value from the output of
+``radosgw-admin key create`` command executed for the ``swift`` user.
+
+For example::
+
+	swift -A http://10.19.143.116/auth/1.0 -U testuser:swift -K ‘244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF/IA’ list
+
+The output should be::
+
+	my-new-bucket
+
+
+.. _Configuration Reference - Pools: ../config-ref#pools
+.. _Pool Configuration: ../../rados/configuration/pool-pg-config-ref/
+.. _Pools: ../../rados/operations/pools
+.. _User Management: ../../rados/operations/user-management
+.. _Backport support for UDS in Ubuntu Trusty: https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1411030
+.. _Admin Guide: ../admin
diff --git a/doc/radosgw/federated-config.rst b/doc/radosgw/federated-config.rst
new file mode 100644
index 0000000..d66d98e
--- /dev/null
+++ b/doc/radosgw/federated-config.rst
@@ -0,0 +1,826 @@
+================================
+ Configuring Federated Gateways
+================================
+
+.. versionadded:: 0.67 Dumpling
+
+In Ceph version 0.67 Dumpling and beyond, you may configure each :term:`Ceph 
+Object Gateway` to participate in a federated architecture, with multiple 
+regions, and with multiple zones for a region.
+
+- **Region**: A region represents a *logical* geographic area and contains one
+  or more zones. A cluster with multiple regions must specify a master region.
+  
+- **Zone**: A zone is a *logical* grouping of one or more Ceph Object Gateway 
+  instance(s). A region has a master zone that processes client requests.
+
+.. important:: Only write objects to the master zone in a region. You may read
+   objects from secondary zones. Currently, the Gateway does not prevent you
+   from writing to a secondary zone, but **DON'T DO IT**.
+
+
+Background
+==========
+
+When you deploy a :term:`Ceph Object Store` service that spans geographical
+locales, configuring Ceph Object Gateway regions and metadata synchronization
+agents enables the service to maintain a global namespace, even though Ceph
+Object Gateway instances run in different geographic locales and potentially on
+different Ceph Storage Clusters. When you separate one or more Ceph Object
+Gateway instances within a region into separate logical containers to maintain
+an extra copy (or copies) of the data, configuring Ceph Object Gateway zones and
+data synchronization agents enables the service to maintain one or more
+copy(ies) of the master zone's data. Extra copies of the data are important for
+failover, backup and disaster recovery.
+
+You may deploy a single Ceph Storage Cluster with a federated architecture if
+you have low latency network connections (this isn't recommended). You may also
+deploy one Ceph Storage Cluster per region with a separate set of  pools for
+each zone (typical). You may also deploy a separate Ceph Storage Cluster for
+each zone if your requirements and resources warrant this level of redundancy.
+
+
+About this Guide
+================
+
+In the following sections, we will demonstrate how to configure a federated
+cluster in two logical steps: 
+
+- **Configure a Master Region:** This section of the guide describes how to 
+  set up a region with multiple zones, and how to synchronize data between the
+  master zone and the secondary zone(s) within the master region.
+  
+- **Configure a Secondary Region:**  This section of the guide describes how 
+  to repeat the section on setting up a master region and multiple zones so 
+  that you have two regions with intra-zone synchronization in each region. 
+  Finally, you will learn how to set up a metadata synchronization agent so 
+  that you can maintain a global namespace for the regions in your cluster.
+
+
+
+Configure a Master Region
+=========================
+
+This section provides an exemplary procedure for setting up a region, and two
+zones within the region. The cluster will comprise two gateway daemon
+instances--one per zone. This region will serve as the master region.
+
+
+Naming for the Master Region
+----------------------------
+
+Before configuring the cluster, defining region, zone and instance names will
+help you manage your cluster. Let's assume the region represents the United
+States, and we refer to it by its standard abbreviation. 
+
+- United States: ``us``
+
+Let's assume the zones represent the Eastern and Western United States. For
+continuity, our naming convention will use ``{region name}-{zone name}`` format,
+but you can use any naming convention you prefer.
+
+- United States, East Region: ``us-east``
+- United States, West Region: ``us-west``
+
+Finally, let's assume that zones may have more than one Ceph Object Gateway 
+instance per zone. For continuity, our naming convention will use 
+``{region name}-{zone name}-{instance}`` format, but you can use any naming 
+convention you prefer.
+
+
+- United States Region, Master Zone, Instance 1: ``us-east-1``
+- United States Region, Secondary Zone, Instance 1: ``us-west-1``
+
+
+Create Pools
+------------
+
+You may have a Ceph Storage Cluster for the entire region or a Ceph Storage
+Cluster for each zone.
+
+For continuity, our naming convention will use ``{region name}-{zone name}``
+format prepended to the pool name, but you can use any naming convention you
+prefer. For example:
+
+
+- ``.us-east.rgw.root``
+- ``.us-east.rgw.control``
+- ``.us-east.rgw.gc``
+- ``.us-east.rgw.buckets``
+- ``.us-east.rgw.buckets.index``
+- ``.us-east.rgw.buckets.extra``
+- ``.us-east.log``
+- ``.us-east.intent-log``
+- ``.us-east.usage``
+- ``.us-east.users``
+- ``.us-east.users.email``
+- ``.us-east.users.swift``
+- ``.us-east.users.uid``
+
+| 
+
+- ``.us-west.rgw.root``
+- ``.us-west.rgw.control``
+- ``.us-west.rgw.gc``
+- ``.us-west.rgw.buckets``
+- ``.us-west.rgw.buckets.index``
+- ``.us-west.rgw.buckets.extra``
+- ``.us-west.log``
+- ``.us-west.intent-log``
+- ``.us-west.usage``
+- ``.us-west.users``
+- ``.us-west.users.email``
+- ``.us-west.users.swift``
+- ``.us-west.users.uid``
+
+See `Configuration Reference - Pools`_ for details on the default pools for
+gateways. See `Pools`_ for details on creating pools. Execute the following 
+to create a pool:: 
+
+	ceph osd pool create {poolname} {pg-num} {pgp-num} {replicated | erasure} [{erasure-code-profile}]  {ruleset-name} {ruleset-number}
+
+
+.. tip:: When adding a large number of pools, it may take some time for your 
+   cluster to return to a ``active + clean`` state.
+
+.. topic:: CRUSH Maps
+
+	When deploying a Ceph Storage Cluster for the entire region, consider 
+	using a CRUSH rule for the zone such that you do NOT have overlapping
+	failure domains. See `CRUSH Map`_ for details.
+	
+	Ceph supports multiple CRUSH hierarchies and CRUSH rulesets, enabling 
+	great flexibility in the way you configure your gateway. Pools such 
+	as ``rgw.buckets.index`` may benefit from a modestly sized pool of SSDs 
+	for fast performance. Backing storage may benefit from the increased economy
+	of erasure-coded storage, and/or the improved performance from cache tiering.
+
+When you have completed this step, execute the following to ensure that
+you have created all of the foregoing pools::
+
+	rados lspools
+
+
+Create a Keyring
+----------------
+
+Each instance must have a user name and key to communicate with a Ceph Storage
+Cluster. In the following steps, we use an admin node to create a keyring. 
+Then, we create a client user name and key for each instance. Next, we add the 
+keys to the Ceph Storage Cluster(s). Finally, we distribute the key ring to 
+each node containing an instance.
+
+#. Create a keyring. ::
+
+	sudo ceph-authtool --create-keyring /etc/ceph/ceph.client.radosgw.keyring
+	sudo chmod +r /etc/ceph/ceph.client.radosgw.keyring
+	
+
+#. Generate a Ceph Object Gateway user name and key for each instance. :: 
+
+	sudo ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-east-1 --gen-key
+	sudo ceph-authtool /etc/ceph/ceph.client.radosgw.keyring -n client.radosgw.us-west-1 --gen-key
+
+
+#. Add capabilities to each key. See `Configuration Reference - Pools`_ for details
+   on the effect of write permissions for the monitor and creating pools. ::
+
+	sudo ceph-authtool -n client.radosgw.us-east-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
+	sudo ceph-authtool -n client.radosgw.us-west-1 --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.client.radosgw.keyring
+
+
+#. Once you have created a keyring and key to enable the Ceph Object Gateway 
+   with access to the Ceph Storage Cluster, add each key as an entry to your 
+   Ceph Storage Cluster(s). For example:: 
+
+	sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-east-1 -i /etc/ceph/ceph.client.radosgw.keyring
+	sudo ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.radosgw.us-west-1 -i /etc/ceph/ceph.client.radosgw.keyring
+
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four users **after** 
+   you create the master region and the secondary region.
+
+
+Install Apache/FastCGI
+---------------------- 
+
+For each :term:`Ceph Node` that runs a :term:`Ceph Object Gateway` daemon 
+instance, you must install Apache, FastCGI, the Ceph Object Gateway daemon 
+(``radosgw``) and the Ceph Object Gateway Sync Agent (``radosgw-agent``). 
+See `Install Ceph Object Gateway`_ for details.
+
+
+Create Data Directories
+-----------------------
+
+Create data directories for each daemon instance on their respective 
+hosts. ::
+
+	ssh {us-east-1}
+	sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.us-east-1
+	
+	ssh {us-west-1}
+	sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.us-west-1
+
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four data directories 
+   **after** you create the master region and the secondary region.
+	
+
+Create a Gateway Configuration
+------------------------------
+
+For each instance, create an Ceph Object Gateway configuration file under the
+``/etc/apache2/sites-available`` directory on the host(s) where you installed
+the Ceph Object Gateway daemon(s). See below for an exemplary embodiment of a
+gateway configuration as discussed in the following text.
+
+.. literalinclude:: rgw.conf
+   :language: ini
+
+#. Replace the ``/{path}/{socket-name}`` entry with path to the socket and
+   the socket name. For example, 
+   ``/var/run/ceph/client.radosgw.us-east-1.sock``. Ensure that you use the 
+   same path and socket name in your ``ceph.conf`` entry.
+
+#. Replace the ``{fqdn}`` entry with the fully-qualified domain name of the 
+   server. 
+   
+#. Replace the ``{email.address}`` entry with the email address for the 
+   server administrator.
+   
+#. Add a ``ServerAlias`` if you wish to use S3-style subdomains 
+   (of course you do).
+
+#. Save the configuration to a file (e.g., ``rgw-us-east.conf``).
+
+Repeat the process for the secondary zone (e.g., ``rgw-us-west.conf``).
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four gateway
+   configuration files on the respective nodes **after** 
+   you create the master region and the secondary region.
+
+
+Finally, if you enabled SSL, make sure that you set the port to your SSL port
+(usually 443) and your configuration file includes the following::
+
+	SSLEngine on
+	SSLCertificateFile /etc/apache2/ssl/apache.crt
+	SSLCertificateKeyFile /etc/apache2/ssl/apache.key
+	SetEnv SERVER_PORT_SECURE 443
+
+
+Enable the Configuration
+------------------------
+
+For each instance, enable the gateway configuration and disable the
+default site.
+
+#. Enable the site for the gateway configuration. ::
+
+	sudo a2ensite {rgw-conf-filename}
+
+#. Disable the default site. ::
+
+	sudo a2dissite default
+
+.. note:: Failure to disable the default site can lead to problems.
+
+
+Add a FastCGI Script 
+--------------------
+
+FastCGI requires a script for each Ceph Object Gateway instance to
+enable the S3-compatible interface. To create the script, execute 
+the following procedures. 
+
+
+#. Go to the ``/var/www`` directory. :: 
+
+	cd /var/www
+
+#. Open an editor with the file name ``s3gw.fcgi``. **Note:** The configuration
+   file specifies this filename. :: 
+
+	sudo vim s3gw.fcgi
+
+#. Add a shell script with ``exec`` and the path to the gateway binary, 
+   the path to the Ceph configuration file, and the user name (``-n``; 
+   the same user name created in step 2 of `Create a Keyring`_. 
+   Copy the following into the editor. ::
+
+	#!/bin/sh
+	exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.{ID}
+
+   For example:: 
+
+	#!/bin/sh
+	exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.us-east-1
+
+#. Save the file. 
+
+#. Change the permissions on the file so that it is executable. :: 
+
+	sudo chmod +x s3gw.fcgi
+
+
+Repeat the process for the secondary zone.
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four FastCGI scripts
+   **after** you create the master region and the secondary region.
+
+
+
+Add Instances to Ceph Config File
+---------------------------------
+
+On an admin node, add an entry for each instance in the Ceph configuration file
+for your Ceph Storage Cluster(s). For example:: 
+
+	[global]
+	rgw region root pool = .us.rgw.root     # Deprecated in Jewel
+	rgw zonegroup root pool = .us.rgw.root  # From Jewel
+	
+	[client.radosgw.us-east-1]
+	rgw region = us
+	rgw zone = us-east
+	rgw zone root pool = .us-east.rgw.root
+	keyring = /etc/ceph/ceph.client.radosgw.keyring
+	rgw dns name = {hostname}
+	rgw socket path = /var/run/ceph/$name.sock
+	host = {host-name}
+	
+	[client.radosgw.us-west-1]
+	rgw region = us
+	rgw zone = us-west
+	rgw zone root pool = .us-west.rgw.root
+	keyring = /etc/ceph/ceph.client.radosgw.keyring
+	rgw dns name = {hostname}
+	rgw socket path = /var/run/ceph/$name.sock
+	host = {host-name}
+
+
+Then, update each :term:`Ceph Node` with the updated Ceph configuration
+file. For example:: 
+
+	ceph-deploy --overwrite-conf config push {node1} {node2} {nodex}	
+
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us`` with ``eu`` for the name, region, pools and zones. 
+   You will have a total of four entries **after** 
+   you create the master region and the secondary region.
+
+
+
+Create a Region
+---------------
+
+#. Configure a region infile called ``us.json`` for the ``us`` region.
+
+   Copy the contents of the following example to a text editor. Set 
+   ``is_master`` to ``true``. Replace ``{fqdn}`` with the fully-qualified 
+   domain name of the endpoint. It will specify a master zone as ``us-east`` 
+   and list it in the ``zones`` list along with the ``us-west`` zone. 
+   See `Configuration Reference - Regions`_ for details.::
+
+	{ "name": "us",
+	  "api_name": "us",
+	  "is_master": "true",
+	  "endpoints": [
+	        "http:\/\/{fqdn}:80\/"],
+	  "master_zone": "us-east",
+	  "zones": [
+	        { "name": "us-east",
+	          "endpoints": [
+	                "http:\/\/{fqdn}:80\/"],
+	          "log_meta": "true",
+	          "log_data": "true"},
+	        { "name": "us-west",
+	          "endpoints": [
+	                "http:\/\/{fqdn}:80\/"],
+	          "log_meta": "true",
+	          "log_data": "true"}],
+	  "placement_targets": [
+	   {
+	     "name": "default-placement",
+	     "tags": []
+	   }
+	  ],
+	  "default_placement": "default-placement"}
+
+
+#. Create the ``us`` region using the ``us.json`` infile you just 
+   created. :: 
+
+	radosgw-admin region set --infile us.json --name client.radosgw.us-east-1
+
+#. Delete the default region (if it exists). :: 
+
+	rados -p .us.rgw.root rm region_info.default
+	
+#. Set the ``us`` region as the default region. :: 
+
+	radosgw-admin region default --rgw-region=us --name client.radosgw.us-east-1
+
+   Only one region can be the default region for a cluster.
+
+#. Update the region map. :: 
+
+	radosgw-admin regionmap update --name client.radosgw.us-east-1
+
+
+If you use different Ceph Storage Cluster instances for regions, you  should
+repeat steps 2, 4 and 5 in by executing them with ``--name
+client.radosgw-us-west-1``. You may also export the region map from the initial
+gateway instance and import it followed by updating the region map.
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us`` with ``eu``. You will have a total of two regions **after** 
+   you create the master region and the secondary region.
+
+
+
+Create Zones
+------------
+
+#. Configure a zone infile called ``us-east.json`` for the 
+   ``us-east`` zone.
+
+   Copy the contents of the following example to a text editor.
+   This configuration uses pool names prepended with the region name and 
+   zone name. See `Configuration Reference - Pools`_ for additional details on
+   gateway pools. See `Configuration Reference - Zones`_ for additional 
+   details on zones. ::
+
+	{ "domain_root": ".us-east.domain.rgw",
+	  "control_pool": ".us-east.rgw.control",
+	  "gc_pool": ".us-east.rgw.gc",
+	  "log_pool": ".us-east.log",
+	  "intent_log_pool": ".us-east.intent-log",
+	  "usage_log_pool": ".us-east.usage",
+	  "user_keys_pool": ".us-east.users",
+	  "user_email_pool": ".us-east.users.email",
+	  "user_swift_pool": ".us-east.users.swift",
+	  "user_uid_pool": ".us-east.users.uid",
+	  "system_key": { "access_key": "", "secret_key": ""},
+	  "placement_pools": [
+	    { "key": "default-placement",
+	      "val": { "index_pool": ".us-east.rgw.buckets.index",
+	               "data_pool": ".us-east.rgw.buckets"}
+	    }
+	  ]
+	}
+
+
+#. Add the ``us-east`` zone using the ``us-east.json`` infile you
+   just created in both the east and west pools by specifying their respective
+   user names (i.e., ``--name``). ::
+
+	radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1
+	radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1
+
+   Repeat step 1 to create a zone infile for ``us-west``. Then add the zone 
+   using the ``us-west.json`` infile in both the east and west pools by 
+   specifying their respective user names (i.e., ``--name``). ::
+
+	radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1
+	radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1
+
+
+#. Delete the default zone (if it exists). :: 
+
+	rados -p .us-east.rgw.root rm zone_info.default
+	rados -p .us-west.rgw.root rm zone_info.default
+
+
+#. Update the region map. :: 
+
+	radosgw-admin regionmap update --name client.radosgw.us-east-1
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four zones **after** 
+   you create the master zone and the secondary zone in each region.
+
+
+Create Zone Users
+-----------------
+
+Ceph Object Gateway stores zone users in the zone pools. So you must create zone
+users after configuring the zones. Copy the ``access_key`` and  ``secret_key``
+fields for each user so you can update your zone configuration once you complete
+this step. :: 
+
+	radosgw-admin user create --uid="us-east" --display-name="Region-US Zone-East" --name client.radosgw.us-east-1 --system
+	radosgw-admin user create --uid="us-west" --display-name="Region-US Zone-West" --name client.radosgw.us-west-1 --system
+
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four zone users 
+   **after** you create the master region and the secondary region and their
+   zones. These users are different from the users created in `Create a 
+   Keyring`_.
+
+
+Update Zone Configurations
+--------------------------
+
+You must update the zone configuration with zone users so that
+the synchronization agents can authenticate with the zones.
+
+#. Open your ``us-east.json`` zone configuration file and paste the contents of 
+   the ``access_key`` and ``secret_key`` fields from the step of creating 
+   zone users into the ``system_key`` field of your zone configuration 
+   infile. ::
+
+	{ "domain_root": ".us-east.domain.rgw",
+	  "control_pool": ".us-east.rgw.control",
+	  "gc_pool": ".us-east.rgw.gc",
+	  "log_pool": ".us-east.log",
+	  "intent_log_pool": ".us-east.intent-log",
+	  "usage_log_pool": ".us-east.usage",
+	  "user_keys_pool": ".us-east.users",
+	  "user_email_pool": ".us-east.users.email",
+	  "user_swift_pool": ".us-east.users.swift",
+	  "user_uid_pool": ".us-east.users.uid",
+	  "system_key": { 
+	    "access_key": "{paste-access_key-here}", 
+	    "secret_key": "{paste-secret_key-here}"
+	  	 },
+	  "placement_pools": [
+	    { "key": "default-placement",
+	      "val": { "index_pool": ".us-east.rgw.buckets.index",
+	               "data_pool": ".us-east.rgw.buckets"}
+	    }
+	  ]
+	}
+
+#. Save the ``us-east.json`` file. Then, update your zone configuration. :: 
+
+	radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-east-1
+	radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.us-west-1	
+	
+#. Repeat step 1 to update the zone infile for ``us-west``. Then, update 
+   your zone configuration. :: 
+
+	radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-east-1
+	radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.us-west-1
+
+
+.. note:: When you use this procedure to configure the secondary region, 
+   replace ``us-`` with ``eu-``. You will have a total of four zones **after** 
+   you create the master zone and the secondary zone in each region.
+
+
+Restart Services
+----------------
+
+Once you have redeployed your Ceph configuration files, we recommend restarting
+your Ceph Storage Cluster(s) and Apache instances.
+
+For Ubuntu, use the following on each :term:`Ceph Node`:: 
+
+	sudo restart ceph-all
+	
+For Red Hat/CentOS, use the following::
+
+	sudo /etc/init.d/ceph restart
+	
+To ensure that all components have reloaded their configurations, for each 
+gateway instance we recommend restarting the ``apache2`` service.  For example:: 	
+	
+	sudo service apache2 restart
+
+
+Start Gateway Instances
+-----------------------
+
+Start up the ``radosgw`` service. ::
+	
+	sudo /etc/init.d/radosgw start
+
+If you are running multiple instances on the same host, you must specify the
+user name. ::
+
+	sudo /etc/init.d/radosgw start --name client.radosgw.us-east-1
+
+
+Open a browser and check the endpoints for each zone. A simple HTTP request
+to the domain name should return the following: 
+
+.. code-block:: xml
+
+   <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+	   <Owner>
+		   <ID>anonymous</ID>
+		   <DisplayName/>
+	   </Owner>
+	   <Buckets/>
+   </ListAllMyBucketsResult>
+
+
+Configure a Secondary Region
+============================
+
+This section provides an exemplary procedure for setting up a cluster with
+multiple regions. Configuring a cluster that spans regions requires maintaining
+a global namespace, so that there are no namespace clashes among object names
+stored across in different regions.
+
+This section extends the procedure in `Configure a Master Region`_, but 
+changes the region name and modifies a few procedures. See the following 
+sections for details.
+
+
+Naming for the Secondary Region
+-------------------------------
+
+Before configuring the cluster, defining region, zone and instance names will
+help you manage your cluster. Let's assume the region represents the European
+Union, and we refer to it by its standard abbreviation. 
+
+- European Union: ``eu``
+
+Let's assume the zones represent the Eastern and Western European Union. For
+continuity, our naming convention will use ``{region name}-{zone name}`` 
+format, but you can use any naming convention you prefer.
+
+- European Union, East Region: ``eu-east``
+- European Union, West Region: ``eu-west``
+
+Finally, let's assume that zones may have more than one Ceph Object Gateway 
+instance per zone. For continuity, our naming convention will use 
+``{region name}-{zone name}-{instance}`` format, but you can use any naming 
+convention you prefer.
+
+- European Union Region, Master Zone, Instance 1: ``eu-east-1``
+- European Union Region, Secondary Zone, Instance 1: ``eu-west-1``
+
+
+Configuring a Secondary Region
+------------------------------
+
+Repeat the exemplary procedure of `Configure a Master Region`_
+with the following differences: 
+
+#. Use `Naming for the Secondary Region`_ in lieu of `Naming for
+   the Master Region`_. 
+   
+#. `Create Pools`_ using ``eu`` instead of ``us``.
+
+#. `Create a Keyring`_  and the corresponding keys using ``eu`` instead of 
+   ``us``. You may use the same keyring if you desire, but ensure that you 
+   create the keys on the Ceph Storage Cluster for that region (or region 
+   and zone).
+
+#. `Install Apache/FastCGI`_. 
+
+#. `Create Data Directories`_ using ``eu`` instead of ``us``.
+
+#. `Create a Gateway Configuration`_ using ``eu`` instead of ``us`` for
+   the socket names.
+
+#. `Enable the Configuration`_.
+
+#. `Add a FastCGI Script`_ using ``eu`` instead of ``us`` for the user names.
+
+#. `Add Instances to Ceph Config File`_ using ``eu`` instead of ``us`` for the 
+   pool names. 
+
+#. `Create a Region`_ using ``eu`` instead of ``us``. Set ``is_master`` to 
+   ``false``. For consistency, create the master region in the secondary region
+   too. ::
+
+	radosgw-admin region set --infile us.json --name client.radosgw.eu-east-1
+
+#. `Create Zones`_ using ``eu`` instead of ``us``. Ensure that you update the
+   user name (i.e., ``--name``) so that you create the zones in the correct 
+   cluster.
+   
+#. `Update Zone Configurations`_ using ``eu`` instead of ``us``. 
+
+#. Create zones from master region in the secondary region. ::
+
+	radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-east-1
+	radosgw-admin zone set --rgw-zone=us-east --infile us-east.json --name client.radosgw.eu-west-1	
+	radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-east-1
+	radosgw-admin zone set --rgw-zone=us-west --infile us-west.json --name client.radosgw.eu-west-1	
+
+#. Create zones from secondary region in the master region. ::
+
+	radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-east-1
+	radosgw-admin zone set --rgw-zone=eu-east --infile eu-east.json --name client.radosgw.us-west-1	
+	radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-east-1
+	radosgw-admin zone set --rgw-zone=eu-west --infile eu-west.json --name client.radosgw.us-west-1
+
+#. `Restart Services`_.
+
+#. `Start Gateway Instances`_.
+
+
+Multi-Site Data Replication
+===========================
+
+The data synchronization agent replicates the data of a master zone to a
+secondary zone. The master zone of a region is the source for the secondary zone
+of the region and it gets selected automatically.
+
+.. image:: ../images/zone-sync.png
+
+To configure the synchronization agent, retrieve the access key and secret for
+the source and destination, and the destination URL and port.
+
+You may use ``radosgw-admin zone list`` to get a list of zone names. You 
+may use ``radosgw-admin zone get`` to identify the key and secret for the 
+zone. You may refer to the gateway configuration file you created under
+`Create a Gateway Configuration`_ to identify the port number.
+
+You only need the hostname and port for a single instance (assuming all 
+gateway instances in a region/zone access the same Ceph Storage Cluster). 
+Specify these values in a configuration file 
+(e.g., ``cluster-data-sync.conf``), and include a ``log_file`` name. 
+
+
+For example:
+
+.. code-block:: ini
+
+	src_access_key: {source-access-key}
+	src_secret_key: {source-secret-key}
+	destination: https://zone-name.fqdn.com:port
+	dest_access_key: {destination-access-key}
+	dest_secret_key: {destination-secret-key}
+	log_file: {log.filename}
+
+A concrete example may look like this:
+
+.. code-block:: ini
+
+	src_access_key: DG8RE354EFPZBICHIAF0
+	src_secret_key: i3U0HiRP8CXaBWrcF8bbh6CbsxGYuPPwRkixfFSb
+	destination: https://us-west.storage.net:80
+	dest_access_key: U60RFI6B08F32T2PD30G
+	dest_secret_key: W3HuUor7Gl1Ee93pA2pq2wFk1JMQ7hTrSDecYExl
+	log_file: /var/log/radosgw/radosgw-sync-us-east-west.log
+
+To activate the data synchronization agent, open a terminal and
+execute the following::
+
+	radosgw-agent -c region-data-sync.conf
+
+When the synchronization agent is running, you should see output
+indicating that the agent is synchronizing shards of data. ::
+
+	INFO:radosgw_agent.sync:Starting incremental sync
+	INFO:radosgw_agent.worker:17910 is processing shard number 0
+	INFO:radosgw_agent.worker:shard 0 has 0 entries after ''
+	INFO:radosgw_agent.worker:finished processing shard 0
+	INFO:radosgw_agent.worker:17910 is processing shard number 1
+	INFO:radosgw_agent.sync:1/64 shards processed
+	INFO:radosgw_agent.worker:shard 1 has 0 entries after ''
+	INFO:radosgw_agent.worker:finished processing shard 1
+	INFO:radosgw_agent.sync:2/64 shards processed
+	...
+
+.. note:: You must have an agent for each source-destination pair.
+
+
+Inter-Region Metadata Replication
+=================================
+
+The data synchronization agent replicates the metadata of master zone in the
+master region to a master zone in a secondary region. Metadata consists of
+gateway users and buckets, but not the objects within the buckets--ensuring a
+unified namespace across the cluster. The master zone of the master region is
+the source for the master zone of the secondary region and it gets selected
+automatically.
+
+.. image:: ../images/region-sync.png
+   :align: center
+
+Follow the same steps in `Multi-Site Data Replication`_ by specifying the master
+zone of the master region as the source zone and the master zone of the
+secondary region as the secondary zone. When activating the ``radosgw-agent``,
+specify ``--metadata-only`` so that it only copies metadata. For example:: 
+
+	radosgw-agent -c inter-region-data-sync.conf --metadata-only
+
+Once you have completed the foregoing procedure, you should have a cluster
+consisting of a master region (``us``) and a secondary region (``eu``) where
+there is a unified namespace between the two regions.
+
+
+
+.. _CRUSH Map: ../../rados/operations/crush-map
+.. _Install Ceph Object Gateway: ../../install/install-ceph-gateway
+.. _Cephx Administration: ../../rados/operations/authentication/#cephx-administration
+.. _Ceph configuration file: ../../rados/configuration/ceph-conf
+.. _Configuration Reference - Pools: ../config-ref#pools
+.. _Configuration Reference - Regions: ../config-ref#regions
+.. _Configuration Reference - Zones: ../config-ref#zones
+.. _Pools: ../../rados/operations/pools
+.. _Simple Configuration: ../config
diff --git a/doc/radosgw/index.rst b/doc/radosgw/index.rst
new file mode 100644
index 0000000..c66091e
--- /dev/null
+++ b/doc/radosgw/index.rst
@@ -0,0 +1,54 @@
+=====================
+ Ceph Object Gateway
+=====================
+
+:term:`Ceph Object Gateway` is an object storage interface built on top of
+``librados`` to provide applications with a RESTful gateway to
+Ceph Storage Clusters. :term:`Ceph Object Storage` supports two interfaces:
+
+#. **S3-compatible:** Provides object storage functionality with an interface 
+   that is compatible with a large subset of the Amazon S3 RESTful API.
+
+#. **Swift-compatible:** Provides object storage functionality with an interface
+   that is compatible with a large subset of the OpenStack Swift API.
+   
+Ceph Object Storage uses the Ceph Object Gateway daemon (``radosgw``), which is
+a FastCGI module for interacting with a Ceph Storage Cluster. Since it
+provides interfaces compatible with OpenStack Swift and Amazon S3, the Ceph
+Object Gateway has its own user management. Ceph Object Gateway can store data
+in the same Ceph Storage Cluster used to store data from Ceph Filesystem clients
+or Ceph Block Device clients. The S3 and Swift APIs share a common namespace, so
+you may write data with one API and retrieve it with the other. 
+
+.. ditaa::  +------------------------+ +------------------------+
+            |   S3 compatible API    | |  Swift compatible API  |
+            +------------------------+-+------------------------+
+            |                      radosgw                      |
+            +---------------------------------------------------+
+            |                      librados                     |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+   
+
+.. note:: Ceph Object Storage does **NOT** use the Ceph Metadata Server.
+
+
+.. toctree::
+	:maxdepth: 1
+
+	Manual Install <../../install/install-ceph-gateway>
+	Simple Configuration <config>
+	Federated Configuration <federated-config>
+	Multisite Configuration <multisite>
+	Config Reference <config-ref>
+	Admin Guide <admin>
+	Purging Temp Data <purge-temp>
+	S3 API <s3>
+	Swift API <swift>
+	Admin Ops API <adminops>
+	OpenStack Keystone Integration <keystone>
+	Multi-tenancy <multitenancy>
+	troubleshooting
+	Manpage radosgw <../../man/8/radosgw>
+	Manpage radosgw-admin <../../man/8/radosgw-admin>
+	
diff --git a/doc/radosgw/keystone.rst b/doc/radosgw/keystone.rst
new file mode 100644
index 0000000..84c4ee4
--- /dev/null
+++ b/doc/radosgw/keystone.rst
@@ -0,0 +1,120 @@
+=====================================
+ Integrating with OpenStack Keystone
+=====================================
+
+It is possible to integrate the Ceph Object Gateway with Keystone, the OpenStack
+identity service. This sets up the gateway to accept Keystone as the users
+authority. A user that Keystone authorizes to access the gateway will also be
+automatically created on the Ceph Object Gateway (if didn't exist beforehand). A
+token that Keystone validates will be considered as valid by the gateway.
+
+The following configuration options are available for Keystone integration::
+
+	[client.radosgw.gateway]
+	rgw keystone url = {keystone server url:keystone server admin port}
+	rgw keystone admin token = {keystone admin token}
+	rgw keystone accepted roles = {accepted user roles}
+	rgw keystone token cache size = {number of tokens to cache}
+	rgw keystone revocation interval = {number of seconds before checking revoked tickets}
+	rgw keystone implicit tenants = {true for private tenant for each new user}
+	rgw s3 auth use keystone = true
+	nss db path = {path to nss db}
+
+A Ceph Object Gateway user is mapped into a Keystone ``tenant``. A Keystone user
+has different roles assigned to it on possibly more than a single tenant. When
+the Ceph Object Gateway gets the ticket, it looks at the tenant, and the user
+roles that are assigned to that ticket, and accepts/rejects the request
+according to the ``rgw keystone accepted roles`` configurable.
+
+
+Prior to Kilo
+-------------
+
+Keystone itself needs to be configured to point to the Ceph Object Gateway as an
+object-storage endpoint::
+
+    keystone service-create --name swift --type object-store
+    keystone endpoint-create --service-id <id> --publicurl http://radosgw.example.com/swift/v1 \
+            --internalurl http://radosgw.example.com/swift/v1 --adminurl http://radosgw.example.com/swift/v1
+
+
+As of Kilo
+----------
+
+Keystone itself needs to be configured to point to the Ceph Object Gateway as an
+object-storage endpoint::
+
+  openstack service create --name=swift \
+                           --description="Swift Service" \
+                           object-store
+  +-------------+----------------------------------+
+  | Field       | Value                            |
+  +-------------+----------------------------------+
+  | description | Swift Service                    |
+  | enabled     | True                             |
+  | id          | 37c4c0e79571404cb4644201a4a6e5ee |
+  | name        | swift                            |
+  | type        | object-store                     |
+  +-------------+----------------------------------+
+
+  openstack endpoint create --region RegionOne \
+       --publicurl   "http://radosgw.example.com:8080/swift/v1" \
+       --adminurl    "http://radosgw.example.com:8080/swift/v1" \
+       --internalurl "http://radosgw.example.com:8080/swift/v1" \
+       swift
+  +--------------+------------------------------------------+
+  | Field        | Value                                    |
+  +--------------+------------------------------------------+
+  | adminurl     | http://radosgw.example.com:8080/swift/v1 |
+  | id           | e4249d2b60e44743a67b5e5b38c18dd3         |
+  | internalurl  | http://radosgw.example.com:8080/swift/v1 |
+  | publicurl    | http://radosgw.example.com:8080/swift/v1 |
+  | region       | RegionOne                                |
+  | service_id   | 37c4c0e79571404cb4644201a4a6e5ee         |
+  | service_name | swift                                    |
+  | service_type | object-store                             |
+  +--------------+------------------------------------------+
+
+  $ openstack endpoint show object-store
+  +--------------+------------------------------------------+
+  | Field        | Value                                    |
+  +--------------+------------------------------------------+
+  | adminurl     | http://radosgw.example.com:8080/swift/v1 |
+  | enabled      | True                                     |
+  | id           | e4249d2b60e44743a67b5e5b38c18dd3         |
+  | internalurl  | http://radosgw.example.com:8080/swift/v1 |
+  | publicurl    | http://radosgw.example.com:8080/swift/v1 |
+  | region       | RegionOne                                |
+  | service_id   | 37c4c0e79571404cb4644201a4a6e5ee         |
+  | service_name | swift                                    |
+  | service_type | object-store                             |
+  +--------------+------------------------------------------+
+
+
+The keystone URL is the Keystone admin RESTful API URL. The admin token is the
+token that is configured internally in Keystone for admin requests.
+
+The Ceph Object Gateway will query Keystone periodically for a list of revoked
+tokens. These requests are encoded and signed. Also, Keystone may be configured
+to provide self-signed tokens, which are also encoded and signed. The gateway
+needs to be able to decode and verify these signed messages, and the process
+requires that the gateway be set up appropriately. Currently, the Ceph Object
+Gateway will only be able to perform the procedure if it was compiled with
+``--with-nss``. Configuring the Ceph Object Gateway to work with Keystone also
+requires converting the OpenSSL certificates that Keystone uses for creating the
+requests to the nss db format, for example::
+
+	mkdir /var/ceph/nss
+
+	openssl x509 -in /etc/keystone/ssl/certs/ca.pem -pubkey | \
+		certutil -d /var/ceph/nss -A -n ca -t "TCu,Cu,Tuw"
+	openssl x509 -in /etc/keystone/ssl/certs/signing_cert.pem -pubkey | \
+		certutil -A -d /var/ceph/nss -n signing_cert -t "P,P,P"
+
+
+Openstack keystone may also be terminated with a self signed ssl certificate, in
+order for radosgw to interact with keystone in such a case, you could either
+install keystone's ssl certificate in the node running radosgw. Alternatively
+radosgw could be made to not verify the ssl certificate at all (similar to
+openstack clients with a ``--insecure`` switch) by setting the value of the
+configurable ``rgw keystone verify ssl`` to false.
diff --git a/doc/radosgw/layout.rst b/doc/radosgw/layout.rst
new file mode 100644
index 0000000..f8027a0
--- /dev/null
+++ b/doc/radosgw/layout.rst
@@ -0,0 +1,199 @@
+===========================
+ Rados Gateway Data Layout
+===========================
+
+Although the source code is the ultimate guide, this document helps
+new developers to get up to speed with the implementation details.
+
+Introduction
+------------
+
+Swift offers something called a container, that we use interchangeably with
+the term bucket. One may say that RGW's buckets implement Swift containers.
+
+This document does not consider how RGW operates on these structures,
+e.g. the use of encode() and decode() methods for serialization and so on.
+
+Conceptual View
+---------------
+
+Although RADOS only knows about pools and objects with their xattrs and
+omap[1], conceptually RGW organizes its data into three different kinds:
+metadata, bucket index, and data.
+
+* Metadata
+
+We have 3 'sections' of metadata: 'user', 'bucket', and 'bucket.instance'.
+You can use the following commands to introspect metadata entries:
+
+$ radosgw-admin metadata list
+
+$ radosgw-admin metadata list bucket
+$ radosgw-admin metadata list bucket.instance
+$ radosgw-admin metadata list user
+
+$ radosgw-admin metadata get bucket:<bucket>
+$ radosgw-admin metadata get bucket.instance:<bucket>:<bucket_id>
+$ radosgw-admin metadata get user:<user>   # get or set
+
+user: Holds user information
+bucket: Holds a mapping between bucket name and bucket instance id
+bucket.instance: Holds bucket instance information[2]
+
+Every metadata entry is kept on a single rados object.
+See below for implementation defails.
+
+Note that the metadata is not indexed. When listing a metadata section we do a
+rados pgls operation on the containing pool.
+
+* Bucket Index
+
+It's a different kind of metadata, and kept separately. The bucket index holds
+a key-value map in rados objects. By default it is a single rados object per
+bucket, but it is possible since Hammer to shard that map over multiple rados
+objects. The map itself is kept in omap, associated with each rados object.
+The key of each omap is the name of the objects, and the value holds some basic
+metadata of that object -- metadata that shows up when listing the bucket.
+Also, each omap holds a header, and we keep some bucket accounting metadata
+in that header (number of objects, total size, etc.).
+
+Note that we also hold other information in the bucket index, and it's kept in
+other key namespaces. We can hold the bucket index log there, and for versioned
+objects there is more information that we keep on other keys.
+
+* Data
+
+Objects data is kept in one or more rados objects for each rgw object.
+
+Object Lookup Path
+------------------
+
+When accessing objects, ReST APIs come to RGW with three parameters:
+account information (access key in S3 or account name in Swift),
+bucket or container name, and object name (or key). At present, RGW only
+uses account information to find out the user ID and for access control.
+Only the bucket name and object key are used to address the object in a pool.
+
+The user ID in RGW is a string, typically the actual user name from the user
+credentials and not a hashed or mapped identifier.
+
+When accessing a user's data, the user record is loaded from an object
+"<user_id>" in pool ".users.uid".
+
+Bucket names are represented directly in the pool ".rgw". Bucket record is
+loaded in order to obtain so-called marker, which serves as a bucket ID.
+
+The object is located in pool ".rgw.buckets". Object name is "<marker>_<key>",
+for example "default.7593.4_image.png", where the marker is "default.7593.4"
+and the key is "image.png". Since these concatenated names are not parsed,
+only passed down to RADOS, the choice of the separator is not important and
+causes no ambiguity. For the same reason, slashes are permitted in object
+names (keys).
+
+It is also possible to create multiple data pools and make it so that
+different users buckets will be created in different rados pools by default,
+thus providing the necessary scaling. The layout and naming of these pools
+is controlled by a 'policy' setting.[3]
+
+An RGW object may consist of several RADOS objects, the first of which
+is the head that contains the metadata, such as manifest, ACLs, content type,
+ETag, and user-defined metadata. The metadata is stored in xattrs.
+The head may also contain up to 512 kilobytes of object data, for efficiency
+and atomicity. The manifest describes how each object is laid out in RADOS
+objects.
+
+Bucket and Object Listing
+-------------------------
+
+Buckets that belong to a given user are listed in an omap of an object named
+"<user_id>.buckets" (for example, "foo.buckets") in pool ".users.uid".
+These objects are accessed when listing buckets, when updating bucket
+contents, and updating and retrieving bucket statistics (e.g. for quota).
+
+See the user-visible, encoded class 'cls_user_bucket_entry' and its
+nested class 'cls_user_bucket' for the values of these omap entires.
+
+These listings are kept consistent with buckets in pool ".rgw".
+
+Objects that belong to a given bucket are listed in a bucket index,
+as discussed in sub-section 'Bucket Index' above. The default naming
+for index objects is ".dir.<marker>" in pool ".rgw.buckets.index".
+
+Footnotes
+---------
+
+[1] Omap is a key-value store, associated with an object, in a way similar
+to how Extended Attributes associate with a POSIX file. An object's omap
+is not physically located in the object's storage, but its precise
+implementation is invisible and immaterial to RADOS Gateway.
+In Hammer, one LevelDB is used to store omap in each OSD.
+
+[2] Before the Dumpling release, the 'bucket.instance' metadata did not
+exist and the 'bucket' metadata contained its information. It is possible
+to encounter such buckets in old installations.
+
+[3] In Infernalis, a pending commit exists that removes the need of prefixing
+all the rgw system pools with a period, and also renames all of these pools.
+See Github pull request #4944 "rgw noperiod".
+
+Appendix: Compendum
+-------------------
+
+Known pools:
+
+.rgw.root
+  Unspecified region, zone, and global information records, one per object.
+
+.rgw.control
+  notify.<N>
+
+.rgw
+  <bucket>
+  .bucket.meta.<bucket>:<marker>   # see put_bucket_instance_info()
+
+  The tenant is used to disambiguate buckets, but not bucket instances.
+  Example:
+
+  .bucket.meta.prodtx:test%25star:default.84099.6
+  .bucket.meta.testcont:default.4126.1
+  .bucket.meta.prodtx:testcont:default.84099.4
+  prodtx/testcont
+  prodtx/test%25star
+  testcont
+
+.rgw.gc
+  gc.<N>
+
+.users.uid
+  Contains _both_ per-user information (RGWUserInfo) in "<user>" objects
+  and per-user lists of buckets in omaps of "<user>.buckets" objects.
+  The "<user>" may contain the tenant if non-empty, for example:
+
+  prodtx$prodt
+  test2.buckets
+  prodtx$prodt.buckets
+  test2
+
+.users.email
+  Unimportant
+
+.users
+  47UA98JSTJZ9YAN3OS3O
+  It's unclear why user ID is not used to name objects in this pool.
+
+.users.swift
+  test:tester
+
+.rgw.buckets.index
+  Objects are named ".dir.<marker>", each contains a bucket index.
+  If the index is sharded, each shard appends the shard index after
+  the marker.
+
+.rgw.buckets
+  default.7593.4__shadow_.488urDFerTYXavx4yAd-Op8mxehnvTI_1
+  <marker>_<key>
+
+An example of a marker would be "default.16004.1" or "default.7593.4".
+The current format is "<zone>.<instance_id>.<bucket_id>". But once
+generated, a marker is not parsed again, so its format may change
+freely in the future.
diff --git a/doc/radosgw/multisite.rst b/doc/radosgw/multisite.rst
new file mode 100644
index 0000000..6a7a8a3
--- /dev/null
+++ b/doc/radosgw/multisite.rst
@@ -0,0 +1,751 @@
+=============
+RGW Multisite
+=============
+
+.. versionadded:: Jewel
+
+From Ceph release Jewel and beyond, you may configure each :term`Ceph Object
+Gateway` to work in an active active zone configuration, allowing for writes to
+non-master zones. Following are the basic terminologies that would be used:
+
+- **Zone**: A zone is *logical* grouping of one or more Ceph Object Gateway
+  instances. There will be one Zone that should be designated as the master zone
+  in a zonegroup, which will handle all bucket and user creation.
+
+- **Zonegroup**: A zonegroup consists of multiple zones, this approximately
+  corresponds to what used to be called as a region in pre Jewel releases for
+  federated deployments. There should be a master zonegroup that will handle
+  changes to the system configuration.
+
+- **Zonegroup map**: A zonegroup map is a configuration structure that holds the
+  map of the entire system, ie. which zonegroup is the master, relationships
+  between different zonegroups and certain configurables like storage policies.
+
+- **Realm**: A realm is a container for zonegroups, this allows for separation
+  of zonegroups themselves between clusters. It is possible to create multiple
+  realms, making it easier to run completely different configurations in the same
+  cluster.
+
+- **Period**: A period holds the configuration structure for the current state
+  of the realm. Every period contains a unique id and an epoch. A period's epoch
+  is incremented on every commit operation. Every realm has an associated
+  current period, holding the current state of configuration of the zonegroups
+  and storage policies. Any configuration change for a non master zone will
+  increment the period's epoch. Changing the master zone to a different zone
+  will trigger the following changes:
+  - A new period is generated with a new period id and epoch of 1
+  - Realm's current period is updated to point to the newly generated period id
+  - Realm's epoch is incremented
+
+About this guide
+================
+
+In this guide we create a single zone group, with three separate zones, which
+actively sync data between them. For the purpose of the guide, we create 2 zones
+in the same cluster, and the third zone in a different cluster. There is no sync
+agent involved for mirroring data changes between the RadosGWs and this allows
+for a much simpler configuration scheme and active-active configurations. Please
+note that metadata operations such as creating a user would still need to go
+through the master zone, however data operations such as creation of buckets
+objects etc. can be handled by any of the zones.
+
+System Keys
+-----------
+
+While configuring zones, RadosGW, expects creation of zone a system user, with
+an S3-like access and secret keys. This allows another radosgw instance to pull
+the configuration remotely, with the access and secret keys. For making
+scripting and use of configuration management tools easier, it would be easier
+to generate the access-key and secret-key before hand and use these. For the
+purpose of the guide we assume an access key and secret key are set in the
+environment. For eg., something like::
+
+  $ SYSTEM_ACCESS_KEY=1555b35654ad1656d805
+  $ SYSTEM_SECRET_KEY=h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q12
+
+Generally access keys are 20 alphanumeric characters, secret keys are
+40 alphanumeric characters (they can contain +/= chars as well). These
+keys can be generated in shell for eg::
+
+  $ SYSTEM_ACCESS_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1)
+  $ SYSTEM_SECRET_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1)
+
+Naming conventions
+------------------
+
+This section describes the process of setting up a master zone. For the purpose
+of the guide, we'll assume a zonegroup called ``us`` spanning the United States,
+which will be our master zonegroup. This will contain two zones written in a
+``{zonegroup}-{zone}`` format, this is just a convention only and you are free
+to choose a format you prefer to set these names. So in summary:
+
+- Master Zonegroup: United States ``us``
+- Master zone: United States, East Region 1: ``us-east-1``
+- Secondary zone: United States, East Region 2: ``us-east-2``
+- Secondary zone: United States, West Region: ``us-west``
+
+This will be a part of a larger realm, say ``gold``. The zones ``us-east-1`` and
+``us-east-2`` are part of the same ceph cluster, of which we'll make
+``us-east-1`` as the primary. ``us-west`` will be in a different ceph cluster.
+
+Create Pools
+------------
+
+Radosgw will create pools on its own, when it is configured with the appropriate
+permissions, this will be done with the value of ``pg_num`` and ``pgp_num`` from
+the ``ceph.conf``. See `Ceph Object Gateway - Create Pools`_ for more detailed
+explanation. Pools particular to a zone by default follows the convention of
+``{zone-name}.pool-name``. In the default configuration, for eg. in
+``us-east-1`` zone following will be the pools:
+
+- ``.rgw.root``
+- ``us-east-1.rgw.control``
+- ``us-east-1.rgw.data.root``
+- ``us-east-1.rgw.gc``
+- ``us-east-1.rgw.log``
+- ``us-east-1.rgw.intent-log``
+- ``us-east-1.rgw.usage``
+- ``us-east-1.rgw.users.keys``
+- ``us-east-1.rgw.users.email``
+- ``us-east-1.rgw.users.swift``
+- ``us-east-1.rgw.users.uid``
+- ``us-east-1.rgw.buckets.index``
+- ``us-east-1.rgw.buckets.data``
+- ``us-east-1.rgw.meta``
+
+These pools can be created in other zones as well replacing ``us-east-1`` with
+the appropriate zone name.
+
+Configuring the master zone in the primary cluster
+==================================================
+
+First, we'll be configuring the master zone ``us-east-1``, in the master
+zonegroup ``us``, this will serve as the master zone for all metadata
+operations, so all operations like creation of users need to be done on this
+zone.
+
+Creating a realm
+----------------
+
+Configure a realm called ``gold``, and also make this the default ::
+
+  # radosgw-admin realm create --rgw-realm=gold --default
+  {
+    "id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
+    "name": "gold",
+    "current_period": "09559832-67a4-4101-8b3f-10dfcd6b2707",
+    "epoch": 1
+  }
+
+
+Note that every realm has an id, which allows for flexibility like renaming the
+realm later, should the need arise. The ``current_period`` changes whenever we
+change anything in the master zone. The ``epoch`` is incremented when there's a
+change in configuration of the master zone, which results in a change of current
+period.
+
+Deleting the default zonegroup
+------------------------------
+
+A simple installation of radosgw would assume the default zonegroup called
+"default", since we no longer need this we begin by removing the default
+zonegroup::
+
+  # radosgw-admin zonegroup delete --rgw-zonegroup=default
+
+
+Creating a master zonegroup
+---------------------------
+
+We'll be creating a zonegroup called ``us`` as a master zonegroup. A master
+zonegroup will be in control of the zonegroup map and propagate changes to the
+rest of the system. We will also set this zonegroup as the default, which allows later commands to use this zonegroup without explicitly mentioning it with the rgw-zonegroup switch.
+
+::
+
+   # radosgw-admin zonegroup create --rgw-zonegroup=us --endpoints=http://rgw1:80 --master --default
+   {
+    "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
+    "name": "us",
+    "api_name": "us",
+    "is_master": "true",
+    "endpoints": [
+        "http:\/\/rgw1:80"
+    ],
+    "hostnames": [],
+    "hostnames_s3website": [],
+    "master_zone": "",
+    "zones": [],
+    "placement_targets": [],
+    "default_placement": "",
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
+    }
+
+Alternatively, we make this zonegroup as the default zonegroup via the following
+command ::
+
+  # radosgw-admin zonegroup default --rgw-zonegroup=us
+
+
+Creating a master zone
+----------------------
+
+Next we create a zone, and make it as the default zone. Note that for metadata
+operations like user creation you would want to use this zone. We also add it to
+the zonegroup
+
+::
+
+   # radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east-1 --endpoints=http://rgw1:80 --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY --default --master
+   {
+    "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+    "name": "us-east-1",
+    "domain_root": "us-east-1.rgw.data.root",
+    "control_pool": "us-east-1.rgw.control",
+    "gc_pool": "us-east-1.rgw.gc",
+    "log_pool": "us-east-1.rgw.log",
+    "intent_log_pool": "us-east-1.rgw.intent-log",
+    "usage_log_pool": "us-east-1.rgw.usage",
+    "user_keys_pool": "us-east-1.rgw.users.keys",
+    "user_email_pool": "us-east-1.rgw.users.email",
+    "user_swift_pool": "us-east-1.rgw.users.swift",
+    "user_uid_pool": "us-east-1.rgw.users.uid",
+    "system_key": {
+        "access_key": "1555b35654ad1656d804",
+        "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
+    },
+    "placement_pools": [
+        {
+            "key": "default-placement",
+            "val": {
+                "index_pool": "us-east-1.rgw.buckets.index",
+                "data_pool": "us-east-1.rgw.buckets.data",
+                "data_extra_pool": "us-east-1.rgw.buckets.non-ec",
+                "index_type": 0
+            }
+        }
+    ],
+    "metadata_heap": "us-east-1.rgw.meta",
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
+    }
+
+
+  Note that the above ``--rgw-zonegroup`` and ``--default`` switches add the
+  zone to a zonegroup and makes it the default zone as well. This can also be
+  accomplished alternatively by the following commands::
+
+    # radosgw-admin zone default --rgw-zone=us-east
+    # radosgw-admin zonegroup add --rgw-zonegroup=us --rgw-zone=us-east
+
+
+Creating system users
+---------------------
+
+Next we create the system users for accessing the zone pools, note that these
+keys would be used when configuring the secondary zone::
+
+  # radosgw-admin user create --uid=zone.user --display-name="Zone
+  User" --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY --system
+  {
+    "user_id": "zone.user",
+    "display_name": "Zone User",
+    "email": "",
+    "suspended": 0,
+    "max_buckets": 1000,
+    "auid": 0,
+    "subusers": [],
+    "keys": [
+        {
+            "user": "zone.user",
+            "access_key": "1555b35654ad1656d804",
+            "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
+        }
+    ],
+    "swift_keys": [],
+    "caps": [],
+    "op_mask": "read, write, delete",
+    "system": "true",
+    "default_placement": "",
+    "placement_tags": [],
+    "bucket_quota": {
+        "enabled": false,
+        "max_size_kb": -1,
+        "max_objects": -1
+    },
+    "user_quota": {
+        "enabled": false,
+        "max_size_kb": -1,
+        "max_objects": -1
+    },
+    "temp_url_keys": []
+  }
+
+
+
+Update the period
+-----------------
+Since we have now made a change in the master zone configuration, we need to
+commit these zone changes to reflect in the realm configuration structure. This
+is what the period would look like initially::
+
+  # radosgw-admin period get
+   {
+    "id": "09559832-67a4-4101-8b3f-10dfcd6b2707",
+    "epoch": 1,
+    "predecessor_uuid": "",
+    "sync_status": [],
+    "period_map": {
+        "id": "09559832-67a4-4101-8b3f-10dfcd6b2707",
+        "zonegroups": [],
+        "short_zone_ids": []
+    },
+    "master_zonegroup": "",
+    "master_zone": "",
+    "period_config": {
+        "bucket_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        },
+        "user_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        }
+    },
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
+    "realm_name": "gold",
+    "realm_epoch": 1
+    }
+
+Now we update the period and commit the changes::
+
+  # radosgw-admin period update --commit
+  {
+    "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+    "epoch": 1,
+    "predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
+    "sync_status": [ ""... # truncating the output here
+    ],
+    "period_map": {
+        "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+        "zonegroups": [
+            {
+                "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
+                "name": "us",
+                "api_name": "us",
+                "is_master": "true",
+                "endpoints": [
+                    "http:\/\/rgw1:80"
+                ],
+                "hostnames": [],
+                "hostnames_s3website": [],
+                "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                "zones": [
+                    {
+                        "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                        "name": "us-east-1",
+                        "endpoints": [
+                            "http:\/\/rgw1:80"
+                        ],
+                        "log_meta": "true",
+                        "log_data": "false",
+                        "bucket_index_max_shards": 0,
+                        "read_only": "false"
+                    }
+                ],
+                "placement_targets": [
+                    {
+                        "name": "default-placement",
+                        "tags": []
+                    }
+                ],
+                "default_placement": "default-placement",
+                "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
+            }
+        ],
+        "short_zone_ids": [
+            {
+                "key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                "val": 630926044
+            }
+        ]
+    },
+    "master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
+    "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+    "period_config": {
+        "bucket_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        },
+        "user_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        }
+    },
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
+    "realm_name": "gold",
+    "realm_epoch": 2
+    }
+
+
+Starting the radosgw
+--------------------
+
+Before starting the radosgw, the rgw zone and port options need to be mentioned
+in the configuration file. For more details refer to the `Install Ceph Gateway`_
+section of the guide. The configuration section for radosgw should resemble::
+
+  [client.rgw.us-east-1]
+  rgw_frontends="civetweb port=80"
+  rgw_zone=us-east
+
+And start the Ceph Object gateway (according to the OS installation) ::
+
+  sudo systemctl start ceph-radosgw.service
+
+
+Configuring the Secondary zone in Same Cluster
+==============================================
+
+Now we configure the secondary zone, ``us-east-2``, in the same cluster. For the
+same cluster, all the following commands can be executed in the node hosting the
+primary zone itself.
+
+Secondary Zone Creation
+-----------------------
+
+We follow a similar step to creation of master zone, except dropping the
+``master`` flag this time ::
+
+  # radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east-2 --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY --endpoints=http://rgw2:80
+  {
+    "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
+    "name": "us-east-2",
+    "domain_root": "us-east-2.rgw.data.root",
+    "control_pool": "us-east-2.rgw.control",
+    "gc_pool": "us-east-2.rgw.gc",
+    "log_pool": "us-east-2.rgw.log",
+    "intent_log_pool": "us-east-2.rgw.intent-log",
+    "usage_log_pool": "us-east-2.rgw.usage",
+    "user_keys_pool": "us-east-2.rgw.users.keys",
+    "user_email_pool": "us-east-2.rgw.users.email",
+    "user_swift_pool": "us-east-2.rgw.users.swift",
+    "user_uid_pool": "us-east-2.rgw.users.uid",
+    "system_key": {
+        "access_key": "1555b35654ad1656d804",
+        "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
+    },
+    "placement_pools": [
+        {
+            "key": "default-placement",
+            "val": {
+                "index_pool": "us-east-2.rgw.buckets.index",
+                "data_pool": "us-east-2.rgw.buckets.data",
+                "data_extra_pool": "us-east-2.rgw.buckets.non-ec",
+                "index_type": 0
+            }
+        }
+    ],
+    "metadata_heap": "us-east-2.rgw.meta",
+    "realm_id": "815d74c2-80d6-4e63-8cfc-232037f7ff5c"
+    }
+
+Updating the Period
+-------------------
+
+Next we inform all the gateways of the new change in the system map by doing a
+period update and committing the changes::
+
+  # radosgw-admin period update --commit
+  {
+    "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+    "epoch": 2,
+    "predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
+    "sync_status": [ ""... # truncating the output here
+    ],
+    "period_map": {
+        "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+        "zonegroups": [
+            {
+                "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
+                "name": "us",
+                "api_name": "us",
+                "is_master": "true",
+                "endpoints": [
+                    "http:\/\/rgw1:80"
+                ],
+                "hostnames": [],
+                "hostnames_s3website": [],
+                "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                "zones": [
+                    {
+                        "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                        "name": "us-east-1",
+                        "endpoints": [
+                            "http:\/\/rgw1:80"
+                        ],
+                        "log_meta": "true",
+                        "log_data": "false",
+                        "bucket_index_max_shards": 0,
+                        "read_only": "false"
+                    },
+                    {
+                        "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
+                        "name": "us-east-2",
+                        "endpoints": [
+                            "http:\/\/rgw2:80"
+                        ],
+                        "log_meta": "false",
+                        "log_data": "true",
+                        "bucket_index_max_shards": 0,
+                        "read_only": "false"
+                    }
+
+                ],
+                "placement_targets": [
+                    {
+                        "name": "default-placement",
+                        "tags": []
+                    }
+                ],
+                "default_placement": "default-placement",
+                "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
+            }
+        ],
+        "short_zone_ids": [
+            {
+                "key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                "val": 630926044
+            },
+            {
+                "key": "950c1a43-6836-41a2-a161-64777e07e8b8",
+                "val": 4276257543
+            }
+
+        ]
+    },
+    "master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
+    "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+    "period_config": {
+        "bucket_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        },
+        "user_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        }
+    },
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
+    "realm_name": "gold",
+    "realm_epoch": 2
+    }
+
+
+Starting the radosgw
+--------------------
+
+On the node that is hosting the radosgw of the secondary zone, you would start
+it, similar to the `Starting the Radosgw`_, changing the ``rgw zone=us-east-2``
+in the configuration file this time. For eg::
+
+  [client.rgw.us-east-2]
+  rgw_frontends="civetweb port=80"
+  rgw_zone=us-east-2
+
+
+Configuring the Gateway in the second Ceph Cluster
+==================================================
+
+Now we go on to configuring radosgw in the second ceph cluster, which may be
+geographically apart, that is a part of the same zonegroup.
+
+Since a realm was already configured from the first gateway, we pull and make
+that realm the default here, We also get the configuration from the master zone
+by pulling the period::
+
+  # radosgw-admin realm pull --url=http://rgw1:80
+  --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
+  {
+    "id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
+    "name": "gold",
+    "current_period": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+    "epoch": 2
+  }
+
+  # radosgw-admin period pull --url=http://rgw1:80 --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
+  # radosgw-admin realm default --rgw-realm=gold
+
+We also set the default zonegroup to the created ``us`` zonegroup::
+
+  # radosgw-admin zonegroup default --rgw-zonegroup=us
+
+Secondary Zone Configuration
+----------------------------
+
+We create the new zone, ``us-west``, with the same system keys::
+
+  # radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-west
+  --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY --endpoints=http://rgw3:80 --default
+  {
+    "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
+    "name": "us-east-2",
+    "domain_root": "us-east-2.rgw.data.root",
+    "control_pool": "us-east-2.rgw.control",
+    "gc_pool": "us-east-2.rgw.gc",
+    "log_pool": "us-east-2.rgw.log",
+    "intent_log_pool": "us-east-2.rgw.intent-log",
+    "usage_log_pool": "us-east-2.rgw.usage",
+    "user_keys_pool": "us-east-2.rgw.users.keys",
+    "user_email_pool": "us-east-2.rgw.users.email",
+    "user_swift_pool": "us-east-2.rgw.users.swift",
+    "user_uid_pool": "us-east-2.rgw.users.uid",
+    "system_key": {
+        "access_key": "1555b35654ad1656d804",
+        "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
+    },
+    "placement_pools": [
+        {
+            "key": "default-placement",
+            "val": {
+                "index_pool": "us-east-2.rgw.buckets.index",
+                "data_pool": "us-east-2.rgw.buckets.data",
+                "data_extra_pool": "us-east-2.rgw.buckets.non-ec",
+                "index_type": 0
+            }
+        }
+    ],
+    "metadata_heap": "us-east-2.rgw.meta",
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
+    }
+
+
+Updating the period
+-------------------
+Now to propagate the zonegroup-map changes, we update and commit the period::
+
+  # radosgw-admin period update --commit --rgw-zone=us-west
+  {
+    "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+    "epoch": 3,
+    "predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
+    "sync_status": [
+        "", # truncated
+    ],
+    "period_map": {
+        "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
+        "zonegroups": [
+            {
+                "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
+                "name": "us",
+                "api_name": "us",
+                "is_master": "true",
+                "endpoints": [
+                    "http:\/\/rgw1:80"
+                ],
+                "hostnames": [],
+                "hostnames_s3website": [],
+                "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                "zones": [
+                    {
+                        "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                        "name": "us-east",
+                        "endpoints": [
+                            "http:\/\/rgw1:80"
+                        ],
+                        "log_meta": "true",
+                        "log_data": "true",
+                        "bucket_index_max_shards": 0,
+                        "read_only": "false"
+                    },
+                                    {
+                        "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
+                        "name": "us-east-2",
+                        "endpoints": [
+                            "http:\/\/rgw2:80"
+                        ],
+                        "log_meta": "false",
+                        "log_data": "true",
+                        "bucket_index_max_shards": 0,
+                        "read_only": "false"
+                    },
+                    {
+                        "id": "d9522067-cb7b-4129-8751-591e45815b16",
+                        "name": "us-west",
+                        "endpoints": [
+                            "http:\/\/rgw3:80"
+                        ],
+                        "log_meta": "false",
+                        "log_data": "true",
+                        "bucket_index_max_shards": 0,
+                        "read_only": "false"
+                    }
+                ],
+                "placement_targets": [
+                    {
+                        "name": "default-placement",
+                        "tags": []
+                    }
+                ],
+                "default_placement": "default-placement",
+                "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
+            }
+        ],
+        "short_zone_ids": [
+            {
+                "key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+                "val": 630926044
+            },
+            {
+                "key": "950c1a43-6836-41a2-a161-64777e07e8b8",
+                "val": 4276257543
+            },
+            {
+                "key": "d9522067-cb7b-4129-8751-591e45815b16",
+                "val": 329470157
+            }
+        ]
+    },
+    "master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
+    "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
+    "period_config": {
+        "bucket_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        },
+        "user_quota": {
+            "enabled": false,
+            "max_size_kb": -1,
+            "max_objects": -1
+        }
+    },
+    "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
+    "realm_name": "gold",
+    "realm_epoch": 2
+    }
+
+You can observe that the period epoch number has incremented, indicating a
+change in the configuration
+
+Starting the Ceph Object Gateway
+--------------------------------
+
+This is similar to starting the object gateway in the first zone, only
+difference being in the ``rgw zone`` configurable, which should reflect ``us-west``::
+
+  [client.rgw.us-east-1]
+  rgw_frontends="civetweb port=80"
+  rgw_zone=us-west
+
+And start the radosgw depending on your Operating system's init system, for eg::
+
+  $ sudo systemctl start ceph-radosgw.service
+
+
+.. _`Ceph Object Gateway - Create Pools`: ../config#create_pools
diff --git a/doc/radosgw/multitenancy.rst b/doc/radosgw/multitenancy.rst
new file mode 100644
index 0000000..1756112
--- /dev/null
+++ b/doc/radosgw/multitenancy.rst
@@ -0,0 +1,102 @@
+=================
+RGW Multi-tenancy
+=================
+
+.. versionadded:: Jewel
+
+The multi-tenancy feature allows to use buckets and users of the same
+name simultaneously by segregating them under so-called ``tenants``.
+This may be useful, for instance, to permit users of Swift API to
+create buckets with easily conflicting names such as "test" or "trove".
+
+From the Jewel release onward, each user and bucket lies under a tenant.
+For compatibility, a "legacy" tenant with an empty name is provided.
+Whenever a bucket is referred without an explicit tenant, an implicit
+tenant is used, taken from the user performing the operation. Since
+the pre-existing users are under the legacy tenant, they continue
+to create and access buckets as before. The layout of objects in RADOS
+is extended in a compatible way, ensuring a smooth upgrade to Jewel.
+
+Administering Users With Explicit Tenants
+=========================================
+
+Tenants as such do not have any operations on them. They appear and
+and disappear as needed, when users are administered. In order to create,
+modify, and remove users with explicit tenants, either an additional
+option --tenant is supplied, or a syntax "<tenant>$<user>" is used
+in the parameters of the radosgw-admin command.
+
+Examples
+--------
+
+Create a user testx$tester to be accessed with S3::
+
+  # radosgw-admin --tenant testx --uid tester --display-name "Test User" --access_key TESTER --secret test123 user create
+
+Create a user testx$tester to be accessed with Swift::
+
+  # radosgw-admin --tenant testx --uid tester --display-name "Test User" --subuser tester:test --key-type swift --access full user create
+  # radosgw-admin --subuser 'testx$tester:test' --key-type swift --secret test123
+
+Note that the subuser with explicit tenant had to be quoted in the shell.
+
+Accessing Buckets with Explicit Tenants
+=======================================
+
+When a client application accesses buckets, it always operates with
+credentials of a particular user. As mentioned above, every user belongs
+to a tenant. Therefore, every operation has an implicit tenant in its
+context, to be used if no tenant is specified explicitly. Thus a complete
+compatibility is maintained with previous releases, as long as the
+referred buckets and referring user belong to the same tenant.
+In other words, anything unusual occurs when accessing another tenant's
+buckets *only*.
+
+Extensions employed to specify an explicit tenant differ according
+to the protocol and authentication system used.
+
+S3
+--
+
+In case of S3, a colon character is used to separate tenant and bucket.
+Thus a sample URL would be::
+
+  https://ep.host.dom/tenant:bucket
+
+Here's a simple Python sample::
+
+    from boto.s3.connection import S3Connection, OrdinaryCallingFormat
+    c = S3Connection(
+        aws_access_key_id="TESTER",
+        aws_secret_access_key="test123",
+        host="ep.host.dom",
+        calling_format = OrdinaryCallingFormat())
+    bucket = c.get_bucket("test5b:testbucket")
+
+Note that it's not possible to supply an explicit tenant using
+a hostname. Hostnames cannot contain colons, or any other separators
+that are not already valid in bucket names. Using a period creates an
+ambiguous syntax. Therefore, the bucket-in-URL-path format has to be
+used.
+
+Swift with built-in authenticator
+---------------------------------
+
+TBD -- not in test_multen.py yet
+
+Swift with Keystone
+-------------------
+
+TBD -- don't forget to explain the function of
+       rgw keystone implicit tenants = true
+       in commit e9259486decab52a362443d3fd3dec33b0ec654f
+
+Notes and known issues
+----------------------
+
+Just to be clear, it is not possible to create buckets in other
+tenants at present. The owner of newly created bucket is extracted
+from authentication information.
+
+This document needs examples of administration of Keystone users.
+The keystone.rst may need to be updated.
diff --git a/doc/radosgw/rgw-centos.conf b/doc/radosgw/rgw-centos.conf
new file mode 100644
index 0000000..54ef72c
--- /dev/null
+++ b/doc/radosgw/rgw-centos.conf
@@ -0,0 +1,30 @@
+FastCgiExternalServer /var/www/html/s3gw.fcgi -socket /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
+
+
+<VirtualHost *:80>
+
+	ServerName {fqdn}
+	<!--Remove the comment. Add a server alias with *.{fqdn} for S3 subdomains-->
+	<!--ServerAlias *.{fqdn}-->
+	ServerAdmin {email.address}
+	DocumentRoot /var/www/html
+	RewriteEngine On
+	RewriteRule  ^/(.*) /s3gw.fcgi?%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+	<IfModule mod_fastcgi.c>
+   	<Directory /var/www/html>
+			Options +ExecCGI
+			AllowOverride All
+			SetHandler fastcgi-script
+			Order allow,deny
+			Allow from all
+			AuthBasicAuthoritative Off
+		</Directory>
+	</IfModule>
+
+	AllowEncodedSlashes On
+	ErrorLog /var/log/httpd/error.log
+	CustomLog /var/log/httpd/access.log combined
+	ServerSignature Off
+
+</VirtualHost>
\ No newline at end of file
diff --git a/doc/radosgw/rgw-debian.conf b/doc/radosgw/rgw-debian.conf
new file mode 100644
index 0000000..127805e
--- /dev/null
+++ b/doc/radosgw/rgw-debian.conf
@@ -0,0 +1,29 @@
+FastCgiExternalServer /var/www/s3gw.fcgi -socket /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock
+
+<VirtualHost *:80>
+
+	ServerName {fqdn}
+	<!--Remove the comment. Add a server alias with *.{fqdn} for S3 subdomains-->
+	<!--ServerAlias *.{fqdn}-->
+	ServerAdmin {email.address}
+	DocumentRoot /var/www
+	RewriteEngine On
+	RewriteRule  ^/(.*) /s3gw.fcgi?%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+	<IfModule mod_fastcgi.c>
+   	<Directory /var/www>
+			Options +ExecCGI
+			AllowOverride All
+			SetHandler fastcgi-script
+			Order allow,deny
+			Allow from all
+			AuthBasicAuthoritative Off
+		</Directory>
+	</IfModule>
+
+	AllowEncodedSlashes On
+	ErrorLog /var/log/apache2/error.log
+	CustomLog /var/log/apache2/access.log combined
+	ServerSignature Off
+
+</VirtualHost>
\ No newline at end of file
diff --git a/doc/radosgw/rgw.conf b/doc/radosgw/rgw.conf
new file mode 100644
index 0000000..5e4cc08
--- /dev/null
+++ b/doc/radosgw/rgw.conf
@@ -0,0 +1,30 @@
+FastCgiExternalServer /var/www/s3gw.fcgi -socket /{path}/{socket-name}.sock
+
+
+<VirtualHost *:80>
+
+	ServerName {fqdn}
+	<!--Remove the comment. Add a server alias with *.{fqdn} for S3 subdomains-->
+	<!--ServerAlias *.{fqdn}-->
+	ServerAdmin {email.address}
+	DocumentRoot /var/www
+	RewriteEngine On
+	RewriteRule  ^/(.*) /s3gw.fcgi?%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+	<IfModule mod_fastcgi.c>
+   	<Directory /var/www>
+			Options +ExecCGI
+			AllowOverride All
+			SetHandler fastcgi-script
+			Order allow,deny
+			Allow from all
+			AuthBasicAuthoritative Off
+		</Directory>
+	</IfModule>
+
+	AllowEncodedSlashes On
+	ErrorLog /var/log/apache2/error.log
+	CustomLog /var/log/apache2/access.log combined
+	ServerSignature Off
+
+</VirtualHost>
\ No newline at end of file
diff --git a/doc/radosgw/s3.rst b/doc/radosgw/s3.rst
new file mode 100644
index 0000000..67f497c
--- /dev/null
+++ b/doc/radosgw/s3.rst
@@ -0,0 +1,95 @@
+============================
+ Ceph Object Gateway S3 API
+============================
+
+Ceph supports a RESTful API that is compatible with the basic data access model of the `Amazon S3 API`_.
+
+API
+---
+
+.. toctree::
+   :maxdepth: 1
+
+   Common <s3/commons>
+   Authentication <s3/authentication>
+   Service Ops <s3/serviceops>
+   Bucket Ops <s3/bucketops>
+   Object Ops <s3/objectops>
+   C++ <s3/cpp>
+   C# <s3/csharp>
+   Java <s3/java>
+   Perl <s3/perl>
+   PHP <s3/php>
+   Python <s3/python>
+   Ruby <s3/ruby>
+
+
+Features Support
+----------------
+
+The following table describes the support status for current Amazon S3 functional features:
+
++---------------------------------+-----------------+----------------------------------------+
+| Feature                         | Status          | Remarks                                |
++=================================+=================+========================================+
+| **List Buckets**                | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Bucket**               | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Bucket**               | Supported       | Different set of canned ACLs           |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket Lifecycle**            | Not Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Policy (Buckets, Objects)**   | Not Supported   | ACLs are supported                     |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket Website**              | Not Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket ACLs (Get, Put)**      | Supported       | Different set of canned ACLs           |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket Location**             | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket Notification**         | Not Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket Object Versions**      | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Bucket Info (HEAD)**      | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Bucket Request Payment**      | Not Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Put Object**                  | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Object**               | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Object**                  | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Object ACLs (Get, Put)**      | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Object Info (HEAD)**      | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **POST Object**                 | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Copy Object**                 | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Multipart Uploads**           | Supported       | (missing Copy Part)                    |
++---------------------------------+-----------------+----------------------------------------+
+
+Unsupported Header Fields
+-------------------------
+
+The following common request header fields are not supported:
+
++----------------------------+------------+
+| Name                       | Type       |
++============================+============+
+| **x-amz-security-token**   | Request    |
++----------------------------+------------+
+| **Server**                 | Response   |
++----------------------------+------------+
+| **x-amz-delete-marker**    | Response   |
++----------------------------+------------+
+| **x-amz-id-2**             | Response   |
++----------------------------+------------+
+| **x-amz-version-id**       | Response   |
++----------------------------+------------+
+
+.. _Amazon S3 API: http://docs.aws.amazon.com/AmazonS3/latest/API/APIRest.html
diff --git a/doc/radosgw/s3/authentication.rst b/doc/radosgw/s3/authentication.rst
new file mode 100644
index 0000000..b187538
--- /dev/null
+++ b/doc/radosgw/s3/authentication.rst
@@ -0,0 +1,75 @@
+=========================
+ Authentication and ACLs
+=========================
+
+Requests to the RADOS Gateway (RGW) can be either authenticated or 
+unauthenticated. RGW assumes unauthenticated requests are sent by an anonymous 
+user. RGW supports canned ACLs.
+
+Authentication
+--------------
+Authenticating a request requires including an access key and a Hash-based 
+Message Authentication Code (HMAC) in the request before it is sent to the 
+RGW server. RGW uses an S3-compatible authentication approach. 
+
+::
+
+	HTTP/1.1
+	PUT /buckets/bucket/object.mpeg
+	Host: cname.domain.com
+	Date: Mon, 2 Jan 2012 00:01:01 +0000
+	Content-Encoding: mpeg	
+	Content-Length: 9999999
+
+	Authorization: AWS {access-key}:{hash-of-header-and-secret}
+
+In the foregoing example, replace ``{access-key}`` with the value for your access 
+key ID followed by a colon (``:``). Replace ``{hash-of-header-and-secret}`` with 
+a hash of the header string and the secret corresponding to the access key ID.
+
+To generate the hash of the header string and secret, you must:
+
+#. Get the value of the header string.
+#. Normalize the request header string into canonical form. 
+#. Generate an HMAC using a SHA-1 hashing algorithm.
+   See `RFC 2104`_ and `HMAC`_ for details.
+#. Encode the ``hmac`` result as base-64.
+
+To normalize the header into canonical form: 
+
+#. Get all fields beginning with ``x-amz-``.
+#. Ensure that the fields are all lowercase.
+#. Sort the fields lexicographically. 
+#. Combine multiple instances of the same field name into a 
+   single field and separate the field values with a comma.
+#. Replace white space and line breaks in field values with a single space.
+#. Remove white space before and after colons.
+#. Append a new line after each field.
+#. Merge the fields back into the header.
+
+Replace the ``{hash-of-header-and-secret}`` with the base-64 encoded HMAC string.
+
+Access Control Lists (ACLs)
+---------------------------
+
+RGW supports S3-compatible ACL functionality. An ACL is a list of access grants
+that specify which operations a user can perform on a bucket or on an object.
+Each grant has a different meaning when applied to a bucket versus applied to 
+an object:
+
++------------------+--------------------------------------------------------+----------------------------------------------+
+| Permission       | Bucket                                                 | Object                                       |
++==================+========================================================+==============================================+
+| ``READ``         | Grantee can list the objects in the bucket.            | Grantee can read the object.                 |
++------------------+--------------------------------------------------------+----------------------------------------------+
+| ``WRITE``        | Grantee can write or delete objects in the bucket.     | N/A                                          |
++------------------+--------------------------------------------------------+----------------------------------------------+
+| ``READ_ACP``     | Grantee can read bucket ACL.                           | Grantee can read the object ACL.             |
++------------------+--------------------------------------------------------+----------------------------------------------+
+| ``WRITE_ACP``    | Grantee can write bucket ACL.                          | Grantee can write to the object ACL.         |
++------------------+--------------------------------------------------------+----------------------------------------------+
+| ``FULL_CONTROL`` | Grantee has full permissions for object in the bucket. | Grantee can read or write to the object ACL. |
++------------------+--------------------------------------------------------+----------------------------------------------+
+
+.. _RFC 2104: http://www.ietf.org/rfc/rfc2104.txt
+.. _HMAC: http://en.wikipedia.org/wiki/HMAC
diff --git a/doc/radosgw/s3/bucketops.rst b/doc/radosgw/s3/bucketops.rst
new file mode 100644
index 0000000..95457b7
--- /dev/null
+++ b/doc/radosgw/s3/bucketops.rst
@@ -0,0 +1,377 @@
+===================
+ Bucket Operations
+===================
+
+PUT Bucket
+----------
+Creates a new bucket. To create a bucket, you must have a user ID and a valid AWS Access Key ID to authenticate requests. You may not
+create buckets as an anonymous user.
+
+.. note:: We do not support request entities for ``PUT /{bucket}`` in this release.
+
+Constraints
+~~~~~~~~~~~
+In general, bucket names should follow domain name constraints.
+
+- Bucket names must be unique.
+- Bucket names must begin and end with a lowercase letter.
+- Bucket names may contain a dash (-).
+
+Syntax
+~~~~~~
+
+::
+
+    PUT /{bucket} HTTP/1.1
+    Host: cname.domain.com
+    x-amz-acl: public-read-write
+
+    Authorization: AWS {access-key}:{hash-of-header-and-secret}
+
+Parameters
+~~~~~~~~~~
+
++---------------+----------------------+-----------------------------------------------------------------------------+------------+
+| Name          | Description          | Valid Values                                                                | Required   |
++===============+======================+=============================================================================+============+
+| ``x-amz-acl`` | Canned ACLs.         | ``private``, ``public-read``, ``public-read-write``, ``authenticated-read`` | No         |
++---------------+----------------------+-----------------------------------------------------------------------------+------------+
+
+
+
+HTTP Response
+~~~~~~~~~~~~~
+
+If the bucket name is unique, within constraints and unused, the operation will succeed.
+If a bucket with the same name already exists and the user is the bucket owner, the operation will succeed.
+If the bucket name is already in use, the operation will fail.
+
++---------------+-----------------------+----------------------------------------------------------+
+| HTTP Status   | Status Code           | Description                                              |
++===============+=======================+==========================================================+
+| ``409``       | BucketAlreadyExists   | Bucket already exists under different user's ownership.  |
++---------------+-----------------------+----------------------------------------------------------+
+
+DELETE Bucket
+-------------
+
+Deletes a bucket. You can reuse bucket names following a successful bucket removal.
+
+Syntax
+~~~~~~
+
+::
+
+    DELETE /{bucket} HTTP/1.1
+    Host: cname.domain.com
+
+    Authorization: AWS {access-key}:{hash-of-header-and-secret}
+
+HTTP Response
+~~~~~~~~~~~~~
+
++---------------+---------------+------------------+
+| HTTP Status   | Status Code   | Description      |
++===============+===============+==================+
+| ``204``       | No Content    | Bucket removed.  |
++---------------+---------------+------------------+
+
+GET Bucket
+----------
+Returns a list of bucket objects.
+
+Syntax
+~~~~~~
+
+::
+
+    GET /{bucket}?max-keys=25 HTTP/1.1
+    Host: cname.domain.com
+
+Parameters
+~~~~~~~~~~
+
++-----------------+-----------+-----------------------------------------------------------------------+
+| Name            | Type      | Description                                                           |
++=================+===========+=======================================================================+
+| ``prefix``      | String    | Only returns objects that contain the specified prefix.               |
++-----------------+-----------+-----------------------------------------------------------------------+
+| ``delimiter``   | String    | The delimiter between the prefix and the rest of the object name.     |
++-----------------+-----------+-----------------------------------------------------------------------+
+| ``marker``      | String    | A beginning index for the list of objects returned.                   |
++-----------------+-----------+-----------------------------------------------------------------------+
+| ``max-keys``    | Integer   | The maximum number of keys to return. Default is 1000.                |
++-----------------+-----------+-----------------------------------------------------------------------+
+
+
+HTTP Response
+~~~~~~~~~~~~~
+
++---------------+---------------+--------------------+
+| HTTP Status   | Status Code   | Description        |
++===============+===============+====================+
+| ``200``       | OK            | Buckets retrieved  |
++---------------+---------------+--------------------+
+
+Bucket Response Entities
+~~~~~~~~~~~~~~~~~~~~~~~~
+``GET /{bucket}`` returns a container for buckets with the following fields.
+
++------------------------+-----------+----------------------------------------------------------------------------------+
+| Name                   | Type      | Description                                                                      |
++========================+===========+==================================================================================+
+| ``ListBucketResult``   | Entity    | The container for the list of objects.                                           |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``Name``               | String    | The name of the bucket whose contents will be returned.                          |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``Prefix``             | String    | A prefix for the object keys.                                                    |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``Marker``             | String    | A beginning index for the list of objects returned.                              |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``MaxKeys``            | Integer   | The maximum number of keys returned.                                             |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``Delimiter``          | String    | If set, objects with the same prefix will appear in the ``CommonPrefixes`` list. |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``IsTruncated``        | Boolean   | If ``true``, only a subset of the bucket's contents were returned.               |
++------------------------+-----------+----------------------------------------------------------------------------------+
+| ``CommonPrefixes``     | Container | If multiple objects contain the same prefix, they will appear in this list.      |
++------------------------+-----------+----------------------------------------------------------------------------------+
+
+Object Response Entities
+~~~~~~~~~~~~~~~~~~~~~~~~
+The ``ListBucketResult`` contains objects, where each object is within a ``Contents`` container.
+
++------------------------+-----------+------------------------------------------+
+| Name                   | Type      | Description                              |
++========================+===========+==========================================+
+| ``Contents``           | Object    | A container for the object.              |
++------------------------+-----------+------------------------------------------+
+| ``Key``                | String    | The object's key.                        |
++------------------------+-----------+------------------------------------------+
+| ``LastModified``       | Date      | The object's last-modified date/time.    |
++------------------------+-----------+------------------------------------------+
+| ``ETag``               | String    | An MD-5 hash of the object. (entity tag) |
++------------------------+-----------+------------------------------------------+
+| ``Size``               | Integer   | The object's size.                       |
++------------------------+-----------+------------------------------------------+
+| ``StorageClass``       | String    | Should always return ``STANDARD``.       |
++------------------------+-----------+------------------------------------------+
+
+Get Bucket Location
+-------------------
+Retrieves the bucket's region. The user needs to be the bucket owner
+to call this. A bucket can be constrained to a region by providing
+``LocationConstraint`` during a PUT request.
+
+Syntax
+~~~~~~
+Add the ``location`` subresource to bucket resource as shown below
+
+::
+
+   GET /{bucket}?location HTTP/1.1
+   Host: cname.domain.com
+
+   Authorization: AWS {access-key}:{hash-of-header-and-secret}
+
+Response Entities
+~~~~~~~~~~~~~~~~~~~~~~~~
+
++------------------------+-----------+------------------------------------------+
+| Name                   | Type      | Description                              |
++========================+===========+==========================================+
+| ``LocationConstraint`` | String    | The region where bucket resides, empty   |
+|                        |           | string for defult region                 |
++------------------------+-----------+------------------------------------------+
+
+
+
+Get Bucket ACL
+--------------
+Retrieves the bucket access control list. The user needs to be the bucket
+owner or to have been granted ``READ_ACP`` permission on the bucket.
+
+Syntax
+~~~~~~
+Add the ``acl`` subresource to the bucket request as shown below.
+
+::
+
+    GET /{bucket}?acl HTTP/1.1
+    Host: cname.domain.com
+
+    Authorization: AWS {access-key}:{hash-of-header-and-secret}
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| Name                      | Type        | Description                                                                                  |
++===========================+=============+==============================================================================================+
+| ``AccessControlPolicy``   | Container   | A container for the response.                                                                |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``AccessControlList``     | Container   | A container for the ACL information.                                                         |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Owner``                 | Container   | A container for the bucket owner's ``ID`` and ``DisplayName``.                               |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``ID``                    | String      | The bucket owner's ID.                                                                       |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``DisplayName``           | String      | The bucket owner's display name.                                                             |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grant``                 | Container   | A container for ``Grantee`` and ``Permission``.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grantee``               | Container   | A container for the ``DisplayName`` and ``ID`` of the user receiving a grant of permission.  |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Permission``            | String      | The permission given to the ``Grantee`` bucket.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+
+PUT Bucket ACL
+--------------
+Sets an access control to an existing bucket. The user needs to be the bucket
+owner or to have been granted ``WRITE_ACP`` permission on the bucket.
+
+Syntax
+~~~~~~
+Add the ``acl`` subresource to the bucket request as shown below.
+
+::
+
+    PUT /{bucket}?acl HTTP/1.1
+
+Request Entities
+~~~~~~~~~~~~~~~~
+
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| Name                      | Type        | Description                                                                                  |
++===========================+=============+==============================================================================================+
+| ``AccessControlPolicy``   | Container   | A container for the request.                                                                 |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``AccessControlList``     | Container   | A container for the ACL information.                                                         |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Owner``                 | Container   | A container for the bucket owner's ``ID`` and ``DisplayName``.                               |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``ID``                    | String      | The bucket owner's ID.                                                                       |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``DisplayName``           | String      | The bucket owner's display name.                                                             |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grant``                 | Container   | A container for ``Grantee`` and ``Permission``.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grantee``               | Container   | A container for the ``DisplayName`` and ``ID`` of the user receiving a grant of permission.  |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Permission``            | String      | The permission given to the ``Grantee`` bucket.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+
+List Bucket Multipart Uploads
+-----------------------------
+
+``GET /?uploads`` returns a list of the current in-progress multipart uploads--i.e., the application initiates a multipart upload, but
+the service hasn't completed all the uploads yet.
+
+Syntax
+~~~~~~
+
+::
+
+    GET /{bucket}?uploads HTTP/1.1
+
+Parameters
+~~~~~~~~~~
+
+You may specify parameters for ``GET /{bucket}?uploads``, but none of them are required.
+
++------------------------+-----------+--------------------------------------------------------------------------------------+
+| Name                   | Type      | Description                                                                          |
++========================+===========+======================================================================================+
+| ``prefix``             | String    | Returns in-progress uploads whose keys contains the specified prefix.                |
++------------------------+-----------+--------------------------------------------------------------------------------------+
+| ``delimiter``          | String    | The delimiter between the prefix and the rest of the object name.                    |
++------------------------+-----------+--------------------------------------------------------------------------------------+
+| ``key-marker``         | String    | The beginning marker for the list of uploads.                                        |
++------------------------+-----------+--------------------------------------------------------------------------------------+
+| ``max-keys``           | Integer   | The maximum number of in-progress uploads. The default is 1000.                      |
++------------------------+-----------+--------------------------------------------------------------------------------------+
+| ``max-uploads``        | Integer   | The maximum number of multipart uploads. The range from 1-1000. The default is 1000. |
++------------------------+-----------+--------------------------------------------------------------------------------------+
+| ``upload-id-marker``   | String    | Ignored if ``key-marker`` isn't specified. Specifies the ``ID`` of first             |
+|                        |           | upload to list in lexicographical order at or following the ``ID``.                  |
++------------------------+-----------+--------------------------------------------------------------------------------------+
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| Name                                    | Type        | Description                                                                                              |
++=========================================+=============+==========================================================================================================+
+| ``ListMultipartUploadsResult``          | Container   | A container for the results.                                                                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``ListMultipartUploadsResult.Prefix``   | String      | The prefix specified by the ``prefix`` request parameter (if any).                                       |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Bucket``                              | String      | The bucket that will receive the bucket contents.                                                        |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``KeyMarker``                           | String      | The key marker specified by the ``key-marker`` request parameter (if any).                               |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``UploadIdMarker``                      | String      | The marker specified by the ``upload-id-marker`` request parameter (if any).                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``NextKeyMarker``                       | String      | The key marker to use in a subsequent request if ``IsTruncated`` is ``true``.                            |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``NextUploadIdMarker``                  | String      | The upload ID marker to use in a subsequent request if ``IsTruncated`` is ``true``.                      |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``MaxUploads``                          | Integer     | The max uploads specified by the ``max-uploads`` request parameter.                                      |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Delimiter``                           | String      | If set, objects with the same prefix will appear in the ``CommonPrefixes`` list.                         |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``IsTruncated``                         | Boolean     | If ``true``, only a subset of the bucket's upload contents were returned.                                |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Upload``                              | Container   | A container for ``Key``, ``UploadId``, ``InitiatorOwner``, ``StorageClass``, and ``Initiated`` elements. |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Key``                                 | String      | The key of the object once the multipart upload is complete.                                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``UploadId``                            | String      | The ``ID`` that identifies the multipart upload.                                                         |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Initiator``                           | Container   | Contains the ``ID`` and ``DisplayName`` of the user who initiated the upload.                            |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``DisplayName``                         | String      | The initiator's display name.                                                                            |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``ID``                                  | String      | The initiator's ID.                                                                                      |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Owner``                               | Container   | A container for the ``ID`` and ``DisplayName`` of the user who owns the uploaded object.                 |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``StorageClass``                        | String      | The method used to store the resulting object. ``STANDARD`` or ``REDUCED_REDUNDANCY``                    |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Initiated``                           | Date        | The date and time the user initiated the upload.                                                         |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``CommonPrefixes``                      | Container   | If multiple objects contain the same prefix, they will appear in this list.                              |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``CommonPrefixes.Prefix``               | String      | The substring of the key after the prefix as defined by the ``prefix`` request parameter.                |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+
+ENABLE/SUSPEND BUCKET VERSIONING
+--------------------------------
+
+``PUT /?versioning`` This subresource set the versioning state of an existing bucket. To set the versioning state, you must be the bucket owner.
+
+You can set the versioning state with one of the following values:
+
+- Enabled : Enables versioning for the objects in the bucket, All objects added to the bucket receive a unique version ID.
+- Suspended : Disables versioning for the objects in the bucket, All objects added to the bucket receive the version ID null.
+
+If the versioning state has never been set on a bucket, it has no versioning state; a GET versioning request does not return a versioning state value.
+
+Syntax
+~~~~~~
+
+::
+
+    PUT  /{bucket}?versioning  HTTP/1.1
+
+REQUEST ENTITIES
+~~~~~~~~~~~~~~~~
+
++-----------------------------+-----------+---------------------------------------------------------------------------+
+| Name                        | Type      | Description                                                               |
++=============================+===========+===========================================================================+
+| ``VersioningConfiguration`` | Container | A container for the request.                                              |
++-----------------------------+-----------+---------------------------------------------------------------------------+
+| ``Status``                  | String    | Sets the versioning state of the bucket.  Valid Values: Suspended/Enabled |
++-----------------------------+-----------+---------------------------------------------------------------------------+
\ No newline at end of file
diff --git a/doc/radosgw/s3/commons.rst b/doc/radosgw/s3/commons.rst
new file mode 100644
index 0000000..14e6fd0
--- /dev/null
+++ b/doc/radosgw/s3/commons.rst
@@ -0,0 +1,107 @@
+=================
+ Common Entities
+=================
+
+.. toctree::
+   :maxdepth: -1
+
+Bucket and Host Name
+--------------------
+There are two different modes of accessing the buckets. The first (preferred) method
+identifies the bucket as the top-level directory in the URI. ::
+
+	GET /mybucket HTTP/1.1
+	Host: cname.domain.com
+
+The second method identifies the bucket via a virtual bucket host name. For example::
+
+	GET / HTTP/1.1
+	Host: mybucket.cname.domain.com
+
+.. tip:: We prefer the first method, because the second method requires expensive domain certification and DNS wild cards.
+
+Common Request Headers
+----------------------
+
++--------------------+------------------------------------------+
+| Request Header     | Description                              |
++====================+==========================================+
+| ``CONTENT_LENGTH`` | Length of the request body.              |
++--------------------+------------------------------------------+
+| ``DATE``           | Request time and date (in UTC).          |
++--------------------+------------------------------------------+
+| ``HOST``           | The name of the host server.             |
++--------------------+------------------------------------------+
+| ``AUTHORIZATION``  | Authorization token.                     |
++--------------------+------------------------------------------+
+
+Common Response Status
+----------------------
+
++---------------+-----------------------------------+
+| HTTP Status   | Response Code                     |
++===============+===================================+
+| ``100``       | Continue                          |
++---------------+-----------------------------------+
+| ``200``       | Success                           |
++---------------+-----------------------------------+
+| ``201``       | Created                           |
++---------------+-----------------------------------+
+| ``202``       | Accepted                          |
++---------------+-----------------------------------+
+| ``204``       | NoContent                         |
++---------------+-----------------------------------+
+| ``206``       | Partial content                   |
++---------------+-----------------------------------+
+| ``304``       | NotModified                       |
++---------------+-----------------------------------+
+| ``400``       | InvalidArgument                   |
++---------------+-----------------------------------+
+| ``400``       | InvalidDigest                     |
++---------------+-----------------------------------+
+| ``400``       | BadDigest                         |
++---------------+-----------------------------------+
+| ``400``       | InvalidBucketName                 |
++---------------+-----------------------------------+
+| ``400``       | InvalidObjectName                 |
++---------------+-----------------------------------+
+| ``400``       | UnresolvableGrantByEmailAddress   |
++---------------+-----------------------------------+
+| ``400``       | InvalidPart                       |
++---------------+-----------------------------------+
+| ``400``       | InvalidPartOrder                  |
++---------------+-----------------------------------+
+| ``400``       | RequestTimeout                    |
++---------------+-----------------------------------+
+| ``400``       | EntityTooLarge                    |
++---------------+-----------------------------------+
+| ``403``       | AccessDenied                      |
++---------------+-----------------------------------+
+| ``403``       | UserSuspended                     |
++---------------+-----------------------------------+
+| ``403``       | RequestTimeTooSkewed              |
++---------------+-----------------------------------+
+| ``404``       | NoSuchKey                         |
++---------------+-----------------------------------+
+| ``404``       | NoSuchBucket                      |
++---------------+-----------------------------------+
+| ``404``       | NoSuchUpload                      |
++---------------+-----------------------------------+
+| ``405``       | MethodNotAllowed                  |
++---------------+-----------------------------------+
+| ``408``       | RequestTimeout                    |
++---------------+-----------------------------------+
+| ``409``       | BucketAlreadyExists               |
++---------------+-----------------------------------+
+| ``409``       | BucketNotEmpty                    |
++---------------+-----------------------------------+
+| ``411``       | MissingContentLength              |
++---------------+-----------------------------------+
+| ``412``       | PreconditionFailed                |
++---------------+-----------------------------------+
+| ``416``       | InvalidRange                      |
++---------------+-----------------------------------+
+| ``422``       | UnprocessableEntity               |
++---------------+-----------------------------------+
+| ``500``       | InternalError                     |
++---------------+-----------------------------------+
diff --git a/doc/radosgw/s3/cpp.rst b/doc/radosgw/s3/cpp.rst
new file mode 100644
index 0000000..ef555a7
--- /dev/null
+++ b/doc/radosgw/s3/cpp.rst
@@ -0,0 +1,331 @@
+.. _cpp:
+
+C++ S3 Examples
+===============
+
+Setup
+-----
+
+The following contains includes and globals that will be used in later examples:
+
+.. code-block:: cpp
+
+	#include "libs3.h"
+	#include <stdlib.h>
+	#include <iostream>
+	#include <fstream>
+
+	const char access_key[] = "ACCESS_KEY";
+	const char secret_key[] = "SECRET_KEY";
+	const char host[] = "HOST";
+	const char sample_bucket[] = "sample_bucket";
+	const char sample_key[] = "hello.txt";
+	const char sample_file[] = "resource/hello.txt";
+
+	S3BucketContext bucketContext =
+	{
+		host,
+		sample_bucket,
+		S3ProtocolHTTP,
+		S3UriStylePath,
+		access_key,
+		secret_key
+	};
+
+	S3Status responsePropertiesCallback(
+			const S3ResponseProperties *properties,
+			void *callbackData)
+	{
+		return S3StatusOK;
+	}
+
+	static void responseCompleteCallback(
+			S3Status status,
+			const S3ErrorDetails *error,
+			void *callbackData)
+	{
+		return;
+	}
+
+	S3ResponseHandler responseHandler =
+	{
+		&responsePropertiesCallback,
+		&responseCompleteCallback
+	};
+
+
+Creating (and Closing) a Connection
+-----------------------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: cpp
+
+	S3_initialize("s3", S3_INIT_ALL, host);
+	// Do stuff...
+	S3_deinitialize();
+
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of Buckets that you own.
+This also prints out the bucket name, owner ID, and display name
+for each bucket.
+
+.. code-block:: cpp
+
+	static S3Status listServiceCallback(
+			const char *ownerId,
+			const char *ownerDisplayName,
+			const char *bucketName,
+			int64_t creationDate, void *callbackData)
+	{
+		bool *header_printed = (bool*) callbackData;
+		if (!*header_printed) {
+			*header_printed = true;
+			printf("%-22s", "       Bucket");
+			printf("  %-20s  %-12s", "     Owner ID", "Display Name");
+			printf("\n");
+			printf("----------------------");
+			printf("  --------------------" "  ------------");
+			printf("\n");
+		}
+
+		printf("%-22s", bucketName);
+		printf("  %-20s  %-12s", ownerId ? ownerId : "", ownerDisplayName ? ownerDisplayName : "");
+		printf("\n");
+
+		return S3StatusOK;
+	}
+
+	S3ListServiceHandler listServiceHandler =
+	{
+		responseHandler,
+		&listServiceCallback
+	};
+	bool header_printed = false;
+	S3_list_service(S3ProtocolHTTP, access_key, secret_key, host, 0, &listServiceHandler, &header_printed);
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket.
+
+.. code-block:: cpp
+
+	S3_create_bucket(S3ProtocolHTTP, access_key, secret_key, host, sample_bucket, S3CannedAclPrivate, NULL, NULL, &responseHandler, NULL);
+
+
+Listing a Bucket's Content
+--------------------------
+
+This gets a list of objects in the bucket.
+This also prints out each object's name, the file size, and
+last modified date.
+
+.. code-block:: cpp
+
+	static S3Status listBucketCallback(
+			int isTruncated,
+			const char *nextMarker,
+			int contentsCount,
+			const S3ListBucketContent *contents,
+			int commonPrefixesCount,
+			const char **commonPrefixes,
+			void *callbackData)
+	{
+		printf("%-22s",	"      Object Name");
+		printf("  %-5s  %-20s", "Size", "   Last Modified");
+		printf("\n");
+		printf("----------------------");
+		printf("  -----" "  --------------------");
+		printf("\n");
+
+	    for (int i = 0; i < contentsCount; i++) {
+		char timebuf[256];
+			char sizebuf[16];
+		const S3ListBucketContent *content = &(contents[i]);
+			time_t t = (time_t) content->lastModified;
+
+			strftime(timebuf, sizeof(timebuf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&t));
+			sprintf(sizebuf, "%5llu", (unsigned long long) content->size);
+			printf("%-22s  %s  %s\n", content->key, sizebuf, timebuf);
+	    }
+
+	    return S3StatusOK;
+	}
+
+	S3ListBucketHandler listBucketHandler =
+	{
+		responseHandler,
+		&listBucketCallback
+	};
+	S3_list_bucket(&bucketContext, NULL, NULL, NULL, 0, NULL, &listBucketHandler, NULL);
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+
+.. note::
+
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: cpp
+
+	S3_delete_bucket(S3ProtocolHTTP, S3UriStylePath, access_key, secret_key, host, sample_bucket, NULL, &responseHandler, NULL);
+
+
+Creating an Object (from a file)
+--------------------------------
+
+This creates a file ``hello.txt``.
+
+.. code-block:: cpp
+
+	#include <sys/stat.h>
+	typedef struct put_object_callback_data
+	{
+	    FILE *infile;
+	    uint64_t contentLength;
+	} put_object_callback_data;
+
+
+	static int putObjectDataCallback(int bufferSize, char *buffer, void *callbackData)
+	{
+	    put_object_callback_data *data = (put_object_callback_data *) callbackData;
+
+	    int ret = 0;
+
+	    if (data->contentLength) {
+		int toRead = ((data->contentLength > (unsigned) bufferSize) ? (unsigned) bufferSize : data->contentLength);
+			ret = fread(buffer, 1, toRead, data->infile);
+	    }
+	    data->contentLength -= ret;
+	    return ret;
+	}
+
+	put_object_callback_data data;
+	struct stat statbuf;
+	if (stat(sample_file, &statbuf) == -1) {
+		fprintf(stderr, "\nERROR: Failed to stat file %s: ", sample_file);
+		perror(0);
+		exit(-1);
+	}
+
+	int contentLength = statbuf.st_size;
+	data.contentLength = contentLength;
+
+	if (!(data.infile = fopen(sample_file, "r"))) {
+		fprintf(stderr, "\nERROR: Failed to open input file %s: ", sample_file);
+		perror(0);
+		exit(-1);
+	}
+
+	S3PutObjectHandler putObjectHandler =
+	{
+		responseHandler,
+		&putObjectDataCallback
+	};
+
+	S3_put_object(&bucketContext, sample_key, contentLength, NULL, NULL, &putObjectHandler, &data);
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads a file and prints the contents.
+
+.. code-block:: cpp
+
+	static S3Status getObjectDataCallback(int bufferSize, const char *buffer, void *callbackData)
+	{
+		FILE *outfile = (FILE *) callbackData;
+		size_t wrote = fwrite(buffer, 1, bufferSize, outfile);
+		return ((wrote < (size_t) bufferSize) ? S3StatusAbortedByCallback : S3StatusOK);
+	}
+
+	S3GetObjectHandler getObjectHandler =
+	{
+		responseHandler,
+		&getObjectDataCallback
+	};
+	FILE *outfile = stdout;
+	S3_get_object(&bucketContext, sample_key, NULL, 0, 0, NULL, &getObjectHandler, outfile);
+
+
+Delete an Object
+----------------
+
+This deletes an object.
+
+.. code-block:: cpp
+
+	S3ResponseHandler deleteResponseHandler =
+	{
+		0,
+		&responseCompleteCallback
+	};
+	S3_delete_object(&bucketContext, sample_key, 0, &deleteResponseHandler, 0);
+
+
+Change an Object's ACL
+----------------------
+
+This changes an object's ACL to grant full control to another user.
+
+
+.. code-block:: cpp
+
+	#include <string.h>
+	char ownerId[] = "owner";
+	char ownerDisplayName[] = "owner";
+	char granteeId[] = "grantee";
+	char granteeDisplayName[] = "grantee";
+
+	S3AclGrant grants[] = {
+		{
+			S3GranteeTypeCanonicalUser,
+			{{}},
+			S3PermissionFullControl
+		},
+		{
+			S3GranteeTypeCanonicalUser,
+			{{}},
+			S3PermissionReadACP
+		},
+		{
+			S3GranteeTypeAllUsers,
+			{{}},
+			S3PermissionRead
+		}
+	};
+
+	strncpy(grants[0].grantee.canonicalUser.id, ownerId, S3_MAX_GRANTEE_USER_ID_SIZE);
+	strncpy(grants[0].grantee.canonicalUser.displayName, ownerDisplayName, S3_MAX_GRANTEE_DISPLAY_NAME_SIZE);
+
+	strncpy(grants[1].grantee.canonicalUser.id, granteeId, S3_MAX_GRANTEE_USER_ID_SIZE);
+	strncpy(grants[1].grantee.canonicalUser.displayName, granteeDisplayName, S3_MAX_GRANTEE_DISPLAY_NAME_SIZE);
+
+	S3_set_acl(&bucketContext, sample_key, ownerId, ownerDisplayName, 3, grants, 0, &responseHandler, 0);
+
+
+Generate Object Download URL (signed)
+-------------------------------------
+
+This generates a signed download URL that will be valid for 5 minutes.
+
+.. code-block:: cpp
+
+	#include <time.h>
+	char buffer[S3_MAX_AUTHENTICATED_QUERY_STRING_SIZE];
+	int64_t expires = time(NULL) + 60 * 5; // Current time + 5 minutes
+
+	S3_generate_authenticated_query_string(buffer, &bucketContext, sample_key, expires, NULL);
+
diff --git a/doc/radosgw/s3/csharp.rst b/doc/radosgw/s3/csharp.rst
new file mode 100644
index 0000000..af1c6e4
--- /dev/null
+++ b/doc/radosgw/s3/csharp.rst
@@ -0,0 +1,199 @@
+.. _csharp:
+
+C# S3 Examples
+==============
+
+Creating a Connection
+---------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: csharp
+
+	using System;
+	using Amazon;
+	using Amazon.S3;
+	using Amazon.S3.Model;
+
+	string accessKey = "put your access key here!";
+	string secretKey = "put your secret key here!";
+
+	AmazonS3Config config = new AmazonS3Config();
+	config.ServiceURL = "objects.dreamhost.com";
+
+	AmazonS3Client s3Client = new AmazonS3Client(
+		accessKey,
+		secretKey,
+		config
+		);
+
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of Buckets that you own.
+This also prints out the bucket name and creation date of each bucket.
+
+.. code-block:: csharp
+
+	ListBucketsResponse response = client.ListBuckets();
+	foreach (S3Bucket b in response.Buckets)
+	{
+		Console.WriteLine("{0}\t{1}", b.BucketName, b.CreationDate);
+	}
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+This creates a new bucket called ``my-new-bucket``
+
+.. code-block:: csharp
+
+	PutBucketRequest request = new PutBucketRequest();
+	request.BucketName = "my-new-bucket";
+	client.PutBucket(request);
+
+Listing a Bucket's Content
+--------------------------
+
+This gets a list of objects in the bucket.
+This also prints out each object's name, the file size, and last
+modified date.
+
+.. code-block:: csharp
+
+	ListObjectsRequest request = new ListObjectsRequest();
+	request.BucketName = "my-new-bucket";
+	ListObjectsResponse response = client.ListObjects(request);
+	foreach (S3Object o in response.S3Objects)
+	{
+		Console.WriteLine("{0}\t{1}\t{2}", o.Key, o.Size, o.LastModified);
+	}
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+
+.. note::
+
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: csharp
+
+	DeleteBucketRequest request = new DeleteBucketRequest();
+	request.BucketName = "my-new-bucket";
+	client.DeleteBucket(request);
+
+
+Forced Delete for Non-empty Buckets
+-----------------------------------
+
+.. attention::
+
+   not available
+
+
+Creating an Object
+------------------
+
+This creates a file ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: csharp
+
+	PutObjectRequest request = new PutObjectRequest();
+	request.BucketName  = "my-new-bucket";
+	request.Key         = "hello.txt";
+	request.ContentType = "text/plain";
+	request.ContentBody = "Hello World!";
+	client.PutObject(request);
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable, and
+``secret_plans.txt`` to be private.
+
+.. code-block:: csharp
+
+	PutACLRequest request = new PutACLRequest();
+	request.BucketName = "my-new-bucket";
+	request.Key        = "hello.txt";
+	request.CannedACL  = S3CannedACL.PublicRead;
+	client.PutACL(request);
+
+	PutACLRequest request2 = new PutACLRequest();
+	request2.BucketName = "my-new-bucket";
+	request2.Key        = "secret_plans.txt";
+	request2.CannedACL  = S3CannedACL.Private;
+	client.PutACL(request2);
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``perl_poetry.pdf`` and saves it in
+``C:\Users\larry\Documents``
+
+.. code-block:: csharp
+
+	GetObjectRequest request = new GetObjectRequest();
+	request.BucketName = "my-new-bucket";
+	request.Key        = "perl_poetry.pdf";
+	GetObjectResponse response = client.GetObject(request);
+	response.WriteResponseStreamToFile("C:\\Users\\larry\\Documents\\perl_poetry.pdf");
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: csharp
+
+	DeleteObjectRequest request = new DeleteObjectRequest();
+	request.BucketName = "my-new-bucket";
+	request.Key        = "goodbye.txt";
+	client.DeleteObject(request);
+
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+
+This generates an unsigned download URL for ``hello.txt``. This works
+because we made ``hello.txt`` public by setting the ACL above.
+This then generates a signed download URL for ``secret_plans.txt`` that
+will work for 1 hour. Signed download URLs will work for the time
+period even if the object is private (when the time period is up, the
+URL will stop working).
+
+.. note::
+
+   The C# S3 Library does not have a method for generating unsigned
+   URLs, so the following example only shows generating signed URLs.
+
+.. code-block:: csharp
+
+	GetPreSignedUrlRequest request = new GetPreSignedUrlRequest();
+	request.BucketName = "my-bucket-name";
+	request.Key        = "secret_plans.txt";
+	request.Expires    = DateTime.Now.AddHours(1);
+	request.Protocol   = Protocol.HTTP;
+	string url = client.GetPreSignedURL(request);
+	Console.WriteLine(url);
+
+The output of this will look something like::
+
+   http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
diff --git a/doc/radosgw/s3/java.rst b/doc/radosgw/s3/java.rst
new file mode 100644
index 0000000..468bf2f
--- /dev/null
+++ b/doc/radosgw/s3/java.rst
@@ -0,0 +1,212 @@
+.. _java:
+
+Java S3 Examples
+================
+
+Setup
+-----
+
+The following examples may require some or all of the following java
+classes to be imported:
+
+.. code-block:: java
+
+	import java.io.ByteArrayInputStream;
+	import java.io.File;
+	import java.util.List;
+	import com.amazonaws.auth.AWSCredentials;
+	import com.amazonaws.auth.BasicAWSCredentials;
+	import com.amazonaws.util.StringUtils;
+	import com.amazonaws.services.s3.AmazonS3;
+	import com.amazonaws.services.s3.AmazonS3Client;
+	import com.amazonaws.services.s3.model.Bucket;
+	import com.amazonaws.services.s3.model.CannedAccessControlList;
+	import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
+	import com.amazonaws.services.s3.model.GetObjectRequest;
+	import com.amazonaws.services.s3.model.ObjectListing;
+	import com.amazonaws.services.s3.model.ObjectMetadata;
+	import com.amazonaws.services.s3.model.S3ObjectSummary;
+
+
+If you are just testing the Ceph Object Storage services, consider
+using HTTP protocol instead of HTTPS protocol. 
+
+First, import the ``ClientConfiguration`` and ``Protocol`` classes. 
+
+.. code-block:: java
+
+	import com.amazonaws.ClientConfiguration;
+	import com.amazonaws.Protocol;
+
+
+Then, define the client configuration, and add the client configuration
+as an argument for the S3 client.
+
+.. code-block:: java
+
+	AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
+			 	
+	ClientConfiguration clientConfig = new ClientConfiguration();
+	clientConfig.setProtocol(Protocol.HTTP);
+			
+	AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
+	conn.setEndpoint("endpoint.com");
+
+
+Creating a Connection
+---------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: java
+
+	String accessKey = "insert your access key here!";
+	String secretKey = "insert your secret key here!";
+
+	AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
+	AmazonS3 conn = new AmazonS3Client(credentials);
+	conn.setEndpoint("objects.dreamhost.com");
+
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of Buckets that you own.
+This also prints out the bucket name and creation date of each bucket.
+
+.. code-block:: java
+
+	List<Bucket> buckets = conn.listBuckets();
+	for (Bucket bucket : buckets) {
+		System.out.println(bucket.getName() + "\t" +
+			StringUtils.fromDate(bucket.getCreationDate()));
+	}
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket called ``my-new-bucket``
+
+.. code-block:: java
+
+	Bucket bucket = conn.createBucket("my-new-bucket");
+
+
+Listing a Bucket's Content
+--------------------------
+This gets a list of objects in the bucket.
+This also prints out each object's name, the file size, and last
+modified date.
+
+.. code-block:: java
+
+	ObjectListing objects = conn.listObjects(bucket.getName());
+	do {
+		for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
+			System.out.println(objectSummary.getKey() + "\t" +
+				ObjectSummary.getSize() + "\t" +
+				StringUtils.fromDate(objectSummary.getLastModified()));
+		}
+		objects = conn.listNextBatchOfObjects(objects);
+	} while (objects.isTruncated());
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+
+.. note::
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: java
+
+	conn.deleteBucket(bucket.getName());
+
+
+Forced Delete for Non-empty Buckets
+-----------------------------------
+.. attention::
+   not available
+
+
+Creating an Object
+------------------
+
+This creates a file ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: java
+
+	ByteArrayInputStream input = new ByteArrayInputStream("Hello World!".getBytes());
+	conn.putObject(bucket.getName(), "hello.txt", input, new ObjectMetadata());
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable, and
+``secret_plans.txt`` to be private.
+
+.. code-block:: java
+
+	conn.setObjectAcl(bucket.getName(), "hello.txt", CannedAccessControlList.PublicRead);
+	conn.setObjectAcl(bucket.getName(), "secret_plans.txt", CannedAccessControlList.Private);
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``perl_poetry.pdf`` and saves it in
+``/home/larry/documents``
+
+.. code-block:: java
+
+	conn.getObject(
+		new GetObjectRequest(bucket.getName(), "perl_poetry.pdf"),
+		new File("/home/larry/documents/perl_poetry.pdf")
+	);
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: java
+
+	conn.deleteObject(bucket.getName(), "goodbye.txt");
+
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+
+This generates an unsigned download URL for ``hello.txt``. This works
+because we made ``hello.txt`` public by setting the ACL above.
+This then generates a signed download URL for ``secret_plans.txt`` that
+will work for 1 hour. Signed download URLs will work for the time
+period even if the object is private (when the time period is up, the
+URL will stop working).
+
+.. note::
+   The java library does not have a method for generating unsigned
+   URLs, so the example below just generates a signed URL.
+
+.. code-block:: java
+
+	GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket.getName(), "secret_plans.txt");
+	System.out.println(conn.generatePresignedUrl(request));
+
+The output will look something like this::
+
+   https://my-bucket-name.objects.dreamhost.com/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
diff --git a/doc/radosgw/s3/objectops.rst b/doc/radosgw/s3/objectops.rst
new file mode 100644
index 0000000..b8a2475
--- /dev/null
+++ b/doc/radosgw/s3/objectops.rst
@@ -0,0 +1,403 @@
+Object Operations
+=================
+
+Put Object
+----------
+Adds an object to a bucket. You must have write permissions on the bucket to perform this operation.
+
+
+Syntax
+~~~~~~
+
+::
+
+    PUT /{bucket}/{object} HTTP/1.1
+
+Request Headers
+~~~~~~~~~~~~~~~
+
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| Name                 | Description                                | Valid Values                                                                  | Required   |
++======================+============================================+===============================================================================+============+
+| **content-md5**      | A base64 encoded MD-5 hash of the message. | A string. No defaults or constraints.                                         | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| **content-type**     | A standard MIME type.                      | Any MIME type. Default: ``binary/octet-stream``                               | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| **x-amz-meta-<...>** | User metadata.  Stored with the object.    | A string up to 8kb. No defaults.                                              | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| **x-amz-acl**        | A canned ACL.                              | ``private``, ``public-read``, ``public-read-write``, ``authenticated-read``   | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+
+
+Copy Object
+-----------
+To copy an object, use ``PUT`` and specify a destination bucket and the object name.
+
+Syntax
+~~~~~~
+
+::
+
+    PUT /{dest-bucket}/{dest-object} HTTP/1.1
+    x-amz-copy-source: {source-bucket}/{source-object}
+
+Request Headers
+~~~~~~~~~~~~~~~
+
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+| Name                                 | Description                                     | Valid Values           | Required   |
++======================================+=================================================+========================+============+
+| **x-amz-copy-source**                | The source bucket name + object name.           | {bucket}/{obj}         | Yes        |
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+| **x-amz-acl**                        | A canned ACL.                                   | ``private``,           | No         |
+|                                      |                                                 | ``public-read``,       |            |
+|                                      |                                                 | ``public-read-write``, |            |
+|                                      |                                                 | ``authenticated-read`` |            |
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+| **x-amz-copy-if-modified-since**     |  Copies only if modified since the timestamp.   |   Timestamp            | No         |
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+| **x-amz-copy-if-unmodified-since**   |  Copies only if unmodified since the timestamp. |   Timestamp            | No         |
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+| **x-amz-copy-if-match**              |  Copies only if object ETag matches ETag.       |   Entity Tag           | No         |
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+| **x-amz-copy-if-none-match**         |  Copies only if object ETag doesn't match.      |   Entity Tag           | No         |
++--------------------------------------+-------------------------------------------------+------------------------+------------+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++------------------------+-------------+-----------------------------------------------+
+| Name                   | Type        | Description                                   |
++========================+=============+===============================================+
+| **CopyObjectResult**   | Container   |  A container for the response elements.       |
++------------------------+-------------+-----------------------------------------------+
+| **LastModified**       | Date        |  The last modified date of the source object. |
++------------------------+-------------+-----------------------------------------------+
+| **Etag**               | String      |  The ETag of the new object.                  |
++------------------------+-------------+-----------------------------------------------+
+
+Remove Object
+-------------
+
+Removes an object. Requires WRITE permission set on the containing bucket.
+
+Syntax
+~~~~~~
+
+::
+
+    DELETE /{bucket}/{object} HTTP/1.1
+
+
+
+Get Object
+----------
+Retrieves an object from a bucket within RADOS. 
+
+Syntax
+~~~~~~
+
+::
+
+    GET /{bucket}/{object} HTTP/1.1
+
+Request Headers
+~~~~~~~~~~~~~~~
+
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| Name                      | Description                                    | Valid Values                   | Required   |
++===========================+================================================+================================+============+
+| **range**                 | The range of the object to retrieve.           | Range: bytes=beginbyte-endbyte | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-modified-since**     | Gets only if modified since the timestamp.     | Timestamp                      | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-unmodified-since**   | Gets only if not modified since the timestamp. | Timestamp                      | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-match**              | Gets only if object ETag matches ETag.         | Entity Tag                     | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-none-match**         | Gets only if object ETag matches ETag.         | Entity Tag                     | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+
+Response Headers
+~~~~~~~~~~~~~~~~
+
++-------------------+--------------------------------------------------------------------------------------------+
+| Name              | Description                                                                                |
++===================+============================================================================================+
+| **Content-Range** | Data range, will only be returned if the range header field was specified in the request   |
++-------------------+--------------------------------------------------------------------------------------------+
+
+Get Object Info
+---------------
+
+Returns information about object. This request will return the same
+header information as with the Get Object request, but will include
+the metadata only, not the object data payload.
+
+Syntax
+~~~~~~
+
+::
+
+    HEAD /{bucket}/{object} HTTP/1.1
+
+Request Headers
+~~~~~~~~~~~~~~~
+
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| Name                      | Description                                    | Valid Values                   | Required   |
++===========================+================================================+================================+============+
+| **range**                 | The range of the object to retrieve.           | Range: bytes=beginbyte-endbyte | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-modified-since**     | Gets only if modified since the timestamp.     | Timestamp                      | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-unmodified-since**   | Gets only if not modified since the timestamp. | Timestamp                      | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-match**              | Gets only if object ETag matches ETag.         | Entity Tag                     | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+| **if-none-match**         | Gets only if object ETag matches ETag.         | Entity Tag                     | No         |
++---------------------------+------------------------------------------------+--------------------------------+------------+
+
+Get Object ACL
+--------------
+
+Syntax
+~~~~~~
+
+::
+
+    GET /{bucket}/{object}?acl HTTP/1.1
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| Name                      | Type        | Description                                                                                  |
++===========================+=============+==============================================================================================+
+| ``AccessControlPolicy``   | Container   | A container for the response.                                                                |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``AccessControlList``     | Container   | A container for the ACL information.                                                         |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Owner``                 | Container   | A container for the object owner's ``ID`` and ``DisplayName``.                               |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``ID``                    | String      | The object owner's ID.                                                                       |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``DisplayName``           | String      | The object owner's display name.                                                             |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grant``                 | Container   | A container for ``Grantee`` and ``Permission``.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grantee``               | Container   | A container for the ``DisplayName`` and ``ID`` of the user receiving a grant of permission.  |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Permission``            | String      | The permission given to the ``Grantee`` object.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+
+
+
+Set Object ACL
+--------------
+
+Syntax
+~~~~~~
+
+::
+
+    PUT /{bucket}/{object}?acl
+
+Request Entities
+~~~~~~~~~~~~~~~~
+
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| Name                      | Type        | Description                                                                                  |
++===========================+=============+==============================================================================================+
+| ``AccessControlPolicy``   | Container   | A container for the response.                                                                |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``AccessControlList``     | Container   | A container for the ACL information.                                                         |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Owner``                 | Container   | A container for the object owner's ``ID`` and ``DisplayName``.                               |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``ID``                    | String      | The object owner's ID.                                                                       |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``DisplayName``           | String      | The object owner's display name.                                                             |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grant``                 | Container   | A container for ``Grantee`` and ``Permission``.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Grantee``               | Container   | A container for the ``DisplayName`` and ``ID`` of the user receiving a grant of permission.  |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+| ``Permission``            | String      | The permission given to the ``Grantee`` object.                                              |
++---------------------------+-------------+----------------------------------------------------------------------------------------------+
+
+
+
+Initiate Multi-part Upload
+--------------------------
+
+Initiate a multi-part upload process.
+
+Syntax
+~~~~~~
+
+::
+
+    POST /{bucket}/{object}?uploads
+
+Request Headers
+~~~~~~~~~~~~~~~
+
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| Name                 | Description                                | Valid Values                                                                  | Required   |
++======================+============================================+===============================================================================+============+
+| **content-md5**      | A base64 encoded MD-5 hash of the message. | A string. No defaults or constraints.                                         | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| **content-type**     | A standard MIME type.                      | Any MIME type. Default: ``binary/octet-stream``                               | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| **x-amz-meta-<...>** | User metadata.  Stored with the object.    | A string up to 8kb. No defaults.                                              | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+| **x-amz-acl**        | A canned ACL.                              | ``private``, ``public-read``, ``public-read-write``, ``authenticated-read``   | No         |
++----------------------+--------------------------------------------+-------------------------------------------------------------------------------+------------+
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| Name                                    | Type        | Description                                                                                              |
++=========================================+=============+==========================================================================================================+
+| ``InitiatedMultipartUploadsResult``     | Container   | A container for the results.                                                                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Bucket``                              | String      | The bucket that will receive the object contents.                                                        |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Key``                                 | String      | The key specified by the ``key`` request parameter (if any).                                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``UploadId``                            | String      | The ID specified by the ``upload-id`` request parameter identifying the multipart upload (if any).       |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+
+
+Multipart Upload Part
+---------------------
+
+Syntax
+~~~~~~
+
+::
+
+    PUT /{bucket}/{object}?partNumber=&uploadId= HTTP/1.1
+
+HTTP Response
+~~~~~~~~~~~~~
+
+The following HTTP response may be returned:
+
++---------------+----------------+--------------------------------------------------------------------------+
+| HTTP Status   | Status Code    | Description                                                              |
++===============+================+==========================================================================+
+| **404**       | NoSuchUpload   | Specified upload-id does not match any initiated upload on this object   |
++---------------+----------------+--------------------------------------------------------------------------+
+
+List Multipart Upload Parts
+---------------------------
+
+Syntax
+~~~~~~
+
+::
+
+    GET /{bucket}/{object}?uploadId=123 HTTP/1.1
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| Name                                    | Type        | Description                                                                                              |
++=========================================+=============+==========================================================================================================+
+| ``ListPartsResult``                     | Container   | A container for the results.                                                                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Bucket``                              | String      | The bucket that will receive the object contents.                                                        |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Key``                                 | String      | The key specified by the ``key`` request parameter (if any).                                             |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``UploadId``                            | String      | The ID specified by the ``upload-id`` request parameter identifying the multipart upload (if any).       |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Initiator``                           | Container   | Contains the ``ID`` and ``DisplayName`` of the user who initiated the upload.                            |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``ID``                                  | String      | The initiator's ID.                                                                                      |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``DisplayName``                         | String      | The initiator's display name.                                                                            |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Owner``                               | Container   | A container for the ``ID`` and ``DisplayName`` of the user who owns the uploaded object.                 |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``StorageClass``                        | String      | The method used to store the resulting object. ``STANDARD`` or ``REDUCED_REDUNDANCY``                    |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``PartNumberMarker``                    | String      | The part marker to use in a subsequent request if ``IsTruncated`` is ``true``. Precedes the list.        |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``NextPartNumberMarker``                | String      | The next part marker to use in a subsequent request if ``IsTruncated`` is ``true``. The end of the list. |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``MaxParts``                            | Integer     | The max parts allowed in the response as specified by the ``max-parts`` request parameter.               |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``IsTruncated``                         | Boolean     | If ``true``, only a subset of the object's upload contents were returned.                                |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Part``                                | Container   | A container for ``LastModified``, ``PartNumber``, ``ETag`` and ``Size`` elements.                        |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``LastModified``                        | Date        | Date and time at which the part was uploaded.                                                            |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``PartNumber``                          | Integer     | The identification number of the part.                                                                   |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``ETag``                                | String      | The part's entity tag.                                                                                   |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+| ``Size``                                | Integer     | The size of the uploaded part.                                                                           |
++-----------------------------------------+-------------+----------------------------------------------------------------------------------------------------------+
+
+
+
+Complete Multipart Upload
+-------------------------
+Assembles uploaded parts and creates a new object, thereby completing a multipart upload.
+
+Syntax
+~~~~~~
+
+::
+
+    POST /{bucket}/{object}?uploadId= HTTP/1.1
+
+Request Entities
+~~~~~~~~~~~~~~~~
+
++----------------------------------+-------------+-----------------------------------------------------+----------+
+| Name                             | Type        | Description                                         | Required |
++==================================+=============+=====================================================+==========+
+| ``CompleteMultipartUpload``      | Container   | A container consisting of one or more parts.        | Yes      |
++----------------------------------+-------------+-----------------------------------------------------+----------+
+| ``Part``                         | Container   | A container for the ``PartNumber`` and ``ETag``.    | Yes      |
++----------------------------------+-------------+-----------------------------------------------------+----------+
+| ``PartNumber``                   | Integer     | The identifier of the part.                         | Yes      |
++----------------------------------+-------------+-----------------------------------------------------+----------+
+| ``ETag``                         | String      | The part's entity tag.                              | Yes      |
++----------------------------------+-------------+-----------------------------------------------------+----------+
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++-------------------------------------+-------------+-------------------------------------------------------+
+| Name                                | Type        | Description                                           |
++=====================================+=============+=======================================================+
+| **CompleteMultipartUploadResult**   | Container   | A container for the response.                         |
++-------------------------------------+-------------+-------------------------------------------------------+
+| **Location**                        | URI         | The resource identifier (path) of the new object.     |
++-------------------------------------+-------------+-------------------------------------------------------+
+| **Bucket**                          | String      | The name of the bucket that contains the new object.  |
++-------------------------------------+-------------+-------------------------------------------------------+
+| **Key**                             | String      | The object's key.                                     |
++-------------------------------------+-------------+-------------------------------------------------------+
+| **ETag**                            | String      | The entity tag of the new object.                     |
++-------------------------------------+-------------+-------------------------------------------------------+
+
+Abort Multipart Upload
+----------------------
+
+Syntax
+~~~~~~
+
+::
+
+    DELETE /{bucket}/{object}?uploadId= HTTP/1.1
diff --git a/doc/radosgw/s3/perl.rst b/doc/radosgw/s3/perl.rst
new file mode 100644
index 0000000..a66d617
--- /dev/null
+++ b/doc/radosgw/s3/perl.rst
@@ -0,0 +1,192 @@
+.. _perl:
+
+Perl S3 Examples
+================
+
+Creating a Connection
+---------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: perl
+
+	use Amazon::S3;
+	my $access_key = 'put your access key here!';
+	my $secret_key = 'put your secret key here!';
+
+	my $conn = Amazon::S3->new({
+		aws_access_key_id     => $access_key,
+		aws_secret_access_key => $secret_key,
+		host                  => 'objects.dreamhost.com',
+		secure                => 1,
+		retry                 => 1,
+	});
+
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of `Amazon::S3::Bucket`_ objects that you own.
+We'll also print out the bucket name and creation date of each bucket.
+
+.. code-block:: perl
+
+	my @buckets = @{$conn->buckets->{buckets} || []};
+	foreach my $bucket (@buckets) {
+		print $bucket->bucket . "\t" . $bucket->creation_date . "\n";
+	}
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket called ``my-new-bucket``
+
+.. code-block:: perl
+
+	my $bucket = $conn->add_bucket({ bucket => 'my-new-bucket' });
+
+
+Listing a Bucket's Content
+--------------------------
+
+This gets a list of hashes with info about each object in the bucket.
+We'll also print out each object's name, the file size, and last
+modified date.
+
+.. code-block:: perl
+
+	my @keys = @{$bucket->list_all->{keys} || []};
+	foreach my $key (@keys) {
+		print "$key->{key}\t$key->{size}\t$key->{last_modified}\n";
+	}
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+
+.. note::
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: perl
+
+	$conn->delete_bucket($bucket);
+
+
+Forced Delete for Non-empty Buckets
+-----------------------------------
+
+.. attention::
+
+   not available in the `Amazon::S3`_ perl module
+
+
+Creating an Object
+------------------
+
+This creates a file ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: perl
+
+	$bucket->add_key(
+		'hello.txt', 'Hello World!',
+		{ content_type => 'text/plain' },
+	);
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable and
+``secret_plans.txt`` to be private.
+
+.. code-block:: perl
+
+	$bucket->set_acl({
+		key       => 'hello.txt',
+		acl_short => 'public-read',
+	});
+	$bucket->set_acl({
+		key       => 'secret_plans.txt',
+		acl_short => 'private',
+	});
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``perl_poetry.pdf`` and saves it in
+``/home/larry/documents/``
+
+.. code-block:: perl
+
+	$bucket->get_key_filename('perl_poetry.pdf', undef,
+		'/home/larry/documents/perl_poetry.pdf');
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: perl
+
+	$bucket->delete_key('goodbye.txt');
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+This generates an unsigned download URL for ``hello.txt``. This works
+because we made ``hello.txt`` public by setting the ACL above.
+Then this generates a signed download URL for ``secret_plans.txt`` that
+will work for 1 hour. Signed download URLs will work for the time
+period even if the object is private (when the time period is up, the
+URL will stop working).
+
+.. note::
+   The `Amazon::S3`_ module does not have a way to generate download
+   URLs, so we're going to be using another module instead. Unfortunately,
+   most modules for generating these URLs assume that you are using Amazon,
+   so we've had to go with using a more obscure module, `Muck::FS::S3`_. This
+   should be the same as Amazon's sample S3 perl module, but this sample
+   module is not in CPAN. So, you can either use CPAN to install
+   `Muck::FS::S3`_, or install Amazon's sample S3 module manually. If you go
+   the manual route, you can remove ``Muck::FS::`` from the example below.
+
+.. code-block:: perl
+
+	use Muck::FS::S3::QueryStringAuthGenerator;
+	my $generator = Muck::FS::S3::QueryStringAuthGenerator->new(
+		$access_key,
+		$secret_key,
+		0, # 0 means use 'http'. set this to 1 for 'https'
+		'objects.dreamhost.com',
+	);
+
+	my $hello_url = $generator->make_bare_url($bucket->bucket, 'hello.txt');
+	print $hello_url . "\n";
+
+	$generator->expires_in(3600); # 1 hour = 3600 seconds
+	my $plans_url = $generator->get($bucket->bucket, 'secret_plans.txt');
+	print $plans_url . "\n";
+
+The output will look something like this::
+
+   http://objects.dreamhost.com:80/my-bucket-name/hello.txt
+   http://objects.dreamhost.com:80/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
+
+.. _`Amazon::S3`: http://search.cpan.org/~tima/Amazon-S3-0.441/lib/Amazon/S3.pm
+.. _`Amazon::S3::Bucket`: http://search.cpan.org/~tima/Amazon-S3-0.441/lib/Amazon/S3/Bucket.pm
+.. _`Muck::FS::S3`: http://search.cpan.org/~mike/Muck-0.02/
+
diff --git a/doc/radosgw/s3/php.rst b/doc/radosgw/s3/php.rst
new file mode 100644
index 0000000..40542e0
--- /dev/null
+++ b/doc/radosgw/s3/php.rst
@@ -0,0 +1,208 @@
+.. _php:
+
+PHP S3 Examples
+===============
+
+Creating a Connection
+---------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: php
+
+	<?php
+	define('AWS_KEY', 'place access key here');
+	define('AWS_SECRET_KEY', 'place secret key here');
+	define('AWS_CANONICAL_ID', 'your DHO Username');
+	define('AWS_CANONICAL_NAME', 'Also your DHO Username!');
+	$HOST = 'objects.dreamhost.com';
+
+	// require the amazon sdk for php library
+	require_once 'AWSSDKforPHP/sdk.class.php';
+
+	// Instantiate the S3 class and point it at the desired host
+	$Connection = new AmazonS3(array(
+		'key' => AWS_KEY,
+		'secret' => AWS_SECRET_KEY,
+		'canonical_id' => AWS_CANONICAL_ID,
+		'canonical_name' => AWS_CANONICAL_NAME,
+	));
+	$Connection->set_hostname($HOST);
+	$Connection->allow_hostname_override(false);
+
+	// Set the S3 class to use objects.dreamhost.com/bucket
+	// instead of bucket.objects.dreamhost.com
+	$Connection->enable_path_style();
+
+
+Listing Owned Buckets
+---------------------
+This gets a list of CFSimpleXML objects representing buckets that you
+own.  This also prints out the bucket name and creation date of each
+bucket.
+
+.. code-block:: php
+
+	<?php
+	$ListResponse = $Connection->list_buckets();
+	$Buckets = $ListResponse->body->Buckets->Bucket;
+	foreach ($Buckets as $Bucket) {
+		echo $Bucket->Name . "\t" . $Bucket->CreationDate . "\n";
+	}
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket called ``my-new-bucket`` and returns a
+``CFResponse`` object.
+
+.. note::
+
+   This command requires a region as the second argument,
+   so we use ``AmazonS3::REGION_US_E1``, because this constant is ``''``
+
+.. code-block:: php
+
+	<?php
+	$Connection->create_bucket('my-new-bucket', AmazonS3::REGION_US_E1);
+
+
+List a Bucket's Content
+-----------------------
+
+This gets an array of ``CFSimpleXML`` objects representing the objects
+in the bucket. This then prints out each object's name, the file size,
+and last modified date.
+
+.. code-block:: php
+
+	<?php
+	$ObjectsListResponse = $Connection->list_objects($bucketname);
+	$Objects = $ObjectsListResponse->body->Contents;
+	foreach ($Objects as $Object) {
+		echo $Object->Key . "\t" . $Object->Size . "\t" . $Object->LastModified . "\n";
+	}
+
+.. note::
+
+   If there are more than 1000 objects in this bucket,
+   you need to check $ObjectListResponse->body->isTruncated
+   and run again with the name of the last key listed.
+   Keep doing this until isTruncated is not true.
+
+The output will look something like this if the bucket has some files::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+
+This deletes the bucket called ``my-old-bucket`` and returns a
+``CFResponse`` object
+
+.. note::
+
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: php
+
+	<?php
+	$Connection->delete_bucket('my-old-bucket');
+
+
+Forced Delte for Non-empty Buckets
+----------------------------------
+
+This will delete the bucket even if it is not empty.
+
+.. code-block:: php
+
+	<?php
+	$Connection->delete_bucket('my-old-bucket', 1);
+
+
+Creating an Object
+------------------
+
+This creates an object ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: php
+
+	<?php
+	$Connection->create_object('my-bucket-name', 'hello.txt', array(
+		'body' => "Hello World!",
+	));
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable and
+``secret_plans.txt`` to be private.
+
+.. code-block:: php
+
+	<?php
+	$Connection->set_object_acl('my-bucket-name', 'hello.txt', AmazonS3::ACL_PUBLIC);
+	$Connection->set_object_acl('my-bucket-name', 'secret_plans.txt', AmazonS3::ACL_PRIVATE);
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: php
+
+	<?php
+	$Connection->delete_object('my-bucket-name', 'goodbye.txt');
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``poetry.pdf`` and saves it in
+``/home/larry/documents/``
+
+.. code-block:: php
+
+	<?php
+	$FileHandle = fopen('/home/larry/documents/poetry.pdf', 'w+');
+	$Connection->get_object('my-bucket-name', 'poetry.pdf', array(
+		'fileDownload' => $FileHandle,
+	));
+
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+
+This generates an unsigned download URL for ``hello.txt``.
+This works because we made ``hello.txt`` public by setting
+the ACL above. This then generates a signed download URL
+for ``secret_plans.txt`` that will work for 1 hour.
+Signed download URLs will work for the time period even
+if the object is private (when the time period is up,
+the URL will stop working).
+
+.. code-block:: php
+
+	<?php
+	my $plans_url = $Connection->get_object_url('my-bucket-name', 'hello.txt');
+	echo $plans_url . "\n";
+	my $secret_url = $Connection->get_object_url('my-bucket-name', 'secret_plans.txt', '1 hour');
+	echo $secret_url . "\n";
+
+The output of this will look something like::
+
+   http://objects.dreamhost.com/my-bucket-name/hello.txt
+   http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
diff --git a/doc/radosgw/s3/python.rst b/doc/radosgw/s3/python.rst
new file mode 100644
index 0000000..a2c6a59
--- /dev/null
+++ b/doc/radosgw/s3/python.rst
@@ -0,0 +1,171 @@
+.. _python:
+
+Python S3 Examples
+==================
+
+Creating a Connection
+---------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: python
+
+	import boto
+	import boto.s3.connection
+	access_key = 'put your access key here!'
+	secret_key = 'put your secret key here!'
+
+	conn = boto.connect_s3(
+		aws_access_key_id = access_key,
+		aws_secret_access_key = secret_key,
+		host = 'objects.dreamhost.com',
+                #is_secure=False,               # uncomment if you are not using ssl
+		calling_format = boto.s3.connection.OrdinaryCallingFormat(),
+		)
+
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of Buckets that you own.
+This also prints out the bucket name and creation date of each bucket.
+
+.. code-block:: python
+
+	for bucket in conn.get_all_buckets():
+		print "{name}\t{created}".format(
+			name = bucket.name,
+			created = bucket.creation_date,
+		)
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket called ``my-new-bucket``
+
+.. code-block:: python
+
+	bucket = conn.create_bucket('my-new-bucket')
+
+
+Listing a Bucket's Content
+--------------------------
+
+This gets a list of objects in the bucket.
+This also prints out each object's name, the file size, and last
+modified date.
+
+.. code-block:: python
+
+	for key in bucket.list():
+		print "{name}\t{size}\t{modified}".format(
+			name = key.name,
+			size = key.size,
+			modified = key.last_modified,
+			)
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+
+.. note::
+
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: python
+
+	conn.delete_bucket(bucket.name)
+
+
+Forced Delete for Non-empty Buckets
+-----------------------------------
+
+.. attention::
+
+   not available in python
+
+
+Creating an Object
+------------------
+
+This creates a file ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: python
+
+	key = bucket.new_key('hello.txt')
+	key.set_contents_from_string('Hello World!')
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable, and
+``secret_plans.txt`` to be private.
+
+.. code-block:: python
+
+	hello_key = bucket.get_key('hello.txt')
+	hello_key.set_canned_acl('public-read')
+	plans_key = bucket.get_key('secret_plans.txt')
+	plans_key.set_canned_acl('private')
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``perl_poetry.pdf`` and saves it in
+``/home/larry/documents/``
+
+.. code-block:: python
+
+	key = bucket.get_key('perl_poetry.pdf')
+	key.get_contents_to_filename('/home/larry/documents/perl_poetry.pdf')
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: python
+
+	bucket.delete_key('goodbye.txt')
+
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+
+This generates an unsigned download URL for ``hello.txt``. This works
+because we made ``hello.txt`` public by setting the ACL above.
+This then generates a signed download URL for ``secret_plans.txt`` that
+will work for 1 hour. Signed download URLs will work for the time
+period even if the object is private (when the time period is up, the
+URL will stop working).
+
+.. code-block:: python
+
+	hello_key = bucket.get_key('hello.txt')
+	hello_url = hello_key.generate_url(0, query_auth=False, force_http=True)
+	print hello_url
+
+	plans_key = bucket.get_key('secret_plans.txt')
+	plans_url = plans_key.generate_url(3600, query_auth=True, force_http=True)
+	print plans_url
+
+The output of this will look something like::
+
+   http://objects.dreamhost.com/my-bucket-name/hello.txt
+   http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
diff --git a/doc/radosgw/s3/ruby.rst b/doc/radosgw/s3/ruby.rst
new file mode 100644
index 0000000..435b3c6
--- /dev/null
+++ b/doc/radosgw/s3/ruby.rst
@@ -0,0 +1,364 @@
+.. _ruby:
+
+Ruby `AWS::SDK`_ Examples (aws-sdk gem ~>2)
+===========================================
+
+Settings
+---------------------
+
+You can setup the connection on global way:
+
+.. code-block:: ruby
+
+	Aws.config.update(
+		endpoint: 'https://objects.dreamhost.com.',
+		access_key_id: 'my-access-key',
+		secret_access_key: 'my-secret-key',
+		force_path_style: true, 
+		region: 'us-east-1'
+	)
+
+
+and instantiate a client object:
+
+.. code-block:: ruby
+
+    	s3_client = Aws::S3::Client.new
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of buckets that you own.
+This also prints out the bucket name and creation date of each bucket.
+
+.. code-block:: ruby
+
+	s3_client.list_buckets.buckets.each do |bucket|
+		puts "#{bucket.name}\t#{bucket.creation_date}"
+	end
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket called ``my-new-bucket``
+
+.. code-block:: ruby
+
+	s3_client.create_bucket(bucket: 'my-new-bucket')
+
+If you want a private bucket: 
+
+`acl` option accepts: # private, public-read, public-read-write, authenticated-read
+
+.. code-block:: ruby
+
+	s3_client.create_bucket(bucket: 'my-new-bucket', acl: 'private')
+
+
+Listing a Bucket's Content
+--------------------------
+
+This gets a list of hashes with the contents of each object
+This also prints out each object's name, the file size, and last
+modified date.
+
+.. code-block:: ruby
+
+	s3_client.get_objects(bucket: 'my-new-bucket').contents.each do |object|
+		puts "#{object.key}\t#{object.size}\t#{object.last-modified}"
+	end
+
+The output will look something like this if the bucket has some files::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+.. note::
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: ruby
+
+	s3_client.delete_bucket(bucket: 'my-new-bucket')
+
+
+Forced Delete for Non-empty Buckets
+-----------------------------------
+First, you need to clear the bucket:
+
+.. code-block:: ruby
+
+	Aws::S3::Bucket.new('my-new-bucket', client: s3_client).clear!
+	
+after, you can destroy the bucket
+
+.. code-block:: ruby
+
+	s3_client.delete_bucket(bucket: 'my-new-bucket')
+
+
+Creating an Object
+------------------
+
+This creates a file ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: ruby
+
+	s3_client.put_object(
+		key: 'hello.txt',
+		body: 'Hello World!',
+		bucket: 'my-new-bucket',
+		content_type: 'text/plain'
+	)
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable, and ``secret_plans.txt``
+to be private.
+
+.. code-block:: ruby
+
+	s3_client.put_object_acl(bucket: 'my-new-bucket', key: 'hello.txt', acl: 'public-read')
+
+	s3_client.put_object_acl(bucket: 'my-new-bucket', key: 'private.txt', acl: 'private')
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``poetry.pdf`` and saves it in
+``/home/larry/documents/``
+
+.. code-block:: ruby
+
+	s3_client.get_object(bucket: 'my-new-bucket', key: 'poetry.pdf', response_target: '/home/larry/documents/poetry.pdf')
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: ruby
+
+	s3_client.delete_object(key: 'goodbye.txt', bucket: 'my-new-bucket')
+
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+
+This generates an unsigned download URL for ``hello.txt``. This works
+because we made ``hello.txt`` public by setting the ACL above.
+This then generates a signed download URL for ``secret_plans.txt`` that
+will work for 1 hour. Signed download URLs will work for the time
+period even if the object is private (when the time period is up, the
+URL will stop working).
+
+.. code-block:: ruby
+
+	puts Aws::S3::Object.new(
+		key: 'hello.txt',
+		bucket_name: 'my-new-bucket',
+		client: s3_client
+	).public_url
+
+	puts Aws::S3::Object.new(
+		key: 'secret_plans.txt',
+		bucket_name: 'hermes_ceph_gem',
+		client: s3_client
+	).presigned_url(:get, expires_in: 60 * 60)
+
+The output of this will look something like::
+
+   http://objects.dreamhost.com/my-bucket-name/hello.txt
+   http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
+.. _`AWS::SDK`: http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html
+
+
+
+Ruby `AWS::S3`_ Examples (aws-s3 gem)
+=====================================
+
+Creating a Connection
+---------------------
+
+This creates a connection so that you can interact with the server.
+
+.. code-block:: ruby
+
+	AWS::S3::Base.establish_connection!(
+		:server            => 'objects.dreamhost.com',
+		:use_ssl           => true,
+		:access_key_id     => 'my-access-key',
+		:secret_access_key => 'my-secret-key'
+	)
+
+
+Listing Owned Buckets
+---------------------
+
+This gets a list of `AWS::S3::Bucket`_ objects that you own.
+This also prints out the bucket name and creation date of each bucket.
+
+.. code-block:: ruby
+
+	AWS::S3::Service.buckets.each do |bucket|
+		puts "#{bucket.name}\t#{bucket.creation_date}"
+	end
+
+The output will look something like this::
+
+   mahbuckat1	2011-04-21T18:05:39.000Z
+   mahbuckat2	2011-04-21T18:05:48.000Z
+   mahbuckat3	2011-04-21T18:07:18.000Z
+
+
+Creating a Bucket
+-----------------
+
+This creates a new bucket called ``my-new-bucket``
+
+.. code-block:: ruby
+
+	AWS::S3::Bucket.create('my-new-bucket')
+
+
+Listing a Bucket's Content
+--------------------------
+
+This gets a list of hashes with the contents of each object
+This also prints out each object's name, the file size, and last
+modified date.
+
+.. code-block:: ruby
+
+	new_bucket = AWS::S3::Bucket.find('my-new-bucket')
+	new_bucket.each do |object|
+		puts "#{object.key}\t#{object.about['content-length']}\t#{object.about['last-modified']}"
+	end
+
+The output will look something like this if the bucket has some files::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Deleting a Bucket
+-----------------
+.. note::
+   The Bucket must be empty! Otherwise it won't work!
+
+.. code-block:: ruby
+
+	AWS::S3::Bucket.delete('my-new-bucket')
+
+
+Forced Delete for Non-empty Buckets
+-----------------------------------
+
+.. code-block:: ruby
+
+	AWS::S3::Bucket.delete('my-new-bucket', :force => true)
+
+
+Creating an Object
+------------------
+
+This creates a file ``hello.txt`` with the string ``"Hello World!"``
+
+.. code-block:: ruby
+
+	AWS::S3::S3Object.store(
+		'hello.txt',
+		'Hello World!',
+		'my-new-bucket',
+		:content_type => 'text/plain'
+	)
+
+
+Change an Object's ACL
+----------------------
+
+This makes the object ``hello.txt`` to be publicly readable, and ``secret_plans.txt``
+to be private.
+
+.. code-block:: ruby
+
+	policy = AWS::S3::S3Object.acl('hello.txt', 'my-new-bucket')
+	policy.grants = [ AWS::S3::ACL::Grant.grant(:public_read) ]
+	AWS::S3::S3Object.acl('hello.txt', 'my-new-bucket', policy)
+
+	policy = AWS::S3::S3Object.acl('secret_plans.txt', 'my-new-bucket')
+	policy.grants = []
+	AWS::S3::S3Object.acl('secret_plans.txt', 'my-new-bucket', policy)
+
+
+Download an Object (to a file)
+------------------------------
+
+This downloads the object ``poetry.pdf`` and saves it in
+``/home/larry/documents/``
+
+.. code-block:: ruby
+
+	open('/home/larry/documents/poetry.pdf', 'w') do |file|
+		AWS::S3::S3Object.stream('poetry.pdf', 'my-new-bucket') do |chunk|
+			file.write(chunk)
+		end
+	end
+
+
+Delete an Object
+----------------
+
+This deletes the object ``goodbye.txt``
+
+.. code-block:: ruby
+
+	AWS::S3::S3Object.delete('goodbye.txt', 'my-new-bucket')
+
+
+Generate Object Download URLs (signed and unsigned)
+---------------------------------------------------
+
+This generates an unsigned download URL for ``hello.txt``. This works
+because we made ``hello.txt`` public by setting the ACL above.
+This then generates a signed download URL for ``secret_plans.txt`` that
+will work for 1 hour. Signed download URLs will work for the time
+period even if the object is private (when the time period is up, the
+URL will stop working).
+
+.. code-block:: ruby
+
+	puts AWS::S3::S3Object.url_for(
+		'hello.txt',
+		'my-new-bucket',
+		:authenticated => false
+	)
+
+	puts AWS::S3::S3Object.url_for(
+		'secret_plans.txt',
+		'my-new-bucket',
+		:expires_in => 60 * 60
+	)
+
+The output of this will look something like::
+
+   http://objects.dreamhost.com/my-bucket-name/hello.txt
+   http://objects.dreamhost.com/my-bucket-name/secret_plans.txt?Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXX&Expires=1316027075&AWSAccessKeyId=XXXXXXXXXXXXXXXXXXX
+
+.. _`AWS::S3`: http://amazon.rubyforge.org/
+.. _`AWS::S3::Bucket`: http://amazon.rubyforge.org/doc/
+
diff --git a/doc/radosgw/s3/serviceops.rst b/doc/radosgw/s3/serviceops.rst
new file mode 100644
index 0000000..c55ce98
--- /dev/null
+++ b/doc/radosgw/s3/serviceops.rst
@@ -0,0 +1,39 @@
+Service Operations
+==================
+
+List Buckets
+------------
+``GET /`` returns a list of buckets created by the user making the request. ``GET /`` only
+returns buckets created by an authenticated user. You cannot make an anonymous request.
+
+Syntax
+~~~~~~
+::
+
+	GET / HTTP/1.1
+	Host: cname.domain.com
+
+	Authorization: AWS {access-key}:{hash-of-header-and-secret}
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
++----------------------------+-------------+-----------------------------------------------------------------+
+| Name                       | Type        | Description                                                     |
++============================+=============+=================================================================+
+| ``Buckets``                | Container   | Container for list of buckets.                                  |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``Bucket``                 | Container   | Container for bucket information.                               |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``Name``                   | String      | Bucket name.                                                    |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``CreationDate``           | Date        | UTC time when the bucket was created.                           |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``ListAllMyBucketsResult`` | Container   | A container for the result.                                     |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``Owner``                  | Container   | A container for the bucket owner's ``ID`` and ``DisplayName``.  |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``ID``                     | String      | The bucket owner's ID.                                          |
++----------------------------+-------------+-----------------------------------------------------------------+
+| ``DisplayName``            | String      | The bucket owner's display name.                                |
++----------------------------+-------------+-----------------------------------------------------------------+
diff --git a/doc/radosgw/swift.rst b/doc/radosgw/swift.rst
new file mode 100644
index 0000000..6113b72
--- /dev/null
+++ b/doc/radosgw/swift.rst
@@ -0,0 +1,75 @@
+===============================
+ Ceph Object Gateway Swift API
+===============================
+
+Ceph supports a RESTful API that is compatible with the basic data access model of the `Swift API`_.
+
+API
+---
+
+.. toctree::
+   :maxdepth: 1
+
+   Authentication <swift/auth>
+   Service Ops <swift/serviceops>
+   Container Ops <swift/containerops>
+   Object Ops <swift/objectops>
+   Temp URL Ops <swift/tempurl>
+   Tutorial <swift/tutorial>
+   Java <swift/java>
+   Python <swift/python>
+   Ruby <swift/ruby>
+
+
+Features Support
+----------------
+
+The following table describes the support status for current Swift functional features:
+
++---------------------------------+-----------------+----------------------------------------+
+| Feature                         | Status          | Remarks                                |
++=================================+=================+========================================+
+| **Authentication**              | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Account Metadata**        | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Swift ACLs**                  | Supported       | Supports a subset of Swift ACLs        |
++---------------------------------+-----------------+----------------------------------------+
+| **List Containers**             | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Container**            | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Container**            | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Container Metadata**      | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Update Container Metadata**   | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Container Metadata**   | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **List Objects**                | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Static Website**              | Not Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Object**               | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Create Large Object**         | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Delete Object**               | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Object**                  | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Copy Object**                 | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Get Object Metadata**         | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Update Object Metadata**      | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Expiring Objects**            | Supported       |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **Object Versioning**           | Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+| **CORS**                        | Not Supported   |                                        |
++---------------------------------+-----------------+----------------------------------------+
+
+.. _Swift API: http://developer.openstack.org/api-ref-objectstorage-v1.html
diff --git a/doc/radosgw/swift/auth.rst b/doc/radosgw/swift/auth.rst
new file mode 100644
index 0000000..bfc9773
--- /dev/null
+++ b/doc/radosgw/swift/auth.rst
@@ -0,0 +1,76 @@
+================
+ Authentication
+================
+
+Swift API requests that require authentication must contain an
+``X-Storage-Token`` authentication token in the request header. 
+The token may be retrieved from RADOS Gateway, or from another authenticator.
+To obtain a token from RADOS Gateway, you must create a user. For example:: 
+
+	sudo radosgw-admin user create --uid="{username}" --display-name="{Display Name}"
+
+For details on RADOS Gateway administration, see `radosgw-admin`_. 
+
+.. _radosgw-admin: ../../../man/8/radosgw-admin/ 
+
+Auth Get
+--------
+
+To authenticate a user, make a request containing an ``X-Auth-User`` and a
+``X-Auth-Key`` in the header.
+
+Syntax
+~~~~~~
+
+::
+
+    GET /auth HTTP/1.1
+    Host: swift.radosgwhost.com
+    X-Auth-User: johndoe
+    X-Auth-Key: R7UUOLFDI2ZI9PRCQ53K
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``X-Auth-User`` 
+
+:Description: The key RADOS GW username to authenticate.
+:Type: String
+:Required: Yes
+
+``X-Auth-Key`` 
+
+:Description: The key associated to a RADOS GW username.
+:Type: String
+:Required: Yes
+
+
+Response Headers
+~~~~~~~~~~~~~~~~
+
+The response from the server should include an ``X-Auth-Token`` value. The 
+response may also contain a ``X-Storage-Url`` that provides the 
+``{api version}/{account}`` prefix that is specified in other requests
+throughout the API documentation.
+
+
+``X-Storage-Token`` 
+
+:Description: The authorization token for the ``X-Auth-User`` specified in the request.
+:Type: String
+
+
+``X-Storage-Url`` 
+
+:Description: The URL and ``{api version}/{account}`` path for the user.
+:Type: String
+
+A typical response looks like this:: 
+
+	HTTP/1.1 204 No Content
+	Date: Mon, 16 Jul 2012 11:05:33 GMT
+  	Server: swift
+  	X-Storage-Url: https://swift.radosgwhost.com/v1/ACCT-12345
+	X-Auth-Token: UOlCCC8TahFKlWuv9DB09TWHF0nDjpPElha0kAa
+	Content-Length: 0
+	Content-Type: text/plain; charset=UTF-8
\ No newline at end of file
diff --git a/doc/radosgw/swift/containerops.rst b/doc/radosgw/swift/containerops.rst
new file mode 100644
index 0000000..c8cef1f
--- /dev/null
+++ b/doc/radosgw/swift/containerops.rst
@@ -0,0 +1,279 @@
+======================
+ Container Operations
+======================
+
+A container is a mechanism for storing data objects. An account may
+have many containers, but container names must be unique. This API enables a 
+client to create a container, set access controls and metadata, 
+retrieve a container's contents, and delete a container. Since this API 
+makes requests related to information in a particular user's account, all 
+requests in this API must be authenticated unless a container's access control
+is deliberately made publicly accessible (i.e., allows anonymous requests).
+
+.. note:: The Amazon S3 API uses the term 'bucket' to describe a data container.
+   When you hear someone refer to a 'bucket' within the Swift API, the term 
+   'bucket' may be construed as the equivalent of the term 'container.'
+   
+One facet of object storage is that it does not support hierarchical paths
+or directories. Instead, it supports one level consisting of one or more
+containers, where each container may have objects. The RADOS Gateway's
+Swift-compatible API supports the notion of 'pseudo-hierarchical containers,'
+which is a means of using object naming to emulate a container (or directory)
+hierarchy without actually implementing one in the storage system. You may 
+name objects with pseudo-hierarchical names 
+(e.g., photos/buildings/empire-state.jpg), but container names cannot
+contain a forward slash (``/``) character.
+
+
+Create a Container
+==================
+
+To create a new container, make a ``PUT`` request with the API version, account,
+and the name of the new container. The container name must be unique, must not
+contain a forward-slash (/) character, and should be less than 256 bytes. You 
+may include access control headers and metadata headers in the request. The 
+operation is idempotent; that is, if you make a request to create a container
+that already exists, it will return with a HTTP 202 return code, but will not
+create another container.
+
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{api version}/{account}/{container} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+	X-Container-Read: {comma-separated-uids}
+	X-Container-Write: {comma-separated-uids}
+	X-Container-Meta-{key}: {value}
+
+
+Headers
+~~~~~~~
+
+``X-Container-Read``
+
+:Description: The user IDs with read permissions for the container. 
+:Type: Comma-separated string values of user IDs.
+:Required: No
+
+``X-Container-Write``
+
+:Description: The user IDs with write permissions for the container.
+:Type: Comma-separated string values of user IDs.
+:Required: No
+
+``X-Container-Meta-{key}``
+
+:Description:  A user-defined meta data key that takes an arbitrary string value.
+:Type: String
+:Required: No
+
+
+HTTP Response
+~~~~~~~~~~~~~
+
+If a container with the same name already exists, and the user is the
+container owner then the operation will succeed. Otherwise the operation
+will fail.
+
+``409``
+
+:Description: The container already exists under a different user's ownership.
+:Status Code: ``BucketAlreadyExists``
+
+
+
+
+List a Container's Objects
+==========================
+
+To list the objects within a container, make a ``GET`` request with the with the 
+API version, account, and the name of the container.  You can specify query 
+parameters to filter the full list, or leave out the parameters to return a list 
+of the first 10,000 object names stored in the container.
+
+
+Syntax
+~~~~~~
+
+::
+
+   GET /{api version}/{container} HTTP/1.1
+  	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+Parameters
+~~~~~~~~~~
+
+``format``
+
+:Description: Defines the format of the result. 
+:Type: String
+:Valid Values: ``json`` | ``xml``
+:Required: No
+
+``prefix``
+
+:Description: Limits the result set to objects beginning with the specified prefix.
+:Type: String
+:Required: No
+
+``marker``
+
+:Description: Returns a list of results greater than the marker value.
+:Type: String
+:Required: No
+
+``limit``
+
+:Description: Limits the number of results to the specified value.
+:Type: Integer
+:Valid Range: 0 - 10,000
+:Required: No
+
+``delimiter``
+
+:Description: The delimiter between the prefix and the rest of the object name.
+:Type: String
+:Required: No
+
+``path``
+
+:Description: The pseudo-hierarchical path of the objects.
+:Type: String
+:Required: No
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+``container``
+
+:Description: The container. 
+:Type: Container
+
+``object``
+
+:Description: An object within the container.
+:Type: Container
+
+``name``
+
+:Description: The name of an object within the container.
+:Type: String
+
+``hash``
+
+:Description: A hash code of the object's contents.
+:Type: String
+
+``last_modified``
+
+:Description: The last time the object's contents were modified.
+:Type: Date
+
+``content_type``
+
+:Description: The type of content within the object.
+:Type: String
+
+
+
+Update a Container's ACLs
+=========================
+
+When a user creates a container, the user has read and write access to the
+container by default. To allow other users to read a container's contents or
+write to a container, you must specifically enable the user. 
+You may also specify ``*`` in the ``X-Container-Read`` or ``X-Container-Write``
+settings, which effectively enables all users to either read from or write
+to the container. Setting ``*`` makes the container public. That is it 
+enables anonymous users to either read from or write to the container.
+
+
+Syntax
+~~~~~~
+
+::
+
+   POST /{api version}/{account}/{container} HTTP/1.1
+   Host: {fqdn}
+	X-Auth-Token: {auth-token}
+	X-Container-Read: *
+	X-Container-Write: {uid1}, {uid2}, {uid3}
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``X-Container-Read``
+
+:Description: The user IDs with read permissions for the container. 
+:Type: Comma-separated string values of user IDs.
+:Required: No
+
+``X-Container-Write``
+
+:Description: The user IDs with write permissions for the container.
+:Type: Comma-separated string values of user IDs.
+:Required: No
+
+
+Add/Update Container Metadata
+=============================
+
+To add metadata to a container, make a ``POST`` request with the API version, 
+account, and container name. You must have write permissions on the 
+container to add or update metadata.
+
+Syntax
+~~~~~~
+
+::
+
+   POST /{api version}/{account}/{container} HTTP/1.1
+   Host: {fqdn}
+	X-Auth-Token: {auth-token}
+	X-Container-Meta-Color: red
+	X-Container-Meta-Taste: salty
+	
+Request Headers
+~~~~~~~~~~~~~~~
+
+``X-Container-Meta-{key}``
+
+:Description:  A user-defined meta data key that takes an arbitrary string value.
+:Type: String
+:Required: No
+
+
+
+Delete a Container
+==================
+
+To delete a container, make a ``DELETE`` request with the API version, account,
+and the name of the container. The container must be empty. If you'd like to check 
+if the container is empty, execute a ``HEAD`` request against the container. Once 
+you've successfully removed the container, you'll be able to reuse the container name.
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{api version}/{account}/{container} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}    
+
+
+HTTP Response
+~~~~~~~~~~~~~
+
+``204``
+
+:Description: The container was removed.
+:Status Code: ``NoContent``
+
diff --git a/doc/radosgw/swift/java.rst b/doc/radosgw/swift/java.rst
new file mode 100644
index 0000000..9ff7307
--- /dev/null
+++ b/doc/radosgw/swift/java.rst
@@ -0,0 +1,170 @@
+.. _java_swift:
+
+=====================
+ Java Swift Examples
+=====================
+
+Setup
+=====
+
+The following examples may require some or all of the following Java
+classes to be imported:
+
+.. code-block:: java
+
+	import java.io.File;
+	import java.util.List;
+	import java.util.Map;
+	import com.rackspacecloud.client.cloudfiles.FilesClient;
+	import com.rackspacecloud.client.cloudfiles.FilesConstants;
+	import com.rackspacecloud.client.cloudfiles.FilesContainer;
+	import com.rackspacecloud.client.cloudfiles.FilesContainerExistsException;
+	import com.rackspacecloud.client.cloudfiles.FilesObject;
+	import com.rackspacecloud.client.cloudfiles.FilesObjectMetaData;
+
+
+Create a Connection
+===================
+
+This creates a connection so that you can interact with the server:
+
+.. code-block:: java
+
+	String username = "USERNAME";
+	String password = "PASSWORD";
+	String authUrl  = "https://objects.dreamhost.com/auth";
+
+	FilesClient client = new FilesClient(username, password, authUrl);
+	if (!client.login()) {
+		throw new RuntimeException("Failed to log in");
+	}
+
+
+Create a Container
+==================
+
+This creates a new container called ``my-new-container``:
+
+.. code-block:: java
+
+	client.createContainer("my-new-container");
+
+
+Create an Object
+================
+
+This creates an object ``foo.txt`` from the file named ``foo.txt`` in 
+the container ``my-new-container``:
+
+.. code-block:: java
+
+	File file = new File("foo.txt");
+	String mimeType = FilesConstants.getMimetype("txt");
+	client.storeObject("my-new-container", file, mimeType);
+
+
+Add/Update Object Metadata
+==========================
+
+This adds the metadata key-value pair ``key``:``value`` to the object named
+``foo.txt`` in the container ``my-new-container``:
+
+.. code-block:: java
+
+	FilesObjectMetaData metaData = client.getObjectMetaData("my-new-container", "foo.txt");
+	metaData.addMetaData("key", "value");
+
+	Map<String, String> metamap = metaData.getMetaData();
+	client.updateObjectMetadata("my-new-container", "foo.txt", metamap);
+
+
+List Owned Containers
+=====================
+
+This gets a list of Containers that you own.
+This also prints out the container name.
+
+.. code-block:: java
+
+	List<FilesContainer> containers = client.listContainers();
+	for (FilesContainer container : containers) {
+		System.out.println("  " + container.getName());
+	}
+
+The output will look something like this::
+
+	mahbuckat1
+	mahbuckat2
+	mahbuckat3
+
+
+List a Container's Content
+==========================
+
+This gets a list of objects in the container ``my-new-container``; and, it also 
+prints out each object's name, the file size, and last modified date:
+
+.. code-block:: java
+
+	List<FilesObject> objects = client.listObjects("my-new-container");
+	for (FilesObject object : objects) {
+		System.out.println("  " + object.getName());
+	}
+
+The output will look something like this::
+
+   myphoto1.jpg
+   myphoto2.jpg
+
+
+Retrieve an Object's Metadata
+=============================
+
+This retrieves metadata and gets the MIME type for an object named ``foo.txt``
+in a container named ``my-new-container``:
+
+.. code-block:: java
+
+	FilesObjectMetaData metaData =	client.getObjectMetaData("my-new-container", "foo.txt");
+	String mimeType = metaData.getMimeType();
+
+Retrieve an Object
+==================
+
+This downloads the object ``foo.txt`` in the container ``my-new-container`` 
+and saves it in ``./outfile.txt``:
+
+.. code-block:: java
+
+	FilesObject obj;
+	File outfile = new File("outfile.txt");
+
+	List<FilesObject> objects = client.listObjects("my-new-container");
+	for (FilesObject object : objects) {
+		String name = object.getName();
+		if (name.equals("foo.txt")) {
+			obj = object;
+			obj.writeObjectToFile(outfile);
+		}
+	}
+
+
+Delete an Object
+================
+
+This deletes the object ``goodbye.txt`` in the container "my-new-container":
+
+.. code-block:: java
+
+	client.deleteObject("my-new-container", "goodbye.txt");
+
+Delete a Container
+==================
+
+This deletes a container named "my-new-container": 
+
+.. code-block:: java
+
+	client.deleteContainer("my-new-container");
+	
+.. note:: The container must be empty! Otherwise it won't work!
diff --git a/doc/radosgw/swift/objectops.rst b/doc/radosgw/swift/objectops.rst
new file mode 100644
index 0000000..edc3e35
--- /dev/null
+++ b/doc/radosgw/swift/objectops.rst
@@ -0,0 +1,271 @@
+===================
+ Object Operations
+===================
+
+An object is a container for storing data and metadata. A container may
+have many objects, but the object names must be unique. This API enables a 
+client to create an object, set access controls and metadata, retrieve an 
+object's data and metadata, and delete an object. Since this API makes requests 
+related to information in a particular user's account, all requests in this API 
+must be authenticated unless the container or object's access control is 
+deliberately made publicly accessible (i.e., allows anonymous requests).
+
+
+Create/Update an Object
+=======================
+
+To create a new object, make a ``PUT`` request with the API version, account,
+container name and the name of the new object. You must have write permission
+on the container to create or update an object. The object name must be 
+unique within the container. The ``PUT`` request is not idempotent, so if you
+do not use a unique name, the request will update the object. However, you may
+use pseudo-hierarchical syntax in your object name to distinguish it from 
+another object of the same name if it is under a different pseudo-hierarchical 
+directory. You may include access control headers and metadata headers in the 
+request.
+
+
+Syntax
+~~~~~~
+
+::
+
+   PUT /{api version}/{account}/{container}/{object} HTTP/1.1 
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``ETag``
+
+:Description: An MD5 hash of the object's contents. Recommended. 
+:Type: String
+:Required: No
+
+
+``Content-Type``
+
+:Description: The type of content the object contains.
+:Type: String
+:Required: No
+
+
+``Transfer-Encoding``
+
+:Description: Indicates whether the object is part of a larger aggregate object.
+:Type: String
+:Valid Values: ``chunked``
+:Required: No
+
+
+Copy an Object
+==============
+
+Copying an object allows you to make a server-side copy of an object, so that
+you don't have to download it and upload it under another container/name.
+To copy the contents of one object to another object, you may make either a
+``PUT`` request or a ``COPY`` request with the API version, account, and the 
+container name. For a ``PUT`` request, use the destination container and object
+name in the request, and the source container and object in the request header.
+For a ``Copy`` request, use the source container and object in the request, and
+the destination container and object in the request header. You must have write 
+permission on the container to copy an object. The destination object name must be 
+unique within the container. The request is not idempotent, so if you do not use 
+a unique name, the request will update the destination object. However, you may 
+use pseudo-hierarchical syntax in your object name to distinguish the destination 
+object from the source object of the same name if it is under a different 
+pseudo-hierarchical directory. You may include access control headers and metadata 
+headers in the request.
+
+Syntax
+~~~~~~
+
+::
+
+	PUT /{api version}/{account}/{dest-container}/{dest-object} HTTP/1.1
+	X-Copy-From: {source-container}/{source-object}
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+or alternatively:
+
+::
+
+	COPY /{api version}/{account}/{source-container}/{source-object} HTTP/1.1
+	Destination: {dest-container}/{dest-object}
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``X-Copy-From``
+
+:Description: Used with a ``PUT`` request to define the source container/object path.
+:Type: String
+:Required: Yes, if using ``PUT``
+
+
+``Destination``
+
+:Description: Used with a ``COPY`` request to define the destination container/object path.
+:Type: String
+:Required: Yes, if using ``COPY``
+
+
+``If-Modified-Since``
+
+:Description: Only copies if modified since the date/time of the source object's ``last_modified`` attribute.
+:Type: Date
+:Required: No
+
+
+``If-Unmodified-Since``
+
+:Description: Only copies if not modified since the date/time of the source object's ``last_modified`` attribute.
+:Type: Date
+:Required: No
+
+``Copy-If-Match``
+
+:Description: Copies only if the ETag in the request matches the source object's ETag.
+:Type: ETag.
+:Required: No
+
+
+``Copy-If-None-Match``
+
+:Description: Copies only if the ETag in the request does not match the source object's ETag.
+:Type: ETag.
+:Required: No
+
+
+Delete an Object
+================
+
+To delete an object, make a ``DELETE`` request with the API version, account,
+container and object name. You must have write permissions on the container to delete
+an object within it. Once you've successfully deleted the object, you'll be able to 
+reuse the object name.
+
+Syntax
+~~~~~~
+
+::
+
+	DELETE /{api version}/{account}/{container}/{object} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+Get an Object
+=============
+
+To retrieve an object, make a ``GET`` request with the API version, account,
+container and object name. You must have read permissions on the container to
+retrieve an object within it.
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{api version}/{account}/{container}/{object} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``range``
+
+:Description: To retrieve a subset of an object's contents, you may specify a byte range.
+:Type: Date
+:Required: No
+
+
+``If-Modified-Since``
+
+:Description: Only copies if modified since the date/time of the source object's ``last_modified`` attribute.
+:Type: Date
+:Required: No
+
+
+``If-Unmodified-Since``
+
+:Description: Only copies if not modified since the date/time of the source object's ``last_modified`` attribute.
+:Type: Date
+:Required: No
+
+``Copy-If-Match``
+
+:Description: Copies only if the ETag in the request matches the source object's ETag.
+:Type: ETag.
+:Required: No
+
+
+``Copy-If-None-Match``
+
+:Description: Copies only if the ETag in the request does not match the source object's ETag.
+:Type: ETag.
+:Required: No
+
+
+
+Response Headers
+~~~~~~~~~~~~~~~~
+
+``Content-Range``
+
+:Description: The range of the subset of object contents. Returned only if the range header field was specified in the request  
+
+
+Get Object Metadata
+===================
+
+To retrieve an object's metadata, make a ``HEAD`` request with the API version, 
+account, container and object name. You must have read permissions on the 
+container to retrieve metadata from an object within the container. This request
+returns the same header information as the request for the object itself, but
+it does not return the object's data.
+
+Syntax
+~~~~~~
+
+::
+
+	HEAD /{api version}/{account}/{container}/{object} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+
+Add/Update Object Metadata
+==========================
+
+To add metadata to an object, make a ``POST`` request with the API version, 
+account, container and object name. You must have write permissions on the 
+parent container to add or update metadata.
+
+
+Syntax
+~~~~~~
+
+::
+
+	POST /{api version}/{account}/{container}/{object} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``X-Object-Meta-{key}``
+
+:Description:  A user-defined meta data key that takes an arbitrary string value.
+:Type: String
+:Required: No
+
diff --git a/doc/radosgw/swift/python.rst b/doc/radosgw/swift/python.rst
new file mode 100644
index 0000000..c12f89f
--- /dev/null
+++ b/doc/radosgw/swift/python.rst
@@ -0,0 +1,114 @@
+.. _python_swift:
+
+=====================
+Python Swift Examples
+=====================
+
+Create a Connection
+===================
+
+This creates a connection so that you can interact with the server:
+
+.. code-block:: python
+
+	import swiftclient
+	user = 'account_name:username'
+	key = 'your_api_key'
+
+	conn = swiftclient.Connection(
+		user=user,
+		key=key,
+		authurl='https://objects.dreamhost.com/auth',
+	)
+
+
+Create a Container
+==================
+
+This creates a new container called ``my-new-container``:
+
+.. code-block:: python
+
+	container_name = 'my-new-container'
+	conn.put_container(container_name)
+
+
+Create an Object
+================
+
+This creates a file ``hello.txt`` from the file named ``my_hello.txt``:
+
+.. code-block:: python
+
+	with open('hello.txt', 'r') as hello_file:
+		conn.put_object(container_name, 'hello.txt',
+						contents= hello_file.read(),
+						content_type='text/plain')
+
+
+List Owned Containers
+=====================
+
+This gets a list of containers that you own, and prints out the container name:
+
+.. code-block:: python
+
+	for container in conn.get_account()[1]:
+		print container['name']
+
+The output will look something like this::
+
+   mahbuckat1
+   mahbuckat2
+   mahbuckat3
+
+List a Container's Content
+==========================
+
+This gets a list of objects in the container, and prints out each
+object's name, the file size, and last modified date:
+
+.. code-block:: python
+
+	for data in conn.get_container(container_name)[1]:
+		print '{0}\t{1}\t{2}'.format(data['name'], data['bytes'], data['last_modified'])
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+Retrieve an Object
+==================
+
+This downloads the object ``hello.txt`` and saves it in
+``./my_hello.txt``:
+
+.. code-block:: python
+
+	obj_tuple = conn.get_object(container_name, 'hello.txt')
+	with open('my_hello.txt', 'w') as my_hello:
+		my_hello.write(obj_tuple[1])
+
+
+Delete an Object
+================
+
+This deletes the object ``goodbye.txt``:
+
+.. code-block:: python
+
+	conn.delete_object(container_name, 'hello.txt')
+
+Delete a Container
+==================
+
+.. note::
+
+   The container must be empty! Otherwise the request won't work!
+
+.. code-block:: python
+
+	conn.delete_container(container_name)
+
diff --git a/doc/radosgw/swift/ruby.rst b/doc/radosgw/swift/ruby.rst
new file mode 100644
index 0000000..a20b66d
--- /dev/null
+++ b/doc/radosgw/swift/ruby.rst
@@ -0,0 +1,119 @@
+.. _ruby_swift:
+
+=====================
+ Ruby Swift Examples
+=====================
+
+Create a Connection
+===================
+
+This creates a connection so that you can interact with the server:
+
+.. code-block:: ruby
+
+	require 'cloudfiles'
+	username = 'account_name:user_name'
+	api_key  = 'your_secret_key'
+
+	conn = CloudFiles::Connection.new(
+		:username => username,
+		:api_key  => api_key,
+		:auth_url => 'http://objects.dreamhost.com/auth'
+	)
+
+
+Create a Container
+==================
+
+This creates a new container called ``my-new-container``
+
+.. code-block:: ruby
+
+	container = conn.create_container('my-new-container')
+
+
+Create an Object
+================
+
+This creates a file ``hello.txt`` from the file named ``my_hello.txt``
+
+.. code-block:: ruby
+
+	obj = container.create_object('hello.txt')
+	obj.load_from_filename('./my_hello.txt')
+	obj.content_type = 'text/plain'
+
+
+
+List Owned Containers
+=====================
+
+This gets a list of Containers that you own, and also prints out 
+the container name:
+
+.. code-block:: ruby
+
+	conn.containers.each do |container|
+		puts container
+	end
+
+The output will look something like this::
+
+   mahbuckat1
+   mahbuckat2
+   mahbuckat3
+
+
+List a Container's Contents
+===========================
+
+This gets a list of objects in the container, and prints out each 
+object's name, the file size, and last modified date:
+
+.. code-block:: ruby
+
+	require 'date'  # not necessary in the next version
+
+	container.objects_detail.each do |name, data|
+		puts "#{name}\t#{data[:bytes]}\t#{data[:last_modified]}"
+	end
+
+The output will look something like this::
+
+   myphoto1.jpg	251262	2011-08-08T21:35:48.000Z
+   myphoto2.jpg	262518	2011-08-08T21:38:01.000Z
+
+
+
+Retrieve an Object
+==================
+
+This downloads the object ``hello.txt`` and saves it in
+``./my_hello.txt``:
+
+.. code-block:: ruby
+
+	obj = container.object('hello.txt')
+	obj.save_to_filename('./my_hello.txt')
+
+
+Delete an Object
+================
+
+This deletes the object ``goodbye.txt``:
+
+.. code-block:: ruby
+
+	container.delete_object('goodbye.txt')
+	
+
+Delete a Container
+==================
+
+.. note::
+
+   The container must be empty! Otherwise the request won't work!
+
+.. code-block:: ruby
+
+	container.delete_container('my-new-container')
diff --git a/doc/radosgw/swift/serviceops.rst b/doc/radosgw/swift/serviceops.rst
new file mode 100644
index 0000000..a00f3d8
--- /dev/null
+++ b/doc/radosgw/swift/serviceops.rst
@@ -0,0 +1,76 @@
+====================
+ Service Operations
+====================
+
+To retrieve data about our Swift-compatible service, you may execute ``GET`` 
+requests using the ``X-Storage-Url`` value retrieved during authentication. 
+
+List Containers
+===============
+
+A ``GET`` request that specifies the API version and the account will return
+a list of containers for a particular user account. Since the request returns
+a particular user's containers, the request requires an authentication token.
+The request cannot be made anonymously.
+
+Syntax
+~~~~~~
+
+::
+
+	GET /{api version}/{account} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+
+
+Request Parameters
+~~~~~~~~~~~~~~~~~~
+
+``limit``
+
+:Description: Limits the number of results to the specified value.
+:Type: Integer
+:Required: No
+
+``format``
+
+:Description: Defines the format of the result. 
+:Type: String
+:Valid Values: ``json`` | ``xml``
+:Required: No
+
+
+``marker``
+
+:Description: Returns a list of results greater than the marker value.
+:Type: String
+:Required: No
+
+
+
+Response Entities
+~~~~~~~~~~~~~~~~~
+
+The response contains a list of containers, or returns with an HTTP
+204 response code
+
+``account``
+
+:Description: A list for account information.
+:Type: Container
+
+``container``
+
+:Description: The list of containers.
+:Type: Container
+
+``name``
+
+:Description: The name of a container.
+:Type: String
+
+``bytes``
+
+:Description: The size of the container.
+:Type: Integer
\ No newline at end of file
diff --git a/doc/radosgw/swift/tempurl.rst b/doc/radosgw/swift/tempurl.rst
new file mode 100644
index 0000000..e1a5179
--- /dev/null
+++ b/doc/radosgw/swift/tempurl.rst
@@ -0,0 +1,85 @@
+====================
+ Temp URL Operations
+====================
+
+To allow temporary access (for eg for `GET` requests) to objects
+without the need to share credentials, temp url functionality is
+supported by swift endpoint of radosgw. For this functionality,
+initially the value of `X-Account-Meta-Temp-URL-Key` and optionally
+`X-Account-Meta-Temp-URL-Key-2` should be set. The Temp URL
+functionality relies on a HMAC-SHA1 signature against these secret
+keys.
+
+POST Temp-URL Keys
+==================
+
+A ``POST`` request to the swift account with the required Key will set
+the secret temp url key for the account against which temporary url
+access can be provided to accounts. Up to two keys are supported, and
+signatures are checked against both the keys, if present, so that keys
+can be rotated without invalidating the temporary urls.
+
+Syntax
+~~~~~~
+
+::
+
+	POST /{api version}/{account} HTTP/1.1
+	Host: {fqdn}
+	X-Auth-Token: {auth-token}
+
+Request Headers
+~~~~~~~~~~~~~~~
+
+``X-Account-Meta-Temp-URL-Key``
+
+:Description: A user-defined key that takes an arbitrary string value.
+:Type: String
+:Required: Yes
+
+``X-Account-Meta-Temp-URL-Key-2``
+
+:Description: A user-defined key that takes an arbitrary string value.
+:Type: String
+:Required: No
+
+
+GET Temp-URL Objects
+====================
+
+Temporary URL uses a cryptographic HMAC-SHA1 signature, which includes
+the following elements:
+
+#. The value of the Request method, "GET" for instance
+#. The expiry time, in format of seconds since the epoch, ie Unix time
+#. The request path starting from "v1" onwards
+
+The above items are normalized with newlines appended between them,
+and a HMAC is generated using the SHA-1 hashing algorithm against one
+of the Temp URL Keys posted earlier.
+
+A sample python script to demonstrate the above is given below:
+
+
+.. code-block:: python
+
+   import hmac
+   from hashlib import sha1
+   from time import time
+
+   method = 'GET'
+   host = 'https://objectstore.example.com'
+   duration_in_seconds = 300  # Duration for which the url is valid
+   expires = int(time() + duration_in_seconds)
+   path = '/v1/your-bucket/your-object'
+   key = 'secret'
+   hmac_body = '%s\n%s\n%s' % (method, expires, path)
+   hmac_body = hmac.new(key, hmac_body, sha1).hexdigest()
+   sig = hmac.new(key, hmac_body, sha1).hexdigest()
+   rest_uri = "{host}{path}?temp_url_sig={sig}&temp_url_expires={expires}".format(
+		host=host, path=path, sig=sig, expires=expires)
+   print rest_uri
+
+   # Example Output
+   # https://objectstore.example.com/v1/your-bucket/your-object?temp_url_sig=ff4657876227fc6025f04fcf1e82818266d022c6&temp_url_expires=1423200992
+
diff --git a/doc/radosgw/swift/tutorial.rst b/doc/radosgw/swift/tutorial.rst
new file mode 100644
index 0000000..8287d19
--- /dev/null
+++ b/doc/radosgw/swift/tutorial.rst
@@ -0,0 +1,60 @@
+==========
+ Tutorial
+==========
+
+The Swift-compatible API tutorials follow a simple container-based object 
+lifecycle. The first step requires you to setup a connection between your 
+client and the RADOS Gateway server. Then, you may follow a natural 
+container and object lifecycle, including adding and retrieving object 
+metadata. See example code for the following languages:
+
+- `Java`_
+- `Python`_
+- `Ruby`_
+
+
+.. ditaa:: +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           |    Create a Connection     |------->|      Create a Container     |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+                                                                |
+                         +--------------------------------------+ 
+                         |
+                         v
+           +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           |     Create an Object       |------->| Add/Update Object Metadata  |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+                                                                |
+                         +--------------------------------------+ 
+                         |
+                         v
+           +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           |   List Owned Containers    |------->| List a Container's Contents |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+                                                                |
+                         +--------------------------------------+ 
+                         |
+                         v
+           +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           | Get an Object's Metadata   |------->|     Retrieve an Object      |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+                                                                |
+                         +--------------------------------------+ 
+                         |
+                         v
+           +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           |      Delete an Object      |------->|      Delete a Container     |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+
+.. _Java: ../java
+.. _Python: ../python
+.. _Ruby: ../ruby
diff --git a/doc/radosgw/troubleshooting.rst b/doc/radosgw/troubleshooting.rst
new file mode 100644
index 0000000..3e4a057
--- /dev/null
+++ b/doc/radosgw/troubleshooting.rst
@@ -0,0 +1,179 @@
+=================
+ Troubleshooting
+=================
+
+
+The Gateway Won't Start
+=======================
+
+If you cannot start the gateway (i.e., there is no existing ``pid``), 
+check to see if there is an existing ``.asok`` file from another 
+user. If an ``.asok`` file from another user exists and there is no
+running ``pid``, remove the ``.asok`` file and try to start the
+process again.
+
+This may occur when you start the process as a ``root`` user and 
+the startup script is trying to start the process as a 
+``www-data`` or ``apache`` user and an existing ``.asok`` is 
+preventing the script from starting the daemon.
+
+The radosgw init script (/etc/init.d/radosgw) also has a verbose argument that
+can provide some insight as to what could be the issue:
+
+  /etc/init.d/radosgw start -v
+
+or
+
+  /etc/init.d radosgw start --verbose
+
+HTTP Request Errors
+===================
+
+Examining the access and error logs for the web server itself is
+probably the first step in identifying what is going on.  If there is
+a 500 error, that usually indicates a problem communicating with the
+``radosgw`` daemon.  Ensure the daemon is running, its socket path is
+configured, and that the web server is looking for it in the proper
+location.
+
+
+Crashed ``radosgw`` process
+===========================
+
+If the ``radosgw`` process dies, you will normally see a 500 error
+from the web server (apache, nginx, etc.).  In that situation, simply
+restarting radosgw will restore service.
+
+To diagnose the cause of the crash, check the log in ``/var/log/ceph``
+and/or the core file (if one was generated).
+
+
+Blocked ``radosgw`` Requests
+============================
+
+If some (or all) radosgw requests appear to be blocked, you can get
+some insight into the internal state of the ``radosgw`` daemon via
+its admin socket.  By default, there will be a socket configured to
+reside in ``/var/run/ceph``, and the daemon can be queried with::
+
+ ceph daemon /var/run/ceph/client.rgw help
+ 
+ help                list available commands
+ objecter_requests   show in-progress osd requests
+ perfcounters_dump   dump perfcounters value
+ perfcounters_schema dump perfcounters schema
+ version             get protocol version
+
+Of particular interest::
+
+ ceph daemon /var/run/ceph/client.rgw objecter_requests
+ ...
+
+will dump information about current in-progress requests with the
+RADOS cluster.  This allows one to identify if any requests are blocked
+by a non-responsive OSD.  For example, one might see::
+
+  { "ops": [
+        { "tid": 1858,
+          "pg": "2.d2041a48",
+          "osd": 1,
+          "last_sent": "2012-03-08 14:56:37.949872",
+          "attempts": 1,
+          "object_id": "fatty_25647_object1857",
+          "object_locator": "@2",
+          "snapid": "head",
+          "snap_context": "0=[]",
+          "mtime": "2012-03-08 14:56:37.949813",
+          "osd_ops": [
+                "write 0~4096"]},
+        { "tid": 1873,
+          "pg": "2.695e9f8e",
+          "osd": 1,
+          "last_sent": "2012-03-08 14:56:37.970615",
+          "attempts": 1,
+          "object_id": "fatty_25647_object1872",
+          "object_locator": "@2",
+          "snapid": "head",
+          "snap_context": "0=[]",
+          "mtime": "2012-03-08 14:56:37.970555",
+          "osd_ops": [
+                "write 0~4096"]}],
+  "linger_ops": [],
+  "pool_ops": [],
+  "pool_stat_ops": [],
+  "statfs_ops": []}
+
+In this dump, two requests are in progress.  The ``last_sent`` field is
+the time the RADOS request was sent.  If this is a while ago, it suggests
+that the OSD is not responding.  For example, for request 1858, you could
+check the OSD status with::
+
+ ceph pg map 2.d2041a48
+ 
+ osdmap e9 pg 2.d2041a48 (2.0) -> up [1,0] acting [1,0]
+
+This tells us to look at ``osd.1``, the primary copy for this PG::
+
+ ceph daemon osd.1 ops
+ { "num_ops": 651,
+  "ops": [
+        { "description": "osd_op(client.4124.0:1858 fatty_25647_object1857 [write 0~4096] 2.d2041a48)",
+          "received_at": "1331247573.344650",
+          "age": "25.606449",
+          "flag_point": "waiting for sub ops",
+          "client_info": { "client": "client.4124",
+              "tid": 1858}},
+ ...
+
+The ``flag_point`` field indicates that the OSD is currently waiting
+for replicas to respond, in this case ``osd.0``.
+
+
+Java S3 API Troubleshooting
+===========================
+
+
+Peer Not Authenticated
+----------------------
+
+You may receive an error that looks like this:: 
+
+     [java] INFO: Unable to execute HTTP request: peer not authenticated
+
+The Java SDK for S3 requires a valid certificate from a recognized certificate
+authority, because it uses HTTPS by default. If you are just testing the Ceph
+Object Storage services, you can resolve this problem in a few ways:  
+
+#. Prepend the IP address or hostname with ``http://``. For example, change this::
+
+	conn.setEndpoint("myserver");
+
+   To:: 
+
+	conn.setEndpoint("http://myserver")
+
+#. After setting your credentials, add a client configuration and set the 
+   protocol to ``Protocol.HTTP``. :: 
+
+			AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
+			
+			ClientConfiguration clientConfig = new ClientConfiguration();
+			clientConfig.setProtocol(Protocol.HTTP);
+			
+			AmazonS3 conn = new AmazonS3Client(credentials, clientConfig);
+
+
+
+405 MethodNotAllowed
+--------------------
+
+If you receive an 405 error, check to see if you have the S3 subdomain set up correctly. 
+You will need to have a wild card setting in your DNS record for subdomain functionality
+to work properly.
+
+Also, check to ensure that the default site is disabled. ::
+
+     [java] Exception in thread "main" Status Code: 405, AWS Service: Amazon S3, AWS Request ID: null, AWS Error Code: MethodNotAllowed, AWS Error Message: null, S3 Extended Request ID: null
+  
+  
+  
diff --git a/doc/rbd/disk.conf b/doc/rbd/disk.conf
new file mode 100644
index 0000000..3db9b8a
--- /dev/null
+++ b/doc/rbd/disk.conf
@@ -0,0 +1,8 @@
+<disk type='network' device='disk'>
+	<source protocol='rbd' name='poolname/imagename'>
+		<host name='{fqdn}' port='6789'/>
+		<host name='{fqdn}' port='6790'/>
+		<host name='{fqdn}' port='6791'/>
+	</source>
+	<target dev='vda' bus='virtio'/>
+</disk>
diff --git a/doc/rbd/librbdpy.rst b/doc/rbd/librbdpy.rst
new file mode 100644
index 0000000..da823c7
--- /dev/null
+++ b/doc/rbd/librbdpy.rst
@@ -0,0 +1,82 @@
+================
+ Librbd (Python)
+================
+
+.. highlight:: python
+
+The `rbd` python module provides file-like access to RBD images.
+
+
+Example: Creating and writing to an image
+=========================================
+
+To use `rbd`, you must first connect to RADOS and open an IO
+context::
+
+    cluster = rados.Rados(conffile='my_ceph.conf')
+    cluster.connect()
+    ioctx = cluster.open_ioctx('mypool')
+
+Then you instantiate an :class:rbd.RBD object, which you use to create the
+image::
+
+    rbd_inst = rbd.RBD()
+    size = 4 * 1024**3  # 4 GiB
+    rbd_inst.create(ioctx, 'myimage', size)
+
+To perform I/O on the image, you instantiate an :class:rbd.Image object::
+
+    image = rbd.Image(ioctx, 'myimage')
+    data = 'foo' * 200
+    image.write(data, 0)
+
+This writes 'foo' to the first 600 bytes of the image. Note that data
+cannot be :type:unicode - `Librbd` does not know how to deal with
+characters wider than a :c:type:char.
+
+In the end, you'll want to close the image, the IO context and the connection to RADOS::
+
+    image.close()
+    ioctx.close()
+    cluster.shutdown()
+
+To be safe, each of these calls would need to be in a separate :finally
+block::
+
+    cluster = rados.Rados(conffile='my_ceph_conf')
+    try:
+        ioctx = cluster.open_ioctx('my_pool')
+        try:
+            rbd_inst = rbd.RBD()
+            size = 4 * 1024**3  # 4 GiB
+            rbd_inst.create(ioctx, 'myimage', size)
+            image = rbd.Image(ioctx, 'myimage')
+            try:
+                data = 'foo' * 200
+                image.write(data, 0)
+            finally:
+                image.close()
+        finally:
+            ioctx.close()
+    finally:
+        cluster.shutdown()
+
+This can be cumbersome, so the :class:`Rados`, :class:`Ioctx`, and
+:class:`Image` classes can be used as context managers that close/shutdown
+automatically (see :pep:`343`). Using them as context managers, the
+above example becomes::
+
+    with rados.Rados(conffile='my_ceph.conf') as cluster:
+        with cluster.open_ioctx('mypool') as ioctx:
+            rbd_inst = rbd.RBD()
+            size = 4 * 1024**3  # 4 GiB
+            rbd_inst.create(ioctx, 'myimage', size)
+            with rbd.Image(ioctx, 'myimage') as image:
+                data = 'foo' * 200
+                image.write(data, 0)
+
+API Reference
+=============
+
+.. automodule:: rbd
+    :members: RBD, Image, SnapIterator
diff --git a/doc/rbd/libvirt.rst b/doc/rbd/libvirt.rst
new file mode 100644
index 0000000..9a8ad57
--- /dev/null
+++ b/doc/rbd/libvirt.rst
@@ -0,0 +1,303 @@
+=================================
+ Using libvirt with Ceph RBD
+=================================
+
+.. index:: Ceph Block Device; livirt
+
+The ``libvirt`` library creates a virtual machine abstraction layer between 
+hypervisor interfaces and the software applications that use them. With 
+``libvirt``, developers and system administrators can focus on a common 
+management framework, common API, and common shell interface (i.e., ``virsh``)
+to many different hypervisors, including: 
+
+- QEMU/KVM
+- XEN
+- LXC
+- VirtualBox
+- etc.
+
+Ceph block devices support QEMU/KVM. You can use Ceph block devices with
+software that interfaces with ``libvirt``. The following stack diagram
+illustrates how ``libvirt`` and QEMU use Ceph block devices via ``librbd``. 
+
+
+.. ditaa::  +---------------------------------------------------+
+            |                     libvirt                       |
+            +------------------------+--------------------------+
+                                     |
+                                     | configures
+                                     v
+            +---------------------------------------------------+
+            |                       QEMU                        |
+            +---------------------------------------------------+
+            |                      librbd                       |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+
+
+
+The most common ``libvirt`` use case involves providing Ceph block devices to
+cloud solutions like OpenStack or CloudStack. The cloud solution uses
+``libvirt`` to  interact with QEMU/KVM, and QEMU/KVM interacts with Ceph block
+devices via  ``librbd``. See `Block Devices and OpenStack`_ and `Block Devices
+and CloudStack`_ for details. See `Installation`_ for installation details.
+
+You can also use Ceph block devices with ``libvirt``, ``virsh`` and the
+``libvirt`` API. See `libvirt Virtualization API`_ for details.
+
+
+To create VMs that use Ceph block devices, use the procedures in the following
+sections. In the exemplary embodiment, we've used ``libvirt-pool`` for the pool
+name, ``client.libvirt`` for the user name, and ``new-libvirt-image`` for  the
+image name. You may use any value you like, but ensure you replace those values
+when executing commands in the subsequent procedures.
+
+
+Configuring Ceph
+================
+
+To configure Ceph for use with ``libvirt``, perform the following steps:
+
+#. `Create a pool`_ (or use the default). The following example uses the 
+   pool name ``libvirt-pool`` with 128 placement groups. ::
+
+	ceph osd pool create libvirt-pool 128 128
+
+   Verify the pool exists. :: 
+
+	ceph osd lspools
+
+#. `Create a Ceph User`_ (or use ``client.admin`` for version 0.9.7 and 
+   earlier). The following example uses the Ceph user name ``client.libvirt`` 
+   and references ``libvirt-pool``. ::
+
+	ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'
+	
+   Verify the name exists. :: 
+   
+	ceph auth list
+
+   **NOTE**: ``libvirt`` will access Ceph using the ID ``libvirt``, 
+   not the Ceph name ``client.libvirt``. See `User Management - User`_ and 
+   `User Management - CLI`_ for a detailed explanation of the difference 
+   between ID and name.	
+
+#. Use QEMU to `create an image`_ in your RBD pool. 
+   The following example uses the image name ``new-libvirt-image``
+   and references ``libvirt-pool``. ::
+
+	qemu-img create -f rbd rbd:libvirt-pool/new-libvirt-image 2G
+
+   Verify the image exists. :: 
+
+	rbd -p libvirt-pool ls
+
+   **NOTE:** You can also use `rbd create`_ to create an image, but we
+   recommend ensuring that QEMU is working properly.
+
+
+
+Preparing the VM Manager
+========================
+
+You may use ``libvirt`` without a VM manager, but you may find it simpler to
+create your first domain with ``virt-manager``. 
+
+#. Install a virtual machine manager. See `KVM/VirtManager`_ for details. ::
+
+	sudo apt-get install virt-manager
+
+#. Download an OS image (if necessary).
+
+#. Launch the virtual machine manager. :: 
+
+	sudo virt-manager
+
+
+
+Creating a VM
+=============
+
+To create a VM with ``virt-manager``, perform the following steps:
+
+#. Press the **Create New Virtual Machine** button. 
+
+#. Name the new virtual machine domain. In the exemplary embodiment, we
+   use the name ``libvirt-virtual-machine``. You may use any name you wish,
+   but ensure you replace ``libvirt-virtual-machine`` with the name you 
+   choose in subsequent commandline and configuration examples. :: 
+
+	libvirt-virtual-machine
+
+#. Import the image. ::
+
+	/path/to/image/recent-linux.img
+
+   **NOTE:** Import a recent image. Some older images may not rescan for 
+   virtual devices properly.
+   
+#. Configure and start the VM.
+
+#. You may use ``virsh list`` to verify the VM domain exists. ::
+
+	sudo virsh list
+
+#. Login to the VM (root/root)
+
+#. Stop the VM before configuring it for use with Ceph.
+
+
+Configuring the VM
+==================
+
+When configuring the VM for use with Ceph, it is important  to use ``virsh``
+where appropriate. Additionally, ``virsh`` commands often require root
+privileges  (i.e., ``sudo``) and will not return appropriate results or notify
+you that that root privileges are required. For a reference of ``virsh``
+commands, refer to `Virsh Command Reference`_.
+
+
+#. Open the configuration file with ``virsh edit``. :: 
+
+	sudo virsh edit {vm-domain-name}
+
+   Under ``<devices>`` there should be a ``<disk>`` entry. :: 
+
+	<devices>
+		<emulator>/usr/bin/kvm</emulator>
+		<disk type='file' device='disk'>
+			<driver name='qemu' type='raw'/>
+			<source file='/path/to/image/recent-linux.img'/>
+			<target dev='vda' bus='virtio'/>
+			<address type='drive' controller='0' bus='0' unit='0'/>
+		</disk>
+
+
+   Replace ``/path/to/image/recent-linux.img`` with the path to the OS image.
+   The minimum kernel for using the faster ``virtio`` bus is 2.6.25. See 
+   `Virtio`_ for details.
+
+   **IMPORTANT:** Use ``sudo virsh edit`` instead of a text editor. If you edit 
+   the configuration file under ``/etc/libvirt/qemu`` with a text editor, 
+   ``libvirt`` may not recognize the change. If there is a discrepancy between 
+   the contents of the XML file under ``/etc/libvirt/qemu`` and the result of 
+   ``sudo virsh dumpxml {vm-domain-name}``, then your VM may not work 
+   properly.
+   
+
+#. Add the Ceph RBD image you created as a ``<disk>`` entry. :: 
+
+	<disk type='network' device='disk'>
+		<source protocol='rbd' name='libvirt-pool/new-libvirt-image'>
+			<host name='{monitor-host}' port='6789'/>
+		</source>
+		<target dev='vda' bus='virtio'/>
+	</disk>
+
+   Replace ``{monitor-host}`` with the name of your host, and replace the 
+   pool and/or image name as necessary. You may add multiple ``<host>`` 
+   entries for your Ceph monitors. The ``dev`` attribute is the logical
+   device name that will appear under the ``/dev`` directory of your 
+   VM. The optional ``bus`` attribute indicates the type of disk device to 
+   emulate. The valid settings are driver specific (e.g., "ide", "scsi", 
+   "virtio", "xen", "usb" or "sata").
+   
+   See `Disks`_ for details of the ``<disk>`` element, and its child elements
+   and attributes.
+	
+#. Save the file.
+
+#. If your Ceph Storage Cluster has `Ceph Authentication`_ enabled (it does by 
+   default), you must generate a secret. :: 
+
+	cat > secret.xml <<EOF
+	<secret ephemeral='no' private='no'>
+		<usage type='ceph'>
+			<name>client.libvirt secret</name>
+		</usage>
+	</secret>
+	EOF
+
+#. Define the secret. ::
+
+	sudo virsh secret-define --file secret.xml
+	<uuid of secret is output here>
+
+#. Get the ``client.libvirt`` key and save the key string to a file. ::
+
+	ceph auth get-key client.libvirt | sudo tee client.libvirt.key
+
+#. Set the UUID of the secret. :: 
+
+	sudo virsh secret-set-value --secret {uuid of secret} --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
+
+   You must also set the secret manually by adding the following ``<auth>`` 
+   entry to the ``<disk>`` element you entered earlier (replacing the
+   ``uuid`` value with the result from the command line example above). ::
+
+	sudo virsh edit {vm-domain-name}
+
+   Then, add ``<auth></auth>`` element to the domain configuration file::
+
+	...
+	</source>
+	<auth username='libvirt'>
+		<secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/>
+	</auth>
+	<target ... 
+
+
+   **NOTE:** The exemplary ID is ``libvirt``, not the Ceph name 
+   ``client.libvirt`` as generated at step 2 of `Configuring Ceph`_. Ensure 
+   you use the ID component of the Ceph name you generated. If for some reason 
+   you need to regenerate the secret, you will have to execute 
+   ``sudo virsh secret-undefine {uuid}`` before executing 
+   ``sudo virsh secret-set-value`` again.
+
+
+Summary
+=======
+
+Once you have configured the VM for use with Ceph, you can start the VM.
+To verify that the VM and Ceph are communicating, you may perform the
+following procedures.
+
+
+#. Check to see if Ceph is running:: 
+
+	ceph health
+
+#. Check to see if the VM is running. :: 
+
+	sudo virsh list
+
+#. Check to see if the VM is communicating with Ceph. Replace 
+   ``{vm-domain-name}`` with the name of your VM domain:: 
+
+	sudo virsh qemu-monitor-command --hmp {vm-domain-name} 'info block'
+
+#. Check to see if the device from ``<target dev='hdb' bus='ide'/>`` appears
+   under ``/dev`` or under ``proc/partitions``. :: 
+   
+	ls dev
+	cat proc/partitions
+
+If everything looks okay, you may begin using the Ceph block device 
+within your VM.
+
+
+.. _Installation: ../../install
+.. _libvirt Virtualization API: http://www.libvirt.org
+.. _Block Devices and OpenStack: ../rbd-openstack
+.. _Block Devices and CloudStack: ../rbd-cloudstack
+.. _Create a pool: ../../rados/operations/pools#create-a-pool
+.. _Create a Ceph User: ../../rados/operations/user-management#add-a-user
+.. _create an image: ../qemu-rbd#creating-images-with-qemu
+.. _Virsh Command Reference: http://www.libvirt.org/virshcmdref.html
+.. _KVM/VirtManager: https://help.ubuntu.com/community/KVM/VirtManager
+.. _Ceph Authentication: ../../rados/configuration/auth-config-ref
+.. _Disks: http://www.libvirt.org/formatdomain.html#elementsDisks
+.. _rbd create: ../rados-rbd-cmds#creating-a-block-device-image
+.. _User Management - User: ../../rados/operations/user-management#user
+.. _User Management - CLI: ../../rados/operations/user-management#command-line-usage
+.. _Virtio: http://www.linux-kvm.org/page/Virtio
diff --git a/doc/rbd/qemu-rbd.rst b/doc/rbd/qemu-rbd.rst
new file mode 100644
index 0000000..e771acd
--- /dev/null
+++ b/doc/rbd/qemu-rbd.rst
@@ -0,0 +1,218 @@
+========================
+ QEMU and Block Devices
+========================
+
+.. index:: Ceph Block Device; QEMU KVM
+
+The most frequent Ceph Block Device use case involves providing block device
+images to virtual machines. For example, a user may create  a "golden" image
+with an OS and any relevant software in an ideal configuration. Then, the user
+takes a snapshot of the image. Finally, the user clones the snapshot (usually
+many times). See `Snapshots`_ for details. The ability to make copy-on-write
+clones of a snapshot means that Ceph can provision block device images to
+virtual machines quickly, because the client doesn't have to download an entire
+image each time it spins up a new virtual machine.
+
+
+.. ditaa::  +---------------------------------------------------+
+            |                       QEMU                        |
+            +---------------------------------------------------+
+            |                      librbd                       |
+            +---------------------------------------------------+
+            |                     librados                      |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+
+
+
+Ceph Block Devices can integrate with the QEMU virtual machine. For details on
+QEMU, see  `QEMU Open Source Processor Emulator`_. For QEMU documentation, see
+`QEMU Manual`_. For installation details, see `Installation`_.
+
+.. important:: To use Ceph Block Devices with QEMU, you must have access to a 
+   running Ceph cluster.
+
+
+Usage
+=====
+
+The QEMU command line expects you to specify the pool name and image name. You
+may also specify a snapshot name. 
+
+QEMU will assume that the Ceph configuration file resides in the default
+location (e.g., ``/etc/ceph/$cluster.conf``) and that you are executing
+commands as the default ``client.admin`` user unless you expressly specify
+another Ceph configuration file path or another user. When specifying a user,
+QEMU uses the ``ID`` rather than the full ``TYPE:ID``. See `User Management -
+User`_ for details. Do not prepend the client type (i.e., ``client.``) to the
+beginning of the user  ``ID``, or you will receive an authentication error. You
+should have the key for the ``admin`` user or the key of another user you
+specify with the ``:id={user}`` option in a keyring file stored in default path
+(i.e., ``/etc/ceph`` or the local directory with appropriate file ownership and
+permissions. Usage takes the following form::
+
+	qemu-img {command} [options] rbd:{pool-name}/{image-name}[@snapshot-name][:option1=value1][:option2=value2...]
+
+For example, specifying the ``id`` and ``conf`` options might look like the following:: 
+
+	qemu-img {command} [options] rbd:glance-pool/maipo:id=glance:conf=/etc/ceph/ceph.conf
+
+.. tip:: Configuration values containing ``:``, ``@``, or ``=`` can be escaped with a
+         leading ``\`` character.
+
+
+Creating Images with QEMU
+=========================
+
+You can create a block device image from QEMU. You must specify ``rbd``,  the
+pool name, and the name of the image you wish to create. You must also specify
+the size of the image. ::
+
+	qemu-img create -f raw rbd:{pool-name}/{image-name} {size}
+
+For example::
+
+	qemu-img create -f raw rbd:data/foo 10G
+
+.. important:: The ``raw`` data format is really the only sensible
+   ``format`` option to use with RBD. Technically, you could use other
+   QEMU-supported formats (such as ``qcow2`` or ``vmdk``), but doing
+   so would add additional overhead, and would also render the volume
+   unsafe for virtual machine live migration when caching (see below)
+   is enabled.
+
+
+Resizing Images with QEMU
+=========================
+
+You can resize a block device image from QEMU. You must specify ``rbd``, 
+the pool name, and the name of the image you wish to resize. You must also
+specify the size of the image. ::
+
+	qemu-img resize rbd:{pool-name}/{image-name} {size}
+
+For example::
+
+	qemu-img resize rbd:data/foo 10G
+
+
+Retrieving Image Info with QEMU
+===============================
+
+You can retrieve block device image information from QEMU. You must 
+specify ``rbd``, the pool name, and the name of the image. ::
+
+	qemu-img info rbd:{pool-name}/{image-name}
+
+For example::
+
+	qemu-img info rbd:data/foo
+
+
+Running QEMU with RBD
+=====================
+
+QEMU can pass a block device from the host on to a guest, but since
+QEMU 0.15, there's no need to map an image as a block device on
+the host. Instead, QEMU can access an image as a virtual block
+device directly via ``librbd``. This performs better because it avoids
+an additional context switch, and can take advantage of `RBD caching`_.
+
+You can use ``qemu-img`` to convert existing virtual machine images to Ceph
+block device images. For example, if you have a qcow2 image, you could run::
+
+    qemu-img convert -f qcow2 -O raw debian_squeeze.qcow2 rbd:data/squeeze
+
+To run a virtual machine booting from that image, you could run::
+
+    qemu -m 1024 -drive format=raw,file=rbd:data/squeeze
+
+`RBD caching`_ can significantly improve performance.
+Since QEMU 1.2, QEMU's cache options control ``librbd`` caching::
+
+    qemu -m 1024 -drive format=rbd,file=rbd:data/squeeze,cache=writeback
+
+If you have an older version of QEMU, you can set the ``librbd`` cache
+configuration (like any Ceph configuration option) as part of the
+'file' parameter::
+
+    qemu -m 1024 -drive format=raw,file=rbd:data/squeeze:rbd_cache=true,cache=writeback
+
+.. important:: If you set rbd_cache=true, you must set cache=writeback
+   or risk data loss. Without cache=writeback, QEMU will not send
+   flush requests to librbd. If QEMU exits uncleanly in this
+   configuration, filesystems on top of rbd can be corrupted.
+
+.. _RBD caching: ../rbd-config-ref/#rbd-cache-config-settings
+
+
+.. index:: Ceph Block Device; discard trim and libvirt
+
+Enabling Discard/TRIM
+=====================
+
+Since Ceph version 0.46 and QEMU version 1.1, Ceph Block Devices support the
+discard operation. This means that a guest can send TRIM requests to let a Ceph
+block device reclaim unused space. This can be enabled in the guest by mounting
+``ext4`` or ``XFS`` with the ``discard`` option.
+
+For this to be available to the guest, it must be explicitly enabled
+for the block device. To do this, you must specify a
+``discard_granularity`` associated with the drive::
+
+    qemu -m 1024 -drive format=raw,file=rbd:data/squeeze,id=drive1,if=none \
+         -device driver=ide-hd,drive=drive1,discard_granularity=512
+
+Note that this uses the IDE driver. The virtio driver does not
+support discard.
+
+If using libvirt, edit your libvirt domain's configuration file using ``virsh
+edit`` to include the ``xmlns:qemu`` value. Then, add a ``qemu:commandline``
+block as a child of that domain. The following example shows how to set two
+devices with ``qemu id=`` to different ``discard_granularity`` values.
+
+.. code-block:: guess
+
+	<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
+		<qemu:commandline>
+			<qemu:arg value='-set'/>
+			<qemu:arg value='block.scsi0-0-0.discard_granularity=4096'/>
+			<qemu:arg value='-set'/>
+			<qemu:arg value='block.scsi0-0-1.discard_granularity=65536'/>
+		</qemu:commandline>
+	</domain>
+
+
+.. index:: Ceph Block Device; cache options
+
+QEMU Cache Options
+==================
+
+QEMU's cache options correspond to the following Ceph `RBD Cache`_ settings.
+
+Writeback::
+
+   rbd_cache = true
+
+Writethrough::
+
+   rbd_cache = true
+   rbd_cache_max_dirty = 0
+
+None:: 
+
+   rbd_cache = false
+
+QEMU's cache settings override Ceph's default settings (i.e., settings that are
+not explicitly set in the Ceph configuration file). If you  explicitly set `RBD
+Cache`_ settings in your Ceph configuration file, your Ceph settings override
+the QEMU cache settings. If you set cache settings on the QEMU command line, the
+QEMU command line settings override the Ceph configuration file settings.
+
+
+.. _QEMU Open Source Processor Emulator: http://wiki.qemu.org/Main_Page
+.. _QEMU Manual: http://wiki.qemu.org/Manual
+.. _RBD Cache: ../rbd-config-ref/
+.. _Snapshots: ../rbd-snapshot/
+.. _Installation: ../../install
+.. _User Management - User: ../../rados/operations/user-management#user
diff --git a/doc/rbd/rados-rbd-cmds.rst b/doc/rbd/rados-rbd-cmds.rst
new file mode 100644
index 0000000..a8e2302
--- /dev/null
+++ b/doc/rbd/rados-rbd-cmds.rst
@@ -0,0 +1,117 @@
+=======================
+ Block Device Commands
+=======================
+
+.. index:: Ceph Block Device; image management
+
+The ``rbd`` command enables you to create, list, introspect and remove block
+device images. You can also use it to clone images, create snapshots,
+rollback an image to a snapshot, view a snapshot, etc. For details on using
+the ``rbd`` command, see `RBD – Manage RADOS Block Device (RBD) Images`_ for
+details. 
+
+.. important:: To use Ceph Block Device commands, you must have access to 
+   a running Ceph cluster.
+
+
+Creating a Block Device Image
+=============================
+
+Before you can add a block device to a node, you must create an image for it in
+the :term:`Ceph Storage Cluster` first. To create a block device image, execute
+the  following::
+
+	rbd create --size {megabytes} {pool-name}/{image-name}
+	
+For example, to create a 1GB image named ``bar`` that stores information in a
+pool named ``swimmingpool``, execute the following::
+
+	rbd create --size 1024 swimmingpool/bar
+
+If you don't specify pool when creating an image, it will be stored in the
+default pool ``rbd``. For example, to create a 1GB image named ``foo`` stored in
+the default pool ``rbd``, execute the following::
+
+	rbd create --size 1024 foo
+
+.. note:: You must create a pool first before you can specify it as a 
+   source. See `Storage Pools`_ for details.
+
+Listing Block Device Images
+===========================
+
+To list block devices in the ``rbd`` pool, execute the following
+(i.e., ``rbd`` is the default pool name):: 
+
+	rbd ls
+
+To list block devices in a particular pool, execute the following,
+but replace ``{poolname}`` with the name of the pool:: 
+
+	rbd ls {poolname}
+	
+For example::
+
+	rbd ls swimmingpool
+	
+Retrieving Image Information
+============================
+
+To retrieve information from a particular image, execute the following,
+but replace ``{image-name}`` with the name for the image:: 
+
+	rbd info {image-name}
+	
+For example::
+
+	rbd info foo
+	
+To retrieve information from an image within a pool, execute the following,
+but replace ``{image-name}`` with the name of the image and replace ``{pool-name}``
+with the name of the pool:: 
+
+	rbd info {pool-name}/{image-name}
+
+For example:: 
+
+	rbd info swimmingpool/bar
+
+Resizing a Block Device Image
+=============================
+
+:term:`Ceph Block Device` images are thin provisioned. They don't actually use
+any physical storage  until you begin saving data to them. However, they do have
+a maximum capacity  that you set with the ``--size`` option. If you want to
+increase (or decrease) the maximum size of a Ceph Block Device image, execute
+the following:: 
+
+	rbd resize --size 2048 foo (to increase)
+	rbd resize --size 2048 foo --allow-shrink (to decrease)
+
+
+Removing a Block Device Image
+=============================
+
+To remove a block device, execute the following, but replace ``{image-name}``
+with the name of the image you want to remove:: 
+
+	rbd rm {image-name}
+	
+For example:: 
+
+	rbd rm foo
+	
+To remove a block device from a pool, execute the following, but replace 
+``{image-name}`` with the name of the image to remove and replace 
+``{pool-name}`` with the name of the pool:: 
+
+	rbd rm {pool-name}/{image-name}
+	
+For example:: 
+
+	rbd rm swimmingpool/bar
+
+
+
+.. _Storage Pools: ../../rados/operations/pools
+.. _RBD – Manage RADOS Block Device (RBD) Images: ../../man/8/rbd/
diff --git a/doc/rbd/rbd-cloudstack.rst b/doc/rbd/rbd-cloudstack.rst
new file mode 100644
index 0000000..c50f6f0
--- /dev/null
+++ b/doc/rbd/rbd-cloudstack.rst
@@ -0,0 +1,130 @@
+=============================
+ Block Devices and CloudStack
+=============================
+
+You may use Ceph Block Device images with CloudStack 4.0 and higher through
+``libvirt``, which configures the QEMU interface to ``librbd``. Ceph stripes
+block device images as objects across the cluster, which means that large Ceph
+Block Device images have better performance than a standalone server!
+
+To use Ceph Block Devices with CloudStack 4.0 and higher, you must install QEMU,
+``libvirt``, and CloudStack first. We recommend using a separate physical host
+for your CloudStack installation. CloudStack recommends a minimum of 4GB of RAM
+and a dual-core processor, but more CPU and RAM will perform better. The
+following diagram depicts the CloudStack/Ceph technology stack.
+
+
+.. ditaa::  +---------------------------------------------------+
+            |                   CloudStack                      |
+            +---------------------------------------------------+
+            |                     libvirt                       |
+            +------------------------+--------------------------+
+                                     |
+                                     | configures
+                                     v
+            +---------------------------------------------------+
+            |                       QEMU                        |
+            +---------------------------------------------------+
+            |                      librbd                       |
+            +---------------------------------------------------+
+            |                     librados                      |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+
+
+.. important:: To use Ceph Block Devices with CloudStack, you must have  
+   access to a running Ceph Storage Cluster.
+
+CloudStack integrates with Ceph's block devices to provide CloudStack with a
+back end for CloudStack's Primary Storage. The instructions below detail the
+setup for CloudStack Primary Storage.
+
+.. note:: We recommend installing with Ubuntu 14.04 or later so that 
+   you can use package installation instead of having to compile 
+   libvirt from source.
+
+Installing and configuring QEMU for use with CloudStack doesn't require any
+special handling. Ensure that you have a running Ceph Storage Cluster. Install
+QEMU and configure it for use with Ceph; then, install ``libvirt`` version
+0.9.13 or higher (you may need to compile from source) and ensure it is running
+with Ceph.
+
+
+.. note:: Ubuntu 14.04 and CentOS 7.2 will have ``libvirt`` with RBD storage
+   pool support enabled by default.
+
+.. index:: pools; CloudStack
+
+Create a Pool
+=============
+
+By default, Ceph block devices use the ``rbd`` pool. Create a pool for
+CloudStack NFS Primary Storage. Ensure your Ceph cluster is running, then create
+the pool. ::
+
+   ceph osd pool create cloudstack
+   
+See `Create a Pool`_ for details on specifying the number of placement groups
+for your pools, and `Placement Groups`_ for details on the number of placement
+groups you should set for your pools.
+
+Create a Ceph User
+==================
+
+To access the Ceph cluster we require a Ceph user which has the correct
+credentials to access the ``cloudstack`` pool we just created. Although we could
+use ``client.admin`` for this, it's recommended to create a user with only
+access to the ``cloudstack`` pool. ::
+
+  ceph auth get-or-create client.cloudstack mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=cloudstack'
+
+Use the information returned by the command in the next step when adding the 
+Primary Storage.
+
+See `User Management`_ for additional details.
+
+Add Primary Storage
+===================
+
+To add primary storage, refer to `Add Primary Storage (4.2.0)`_ to add a Ceph block device, the steps
+include: 
+
+#. Log in to the CloudStack UI.
+#. Click **Infrastructure** on the left side navigation bar. 
+#. Select the Zone you want to use for Primary Storage.
+#. Click the **Compute** tab.
+#. Select **View All** on the `Primary Storage` node in the diagram.
+#. Click **Add Primary Storage**.
+#. Follow the CloudStack instructions.
+
+   - For **Protocol**, select ``RBD``.
+   - Add cluster information (cephx is supported). Note: Do not include the ``client.`` part of the user.
+   - Add ``rbd`` as a tag.
+
+
+Create a Disk Offering
+======================
+
+To create a new disk offering, refer to `Create a New Disk Offering (4.2.0)`_.
+Create a disk offering so that it matches the ``rbd`` tag.
+The ``StoragePoolAllocator`` will choose the  ``rbd``
+pool when searching for a suitable storage pool. If the disk offering doesn't
+match the ``rbd`` tag, the ``StoragePoolAllocator`` may select the pool you
+created (e.g., ``cloudstack``).
+
+
+Limitations
+===========
+
+- CloudStack will only bind to one monitor (You can however create a Round Robin DNS record over multiple monitors)
+
+
+
+.. _Create a Pool: ../../rados/operations/pools#createpool
+.. _Placement Groups: ../../rados/operations/placement-groups
+.. _Install and Configure QEMU: ../qemu-rbd
+.. _Install and Configure libvirt: ../libvirt
+.. _KVM Hypervisor Host Installation: http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.2.0/html/Installation_Guide/hypervisor-kvm-install-flow.html
+.. _Add Primary Storage (4.2.0): http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.2.0/html/Admin_Guide/primary-storage-add.html
+.. _Create a New Disk Offering (4.2.0): http://cloudstack.apache.org/docs/en-US/Apache_CloudStack/4.2.0/html/Admin_Guide/compute-disk-service-offerings.html#creating-disk-offerings
+.. _User Management: ../../rados/operations/user-management
diff --git a/doc/rbd/rbd-config-ref.rst b/doc/rbd/rbd-config-ref.rst
new file mode 100644
index 0000000..6ce2fdc
--- /dev/null
+++ b/doc/rbd/rbd-config-ref.rst
@@ -0,0 +1,136 @@
+=======================
+ librbd Settings
+=======================
+
+See `Block Device`_ for additional details.
+
+Cache Settings
+=======================
+
+.. sidebar:: Kernel Caching
+
+	The kernel driver for Ceph block devices can use the Linux page cache to 
+	improve performance.
+
+The user space implementation of the Ceph block device (i.e., ``librbd``) cannot
+take advantage of the Linux page cache, so it includes its own in-memory
+caching, called "RBD caching." RBD caching behaves just like well-behaved hard
+disk caching.  When the OS sends a barrier or a flush request, all dirty data is
+written to the OSDs. This means that using write-back caching is just as safe as
+using a well-behaved physical hard disk with a VM that properly sends flushes
+(i.e. Linux kernel >= 2.6.32). The cache uses a Least Recently Used (LRU)
+algorithm, and in write-back mode it  can coalesce contiguous requests for
+better throughput.
+
+.. versionadded:: 0.46
+
+Ceph supports write-back caching for RBD. To enable it, add  ``rbd cache =
+true`` to the ``[client]`` section of your ``ceph.conf`` file. By default
+``librbd`` does not perform any caching. Writes and reads go directly to the
+storage cluster, and writes return only when the data is on disk on all
+replicas. With caching enabled, writes return immediately, unless there are more
+than ``rbd cache max dirty`` unflushed bytes. In this case, the write triggers
+writeback and blocks until enough bytes are flushed.
+
+.. versionadded:: 0.47
+
+Ceph supports write-through caching for RBD. You can set the size of
+the cache, and you can set targets and limits to switch from
+write-back caching to write through caching. To enable write-through
+mode, set ``rbd cache max dirty`` to 0. This means writes return only
+when the data is on disk on all replicas, but reads may come from the
+cache. The cache is in memory on the client, and each RBD image has
+its own.  Since the cache is local to the client, there's no coherency
+if there are others accessing the image. Running GFS or OCFS on top of
+RBD will not work with caching enabled.
+
+The ``ceph.conf`` file settings for RBD should be set in the ``[client]``
+section of your configuration file. The settings include: 
+
+
+``rbd cache``
+
+:Description: Enable caching for RADOS Block Device (RBD).
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+
+``rbd cache size``
+
+:Description: The RBD cache size in bytes.
+:Type: 64-bit Integer
+:Required: No
+:Default: ``32 MiB``
+
+
+``rbd cache max dirty``
+
+:Description: The ``dirty`` limit in bytes at which the cache triggers write-back.  If ``0``, uses write-through caching.
+:Type: 64-bit Integer
+:Required: No
+:Constraint: Must be less than ``rbd cache size``.
+:Default: ``24 MiB``
+
+
+``rbd cache target dirty``
+
+:Description: The ``dirty target`` before the cache begins writing data to the data storage. Does not block writes to the cache.
+:Type: 64-bit Integer
+:Required: No
+:Constraint: Must be less than ``rbd cache max dirty``.
+:Default: ``16 MiB``
+
+
+``rbd cache max dirty age``
+
+:Description: The number of seconds dirty data is in the cache before writeback starts. 
+:Type: Float
+:Required: No
+:Default: ``1.0``
+
+.. versionadded:: 0.60
+
+``rbd cache writethrough until flush``
+
+:Description: Start out in write-through mode, and switch to write-back after the first flush request is received. Enabling this is a conservative but safe setting in case VMs running on rbd are too old to send flushes, like the virtio driver in Linux before 2.6.32.
+:Type: Boolean
+:Required: No
+:Default: ``true``
+
+.. _Block Device: ../../rbd/rbd/
+
+
+Read-ahead Settings
+=======================
+
+.. versionadded:: 0.86
+
+RBD supports read-ahead/prefetching to optimize small, sequential reads.
+This should normally be handled by the guest OS in the case of a VM,
+but boot loaders may not issue efficient reads.
+Read-ahead is automatically disabled if caching is disabled.
+
+
+``rbd readahead trigger requests``
+
+:Description: Number of sequential read requests necessary to trigger read-ahead.
+:Type: Integer
+:Required: No
+:Default: ``10``
+
+
+``rbd readahead max bytes``
+
+:Description: Maximum size of a read-ahead request.  If zero, read-ahead is disabled.
+:Type: 64-bit Integer
+:Required: No
+:Default: ``512 KiB``
+
+
+``rbd readahead disable after bytes``
+
+:Description: After this many bytes have been read from an RBD image, read-ahead is disabled for that image until it is closed.  This allows the guest OS to take over read-ahead once it is booted.  If zero, read-ahead stays enabled.
+:Type: 64-bit Integer
+:Required: No
+:Default: ``50 MiB``
diff --git a/doc/rbd/rbd-ko.rst b/doc/rbd/rbd-ko.rst
new file mode 100644
index 0000000..5514a96
--- /dev/null
+++ b/doc/rbd/rbd-ko.rst
@@ -0,0 +1,59 @@
+==========================
+ Kernel Module Operations
+==========================
+
+.. index:: Ceph Block Device; kernel module
+
+.. important:: To use kernel module operations, you must have a running Ceph cluster.
+
+Get a List of Images
+====================
+
+To mount a block device image, first return a list of the images. ::
+
+	rbd list
+
+Map a Block Device
+==================
+
+Use ``rbd`` to map an image name to a kernel module. You must specify the 
+image name, the pool name, and the user name. ``rbd`` will load RBD kernel
+module on your behalf if it's not already loaded. ::
+
+  sudo rbd map {pool-name}/{image-name} --id {user-name}
+
+For example:: 
+
+  sudo rbd map rbd/myimage --id admin
+ 
+If you use `cephx`_ authentication, you must also specify a secret.  It may come
+from a keyring or a file containing the secret. ::
+
+  sudo rbd map rbd/myimage --id admin --keyring /path/to/keyring
+  sudo rbd map rbd/myimage --id admin --keyfile /path/to/file
+
+
+Show Mapped Block Devices
+=========================
+
+To show block device images mapped to kernel modules with the ``rbd`` command,
+specify the ``showmapped`` option. ::
+
+	rbd showmapped
+
+
+Unmapping a Block Device
+========================	
+
+To unmap a block device image with the ``rbd`` command, specify the ``unmap``
+option  and the device name (i.e., by convention the same as the block device
+image name). :: 
+
+	sudo rbd unmap /dev/rbd/{poolname}/{imagename}
+	
+For example::
+
+	sudo rbd unmap /dev/rbd/rbd/foo
+
+
+.. _cephx: ../../rados/operations/authentication/
\ No newline at end of file
diff --git a/doc/rbd/rbd-mirroring.rst b/doc/rbd/rbd-mirroring.rst
new file mode 100644
index 0000000..04e8e11
--- /dev/null
+++ b/doc/rbd/rbd-mirroring.rst
@@ -0,0 +1,282 @@
+===============
+ RBD Mirroring
+===============
+
+.. index:: Ceph Block Device; mirroring
+
+RBD images can be asynchronously mirrored between two Ceph clusters. This
+capability uses the RBD journaling image feature to ensure crash-consistent
+replication between clusters. Mirroring is configured on a per-pool basis
+within peer clusters and can be configured to automatically mirror all
+images within a pool or only a specific subset of images. Mirroring is
+configured using the ``rbd`` command. The ``rbd-mirror`` daemon is responsible
+for pulling image updates from the remote, peer cluster and applying them to
+the image within the local cluster.
+
+.. note:: RBD mirroring requires the Ceph Jewel release or later.
+
+.. important:: To use RBD mirroring, you must have two Ceph clusters, each
+   running the ``rbd-mirror`` daemon.
+
+Pool Configuration
+==================
+
+The following procedures demonstrate how to perform the basic administrative
+tasks to configure mirroring using the ``rbd`` command. Mirroring is
+configured on a per-pool basis within the Ceph clusters.
+
+The pool configuration steps should be performed on both peer clusters. These
+procedures assume two clusters, named "local" and "remote", are accessible from
+a single host for clarity.
+
+See the `rbd`_ manpage for additional details of how to connect to different
+Ceph clusters.
+
+.. note:: The cluster name in the following examples corresponds to a Ceph
+   configuration file of the same name (e.g. /etc/ceph/remote.conf).  See the
+   `ceph-conf`_ documentation for how to configure multiple clusters.
+
+Enable Mirroring
+----------------
+
+To enable mirroring on a pool with ``rbd``, specify the ``mirror pool enable``
+command, the pool name, and the mirroring mode::
+
+        rbd mirror pool enable {pool-name} {mode}
+
+The mirroring mode can either be ``pool`` or ``image``:
+
+* **pool**:  When configured in ``pool`` mode, all images in the pool with the
+  journaling feature enabled are mirrored.
+* **image**: When configured in ``image`` mode, mirroring needs to be
+  `explicitly enabled`_ on each image.
+
+For example::
+
+        rbd --cluster local mirror pool enable image-pool pool
+        rbd --cluster remote mirror pool enable image-pool pool
+
+Disable Mirroring
+-----------------
+
+To disable mirroring on a pool with ``rbd``, specify the ``mirror pool disable``
+command and the pool name::
+
+        rbd mirror pool disable {pool-name}
+
+When mirroring is disabled on a pool in this way, mirroring will also be
+disabled on any images (within the pool) for which mirroring was enabled
+explicitly.
+
+For example::
+
+        rbd --cluster local mirror pool disable image-pool
+        rbd --cluster remote mirror pool disable image-pool
+
+Add Cluster Peer
+----------------
+
+In order for the ``rbd-mirror`` daemon to discover its peer cluster, the peer
+needs to be registered to the pool. To add a mirroring peer Ceph cluster with
+``rbd``, specify the ``mirror pool peer add`` command, the pool name, and a
+cluster specification::
+
+        rbd mirror pool peer add {pool-name} {client-name}@{cluster-name}
+
+For example::
+
+        rbd --cluster local mirror pool peer add image-pool client.remote at remote
+        rbd --cluster remote mirror pool peer add image-pool client.local at local
+
+Remove Cluster Peer
+-------------------
+
+To remove a mirroring peer Ceph cluster with ``rbd``, specify the
+``mirror pool peer remove`` command, the pool name, and the peer UUID
+(available from the ``rbd mirror pool info`` command)::
+
+        rbd mirror pool peer remove {pool-name} {peer-uuid}
+
+For example::
+
+        rbd --cluster local mirror pool peer remove image-pool 55672766-c02b-4729-8567-f13a66893445
+        rbd --cluster remote mirror pool peer remove image-pool 60c0e299-b38f-4234-91f6-eed0a367be08
+
+Image Configuration
+===================
+
+Unlike pool configuration, image configuration only needs to be performed against
+a single mirroring peer Ceph cluster.
+
+Mirrored RBD images are designated as either primary or non-primary. This is a
+property of the image and not the pool. Images that are designated as
+non-primary cannot be modified.
+
+Images are automatically promoted to primary when mirroring is first enabled on
+an image (either implicitly if the pool mirror mode was **pool** and the image
+has the journaling image feature enabled, or `explicitly enabled`_ by the
+``rbd`` command).
+
+Enable Image Journaling Support
+-------------------------------
+
+RBD mirroring uses the RBD journaling feature to ensure that the replicated
+image always remains crash-consistent. Before an image can be mirrored to
+a peer cluster, the journaling feature must be enabled. The feature can be
+enabled at image creation time by providing the
+``--image-feature exclusive-lock,journaling`` option to the ``rbd`` command.
+
+Alternatively, the journaling feature can be dynamically enabled on
+pre-existing RBD images. To enable journaling with ``rbd``, specify
+the ``feature enable`` command, the pool and image name, and the feature name::
+
+        rbd feature enable {pool-name}/{image-name} {feature-name}
+
+For example::
+
+        rbd --cluster local feature enable image-pool/image-1 journaling
+
+.. note:: The journaling feature is dependent on the exclusive-lock feature. If
+   the exclusive-lock feature is not already enabled, it should be enabled prior
+   to enabling the journaling feature.
+
+.. tip:: You can enable journaling on all new images by default by adding
+   ``rbd default features = 125`` to your Ceph configuration file.
+
+Enable Image Mirroring
+----------------------
+
+If the mirroring is configured in ``image`` mode for the image's pool, then it
+is necessary to explicitly enable mirroring for each image within the pool.
+To enable mirroring for a specific image with ``rbd``, specify the
+``mirror image enable`` command along with the pool and image name::
+
+        rbd mirror image enable {pool-name}/{image-name}
+
+For example::
+
+        rbd --cluster local mirror image enable image-pool/image-1
+
+Disable Image Mirroring
+-----------------------
+
+To disable mirroring for a specific image with ``rbd``, specify the
+``mirror image disable`` command along with the pool and image name::
+
+        rbd mirror image disable {pool-name}/{image-name}
+
+For example::
+
+        rbd --cluster local mirror image disable image-pool/image-1
+
+Image Promotion and Demotion
+----------------------------
+
+In a failover scenario where the primary designation needs to be moved to the
+image in the peer Ceph cluster, access to the primary image should be stopped
+(e.g. power down the VM or remove the associated drive from a VM), demote the
+current primary image, promote the new primary image, and resume access to the
+image on the alternate cluster.
+
+.. note:: RBD only provides the necessary tools to facilitate an orderly
+   failover of an image. An external mechanism is required to coordinate the
+   full failover process (e.g. closing the image before demotion).
+
+To demote an image to non-primary with ``rbd``, specify the
+``mirror image demote`` command along with the pool and image name::
+
+        rbd mirror image demote {pool-name}/{image-name}
+
+For example::
+
+        rbd --cluster local mirror image demote image-pool/image-1
+
+To promote an image to primary with ``rbd``, specify the ``mirror image promote``
+command along with the pool and image name::
+
+        rbd mirror image promote {pool-name}/{image-name}
+
+For example::
+
+        rbd --cluster remote mirror image promote image-pool/image-1
+
+.. tip:: Since the primary / non-primary status is per-image, it is possible to
+   have two clusters split the IO load and stage failover / failback.
+
+.. note:: Promotion can be forced using the ``--force`` option. Forced
+   promotion is needed when the demotion cannot be propagated to the peer
+   Ceph cluster (e.g. Ceph cluster failure, communication outage). This will
+   result in a split-brain scenario between the two peers and the image will no
+   longer be in-sync until a `force resync command`_ is issued.
+
+Force Image Resync
+------------------
+
+If a split-brain event is detected by the ``rbd-mirror`` daemon, it will not
+attempt to mirror the affected image until corrected. To resume mirroring for an
+image, first `demote the image`_ determined to be out-of-date and then request a
+resync to the primary image. To request an image resync with ``rbd``, specify the
+``mirror image resync`` command along with the pool and image name::
+
+        rbd mirror image resync {pool-name}/{image-name}
+
+For example::
+
+        rbd mirror image resync image-pool/image-1
+
+.. note:: The ``rbd`` command only flags the image as requiring a resync. The
+   local cluster's ``rbd-mirror`` daemon process is responsible for performing
+   the resync asynchronously.
+
+Mirror Status
+=============
+
+The peer cluster replication status is stored for every primary mirrored image.
+This status can be retrieved using the ``mirror image status`` and
+``mirror pool status`` commands.
+
+To request the mirror image status with ``rbd``, specify the
+``mirror image status`` command along with the pool and image name::
+
+        rbd mirror image status {pool-name}/{image-name}
+
+For example::
+
+        rbd mirror image status image-pool/image-1
+
+To request the mirror pool summary status with ``rbd``, specify the
+``mirror pool status`` command along with the pool name::
+
+        rbd mirror pool status {pool-name}
+
+For example::
+
+        rbd mirror image status image-pool
+
+.. note:: Adding ``--verbose`` option to the ``mirror pool status`` command will
+   additionally output status details for every mirroring image in the pool.
+
+rbd-mirror Daemon
+=================
+
+The two ``rbd-mirror`` daemons are responsible for watching image journals on the
+remote, peer cluster and replaying the journal events against the local
+cluster. The RBD image journaling feature records all modifications to the
+image in the order they occur. This ensures that a crash-consistent mirror of
+the remote image is available locally.
+
+The ``rbd-mirror`` daemon is available within the optional ``rbd-mirror``
+distribution package.
+
+.. important:: Each ``rbd-mirror`` daemon requires the ability to connect
+   to both clusters simultaneously.
+.. warning:: Only run a single ``rbd-mirror`` daemon per Ceph cluster. A
+   future Ceph release will add support for horizontal scale-out of the
+   ``rbd-mirror`` daemon.
+
+.. _rbd: ../../man/8/rbd
+.. _ceph-conf: ../../rados/configuration/ceph-conf/#running-multiple-clusters
+.. _explicitly enabled: #enable-image-mirroring
+.. _force resync command: #force-image-resync
+.. _demote the image: #image-promotion-and-demotion
+
diff --git a/doc/rbd/rbd-openstack.rst b/doc/rbd/rbd-openstack.rst
new file mode 100644
index 0000000..087e23e
--- /dev/null
+++ b/doc/rbd/rbd-openstack.rst
@@ -0,0 +1,475 @@
+=============================
+ Block Devices and OpenStack
+=============================
+
+.. index:: Ceph Block Device; OpenStack
+
+You may use Ceph Block Device images with OpenStack through ``libvirt``, which
+configures the QEMU interface to ``librbd``. Ceph stripes block device images as
+objects across the cluster, which means that large Ceph Block Device images have
+better performance than a standalone server!
+
+To use Ceph Block Devices with OpenStack, you must install QEMU, ``libvirt``,
+and OpenStack first. We recommend using a separate physical node for your
+OpenStack installation. OpenStack recommends a minimum of 8GB of RAM and a
+quad-core processor. The following diagram depicts the OpenStack/Ceph
+technology stack.
+
+
+.. ditaa::  +---------------------------------------------------+
+            |                    OpenStack                      |
+            +---------------------------------------------------+
+            |                     libvirt                       |
+            +------------------------+--------------------------+
+                                     |
+                                     | configures
+                                     v
+            +---------------------------------------------------+
+            |                       QEMU                        |
+            +---------------------------------------------------+
+            |                      librbd                       |
+            +---------------------------------------------------+
+            |                     librados                      |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+
+
+.. important:: To use Ceph Block Devices with OpenStack, you must have
+   access to a running Ceph Storage Cluster.
+
+Three parts of OpenStack integrate with Ceph's block devices:
+
+- **Images**: OpenStack Glance manages images for VMs. Images are immutable.
+  OpenStack treats images as binary blobs and downloads them accordingly.
+
+- **Volumes**: Volumes are block devices. OpenStack uses volumes to boot VMs,
+  or to attach volumes to running VMs. OpenStack manages volumes using
+  Cinder services.
+
+- **Guest Disks**: Guest disks are guest operating system disks. By default,
+  when you boot a virtual machine, its disk appears as a file on the filesystem
+  of the hypervisor (usually under ``/var/lib/nova/instances/<uuid>/``). Prior
+  to OpenStack Havana, the only way to boot a VM in Ceph was to use the
+  boot-from-volume functionality of Cinder. However, now it is possible to boot
+  every virtual machine inside Ceph directly without using Cinder, which is
+  advantageous because it allows you to perform maintenance operations easily
+  with the live-migration process. Additionally, if your hypervisor dies it is
+  also convenient to trigger ``nova evacuate`` and  run the virtual machine
+  elsewhere almost seamlessly.
+
+You can use OpenStack Glance to store images in a Ceph Block Device, and you
+can use Cinder to boot a VM using a copy-on-write clone of an image.
+
+The instructions below detail the setup for Glance, Cinder and Nova, although
+they do not have to be used together. You may store images in Ceph block devices
+while running VMs using a local disk, or vice versa.
+
+.. important:: Ceph doesn’t support QCOW2 for hosting a virtual machine disk.
+   Thus if you want to boot virtual machines in Ceph (ephemeral backend or boot
+   from volume), the Glance image format must be ``RAW``.
+
+.. tip:: This document describes using Ceph Block Devices with OpenStack Havana.
+   For earlier versions of OpenStack see
+   `Block Devices and OpenStack (Dumpling)`_.
+
+.. index:: pools; OpenStack
+
+Create a Pool
+=============
+
+By default, Ceph block devices use the ``rbd`` pool. You may use any available
+pool. We recommend creating a pool for Cinder and a pool for Glance. Ensure
+your Ceph cluster is running, then create the pools. ::
+
+    ceph osd pool create volumes 128
+    ceph osd pool create images 128
+    ceph osd pool create backups 128
+    ceph osd pool create vms 128
+
+See `Create a Pool`_ for detail on specifying the number of placement groups for
+your pools, and `Placement Groups`_ for details on the number of placement
+groups you should set for your pools.
+
+.. _Create a Pool: ../../rados/operations/pools#createpool
+.. _Placement Groups: ../../rados/operations/placement-groups
+
+
+Configure OpenStack Ceph Clients
+================================
+
+The nodes running ``glance-api``, ``cinder-volume``, ``nova-compute`` and
+``cinder-backup`` act as Ceph clients. Each requires the ``ceph.conf`` file::
+
+  ssh {your-openstack-server} sudo tee /etc/ceph/ceph.conf </etc/ceph/ceph.conf
+
+
+Install Ceph client packages
+----------------------------
+
+On the ``glance-api`` node, you'll need the Python bindings for ``librbd``::
+
+  sudo apt-get install python-rbd
+  sudo yum install python-rbd
+
+On the ``nova-compute``, ``cinder-backup`` and on the ``cinder-volume`` node,
+use both the Python bindings and the client command line tools::
+
+  sudo apt-get install ceph-common
+  sudo yum install ceph-common
+
+
+Setup Ceph Client Authentication
+--------------------------------
+
+If you have `cephx authentication`_ enabled, create a new user for Nova/Cinder
+and Glance. Execute the following::
+
+    ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images'
+    ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
+    ceph auth get-or-create client.cinder-backup mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=backups'
+
+Add the keyrings for ``client.cinder``, ``client.glance``, and
+``client.cinder-backup`` to the appropriate nodes and change their ownership::
+
+  ceph auth get-or-create client.glance | ssh {your-glance-api-server} sudo tee /etc/ceph/ceph.client.glance.keyring
+  ssh {your-glance-api-server} sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring
+  ceph auth get-or-create client.cinder | ssh {your-volume-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
+  ssh {your-cinder-volume-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
+  ceph auth get-or-create client.cinder-backup | ssh {your-cinder-backup-server} sudo tee /etc/ceph/ceph.client.cinder-backup.keyring
+  ssh {your-cinder-backup-server} sudo chown cinder:cinder /etc/ceph/ceph.client.cinder-backup.keyring
+
+Nodes running ``nova-compute`` need the keyring file for the ``nova-compute``
+process::
+
+  ceph auth get-or-create client.cinder | ssh {your-nova-compute-server} sudo tee /etc/ceph/ceph.client.cinder.keyring
+
+They also need to store the secret key of the ``client.cinder`` user in
+``libvirt``. The libvirt process needs it to access the cluster while attaching
+a block device from Cinder.
+
+Create a temporary copy of the secret key on the nodes running
+``nova-compute``::
+
+  ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key
+
+Then, on the compute nodes, add the secret key to ``libvirt`` and remove the
+temporary copy of the key::
+
+  uuidgen
+  457eb676-33da-42ec-9a8c-9293d545c337
+
+  cat > secret.xml <<EOF
+  <secret ephemeral='no' private='no'>
+    <uuid>457eb676-33da-42ec-9a8c-9293d545c337</uuid>
+    <usage type='ceph'>
+      <name>client.cinder secret</name>
+    </usage>
+  </secret>
+  EOF
+  sudo virsh secret-define --file secret.xml
+  Secret 457eb676-33da-42ec-9a8c-9293d545c337 created
+  sudo virsh secret-set-value --secret 457eb676-33da-42ec-9a8c-9293d545c337 --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
+
+Save the uuid of the secret for configuring ``nova-compute`` later.
+
+.. important:: You don't necessarily need the UUID on all the compute nodes.
+   However from a platform consistency perspective, it's better to keep the
+   same UUID.
+
+.. _cephx authentication: ../../rados/operations/authentication
+
+
+Configure OpenStack to use Ceph
+===============================
+
+Configuring Glance
+------------------
+
+Glance can use multiple back ends to store images. To use Ceph block devices by
+default, configure Glance like the following.
+
+Prior to Juno
+~~~~~~~~~~~~~~
+
+Edit ``/etc/glance/glance-api.conf`` and add under the ``[DEFAULT]`` section::
+
+    default_store = rbd
+    rbd_store_user = glance
+    rbd_store_pool = images
+    rbd_store_chunk_size = 8
+
+
+Juno
+~~~~
+
+Edit ``/etc/glance/glance-api.conf`` and add under the ``[glance_store]`` section::
+
+    [DEFAULT]
+    ...
+    default_store = rbd
+    ...
+    [glance_store]
+    stores = rbd
+    rbd_store_pool = images
+    rbd_store_user = glance
+    rbd_store_ceph_conf = /etc/ceph/ceph.conf
+    rbd_store_chunk_size = 8
+
+
+For more information about the configuration options available in Glance please see: http://docs.openstack.org/trunk/config-reference/content/section_glance-api.conf.html.
+
+.. important:: Glance has not completely moved to 'store' yet.
+    So we still need to configure the store in the DEFAULT section.
+
+Any OpenStack version
+~~~~~~~~~~~~~~~~~~~~~
+
+If you want to enable copy-on-write cloning of images, also add under the ``[DEFAULT]`` section::
+
+    show_image_direct_url = True
+
+Note that this exposes the back end location via Glance's API, so the endpoint
+with this option enabled should not be publicly accessible.
+
+Disable the Glance cache management to avoid images getting cached under ``/var/lib/glance/image-cache/``,
+assuming your configuration file has ``flavor = keystone+cachemanagement``::
+
+    [paste_deploy]
+    flavor = keystone
+
+Image properties
+~~~~~~~~~~~~~~~~
+
+We recommend to use the following properties for your images:
+
+- ``hw_scsi_model=virtio-scsi``: add the virtio-scsi controller and get better performance and support for discard operation
+- ``hw_disk_bus=scsi``: connect every cinder block devices to that controller
+- ``hw_qemu_guest_agent=yes``: enable the QEMU guest agent
+- ``os_require_quiesce=yes``: send fs-freeze/thaw calls through the QEMU guest agent
+
+
+Configuring Cinder
+------------------
+
+OpenStack requires a driver to interact with Ceph block devices. You must also
+specify the pool name for the block device. On your OpenStack node, edit
+``/etc/cinder/cinder.conf`` by adding::
+
+    [DEFAULT]
+    ...
+    enabled_backends = ceph
+    ...
+    [ceph]
+    volume_driver = cinder.volume.drivers.rbd.RBDDriver
+    rbd_pool = volumes
+    rbd_ceph_conf = /etc/ceph/ceph.conf
+    rbd_flatten_volume_from_snapshot = false
+    rbd_max_clone_depth = 5
+    rbd_store_chunk_size = 4
+    rados_connect_timeout = -1
+    glance_api_version = 2
+
+If you're using `cephx authentication`_, also configure the user and uuid of
+the secret you added to ``libvirt`` as documented earlier::
+
+    [ceph]
+    ...
+    rbd_user = cinder
+    rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
+
+Note that if you are configuring multiple cinder back ends,
+``glance_api_version = 2`` must be in the ``[DEFAULT]`` section.
+
+
+Configuring Cinder Backup
+-------------------------
+
+OpenStack Cinder Backup requires a specific daemon so don't forget to install it.
+On your Cinder Backup node, edit ``/etc/cinder/cinder.conf`` and add::
+
+    backup_driver = cinder.backup.drivers.ceph
+    backup_ceph_conf = /etc/ceph/ceph.conf
+    backup_ceph_user = cinder-backup
+    backup_ceph_chunk_size = 134217728
+    backup_ceph_pool = backups
+    backup_ceph_stripe_unit = 0
+    backup_ceph_stripe_count = 0
+    restore_discard_excess_bytes = true
+
+
+Configuring Nova to attach Ceph RBD block device
+------------------------------------------------
+
+In order to attach Cinder devices (either normal block or by issuing a boot
+from volume), you must tell Nova (and libvirt) which user and UUID to refer to
+when attaching the device. libvirt will refer to this user when connecting and
+authenticating with the Ceph cluster. ::
+
+    rbd_user = cinder
+    rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
+
+These two flags are also used by the Nova ephemeral backend.
+
+
+Configuring Nova
+----------------
+
+In order to boot all the virtual machines directly into Ceph, you must
+configure the ephemeral backend for Nova.
+
+It is recommended to enable the RBD cache in your Ceph configuration file
+(enabled by default since Giant). Moreover, enabling the admin socket
+brings a lot of benefits while troubleshooting. Having one socket
+per virtual machine using a Ceph block device will help investigating performance and/or wrong behaviors.
+
+This socket can be accessed like this::
+
+    ceph daemon /var/run/ceph/ceph-client.cinder.19195.32310016.asok help
+
+Now on every compute nodes edit your Ceph configuration file::
+
+    [client]
+        rbd cache = true
+        rbd cache writethrough until flush = true
+        admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
+        log file = /var/log/qemu/qemu-guest-$pid.log
+        rbd concurrent management ops = 20
+
+Configure the permissions of these paths::
+
+    mkdir -p /var/run/ceph/guests/ /var/log/qemu/
+    chown qemu:libvirtd /var/run/ceph/guests /var/log/qemu/
+
+Note that user ``qemu`` and group ``libvirtd`` can vary depending on your system.
+The provided example works for RedHat based systems.
+
+.. tip:: If your virtual machine is already running you can simply restart it to get the socket
+
+
+Havana and Icehouse
+~~~~~~~~~~~~~~~~~~~
+
+Havana and Icehouse require patches to implement copy-on-write cloning and fix
+bugs with image size and live migration of ephemeral disks on rbd. These are
+available in branches based on upstream Nova `stable/havana`_  and
+`stable/icehouse`_. Using them is not mandatory but **highly recommended** in
+order to take advantage of the copy-on-write clone functionality.
+
+On every Compute node, edit ``/etc/nova/nova.conf`` and add::
+
+    libvirt_images_type = rbd
+    libvirt_images_rbd_pool = vms
+    libvirt_images_rbd_ceph_conf = /etc/ceph/ceph.conf
+    libvirt_disk_cachemodes="network=writeback"
+    rbd_user = cinder
+    rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
+
+It is also a good practice to disable file injection. While booting an
+instance, Nova usually attempts to open the rootfs of the virtual machine.
+Then, Nova injects values such as password, ssh keys etc. directly into the
+filesystem. However, it is better to rely on the metadata service and
+``cloud-init``.
+
+On every Compute node, edit ``/etc/nova/nova.conf`` and add::
+
+    libvirt_inject_password = false
+    libvirt_inject_key = false
+    libvirt_inject_partition = -2
+
+To ensure a proper live-migration, use the following flags::
+
+    libvirt_live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
+
+Juno
+~~~~
+
+In Juno, Ceph block device was moved under the ``[libvirt]`` section.
+On every Compute node, edit ``/etc/nova/nova.conf`` under the ``[libvirt]``
+section and add::
+
+    [libvirt]
+    images_type = rbd
+    images_rbd_pool = vms
+    images_rbd_ceph_conf = /etc/ceph/ceph.conf
+    rbd_user = cinder
+    rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
+    disk_cachemodes="network=writeback"
+
+
+It is also a good practice to disable file injection. While booting an
+instance, Nova usually attempts to open the rootfs of the virtual machine.
+Then, Nova injects values such as password, ssh keys etc. directly into the
+filesystem. However, it is better to rely on the metadata service and
+``cloud-init``.
+
+On every Compute node, edit ``/etc/nova/nova.conf`` and add the following
+under the ``[libvirt]`` section::
+
+    inject_password = false
+    inject_key = false
+    inject_partition = -2
+
+To ensure a proper live-migration, use the following flags (under the ``[libvirt]`` section)::
+
+    live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
+
+Kilo
+~~~~
+
+Enable discard support for virtual machine ephemeral root disk::
+
+    [libvirt]
+    ...
+    ...
+    hw_disk_discard = unmap # enable discard support (be careful of performance)
+
+
+Restart OpenStack
+=================
+
+To activate the Ceph block device driver and load the block device pool name
+into the configuration, you must restart OpenStack. Thus, for Debian based
+systems execute these commands on the appropriate nodes::
+
+    sudo glance-control api restart
+    sudo service nova-compute restart
+    sudo service cinder-volume restart
+    sudo service cinder-backup restart
+
+For Red Hat based systems execute::
+
+    sudo service openstack-glance-api restart
+    sudo service openstack-nova-compute restart
+    sudo service openstack-cinder-volume restart
+    sudo service openstack-cinder-backup restart
+
+Once OpenStack is up and running, you should be able to create a volume
+and boot from it.
+
+
+Booting from a Block Device
+===========================
+
+You can create a volume from an image using the Cinder command line tool::
+
+    cinder create --image-id {id of image} --display-name {name of volume} {size of volume}
+
+Note that image must be RAW format. You can use `qemu-img`_ to convert
+from one format to another. For example::
+
+    qemu-img convert -f {source-format} -O {output-format} {source-filename} {output-filename}
+    qemu-img convert -f qcow2 -O raw precise-cloudimg.img precise-cloudimg.raw
+
+When Glance and Cinder are both using Ceph block devices, the image is a
+copy-on-write clone, so it can create a new volume quickly. In the OpenStack
+dashboard, you can boot from that volume by performing the following steps:
+
+#. Launch a new instance.
+#. Choose the image associated to the copy-on-write clone.
+#. Select 'boot from volume'.
+#. Select the volume you created.
+
+.. _qemu-img: ../qemu-rbd/#running-qemu-with-rbd
+.. _Block Devices and OpenStack (Dumpling): http://ceph.com/docs/dumpling/rbd/rbd-openstack
+.. _stable/havana: https://github.com/jdurgin/nova/tree/havana-ephemeral-rbd
+.. _stable/icehouse: https://github.com/angdraug/nova/tree/rbd-ephemeral-clone-stable-icehouse
diff --git a/doc/rbd/rbd-replay.rst b/doc/rbd/rbd-replay.rst
new file mode 100644
index 0000000..e1c96b2
--- /dev/null
+++ b/doc/rbd/rbd-replay.rst
@@ -0,0 +1,42 @@
+===================
+ RBD Replay
+===================
+
+.. index:: Ceph Block Device; RBD Replay
+
+RBD Replay is a set of tools for capturing and replaying Rados Block Device
+(RBD) workloads. To capture an RBD workload, ``lttng-tools`` must be installed
+on the client, and ``librbd`` on the client must be the v0.87 (Giant) release 
+or later. To replay an RBD workload, ``librbd`` on the client must be the Giant
+release or later.
+
+Capture and replay takes three steps:
+
+#. Capture the trace.  Make sure to capture ``pthread_id`` context::
+
+    mkdir -p traces
+    lttng create -o traces librbd
+    lttng enable-event -u 'librbd:*'
+    lttng add-context -u -t pthread_id
+    lttng start
+    # run RBD workload here
+    lttng stop
+
+#. Process the trace with `rbd-replay-prep`_::
+
+    rbd-replay-prep traces/ust/uid/*/* replay.bin
+
+#. Replay the trace with `rbd-replay`_. Use read-only until you know 
+   it's doing what you want::
+
+    rbd-replay --read-only replay.bin
+
+.. important:: ``rbd-replay`` will destroy data by default.  Do not use against 
+   an image you wish to keep, unless you use the ``--read-only`` option.
+
+The replayed workload does not have to be against the same RBD image or even the
+same cluster as the captured workload. To account for differences, you may need
+to use the ``--pool`` and ``--map-image`` options of ``rbd-replay``.
+
+.. _rbd-replay: ../../man/8/rbd-replay
+.. _rbd-replay-prep: ../../man/8/rbd-replay-prep
diff --git a/doc/rbd/rbd-snapshot.rst b/doc/rbd/rbd-snapshot.rst
new file mode 100644
index 0000000..2e5af9f
--- /dev/null
+++ b/doc/rbd/rbd-snapshot.rst
@@ -0,0 +1,308 @@
+===========
+ Snapshots
+===========
+
+.. index:: Ceph Block Device; snapshots
+
+A snapshot is a read-only copy of the state of an image at a particular point in
+time. One of the advanced features of Ceph block devices is that you can create
+snapshots of the images to retain a history of an image's state. Ceph also
+supports snapshot layering, which allows you to clone images (e.g., a VM image)
+quickly and easily. Ceph supports block device snapshots using the ``rbd`` 
+command and many higher level interfaces, including `QEMU`_, `libvirt`_, 
+`OpenStack`_ and `CloudStack`_.
+
+.. important:: To use use RBD snapshots, you must have a running Ceph cluster.
+
+.. note:: If a snapshot is taken while `I/O` is still in progress in a image, the
+   snapshot might not get the exact or latest data of the image and the snapshot
+   may have to be cloned to a new image to be mountable. So, we recommend to stop
+   `I/O` before taking a snapshot of an image. If the image contains a filesystem,
+   the filesystem must be in a consistent state before taking a snapshot. To stop
+   `I/O` you can use `fsfreeze` command. See `fsfreeze(8)` man page for more details.
+   For virtual machines, `qemu-guest-agent` can be used to automatically freeze
+   filesystems when creating a snapshot.
+   
+.. ditaa:: +------------+         +-------------+
+           | {s}        |         | {s} c999    |
+           |   Active   |<-------*|   Snapshot  |
+           |   Image    |         |   of Image  |
+           | (stop i/o) |         | (read only) |
+           +------------+         +-------------+
+
+
+Cephx Notes
+===========
+
+When `cephx`_ is enabled (it is by default), you must specify a user name or ID
+and a path to the keyring containing the corresponding key for the user. See
+`User Management`_ for details. You may also add the ``CEPH_ARGS`` environment
+variable to avoid re-entry of the following parameters. ::
+
+	rbd --id {user-ID} --keyring=/path/to/secret [commands]
+	rbd --name {username} --keyring=/path/to/secret [commands]
+
+For example:: 
+
+	rbd --id admin --keyring=/etc/ceph/ceph.keyring [commands]
+	rbd --name client.admin --keyring=/etc/ceph/ceph.keyring [commands]
+
+.. tip:: Add the user and secret to the ``CEPH_ARGS`` environment 
+   variable so that you don't need to enter them each time.
+
+
+Snapshot Basics
+===============
+
+The following procedures demonstrate how to create, list, and remove
+snapshots using the ``rbd`` command on the command line.
+
+Create Snapshot
+---------------
+
+To create a snapshot with ``rbd``, specify the ``snap create`` option,  the pool
+name and the image name.  ::
+
+	rbd snap create {pool-name}/{image-name}@{snap-name}
+
+For example:: 
+
+	rbd snap create rbd/foo at snapname
+	
+
+List Snapshots
+--------------
+
+To list snapshots of an image, specify the pool name and the image name. ::
+
+	rbd snap ls {pool-name}/{image-name}
+
+For example::
+
+	rbd snap ls rbd/foo
+
+
+Rollback Snapshot
+-----------------
+
+To rollback to a snapshot with ``rbd``, specify the ``snap rollback`` option, the
+pool name, the image name and the snap name. ::
+
+	rbd snap rollback {pool-name}/{image-name}@{snap-name}
+
+For example::
+
+	rbd snap rollback rbd/foo at snapname
+
+
+.. note:: Rolling back an image to a snapshot means overwriting 
+   the current version of the image with data from a snapshot. The 
+   time it takes to execute a rollback increases with the size of the 
+   image. It is **faster to clone** from a snapshot **than to rollback** 
+   an image to a snapshot, and it is the preferred method of returning
+   to a pre-existing state.
+
+
+Delete a Snapshot
+-----------------
+
+To delete a snapshot with ``rbd``, specify the ``snap rm`` option, the pool
+name, the image name and the snap name. ::
+
+	rbd snap rm {pool-name}/{image-name}@{snap-name}
+	
+For example:: 
+
+	rbd snap rm rbd/foo at snapname
+
+
+.. note:: Ceph OSDs delete data asynchronously, so deleting a snapshot 
+   doesn't free up the disk space immediately.
+
+Purge Snapshots
+---------------
+
+To delete all snapshots for an image with ``rbd``, specify the ``snap purge``
+option and the image name. ::
+
+	rbd snap purge {pool-name}/{image-name}
+
+For example:: 
+
+	rbd snap purge rbd/foo
+
+
+.. index:: Ceph Block Device; snapshot layering
+
+Layering
+========
+
+Ceph supports the ability to create many copy-on-write (COW) clones of a block
+device shapshot. Snapshot layering enables Ceph block device clients to create
+images very quickly. For example, you might create a block device image with a
+Linux VM written to it; then, snapshot the image, protect the snapshot, and
+create as many copy-on-write clones as you like. A snapshot is read-only, 
+so cloning a snapshot simplifies semantics--making it possible to create
+clones rapidly.
+
+
+.. ditaa:: +-------------+              +-------------+
+           | {s} c999    |              | {s}         |
+           |  Snapshot   | Child refers |  COW Clone  |
+           |  of Image   |<------------*| of Snapshot |
+           |             |  to Parent   |             |
+           | (read only) |              | (writable)  |
+           +-------------+              +-------------+
+           
+               Parent                        Child
+
+.. note:: The terms "parent" and "child" mean a Ceph block device snapshot (parent),
+   and the corresponding image cloned from the snapshot (child). These terms are
+   important for the command line usage below.
+   
+Each cloned image (child) stores a reference to its parent image, which enables
+the cloned image to open the parent snapshot and read it.   
+
+A COW clone of a snapshot behaves exactly like any other Ceph block device
+image. You can read to, write from, clone, and resize cloned images. There are
+no special restrictions with cloned images. However, the copy-on-write clone of
+a snapshot refers to the snapshot, so you **MUST** protect the snapshot before
+you clone it. The following diagram depicts the process.
+
+.. note:: Ceph only supports cloning for format 2 images (i.e., created with
+   ``rbd create --image-format 2``).  The kernel client supports cloned images
+   since kernel 3.10.
+
+Getting Started with Layering
+-----------------------------
+
+Ceph block device layering is a simple process. You must have an image. You must
+create a snapshot of the image. You must protect the snapshot. Once you have 
+performed these steps, you can begin cloning the snapshot.
+
+.. ditaa:: +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           | Create Block Device Image  |------->|      Create a Snapshot      |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+                                                                |
+                         +--------------------------------------+ 
+                         |
+                         v
+           +----------------------------+        +-----------------------------+
+           |                            |        |                             |
+           |   Protect the Snapshot     |------->|     Clone the Snapshot      |
+           |                            |        |                             |
+           +----------------------------+        +-----------------------------+
+
+
+The cloned image has a reference to the parent snapshot, and includes the pool
+ID,  image ID and snapshot ID. The inclusion of the pool ID means that you may
+clone snapshots  from one pool to images in another pool.
+
+
+#. **Image Template:** A common use case for block device layering is to create a
+   a master image and a snapshot that serves as a template for clones. For example, 
+   a user may create an image for a Linux distribution (e.g., Ubuntu 12.04), and 
+   create a snapshot for it. Periodically, the user may update the image and create
+   a new snapshot (e.g., ``sudo apt-get update``, ``sudo apt-get upgrade``,
+   ``sudo apt-get dist-upgrade`` followed by ``rbd snap create``). As the image
+   matures, the user can clone any one of the snapshots.
+
+#. **Extended Template:** A more advanced use case includes extending a template
+   image that provides more information than a base image. For example, a user may
+   clone an image (e.g., a VM template) and install other software (e.g., a database,
+   a content management system, an analytics system, etc.) and then snapshot the 
+   extended image, which itself may be updated just like the base image.
+
+#. **Template Pool:** One way to use block device layering is to create a 
+   pool that contains master images that act as templates, and snapshots of those
+   templates. You may then extend read-only privileges to users so that they 
+   may clone the snapshots without the ability to write or execute within the pool.
+
+#. **Image Migration/Recovery:** One way to use block device layering is to migrate
+   or recover data from one pool into another pool.
+
+Protecting a Snapshot
+---------------------
+
+Clones access the parent snapshots. All clones would break if a user inadvertently 
+deleted the parent snapshot. To prevent data loss, you **MUST** protect the
+snapshot before you can clone it. ::
+
+	rbd snap protect {pool-name}/{image-name}@{snapshot-name}
+
+For example::
+
+	rbd snap protect rbd/my-image at my-snapshot
+
+.. note:: You cannot delete a protected snapshot.
+
+Cloning a Snapshot
+------------------
+
+To clone a snapshot, specify you need to specify the parent pool, image and
+snapshot; and, the child pool and image name. You must protect the snapshot
+before  you can clone it. ::
+
+	rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}
+	
+For example:: 
+
+	rbd clone rbd/my-image at my-snapshot rbd/new-image
+	
+.. note:: You may clone a snapshot from one pool to an image in another pool. For example, 
+   you may maintain read-only images and snapshots as templates in one pool, and writeable
+   clones in another pool.
+
+Unprotecting a Snapshot
+-----------------------
+
+Before you can delete a snapshot, you must unprotect it first. Additionally,
+you may *NOT* delete snapshots that have references from clones. You must
+flatten each clone of a snapshot, before you can delete the snapshot. :: 
+
+	rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}
+
+For example::
+
+	rbd snap unprotect rbd/my-image at my-snapshot
+
+
+Listing Children of a Snapshot
+------------------------------
+
+To list the children of a snapshot, execute the following::
+
+	rbd children {pool-name}/{image-name}@{snapshot-name}
+
+For example::
+
+	rbd children rbd/my-image at my-snapshot
+
+
+Flattening a Cloned Image
+-------------------------
+
+Cloned images retain a reference to the parent snapshot. When you remove the
+reference from the child clone to the parent snapshot, you effectively "flatten"
+the image by copying the information from the snapshot to the clone. The time
+it takes to flatten a clone increases with the size of the snapshot. To delete 
+a snapshot, you must flatten the child images first. ::
+
+	rbd flatten {pool-name}/{image-name}
+
+For example:: 
+
+	rbd flatten rbd/my-image
+
+.. note:: Since a flattened image contains all the information from the snapshot, 
+   a flattened image will take up more storage space than a layered clone.
+
+
+.. _cephx: ../../rados/configuration/auth-config-ref/
+.. _User Management: ../../operations/user-management
+.. _QEMU: ../qemu-rbd/
+.. _OpenStack: ../rbd-openstack/
+.. _CloudStack: ../rbd-cloudstack/
+.. _libvirt: ../libvirt/
diff --git a/doc/rbd/rbd.rst b/doc/rbd/rbd.rst
new file mode 100644
index 0000000..1755a80
--- /dev/null
+++ b/doc/rbd/rbd.rst
@@ -0,0 +1,72 @@
+===================
+ Ceph Block Device
+===================
+
+.. index:: Ceph Block Device; introduction
+
+A block is a sequence of bytes (for example, a 512-byte block of data).
+Block-based storage interfaces are the most common way to store data with
+rotating media such as hard disks, CDs, floppy disks, and even traditional
+9-track tape. The ubiquity of block device interfaces makes a virtual block
+device an ideal candidate to interact with a mass data storage system like Ceph.
+
+Ceph block devices are thin-provisioned, resizable and store data striped over
+multiple OSDs in a Ceph cluster.  Ceph block devices leverage
+:abbr:`RADOS (Reliable Autonomic Distributed Object Store)` capabilities
+such as snapshotting, replication and consistency. Ceph's 
+:abbr:`RADOS (Reliable Autonomic Distributed Object Store)` Block Devices (RBD) 
+interact with OSDs using kernel modules or the ``librbd`` library.
+
+.. ditaa::  +------------------------+ +------------------------+
+            |     Kernel Module      | |        librbd          |
+            +------------------------+-+------------------------+
+            |                   RADOS Protocol                  |
+            +------------------------+-+------------------------+
+            |          OSDs          | |        Monitors        |
+            +------------------------+ +------------------------+
+
+.. note:: Kernel modules can use Linux page caching. For ``librbd``-based 
+   applications, Ceph supports `RBD Caching`_.
+
+Ceph's block devices deliver high performance with infinite scalability to
+`kernel modules`_, or to :abbr:`KVMs (kernel virtual machines)` such as `Qemu`_, and
+cloud-based computing systems like `OpenStack`_ and `CloudStack`_ that rely on
+libvirt and Qemu to integrate with Ceph block devices. You can use the same cluster
+to operate the `Ceph RADOS Gateway`_, the `Ceph FS filesystem`_, and Ceph block
+devices simultaneously.
+
+.. important:: To use Ceph Block Devices, you must have access to a running 
+   Ceph cluster.
+
+.. toctree::
+	:maxdepth: 1
+
+	Commands <rados-rbd-cmds>
+	Kernel Modules <rbd-ko>
+	Snapshots<rbd-snapshot>
+        Mirroring <rbd-mirroring>
+	QEMU <qemu-rbd>
+	libvirt <libvirt>
+	Cache Settings <rbd-config-ref/>
+	OpenStack <rbd-openstack>
+	CloudStack <rbd-cloudstack>
+	Manpage rbd <../../man/8/rbd>
+	Manpage rbd-fuse <../../man/8/rbd-fuse>
+	Manpage rbd-nbd <../../man/8/rbd-nbd>
+	Manpage ceph-rbdnamer <../../man/8/ceph-rbdnamer>
+	RBD Replay <rbd-replay>
+	Manpage rbd-replay-prep <../../man/8/rbd-replay-prep>
+	Manpage rbd-replay <../../man/8/rbd-replay>
+	Manpage rbd-replay-many <../../man/8/rbd-replay-many>
+	Manpage rbdmap <../../man/8/rbdmap>
+	librbd <librbdpy>
+	
+	
+
+.. _RBD Caching: ../rbd-config-ref/
+.. _kernel modules: ../rbd-ko/
+.. _Qemu: ../qemu-rbd/
+.. _OpenStack: ../rbd-openstack
+.. _CloudStack: ../rbd-cloudstack
+.. _Ceph RADOS Gateway: ../../radosgw/
+.. _Ceph FS filesystem: ../../cephfs/
diff --git a/doc/release-notes.rst b/doc/release-notes.rst
new file mode 100644
index 0000000..17c95fd
--- /dev/null
+++ b/doc/release-notes.rst
@@ -0,0 +1,13299 @@
+===============
+ Release Notes
+===============
+
+This major release of Ceph will be the foundation for the next
+long-term stable release.  There have been many major changes since
+the Infernalis (9.2.x) and Hammer (0.94.x) releases, and the upgrade
+process is non-trivial. Please read these release notes carefully.
+
+Major Changes from Infernalis
+-----------------------------
+
+- *CephFS*:
+
+  * This is the first release in which CephFS is declared stable and
+    production ready!  Several features are disabled by default, including
+    snapshots and multiple active MDS servers.
+  * The repair and disaster recovery tools are now feature-complete.
+  * A new cephfs-volume-manager module is included that provides a
+    high-level interface for creating "shares" for OpenStack Manila
+    and similar projects.
+  * There is now experimental support for multiple CephFS file systems
+    within a single cluster.
+  
+- *RGW*:
+
+  * The multisite feature has been almost completely rearchitected and
+    rewritten to support any number of clusters/sites, bidirectional
+    fail-over, and active/active configurations.
+  * You can now access radosgw buckets via NFS (experimental).
+  * The AWS4 authentication protocol is now supported.
+  * There is now support for S3 request payer buckets.
+  * The new multitenancy infrastructure improves compatibility with
+    Swift, which provides a separate container namespace for each
+    user/tenant.
+  * The OpenStack Keystone v3 API is now supported.  There are a range
+    of other small Swift API features and compatibility improvements
+    as well, including bulk delete and SLO (static large objects).
+
+- *RBD*:
+
+  * There is new support for mirroring (asynchronous replication) of
+    RBD images across clusters.  This is implemented as a per-RBD
+    image journal that can be streamed across a WAN to another site,
+    and a new rbd-mirror daemon that performs the cross-cluster
+    replication.
+  * The exclusive-lock, object-map, fast-diff, and journaling features
+    can be enabled or disabled dynamically. The deep-flatten features 
+    can be disabled dynamically but not re-enabled.
+  * The RBD CLI has been rewritten to provide command-specific help
+    and full bash completion support.
+  * RBD snapshots can now be renamed.
+
+- *RADOS*:
+
+  * BlueStore, a new OSD backend, is included as an experimental
+    feature.  The plan is for it to become the default backend in the
+    K or L release.
+  * The OSD now persists scrub results and provides a librados API to
+    query results in detail.
+  * We have revised our documentation to recommend *against* using
+    ext4 as the underlying filesystem for Ceph OSD daemons due to
+    problems supporting our long object name handling.
+
+Major Changes from Hammer
+-------------------------
+
+- *General*:
+
+  * Ceph daemons are now managed via systemd (with the exception of
+    Ubuntu Trusty, which still uses upstart).
+  * Ceph daemons run as 'ceph' user instead of 'root'.
+  * On Red Hat distros, there is also an SELinux policy.
+
+- *RADOS*:
+
+  * The RADOS cache tier can now proxy write operations to the base
+    tier, allowing writes to be handled without forcing migration of
+    an object into the cache.
+  * The SHEC erasure coding support is no longer flagged as
+    experimental. SHEC trades some additional storage space for faster
+    repair.
+  * There is now a unified queue (and thus prioritization) of client
+    IO, recovery, scrubbing, and snapshot trimming.
+  * There have been many improvements to low-level repair tooling
+    (ceph-objectstore-tool).
+  * The internal ObjectStore API has been significantly cleaned up in order
+    to faciliate new storage backends like BlueStore.
+
+- *RGW*:
+
+  * The Swift API now supports object expiration.
+  * There are many Swift API compatibility improvements.
+
+- *RBD*:
+
+  * The ``rbd du`` command shows actual usage (quickly, when
+    object-map is enabled).
+  * The object-map feature has seen many stability improvements.
+  * The object-map and exclusive-lock features can be enabled or disabled
+    dynamically.
+  * You can now store user metadata and set persistent librbd options
+    associated with individual images.
+  * The new deep-flatten features allow flattening of a clone and all
+    of its snapshots.  (Previously snapshots could not be flattened.)
+  * The export-diff command is now faster (it uses aio).  There is also
+    a new fast-diff feature.
+  * The --size argument can be specified with a suffix for units
+    (e.g., ``--size 64G``).
+  * There is a new ``rbd status`` command that, for now, shows who has
+    the image open/mapped.
+
+- *CephFS*:
+
+  * You can now rename snapshots.
+  * There have been ongoing improvements around administration, diagnostics,
+    and the check and repair tools.
+  * The caching and revocation of client cache state due to unused
+    inodes has been dramatically improved.
+  * The ceph-fuse client behaves better on 32-bit hosts.
+
+Distro compatibility
+--------------------
+
+Starting with Infernalis, we have dropped support for many older
+distributions so that we can move to a newer compiler toolchain (e.g.,
+C++11).  Although it is still possible to build Ceph on older
+distributions by installing backported development tools, we are not
+building and publishing release packages for ceph.com.
+
+We now build packages for the following distributions and architectures:
+
+- x86_64:
+
+  * CentOS 7.x.  We have dropped support for CentOS 6 (and other RHEL 6
+    derivatives, like Scientific Linux 6).
+  * Debian Jessie 8.x.  Debian Wheezy 7.x's g++ has incomplete support
+    for C++11 (and no systemd).
+  * Ubuntu Xenial 16.04 and Trusty 14.04.  Ubuntu Precise 12.04 is no
+    longer supported.
+  * Fedora 22 or later.
+
+- aarch64 / arm64:
+
+  * Ubuntu Xenial 16.04.
+  * CentOS 7.x.  However, note that we have a few dependencies that are
+    not in core CentOS and will need to be found from other resources.
+    We expect the situation here to improve soon.
+
+Upgrading from Infernalis or Hammer
+-----------------------------------
+
+* We now recommend against using ``ext4`` as the underlying file
+  system for Ceph OSDs, especially when RGW or other users of long
+  RADOS object names are used.  For more information about why, please
+  see `Filesystem Recommendations`_.
+
+  If you have an existing cluster that uses ext4 for the OSDs but uses only
+  RBD and/or CephFS, then the ext4 limitations will not affect you.  Before
+  upgrading, be sure add the following to ``ceph.conf`` to allow the OSDs to
+  start::
+
+    osd max object name len = 256
+    osd max object namespace len = 64
+
+  Keep in mind that if you set these lower object name limits and
+  later decide to use RGW on this cluster, it will have problems
+  storing S3/Swift objects with long names.  This startup check can also be
+  disabled via the below option, although this is not recommended::
+
+    osd check max object name len on startup = false
+
+.. _Filesystem Recommendations: ../configuration/filesystem-recommendations
+
+* There are no major compatibility changes since Infernalis.  Simply
+  upgrading the daemons on each host and restarting all daemons is
+  sufficient.
+
+* The rbd CLI no longer accepts the deprecated '--image-features' option
+  during create, import, and clone operations.  The '--image-feature'
+  option should be used instead.
+
+* The rbd legacy image format (version 1) is deprecated with the Jewel release.
+  Attempting to create a new version 1 RBD image will result in a warning.
+  Future releases of Ceph will remove support for version 1 RBD images.
+
+* The 'send_pg_creates' and 'map_pg_creates' mon CLI commands are
+  obsolete and no longer supported.
+
+* A new configure option 'mon_election_timeout' is added to specifically
+  limit max waiting time of monitor election process, which was previously
+  restricted by 'mon_lease'.
+
+* CephFS filesystems created using versions older than Firefly (0.80) must
+  use the new 'cephfs-data-scan tmap_upgrade' command after upgrading to
+  Jewel.  See 'Upgrading' in the CephFS documentation for more information.
+
+* The 'ceph mds setmap' command has been removed.
+
+* The default RBD image features for new images have been updated to
+  enable the following: exclusive lock, object map, fast-diff, and
+  deep-flatten. These features are not currently supported by the RBD
+  kernel driver nor older RBD clients. They can be disabled on a per-image
+  basis via the RBD CLI, or the default features can be updated to the
+  pre-Jewel setting by adding the following to the client section of the Ceph
+  configuration file::
+
+    rbd default features = 1
+
+* The rbd legacy image format (version 1) is deprecated with the Jewel
+  release.
+
+* After upgrading, users should set the 'sortbitwise' flag to enable the new
+  internal object sort order::
+
+    ceph osd set sortbitwise
+
+  This flag is important for the new object enumeration API and for
+  new backends like BlueStore.
+
+* The rbd CLI no longer permits creating images and snapshots with potentially
+  ambiguous names (e.g. the '/' and '@' characters are disallowed). The
+  validation can be temporarily disabled by adding "--rbd-validate-names=false"
+  to the rbd CLI when creating an image or snapshot. It can also be disabled
+  by adding the following to the client section of the Ceph configuration file::
+
+    rbd validate names = false
+
+Upgrading from Hammer
+---------------------
+
+* All cluster nodes must first upgrade to Hammer v0.94.4 or a later
+  v0.94.z release; only then is it possible to upgrade to Jewel
+  10.2.z.
+
+* For all distributions that support systemd (CentOS 7, Fedora, Debian
+  Jessie 8.x, OpenSUSE), ceph daemons are now managed using native systemd
+  files instead of the legacy sysvinit scripts.  For example,::
+
+    systemctl start ceph.target       # start all daemons
+    systemctl status ceph-osd at 12      # check status of osd.12
+
+  The main notable distro that is *not* yet using systemd is Ubuntu trusty
+  14.04.  (The next Ubuntu LTS, 16.04, will use systemd instead of upstart.)
+
+* Ceph daemons now run as user and group ``ceph`` by default.  The
+  ceph user has a static UID assigned by Fedora and Debian (also used by
+  derivative distributions like RHEL/CentOS and Ubuntu).  On SUSE the same
+  UID/GID as in Fedora and Debian will be used, *provided it is not already
+  assigned*. In the unlikely event the preferred UID or GID is assigned to a
+  different user/group, ceph will get a dynamically assigned UID/GID.
+
+  If your systems already have a ceph user, upgrading the package will cause
+  problems.  We suggest you first remove or rename the existing 'ceph' user
+  and 'ceph' group before upgrading.
+
+  When upgrading, administrators have two options:
+
+   #. Add the following line to ``ceph.conf`` on all hosts::
+
+        setuser match path = /var/lib/ceph/$type/$cluster-$id
+
+      This will make the Ceph daemons run as root (i.e., not drop
+      privileges and switch to user ceph) if the daemon's data
+      directory is still owned by root.  Newly deployed daemons will
+      be created with data owned by user ceph and will run with
+      reduced privileges, but upgraded daemons will continue to run as
+      root.
+
+   #. Fix the data ownership during the upgrade.  This is the
+      preferred option, but it is more work and can be very time
+      consuming.  The process for each host is to:
+
+      #. Upgrade the ceph package.  This creates the ceph user and group.  For
+	 example::
+
+	   ceph-deploy install --stable jewel HOST
+
+      #. Stop the daemon(s).::
+
+	   service ceph stop           # fedora, centos, rhel, debian
+	   stop ceph-all               # ubuntu
+
+      #. Fix the ownership::
+
+	   chown -R ceph:ceph /var/lib/ceph
+
+      #. Restart the daemon(s).::
+
+	   start ceph-all                # ubuntu
+	   systemctl start ceph.target   # debian, centos, fedora, rhel
+
+      Alternatively, the same process can be done with a single daemon
+      type, for example by stopping only monitors and chowning only
+      ``/var/lib/ceph/mon``.
+
+* The on-disk format for the experimental KeyValueStore OSD backend has
+  changed.  You will need to remove any OSDs using that backend before you
+  upgrade any test clusters that use it.
+
+* When a pool quota is reached, librados operations now block indefinitely,
+  the same way they do when the cluster fills up.  (Previously they would return
+  -ENOSPC.)  By default, a full cluster or pool will now block.  If your
+  librados application can handle ENOSPC or EDQUOT errors gracefully, you can
+  get error returns instead by using the new librados OPERATION_FULL_TRY flag.
+
+* The return code for librbd's rbd_aio_read and Image::aio_read API methods no
+  longer returns the number of bytes read upon success.  Instead, it returns 0
+  upon success and a negative value upon failure.
+
+* 'ceph scrub', 'ceph compact' and 'ceph sync force' are now DEPRECATED.  Users
+  should instead use 'ceph mon scrub', 'ceph mon compact' and
+  'ceph mon sync force'.
+
+* 'ceph mon_metadata' should now be used as 'ceph mon metadata'. There is no
+  need to deprecate this command (same major release since it was first
+  introduced).
+
+* The `--dump-json` option of "osdmaptool" is replaced by `--dump json`.
+
+* The commands of "pg ls-by-{pool,primary,osd}" and "pg ls" now take "recovering"
+  instead of "recovery", to include the recovering pgs in the listed pgs.
+
+Upgrading from Firefly
+----------------------
+
+Upgrading directly from Firefly v0.80.z is not recommended.  It is
+possible to do a direct upgrade, but not without downtime, as all OSDs
+must be stopped, upgraded, and then restarted.  We recommend that
+clusters be first upgraded to Hammer v0.94.6 or a later v0.94.z
+release; only then is it possible to upgrade to Jewel 10.2.z for an
+online upgrade (see below).
+
+To do an offline upgrade directly from Firefly, all Firefly OSDs must
+be stopped and marked down before any Jewel OSDs will be allowed
+to start up.  This fencing is enforced by the Jewel monitor, so
+you should use an upgrade procedure like:
+
+  #. Upgrade Ceph on monitor hosts
+  #. Restart all ceph-mon daemons
+  #. Set noout::
+       ceph osd set noout
+  #. Upgrade Ceph on all OSD hosts
+  #. Stop all ceph-osd daemons
+  #. Mark all OSDs down with something like::
+       ceph osd down `seq 0 1000`
+  #. Start all ceph-osd daemons
+  #. Let the cluster settle and then unset noout::
+       ceph osd unset noout
+  #. Upgrade and restart any remaining daemons (ceph-mds, radosgw)
+
+Notable Changes since Infernalis
+--------------------------------
+
+includes through 10.1.2
+
+* rgw: jewel nfs fixes (`pr#8460 <http://github.com/ceph/ceph/pull/8460>`_, Matt Benjamin)
+* osd: PG: set epoch_created and parent_split_bits for child pg (`issue#15426 <http://tracker.ceph.com/issues/15426>`_, `pr#8552 <http://github.com/ceph/ceph/pull/8552>`_, Kefu Chai)
+* rgw: signature mismatch with escaped characters in url query portion (`issue#15358 <http://tracker.ceph.com/issues/15358>`_, `pr#8445 <http://github.com/ceph/ceph/pull/8445>`_, Javier M. Mellid)
+* authtool: update --help and manpage to match code. (`pr#8456 <http://github.com/ceph/ceph/pull/8456>`_, Robin H. Johnson)
+* build: Respect TMPDIR for virtualenv. (`pr#8457 <http://github.com/ceph/ceph/pull/8457>`_, Robin H. Johnson)
+* ceph-disk: do not always fail when re-using a partition (`pr#8508 <http://github.com/ceph/ceph/pull/8508>`_, You Ji)
+* ceph-fuse: rotate log file (`pr#8485 <http://github.com/ceph/ceph/pull/8485>`_, Sage Weil)
+* ceph-rest-api: fix fs/flag/set (`pr#8428 <http://github.com/ceph/ceph/pull/8428>`_, Sage Weil)
+* check-generated.sh: can't source bash from sh (`pr#8521 <http://github.com/ceph/ceph/pull/8521>`_, Michal Jarzabek)
+* common: buffer: put a guard for stat() syscall during read_file (`pr#7956 <http://github.com/ceph/ceph/pull/7956>`_, xie xingguo)
+* common: fix time_t cast in decode (`issue#15330 <http://tracker.ceph.com/issues/15330>`_, `pr#8419 <http://github.com/ceph/ceph/pull/8419>`_, Adam C. Emerson)
+* crush: fix typo (`pr#8518 <http://github.com/ceph/ceph/pull/8518>`_, Wei Jin)
+* doc: rgw admin uses "region list" not "regions list" (`pr#8517 <http://github.com/ceph/ceph/pull/8517>`_, Kris Jurka)
+* journal: fix final result for JournalTrimmer::C_RemoveSet (`pr#8516 <http://github.com/ceph/ceph/pull/8516>`_, runsisi)
+* journal: fix race condition between Future and journal shutdown (`issue#15364 <http://tracker.ceph.com/issues/15364>`_, `pr#8477 <http://github.com/ceph/ceph/pull/8477>`_, Jason Dillaman)
+* librados: Revert "rados: Add new field flags for ceph_osd_op.copy_get." (`pr#8486 <http://github.com/ceph/ceph/pull/8486>`_, Sage Weil)
+* librbd: disallow unsafe rbd_op_threads values (`issue#15034 <http://tracker.ceph.com/issues/15034>`_, `pr#8459 <http://github.com/ceph/ceph/pull/8459>`_, Josh Durgin)
+* mailmap update (`pr#8522 <http://github.com/ceph/ceph/pull/8522>`_, M Ranga Swami Reddy)
+* mds: Add cmapv to ESessions default constructor initializer list (`pr#8403 <http://github.com/ceph/ceph/pull/8403>`_, John Coyle)
+* mds: fix file_layout_t legacy encoding snafu (`pr#8455 <http://github.com/ceph/ceph/pull/8455>`_, Sage Weil)
+* os/ObjectStore: make device uuid probe output something friendly (`pr#8418 <http://github.com/ceph/ceph/pull/8418>`_, Sage Weil)
+* os/bluestore: revamp BlueFS bdev management and add perfcounters (`issue#15376 <http://tracker.ceph.com/issues/15376>`_, `pr#8431 <http://github.com/ceph/ceph/pull/8431>`_, Sage Weil)
+* os/filestore: force lfn attrs to be written atomically, restructure name length limits (`pr#8496 <http://github.com/ceph/ceph/pull/8496>`_, Samuel Just)
+* osd/ReplicatedPG::_rollback_to: update the OMAP flag (`issue#14777 <http://tracker.ceph.com/issues/14777>`_, `pr#8495 <http://github.com/ceph/ceph/pull/8495>`_, Samuel Just)
+* osd: clean up temp object if copy-from fails (`pr#8487 <http://github.com/ceph/ceph/pull/8487>`_, Sage Weil)
+* osd: fix two scrub relevant issues (`pr#8462 <http://github.com/ceph/ceph/pull/8462>`_, xie xingguo)
+* osd: fix/clean up full map request handling (`pr#8446 <http://github.com/ceph/ceph/pull/8446>`_, Sage Weil)
+* osdc/Objecter: fix narrow race with tid assignment (`issue#14364 <http://tracker.ceph.com/issues/14364>`_, `pr#7981 <http://github.com/ceph/ceph/pull/7981>`_, Sage Weil)
+* radosgw-admin: allow (`pr#8529 <http://github.com/ceph/ceph/pull/8529>`_, Orit Wasserman)
+* rbd-mirror: workaround for intermingled lockdep singletons (`pr#8476 <http://github.com/ceph/ceph/pull/8476>`_, Jason Dillaman)
+* rbd: journal reset should disable/re-enable journaling feature (`issue#15097 <http://tracker.ceph.com/issues/15097>`_, `pr#8490 <http://github.com/ceph/ceph/pull/8490>`_, Jason Dillaman)
+* rgw-admin: remove unused iterator and fix error message (`pr#8507 <http://github.com/ceph/ceph/pull/8507>`_, Karol Mroz)
+* rgw: aws4 subdomain calling bugfix (`issue#15369 <http://tracker.ceph.com/issues/15369>`_, `pr#8472 <http://github.com/ceph/ceph/pull/8472>`_, Javier M. Mellid)
+* rgw: fix a typo in error message (`pr#8434 <http://github.com/ceph/ceph/pull/8434>`_, Abhishek Lekshmanan)
+* rgw: fix problem deleting objects begining with double underscores (`issue#15318 <http://tracker.ceph.com/issues/15318>`_, `pr#8488 <http://github.com/ceph/ceph/pull/8488>`_, Orit Wasserman)
+* rgw: retry RGWRemoteMetaLog::read_log_info() while master is down (`pr#8453 <http://github.com/ceph/ceph/pull/8453>`_, Casey Bodley)
+* rgw: the map 'headers' is assigned a wrong value (`pr#8481 <http://github.com/ceph/ceph/pull/8481>`_, weiqiaomiao)
+* rgw_ldap: make ldap.h inclusion conditional (`pr#8500 <http://github.com/ceph/ceph/pull/8500>`_, Matt Benjamin)
+* systemd: drop any systemd imposed process/thread limits (`pr#8450 <http://github.com/ceph/ceph/pull/8450>`_, James Page)
+* test: fix ut test failure caused by lfn change (`issue#15464 <http://tracker.ceph.com/issues/15464>`_, `pr#8544 <http://github.com/ceph/ceph/pull/8544>`_, xie xingguo)
+* test: fix valgrind memcheck issues for rbd-mirror test cases (`issue#15354 <http://tracker.ceph.com/issues/15354>`_, `pr#8493 <http://github.com/ceph/ceph/pull/8493>`_, Jason Dillaman)
+* tests: add Ubuntu 16.04 xenial dockerfile (`pr#8519 <http://github.com/ceph/ceph/pull/8519>`_, Loic Dachary)
+* doc: Adding documentation on how to use new dynamic throttle scheme (`pr#8069 <http://github.com/ceph/ceph/pull/8069>`_, Somnath Roy)
+* mds: Be more careful about directory fragmentation and scrubbing (`issue#15167 <http://tracker.ceph.com/issues/15167>`_, `pr#8180 <http://github.com/ceph/ceph/pull/8180>`_, Yan, Zheng)
+* cmake: For CMake version <= 2.8.11, use LINK_PRIVATE (`pr#8422 <http://github.com/ceph/ceph/pull/8422>`_, Haomai Wang)
+* Makefile-env.am: set a default for CEPH_BUILD_VIRTUALENV (part 2) (`pr#8320 <http://github.com/ceph/ceph/pull/8320>`_, Loic Dachary)
+* mds: Minor fixes around data scan in some scenarios (`pr#8115 <http://github.com/ceph/ceph/pull/8115>`_, Yan, Zheng)
+* osd/PG: pg down state blocked by osd.x, lost osd.x cannot solve peering stuck (`issue#13531 <http://tracker.ceph.com/issues/13531>`_, `pr#6317 <http://github.com/ceph/ceph/pull/6317>`_, Xiaowei Chen)
+* osd/PG: indicate in pg query output whether ignore_history_les would help (`pr#8156 <http://github.com/ceph/ceph/pull/8156>`_, Sage Weil)
+* osdc/Striper: reduce assemble_result log level (`pr#8426 <http://github.com/ceph/ceph/pull/8426>`_, Jason Dillaman)
+* qa/workunits/rados: Test exit values on test.sh, fix tier.cc (`issue#15165 <http://tracker.ceph.com/issues/15165>`_, `pr#8266 <http://github.com/ceph/ceph/pull/8266>`_, Samuel Just)
+* ceph.in: correct dev python path for automake builds (`pr#8360 <http://github.com/ceph/ceph/pull/8360>`_, Josh Durgin)
+* osd/OSD: fix build_past_intervals_parallel (`pr#8215 <http://github.com/ceph/ceph/pull/8215>`_, David Zafman)
+* rgw: sync fixes 4 (`pr#8190 <http://github.com/ceph/ceph/pull/8190>`_, Yehuda Sadeh)
+* rgw: Check return code in RGWFileHandle::write (`pr#7875 <http://github.com/ceph/ceph/pull/7875>`_, Brad Hubbard)
+* build: fix compiling warnings (`pr#8366 <http://github.com/ceph/ceph/pull/8366>`_, Dongsheng Yang)
+* ceph-detect-init/run-tox.sh: FreeBSD: No init detect (`pr#8373 <http://github.com/ceph/ceph/pull/8373>`_, Willem Jan Withagen)
+* ceph.in: fix python libpath for automake as well (`pr#8362 <http://github.com/ceph/ceph/pull/8362>`_, Josh Durgin)
+* ceph: bash auto complete for CLI based on mon command descriptions (`pr#7693 <http://github.com/ceph/ceph/pull/7693>`_, Adam Kupczyk)
+* cls_journal: fix -EEXIST checking (`pr#8413 <http://github.com/ceph/ceph/pull/8413>`_, runsisi)
+* cls_rbd: fix -EEXIST checking in cls::rbd::image_set (`pr#8371 <http://github.com/ceph/ceph/pull/8371>`_, runsisi)
+* cls_rbd: mirror_image_list should return global image id (`pr#8297 <http://github.com/ceph/ceph/pull/8297>`_, Jason Dillaman)
+* cls_rbd: pass WILLNEED fadvise flags during object map update (`issue#15332 <http://tracker.ceph.com/issues/15332>`_, `pr#8380 <http://github.com/ceph/ceph/pull/8380>`_, Jason Dillaman)
+* cls_rbd: read_peers: update last_read on next cls_cxx_map_get_vals (`pr#8374 <http://github.com/ceph/ceph/pull/8374>`_, Mykola Golub)
+* cmake: Build cython modules and change paths to bin/, lib/ (`pr#8351 <http://github.com/ceph/ceph/pull/8351>`_, John Spray, Ali Maredia)
+* cmake: add FindOpenSSL.cmake (`pr#8106 <http://github.com/ceph/ceph/pull/8106>`_, Marcus Watts, Matt Benjamin)
+* cmake: add StandardPolicy.cc to librbd (`pr#8368 <http://github.com/ceph/ceph/pull/8368>`_, Kefu Chai)
+* cmake: add missing librbd/MirrorWatcher.cc and librd/ObjectWatcher.cc (`pr#8399 <http://github.com/ceph/ceph/pull/8399>`_, Orit Wasserman)
+* cmake: fix mrun to handle cmake build structure (`pr#8237 <http://github.com/ceph/ceph/pull/8237>`_, Orit Wasserman)
+* cmake: fix the build of test_rados_api_list (`pr#8438 <http://github.com/ceph/ceph/pull/8438>`_, Kefu Chai)
+* common: fix race during optracker switches between enabled/disabled mode (`pr#8330 <http://github.com/ceph/ceph/pull/8330>`_, xie xingguo)
+* config_opts: disable filestore throttle soft backoff by default (`pr#8265 <http://github.com/ceph/ceph/pull/8265>`_, Samuel Just)
+* configure: Add -D_LARGEFILE64_SOURCE to Linux build. (`pr#8402 <http://github.com/ceph/ceph/pull/8402>`_, Ira Cooper)
+* crush: fix error log (`pr#8430 <http://github.com/ceph/ceph/pull/8430>`_, Wei Jin)
+* crushtool: Don't crash when called on a file that isn't a crushmap (`issue#8286 <http://tracker.ceph.com/issues/8286>`_, `pr#8038 <http://github.com/ceph/ceph/pull/8038>`_, Brad Hubbard)
+* debian/rules: put init-ceph in /etc/init.d/ceph, not ceph-base (`issue#15329 <http://tracker.ceph.com/issues/15329>`_, `pr#8406 <http://github.com/ceph/ceph/pull/8406>`_, Dan Mick)
+* doc/dev: add "Deploy a cluster for manual testing" section (`issue#15218 <http://tracker.ceph.com/issues/15218>`_, `pr#8228 <http://github.com/ceph/ceph/pull/8228>`_, Nathan Cutler)
+* doc/rados/operations/crush: fix the formatting (`pr#8306 <http://github.com/ceph/ceph/pull/8306>`_, Kefu Chai)
+* doc/release-notes: fix indents (`pr#8345 <http://github.com/ceph/ceph/pull/8345>`_, Kefu Chai)
+* doc: Fixes headline different font size and type (`pr#8328 <http://github.com/ceph/ceph/pull/8328>`_, scienceluo)
+* doc: Remove Ceph Monitors do lots of fsync() (`issue#15288 <http://tracker.ceph.com/issues/15288>`_, `pr#8327 <http://github.com/ceph/ceph/pull/8327>`_, Vikhyat Umrao)
+* doc: Updated CloudStack RBD documentation (`pr#8308 <http://github.com/ceph/ceph/pull/8308>`_, Wido den Hollander)
+* doc: amend Fixes instructions in SubmittingPatches (`pr#8312 <http://github.com/ceph/ceph/pull/8312>`_, Nathan Cutler)
+* doc: draft notes for jewel (`pr#8211 <http://github.com/ceph/ceph/pull/8211>`_, Loic Dachary, Sage Weil)
+* doc: fix typo, duplicated content etc. for Jewel release notes (`pr#8342 <http://github.com/ceph/ceph/pull/8342>`_, xie xingguo)
+* doc: fix wrong type of hyphen (`pr#8252 <http://github.com/ceph/ceph/pull/8252>`_, xie xingguo)
+* doc: rgw_region_root_pool option should be in [global] (`issue#15244 <http://tracker.ceph.com/issues/15244>`_, `pr#8271 <http://github.com/ceph/ceph/pull/8271>`_, Vikhyat Umrao)
+* doc: very basic doc on mstart (`pr#8207 <http://github.com/ceph/ceph/pull/8207>`_, Abhishek Lekshmanan)
+* global/global_init: expand metavariables in setuser_match_path (`issue#15365 <http://tracker.ceph.com/issues/15365>`_, `pr#8433 <http://github.com/ceph/ceph/pull/8433>`_, Sage Weil)
+* global/signal_handler: print thread name in signal handler (`pr#8177 <http://github.com/ceph/ceph/pull/8177>`_, Jianpeng Ma)
+* libcephfs: fix python tests and fix getcwd on missing dir (`pr#7901 <http://github.com/ceph/ceph/pull/7901>`_, John Spray)
+* librbd: avoid throwing error if mirroring is unsupported (`pr#8417 <http://github.com/ceph/ceph/pull/8417>`_, Jason Dillaman)
+* librbd: disable image mirroring when image is removed (`issue#15265 <http://tracker.ceph.com/issues/15265>`_, `pr#8375 <http://github.com/ceph/ceph/pull/8375>`_, Ricardo Dias)
+* librbd: send notifications for mirroring status updates (`pr#8355 <http://github.com/ceph/ceph/pull/8355>`_, Jason Dillaman)
+* mailmap updates (`pr#8256 <http://github.com/ceph/ceph/pull/8256>`_, Loic Dachary)
+* makefile: fix rbdmap manpage (`pr#8310 <http://github.com/ceph/ceph/pull/8310>`_, Kefu Chai)
+* mds: allow client to request caps when opening file (`issue#14360 <http://tracker.ceph.com/issues/14360>`_, `pr#7952 <http://github.com/ceph/ceph/pull/7952>`_, Yan, Zheng)
+* messages/MOSDOp: clear reqid inc for v6 encoding (`issue#15230 <http://tracker.ceph.com/issues/15230>`_, `pr#8299 <http://github.com/ceph/ceph/pull/8299>`_, Sage Weil)
+* mon/MonClient: fix shutdown race (`issue#13992 <http://tracker.ceph.com/issues/13992>`_, `pr#8335 <http://github.com/ceph/ceph/pull/8335>`_, Sage Weil)
+* mon: do not send useless pg_create messages for split pgs (`pr#8247 <http://github.com/ceph/ceph/pull/8247>`_, Sage Weil)
+* mon: mark_down_pgs in lockstep with pg_map's osdmap epoch (`pr#8208 <http://github.com/ceph/ceph/pull/8208>`_, Sage Weil)
+* mon: remove remove_legacy_versions() (`pr#8324 <http://github.com/ceph/ceph/pull/8324>`_, Kefu Chai)
+* mon: remove unnecessary comment for update_from_paxos (`pr#8400 <http://github.com/ceph/ceph/pull/8400>`_, Qinghua Jin)
+* mon: remove unused variable (`issue#15292 <http://tracker.ceph.com/issues/15292>`_, `pr#8337 <http://github.com/ceph/ceph/pull/8337>`_, Javier M. Mellid)
+* mon: show the pool quota info on ceph df detail command (`issue#14216 <http://tracker.ceph.com/issues/14216>`_, `pr#7094 <http://github.com/ceph/ceph/pull/7094>`_, song baisen)
+* monclient: avoid key renew storm on clock skew (`issue#12065 <http://tracker.ceph.com/issues/12065>`_, `pr#8258 <http://github.com/ceph/ceph/pull/8258>`_, Alexey Sheplyakov)
+* mrun: update path to cmake binaries (`pr#8447 <http://github.com/ceph/ceph/pull/8447>`_, Casey Bodley)
+* msg/async: avoid log spam on throttle (`issue#15031 <http://tracker.ceph.com/issues/15031>`_, `pr#8263 <http://github.com/ceph/ceph/pull/8263>`_, Kefu Chai)
+* msg/async: remove experiment feature (`pr#7820 <http://github.com/ceph/ceph/pull/7820>`_, Haomai Wang)
+* os/ObjectStore: add noexcept to ensure move ctor is used (`pr#8421 <http://github.com/ceph/ceph/pull/8421>`_, Kefu Chai)
+* os/ObjectStore: fix _update_op for split dest_cid (`pr#8364 <http://github.com/ceph/ceph/pull/8364>`_, Sage Weil)
+* os/ObjectStore: try_move_rename in transaction append and add coverage to store_test (`issue#15205 <http://tracker.ceph.com/issues/15205>`_, `pr#8359 <http://github.com/ceph/ceph/pull/8359>`_, Samuel Just)
+* os/bluestore: a few fixes (`pr#8193 <http://github.com/ceph/ceph/pull/8193>`_, Sage Weil)
+* os/bluestore: ceph-bluefs-tool fixes (`issue#15261 <http://tracker.ceph.com/issues/15261>`_, `pr#8292 <http://github.com/ceph/ceph/pull/8292>`_, Venky Shankar)
+* osd/ClassHandler: only dlclose() the classes not missing (`pr#8354 <http://github.com/ceph/ceph/pull/8354>`_, Kefu Chai)
+* osd/OSD.cc: finish full_map_request every MOSDMap message. (`issue#15130 <http://tracker.ceph.com/issues/15130>`_, `pr#8147 <http://github.com/ceph/ceph/pull/8147>`_, Xiaoxi Chen)
+* osd: add 'proxy' cache mode (`issue#12814 <http://tracker.ceph.com/issues/12814>`_, `pr#8210 <http://github.com/ceph/ceph/pull/8210>`_, Sage Weil)
+* osd: add the support of per pool scrub priority (`pr#7062 <http://github.com/ceph/ceph/pull/7062>`_, Zhiqiang Wang)
+* osd: bail out of _committed_osd_maps if we are shutting down (`pr#8267 <http://github.com/ceph/ceph/pull/8267>`_, Samuel Just)
+* osd: duplicated clear for peer_missing (`pr#8315 <http://github.com/ceph/ceph/pull/8315>`_, Ning Yao)
+* osd: fix bugs for omap ops (`pr#8230 <http://github.com/ceph/ceph/pull/8230>`_, Jianpeng Ma)
+* osd: fix dirtying info without correctly setting drity_info field (`pr#8275 <http://github.com/ceph/ceph/pull/8275>`_, xie xingguo)
+* osd: fix dump_ops_in_flight races (`issue#8885 <http://tracker.ceph.com/issues/8885>`_, `pr#8044 <http://github.com/ceph/ceph/pull/8044>`_, David Zafman)
+* osd: fix epoch check in handle_pg_create (`pr#8382 <http://github.com/ceph/ceph/pull/8382>`_, Samuel Just)
+* osd: fix failure report handling during ms_handle_connect() (`pr#8348 <http://github.com/ceph/ceph/pull/8348>`_, xie xingguo)
+* osd: fix log info (`pr#8273 <http://github.com/ceph/ceph/pull/8273>`_, Wei Jin)
+* osd: fix reference count, rare race condition etc. (`pr#8254 <http://github.com/ceph/ceph/pull/8254>`_, xie xingguo)
+* osd: fix tick relevant issues (`pr#8369 <http://github.com/ceph/ceph/pull/8369>`_, xie xingguo)
+* osd: more fixes for incorrectly dirtying info; resend reply for duplicated scrub-reserve req (`pr#8291 <http://github.com/ceph/ceph/pull/8291>`_, xie xingguo)
+* osdc/Objecter: dout log after assign tid (`pr#8202 <http://github.com/ceph/ceph/pull/8202>`_, Xinze Chi)
+* osdc/Objecter: use full pgid hash in PGNLS ops (`pr#8378 <http://github.com/ceph/ceph/pull/8378>`_, Sage Weil)
+* osdmap: rm nonused variable (`pr#8423 <http://github.com/ceph/ceph/pull/8423>`_, Wei Jin)
+* pybind/Makefile.am: Prevent race creating CYTHON_BUILD_DIR (`issue#15276 <http://tracker.ceph.com/issues/15276>`_, `pr#8356 <http://github.com/ceph/ceph/pull/8356>`_, Dan Mick)
+* pybind/rados: python3 fix (`pr#8331 <http://github.com/ceph/ceph/pull/8331>`_, Mehdi Abaakouk)
+* pybind: add flock to libcephfs python bindings (`pr#7902 <http://github.com/ceph/ceph/pull/7902>`_, John Spray)
+* qa: update rest test cephfs calls (`issue#15309 <http://tracker.ceph.com/issues/15309>`_, `pr#8372 <http://github.com/ceph/ceph/pull/8372>`_, John Spray)
+* qa: update rest test cephfs calls (part 2) (`issue#15309 <http://tracker.ceph.com/issues/15309>`_, `pr#8393 <http://github.com/ceph/ceph/pull/8393>`_, John Spray)
+* radosgw-admin: 'period commit' supplies user-readable error messages (`pr#8264 <http://github.com/ceph/ceph/pull/8264>`_, Casey Bodley)
+* radosgw-admin: fix for 'realm pull' (`pr#8404 <http://github.com/ceph/ceph/pull/8404>`_, Casey Bodley)
+* rbd-mirror: asok commands to get status and flush on Mirror and Replayer level (`pr#8235 <http://github.com/ceph/ceph/pull/8235>`_, Mykola Golub)
+* rbd-mirror: enabling/disabling pool mirroring should update the mirroring directory (`issue#15217 <http://tracker.ceph.com/issues/15217>`_, `pr#8261 <http://github.com/ceph/ceph/pull/8261>`_, Ricardo Dias)
+* rbd-mirror: fix missing increment for iterators (`pr#8352 <http://github.com/ceph/ceph/pull/8352>`_, runsisi)
+* rbd-mirror: initial failover / failback support (`pr#8287 <http://github.com/ceph/ceph/pull/8287>`_, Jason Dillaman)
+* rbd-mirror: prevent enabling/disabling an image's mirroring when not in image mode (`issue#15267 <http://tracker.ceph.com/issues/15267>`_, `pr#8332 <http://github.com/ceph/ceph/pull/8332>`_, Ricardo Dias)
+* rbd-mirror: switch fsid over to mirror uuid (`issue#15238 <http://tracker.ceph.com/issues/15238>`_, `pr#8280 <http://github.com/ceph/ceph/pull/8280>`_, Ricardo Dias)
+* rbd: allow librados to prune the command-line for config overrides (`issue#15250 <http://tracker.ceph.com/issues/15250>`_, `pr#8282 <http://github.com/ceph/ceph/pull/8282>`_, Jason Dillaman)
+* rbdmap: add manpage (`issue#15212 <http://tracker.ceph.com/issues/15212>`_, `pr#8224 <http://github.com/ceph/ceph/pull/8224>`_, Nathan Cutler)
+* releases: what is merged where and when ? (`pr#8358 <http://github.com/ceph/ceph/pull/8358>`_, Loic Dachary)
+* rgw/rgw_admin:fix bug about list and stats command (`pr#8200 <http://github.com/ceph/ceph/pull/8200>`_, Qiankun Zheng)
+* rgw: Do not send a Content-Type on a '304 Not Modified' response (`issue#15119 <http://tracker.ceph.com/issues/15119>`_, `pr#8253 <http://github.com/ceph/ceph/pull/8253>`_, Wido den Hollander)
+* rgw: Multipart ListPartsResult ETag quotes (`issue#15334 <http://tracker.ceph.com/issues/15334>`_, `pr#8387 <http://github.com/ceph/ceph/pull/8387>`_, Robin H. Johnson)
+* rgw: S3: set EncodingType in ListBucketResult (`pr#7712 <http://github.com/ceph/ceph/pull/7712>`_, Victor Makarov)
+* rgw: accept data only at the first time in response to a request (`pr#8084 <http://github.com/ceph/ceph/pull/8084>`_, sunspot)
+* rgw: add a few more help options in admin interface (`pr#8410 <http://github.com/ceph/ceph/pull/8410>`_, Abhishek Lekshmanan)
+* rgw: add zone delete to rgw-admin help (`pr#8184 <http://github.com/ceph/ceph/pull/8184>`_, Abhishek Lekshmanan)
+* rgw: convert plain object to versioned (with null version) when removing (`issue#15243 <http://tracker.ceph.com/issues/15243>`_, `pr#8268 <http://github.com/ceph/ceph/pull/8268>`_, Yehuda Sadeh)
+* rgw: fix compiling error (`pr#8394 <http://github.com/ceph/ceph/pull/8394>`_, xie xingguo)
+* rgw: fix lockdep false positive (`pr#8284 <http://github.com/ceph/ceph/pull/8284>`_, Yehuda Sadeh)
+* rgw:Use count fn in RGWUserBuckets for quota check (`pr#8294 <http://github.com/ceph/ceph/pull/8294>`_, Abhishek Lekshmanan)
+* rgw_admin: remove unused parent_period arg (`pr#8411 <http://github.com/ceph/ceph/pull/8411>`_, Abhishek Lekshmanan)
+* rgw_file: set owner uid, gid, and Unix mode on new objects (`pr#8321 <http://github.com/ceph/ceph/pull/8321>`_, Matt Benjamin)
+* rpm: prefer UID/GID 167 when creating ceph user/group (`issue#15246 <http://tracker.ceph.com/issues/15246>`_, `pr#8277 <http://github.com/ceph/ceph/pull/8277>`_, Nathan Cutler)
+* script: subscription-manager support (`issue#14972 <http://tracker.ceph.com/issues/14972>`_, `pr#7907 <http://github.com/ceph/ceph/pull/7907>`_, Loic Dachary)
+* set 128MB tcmalloc cache size by bytes (`pr#8427 <http://github.com/ceph/ceph/pull/8427>`_, Star Guo)
+* systemd: set up environment in rbdmap unit file (`issue#14984 <http://tracker.ceph.com/issues/14984>`_, `pr#8222 <http://github.com/ceph/ceph/pull/8222>`_, Nathan Cutler)
+* test/system/*: use dynamically generated pool name (`issue#15240 <http://tracker.ceph.com/issues/15240>`_, `pr#8318 <http://github.com/ceph/ceph/pull/8318>`_, Kefu Chai)
+* test/system/rados_list_parallel: print oid if rados_write fails (`issue#15240 <http://tracker.ceph.com/issues/15240>`_, `pr#8309 <http://github.com/ceph/ceph/pull/8309>`_, Kefu Chai)
+* test/test-erasure-code.sh: disable pg_temp priming (`issue#15211 <http://tracker.ceph.com/issues/15211>`_, `pr#8260 <http://github.com/ceph/ceph/pull/8260>`_, Sage Weil)
+* test/test_pool_create.sh: fix port (`pr#8361 <http://github.com/ceph/ceph/pull/8361>`_, Sage Weil)
+* test: Fix test to run with btrfs which has snap_### dirs (`issue#15347 <http://tracker.ceph.com/issues/15347>`_, `pr#8420 <http://github.com/ceph/ceph/pull/8420>`_, David Zafman)
+* test: TestMirroringWatcher test cases were not closing images (`pr#8435 <http://github.com/ceph/ceph/pull/8435>`_, Jason Dillaman)
+* test: rbd-mirror: script improvements for manual testing (`pr#8325 <http://github.com/ceph/ceph/pull/8325>`_, Mykola Golub)
+* tests: Fixing broken test/cephtool-test-mon.sh test (`pr#8429 <http://github.com/ceph/ceph/pull/8429>`_, Erwan Velu)
+* tests: Improving 'make check' execution time (`pr#8131 <http://github.com/ceph/ceph/pull/8131>`_, Erwan Velu)
+* unittest_erasure_code_plugin: fix deadlock (Alpine) (`pr#8314 <http://github.com/ceph/ceph/pull/8314>`_, John Coyle)
+* vstart: fix up cmake paths when VSTART_DEST is given (`pr#8363 <http://github.com/ceph/ceph/pull/8363>`_, Casey Bodley)
+* vstart: make -k with optional mon_num. (`pr#8251 <http://github.com/ceph/ceph/pull/8251>`_, Jianpeng Ma)
+* xio: add prefix to xio msgr logs (`pr#8148 <http://github.com/ceph/ceph/pull/8148>`_, Roi Dayan)
+* xio: fix compilation against latest accelio (`pr#8022 <http://github.com/ceph/ceph/pull/8022>`_, Roi Dayan)
+* xio: xio_init needs to be called before any other xio function (`pr#8227 <http://github.com/ceph/ceph/pull/8227>`_, Roi Dayan)
+* ceph.spec.in: disable lttng and babeltrace explicitly (`issue#14844 <http://tracker.ceph.com/issues/14844>`_, `pr#7857 <http://github.com/ceph/ceph/pull/7857>`_, Kefu Chai)
+* ceph.spec.in: do not install Ceph RA on systemd platforms (`issue#14828 <http://tracker.ceph.com/issues/14828>`_, `pr#7894 <http://github.com/ceph/ceph/pull/7894>`_, Nathan Cutler)
+* mdsa: A few more snapshot fixes, mostly around snapshotted inode/dentry tracking (`pr#7798 <http://github.com/ceph/ceph/pull/7798>`_, Yan, Zheng)
+* AUTHORS: update email (`pr#7854 <http://github.com/ceph/ceph/pull/7854>`_, Yehuda Sadeh)
+* ceph-disk: Add --setuser and --setgroup options for ceph-disk (`pr#7351 <http://github.com/ceph/ceph/pull/7351>`_, Mike Shuey)
+* build: Adding build requires (`pr#7742 <http://github.com/ceph/ceph/pull/7742>`_, Erwan Velu)
+* msg/async: AsyncMessenger: fix several bugs (`pr#7831 <http://github.com/ceph/ceph/pull/7831>`_, Haomai Wang)
+* msg/async: AsyncMessenger: fix valgrind leak (`pr#7725 <http://github.com/ceph/ceph/pull/7725>`_, Haomai Wang)
+* doc: Clarify usage on starting single osd/mds/mon. (`pr#7641 <http://github.com/ceph/ceph/pull/7641>`_, Patrick Donnelly)
+* common: Deprecate or free up a bunch of feature bits (`pr#8214 <http://github.com/ceph/ceph/pull/8214>`_, Samuel Just)
+* msg/async: Event: fix clock skew problem (`pr#7949 <http://github.com/ceph/ceph/pull/7949>`_, Wei Jin)
+* osd: FileStore: Added O_DSYNC write scheme (`pr#7752 <http://github.com/ceph/ceph/pull/7752>`_, Somnath Roy)
+* osd: FileStore: fix initialization order for m_disable_wbthrottle (`pr#8067 <http://github.com/ceph/ceph/pull/8067>`_, Samuel Just)
+* build: Fixing BTRFS issue at 'make check' (`pr#7805 <http://github.com/ceph/ceph/pull/7805>`_, Erwan Velu)
+* build: FreeBSD related fixes (`pr#7170 <http://github.com/ceph/ceph/pull/7170>`_, Mykola Golub)
+* ceph-disk: Improving 'make check' for ceph-disk (`pr#7762 <http://github.com/ceph/ceph/pull/7762>`_, Erwan Velu)
+* rgw: increase verbosity level on RGWObjManifest line (`pr#7285 <http://github.com/ceph/ceph/pull/7285>`_, magicrobotmonkey)
+* build: workaround an automake bug for "make check" (`issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7626 <http://github.com/ceph/ceph/pull/7626>`_, Kefu Chai)
+* ceph-fuse,libcephfs: Fix client handling of "lost" open directories on shutdown (`issue#14996 <http://tracker.ceph.com/issues/14996>`_, `pr#7994 <http://github.com/ceph/ceph/pull/7994>`_, Yan, Zheng)
+* mds: Multi-filesystem support (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#6953 <http://github.com/ceph/ceph/pull/6953>`_, John Spray, Sage Weil)
+* os/bluestore/NVMEDevice: refactor probe/attach codes and support zero command (`pr#7647 <http://github.com/ceph/ceph/pull/7647>`_, Haomai Wang)
+* librados: detect laggy ops with objecter_timeout, not osd_timeout (`pr#7629 <http://github.com/ceph/ceph/pull/7629>`_, Greg Farnum)
+* ceph.spec.in: fix openldap and openssl build dependencies for SUSE (`issue#15138 <http://tracker.ceph.com/issues/15138>`_, `pr#8120 <http://github.com/ceph/ceph/pull/8120>`_, Nathan Cutler)
+* osd: repop and lost-unfound overhaul (`pr#7765 <http://github.com/ceph/ceph/pull/7765>`_, Samuel Just)
+* librbd: Revert "librbd: use task finisher per CephContext" (`issue#14780 <http://tracker.ceph.com/issues/14780>`_, `pr#7667 <http://github.com/ceph/ceph/pull/7667>`_, Josh Durgin)
+* rgw: Fix subuser harder with tenants (`pr#7618 <http://github.com/ceph/ceph/pull/7618>`_, Pete Zaitcev)
+* rgw: ldap fixes (`pr#8168 <http://github.com/ceph/ceph/pull/8168>`_, Matt Benjamin)
+* rgw: check the return value when call fe->run() (`issue#14585 <http://tracker.ceph.com/issues/14585>`_, `pr#7457 <http://github.com/ceph/ceph/pull/7457>`_, wei qiaomiao)
+* rgw: Revert "rgw ldap" (`pr#8075 <http://github.com/ceph/ceph/pull/8075>`_, Yehuda Sadeh)
+* librados: Striper: Fix incorrect push_front -> append_zero change (`pr#7578 <http://github.com/ceph/ceph/pull/7578>`_, Haomai Wang)
+* rgw: build-related fixes (`pr#8076 <http://github.com/ceph/ceph/pull/8076>`_, Yehuda Sadeh, Matt Benjamin)
+* mirrors: Updated scripts and documentation for mirrors (`pr#7847 <http://github.com/ceph/ceph/pull/7847>`_, Wido den Hollander)
+* misc: use make_shared while creating shared_ptr (`pr#7769 <http://github.com/ceph/ceph/pull/7769>`_, Somnath Roy)
+* cmake (`pr#7849 <http://github.com/ceph/ceph/pull/7849>`_, Ali Maredia)
+* mds: filelock deadlock (`pr#7713 <http://github.com/ceph/ceph/pull/7713>`_, Yan, Zheng)
+* mds: fix fsmap decode (`pr#8063 <http://github.com/ceph/ceph/pull/8063>`_, Greg Farnum)
+* rgw: fix mdlog (`pr#8183 <http://github.com/ceph/ceph/pull/8183>`_, Orit Wasserman)
+* rgw: highres time stamps (`pr#8108 <http://github.com/ceph/ceph/pull/8108>`_, Yehuda Sadeh, Adam C. Emerson, Matt Benjamin)
+* rgw: swift versioning disabled (`pr#8066 <http://github.com/ceph/ceph/pull/8066>`_, Yehuda Sadeh, Radoslaw Zarzynski)
+* rgw: sync fixes 3 (`pr#8170 <http://github.com/ceph/ceph/pull/8170>`_, Yehuda Sadeh)
+* msg/xio: fixes (`pr#7603 <http://github.com/ceph/ceph/pull/7603>`_, Roi Dayan)
+* ceph-fuse,libcephfs: fix free fds being exhausted eventually because freed fds are never put back (`issue#14798 <http://tracker.ceph.com/issues/14798>`_, `pr#7685 <http://github.com/ceph/ceph/pull/7685>`_, Zhi Zhang)
+* rgw: RGWLib::env is not used so remove it (`pr#7874 <http://github.com/ceph/ceph/pull/7874>`_, Brad Hubbard)
+* build: a few armhf (32-bit build) fixes (`pr#7999 <http://github.com/ceph/ceph/pull/7999>`_, Eric Lee, Sage Weil)
+* osd: add scrub persist/query API (`issue#13505 <http://tracker.ceph.com/issues/13505>`_, `pr#6898 <http://github.com/ceph/ceph/pull/6898>`_, Kefu Chai, Samuel Just)
+* rgw: adds the radosgw-admin sync status command that gives a human readable status of the sync process at a specific zone (`pr#8030 <http://github.com/ceph/ceph/pull/8030>`_, Yehuda Sadeh)
+* scripts: adjust mstart and mstop script to run with cmake build (`pr#6920 <http://github.com/ceph/ceph/pull/6920>`_, Orit Wasserman)
+* buffer: add symmetry operator==() and operator!=() (`pr#7974 <http://github.com/ceph/ceph/pull/7974>`_, Kefu Chai)
+* buffer: hide iterator_impl symbols (`issue#14788 <http://tracker.ceph.com/issues/14788>`_, `pr#7688 <http://github.com/ceph/ceph/pull/7688>`_, Kefu Chai)
+* buffer: increment history alloc as well in raw_combined (`issue#14955 <http://tracker.ceph.com/issues/14955>`_, `pr#7910 <http://github.com/ceph/ceph/pull/7910>`_, Samuel Just)
+* buffer: raw_combined allocations buffer and ref count together (`pr#7612 <http://github.com/ceph/ceph/pull/7612>`_, Sage Weil)
+* ceph-detect-init: add debian/jessie test (`pr#8074 <http://github.com/ceph/ceph/pull/8074>`_, Kefu Chai)
+* ceph-detect-init: add missing test case (`pr#8105 <http://github.com/ceph/ceph/pull/8105>`_, Nathan Cutler)
+* ceph-detect-init: fix py3 test (`pr#7243 <http://github.com/ceph/ceph/pull/7243>`_, Kefu Chai)
+* ceph-detect-init: return correct value on recent SUSE distros (`issue#14770 <http://tracker.ceph.com/issues/14770>`_, `pr#7909 <http://github.com/ceph/ceph/pull/7909>`_, Nathan Cutler)
+* ceph-disk: deactivate / destroy PATH arg are optional (`pr#7756 <http://github.com/ceph/ceph/pull/7756>`_, Loic Dachary)
+* ceph-disk: fix prepare --help (`pr#7758 <http://github.com/ceph/ceph/pull/7758>`_, Loic Dachary)
+* ceph-disk: flake8 fixes (`pr#7646 <http://github.com/ceph/ceph/pull/7646>`_, Loic Dachary)
+* ceph-disk: key management support (`issue#14669 <http://tracker.ceph.com/issues/14669>`_, `pr#7552 <http://github.com/ceph/ceph/pull/7552>`_, Loic Dachary)
+* ceph-disk: make some arguments as required if necessary (`pr#7687 <http://github.com/ceph/ceph/pull/7687>`_, Dongsheng Yang)
+* ceph-disk: s/dmcrpyt/dmcrypt/ (`issue#14838 <http://tracker.ceph.com/issues/14838>`_, `pr#7744 <http://github.com/ceph/ceph/pull/7744>`_, Loic Dachary, Frode Sandholtbraaten)
+* ceph-fuse: Fix potential filehandle ref leak at umount (`issue#14800 <http://tracker.ceph.com/issues/14800>`_, `pr#7686 <http://github.com/ceph/ceph/pull/7686>`_, Zhi Zhang)
+* ceph.in: Minor python3 specific changes (`pr#7947 <http://github.com/ceph/ceph/pull/7947>`_, Sarthak Munshi)
+* ceph_daemon.py: Resolved ImportError to work with python3 (`pr#7937 <http://github.com/ceph/ceph/pull/7937>`_, Sarthak Munshi)
+* ceph_detect_init/__init__.py: remove shebang (`pr#7731 <http://github.com/ceph/ceph/pull/7731>`_, Nathan Cutler)
+* ceph_test_msgr: reduce test size to fix memory size (`pr#8127 <http://github.com/ceph/ceph/pull/8127>`_, Haomai Wang)
+* ceph_test_rados_misc: shorten mount timeout (`pr#8209 <http://github.com/ceph/ceph/pull/8209>`_, Sage Weil)
+* cleanup (`pr#8058 <http://github.com/ceph/ceph/pull/8058>`_, Yehuda Sadeh, Orit Wasserman)
+* client: flush kernel pagecache before creating snapshot (`issue#10436 <http://tracker.ceph.com/issues/10436>`_, `pr#7495 <http://github.com/ceph/ceph/pull/7495>`_, Yan, Zheng)
+* client: removed unused Mutex from MetaRequest (`pr#7655 <http://github.com/ceph/ceph/pull/7655>`_, Greg Farnum)
+* cls/rgw: fix FTBFS (`pr#8142 <http://github.com/ceph/ceph/pull/8142>`_, Kefu Chai)
+* cls/rgw: fix use of timespan (`issue#15181 <http://tracker.ceph.com/issues/15181>`_, `pr#8212 <http://github.com/ceph/ceph/pull/8212>`_, Yehuda Sadeh)
+* cls_hello: Fix grammatical error in description comment (`pr#7951 <http://github.com/ceph/ceph/pull/7951>`_, Brad Hubbard)
+* cls_rbd: fix the test for ceph-dencoder (`pr#7793 <http://github.com/ceph/ceph/pull/7793>`_, Kefu Chai)
+* cls_rbd: mirroring directory (`issue#14419 <http://tracker.ceph.com/issues/14419>`_, `pr#7620 <http://github.com/ceph/ceph/pull/7620>`_, Josh Durgin)
+* cls_rbd: protect against excessively large object maps (`issue#15121 <http://tracker.ceph.com/issues/15121>`_, `pr#8099 <http://github.com/ceph/ceph/pull/8099>`_, Jason Dillaman)
+* cmake: Remove duplicate find_package libcurl line. (`pr#7972 <http://github.com/ceph/ceph/pull/7972>`_, Brad Hubbard)
+* cmake: add ErasureCode.cc to jerasure plugins (`pr#7808 <http://github.com/ceph/ceph/pull/7808>`_, Casey Bodley)
+* cmake: add common/fs_types.cc to libcommon (`pr#7898 <http://github.com/ceph/ceph/pull/7898>`_, Orit Wasserman)
+* cmake: add missing librbd image_watcher sources (`issue#14823 <http://tracker.ceph.com/issues/14823>`_, `pr#7717 <http://github.com/ceph/ceph/pull/7717>`_, Casey Bodley)
+* cmake: avoid false-positive LDAP header detect (`pr#8100 <http://github.com/ceph/ceph/pull/8100>`_, Matt Benjamin)
+* cmake: fix paths to various EC source files (`pr#7748 <http://github.com/ceph/ceph/pull/7748>`_, Ali Maredia, Matt Benjamin)
+* cmake: fix the build of tests (`pr#7523 <http://github.com/ceph/ceph/pull/7523>`_, Kefu Chai)
+* common/TrackedOp: fix inaccurate counting for slow requests (`issue#14804 <http://tracker.ceph.com/issues/14804>`_, `pr#7690 <http://github.com/ceph/ceph/pull/7690>`_, xie xingguo)
+* common/bit_vector: use hard-coded value for block size (`issue#14747 <http://tracker.ceph.com/issues/14747>`_, `pr#7610 <http://github.com/ceph/ceph/pull/7610>`_, Jason Dillaman)
+* common/obj_bencher.cc: bump the precision of bandwidth field (`pr#8021 <http://github.com/ceph/ceph/pull/8021>`_, Piotr Dałek)
+* common/obj_bencher.cc: faster object name generation (`pr#7863 <http://github.com/ceph/ceph/pull/7863>`_, Piotr Dałek)
+* common/obj_bencher.cc: make verify error fatal (`issue#14971 <http://tracker.ceph.com/issues/14971>`_, `pr#7897 <http://github.com/ceph/ceph/pull/7897>`_, Piotr Dałek)
+* common/page.cc: _page_mask has too many bits (`pr#7588 <http://github.com/ceph/ceph/pull/7588>`_, Dan Mick)
+* common/strtol.cc: fix the coverity warnings (`pr#7967 <http://github.com/ceph/ceph/pull/7967>`_, Kefu Chai)
+* common: Do not use non-portable constants in mutex_debug (`pr#7766 <http://github.com/ceph/ceph/pull/7766>`_, Adam C. Emerson)
+* common: SubProcess: Avoid buffer corruption when calling err() (`issue#15011 <http://tracker.ceph.com/issues/15011>`_, `pr#8054 <http://github.com/ceph/ceph/pull/8054>`_, Erwan Velu)
+* common: default cluster name to config file prefix (`pr#7364 <http://github.com/ceph/ceph/pull/7364>`_, Javen Wu)
+* common: set thread name from correct thread (`pr#7845 <http://github.com/ceph/ceph/pull/7845>`_, Igor Podoski)
+* common: various fixes from SCA runs (`pr#7680 <http://github.com/ceph/ceph/pull/7680>`_, Danny Al-Gaaf)
+* config: fix osd_crush_initial_weight (`pr#7975 <http://github.com/ceph/ceph/pull/7975>`_, You Ji)
+* config: increase default async op threads (`pr#7802 <http://github.com/ceph/ceph/pull/7802>`_, Piotr Dałek)
+* configure.ac: boost_iostreams is required, not optional (`pr#7816 <http://github.com/ceph/ceph/pull/7816>`_, Hector Martin)
+* configure.ac: update help strings for cython (`pr#7856 <http://github.com/ceph/ceph/pull/7856>`_, Josh Durgin)
+* crush/CrushTester: workaround a bug in boost::icl (`pr#7560 <http://github.com/ceph/ceph/pull/7560>`_, Kefu Chai)
+* crush: fix cli tests for new crush tunables (`pr#8107 <http://github.com/ceph/ceph/pull/8107>`_, Sage Weil)
+* crush: update tunable docs.  change default profile to jewel (`pr#7964 <http://github.com/ceph/ceph/pull/7964>`_, Sage Weil)
+* debian/changelog: Remove stray 'v' in version (`pr#7936 <http://github.com/ceph/ceph/pull/7936>`_, Dan Mick)
+* debian/changelog: Remove stray 'v' in version (`pr#7938 <http://github.com/ceph/ceph/pull/7938>`_, Dan Mick)
+* debian: include cpio in build-requiers (`pr#7533 <http://github.com/ceph/ceph/pull/7533>`_, Rémi BUISSON)
+* debian: package librgw_file* tests (`pr#7930 <http://github.com/ceph/ceph/pull/7930>`_, Ken Dreyer)
+* doc/architecture.rst: remove redundant word "across" (`pr#8179 <http://github.com/ceph/ceph/pull/8179>`_, Zhao Junwang)
+* doc/dev: add section on interrupting a running suite (`pr#8116 <http://github.com/ceph/ceph/pull/8116>`_, Nathan Cutler)
+* doc/dev: continue writing Testing in the cloud chapter (`pr#7960 <http://github.com/ceph/ceph/pull/7960>`_, Nathan Cutler)
+* doc/dev: integrate testing into the narrative (`pr#7946 <http://github.com/ceph/ceph/pull/7946>`_, Nathan Cutler)
+* doc/dev: various refinements (`pr#7954 <http://github.com/ceph/ceph/pull/7954>`_, Nathan Cutler)
+* doc/rados/api/librados-intro.rst: fix typo (`pr#7879 <http://github.com/ceph/ceph/pull/7879>`_, xie xingguo)
+* doc: add ceph-detect-init(8) source to dist tarball (`pr#7933 <http://github.com/ceph/ceph/pull/7933>`_, Ken Dreyer)
+* doc: add cinder backend section to rbd-openstack.rst (`pr#7923 <http://github.com/ceph/ceph/pull/7923>`_, RustShen)
+* doc: detailed description of bugfixing workflow (`pr#7941 <http://github.com/ceph/ceph/pull/7941>`_, Nathan Cutler)
+* doc: fix 0.94.4 and 0.94.5 ordering (`pr#7763 <http://github.com/ceph/ceph/pull/7763>`_, Loic Dachary)
+* doc: fix typo, indention etc. (`pr#7829 <http://github.com/ceph/ceph/pull/7829>`_, xie xingguo)
+* doc: initial draft of RBD mirroring admin documentation (`issue#15041 <http://tracker.ceph.com/issues/15041>`_, `pr#8169 <http://github.com/ceph/ceph/pull/8169>`_, Jason Dillaman)
+* doc: osd-config Add Configuration Options for op queue. (`pr#7837 <http://github.com/ceph/ceph/pull/7837>`_, Robert LeBlanc)
+* doc: rgw explain keystone's verify ssl switch (`pr#7862 <http://github.com/ceph/ceph/pull/7862>`_, Abhishek Lekshmanan)
+* doc: small fixes (`pr#7813 <http://github.com/ceph/ceph/pull/7813>`_, xiexingguo)
+* doc: standardize @param (not @parma, @parmam, @params) (`pr#7714 <http://github.com/ceph/ceph/pull/7714>`_, Nathan Cutler)
+* fix FTBFS introduced by d0af316 (`pr#7792 <http://github.com/ceph/ceph/pull/7792>`_, Kefu Chai)
+* ghobject_t: use # instead of ! as a separator (`pr#8055 <http://github.com/ceph/ceph/pull/8055>`_, Sage Weil)
+* include/encoding: do not try to be clever with list encoding (`pr#7913 <http://github.com/ceph/ceph/pull/7913>`_, Sage Weil)
+* init-ceph.in: allow case-insensitive true in `osd crush update on start' (`pr#7943 <http://github.com/ceph/ceph/pull/7943>`_, Eric Cook)
+* init-ceph.in: skip ceph-disk if it is not present (`issue#10587 <http://tracker.ceph.com/issues/10587>`_, `pr#7286 <http://github.com/ceph/ceph/pull/7286>`_, Ken Dreyer)
+* journal: async methods to (un)register and update client (`pr#7832 <http://github.com/ceph/ceph/pull/7832>`_, Mykola Golub)
+* journal: improve commit position tracking (`pr#7776 <http://github.com/ceph/ceph/pull/7776>`_, Jason Dillaman)
+* journal: prevent race injecting new records into overflowed object (`issue#15202 <http://tracker.ceph.com/issues/15202>`_, `pr#8220 <http://github.com/ceph/ceph/pull/8220>`_, Jason Dillaman)
+* librados: cancel aio notification linger op upon completion (`pr#8102 <http://github.com/ceph/ceph/pull/8102>`_, Jason Dillaman)
+* librados: check connection state in rados_monitor_log (`issue#14499 <http://tracker.ceph.com/issues/14499>`_, `pr#7350 <http://github.com/ceph/ceph/pull/7350>`_, David Disseldorp)
+* librados: do not clear handle for aio_watch() (`pr#7771 <http://github.com/ceph/ceph/pull/7771>`_, xie xingguo)
+* librados: fix test failure with new aio watch/unwatch API  (`pr#7824 <http://github.com/ceph/ceph/pull/7824>`_, Jason Dillaman)
+* librados: implement async watch/unwatch (`pr#7649 <http://github.com/ceph/ceph/pull/7649>`_, Haomai Wang)
+* librados: mix lock cycle (un)registering asok commands (`pr#7581 <http://github.com/ceph/ceph/pull/7581>`_, John Spray)
+* librados: race condition on aio_notify completion handling (`pr#7864 <http://github.com/ceph/ceph/pull/7864>`_, Jason Dillaman)
+* librados: stat2 with higher time precision (`pr#7915 <http://github.com/ceph/ceph/pull/7915>`_, Yehuda Sadeh, Matt Benjamin)
+* librbd: allocate new journal tag after acquiring exclusive lock (`pr#7884 <http://github.com/ceph/ceph/pull/7884>`_, Jason Dillaman)
+* librbd: block read requests until journal replayed (`pr#7627 <http://github.com/ceph/ceph/pull/7627>`_, Jason Dillaman)
+* librbd: correct issues discovered via valgrind memcheck (`pr#8132 <http://github.com/ceph/ceph/pull/8132>`_, Jason Dillaman)
+* librbd: differentiate journal replay flush vs shut down (`pr#7698 <http://github.com/ceph/ceph/pull/7698>`_, Jason Dillaman)
+* librbd: enable/disable image mirroring automatically for pool mode (`issue#15143 <http://tracker.ceph.com/issues/15143>`_, `pr#8204 <http://github.com/ceph/ceph/pull/8204>`_, Ricardo Dias)
+* librbd: fix state machine race conditions during shut down (`pr#7761 <http://github.com/ceph/ceph/pull/7761>`_, Jason Dillaman)
+* librbd: handle unregistering the image watcher when disconnected (`pr#8094 <http://github.com/ceph/ceph/pull/8094>`_, Jason Dillaman)
+* librbd: integrate journal replay with fsx testing (`pr#7583 <http://github.com/ceph/ceph/pull/7583>`_, Jason Dillaman)
+* librbd: journal replay needs to support re-executing maintenance ops (`issue#14822 <http://tracker.ceph.com/issues/14822>`_, `pr#7785 <http://github.com/ceph/ceph/pull/7785>`_, Jason Dillaman)
+* librbd: reduce mem copies to user-buffer during read (`pr#7548 <http://github.com/ceph/ceph/pull/7548>`_, Jianpeng Ma)
+* librbd: refresh image if required before replaying journal ops (`issue#14908 <http://tracker.ceph.com/issues/14908>`_, `pr#7978 <http://github.com/ceph/ceph/pull/7978>`_, Jason Dillaman)
+* librbd: remove last synchronous librados calls from open/close state machine (`pr#7839 <http://github.com/ceph/ceph/pull/7839>`_, Jason Dillaman)
+* librbd: replaying a journal op post-refresh requires locking (`pr#8028 <http://github.com/ceph/ceph/pull/8028>`_, Jason Dillaman)
+* librbd: retrieve image name when opening by id (`pr#7736 <http://github.com/ceph/ceph/pull/7736>`_, Mykola Golub)
+* librbd: several race conditions discovered under single CPU environment (`pr#7653 <http://github.com/ceph/ceph/pull/7653>`_, Jason Dillaman)
+* librbd: truncate does not need to mark the object as existing in the object map (`issue#14789 <http://tracker.ceph.com/issues/14789>`_, `pr#7772 <http://github.com/ceph/ceph/pull/7772>`_, xinxin shu)
+* librbd: update of mirror pool mode and mirror peer handling (`pr#7718 <http://github.com/ceph/ceph/pull/7718>`_, Jason Dillaman)
+* librbd: use async librados notifications (`pr#7668 <http://github.com/ceph/ceph/pull/7668>`_, Jason Dillaman)
+* log: do not repeat errors to stderr (`issue#14616 <http://tracker.ceph.com/issues/14616>`_, `pr#7983 <http://github.com/ceph/ceph/pull/7983>`_, Sage Weil)
+* log: fix stack overflow when flushing large log lines (`issue#14707 <http://tracker.ceph.com/issues/14707>`_, `pr#7599 <http://github.com/ceph/ceph/pull/7599>`_, Igor Fedotov)
+* log: segv in a portable way (`issue#14856 <http://tracker.ceph.com/issues/14856>`_, `pr#7790 <http://github.com/ceph/ceph/pull/7790>`_, Kefu Chai)
+* log: use delete[] (`pr#7904 <http://github.com/ceph/ceph/pull/7904>`_, Sage Weil)
+* mailmap for 10.0.4 (`pr#7932 <http://github.com/ceph/ceph/pull/7932>`_, Abhishek Lekshmanan)
+* mailmap updates (`pr#7528 <http://github.com/ceph/ceph/pull/7528>`_, Yann Dupont)
+* man/8/ceph-disk: fix formatting issue (`pr#8012 <http://github.com/ceph/ceph/pull/8012>`_, Sage Weil)
+* man/8/ceph-disk: fix formatting issue (`pr#8003 <http://github.com/ceph/ceph/pull/8003>`_, Sage Weil)
+* mds, client: add namespace to file_layout_t (previously ceph_file_layout) (`pr#7098 <http://github.com/ceph/ceph/pull/7098>`_, Yan, Zheng, Sage Weil)
+* mds: don't double-shutdown the timer when suiciding (`issue#14697 <http://tracker.ceph.com/issues/14697>`_, `pr#7616 <http://github.com/ceph/ceph/pull/7616>`_, Greg Farnum)
+* mds: fix FSMap upgrade with daemons in the map (`pr#8073 <http://github.com/ceph/ceph/pull/8073>`_, John Spray, Greg Farnum)
+* mds: fix inode_t::compare() (`issue#15038 <http://tracker.ceph.com/issues/15038>`_, `pr#8014 <http://github.com/ceph/ceph/pull/8014>`_, Yan, Zheng)
+* mds: fix stray purging in 'stripe_count > 1' case (`issue#15050 <http://tracker.ceph.com/issues/15050>`_, `pr#8040 <http://github.com/ceph/ceph/pull/8040>`_, Yan, Zheng)
+* mds: function parameter 'df' should be passed by reference (`pr#7490 <http://github.com/ceph/ceph/pull/7490>`_, Na Xie)
+* mirrors: Change contact e-mail address for se.ceph.com (`pr#8007 <http://github.com/ceph/ceph/pull/8007>`_, Wido den Hollander)
+* mon/PGMonitor: reliably mark PGs state (`pr#8089 <http://github.com/ceph/ceph/pull/8089>`_, Sage Weil)
+* mon/monitor: some clean up (`pr#7520 <http://github.com/ceph/ceph/pull/7520>`_, huanwen ren)
+* mon/pgmonitor: use appropriate forced conversions in get_rule_avail (`pr#7705 <http://github.com/ceph/ceph/pull/7705>`_, huanwen ren)
+* mon: cleanup set-quota error msg (`pr#7371 <http://github.com/ceph/ceph/pull/7371>`_, Abhishek Lekshmanan)
+* mon: consider pool size when creating pool (`issue#14509 <http://tracker.ceph.com/issues/14509>`_, `pr#7359 <http://github.com/ceph/ceph/pull/7359>`_, songbaisen)
+* mon: enable 'mon osd prime pg temp' by default (`pr#7838 <http://github.com/ceph/ceph/pull/7838>`_, Robert LeBlanc)
+* mon: fix calculation of %USED (`pr#7881 <http://github.com/ceph/ceph/pull/7881>`_, Adam Kupczyk)
+* mon: fix keyring permissions (`issue#14950 <http://tracker.ceph.com/issues/14950>`_, `pr#7880 <http://github.com/ceph/ceph/pull/7880>`_, Owen Synge)
+* mon: initialize last_* timestamps on new pgs to creation time (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#7980 <http://github.com/ceph/ceph/pull/7980>`_, Sage Weil)
+* mon: make clock skew checks sane (`issue#14175 <http://tracker.ceph.com/issues/14175>`_, `pr#7141 <http://github.com/ceph/ceph/pull/7141>`_, Joao Eduardo Luis)
+* mon: osd [test-]reweight-by-{pg,utilization} command updates (`pr#7890 <http://github.com/ceph/ceph/pull/7890>`_, Dan van der Ster, Sage Weil)
+* mon: remove 'mds setmap' (`issue#15136 <http://tracker.ceph.com/issues/15136>`_, `pr#8121 <http://github.com/ceph/ceph/pull/8121>`_, Sage Weil)
+* mon: standardize Ceph removal commands (`pr#7939 <http://github.com/ceph/ceph/pull/7939>`_, Dongsheng Yang)
+* mon: unconfuse object count skew message (`pr#7882 <http://github.com/ceph/ceph/pull/7882>`_, Piotr Dałek)
+* mon: unregister command on shutdown (`pr#7504 <http://github.com/ceph/ceph/pull/7504>`_, huanwen ren)
+* mount.fuse.ceph: better parsing of arguments passed to mount.fuse.ceph by mount command (`issue#14735 <http://tracker.ceph.com/issues/14735>`_, `pr#7607 <http://github.com/ceph/ceph/pull/7607>`_, Florent Bautista)
+* msg/async: _try_send trim already sent for outcoming_bl more efficient (`pr#7970 <http://github.com/ceph/ceph/pull/7970>`_, Yan Jun)
+* msg/async: don't calculate msg header crc when not needed (`pr#7815 <http://github.com/ceph/ceph/pull/7815>`_, Piotr Dałek)
+* msg/async: smarter MSG_MORE (`pr#7625 <http://github.com/ceph/ceph/pull/7625>`_, Piotr Dałek)
+* msg: add thread safety for "random" Messenger + fix wrong usage of random functions (`pr#7650 <http://github.com/ceph/ceph/pull/7650>`_, Avner BenHanoch)
+* msg: async: fix perf counter description and simplify _send_keepalive_or_ack (`pr#8046 <http://github.com/ceph/ceph/pull/8046>`_, xie xingguo)
+* msg: async: small cleanups (`pr#7871 <http://github.com/ceph/ceph/pull/7871>`_, xie xingguo)
+* msg: async: start over after failing to bind a port in specified range (`issue#14928 <http://tracker.ceph.com/issues/14928>`_, `issue#13002 <http://tracker.ceph.com/issues/13002>`_, `pr#7852 <http://github.com/ceph/ceph/pull/7852>`_, xie xingguo)
+* msg: remove duplicated code - local_delivery will now call 'enqueue' (`pr#7948 <http://github.com/ceph/ceph/pull/7948>`_, Avner BenHanoch)
+* msg: significantly reduce minimal memory usage of connections (`pr#7567 <http://github.com/ceph/ceph/pull/7567>`_, Piotr Dałek)
+* mstart: start rgw on different ports as well (`pr#8167 <http://github.com/ceph/ceph/pull/8167>`_, Abhishek Lekshmanan)
+* nfs for rgw (Matt Benjamin, Orit Wasserman) (`pr#7634 <http://github.com/ceph/ceph/pull/7634>`_, Yehuda Sadeh, Matt Benjamin)
+* os/ObjectStore: implement more efficient get_encoded_bytes()  (`pr#7775 <http://github.com/ceph/ceph/pull/7775>`_, Piotr Dałek)
+* os/bluestore/BlueFS: Before reap ioct, it should wait io complete (`pr#8178 <http://github.com/ceph/ceph/pull/8178>`_, Jianpeng Ma)
+* os/bluestore/BlueStore: Don't leak trim overlay data before write. (`pr#7895 <http://github.com/ceph/ceph/pull/7895>`_, Jianpeng Ma)
+* os/bluestore/KernelDevice: force block size (`pr#8006 <http://github.com/ceph/ceph/pull/8006>`_, Sage Weil)
+* os/bluestore/NVMEDevice: make IO thread using dpdk launch (`pr#8160 <http://github.com/ceph/ceph/pull/8160>`_, Haomai Wang)
+* os/bluestore: clone overlay data (`pr#7860 <http://github.com/ceph/ceph/pull/7860>`_, Jianpeng Ma)
+* os/bluestore: fix a typo in SPDK path parsing (`pr#7601 <http://github.com/ceph/ceph/pull/7601>`_, Jianjian Huo)
+* os/bluestore: make bluestore_sync_transaction = true can work. (`pr#7674 <http://github.com/ceph/ceph/pull/7674>`_, Jianpeng Ma)
+* os/bluestore: small fixes in bluestore StupidAllocator (`pr#8101 <http://github.com/ceph/ceph/pull/8101>`_, Jianjian Huo)
+* os/filestore/FileJournal: set block size via config option (`pr#7628 <http://github.com/ceph/ceph/pull/7628>`_, Sage Weil)
+* os/filestore: fix punch hole usage in _zero (`pr#8050 <http://github.com/ceph/ceph/pull/8050>`_, Sage Weil)
+* os/filestore: fix result handling logic of destroy_collection (`pr#7721 <http://github.com/ceph/ceph/pull/7721>`_, xie xingguo)
+* os/filestore: require offset == length == 0 for full object read; add test (`pr#7957 <http://github.com/ceph/ceph/pull/7957>`_, Jianpeng Ma)
+* osd/OSDMap: fix typo in summarize_mapping_stats (`pr#8088 <http://github.com/ceph/ceph/pull/8088>`_, Sage Weil)
+* osd/PGLog: fix warning (`pr#8057 <http://github.com/ceph/ceph/pull/8057>`_, Sage Weil)
+* osd/ReplicatedPG: be more careful about calling publish_stats_to_osd() (`issue#14962 <http://tracker.ceph.com/issues/14962>`_, `pr#8039 <http://github.com/ceph/ceph/pull/8039>`_, Greg Farnum)
+* osd/ReplicatedPG: clear watches on change after applying repops (`issue#15151 <http://tracker.ceph.com/issues/15151>`_, `pr#8163 <http://github.com/ceph/ceph/pull/8163>`_, Sage Weil)
+* osd/ScrubStore: remove unused function (`pr#8045 <http://github.com/ceph/ceph/pull/8045>`_, Kefu Chai)
+* osd: BlueStore/NVMEDevice: fix compiling and fd leak (`pr#7496 <http://github.com/ceph/ceph/pull/7496>`_, xie xingguo)
+* osd: FileStore: use pwritev instead of lseek+writev (`pr#7349 <http://github.com/ceph/ceph/pull/7349>`_, Haomai Wang, Tao Chang)
+* osd: OSDMap: reset osd_primary_affinity shared_ptr when deepish_copy_from (`issue#14686 <http://tracker.ceph.com/issues/14686>`_, `pr#7553 <http://github.com/ceph/ceph/pull/7553>`_, Xinze Chi)
+* osd: Replace snprintf with faster implementation in eversion_t::get_key_name (`pr#7121 <http://github.com/ceph/ceph/pull/7121>`_, Evgeniy Firsov)
+* osd: WeightedPriorityQueue: move to intrusive containers (`pr#7654 <http://github.com/ceph/ceph/pull/7654>`_, Robert LeBlanc)
+* osd: a fix for HeartbeatDispatcher and cleanups (`pr#7550 <http://github.com/ceph/ceph/pull/7550>`_, Kefu Chai)
+* osd: add missing newline to usage message (`pr#7613 <http://github.com/ceph/ceph/pull/7613>`_, Willem Jan Withagen)
+* osd: avoid FORCE updating digest been overwritten by MAYBE when comparing scrub map (`pr#7051 <http://github.com/ceph/ceph/pull/7051>`_, Zhiqiang Wang)
+* osd: bluefs: fix alignment for odd page sizes (`pr#7900 <http://github.com/ceph/ceph/pull/7900>`_, Dan Mick)
+* osd: bluestore updates, scrub fixes (`pr#8035 <http://github.com/ceph/ceph/pull/8035>`_, Sage Weil)
+* osd: bluestore/blockdevice: use std::mutex et al (`pr#7568 <http://github.com/ceph/ceph/pull/7568>`_, Sage Weil)
+* osd: bluestore: NVMEDevice: fix error handling (`pr#7799 <http://github.com/ceph/ceph/pull/7799>`_, xie xingguo)
+* osd: bluestore: Revert NVMEDevice task cstor and refresh interface changes (`pr#7729 <http://github.com/ceph/ceph/pull/7729>`_, Haomai Wang)
+* osd: bluestore: add 'override' to virtual functions (`pr#7886 <http://github.com/ceph/ceph/pull/7886>`_, Michal Jarzabek)
+* osd: bluestore: allow _dump_onode dynamic accept log level (`pr#7995 <http://github.com/ceph/ceph/pull/7995>`_, Jianpeng Ma)
+* osd: bluestore: fix check for write falling within the same extent (`issue#14954 <http://tracker.ceph.com/issues/14954>`_, `pr#7892 <http://github.com/ceph/ceph/pull/7892>`_, Jianpeng Ma)
+* osd: bluestore: for overwrite a extent, allocate new extent on min_alloc_size write (`pr#7996 <http://github.com/ceph/ceph/pull/7996>`_, Jianpeng Ma)
+* osd: bluestore: improve fs-type verification and tidy up (`pr#7651 <http://github.com/ceph/ceph/pull/7651>`_, xie xingguo)
+* osd: bluestore: misc fixes (`pr#7658 <http://github.com/ceph/ceph/pull/7658>`_, Jianpeng Ma)
+* osd: bluestore: remove unneeded includes (`pr#7870 <http://github.com/ceph/ceph/pull/7870>`_, Michal Jarzabek)
+* osd: clean up CMPXATTR checks (`pr#5961 <http://github.com/ceph/ceph/pull/5961>`_, Jianpeng Ma)
+* osd: consider high/low mode when putting agent to sleep (`issue#14752 <http://tracker.ceph.com/issues/14752>`_, `pr#7631 <http://github.com/ceph/ceph/pull/7631>`_, Sage Weil)
+* osd: ensure new osdmaps commit before publishing them to pgs (`issue#15073 <http://tracker.ceph.com/issues/15073>`_, `pr#8096 <http://github.com/ceph/ceph/pull/8096>`_, Sage Weil)
+* osd: filejournal: report journal entry count (`pr#7643 <http://github.com/ceph/ceph/pull/7643>`_, tianqing)
+* osd: filestore: FALLOC_FL_PUNCH_HOLE must be used with FALLOC_FL_KEEP_SIZE (`pr#7768 <http://github.com/ceph/ceph/pull/7768>`_, xinxin shu)
+* osd: filestore: fast abort if statfs encounters ENOENT (`pr#7703 <http://github.com/ceph/ceph/pull/7703>`_, xie xingguo)
+* osd: filestore: fix race condition with split vs collection_move_rename and long object names (`issue#14766 <http://tracker.ceph.com/issues/14766>`_, `pr#8136 <http://github.com/ceph/ceph/pull/8136>`_, Samuel Just)
+* osd: filestore: fix result code overwritten for clone (`issue#14817 <http://tracker.ceph.com/issues/14817>`_, `issue#14827 <http://tracker.ceph.com/issues/14827>`_, `pr#7711 <http://github.com/ceph/ceph/pull/7711>`_, xie xingguo)
+* osd: filestore: fix wrong scope of result code for error cases during mkfs (`issue#14814 <http://tracker.ceph.com/issues/14814>`_, `pr#7704 <http://github.com/ceph/ceph/pull/7704>`_, xie xingguo)
+* osd: filestore: fix wrong scope of result code for error cases during mount (`issue#14815 <http://tracker.ceph.com/issues/14815>`_, `pr#7707 <http://github.com/ceph/ceph/pull/7707>`_, xie xingguo)
+* osd: filestore: restructure journal and op queue throttling (`pr#7767 <http://github.com/ceph/ceph/pull/7767>`_, Samuel Just)
+* osd: fix forced prmootion for CALL ops (`issue#14745 <http://tracker.ceph.com/issues/14745>`_, `pr#7617 <http://github.com/ceph/ceph/pull/7617>`_, Sage Weil)
+* osd: fix fusestore hanging during stop/quit (`issue#14786 <http://tracker.ceph.com/issues/14786>`_, `pr#7677 <http://github.com/ceph/ceph/pull/7677>`_, xie xingguo)
+* osd: fix inaccurate counter and skip over queueing an empty transaction (`pr#7754 <http://github.com/ceph/ceph/pull/7754>`_, xie xingguo)
+* osd: fix lack of object unblock when flush fails (`issue#14511 <http://tracker.ceph.com/issues/14511>`_, `pr#7584 <http://github.com/ceph/ceph/pull/7584>`_, Igor Fedotov)
+* osd: fix overload of '==' operator for pg_stat_t (`issue#14921 <http://tracker.ceph.com/issues/14921>`_, `pr#7842 <http://github.com/ceph/ceph/pull/7842>`_, xie xingguo)
+* osd: fix race condition for heartbeat_need_update (`issue#14387 <http://tracker.ceph.com/issues/14387>`_, `pr#7739 <http://github.com/ceph/ceph/pull/7739>`_, xie xingguo)
+* osd: fix return value from maybe_handle_cache_detail() (`pr#7593 <http://github.com/ceph/ceph/pull/7593>`_, Igor Fedotov)
+* osd: fix unnecessary object promotion when deleting from cache pool (`issue#13894 <http://tracker.ceph.com/issues/13894>`_, `pr#7537 <http://github.com/ceph/ceph/pull/7537>`_, Igor Fedotov)
+* osd: fix wrong return type of find_osd_on_ip() (`issue#14872 <http://tracker.ceph.com/issues/14872>`_, `pr#7812 <http://github.com/ceph/ceph/pull/7812>`_, xie xingguo)
+* osd: ghobject_t: use ! instead of @ as a separator (`pr#7595 <http://github.com/ceph/ceph/pull/7595>`_, Sage Weil)
+* osd: handle dup pg_create that races with pg deletion (`pr#8033 <http://github.com/ceph/ceph/pull/8033>`_, Sage Weil)
+* osd: initialize last_recalibrate field at construction (`pr#8071 <http://github.com/ceph/ceph/pull/8071>`_, xie xingguo)
+* osd: kstore: fix a race condition in _txc_finish() (`pr#7804 <http://github.com/ceph/ceph/pull/7804>`_, Jianjian Huo)
+* osd: kstore: latency breakdown (`pr#7850 <http://github.com/ceph/ceph/pull/7850>`_, James Liu)
+* osd: kstore: sync up kstore with recent bluestore updates (`pr#7681 <http://github.com/ceph/ceph/pull/7681>`_, Jianjian Huo)
+* osd: memstore: fix alignment of Page for test_pageset (`pr#7587 <http://github.com/ceph/ceph/pull/7587>`_, Casey Bodley)
+* osd: min_write_recency_for_promote & min_read_recency_for_promote are tiering only (`pr#8081 <http://github.com/ceph/ceph/pull/8081>`_, huanwen ren)
+* osd: probabilistic cache tier promotion throttling (`pr#7465 <http://github.com/ceph/ceph/pull/7465>`_, Sage Weil)
+* osd: remove up_thru_pending field, which is never used (`pr#7991 <http://github.com/ceph/ceph/pull/7991>`_, xie xingguo)
+* osd: replicatedpg: break out loop if we encounter fatal error during do_pg_op() (`issue#14922 <http://tracker.ceph.com/issues/14922>`_, `pr#7844 <http://github.com/ceph/ceph/pull/7844>`_, xie xingguo)
+* osd: resolve boot vs NOUP set + clear race (`pr#7483 <http://github.com/ceph/ceph/pull/7483>`_, Sage Weil)
+* packaging: make infernalis -> jewel upgrade work (`issue#15047 <http://tracker.ceph.com/issues/15047>`_, `pr#8034 <http://github.com/ceph/ceph/pull/8034>`_, Nathan Cutler)
+* packaging: move cephfs repair tools to ceph-common (`issue#15145 <http://tracker.ceph.com/issues/15145>`_, `pr#8133 <http://github.com/ceph/ceph/pull/8133>`_, Boris Ranto, Ken Dreyer)
+* pybind/rados: fix object lifetime issues and other bugs in aio (`pr#7778 <http://github.com/ceph/ceph/pull/7778>`_, Hector Martin)
+* pybind/rados: use __dealloc__ since __del__ is ignored by cython (`pr#7692 <http://github.com/ceph/ceph/pull/7692>`_, Mehdi Abaakouk)
+* pybind: Ensure correct python flags are passed (`pr#7663 <http://github.com/ceph/ceph/pull/7663>`_, James Page)
+* pybind: flag an RBD image as closed regardless of result code (`pr#8005 <http://github.com/ceph/ceph/pull/8005>`_, Jason Dillaman)
+* pybind: move cephfs to Cython (`pr#7745 <http://github.com/ceph/ceph/pull/7745>`_, John Spray, Mehdi Abaakouk)
+* pybind: remove next() on iterators (`pr#7706 <http://github.com/ceph/ceph/pull/7706>`_, Mehdi Abaakouk)
+* pybind: replace __del__ with __dealloc__ for rbd (`pr#7708 <http://github.com/ceph/ceph/pull/7708>`_, Josh Durgin)
+* pybind: use correct subdir for rados install-exec rule (`pr#7684 <http://github.com/ceph/ceph/pull/7684>`_, Josh Durgin)
+* python binding of librados with cython (`pr#7621 <http://github.com/ceph/ceph/pull/7621>`_, Mehdi Abaakouk)
+* python: use pip instead of python setup.py (`pr#7605 <http://github.com/ceph/ceph/pull/7605>`_, Loic Dachary)
+* qa/workunits/cephtool/test.sh: wait longer in ceph_watch_start() (`issue#14910 <http://tracker.ceph.com/issues/14910>`_, `pr#7861 <http://github.com/ceph/ceph/pull/7861>`_, Kefu Chai)
+* qa/workunits/rados/test.sh: capture stderr too (`pr#8004 <http://github.com/ceph/ceph/pull/8004>`_, Sage Weil)
+* qa/workunits/rados/test.sh: test tmap_migrate (`pr#8114 <http://github.com/ceph/ceph/pull/8114>`_, Sage Weil)
+* qa/workunits/rbd: do not use object map during read flag testing (`pr#8104 <http://github.com/ceph/ceph/pull/8104>`_, Jason Dillaman)
+* qa/workunits/rbd: new online maintenance op tests (`pr#8216 <http://github.com/ceph/ceph/pull/8216>`_, Jason Dillaman)
+* qa/workunits/rbd: use POSIX function definition (`issue#15104 <http://tracker.ceph.com/issues/15104>`_, `pr#8068 <http://github.com/ceph/ceph/pull/8068>`_, Nathan Cutler)
+* qa/workunits/rest/test.py: add confirmation to 'mds setmap' (`issue#14606 <http://tracker.ceph.com/issues/14606>`_, `pr#7982 <http://github.com/ceph/ceph/pull/7982>`_, Sage Weil)
+* qa/workunits/rest/test.py: don't use newfs (`pr#8191 <http://github.com/ceph/ceph/pull/8191>`_, Sage Weil)
+* qa: add workunit to run ceph_test_rbd_mirror (`pr#8221 <http://github.com/ceph/ceph/pull/8221>`_, Josh Durgin)
+* rados: add ceph:: namespace to bufferlist type (`pr#8059 <http://github.com/ceph/ceph/pull/8059>`_, Noah Watkins)
+* rados: fix bug for write bench (`pr#7851 <http://github.com/ceph/ceph/pull/7851>`_, James Liu)
+* rbd-mirror: ImageReplayer async start/stop (`pr#7944 <http://github.com/ceph/ceph/pull/7944>`_, Mykola Golub)
+* rbd-mirror: ImageReplayer improvements (`pr#7759 <http://github.com/ceph/ceph/pull/7759>`_, Mykola Golub)
+* rbd-mirror: fix image replay test failures (`pr#8158 <http://github.com/ceph/ceph/pull/8158>`_, Jason Dillaman)
+* rbd-mirror: fix long termination due to 30sec wait in main loop (`pr#8185 <http://github.com/ceph/ceph/pull/8185>`_, Mykola Golub)
+* rbd-mirror: implement ImageReplayer (`pr#7614 <http://github.com/ceph/ceph/pull/7614>`_, Mykola Golub)
+* rbd-mirror: integrate with image sync state machine (`pr#8079 <http://github.com/ceph/ceph/pull/8079>`_, Jason Dillaman)
+* rbd-mirror: minor fix-ups for initial skeleton implementation (`pr#7958 <http://github.com/ceph/ceph/pull/7958>`_, Mykola Golub)
+* rbd-mirror: remote to local cluster image sync (`pr#7979 <http://github.com/ceph/ceph/pull/7979>`_, Jason Dillaman)
+* rbd-mirror: use pool/image names in asok commands (`pr#8159 <http://github.com/ceph/ceph/pull/8159>`_, Mykola Golub)
+* rbd-mirror: use the mirroring directory to detect candidate images (`issue#15142 <http://tracker.ceph.com/issues/15142>`_, `pr#8162 <http://github.com/ceph/ceph/pull/8162>`_, Ricardo Dias)
+* rbd/run_cli_tests.sh: Reflect test failures (`issue#14825 <http://tracker.ceph.com/issues/14825>`_, `pr#7781 <http://github.com/ceph/ceph/pull/7781>`_, Zack Cerza)
+* rbd: add support for mirror image promotion/demotion/resync (`pr#8138 <http://github.com/ceph/ceph/pull/8138>`_, Jason Dillaman)
+* rbd: clone operation should default to image format 2 (`pr#8119 <http://github.com/ceph/ceph/pull/8119>`_, Jason Dillaman)
+* rbd: deprecate image format 1 (`pr#7841 <http://github.com/ceph/ceph/pull/7841>`_, Jason Dillaman)
+* rbd: support for enabling/disabling mirroring on specific images (`issue#13296 <http://tracker.ceph.com/issues/13296>`_, `pr#8056 <http://github.com/ceph/ceph/pull/8056>`_, Ricardo Dias)
+* release-notes: draft v0.94.6 release notes (`issue#13356 <http://tracker.ceph.com/issues/13356>`_, `pr#7689 <http://github.com/ceph/ceph/pull/7689>`_, Abhishek Varshney, Loic Dachary)
+* release-notes: draft v10.0.3 release notes (`pr#7592 <http://github.com/ceph/ceph/pull/7592>`_, Loic Dachary)
+* release-notes: draft v10.0.4 release notes (`pr#7966 <http://github.com/ceph/ceph/pull/7966>`_, Loic Dachary)
+* release-notes: draft v9.2.1 release notes (`issue#13750 <http://tracker.ceph.com/issues/13750>`_, `pr#7694 <http://github.com/ceph/ceph/pull/7694>`_, Abhishek Varshney)
+* rgw: ldap (Matt Benjamin) (`pr#7985 <http://github.com/ceph/ceph/pull/7985>`_, Matt Benjamin)
+* rgw: multisite fixes (`pr#8013 <http://github.com/ceph/ceph/pull/8013>`_, Yehuda Sadeh)
+* rgw: support for aws authentication v4 (Javier M. Mellid) (`issue#10333 <http://tracker.ceph.com/issues/10333>`_, `pr#7720 <http://github.com/ceph/ceph/pull/7720>`_, Yehuda Sadeh, Javier M. Mellid)
+* rgw sync fixes (`pr#8095 <http://github.com/ceph/ceph/pull/8095>`_, Yehuda Sadeh)
+* rgw/rgw_common.h: fix the RGWBucketInfo decoding (`pr#8165 <http://github.com/ceph/ceph/pull/8165>`_, Kefu Chai)
+* rgw/rgw_common.h: fix the RGWBucketInfo decoding (`pr#8154 <http://github.com/ceph/ceph/pull/8154>`_, Kefu Chai)
+* rgw/rgw_orphan: check the return value of save_state (`pr#7544 <http://github.com/ceph/ceph/pull/7544>`_, Boris Ranto)
+* rgw: Allow an implicit tenant in case of Keystone (`pr#8139 <http://github.com/ceph/ceph/pull/8139>`_, Pete Zaitcev)
+* rgw: Drop unused usage_exit from rgw_admin.cc (`pr#7632 <http://github.com/ceph/ceph/pull/7632>`_, Pete Zaitcev)
+* rgw: RGWZoneParams::create should not handle -EEXIST error (`pr#7927 <http://github.com/ceph/ceph/pull/7927>`_, Orit Wasserman)
+* rgw: add bucket request payment feature usage statistics integration (`issue#13834 <http://tracker.ceph.com/issues/13834>`_, `pr#6656 <http://github.com/ceph/ceph/pull/6656>`_, Javier M. Mellid)
+* rgw: add support for caching of Keystone admin token. (`pr#7630 <http://github.com/ceph/ceph/pull/7630>`_, Radoslaw Zarzynski)
+* rgw: add support for metadata upload during PUT on Swift container. (`pr#8002 <http://github.com/ceph/ceph/pull/8002>`_, Radoslaw Zarzynski)
+* rgw: add support for system requests over Swift API (`pr#7666 <http://github.com/ceph/ceph/pull/7666>`_, Radoslaw Zarzynski)
+* rgw: adjust the request_uri to support absoluteURI of http request (`issue#12917 <http://tracker.ceph.com/issues/12917>`_, `pr#7675 <http://github.com/ceph/ceph/pull/7675>`_, Wenjun Huang)
+* rgw: admin api for retrieving usage info (Ji Chen) (`pr#8031 <http://github.com/ceph/ceph/pull/8031>`_, Yehuda Sadeh, Ji Chen)
+* rgw: allow authentication keystone with self signed certs  (`issue#14853 <http://tracker.ceph.com/issues/14853>`_, `issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7777 <http://github.com/ceph/ceph/pull/7777>`_, Abhishek Lekshmanan)
+* rgw: approximate AmazonS3 HostId error field. (`pr#7444 <http://github.com/ceph/ceph/pull/7444>`_, Robin H. Johnson)
+* rgw: calculate payload hash in RGWPutObj_ObjStore only when necessary. (`pr#7869 <http://github.com/ceph/ceph/pull/7869>`_, Radoslaw Zarzynski)
+* rgw: cleanups to comments and messages (`pr#7633 <http://github.com/ceph/ceph/pull/7633>`_, Pete Zaitcev)
+* rgw: don't use s->bucket for metadata api path entry (`issue#14549 <http://tracker.ceph.com/issues/14549>`_, `pr#7408 <http://github.com/ceph/ceph/pull/7408>`_, Yehuda Sadeh)
+* rgw: drop permissions of rgw/civetweb after startup (`issue#13600 <http://tracker.ceph.com/issues/13600>`_, `pr#8019 <http://github.com/ceph/ceph/pull/8019>`_, Karol Mroz)
+* rgw: fcgi should include acconfig (`pr#7760 <http://github.com/ceph/ceph/pull/7760>`_, Abhishek Lekshmanan)
+* rgw: fix wrong handling of limit=0 during listing of Swift account. (`issue#14903 <http://tracker.ceph.com/issues/14903>`_, `pr#7821 <http://github.com/ceph/ceph/pull/7821>`_, Radoslaw Zarzynski)
+* rgw: fixes for per-period metadata logs (`pr#7827 <http://github.com/ceph/ceph/pull/7827>`_, Casey Bodley)
+* rgw: improve error handling in S3/Keystone integration (`pr#7597 <http://github.com/ceph/ceph/pull/7597>`_, Radoslaw Zarzynski)
+* rgw: link civetweb with openssl (Sage, Marcus Watts) (`pr#7825 <http://github.com/ceph/ceph/pull/7825>`_, Marcus Watts, Sage Weil)
+* rgw: link payer info to usage logging (`pr#7918 <http://github.com/ceph/ceph/pull/7918>`_, Yehuda Sadeh, Javier M. Mellid)
+* rgw: move signal.h dependency from rgw_front.h (`pr#7678 <http://github.com/ceph/ceph/pull/7678>`_, Matt Benjamin)
+* rgw: multiple Swift API compliance improvements for TempURL (Radoslaw Zarzynsk) (`issue#14806 <http://tracker.ceph.com/issues/14806>`_, `issue#11163 <http://tracker.ceph.com/issues/11163>`_, `pr#7891 <http://github.com/ceph/ceph/pull/7891>`_, Radoslaw Zarzynski)
+* rgw: multiple improvements regarding etag calculation for SLO/DLO of Swift API. (`pr#7764 <http://github.com/ceph/ceph/pull/7764>`_, Radoslaw Zarzynski)
+* rgw: remove duplicated code in RGWRados::get_bucket_info() (`pr#7413 <http://github.com/ceph/ceph/pull/7413>`_, liyankun)
+* rgw: remove unused vector (`pr#7990 <http://github.com/ceph/ceph/pull/7990>`_, Na Xie)
+* rgw: reset return code in when iterating over the bucket the objects (`issue#14826 <http://tracker.ceph.com/issues/14826>`_, `pr#7803 <http://github.com/ceph/ceph/pull/7803>`_, Orit Wasserman)
+* rgw: store system object meta in cache when creating it (`issue#14678 <http://tracker.ceph.com/issues/14678>`_, `pr#7615 <http://github.com/ceph/ceph/pull/7615>`_, Yehuda Sadeh)
+* rgw: support json format for admin policy API (Dunrong Huang) (`issue#14090 <http://tracker.ceph.com/issues/14090>`_, `pr#8036 <http://github.com/ceph/ceph/pull/8036>`_, Yehuda Sadeh, Dunrong Huang)
+* rgw: try to parse Keystone token in order appropriate to configuration. (`pr#7822 <http://github.com/ceph/ceph/pull/7822>`_, Radoslaw Zarzynski)
+* rgw: use pimpl pattern for RGWPeriodHistory (`pr#7809 <http://github.com/ceph/ceph/pull/7809>`_, Casey Bodley)
+* rgw: user quota may not adjust on bucket removal (`issue#14507 <http://tracker.ceph.com/issues/14507>`_, `pr#7586 <http://github.com/ceph/ceph/pull/7586>`_, root)
+* rgw: bucket link now set the bucket.instance acl (bug fix) (`issue#11076 <http://tracker.ceph.com/issues/11076>`_, `pr#8037 <http://github.com/ceph/ceph/pull/8037>`_, Zengran Zhang)
+* rpm,deb: remove conditional BuildRequires for btrfs-progs (`issue#15042 <http://tracker.ceph.com/issues/15042>`_, `pr#8016 <http://github.com/ceph/ceph/pull/8016>`_, Erwan Velu)
+* rpm: remove sub-package dependencies on "ceph" (`issue#15146 <http://tracker.ceph.com/issues/15146>`_, `pr#8137 <http://github.com/ceph/ceph/pull/8137>`_, Ken Dreyer)
+* script: add missing stop_rgw variable to stop.sh script (`pr#7959 <http://github.com/ceph/ceph/pull/7959>`_, Karol Mroz)
+* selinux: Update policy to grant additional access (`issue#14870 <http://tracker.ceph.com/issues/14870>`_, `pr#7971 <http://github.com/ceph/ceph/pull/7971>`_, Boris Ranto)
+* selinux: allow log files to be located in /var/log/radosgw (`pr#7604 <http://github.com/ceph/ceph/pull/7604>`_, Boris Ranto)
+* common: string.h: return type from str_len(...) need not be const (`pr#7679 <http://github.com/ceph/ceph/pull/7679>`_, Matt Benjamin)
+* submodules: revert an accidental change (`pr#7929 <http://github.com/ceph/ceph/pull/7929>`_, Yehuda Sadeh)
+* systemd: correctly escape block device paths (`issue#14706 <http://tracker.ceph.com/issues/14706>`_, `pr#7579 <http://github.com/ceph/ceph/pull/7579>`_, James Page)
+* test/TestPGLog: fix the FTBFS (`issue#14930 <http://tracker.ceph.com/issues/14930>`_, `pr#7855 <http://github.com/ceph/ceph/pull/7855>`_, Kefu Chai)
+* test/bufferlist: Avoid false-positive tests (`pr#7955 <http://github.com/ceph/ceph/pull/7955>`_, Erwan Velu)
+* test/cli-integration/rbd: disable progress output (`issue#14931 <http://tracker.ceph.com/issues/14931>`_, `pr#7858 <http://github.com/ceph/ceph/pull/7858>`_, Josh Durgin)
+* test/osd: Relax the timing intervals in osd-markdown.sh (`pr#7899 <http://github.com/ceph/ceph/pull/7899>`_, Dan Mick)
+* test/pybind/test_ceph_argparse: fix reweight-by-utilization tests (`pr#8027 <http://github.com/ceph/ceph/pull/8027>`_, Kefu Chai, Sage Weil)
+* test/radosgw-admin: update the expected usage outputs (`pr#7723 <http://github.com/ceph/ceph/pull/7723>`_, Kefu Chai)
+* test/rgw: add multisite test for meta sync across periods (`pr#7887 <http://github.com/ceph/ceph/pull/7887>`_, Casey Bodley)
+* test/time: no need to abs(uint64_t) for comparing (`pr#7726 <http://github.com/ceph/ceph/pull/7726>`_, Kefu Chai)
+* test: add missing shut_down mock method (`pr#8125 <http://github.com/ceph/ceph/pull/8125>`_, Jason Dillaman)
+* test: correct librbd errors discovered with unoptimized cmake build (`pr#7914 <http://github.com/ceph/ceph/pull/7914>`_, Jason Dillaman)
+* test: create pools for rbd tests with different prefix (`pr#7738 <http://github.com/ceph/ceph/pull/7738>`_, Mykola Golub)
+* test: enable test for bug #2339 which has been resolved. (`pr#7743 <http://github.com/ceph/ceph/pull/7743>`_, You Ji)
+* test: fix issues discovered via the rbd permissions test case (`pr#8129 <http://github.com/ceph/ceph/pull/8129>`_, Jason Dillaman)
+* test: fixup and improvements for rbd-mirror test (`pr#8090 <http://github.com/ceph/ceph/pull/8090>`_, Mykola Golub)
+* test: handle exception thrown from close during rbd lock test (`pr#8124 <http://github.com/ceph/ceph/pull/8124>`_, Jason Dillaman)
+* test: more debug logging for TestWatchNotify (`pr#7737 <http://github.com/ceph/ceph/pull/7737>`_, Mykola Golub)
+* test: new librbd flatten test case (`pr#7609 <http://github.com/ceph/ceph/pull/7609>`_, Jason Dillaman)
+* test: rbd-mirror: add "switch to the next tag" test (`pr#8149 <http://github.com/ceph/ceph/pull/8149>`_, Mykola Golub)
+* test: rbd-mirror: compare positions using all fields (`pr#8172 <http://github.com/ceph/ceph/pull/8172>`_, Mykola Golub)
+* test: reproducer for writeback CoW deadlock (`pr#8009 <http://github.com/ceph/ceph/pull/8009>`_, Jason Dillaman)
+* test: update rbd integration cram tests for new default features (`pr#8001 <http://github.com/ceph/ceph/pull/8001>`_, Jason Dillaman)
+* test_pool_create.sh: put test files in the test dir so they are cleaned up (`pr#8219 <http://github.com/ceph/ceph/pull/8219>`_, Josh Durgin)
+* tests: ceph-disk.sh: should use "readlink -f" instead (`pr#7594 <http://github.com/ceph/ceph/pull/7594>`_, Kefu Chai)
+* tests: ceph-disk.sh: use "readlink -f" instead for fullpath (`pr#7606 <http://github.com/ceph/ceph/pull/7606>`_, Kefu Chai)
+* tests: fix a few build warnings (`pr#7608 <http://github.com/ceph/ceph/pull/7608>`_, Sage Weil)
+* tests: sync ceph-erasure-code-corpus for mktemp -d (`pr#7596 <http://github.com/ceph/ceph/pull/7596>`_, Loic Dachary)
+* tests: test_pidfile.sh lingering processes (`issue#14834 <http://tracker.ceph.com/issues/14834>`_, `pr#7734 <http://github.com/ceph/ceph/pull/7734>`_, Loic Dachary)
+* tools/cephfs: add tmap_upgrade (`pr#7003 <http://github.com/ceph/ceph/pull/7003>`_, John Spray)
+* tools/cephfs: fix tmap_upgrade (`issue#15135 <http://tracker.ceph.com/issues/15135>`_, `pr#8128 <http://github.com/ceph/ceph/pull/8128>`_, John Spray)
+* tools/rados: reduce "rados put" memory usage by op_size (`pr#7928 <http://github.com/ceph/ceph/pull/7928>`_, Piotr Dałek)
+* unittest_compression_zlib: do not assume buffer will be null terminated (`pr#8064 <http://github.com/ceph/ceph/pull/8064>`_, Sage Weil)
+* unittest_osdmap: default crush tunables now firefly (`pr#8098 <http://github.com/ceph/ceph/pull/8098>`_, Sage Weil)
+* vstart.sh: avoid race condition starting rgw via vstart.sh (`issue#14829 <http://tracker.ceph.com/issues/14829>`_, `pr#7727 <http://github.com/ceph/ceph/pull/7727>`_, Javier M. Mellid)
+* vstart.sh: silence a harmless msg where btrfs is not found (`pr#7640 <http://github.com/ceph/ceph/pull/7640>`_, Patrick Donnelly)
+* xio: fix incorrect ip being assigned in case of multiple RDMA ports (`pr#7747 <http://github.com/ceph/ceph/pull/7747>`_, Subramanyam Varanasi)
+* xio: remove duplicate assignment of peer addr (`pr#8025 <http://github.com/ceph/ceph/pull/8025>`_, Roi Dayan)
+* xio: remove redundant magic methods (`pr#7773 <http://github.com/ceph/ceph/pull/7773>`_, Roi Dayan)
+* xio: remove unused variable (`pr#8023 <http://github.com/ceph/ceph/pull/8023>`_, Roi Dayan)
+* xxhash: use clone of xxhash.git; add .gitignore (`pr#7986 <http://github.com/ceph/ceph/pull/7986>`_, Sage Weil)
+* rbd: update default image features (`pr#7846 <http://github.com/ceph/ceph/pull/7846>`_, Jason Dillaman)
+* rbd-mirror: make remote context respect env and argv config params (`pr#8182 <http://github.com/ceph/ceph/pull/8182>`_, Mykola Golub)
+* journal: re-use common threads between journalers (`pr#7906 <http://github.com/ceph/ceph/pull/7906>`_, Jason Dillaman)
+* client: add option to control how directory size is calculated (`pr#7323 <http://github.com/ceph/ceph/pull/7323>`_, Yan, Zheng)
+* rgw: keystone v3 (`pr#7719 <http://github.com/ceph/ceph/pull/7719>`_, Mark Barnes, Radoslaw Zarzynski)
+* rgw: new multisite merge (`issue#14549 <http://tracker.ceph.com/issues/14549>`_, `pr#7709 <http://github.com/ceph/ceph/pull/7709>`_, Yehuda Sadeh, Orit Wasserman, Casey Bodley, Daniel Gryniewicz)
+* rgw: adjust error code when bucket does not exist in copy operation (`issue#14975 <http://tracker.ceph.com/issues/14975>`_, `pr#7916 <http://github.com/ceph/ceph/pull/7916>`_, Yehuda Sadeh)
+* rgw: indexless (`pr#7786 <http://github.com/ceph/ceph/pull/7786>`_, Yehuda Sadeh)
+* build: build internal plugins and classes as modules (`pr#6462 <http://github.com/ceph/ceph/pull/6462>`_, James Page)
+* build: fix Jenkins make check errors due to deep-scrub randomization (`pr#6671 <http://github.com/ceph/ceph/pull/6671>`_, David Zafman)
+* build/ops: enable CR in CentOS 7 (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6844 <http://github.com/ceph/ceph/pull/6844>`_, Loic Dachary)
+* build/ops: rbd-replay moved from ceph-test-dbg to ceph-common-dbg (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6578 <http://github.com/ceph/ceph/pull/6578>`_, Loic Dachary)
+* ceph-disk: Add destroy and deactivate option (`issue#7454 <http://tracker.ceph.com/issues/7454>`_, `pr#5867 <http://github.com/ceph/ceph/pull/5867>`_, Vicente Cheng)
+* ceph-disk: compare parted output with the dereferenced path (`issue#13438 <http://tracker.ceph.com/issues/13438>`_, `pr#6219 <http://github.com/ceph/ceph/pull/6219>`_, Joe Julian)
+* ceph-objectstore-tool: fix --dry-run for many ceph-objectstore-tool operations (`pr#6545 <http://github.com/ceph/ceph/pull/6545>`_, David Zafman)
+* ceph.spec.in: limit _smp_mflags when lowmem_builder is set in SUSE's OBS (`issue#13858 <http://tracker.ceph.com/issues/13858>`_, `pr#6691 <http://github.com/ceph/ceph/pull/6691>`_, Nathan Cutler)
+* ceph_test_msgr: Use send_message instead of keepalive to wakeup connection (`pr#6605 <http://github.com/ceph/ceph/pull/6605>`_, Haomai Wang)
+* client: avoid creating orphan object in Client::check_pool_perm() (`issue#13782 <http://tracker.ceph.com/issues/13782>`_, `pr#6603 <http://github.com/ceph/ceph/pull/6603>`_, Yan, Zheng)
+* client: use null snapc to check pool permission (`issue#13714 <http://tracker.ceph.com/issues/13714>`_, `pr#6497 <http://github.com/ceph/ceph/pull/6497>`_, Yan, Zheng)
+* cmake: add nss as a suffix for pk11pub.h (`pr#6556 <http://github.com/ceph/ceph/pull/6556>`_, Samuel Just)
+* cmake: fix files list (`pr#6539 <http://github.com/ceph/ceph/pull/6539>`_, Yehuda Sadeh)
+* cmake: librbd and libjournal build fixes (`pr#6557 <http://github.com/ceph/ceph/pull/6557>`_, Ilya Dryomov)
+* coc: fix typo in the apt-get command (`pr#6659 <http://github.com/ceph/ceph/pull/6659>`_, Chris Holcombe)
+* common: allow enable/disable of optracker at runtime (`pr#5168 <http://github.com/ceph/ceph/pull/5168>`_, Jianpeng Ma)
+* common: fix reset max in Throttle using perf reset command (`issue#13517 <http://tracker.ceph.com/issues/13517>`_, `pr#6300 <http://github.com/ceph/ceph/pull/6300>`_, Xinze Chi)
+* doc: add v0.80.11 to the release timeline (`pr#6658 <http://github.com/ceph/ceph/pull/6658>`_, Loic Dachary)
+* doc: release-notes: draft v0.80.11 release notes (`pr#6374 <http://github.com/ceph/ceph/pull/6374>`_, Loic Dachary)
+* doc: release-notes: draft v10.0.0 release notes (`pr#6666 <http://github.com/ceph/ceph/pull/6666>`_, Loic Dachary)
+* doc: SubmittingPatches: there is no next; only jewel (`pr#6811 <http://github.com/ceph/ceph/pull/6811>`_, Nathan Cutler)
+* doc: Update ceph-disk manual page with new feature deactivate/destroy. (`pr#6637 <http://github.com/ceph/ceph/pull/6637>`_, Vicente Cheng)
+* doc: update infernalis release notes (`pr#6575 <http://github.com/ceph/ceph/pull/6575>`_, vasukulkarni)
+* fix: use right init_flags to finish CephContext (`pr#6549 <http://github.com/ceph/ceph/pull/6549>`_, Yunchuan Wen)
+* init-ceph: use getopt to make option processing more flexible (`issue#3015 <http://tracker.ceph.com/issues/3015>`_, `pr#6089 <http://github.com/ceph/ceph/pull/6089>`_, Nathan Cutler)
+* journal: incremental improvements and fixes (`pr#6552 <http://github.com/ceph/ceph/pull/6552>`_, Mykola Golub)
+* krbd: remove deprecated --quiet param from udevadm (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6394 <http://github.com/ceph/ceph/pull/6394>`_, Jason Dillaman)
+* kv: fix bug in kv key optimization (`pr#6511 <http://github.com/ceph/ceph/pull/6511>`_, Sage Weil)
+* kv/KineticStore: fix broken split_key (`pr#6574 <http://github.com/ceph/ceph/pull/6574>`_, Haomai Wang)
+* kv: optimize and clean up internal key/value interface (`pr#6312 <http://github.com/ceph/ceph/pull/6312>`_, Piotr Dałek, Sage Weil)
+* librados: do cleanup (`pr#6488 <http://github.com/ceph/ceph/pull/6488>`_, xie xingguo)
+* librados: fix pool alignment API overflow issue (`issue#13715 <http://tracker.ceph.com/issues/13715>`_, `pr#6489 <http://github.com/ceph/ceph/pull/6489>`_, xie xingguo)
+* librados: fix potential null pointer access when do pool_snap_list (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6422 <http://github.com/ceph/ceph/pull/6422>`_, xie xingguo)
+* librados: fix PromoteOn2ndRead test for EC (`pr#6373 <http://github.com/ceph/ceph/pull/6373>`_, Sage Weil)
+* librados: fix rare race where pool op callback may hang forever (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6426 <http://github.com/ceph/ceph/pull/6426>`_, xie xingguo)
+* librados: Solaris port (`pr#6416 <http://github.com/ceph/ceph/pull/6416>`_, Rohan Mars)
+* librbd: flush and invalidate cache via admin socket (`issue#2468 <http://tracker.ceph.com/issues/2468>`_, `pr#6453 <http://github.com/ceph/ceph/pull/6453>`_, Mykola Golub)
+* librbd: integrate journaling support for IO operations (`pr#6541 <http://github.com/ceph/ceph/pull/6541>`_, Jason Dillaman)
+* librbd: perf counters might not be initialized on error (`issue#13740 <http://tracker.ceph.com/issues/13740>`_, `pr#6523 <http://github.com/ceph/ceph/pull/6523>`_, Jason Dillaman)
+* librbd: perf section name: use hyphen to separate components (`issue#13719 <http://tracker.ceph.com/issues/13719>`_, `pr#6516 <http://github.com/ceph/ceph/pull/6516>`_, Mykola Golub)
+* librbd: resize should only update image size within header (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6447 <http://github.com/ceph/ceph/pull/6447>`_, Jason Dillaman)
+* librbd: start perf counters after id is initialized (`issue#13720 <http://tracker.ceph.com/issues/13720>`_, `pr#6494 <http://github.com/ceph/ceph/pull/6494>`_, Mykola Golub)
+* mailmap: revise organization (`pr#6519 <http://github.com/ceph/ceph/pull/6519>`_, Li Wang)
+* mailmap: Ubuntu Kylin name changed to Kylin Cloud (`pr#6532 <http://github.com/ceph/ceph/pull/6532>`_, Loic Dachary)
+* mailmap: update .organizationmap (`pr#6565 <http://github.com/ceph/ceph/pull/6565>`_, chenji-kael)
+* mailmap: updates for infernalis. (`pr#6495 <http://github.com/ceph/ceph/pull/6495>`_, Yann Dupont)
+* mailmap: updates (`pr#6594 <http://github.com/ceph/ceph/pull/6594>`_, chenji-kael)
+* mds: fix scrub_path (`pr#6684 <http://github.com/ceph/ceph/pull/6684>`_, John Spray)
+* mds: properly set STATE_STRAY/STATE_ORPHAN for stray dentry/inode (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#6553 <http://github.com/ceph/ceph/pull/6553>`_, Yan, Zheng)
+* mds: ScrubStack and "tag path" command (`pr#5662 <http://github.com/ceph/ceph/pull/5662>`_, Yan, Zheng, John Spray, Greg Farnum)
+* mon: block 'ceph osd pg-temp ...' if pg_temp update is already pending (`pr#6704 <http://github.com/ceph/ceph/pull/6704>`_, Sage Weil)
+* mon: don't require OSD W for MRemoveSnaps (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#6601 <http://github.com/ceph/ceph/pull/6601>`_, John Spray)
+* mon: initialize recorded election epoch properly even when standalone (`issue#13627 <http://tracker.ceph.com/issues/13627>`_, `pr#6407 <http://github.com/ceph/ceph/pull/6407>`_, huanwen ren)
+* mon: revert MonitorDBStore's WholeStoreIteratorImpl::get (`issue#13742 <http://tracker.ceph.com/issues/13742>`_, `pr#6522 <http://github.com/ceph/ceph/pull/6522>`_, Piotr Dałek)
+* msg/async: let receiver ack message ASAP (`pr#6478 <http://github.com/ceph/ceph/pull/6478>`_, Haomai Wang)
+* msg/async: support of non-block connect in async messenger (`issue#12802 <http://tracker.ceph.com/issues/12802>`_, `pr#5848 <http://github.com/ceph/ceph/pull/5848>`_, Jianhui Yuan)
+* msg/async: will crash if enabling async msg because of an assertion (`pr#6640 <http://github.com/ceph/ceph/pull/6640>`_, Zhi Zhang)
+* osd: avoid calculating crush mapping for most ops (`pr#6371 <http://github.com/ceph/ceph/pull/6371>`_, Sage Weil)
+* osd: avoid double-check for replaying and can_checkpoint() in FileStore::_check_replay_guard (`pr#6471 <http://github.com/ceph/ceph/pull/6471>`_, Ning Yao)
+* osd: call on_new_interval on newly split child PG (`issue#13962 <http://tracker.ceph.com/issues/13962>`_, `pr#6778 <http://github.com/ceph/ceph/pull/6778>`_, Sage Weil)
+* osd: change mutex to spinlock to optimize thread context switch. (`pr#6492 <http://github.com/ceph/ceph/pull/6492>`_, Xiaowei Chen)
+* osd: check do_shutdown before do_restart (`pr#6547 <http://github.com/ceph/ceph/pull/6547>`_, Xiaoxi Chen)
+* osd: clarify the scrub result report (`pr#6534 <http://github.com/ceph/ceph/pull/6534>`_, Li Wang)
+* osd: don't do random deep scrubs for user initiated scrubs (`pr#6673 <http://github.com/ceph/ceph/pull/6673>`_, David Zafman)
+* osd: FileStore: support multiple ondisk finish and apply finishers (`pr#6486 <http://github.com/ceph/ceph/pull/6486>`_, Xinze Chi, Haomai Wang)
+* osd: fix broken balance / localized read handling (`issue#13491 <http://tracker.ceph.com/issues/13491>`_, `pr#6364 <http://github.com/ceph/ceph/pull/6364>`_, Jason Dillaman)
+* osd: fix bug in last_* PG state timestamps (`pr#6517 <http://github.com/ceph/ceph/pull/6517>`_, Li Wang)
+* osd: fix ClassHandler::ClassData::get_filter() (`pr#6747 <http://github.com/ceph/ceph/pull/6747>`_, Yan, Zheng)
+* osd: fixes for several cases where op result code was not checked or set (`issue#13566 <http://tracker.ceph.com/issues/13566>`_, `pr#6347 <http://github.com/ceph/ceph/pull/6347>`_, xie xingguo)
+* osd: fix reactivate (check OSDSuperblock in mkfs() when we already have the superblock) (`issue#13586 <http://tracker.ceph.com/issues/13586>`_, `pr#6385 <http://github.com/ceph/ceph/pull/6385>`_, Vicente Cheng)
+* osd: fix wrong use of right parenthesis in localized read logic (`pr#6566 <http://github.com/ceph/ceph/pull/6566>`_, Jie Wang)
+* osd: improve temperature calculation for cache tier agent (`pr#4737 <http://github.com/ceph/ceph/pull/4737>`_, MingXin Liu)
+* osd: merge local_t and op_t txn to single one (`pr#6439 <http://github.com/ceph/ceph/pull/6439>`_, Xinze Chi)
+* osd: newstore: misc updates (including kv and os/fs stuff) (`pr#6609 <http://github.com/ceph/ceph/pull/6609>`_, Sage Weil)
+* osd: note down the number of missing clones (`pr#6654 <http://github.com/ceph/ceph/pull/6654>`_, Kefu Chai)
+* osd: optimize clone write path if object-map is enabled (`pr#6403 <http://github.com/ceph/ceph/pull/6403>`_, xinxin shu)
+* osd: optimize scrub subset_last_update calculation (`pr#6518 <http://github.com/ceph/ceph/pull/6518>`_, Li Wang)
+* osd: partial revert of "ReplicatedPG: result code not correctly set in some cases." (`issue#13796 <http://tracker.ceph.com/issues/13796>`_, `pr#6622 <http://github.com/ceph/ceph/pull/6622>`_, Sage Weil)
+* osd: randomize deep scrubbing (`pr#6550 <http://github.com/ceph/ceph/pull/6550>`_, Dan van der Ster, Herve Rousseau)
+* osd: scrub: do not assign value if read error (`pr#6568 <http://github.com/ceph/ceph/pull/6568>`_, Li Wang)
+* osd: write file journal optimization (`pr#6484 <http://github.com/ceph/ceph/pull/6484>`_, Xinze Chi)
+* rbd: accept --user, refuse -i command-line optionals (`pr#6590 <http://github.com/ceph/ceph/pull/6590>`_, Ilya Dryomov)
+* rbd: add missing command aliases to refactored CLI (`issue#13806 <http://tracker.ceph.com/issues/13806>`_, `pr#6606 <http://github.com/ceph/ceph/pull/6606>`_, Jason Dillaman)
+* rbd: dynamically generated bash completion (`issue#13494 <http://tracker.ceph.com/issues/13494>`_, `pr#6316 <http://github.com/ceph/ceph/pull/6316>`_, Jason Dillaman)
+* rbd: fixes for refactored CLI and related tests (`pr#6738 <http://github.com/ceph/ceph/pull/6738>`_, Ilya Dryomov)
+* rbd: make config changes actually apply (`pr#6520 <http://github.com/ceph/ceph/pull/6520>`_, Mykola Golub)
+* rbd: refactor cli command handling (`pr#5987 <http://github.com/ceph/ceph/pull/5987>`_, Jason Dillaman)
+* rbd: stripe unit/count set incorrectly from config (`pr#6593 <http://github.com/ceph/ceph/pull/6593>`_, Mykola Golub)
+* rbd: support negative boolean command-line optionals (`issue#13784 <http://tracker.ceph.com/issues/13784>`_, `pr#6607 <http://github.com/ceph/ceph/pull/6607>`_, Jason Dillaman)
+* rbd: unbreak rbd map + cephx_sign_messages option (`pr#6583 <http://github.com/ceph/ceph/pull/6583>`_, Ilya Dryomov)
+* rgw: bucket request payment support (`issue#13427 <http://tracker.ceph.com/issues/13427>`_, `pr#6214 <http://github.com/ceph/ceph/pull/6214>`_, Javier M. Mellid)
+* rgw: extend rgw_extended_http_attrs to affect Swift accounts and containers as well (`pr#5969 <http://github.com/ceph/ceph/pull/5969>`_, Radoslaw Zarzynski)
+* rgw: fix openssl linkage (`pr#6513 <http://github.com/ceph/ceph/pull/6513>`_, Yehuda Sadeh)
+* rgw: fix partial read issue in rgw_admin and rgw_tools (`pr#6761 <http://github.com/ceph/ceph/pull/6761>`_, Jiaying Ren)
+* rgw: fix reload on non Debian systems. (`pr#6482 <http://github.com/ceph/ceph/pull/6482>`_, Hervé Rousseau)
+* rgw: fix response of delete expired objects (`issue#13469 <http://tracker.ceph.com/issues/13469>`_, `pr#6228 <http://github.com/ceph/ceph/pull/6228>`_, Yuan Zhou)
+* rgw: fix swift API returning incorrect account metadata (`issue#13140 <http://tracker.ceph.com/issues/13140>`_, `pr#6047 <http://github.com/ceph/ceph/pull/6047>`_, Sangdi Xu)
+* rgw: link against system openssl (instead of dlopen at runtime) (`pr#6419 <http://github.com/ceph/ceph/pull/6419>`_, Sage Weil)
+* rgw: prevent anonymous user from reading bucket with authenticated read ACL (`issue#13207 <http://tracker.ceph.com/issues/13207>`_, `pr#6057 <http://github.com/ceph/ceph/pull/6057>`_, root)
+* rgw: use smart pointer for C_Reinitwatch (`pr#6767 <http://github.com/ceph/ceph/pull/6767>`_, Orit Wasserman)
+* systemd: fix typos (`pr#6679 <http://github.com/ceph/ceph/pull/6679>`_, Tobias Suckow)
+* tests: centos7 needs the Continuous Release (CR) Repository enabled for (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6842 <http://github.com/ceph/ceph/pull/6842>`_, Brad Hubbard)
+* tests: concatenate test_rados_test_tool from src and qa (`issue#13691 <http://tracker.ceph.com/issues/13691>`_, `pr#6464 <http://github.com/ceph/ceph/pull/6464>`_, Loic Dachary)
+* tests: fix test_rados_tools.sh rados lookup (`issue#13691 <http://tracker.ceph.com/issues/13691>`_, `pr#6502 <http://github.com/ceph/ceph/pull/6502>`_, Loic Dachary)
+* tests: fix typo in TestClsRbd.snapshots test case (`issue#13727 <http://tracker.ceph.com/issues/13727>`_, `pr#6504 <http://github.com/ceph/ceph/pull/6504>`_, Jason Dillaman)
+* tests: ignore test-suite.log (`pr#6584 <http://github.com/ceph/ceph/pull/6584>`_, Loic Dachary)
+* tests: restore run-cli-tests (`pr#6571 <http://github.com/ceph/ceph/pull/6571>`_, Loic Dachary, Sage Weil, Jason Dillaman)
+* tools/cephfs: fix overflow writing header to fixed size buffer (#13816) (`pr#6617 <http://github.com/ceph/ceph/pull/6617>`_, John Spray)
+* build: cmake tweaks (`pr#6254 <http://github.com/ceph/ceph/pull/6254>`_, John Spray)
+* build: more CMake package check fixes (`pr#6108 <http://github.com/ceph/ceph/pull/6108>`_, Daniel Gryniewicz)
+* auth: fail if rotating key is missing (do not spam log) (`pr#6473 <http://github.com/ceph/ceph/pull/6473>`_, Qiankun Zheng)
+* auth: fix crash when bad keyring is passed (`pr#6698 <http://github.com/ceph/ceph/pull/6698>`_, Dunrong Huang)
+* auth: make keyring without mon entity type return -EACCES (`pr#5734 <http://github.com/ceph/ceph/pull/5734>`_, Xiaowei Chen)
+* buffer: make usable outside of ceph source again (`pr#6863 <http://github.com/ceph/ceph/pull/6863>`_, Josh Durgin)
+* build: cmake check fixes (`pr#6787 <http://github.com/ceph/ceph/pull/6787>`_, Orit Wasserman)
+* build: fix bz2-dev dependency (`pr#6948 <http://github.com/ceph/ceph/pull/6948>`_, Samuel Just)
+* build: Gentoo: _FORTIFY_SOURCE fix. (`issue#13920 <http://tracker.ceph.com/issues/13920>`_, `pr#6739 <http://github.com/ceph/ceph/pull/6739>`_, Robin H. Johnson)
+* build/ops: systemd ceph-disk unit must not assume /bin/flock (`issue#13975 <http://tracker.ceph.com/issues/13975>`_, `pr#6803 <http://github.com/ceph/ceph/pull/6803>`_, Loic Dachary)
+* ceph-detect-init: Ubuntu >= 15.04 uses systemd (`pr#6873 <http://github.com/ceph/ceph/pull/6873>`_, James Page)
+* cephfs-data-scan: scan_frags (`pr#5941 <http://github.com/ceph/ceph/pull/5941>`_, John Spray)
+* cephfs-data-scan: scrub tag filtering (#12133 and #12145) (`issue#12133 <http://tracker.ceph.com/issues/12133>`_, `issue#12145 <http://tracker.ceph.com/issues/12145>`_, `pr#5685 <http://github.com/ceph/ceph/pull/5685>`_, John Spray)
+* ceph-fuse: add process to ceph-fuse --help (`pr#6821 <http://github.com/ceph/ceph/pull/6821>`_, Wei Feng)
+* ceph-kvstore-tool: handle bad out file on command line (`pr#6093 <http://github.com/ceph/ceph/pull/6093>`_, Kefu Chai)
+* ceph-mds:add --help/-h (`pr#6850 <http://github.com/ceph/ceph/pull/6850>`_, Cilang Zhao)
+* ceph_objectstore_bench: fix race condition, bugs (`issue#13516 <http://tracker.ceph.com/issues/13516>`_, `pr#6681 <http://github.com/ceph/ceph/pull/6681>`_, Igor Fedotov)
+* ceph.spec.in: add BuildRequires: systemd (`issue#13860 <http://tracker.ceph.com/issues/13860>`_, `pr#6692 <http://github.com/ceph/ceph/pull/6692>`_, Nathan Cutler)
+* client: a better check for MDS availability (`pr#6253 <http://github.com/ceph/ceph/pull/6253>`_, John Spray)
+* client: close mds sessions in shutdown() (`pr#6269 <http://github.com/ceph/ceph/pull/6269>`_, John Spray)
+* client: don't invalidate page cache when inode is no longer used (`pr#6380 <http://github.com/ceph/ceph/pull/6380>`_, Yan, Zheng)
+* client: modify a word in log (`pr#6906 <http://github.com/ceph/ceph/pull/6906>`_, YongQiang He)
+* cls/cls_rbd.cc: fix misused metadata_name_from_key (`issue#13922 <http://tracker.ceph.com/issues/13922>`_, `pr#6661 <http://github.com/ceph/ceph/pull/6661>`_, Xiaoxi Chen)
+* cmake: Add common/PluginRegistry.cc to CMakeLists.txt (`pr#6805 <http://github.com/ceph/ceph/pull/6805>`_, Pete Zaitcev)
+* cmake: add rgw_basic_types.cc to librgw.a (`pr#6786 <http://github.com/ceph/ceph/pull/6786>`_, Orit Wasserman)
+* cmake: add TracepointProvider.cc to libcommon (`pr#6823 <http://github.com/ceph/ceph/pull/6823>`_, Orit Wasserman)
+* cmake: define STRERROR_R_CHAR_P for GNU-specific strerror_r (`pr#6751 <http://github.com/ceph/ceph/pull/6751>`_, Ilya Dryomov)
+* cmake: update for recent librbd changes (`pr#6715 <http://github.com/ceph/ceph/pull/6715>`_, John Spray)
+* cmake: update for recent rbd changes (`pr#6818 <http://github.com/ceph/ceph/pull/6818>`_, Mykola Golub)
+* common: add generic plugin infrastructure (`pr#6696 <http://github.com/ceph/ceph/pull/6696>`_, Sage Weil)
+* common: add latency perf counter for finisher (`pr#6175 <http://github.com/ceph/ceph/pull/6175>`_, Xinze Chi)
+* common: buffer: add cached_crc and cached_crc_adjust counts to perf dump (`pr#6535 <http://github.com/ceph/ceph/pull/6535>`_, Ning Yao)
+* common: buffer: remove unneeded list destructor (`pr#6456 <http://github.com/ceph/ceph/pull/6456>`_, Michal Jarzabek)
+* common/ceph_context.cc:fix order of initialisers (`pr#6838 <http://github.com/ceph/ceph/pull/6838>`_, Michal Jarzabek)
+* common: don't reverse hobject_t hash bits when zero (`pr#6653 <http://github.com/ceph/ceph/pull/6653>`_, Piotr Dałek)
+* common: log: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6815 <http://github.com/ceph/ceph/pull/6815>`_, Brad Hubbard)
+* common: log: predict log message buffer allocation size (`pr#6641 <http://github.com/ceph/ceph/pull/6641>`_, Adam Kupczyk)
+* common: optimize debug logging code (`pr#6441 <http://github.com/ceph/ceph/pull/6441>`_, Adam Kupczyk)
+* common: perf counter for bufferlist history total alloc (`pr#6198 <http://github.com/ceph/ceph/pull/6198>`_, Xinze Chi)
+* common: reduce CPU usage by making stringstream in stringify function thread local (`pr#6543 <http://github.com/ceph/ceph/pull/6543>`_, Evgeniy Firsov)
+* common: re-enable backtrace support (`pr#6771 <http://github.com/ceph/ceph/pull/6771>`_, Jason Dillaman)
+* common: SubProcess: fix multiple definition bug (`pr#6790 <http://github.com/ceph/ceph/pull/6790>`_, Yunchuan Wen)
+* common: use namespace instead of subclasses for buffer (`pr#6686 <http://github.com/ceph/ceph/pull/6686>`_, Michal Jarzabek)
+* configure.ac: macro fix (`pr#6769 <http://github.com/ceph/ceph/pull/6769>`_, Igor Podoski)
+* doc: admin/build-doc: add lxml dependencies on debian (`pr#6610 <http://github.com/ceph/ceph/pull/6610>`_, Ken Dreyer)
+* doc/cephfs/posix: update (`pr#6922 <http://github.com/ceph/ceph/pull/6922>`_, Sage Weil)
+* doc: CodingStyle: fix broken URLs (`pr#6733 <http://github.com/ceph/ceph/pull/6733>`_, Kefu Chai)
+* doc: correct typo 'restared' to 'restarted' (`pr#6734 <http://github.com/ceph/ceph/pull/6734>`_, Yilong Zhao)
+* doc/dev/index: refactor/reorg (`pr#6792 <http://github.com/ceph/ceph/pull/6792>`_, Nathan Cutler)
+* doc/dev/index.rst: begin writing Contributing to Ceph (`pr#6727 <http://github.com/ceph/ceph/pull/6727>`_, Nathan Cutler)
+* doc/dev/index.rst: fix headings (`pr#6780 <http://github.com/ceph/ceph/pull/6780>`_, Nathan Cutler)
+* doc: dev: introduction to tests (`pr#6910 <http://github.com/ceph/ceph/pull/6910>`_, Loic Dachary)
+* doc: file must be empty when writing layout fields of file use "setfattr" (`pr#6848 <http://github.com/ceph/ceph/pull/6848>`_, Cilang Zhao)
+* doc: Fixed incorrect name of a "List Multipart Upload Parts" Response Entity (`issue#14003 <http://tracker.ceph.com/issues/14003>`_, `pr#6829 <http://github.com/ceph/ceph/pull/6829>`_, Lenz Grimmer)
+* doc: Fixes a spelling error (`pr#6705 <http://github.com/ceph/ceph/pull/6705>`_, Jeremy Qian)
+* doc: fix typo in cephfs/quota (`pr#6745 <http://github.com/ceph/ceph/pull/6745>`_, Drunkard Zhang)
+* doc: fix typo in developer guide (`pr#6943 <http://github.com/ceph/ceph/pull/6943>`_, Nathan Cutler)
+* doc: INSTALL redirect to online documentation (`pr#6749 <http://github.com/ceph/ceph/pull/6749>`_, Loic Dachary)
+* doc: little improvements for troubleshooting scrub issues (`pr#6827 <http://github.com/ceph/ceph/pull/6827>`_, Mykola Golub)
+* doc: Modified a note section in rbd-snapshot doc. (`pr#6908 <http://github.com/ceph/ceph/pull/6908>`_, Nilamdyuti Goswami)
+* doc: note that cephfs auth stuff is new in jewel (`pr#6858 <http://github.com/ceph/ceph/pull/6858>`_, John Spray)
+* doc: osd: s/schedued/scheduled/ (`pr#6872 <http://github.com/ceph/ceph/pull/6872>`_, Loic Dachary)
+* doc: remove unnecessary period in headline (`pr#6775 <http://github.com/ceph/ceph/pull/6775>`_, Marc Koderer)
+* doc: rst style fix for pools document (`pr#6816 <http://github.com/ceph/ceph/pull/6816>`_, Drunkard Zhang)
+* doc: Update list of admin/build-doc dependencies (`issue#14070 <http://tracker.ceph.com/issues/14070>`_, `pr#6934 <http://github.com/ceph/ceph/pull/6934>`_, Nathan Cutler)
+* init-ceph: do umount when the path exists. (`pr#6866 <http://github.com/ceph/ceph/pull/6866>`_, Xiaoxi Chen)
+* journal: disconnect watch after watch error (`issue#14168 <http://tracker.ceph.com/issues/14168>`_, `pr#7113 <http://github.com/ceph/ceph/pull/7113>`_, Jason Dillaman)
+* journal: fire replay complete event after reading last object (`issue#13924 <http://tracker.ceph.com/issues/13924>`_, `pr#6762 <http://github.com/ceph/ceph/pull/6762>`_, Jason Dillaman)
+* journal: support replaying beyond skipped splay objects (`pr#6687 <http://github.com/ceph/ceph/pull/6687>`_, Jason Dillaman)
+* librados: aix gcc librados port (`pr#6675 <http://github.com/ceph/ceph/pull/6675>`_, Rohan Mars)
+* librados: avoid malloc(0) (which can return NULL on some platforms) (`issue#13944 <http://tracker.ceph.com/issues/13944>`_, `pr#6779 <http://github.com/ceph/ceph/pull/6779>`_, Dan Mick)
+* librados: clean up Objecter.h (`pr#6731 <http://github.com/ceph/ceph/pull/6731>`_, Jie Wang)
+* librados: include/rados/librados.h: fix typo (`pr#6741 <http://github.com/ceph/ceph/pull/6741>`_, Nathan Cutler)
+* librbd: automatically flush IO after blocking write operations (`issue#13913 <http://tracker.ceph.com/issues/13913>`_, `pr#6742 <http://github.com/ceph/ceph/pull/6742>`_, Jason Dillaman)
+* librbd: better handling of exclusive lock transition period (`pr#7204 <http://github.com/ceph/ceph/pull/7204>`_, Jason Dillaman)
+* librbd: check for presence of journal before attempting to remove  (`issue#13912 <http://tracker.ceph.com/issues/13912>`_, `pr#6737 <http://github.com/ceph/ceph/pull/6737>`_, Jason Dillaman)
+* librbd: clear error when older OSD doesn't support image flags (`issue#14122 <http://tracker.ceph.com/issues/14122>`_, `pr#7035 <http://github.com/ceph/ceph/pull/7035>`_, Jason Dillaman)
+* librbd: correct include guard in RenameRequest.h (`pr#7143 <http://github.com/ceph/ceph/pull/7143>`_, Jason Dillaman)
+* librbd: correct issues discovered during teuthology testing (`issue#14108 <http://tracker.ceph.com/issues/14108>`_, `issue#14107 <http://tracker.ceph.com/issues/14107>`_, `pr#6974 <http://github.com/ceph/ceph/pull/6974>`_, Jason Dillaman)
+* librbd: correct issues discovered when cache is disabled (`issue#14123 <http://tracker.ceph.com/issues/14123>`_, `pr#6979 <http://github.com/ceph/ceph/pull/6979>`_, Jason Dillaman)
+* librbd: correct race conditions discovered during unit testing (`issue#14060 <http://tracker.ceph.com/issues/14060>`_, `pr#6923 <http://github.com/ceph/ceph/pull/6923>`_, Jason Dillaman)
+* librbd: disable copy-on-read when not exclusive lock owner (`issue#14167 <http://tracker.ceph.com/issues/14167>`_, `pr#7129 <http://github.com/ceph/ceph/pull/7129>`_, Jason Dillaman)
+* librbd: do not ignore self-managed snapshot release result (`issue#14170 <http://tracker.ceph.com/issues/14170>`_, `pr#7043 <http://github.com/ceph/ceph/pull/7043>`_, Jason Dillaman)
+* librbd: ensure copy-on-read requests are complete prior to closing parent image  (`pr#6740 <http://github.com/ceph/ceph/pull/6740>`_, Jason Dillaman)
+* librbd: ensure librados callbacks are flushed prior to destroying (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `pr#7040 <http://github.com/ceph/ceph/pull/7040>`_, Jason Dillaman)
+* librbd: fix journal iohint (`pr#6917 <http://github.com/ceph/ceph/pull/6917>`_, Jianpeng Ma)
+* librbd: fix known test case race condition failures (`issue#13969 <http://tracker.ceph.com/issues/13969>`_, `pr#6800 <http://github.com/ceph/ceph/pull/6800>`_, Jason Dillaman)
+* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6889 <http://github.com/ceph/ceph/pull/6889>`_, Yunchuan Wen)
+* librbd: fix test case race condition for journaling ops (`pr#6877 <http://github.com/ceph/ceph/pull/6877>`_, Jason Dillaman)
+* librbd: fix tracepoint parameter in diff_iterate (`pr#6892 <http://github.com/ceph/ceph/pull/6892>`_, Yunchuan Wen)
+* librbd: image refresh code paths converted to async state machines (`pr#6859 <http://github.com/ceph/ceph/pull/6859>`_, Jason Dillaman)
+* librbd: include missing header for bool type (`pr#6798 <http://github.com/ceph/ceph/pull/6798>`_, Mykola Golub)
+* librbd: initial collection of state machine unit tests (`pr#6703 <http://github.com/ceph/ceph/pull/6703>`_, Jason Dillaman)
+* librbd: integrate journaling for maintenance operations (`pr#6625 <http://github.com/ceph/ceph/pull/6625>`_, Jason Dillaman)
+* librbd: journaling-related lock dependency cleanup (`pr#6777 <http://github.com/ceph/ceph/pull/6777>`_, Jason Dillaman)
+* librbd: not necessary to hold owner_lock while releasing snap id (`issue#13914 <http://tracker.ceph.com/issues/13914>`_, `pr#6736 <http://github.com/ceph/ceph/pull/6736>`_, Jason Dillaman)
+* librbd: only send signal when AIO completions queue empty (`pr#6729 <http://github.com/ceph/ceph/pull/6729>`_, Jianpeng Ma)
+* librbd: optionally validate new RBD pools for snapshot support (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#6925 <http://github.com/ceph/ceph/pull/6925>`_, Jason Dillaman)
+* librbd: partial revert of commit 9b0e359 (`issue#13969 <http://tracker.ceph.com/issues/13969>`_, `pr#6789 <http://github.com/ceph/ceph/pull/6789>`_, Jason Dillaman)
+* librbd: properly handle replay of snap remove RPC message (`issue#14164 <http://tracker.ceph.com/issues/14164>`_, `pr#7042 <http://github.com/ceph/ceph/pull/7042>`_, Jason Dillaman)
+* librbd: reduce verbosity of common error condition logging (`issue#14234 <http://tracker.ceph.com/issues/14234>`_, `pr#7114 <http://github.com/ceph/ceph/pull/7114>`_, Jason Dillaman)
+* librbd: simplify IO method signatures for 32bit environments (`pr#6700 <http://github.com/ceph/ceph/pull/6700>`_, Jason Dillaman)
+* librbd: support eventfd for AIO completion notifications (`pr#5465 <http://github.com/ceph/ceph/pull/5465>`_, Haomai Wang)
+* mailmap: add UMCloud affiliation (`pr#6820 <http://github.com/ceph/ceph/pull/6820>`_, Jiaying Ren)
+* mailmap: Jewel updates (`pr#6750 <http://github.com/ceph/ceph/pull/6750>`_, Abhishek Lekshmanan)
+* makefiles: remove bz2-dev from dependencies (`issue#13981 <http://tracker.ceph.com/issues/13981>`_, `pr#6939 <http://github.com/ceph/ceph/pull/6939>`_, Piotr Dałek)
+* mds: add 'p' flag in auth caps to control setting pool in layout (`pr#6567 <http://github.com/ceph/ceph/pull/6567>`_, John Spray)
+* mds: fix client capabilities during reconnect (client.XXXX isn't responding to mclientcaps(revoke)) (`issue#11482 <http://tracker.ceph.com/issues/11482>`_, `pr#6432 <http://github.com/ceph/ceph/pull/6432>`_, Yan, Zheng)
+* mds: fix setvxattr (broken in a536d114) (`issue#14029 <http://tracker.ceph.com/issues/14029>`_, `pr#6941 <http://github.com/ceph/ceph/pull/6941>`_, John Spray)
+* mds: repair the command option "--hot-standby" (`pr#6454 <http://github.com/ceph/ceph/pull/6454>`_, Wei Feng)
+* mds: tear down connections from `tell` commands (`issue#14048 <http://tracker.ceph.com/issues/14048>`_, `pr#6933 <http://github.com/ceph/ceph/pull/6933>`_, John Spray)
+* mon: fix ceph df pool available calculation for 0-weighted OSDs (`pr#6660 <http://github.com/ceph/ceph/pull/6660>`_, Chengyuan Li)
+* mon: fix routed_request_tids leak (`pr#6102 <http://github.com/ceph/ceph/pull/6102>`_, Ning Yao)
+* mon: support min_down_reporter by subtree level (default by host) (`pr#6709 <http://github.com/ceph/ceph/pull/6709>`_, Xiaoxi Chen)
+* mount.ceph: memory leaks (`pr#6905 <http://github.com/ceph/ceph/pull/6905>`_, Qiankun Zheng)
+* osd: add osd op queue latency perfcounter (`pr#5793 <http://github.com/ceph/ceph/pull/5793>`_, Haomai Wang)
+* osd: Allow repair of history.last_epoch_started using config (`pr#6793 <http://github.com/ceph/ceph/pull/6793>`_, David Zafman)
+* osd: avoid duplicate op->mark_started in ReplicatedBackend (`pr#6689 <http://github.com/ceph/ceph/pull/6689>`_, Jacek J. Łakis)
+* osd: cancel failure reports if we fail to rebind network (`pr#6278 <http://github.com/ceph/ceph/pull/6278>`_, Xinze Chi)
+* osd: correctly handle small osd_scrub_interval_randomize_ratio (`pr#7147 <http://github.com/ceph/ceph/pull/7147>`_, Samuel Just)
+* osd: defer decoding of MOSDRepOp/MOSDRepOpReply (`pr#6503 <http://github.com/ceph/ceph/pull/6503>`_, Xinze Chi)
+* osd: don't update epoch and rollback_info objects attrs if there is no need (`pr#6555 <http://github.com/ceph/ceph/pull/6555>`_, Ning Yao)
+* osd: dump number of missing objects for each peer with pg query (`pr#6058 <http://github.com/ceph/ceph/pull/6058>`_, Guang Yang)
+* osd: enable perfcounters on sharded work queue mutexes (`pr#6455 <http://github.com/ceph/ceph/pull/6455>`_, Jacek J. Łakis)
+* osd: FileJournal: reduce locking scope in write_aio_bl (`issue#12789 <http://tracker.ceph.com/issues/12789>`_, `pr#5670 <http://github.com/ceph/ceph/pull/5670>`_, Zhi Zhang)
+* osd: FileStore: remove __SWORD_TYPE dependency (`pr#6263 <http://github.com/ceph/ceph/pull/6263>`_, John Coyle)
+* osd: fix FileStore::_destroy_collection error return code (`pr#6612 <http://github.com/ceph/ceph/pull/6612>`_, Ruifeng Yang)
+* osd: fix incorrect throttle in WBThrottle (`pr#6713 <http://github.com/ceph/ceph/pull/6713>`_, Zhang Huan)
+* osd: fix MOSDRepScrub reference counter in replica_scrub (`pr#6730 <http://github.com/ceph/ceph/pull/6730>`_, Jie Wang)
+* osd: fix rollback_info_trimmed_to before index() (`issue#13965 <http://tracker.ceph.com/issues/13965>`_, `pr#6801 <http://github.com/ceph/ceph/pull/6801>`_, Samuel Just)
+* osd: fix trivial scrub bug (`pr#6533 <http://github.com/ceph/ceph/pull/6533>`_, Li Wang)
+* osd: KeyValueStore: don't queue NULL context (`pr#6783 <http://github.com/ceph/ceph/pull/6783>`_, Haomai Wang)
+* osd: make backend and block device code a bit more generic (`pr#6759 <http://github.com/ceph/ceph/pull/6759>`_, Sage Weil)
+* osd: move newest decode version of MOSDOp and MOSDOpReply to the front (`pr#6642 <http://github.com/ceph/ceph/pull/6642>`_, Jacek J. Łakis)
+* osd: pg_pool_t: add dictionary for pool options (`issue#13077 <http://tracker.ceph.com/issues/13077>`_, `pr#6081 <http://github.com/ceph/ceph/pull/6081>`_, Mykola Golub)
+* osd: reduce memory consumption of some structs (`pr#6475 <http://github.com/ceph/ceph/pull/6475>`_, Piotr Dałek)
+* osd: release the message throttle when OpRequest unregistered (`issue#14248 <http://tracker.ceph.com/issues/14248>`_, `pr#7148 <http://github.com/ceph/ceph/pull/7148>`_, Samuel Just)
+* osd: remove __SWORD_TYPE dependency (`pr#6262 <http://github.com/ceph/ceph/pull/6262>`_, John Coyle)
+* osd: slightly reduce actual size of pg_log_entry_t (`pr#6690 <http://github.com/ceph/ceph/pull/6690>`_, Piotr Dałek)
+* osd: support pool level recovery_priority and recovery_op_priority (`pr#5953 <http://github.com/ceph/ceph/pull/5953>`_, Guang Yang)
+* osd: use pg id (without shard) when referring the PG (`pr#6236 <http://github.com/ceph/ceph/pull/6236>`_, Guang Yang)
+* packaging: add build dependency on python devel package (`pr#7205 <http://github.com/ceph/ceph/pull/7205>`_, Josh Durgin)
+* pybind/cephfs: add symlink and its unit test (`pr#6323 <http://github.com/ceph/ceph/pull/6323>`_, Shang Ding)
+* pybind: decode empty string in conf_parse_argv() correctly (`pr#6711 <http://github.com/ceph/ceph/pull/6711>`_, Josh Durgin)
+* pybind: Implementation of rados_ioctx_snapshot_rollback (`pr#6878 <http://github.com/ceph/ceph/pull/6878>`_, Florent Manens)
+* pybind: port the rbd bindings to Cython (`issue#13115 <http://tracker.ceph.com/issues/13115>`_, `pr#6768 <http://github.com/ceph/ceph/pull/6768>`_, Hector Martin)
+* pybind: support ioctx:exec (`pr#6795 <http://github.com/ceph/ceph/pull/6795>`_, Noah Watkins)
+* qa: erasure-code benchmark plugin selection (`pr#6685 <http://github.com/ceph/ceph/pull/6685>`_, Loic Dachary)
+* qa/krbd: Expunge generic/247 (`pr#6831 <http://github.com/ceph/ceph/pull/6831>`_, Douglas Fuller)
+* qa/workunits/cephtool/test.sh: false positive fail on /tmp/obj1. (`pr#6837 <http://github.com/ceph/ceph/pull/6837>`_, Robin H. Johnson)
+* qa/workunits/cephtool/test.sh: no ./ (`pr#6748 <http://github.com/ceph/ceph/pull/6748>`_, Sage Weil)
+* qa/workunits/rbd: rbd-nbd test should use sudo for map/unmap ops (`issue#14221 <http://tracker.ceph.com/issues/14221>`_, `pr#7101 <http://github.com/ceph/ceph/pull/7101>`_, Jason Dillaman)
+* rados: bench: fix off-by-one to avoid writing past object_size (`pr#6677 <http://github.com/ceph/ceph/pull/6677>`_, Tao Chang)
+* rbd: add --object-size option, deprecate --order (`issue#12112 <http://tracker.ceph.com/issues/12112>`_, `pr#6830 <http://github.com/ceph/ceph/pull/6830>`_, Vikhyat Umrao)
+* rbd: add RBD pool mirroring configuration API + CLI (`pr#6129 <http://github.com/ceph/ceph/pull/6129>`_, Jason Dillaman)
+* rbd: fix build with "--without-rbd" (`issue#14058 <http://tracker.ceph.com/issues/14058>`_, `pr#6899 <http://github.com/ceph/ceph/pull/6899>`_, Piotr Dałek)
+* rbd: journal: configuration via conf, cli, api and some fixes (`pr#6665 <http://github.com/ceph/ceph/pull/6665>`_, Mykola Golub)
+* rbd: merge_diff test should use new --object-size parameter instead of --order (`issue#14106 <http://tracker.ceph.com/issues/14106>`_, `pr#6972 <http://github.com/ceph/ceph/pull/6972>`_, Na Xie, Jason Dillaman)
+* rbd-nbd: network block device (NBD) support for RBD  (`pr#6657 <http://github.com/ceph/ceph/pull/6657>`_, Yunchuan Wen, Li Wang)
+* rbd: output formatter may not be closed upon error (`issue#13711 <http://tracker.ceph.com/issues/13711>`_, `pr#6706 <http://github.com/ceph/ceph/pull/6706>`_, xie xingguo)
+* rgw: add a missing cap type (`pr#6774 <http://github.com/ceph/ceph/pull/6774>`_, Yehuda Sadeh)
+* rgw: add an inspection to the field of type when assigning user caps (`pr#6051 <http://github.com/ceph/ceph/pull/6051>`_, Kongming Wu)
+* rgw: add LifeCycle feature (`pr#6331 <http://github.com/ceph/ceph/pull/6331>`_, Ji Chen)
+* rgw: add support for Static Large Objects of Swift API (`issue#12886 <http://tracker.ceph.com/issues/12886>`_, `issue#13452 <http://tracker.ceph.com/issues/13452>`_, `pr#6643 <http://github.com/ceph/ceph/pull/6643>`_, Yehuda Sadeh, Radoslaw Zarzynski)
+* rgw: fix a glaring syntax error (`pr#6888 <http://github.com/ceph/ceph/pull/6888>`_, Pavan Rallabhandi)
+* rgw: fix the build failure (`pr#6927 <http://github.com/ceph/ceph/pull/6927>`_, Kefu Chai)
+* rgw: multitenancy support (`pr#6784 <http://github.com/ceph/ceph/pull/6784>`_, Yehuda Sadeh, Pete Zaitcev)
+* rgw: Remove unused code in PutMetadataAccount:execute (`pr#6668 <http://github.com/ceph/ceph/pull/6668>`_, Pete Zaitcev)
+* rgw: remove unused variable in RGWPutMetadataBucket::execute (`pr#6735 <http://github.com/ceph/ceph/pull/6735>`_, Radoslaw Zarzynski)
+* rgw/rgw_resolve: fallback to res_query when res_nquery not implemented (`pr#6292 <http://github.com/ceph/ceph/pull/6292>`_, John Coyle)
+* rgw: static large objects (Radoslaw Zarzynski, Yehuda Sadeh)
+* rgw: swift bulk delete (Radoslaw Zarzynski)
+* systemd: start/stop/restart ceph services by daemon type (`issue#13497 <http://tracker.ceph.com/issues/13497>`_, `pr#6276 <http://github.com/ceph/ceph/pull/6276>`_, Zhi Zhang)
+* sysvinit: allow custom cluster names (`pr#6732 <http://github.com/ceph/ceph/pull/6732>`_, Richard Chan)
+* test/encoding/readable.sh fix (`pr#6714 <http://github.com/ceph/ceph/pull/6714>`_, Igor Podoski)
+* test: fix osd-scrub-snaps.sh (`pr#6697 <http://github.com/ceph/ceph/pull/6697>`_, Xinze Chi)
+* test/librados/test.cc: clean up EC pools' crush rules too (`issue#13878 <http://tracker.ceph.com/issues/13878>`_, `pr#6788 <http://github.com/ceph/ceph/pull/6788>`_, Loic Dachary, Dan Mick)
+* tests: allow object corpus readable test to skip specific incompat instances (`pr#6932 <http://github.com/ceph/ceph/pull/6932>`_, Igor Podoski)
+* tests: ceph-helpers assert success getting backfills (`pr#6699 <http://github.com/ceph/ceph/pull/6699>`_, Loic Dachary)
+* tests: ceph_test_keyvaluedb_iterators: fix broken test (`pr#6597 <http://github.com/ceph/ceph/pull/6597>`_, Haomai Wang)
+* tests: fix failure for osd-scrub-snap.sh (`issue#13986 <http://tracker.ceph.com/issues/13986>`_, `pr#6890 <http://github.com/ceph/ceph/pull/6890>`_, Loic Dachary, Ning Yao)
+* tests: fix race condition testing auto scrub (`issue#13592 <http://tracker.ceph.com/issues/13592>`_, `pr#6724 <http://github.com/ceph/ceph/pull/6724>`_, Xinze Chi, Loic Dachary)
+* tests: flush op work queue prior to destroying MockImageCtx (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `pr#7002 <http://github.com/ceph/ceph/pull/7002>`_, Jason Dillaman)
+* tests: --osd-scrub-load-threshold=2000 for more consistency (`issue#14027 <http://tracker.ceph.com/issues/14027>`_, `pr#6871 <http://github.com/ceph/ceph/pull/6871>`_, Loic Dachary)
+* tests: osd-scrub-snaps.sh to display full osd logs on error (`issue#13986 <http://tracker.ceph.com/issues/13986>`_, `pr#6857 <http://github.com/ceph/ceph/pull/6857>`_, Loic Dachary)
+* test: use sequential journal_tid for object cacher test (`issue#13877 <http://tracker.ceph.com/issues/13877>`_, `pr#6710 <http://github.com/ceph/ceph/pull/6710>`_, Josh Durgin)
+* tools: add cephfs-table-tool 'take_inos' (`pr#6655 <http://github.com/ceph/ceph/pull/6655>`_, John Spray)
+* tools: Fix layout handing in cephfs-data-scan (#13898) (`pr#6719 <http://github.com/ceph/ceph/pull/6719>`_, John Spray)
+* tools: support printing part cluster map in readable fashion (`issue#13079 <http://tracker.ceph.com/issues/13079>`_, `pr#5921 <http://github.com/ceph/ceph/pull/5921>`_, Bo Cai)
+* vstart.sh: add mstart, mstop, mrun wrappers for running multiple vstart-style test clusters out of src tree (`pr#6901 <http://github.com/ceph/ceph/pull/6901>`_, Yehuda Sadeh)
+* bluestore: latest and greatest (`issue#14210 <http://tracker.ceph.com/issues/14210>`_, `issue#13801 <http://tracker.ceph.com/issues/13801>`_, `pr#6896 <http://github.com/ceph/ceph/pull/6896>`_, xie.xingguo, Jianpeng Ma, YiQiang Chen, Sage Weil, Ning Yao)
+* buffer: fix internal iterator invalidation on rebuild, get_contiguous (`pr#6962 <http://github.com/ceph/ceph/pull/6962>`_, Sage Weil)
+* build: fix a few warnings (`pr#6847 <http://github.com/ceph/ceph/pull/6847>`_, Orit Wasserman)
+* build: misc make check fixes (`pr#7153 <http://github.com/ceph/ceph/pull/7153>`_, Sage Weil)
+* ceph-detect-init: fix py3 test (`pr#7025 <http://github.com/ceph/ceph/pull/7025>`_, Kefu Chai)
+* ceph-disk: add -f flag for btrfs mkfs (`pr#7222 <http://github.com/ceph/ceph/pull/7222>`_, Darrell Enns)
+* ceph-disk: ceph-disk list fails on /dev/cciss!c0d0 (`issue#13970 <http://tracker.ceph.com/issues/13970>`_, `issue#14233 <http://tracker.ceph.com/issues/14233>`_, `issue#14230 <http://tracker.ceph.com/issues/14230>`_, `pr#6879 <http://github.com/ceph/ceph/pull/6879>`_, Loic Dachary)
+* ceph-disk: fix failures when preparing disks with udev > 214 (`issue#14080 <http://tracker.ceph.com/issues/14080>`_, `issue#14094 <http://tracker.ceph.com/issues/14094>`_, `pr#6926 <http://github.com/ceph/ceph/pull/6926>`_, Loic Dachary, Ilya Dryomov)
+* ceph-disk: Fix trivial typo (`pr#7472 <http://github.com/ceph/ceph/pull/7472>`_, Brad Hubbard)
+* ceph-disk: warn for prepare partitions with bad GUIDs (`issue#13943 <http://tracker.ceph.com/issues/13943>`_, `pr#6760 <http://github.com/ceph/ceph/pull/6760>`_, David Disseldorp)
+* ceph-fuse: fix double decreasing the count to trim caps (`issue#14319 <http://tracker.ceph.com/issues/14319>`_, `pr#7229 <http://github.com/ceph/ceph/pull/7229>`_, Zhi Zhang)
+* ceph-fuse: fix double free of args (`pr#7015 <http://github.com/ceph/ceph/pull/7015>`_, Ilya Shipitsin)
+* ceph-fuse: fix fsync() (`pr#6388 <http://github.com/ceph/ceph/pull/6388>`_, Yan, Zheng)
+* ceph-fuse:print usage information when no parameter specified (`pr#6868 <http://github.com/ceph/ceph/pull/6868>`_, Bo Cai)
+* ceph: improve the error message (`issue#11101 <http://tracker.ceph.com/issues/11101>`_, `pr#7106 <http://github.com/ceph/ceph/pull/7106>`_, Kefu Chai)
+* ceph.in: avoid a broken pipe error when use ceph command (`issue#14354 <http://tracker.ceph.com/issues/14354>`_, `pr#7212 <http://github.com/ceph/ceph/pull/7212>`_, Bo Cai)
+* ceph.spec.in: add copyright notice (`issue#14694 <http://tracker.ceph.com/issues/14694>`_, `pr#7569 <http://github.com/ceph/ceph/pull/7569>`_, Nathan Cutler)
+* ceph.spec.in: add license declaration (`pr#7574 <http://github.com/ceph/ceph/pull/7574>`_, Nathan Cutler)
+* ceph_test_libcephfs: tolerate duplicated entries in readdir (`issue#14377 <http://tracker.ceph.com/issues/14377>`_, `pr#7246 <http://github.com/ceph/ceph/pull/7246>`_, Yan, Zheng)
+* client: check if Fh is readable when processing a read (`issue#11517 <http://tracker.ceph.com/issues/11517>`_, `pr#7209 <http://github.com/ceph/ceph/pull/7209>`_, Yan, Zheng)
+* client: properly trim unlinked inode (`issue#13903 <http://tracker.ceph.com/issues/13903>`_, `pr#7297 <http://github.com/ceph/ceph/pull/7297>`_, Yan, Zheng)
+* cls_rbd: add guards for error cases (`issue#14316 <http://tracker.ceph.com/issues/14316>`_, `issue#14317 <http://tracker.ceph.com/issues/14317>`_, `pr#7165 <http://github.com/ceph/ceph/pull/7165>`_, xie xingguo)
+* cls_rbd: enable object map checksums for object_map_save (`issue#14280 <http://tracker.ceph.com/issues/14280>`_, `pr#7149 <http://github.com/ceph/ceph/pull/7149>`_, Douglas Fuller)
+* cmake: Add ENABLE_GIT_VERSION to avoid rebuilding (`pr#7171 <http://github.com/ceph/ceph/pull/7171>`_, Kefu Chai)
+* cmake: add missing check for HAVE_EXECINFO_H (`pr#7270 <http://github.com/ceph/ceph/pull/7270>`_, Casey Bodley)
+* cmake: cleanups and more features from automake (`pr#7103 <http://github.com/ceph/ceph/pull/7103>`_, Casey Bodley, Ali Maredia)
+* cmake: detect bzip2 and lz4 (`pr#7126 <http://github.com/ceph/ceph/pull/7126>`_, Kefu Chai)
+* cmake: fix build with bluestore (`pr#7099 <http://github.com/ceph/ceph/pull/7099>`_, John Spray)
+* cmake: fix the build on trusty (`pr#7249 <http://github.com/ceph/ceph/pull/7249>`_, Kefu Chai)
+* cmake: made rocksdb an imported library (`pr#7131 <http://github.com/ceph/ceph/pull/7131>`_, Ali Maredia)
+* cmake: no need to run configure from run-cmake-check.sh (`pr#6959 <http://github.com/ceph/ceph/pull/6959>`_, Orit Wasserman)
+* cmake: test_build_libcephfs needs ${ALLOC_LIBS} (`pr#7300 <http://github.com/ceph/ceph/pull/7300>`_, Ali Maredia)
+* common/address_help.cc: fix the leak in entity_addr_from_url() (`issue#14132 <http://tracker.ceph.com/issues/14132>`_, `pr#6987 <http://github.com/ceph/ceph/pull/6987>`_, Qiankun Zheng)
+* common: add thread names (`pr#5882 <http://github.com/ceph/ceph/pull/5882>`_, Igor Podoski)
+* common: assert: abort() rather than throw (`pr#6804 <http://github.com/ceph/ceph/pull/6804>`_, Adam C. Emerson)
+* common: buffer/assert minor fixes (`pr#6990 <http://github.com/ceph/ceph/pull/6990>`_, Matt Benjamin)
+* common/Formatter: avoid newline if there is no output (`pr#5351 <http://github.com/ceph/ceph/pull/5351>`_, Aran85)
+* common: improve shared_cache and simple_cache efficiency with hash table (`pr#6909 <http://github.com/ceph/ceph/pull/6909>`_, Ning Yao)
+* common/lockdep: increase max lock names (`pr#6961 <http://github.com/ceph/ceph/pull/6961>`_, Sage Weil)
+* common: new timekeeping common code, and Objecter conversion (`pr#5782 <http://github.com/ceph/ceph/pull/5782>`_, Adam C. Emerson)
+* common: signal_handler: added support for using reentrant strsignal() implementations vs. sys_siglist[] (`pr#6796 <http://github.com/ceph/ceph/pull/6796>`_, John Coyle)
+* config: complains when a setting is not tracked (`issue#11692 <http://tracker.ceph.com/issues/11692>`_, `pr#7085 <http://github.com/ceph/ceph/pull/7085>`_, Kefu Chai)
+* configure: detect bz2 and lz4 (`issue#13850 <http://tracker.ceph.com/issues/13850>`_, `issue#13981 <http://tracker.ceph.com/issues/13981>`_, `pr#7030 <http://github.com/ceph/ceph/pull/7030>`_, Kefu Chai)
+* correct radosgw-admin command (`pr#7006 <http://github.com/ceph/ceph/pull/7006>`_, YankunLi)
+* crush: add chooseleaf_stable tunable (`pr#6572 <http://github.com/ceph/ceph/pull/6572>`_, Sangdi Xu, Sage Weil)
+* crush: clean up whitespace removal (`issue#14302 <http://tracker.ceph.com/issues/14302>`_, `pr#7157 <http://github.com/ceph/ceph/pull/7157>`_, songbaisen)
+* crush/CrushTester: check for overlapped rules (`pr#7139 <http://github.com/ceph/ceph/pull/7139>`_, Kefu Chai)
+* crushtool: improve usage/tip messages (`pr#7142 <http://github.com/ceph/ceph/pull/7142>`_, xie xingguo)
+* crushtool: set type 0 name "device" for --build option (`pr#6824 <http://github.com/ceph/ceph/pull/6824>`_, Sangdi Xu)
+* doc: adding "--allow-shrink" in decreasing the size of the rbd block to distinguish from the increasing option (`pr#7020 <http://github.com/ceph/ceph/pull/7020>`_, Yehua)
+* doc: admin/build-doc: make paths absolute (`pr#7119 <http://github.com/ceph/ceph/pull/7119>`_, Dan Mick)
+* doc: dev: document ceph-qa-suite (`pr#6955 <http://github.com/ceph/ceph/pull/6955>`_, Loic Dachary)
+* doc: document "readforward" and "readproxy" cache mode (`pr#7023 <http://github.com/ceph/ceph/pull/7023>`_, Kefu Chai)
+* doc: fix "mon osd down out subtree limit" option name (`pr#7164 <http://github.com/ceph/ceph/pull/7164>`_, François Lafont)
+* doc: fix typo (`pr#7004 <http://github.com/ceph/ceph/pull/7004>`_, tianqing)
+* doc: Updated the rados command man page to include the --run-name opt… (`issue#12899 <http://tracker.ceph.com/issues/12899>`_, `pr#5900 <http://github.com/ceph/ceph/pull/5900>`_, ritz303)
+* fs: be more careful about the "mds setmap" command to prevent breakage (`issue#14380 <http://tracker.ceph.com/issues/14380>`_, `pr#7262 <http://github.com/ceph/ceph/pull/7262>`_, Yan, Zheng)
+* helgrind: additional race conditionslibrbd: journal replay should honor inter-event dependencies (`pr#7274 <http://github.com/ceph/ceph/pull/7274>`_, Jason Dillaman)
+* helgrind: fix real (and imaginary) race conditions (`issue#14163 <http://tracker.ceph.com/issues/14163>`_, `pr#7208 <http://github.com/ceph/ceph/pull/7208>`_, Jason Dillaman)
+* kv: implement value_as_ptr() and use it in .get() (`pr#7052 <http://github.com/ceph/ceph/pull/7052>`_, Piotr Dałek)
+* librados: add c++ style osd/pg command interface (`pr#6893 <http://github.com/ceph/ceph/pull/6893>`_, Yunchuan Wen)
+* librados: fix several flaws introduced by the enumeration_objects API (`issue#14299 <http://tracker.ceph.com/issues/14299>`_, `issue#14301 <http://tracker.ceph.com/issues/14301>`_, `issue#14300 <http://tracker.ceph.com/issues/14300>`_, `pr#7156 <http://github.com/ceph/ceph/pull/7156>`_, xie xingguo)
+* librados: new style (sharded) object listing (`pr#6405 <http://github.com/ceph/ceph/pull/6405>`_, John Spray, Sage Weil)
+* librados: potential null pointer access in list_(n)objects (`issue#13822 <http://tracker.ceph.com/issues/13822>`_, `pr#6639 <http://github.com/ceph/ceph/pull/6639>`_, xie xingguo)
+* librbd: exit if parent's snap is gone during clone (`issue#14118 <http://tracker.ceph.com/issues/14118>`_, `pr#6968 <http://github.com/ceph/ceph/pull/6968>`_, xie xingguo)
+* librbd: fix potential memory leak (`issue#14332 <http://tracker.ceph.com/issues/14332>`_, `issue#14333 <http://tracker.ceph.com/issues/14333>`_, `pr#7174 <http://github.com/ceph/ceph/pull/7174>`_, xie xingguo)
+* librbd: fix snap_exists API return code overflow (`issue#14129 <http://tracker.ceph.com/issues/14129>`_, `pr#6986 <http://github.com/ceph/ceph/pull/6986>`_, xie xingguo)
+* librbd: journal replay should honor inter-event dependencies (`pr#7019 <http://github.com/ceph/ceph/pull/7019>`_, Jason Dillaman)
+* librbd: return error if we fail to delete object_map head object (`issue#14098 <http://tracker.ceph.com/issues/14098>`_, `pr#6958 <http://github.com/ceph/ceph/pull/6958>`_, xie xingguo)
+* librbd: small fixes for error messages and readahead counter (`issue#14127 <http://tracker.ceph.com/issues/14127>`_, `pr#6983 <http://github.com/ceph/ceph/pull/6983>`_, xie xingguo)
+* librbd: uninitialized state in snap remove state machine (`pr#6982 <http://github.com/ceph/ceph/pull/6982>`_, Jason Dillaman)
+* mailmap: hange organization for Dongmao Zhang (`pr#7173 <http://github.com/ceph/ceph/pull/7173>`_, Dongmao Zhang)
+* mailmap: Igor Podoski affiliation (`pr#7219 <http://github.com/ceph/ceph/pull/7219>`_, Igor Podoski)
+* mailmap update (`pr#7210 <http://github.com/ceph/ceph/pull/7210>`_, M Ranga Swami Reddy)
+* mailmap updates (`pr#6992 <http://github.com/ceph/ceph/pull/6992>`_, Loic Dachary)
+* mailmap updates (`pr#7189 <http://github.com/ceph/ceph/pull/7189>`_, Loic Dachary)
+* man: document listwatchers cmd in "rados" manpage (`pr#7021 <http://github.com/ceph/ceph/pull/7021>`_, Kefu Chai)
+* mds: advance clientreplay when replying (`issue#14357 <http://tracker.ceph.com/issues/14357>`_, `pr#7216 <http://github.com/ceph/ceph/pull/7216>`_, John Spray)
+* mds: expose state of recovery to status ASOK command (`issue#14146 <http://tracker.ceph.com/issues/14146>`_, `pr#7068 <http://github.com/ceph/ceph/pull/7068>`_, Yan, Zheng)
+* mds: fix client cap/message replay order on restart (`issue#14254 <http://tracker.ceph.com/issues/14254>`_, `issue#13546 <http://tracker.ceph.com/issues/13546>`_, `pr#7199 <http://github.com/ceph/ceph/pull/7199>`_, Yan, Zheng)
+* mds: fix standby replay thread creation (`issue#14144 <http://tracker.ceph.com/issues/14144>`_, `pr#7132 <http://github.com/ceph/ceph/pull/7132>`_, John Spray)
+* mds: we should wait messenger when MDSDaemon suicide (`pr#6996 <http://github.com/ceph/ceph/pull/6996>`_, Wei Feng)
+* mon: add `osd blacklist clear` (`pr#6945 <http://github.com/ceph/ceph/pull/6945>`_, John Spray)
+* mon: add RAW USED column to ceph df detail (`pr#7087 <http://github.com/ceph/ceph/pull/7087>`_, Ruifeng Yang)
+* mon: degrade a log message to level 2 (`pr#6929 <http://github.com/ceph/ceph/pull/6929>`_, Kongming Wu)
+* mon: fix coding-style on PG related Monitor files (`pr#6881 <http://github.com/ceph/ceph/pull/6881>`_, Wido den Hollander)
+* mon: fixes related to mondbstore->get() changes (`pr#6564 <http://github.com/ceph/ceph/pull/6564>`_, Piotr Dałek)
+* mon: fix reuse of osd ids (clear osd info on osd deletion) (`issue#13988 <http://tracker.ceph.com/issues/13988>`_, `pr#6900 <http://github.com/ceph/ceph/pull/6900>`_, Loic Dachary, Sage Weil)
+* mon: fix the can't change subscribe level bug in monitoring log (`pr#7031 <http://github.com/ceph/ceph/pull/7031>`_, Zhiqiang Wang)
+* mon/MDSMonitor: add confirmation to "ceph mds rmfailed" (`issue#14379 <http://tracker.ceph.com/issues/14379>`_, `pr#7248 <http://github.com/ceph/ceph/pull/7248>`_, Yan, Zheng)
+* mon: modify a dout level in OSDMonitor.cc (`pr#6928 <http://github.com/ceph/ceph/pull/6928>`_, Yongqiang He)
+* mon: MonmapMonitor: don't expose uncommitted state to client (`pr#6854 <http://github.com/ceph/ceph/pull/6854>`_, Joao Eduardo Luis)
+* mon/OSDMonitor: osdmap laggy set a maximum limit for interval (`pr#7109 <http://github.com/ceph/ceph/pull/7109>`_, Zengran Zhang)
+* mon: paxos is_recovering calc error (`pr#7227 <http://github.com/ceph/ceph/pull/7227>`_, Weijun Duan)
+* mon/PGMap: show rd/wr iops separately in status reports (`pr#7072 <http://github.com/ceph/ceph/pull/7072>`_, Cilang Zhao)
+* mon: PGMonitor: acting primary diff with cur_stat, should not set pg to stale (`pr#7083 <http://github.com/ceph/ceph/pull/7083>`_, Xiaowei Chen)
+* msg: add override to virutal methods (`pr#6977 <http://github.com/ceph/ceph/pull/6977>`_, Michal Jarzabek)
+* msg/async: cleanup dead connection and misc things (`pr#7158 <http://github.com/ceph/ceph/pull/7158>`_, Haomai Wang)
+* msg/async: don't use shared_ptr to manage EventCallback (`pr#7028 <http://github.com/ceph/ceph/pull/7028>`_, Haomai Wang)
+* msg: filter out lo addr when bind osd addr (`pr#7012 <http://github.com/ceph/ceph/pull/7012>`_, Ji Chen)
+* msg: removed unneeded includes from Dispatcher (`pr#6814 <http://github.com/ceph/ceph/pull/6814>`_, Michal Jarzabek)
+* msg: remove unneeded inline (`pr#6989 <http://github.com/ceph/ceph/pull/6989>`_, Michal Jarzabek)
+* msgr:  fix large message data content length causing overflow (`pr#6809 <http://github.com/ceph/ceph/pull/6809>`_, Jun Huang, Haomai Wang)
+* msg/simple: pipe: memory leak when signature check failed (`pr#7096 <http://github.com/ceph/ceph/pull/7096>`_, Ruifeng Yang)
+* msg/simple: remove unneeded friend declarations (`pr#6924 <http://github.com/ceph/ceph/pull/6924>`_, Michal Jarzabek)
+* objecter: avoid recursive lock of Objecter::rwlock (`pr#7343 <http://github.com/ceph/ceph/pull/7343>`_, Yan, Zheng)
+* os/bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7419 <http://github.com/ceph/ceph/pull/7419>`_, Kefu Chai, Brad Hubbard)
+* osd: add cache hint when pushing raw clone during recovery (`pr#7069 <http://github.com/ceph/ceph/pull/7069>`_, Zhiqiang Wang)
+* osd: avoid debug std::string initialization in PG::get/put (`pr#7117 <http://github.com/ceph/ceph/pull/7117>`_, Evgeniy Firsov)
+* osd: avoid osd_op_thread suicide because osd_scrub_sleep (`pr#7009 <http://github.com/ceph/ceph/pull/7009>`_, Jianpeng Ma)
+* osd: bluestore: bluefs: fix several small bugs (`issue#14344 <http://tracker.ceph.com/issues/14344>`_, `issue#14343 <http://tracker.ceph.com/issues/14343>`_, `pr#7200 <http://github.com/ceph/ceph/pull/7200>`_, xie xingguo)
+* osd: bluestore: don't include when building without libaio (`issue#14207 <http://tracker.ceph.com/issues/14207>`_, `pr#7169 <http://github.com/ceph/ceph/pull/7169>`_, Mykola Golub)
+* osd: bluestore: fix bluestore onode_t attr leak (`pr#7125 <http://github.com/ceph/ceph/pull/7125>`_, Ning Yao)
+* osd: bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7168 <http://github.com/ceph/ceph/pull/7168>`_, Kefu Chai)
+* osd: bluestore: fix several bugs (`issue#14259 <http://tracker.ceph.com/issues/14259>`_, `issue#14353 <http://tracker.ceph.com/issues/14353>`_, `issue#14260 <http://tracker.ceph.com/issues/14260>`_, `issue#14261 <http://tracker.ceph.com/issues/14261>`_, `pr#7122 <http://github.com/ceph/ceph/pull/7122>`_, xie xingguo)
+* osd: bluestore: fix space rebalancing, collection split, buffered reads (`pr#7196 <http://github.com/ceph/ceph/pull/7196>`_, Sage Weil)
+* osd: bluestore: more fixes (`pr#7130 <http://github.com/ceph/ceph/pull/7130>`_, Sage Weil)
+* osd: cache tier: add config option for eviction check list size (`pr#6997 <http://github.com/ceph/ceph/pull/6997>`_, Yuan Zhou)
+* osdc: Fix race condition with tick_event and shutdown (`issue#14256 <http://tracker.ceph.com/issues/14256>`_, `pr#7151 <http://github.com/ceph/ceph/pull/7151>`_, Adam C. Emerson)
+* osd: check health state before pre_booting (`issue#14181 <http://tracker.ceph.com/issues/14181>`_, `pr#7053 <http://github.com/ceph/ceph/pull/7053>`_, Xiaoxi Chen)
+* osd: clear pg_stat_queue after stopping pgs (`issue#14212 <http://tracker.ceph.com/issues/14212>`_, `pr#7091 <http://github.com/ceph/ceph/pull/7091>`_, Sage Weil)
+* osd: delay populating in-memory PG log hashmaps (`pr#6425 <http://github.com/ceph/ceph/pull/6425>`_, Piotr Dałek)
+* osd: disable filestore_xfs_extsize by default (`issue#14397 <http://tracker.ceph.com/issues/14397>`_, `pr#7265 <http://github.com/ceph/ceph/pull/7265>`_, Ken Dreyer)
+* osd: do not keep ref of old osdmap in pg (`issue#13990 <http://tracker.ceph.com/issues/13990>`_, `pr#7007 <http://github.com/ceph/ceph/pull/7007>`_, Kefu Chai)
+* osd: drop deprecated removal pg type (`pr#6970 <http://github.com/ceph/ceph/pull/6970>`_, Igor Podoski)
+* osd: FileJournal: fix return code of create method (`issue#14134 <http://tracker.ceph.com/issues/14134>`_, `pr#6988 <http://github.com/ceph/ceph/pull/6988>`_, xie xingguo)
+* osd: FileJournal: support batch peak and pop from writeq (`pr#6701 <http://github.com/ceph/ceph/pull/6701>`_, Xinze Chi)
+* osd: FileStore: conditional collection of drive metadata (`pr#6956 <http://github.com/ceph/ceph/pull/6956>`_, Somnath Roy)
+* osd: FileStore:: optimize lfn_unlink (`pr#6649 <http://github.com/ceph/ceph/pull/6649>`_, Jianpeng Ma)
+* osd: fix null pointer access and race condition (`issue#14072 <http://tracker.ceph.com/issues/14072>`_, `pr#6916 <http://github.com/ceph/ceph/pull/6916>`_, xie xingguo)
+* osd: fix scrub start hobject (`pr#7467 <http://github.com/ceph/ceph/pull/7467>`_, Sage Weil)
+* osd: fix sparse-read result code checking logic (`issue#14151 <http://tracker.ceph.com/issues/14151>`_, `pr#7016 <http://github.com/ceph/ceph/pull/7016>`_, xie xingguo)
+* osd: fix temp object removal after upgrade (`issue#13862 <http://tracker.ceph.com/issues/13862>`_, `pr#6976 <http://github.com/ceph/ceph/pull/6976>`_, David Zafman)
+* osd: fix wip (l_osd_op_wip) perf counter and remove repop_map (`pr#7077 <http://github.com/ceph/ceph/pull/7077>`_, Xinze Chi)
+* osd: fix wrongly placed assert and some cleanups (`pr#6766 <http://github.com/ceph/ceph/pull/6766>`_, xiexingguo, xie xingguo)
+* osd: KeyValueStore: fix return code of mkfs (`pr#7036 <http://github.com/ceph/ceph/pull/7036>`_, xie xingguo)
+* osd: KeyValueStore: fix wrongly placed assert (`issue#14176 <http://tracker.ceph.com/issues/14176>`_, `issue#14178 <http://tracker.ceph.com/issues/14178>`_, `pr#7047 <http://github.com/ceph/ceph/pull/7047>`_, xie xingguo)
+* osd: kstore: several small fixes (`issue#14351 <http://tracker.ceph.com/issues/14351>`_, `issue#14352 <http://tracker.ceph.com/issues/14352>`_, `pr#7213 <http://github.com/ceph/ceph/pull/7213>`_, xie xingguo)
+* osd: kstore: small fixes to kstore (`issue#14204 <http://tracker.ceph.com/issues/14204>`_, `pr#7095 <http://github.com/ceph/ceph/pull/7095>`_, xie xingguo)
+* osd: make list_missing query missing_loc.needs_recovery_map (`pr#6298 <http://github.com/ceph/ceph/pull/6298>`_, Guang Yang)
+* osdmap: remove unused local variables (`pr#6864 <http://github.com/ceph/ceph/pull/6864>`_, luo kexue)
+* osd: memstore: fix two bugs (`pr#6963 <http://github.com/ceph/ceph/pull/6963>`_, Casey Bodley, Sage Weil)
+* osd: misc FileStore fixes (`issue#14192 <http://tracker.ceph.com/issues/14192>`_, `issue#14188 <http://tracker.ceph.com/issues/14188>`_, `issue#14194 <http://tracker.ceph.com/issues/14194>`_, `issue#14187 <http://tracker.ceph.com/issues/14187>`_, `issue#14186 <http://tracker.ceph.com/issues/14186>`_, `pr#7059 <http://github.com/ceph/ceph/pull/7059>`_, xie xingguo)
+* osd: misc optimization for map utilization (`pr#6950 <http://github.com/ceph/ceph/pull/6950>`_, Ning Yao)
+* osd,mon: log leveldb and rocksdb to ceph log (`pr#6921 <http://github.com/ceph/ceph/pull/6921>`_, Sage Weil)
+* osd: Omap small bugs adapted (`pr#6669 <http://github.com/ceph/ceph/pull/6669>`_, Jianpeng Ma, David Zafman)
+* osd: optimize the session_handle_reset function (`issue#14182 <http://tracker.ceph.com/issues/14182>`_, `pr#7054 <http://github.com/ceph/ceph/pull/7054>`_, songbaisen)
+* osd: OSDService: Fix typo in osdmap comment (`pr#7275 <http://github.com/ceph/ceph/pull/7275>`_, Brad Hubbard)
+* osd: os: skip checking pg_meta object existance in FileStore (`pr#6870 <http://github.com/ceph/ceph/pull/6870>`_, Ning Yao)
+* osd: PGLog: clean up read_log (`pr#7092 <http://github.com/ceph/ceph/pull/7092>`_, Jie Wang)
+* osd: prevent osd_recovery_sleep from causing recovery-thread suicide (`pr#7065 <http://github.com/ceph/ceph/pull/7065>`_, Jianpeng Ma)
+* osd: reduce string use in coll_t::calc_str() (`pr#6505 <http://github.com/ceph/ceph/pull/6505>`_, Igor Podoski)
+* osd: release related sources when scrub is interrupted (`pr#6744 <http://github.com/ceph/ceph/pull/6744>`_, Jianpeng Ma)
+* osd: remove unused OSDMap::set_weightf() (`issue#14369 <http://tracker.ceph.com/issues/14369>`_, `pr#7231 <http://github.com/ceph/ceph/pull/7231>`_, huanwen ren)
+* osd: ReplicatedPG: clean up unused function (`pr#7211 <http://github.com/ceph/ceph/pull/7211>`_, Xiaowei Chen)
+* osd/ReplicatedPG: fix promotion recency logic (`issue#14320 <http://tracker.ceph.com/issues/14320>`_, `pr#6702 <http://github.com/ceph/ceph/pull/6702>`_, Sage Weil)
+* osd: several small cleanups (`pr#7055 <http://github.com/ceph/ceph/pull/7055>`_, xie xingguo)
+* osd: shut down if we flap too many times in a short period (`pr#6708 <http://github.com/ceph/ceph/pull/6708>`_, Xiaoxi Chen)
+* osd: skip promote for writefull w/ FADVISE_DONTNEED/NOCACHE (`pr#7010 <http://github.com/ceph/ceph/pull/7010>`_, Jianpeng Ma)
+* osd: small fixes to memstore (`issue#14228 <http://tracker.ceph.com/issues/14228>`_, `issue#14229 <http://tracker.ceph.com/issues/14229>`_, `issue#14227 <http://tracker.ceph.com/issues/14227>`_, `pr#7107 <http://github.com/ceph/ceph/pull/7107>`_, xie xingguo)
+* osd: try evicting after flushing is done (`pr#5630 <http://github.com/ceph/ceph/pull/5630>`_, Zhiqiang Wang)
+* osd: use atomic to generate ceph_tid (`pr#7017 <http://github.com/ceph/ceph/pull/7017>`_, Evgeniy Firsov)
+* osd: use optimized is_zero in object_stat_sum_t.is_zero() (`pr#7203 <http://github.com/ceph/ceph/pull/7203>`_, Piotr Dałek)
+* osd: utime_t, eversion_t, osd_stat_sum_t encoding optimization (`pr#6902 <http://github.com/ceph/ceph/pull/6902>`_, Xinze Chi)
+* pybind: add ceph_volume_client interface for Manila and similar frameworks (`pr#6205 <http://github.com/ceph/ceph/pull/6205>`_, John Spray)
+* pybind: fix build failure, remove extraneous semicolon in method (`issue#14371 <http://tracker.ceph.com/issues/14371>`_, `pr#7235 <http://github.com/ceph/ceph/pull/7235>`_, Abhishek Lekshmanan)
+* pybind/test_rbd: fix test_create_defaults (`issue#14279 <http://tracker.ceph.com/issues/14279>`_, `pr#7155 <http://github.com/ceph/ceph/pull/7155>`_, Josh Durgin)
+* qa: disable rbd/qemu-iotests test case 055 on RHEL/CentOSlibrbd: journal replay should honor inter-event dependencies (`issue#14385 <http://tracker.ceph.com/issues/14385>`_, `pr#7272 <http://github.com/ceph/ceph/pull/7272>`_, Jason Dillaman)
+* qa/workunits: merge_diff shouldn't attempt to use striping (`issue#14165 <http://tracker.ceph.com/issues/14165>`_, `pr#7041 <http://github.com/ceph/ceph/pull/7041>`_, Jason Dillaman)
+* qa/workunits/snaps: move snap tests into fs sub-directory (`pr#6496 <http://github.com/ceph/ceph/pull/6496>`_, Yan, Zheng)
+* rados: implement rm --force option to force remove when full (`pr#6202 <http://github.com/ceph/ceph/pull/6202>`_, Xiaowei Chen)
+* rbd: additional validation for striping parameters (`pr#6914 <http://github.com/ceph/ceph/pull/6914>`_, Na Xie)
+* rbd: add pool name to disambiguate rbd admin socket commands (`pr#6904 <http://github.com/ceph/ceph/pull/6904>`_, wuxiangwei)
+* rbd: correct an output string for merge-diff (`pr#7046 <http://github.com/ceph/ceph/pull/7046>`_, Kongming Wu)
+* rbd: fix static initialization ordering issues (`pr#6978 <http://github.com/ceph/ceph/pull/6978>`_, Mykola Golub)
+* rbd-fuse: image name can not include snap name (`pr#7044 <http://github.com/ceph/ceph/pull/7044>`_, Yongqiang He)
+* rbd-fuse: implement mv operation (`pr#6938 <http://github.com/ceph/ceph/pull/6938>`_, wuxiangwei)
+* rbd: must specify both of stripe-unit and stripe-count when specifying stripingv2 feature (`pr#7026 <http://github.com/ceph/ceph/pull/7026>`_, Donghai Xu)
+* rbd-nbd: add copyright (`pr#7166 <http://github.com/ceph/ceph/pull/7166>`_, Li Wang)
+* rbd-nbd: fix up return code handling (`pr#7215 <http://github.com/ceph/ceph/pull/7215>`_, Mykola Golub)
+* rbd-nbd: small improvements in logging and forking (`pr#7127 <http://github.com/ceph/ceph/pull/7127>`_, Mykola Golub)
+* rbd: rbd order will be place in 22, when set to 0 in the config_opt (`issue#14139 <http://tracker.ceph.com/issues/14139>`_, `issue#14047 <http://tracker.ceph.com/issues/14047>`_, `pr#6886 <http://github.com/ceph/ceph/pull/6886>`_, huanwen ren)
+* rbd: striping parameters should support 64bit integers (`pr#6942 <http://github.com/ceph/ceph/pull/6942>`_, Na Xie)
+* rbd: use default order from configuration when not specified (`pr#6965 <http://github.com/ceph/ceph/pull/6965>`_, Yunchuan Wen)
+* rgw: add a method to purge all associate keys when removing a subuser (`issue#12890 <http://tracker.ceph.com/issues/12890>`_, `pr#6002 <http://github.com/ceph/ceph/pull/6002>`_, Sangdi Xu)
+* rgw: add missing error code for admin op API (`pr#7037 <http://github.com/ceph/ceph/pull/7037>`_, Dunrong Huang)
+* rgw: add support for "end_marker" parameter for GET on Swift account. (`issue#10682 <http://tracker.ceph.com/issues/10682>`_, `pr#4216 <http://github.com/ceph/ceph/pull/4216>`_, Radoslaw Zarzynski)
+* rgw_admin: orphans finish segfaults (`pr#6652 <http://github.com/ceph/ceph/pull/6652>`_, Igor Fedotov)
+* rgw: content length (`issue#13582 <http://tracker.ceph.com/issues/13582>`_, `pr#6975 <http://github.com/ceph/ceph/pull/6975>`_, Yehuda Sadeh)
+* rgw: delete default zone (`pr#7005 <http://github.com/ceph/ceph/pull/7005>`_, YankunLi)
+* rgw: do not abort radowgw server when using admin op API with bad parameters  (`issue#14190 <http://tracker.ceph.com/issues/14190>`_, `issue#14191 <http://tracker.ceph.com/issues/14191>`_, `pr#7063 <http://github.com/ceph/ceph/pull/7063>`_, Dunrong Huang)
+* rgw: Drop a debugging message (`pr#7280 <http://github.com/ceph/ceph/pull/7280>`_, Pete Zaitcev)
+* rgw: fix a typo in init-radosgw (`pr#6817 <http://github.com/ceph/ceph/pull/6817>`_, Zhi Zhang)
+* rgw: fix compilation warning (`pr#7160 <http://github.com/ceph/ceph/pull/7160>`_, Yehuda Sadeh)
+* rgw: fix wrong check for parse() return (`pr#6797 <http://github.com/ceph/ceph/pull/6797>`_, Dunrong Huang)
+* rgw: let radosgw-admin bucket stats return a standard josn (`pr#7029 <http://github.com/ceph/ceph/pull/7029>`_, Ruifeng Yang)
+* rgw: modify command stucking when operating radosgw-admin metadata list user (`pr#7032 <http://github.com/ceph/ceph/pull/7032>`_, Peiyang Liu)
+* rgw: modify documents and help infos' descriptions to the usage of option date when executing command "log show" (`pr#6080 <http://github.com/ceph/ceph/pull/6080>`_, Kongming Wu)
+* rgw: Parse --subuser better (`pr#7279 <http://github.com/ceph/ceph/pull/7279>`_, Pete Zaitcev)
+* rgw: radosgw-admin bucket check --fix not work (`pr#7093 <http://github.com/ceph/ceph/pull/7093>`_, Weijun Duan)
+* rgw: warn on suspicious civetweb frontend parameters (`pr#6944 <http://github.com/ceph/ceph/pull/6944>`_, Matt Benjamin)
+* rocksdb: remove rdb sources from dist tarball (`issue#13554 <http://tracker.ceph.com/issues/13554>`_, `pr#7105 <http://github.com/ceph/ceph/pull/7105>`_, Venky Shankar)
+* stringify outputted error code and fix unmatched parentheses. (`pr#6998 <http://github.com/ceph/ceph/pull/6998>`_, xie.xingguo, xie xingguo)
+* test/librbd/fsx: Use c++11 std::mt19937 generator instead of random_r() (`pr#6332 <http://github.com/ceph/ceph/pull/6332>`_, John Coyle)
+* test/mon/osd-erasure-code-profile: pick new mon port (`pr#7161 <http://github.com/ceph/ceph/pull/7161>`_, Sage Weil)
+* tests: add const for ec test (`pr#6911 <http://github.com/ceph/ceph/pull/6911>`_, Michal Jarzabek)
+* tests: configure with rocksdb by default (`issue#14220 <http://tracker.ceph.com/issues/14220>`_, `pr#7100 <http://github.com/ceph/ceph/pull/7100>`_, Loic Dachary)
+* tests: Fix for make check. (`pr#7102 <http://github.com/ceph/ceph/pull/7102>`_, David Zafman)
+* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7220 <http://github.com/ceph/ceph/pull/7220>`_, Jason Dillaman)
+* tests: snap rename and rebuild object map in client update test (`pr#7224 <http://github.com/ceph/ceph/pull/7224>`_, Jason Dillaman)
+* tests: unittest_bufferlist: fix hexdump test (`pr#7152 <http://github.com/ceph/ceph/pull/7152>`_, Sage Weil)
+* tests: unittest_ipaddr: fix segv (`pr#7154 <http://github.com/ceph/ceph/pull/7154>`_, Sage Weil)
+* tools: ceph_monstore_tool: add inflate-pgmap command (`issue#14217 <http://tracker.ceph.com/issues/14217>`_, `pr#7097 <http://github.com/ceph/ceph/pull/7097>`_, Kefu Chai)
+* tools: monstore: add 'show-versions' command. (`pr#7073 <http://github.com/ceph/ceph/pull/7073>`_, Cilang Zhao)
+* admin/build-doc: depend on zlib1g-dev and graphviz (`pr#7522 <http://github.com/ceph/ceph/pull/7522>`_, Ken Dreyer)
+* buffer: use move construct to append/push_back/push_front (`pr#7455 <http://github.com/ceph/ceph/pull/7455>`_, Haomai Wang)
+* build: allow jemalloc with rocksdb-static (`pr#7368 <http://github.com/ceph/ceph/pull/7368>`_, Somnath Roy)
+* build: fix the autotools and cmake build (the new fusestore needs libfuse) (`pr#7393 <http://github.com/ceph/ceph/pull/7393>`_, Kefu Chai)
+* build: fix warnings (`pr#7197 <http://github.com/ceph/ceph/pull/7197>`_, Kefu Chai, xie xingguo)
+* build: fix warnings (`pr#7315 <http://github.com/ceph/ceph/pull/7315>`_, Kefu Chai)
+* build: kill warnings (`pr#7397 <http://github.com/ceph/ceph/pull/7397>`_, Kefu Chai)
+* build: move libexec scripts to standardize across distros (`issue#14687 <http://tracker.ceph.com/issues/14687>`_, `issue#14705 <http://tracker.ceph.com/issues/14705>`_, `issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7636 <http://github.com/ceph/ceph/pull/7636>`_, Nathan Cutler, Kefu Chai)
+* build: Refrain from versioning and packaging EC testing plugins (`issue#14756 <http://tracker.ceph.com/issues/14756>`_, `issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7637 <http://github.com/ceph/ceph/pull/7637>`_, Nathan Cutler, Kefu Chai)
+* build: spdk submodule; cmake (`pr#7503 <http://github.com/ceph/ceph/pull/7503>`_, Kefu Chai)
+* ceph-disk: support bluestore (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7218 <http://github.com/ceph/ceph/pull/7218>`_, Loic Dachary, Sage Weil)
+* ceph-disk/test: fix test_prepare.py::TestPrepare tests (`pr#7549 <http://github.com/ceph/ceph/pull/7549>`_, Kefu Chai)
+* cleanup: remove misc dead code (`pr#7201 <http://github.com/ceph/ceph/pull/7201>`_, Erwan Velu)
+* cls/cls_rbd: pass string by reference (`pr#7232 <http://github.com/ceph/ceph/pull/7232>`_, Jeffrey Lu)
+* cmake: Added new unittests to make check (`pr#7572 <http://github.com/ceph/ceph/pull/7572>`_, Ali Maredia)
+* cmake: add KernelDevice.cc to libos_srcs (`pr#7507 <http://github.com/ceph/ceph/pull/7507>`_, Kefu Chai)
+* cmake: check for libsnappy in default path also (`pr#7366 <http://github.com/ceph/ceph/pull/7366>`_, Kefu Chai)
+* cmake: feb5 (`pr#7541 <http://github.com/ceph/ceph/pull/7541>`_, Matt Benjamin)
+* cmake: For CMake version <= 2.8.11, use LINK_PRIVATE and LINK_PUBLIC (`pr#7474 <http://github.com/ceph/ceph/pull/7474>`_, Tao Chang)
+* cmake: let ceph-client-debug link with tcmalloc (`pr#7314 <http://github.com/ceph/ceph/pull/7314>`_, Kefu Chai)
+* cmake: support ccache via a WITH_CCACHE build option (`pr#6875 <http://github.com/ceph/ceph/pull/6875>`_, John Coyle)
+* common: add zlib compression plugin (`pr#7437 <http://github.com/ceph/ceph/pull/7437>`_, Alyona Kiseleva, Kiseleva Alyona)
+* common: admin socket commands for tcmalloc heap get/set operations (`pr#7512 <http://github.com/ceph/ceph/pull/7512>`_, Samuel Just)
+* common: ake ceph_time clocks work under BSD (`pr#7340 <http://github.com/ceph/ceph/pull/7340>`_, Adam C. Emerson)
+* common: Allow OPT_INT settings with negative values (`issue#13829 <http://tracker.ceph.com/issues/13829>`_, `pr#7390 <http://github.com/ceph/ceph/pull/7390>`_, Brad Hubbard, Kefu Chai)
+* common/buffer: replace RWLock with spinlocks (`pr#7294 <http://github.com/ceph/ceph/pull/7294>`_, Piotr Dałek)
+* common: change the type of counter total/unhealthy_workers (`pr#7254 <http://github.com/ceph/ceph/pull/7254>`_, Guang Yang)
+* common: snappy decompressor may assert when handling segmented input bufferlist (`issue#14400 <http://tracker.ceph.com/issues/14400>`_, `pr#7268 <http://github.com/ceph/ceph/pull/7268>`_, Igor Fedotov)
+* common/str_map: cleanup: replaced get_str_map() function overloading by using default parameters for delimiters (`pr#7266 <http://github.com/ceph/ceph/pull/7266>`_, Sahithi R V)
+* common: time: have skewing-now call non-skewing now (`pr#7466 <http://github.com/ceph/ceph/pull/7466>`_, Adam C. Emerson)
+* common: unit test for interval_set implementations (`pr#6 <http://github.com/ceph/ceph/pull/6>`_, Igor Fedotov)
+* config: add $data_dir/config to config search path (`pr#7377 <http://github.com/ceph/ceph/pull/7377>`_, Sage Weil)
+* configure.ac: make "--with-librocksdb-static" default to 'check' (`issue#14463 <http://tracker.ceph.com/issues/14463>`_, `pr#7317 <http://github.com/ceph/ceph/pull/7317>`_, Dan Mick)
+* crush: add safety assert (`issue#14496 <http://tracker.ceph.com/issues/14496>`_, `pr#7344 <http://github.com/ceph/ceph/pull/7344>`_, songbaisen)
+* crush: reply quickly from get_immediate_parent (`issue#14334 <http://tracker.ceph.com/issues/14334>`_, `pr#7181 <http://github.com/ceph/ceph/pull/7181>`_, song baisen)
+* debian: packaging fixes for jewel (`pr#7807 <http://github.com/ceph/ceph/pull/7807>`_, Ken Dreyer, Ali Maredia)
+* debian/rpm split servers (`issue#10587 <http://tracker.ceph.com/issues/10587>`_, `pr#7746 <http://github.com/ceph/ceph/pull/7746>`_, Ken Dreyer)
+* doc: add orphans commands to radosgw-admin(8) (`issue#14637 <http://tracker.ceph.com/issues/14637>`_, `pr#7518 <http://github.com/ceph/ceph/pull/7518>`_, Ken Dreyer)
+* doc: amend the rados.8 (`pr#7251 <http://github.com/ceph/ceph/pull/7251>`_, Kefu Chai)
+* doc: Fixes a CRUSH map step take argument (`pr#7327 <http://github.com/ceph/ceph/pull/7327>`_, Ivan Grcic)
+* doc: fixing image in section ERASURE CODING (`pr#7298 <http://github.com/ceph/ceph/pull/7298>`_, Rachana Patel)
+* doc: fix misleading configuration guide on cache tiering (`pr#7000 <http://github.com/ceph/ceph/pull/7000>`_, Yuan Zhou)
+* doc: fix S3 C# example (`pr#7027 <http://github.com/ceph/ceph/pull/7027>`_, Dunrong Huang)
+* doc: remove redundant space in ceph-authtool/monmaptool doc (`pr#7244 <http://github.com/ceph/ceph/pull/7244>`_, Jiaying Ren)
+* doc: revise SubmittingPatches (`pr#7292 <http://github.com/ceph/ceph/pull/7292>`_, Kefu Chai)
+* doc: rgw: port changes from downstream to upstream (`pr#7264 <http://github.com/ceph/ceph/pull/7264>`_, Bara Ancincova)
+* doc: script and guidelines for mirroring Ceph (`pr#7384 <http://github.com/ceph/ceph/pull/7384>`_, Wido den Hollander)
+* doc: use 'ceph auth get-or-create' for creating RGW keyring (`pr#6930 <http://github.com/ceph/ceph/pull/6930>`_, Wido den Hollander)
+* global: do not start two daemons with a single pid-file (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7075 <http://github.com/ceph/ceph/pull/7075>`_, shun song)
+* global: do not start two daemons with a single pid-file (part 2) (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7463 <http://github.com/ceph/ceph/pull/7463>`_, Loic Dachary)
+* journal: flush commit position on metadata shutdown (`pr#7385 <http://github.com/ceph/ceph/pull/7385>`_, Mykola Golub)
+* journal: reset commit_position_task_ctx pointer after task complete (`pr#7480 <http://github.com/ceph/ceph/pull/7480>`_, Mykola Golub)
+* libcephfs: update LIBCEPHFS_VERSION to indicate the interface was changed (`pr#7551 <http://github.com/ceph/ceph/pull/7551>`_, Jevon Qiao)
+* librados: move to c++11 concurrency types (`pr#5931 <http://github.com/ceph/ceph/pull/5931>`_, Adam C. Emerson)
+* librados: remove duplicate definitions for rados pool_stat_t and cluster_stat_t (`pr#7330 <http://github.com/ceph/ceph/pull/7330>`_, Igor Fedotov)
+* librados: shutdown finisher in a more graceful way (`pr#7519 <http://github.com/ceph/ceph/pull/7519>`_, xie xingguo)
+* librados_test_stub: protect against notify/unwatch race (`pr#7540 <http://github.com/ceph/ceph/pull/7540>`_, Jason Dillaman)
+* librbd: API: async open and close (`issue#14264 <http://tracker.ceph.com/issues/14264>`_, `pr#7259 <http://github.com/ceph/ceph/pull/7259>`_, Mykola Golub)
+* librbd: Avoid create two threads per image (`pr#7400 <http://github.com/ceph/ceph/pull/7400>`_, Haomai Wang)
+* librbd: block maintenance ops until after journal is ready (`issue#14510 <http://tracker.ceph.com/issues/14510>`_, `pr#7382 <http://github.com/ceph/ceph/pull/7382>`_, Jason Dillaman)
+* librbd: fix internal handling of dynamic feature updates (`pr#7299 <http://github.com/ceph/ceph/pull/7299>`_, Jason Dillaman)
+* librbd: journal framework for tracking exclusive lock transitions (`issue#13298 <http://tracker.ceph.com/issues/13298>`_, `pr#7529 <http://github.com/ceph/ceph/pull/7529>`_, Jason Dillaman)
+* librbd: journal shut down flush race condition (`issue#14434 <http://tracker.ceph.com/issues/14434>`_, `pr#7302 <http://github.com/ceph/ceph/pull/7302>`_, Jason Dillaman)
+* librbd: remove canceled tasks from timer thread (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7329 <http://github.com/ceph/ceph/pull/7329>`_, Douglas Fuller)
+* makefile: remove libedit from libclient.la (`pr#7284 <http://github.com/ceph/ceph/pull/7284>`_, Kefu Chai)
+* mds, client: fix locking around handle_conf_change (`issue#14365 <http://tracker.ceph.com/issues/14365>`_, `issue#14374 <http://tracker.ceph.com/issues/14374>`_, `pr#7312 <http://github.com/ceph/ceph/pull/7312>`_, John Spray)
+* mds: judgment added to avoid the risk of visiting the NULL pointer (`pr#7358 <http://github.com/ceph/ceph/pull/7358>`_, Kongming Wu)
+* mon: add an independent option for max election time (`pr#7245 <http://github.com/ceph/ceph/pull/7245>`_, Sangdi Xu)
+* mon: compact full epochs also (`issue#14537 <http://tracker.ceph.com/issues/14537>`_, `pr#7396 <http://github.com/ceph/ceph/pull/7396>`_, Kefu Chai)
+* mon: consider the pool size when setting pool crush rule (`issue#14495 <http://tracker.ceph.com/issues/14495>`_, `pr#7341 <http://github.com/ceph/ceph/pull/7341>`_, song baisen)
+* mon: drop useless rank init assignment (`issue#14508 <http://tracker.ceph.com/issues/14508>`_, `pr#7321 <http://github.com/ceph/ceph/pull/7321>`_, huanwen ren)
+* mon: fix locking in preinit error paths (`issue#14473 <http://tracker.ceph.com/issues/14473>`_, `pr#7353 <http://github.com/ceph/ceph/pull/7353>`_, huanwen ren)
+* mon: fix monmap creation stamp (`pr#7459 <http://github.com/ceph/ceph/pull/7459>`_, duanweijun)
+* mon: fix sync of config-key data (`pr#7363 <http://github.com/ceph/ceph/pull/7363>`_, Xiaowei Chen)
+* mon: go into ERR state if multiple PGs are stuck inactive (`issue#13923 <http://tracker.ceph.com/issues/13923>`_, `pr#7253 <http://github.com/ceph/ceph/pull/7253>`_, Wido den Hollander)
+* mon/MDSMonitor.cc: properly note beacon when health metrics changes (`issue#14684 <http://tracker.ceph.com/issues/14684>`_, `pr#7757 <http://github.com/ceph/ceph/pull/7757>`_, Yan, Zheng)
+* mon/MonClient: avoid null pointer error when configured incorrectly (`issue#14405 <http://tracker.ceph.com/issues/14405>`_, `pr#7276 <http://github.com/ceph/ceph/pull/7276>`_, Bo Cai)
+* mon: PG Monitor should report waiting for backfill (`issue#12744 <http://tracker.ceph.com/issues/12744>`_, `pr#7398 <http://github.com/ceph/ceph/pull/7398>`_, Abhishek Lekshmanan)
+* mon: reduce CPU and memory manager pressure of pg health check (`pr#7482 <http://github.com/ceph/ceph/pull/7482>`_, Piotr Dałek)
+* mon: some cleanup in MonmapMonitor.cc (`pr#7418 <http://github.com/ceph/ceph/pull/7418>`_, huanwen ren)
+* mon: warn if pg(s) not scrubbed (`issue#13142 <http://tracker.ceph.com/issues/13142>`_, `pr#6440 <http://github.com/ceph/ceph/pull/6440>`_, Michal Jarzabek)
+* msg/async: AsyncConnection: avoid debug log in cleanup_handler (`pr#7547 <http://github.com/ceph/ceph/pull/7547>`_, Haomai Wang)
+* msg/async: bunch of fixes (`pr#7379 <http://github.com/ceph/ceph/pull/7379>`_, Piotr Dałek)
+* msg/async: fix array boundary (`pr#7451 <http://github.com/ceph/ceph/pull/7451>`_, Wei Jin)
+* msg/async: fix potential race condition (`pr#7453 <http://github.com/ceph/ceph/pull/7453>`_, Haomai Wang)
+* msg/async: fix send closed local_connection message problem (`pr#7255 <http://github.com/ceph/ceph/pull/7255>`_, Haomai Wang)
+* msg/async: reduce extra tcp packet for message ack (`pr#7380 <http://github.com/ceph/ceph/pull/7380>`_, Haomai Wang)
+* msg/xio: fix compilation (`pr#7479 <http://github.com/ceph/ceph/pull/7479>`_, Roi Dayan)
+* organizationmap: modify org mail info. (`pr#7240 <http://github.com/ceph/ceph/pull/7240>`_, Xiaowei Chen)
+* os/bluestore: fix assert (`issue#14436 <http://tracker.ceph.com/issues/14436>`_, `pr#7293 <http://github.com/ceph/ceph/pull/7293>`_, xie xingguo)
+* os/bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7342 <http://github.com/ceph/ceph/pull/7342>`_, Kefu Chai)
+* os/bluestore: insert new onode to the front position of onode LRU (`pr#7492 <http://github.com/ceph/ceph/pull/7492>`_, Jianjian Huo)
+* os/bluestore: use intrusive_ptr for Dir (`pr#7247 <http://github.com/ceph/ceph/pull/7247>`_, Igor Fedotov)
+* osd: blockdevice: avoid implicit cast and add guard (`pr#7460 <http://github.com/ceph/ceph/pull/7460>`_, xie xingguo)
+* osd: bluestore/BlueFS: initialize super block_size earlier in mkfs (`pr#7535 <http://github.com/ceph/ceph/pull/7535>`_, Sage Weil)
+* osd: BlueStore: fix fsck and blockdevice read-relevant issue (`pr#7362 <http://github.com/ceph/ceph/pull/7362>`_, xie xingguo)
+* osd: BlueStore: fix null pointer access (`issue#14561 <http://tracker.ceph.com/issues/14561>`_, `pr#7435 <http://github.com/ceph/ceph/pull/7435>`_, xie xingguo)
+* osd: bluestore, kstore: fix nid overwritten logic (`issue#14407 <http://tracker.ceph.com/issues/14407>`_, `issue#14433 <http://tracker.ceph.com/issues/14433>`_, `pr#7283 <http://github.com/ceph/ceph/pull/7283>`_, xie xingguo)
+* osd: bluestore: use btree_map for allocator (`pr#7269 <http://github.com/ceph/ceph/pull/7269>`_, Igor Fedotov, Sage Weil)
+* osd: drop fiemap len=0 logic (`pr#7267 <http://github.com/ceph/ceph/pull/7267>`_, Sage Weil)
+* osd: FileStore: add error check for object_map->sync() (`pr#7281 <http://github.com/ceph/ceph/pull/7281>`_, Chendi Xue)
+* osd: FileStore: cleanup: remove obsolete option "filestore_xattr_use_omap" (`issue#14356 <http://tracker.ceph.com/issues/14356>`_, `pr#7217 <http://github.com/ceph/ceph/pull/7217>`_, Vikhyat Umrao)
+* osd: FileStore: modify the format of colon (`pr#7333 <http://github.com/ceph/ceph/pull/7333>`_, Donghai Xu)
+* osd: FileStore: print file name before osd assert if read file failed (`pr#7111 <http://github.com/ceph/ceph/pull/7111>`_, Ji Chen)
+* osd: fix invalid list traversal in process_copy_chunk (`pr#7511 <http://github.com/ceph/ceph/pull/7511>`_, Samuel Just)
+* osd, mon: fix exit issue (`pr#7420 <http://github.com/ceph/ceph/pull/7420>`_, Jiaying Ren)
+* osd: PG::activate(): handle unexpected cached_removed_snaps more gracefully (`issue#14428 <http://tracker.ceph.com/issues/14428>`_, `pr#7309 <http://github.com/ceph/ceph/pull/7309>`_, Alexey Sheplyakov)
+* os/fs: fix io_getevents argument (`pr#7355 <http://github.com/ceph/ceph/pull/7355>`_, Jingkai Yuan)
+* os/fusestore: add error handling (`pr#7395 <http://github.com/ceph/ceph/pull/7395>`_, xie xingguo)
+* os/keyvaluestore: kill KeyValueStore (`pr#7320 <http://github.com/ceph/ceph/pull/7320>`_, Haomai Wang)
+* os/kstore: insert new onode to the front position of onode LRU (`pr#7505 <http://github.com/ceph/ceph/pull/7505>`_, xie xingguo)
+* os/ObjectStore: add custom move operations for ObjectStore::Transaction (`pr#7303 <http://github.com/ceph/ceph/pull/7303>`_, Casey Bodley)
+* rgw: Bug fix for mtime anomalies in RadosGW and other places (`pr#7328 <http://github.com/ceph/ceph/pull/7328>`_, Adam C. Emerson, Casey Bodley)
+* rpm: move %post(un) ldconfig calls to ceph-base (`issue#14940 <http://tracker.ceph.com/issues/14940>`_, `pr#7867 <http://github.com/ceph/ceph/pull/7867>`_, Nathan Cutler)
+* rpm: move runtime dependencies to ceph-base and fix other packaging issues (`issue#14864 <http://tracker.ceph.com/issues/14864>`_, `pr#7826 <http://github.com/ceph/ceph/pull/7826>`_, Nathan Cutler)
+* test: ceph_test_rados: use less CPU (`pr#7513 <http://github.com/ceph/ceph/pull/7513>`_, Samuel Just)
+* ceph-disk: get Nonetype when ceph-disk list with --format plain on single device. (`pr#6410 <http://github.com/ceph/ceph/pull/6410>`_, Vicente Cheng)
+* ceph: fix tell behavior (`pr#6329 <http://github.com/ceph/ceph/pull/6329>`_, David Zafman)
+* ceph-fuse: While starting ceph-fuse, start the log thread first (`issue#13443 <http://tracker.ceph.com/issues/13443>`_, `pr#6224 <http://github.com/ceph/ceph/pull/6224>`_, Wenjun Huang)
+* client: don't mark_down on command reply (`pr#6204 <http://github.com/ceph/ceph/pull/6204>`_, John Spray)
+* client: drop prefix from ints (`pr#6275 <http://github.com/ceph/ceph/pull/6275>`_, John Coyle)
+* client: sys/file.h includes for flock operations (`pr#6282 <http://github.com/ceph/ceph/pull/6282>`_, John Coyle)
+* cls_rbd: change object_map_update to return 0 on success, add logging (`pr#6467 <http://github.com/ceph/ceph/pull/6467>`_, Douglas Fuller)
+* cmake: Use uname instead of arch. (`pr#6358 <http://github.com/ceph/ceph/pull/6358>`_, John Coyle)
+* common: assert: __STRING macro is not defined by musl libc. (`pr#6210 <http://github.com/ceph/ceph/pull/6210>`_, John Coyle)
+* common: fix OpTracker age histogram calculation (`pr#5065 <http://github.com/ceph/ceph/pull/5065>`_, Zhiqiang Wang)
+* common/MemoryModel: Added explicit feature check for mallinfo(). (`pr#6252 <http://github.com/ceph/ceph/pull/6252>`_, John Coyle)
+* common/obj_bencher.cc: fix verification crashing when there's no objects (`pr#5853 <http://github.com/ceph/ceph/pull/5853>`_, Piotr Dałek)
+* common: optimize debug logging (`pr#6307 <http://github.com/ceph/ceph/pull/6307>`_, Adam Kupczyk)
+* common: Thread: move copy constructor and assignment op (`pr#5133 <http://github.com/ceph/ceph/pull/5133>`_, Michal Jarzabek)
+* common: WorkQueue: new PointerWQ base class for ContextWQ (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6525 <http://github.com/ceph/ceph/pull/6525>`_, Jason Dillaman)
+* compat: use prefixed typeof extension (`pr#6216 <http://github.com/ceph/ceph/pull/6216>`_, John Coyle)
+* crush: validate bucket id before indexing buckets array (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6246 <http://github.com/ceph/ceph/pull/6246>`_, Sage Weil)
+* doc: download GPG key from download.ceph.com (`issue#13603 <http://tracker.ceph.com/issues/13603>`_, `pr#6384 <http://github.com/ceph/ceph/pull/6384>`_, Ken Dreyer)
+* doc: fix outdated content in cache tier (`pr#6272 <http://github.com/ceph/ceph/pull/6272>`_, Yuan Zhou)
+* doc/release-notes: v9.1.0 (`pr#6281 <http://github.com/ceph/ceph/pull/6281>`_, Loic Dachary)
+* doc/releases-notes: fix build error (`pr#6483 <http://github.com/ceph/ceph/pull/6483>`_, Kefu Chai)
+* doc: remove toctree items under Create CephFS (`pr#6241 <http://github.com/ceph/ceph/pull/6241>`_, Jevon Qiao)
+* doc: rename the "Create a Ceph User" section and add verbage about… (`issue#13502 <http://tracker.ceph.com/issues/13502>`_, `pr#6297 <http://github.com/ceph/ceph/pull/6297>`_, ritz303)
+* docs: Fix styling of newly added mirror docs (`pr#6127 <http://github.com/ceph/ceph/pull/6127>`_, Wido den Hollander)
+* doc, tests: update all http://ceph.com/ to download.ceph.com (`pr#6435 <http://github.com/ceph/ceph/pull/6435>`_, Alfredo Deza)
+* doc: update doc for with new pool settings (`pr#5951 <http://github.com/ceph/ceph/pull/5951>`_, Guang Yang)
+* doc: update radosgw-admin example (`pr#6256 <http://github.com/ceph/ceph/pull/6256>`_, YankunLi)
+* doc: update the OS recommendations for newer Ceph releases (`pr#6355 <http://github.com/ceph/ceph/pull/6355>`_, ritz303)
+* drop envz.h includes (`pr#6285 <http://github.com/ceph/ceph/pull/6285>`_, John Coyle)
+* libcephfs: Improve portability by replacing loff_t type usage with off_t (`pr#6301 <http://github.com/ceph/ceph/pull/6301>`_, John Coyle)
+* libcephfs: only check file offset on glibc platforms (`pr#6288 <http://github.com/ceph/ceph/pull/6288>`_, John Coyle)
+* librados: fix examples/librados/Makefile error. (`pr#6320 <http://github.com/ceph/ceph/pull/6320>`_, You Ji)
+* librados: init crush_location from config file. (`issue#13473 <http://tracker.ceph.com/issues/13473>`_, `pr#6243 <http://github.com/ceph/ceph/pull/6243>`_, Wei Luo)
+* librados: wrongly passed in argument for stat command (`issue#13703 <http://tracker.ceph.com/issues/13703>`_, `pr#6476 <http://github.com/ceph/ceph/pull/6476>`_, xie xingguo)
+* librbd: deadlock while attempting to flush AIO requests (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6508 <http://github.com/ceph/ceph/pull/6508>`_, Jason Dillaman)
+* librbd: fix enable objectmap feature issue (`issue#13558 <http://tracker.ceph.com/issues/13558>`_, `pr#6339 <http://github.com/ceph/ceph/pull/6339>`_, xinxin shu)
+* librbd: remove duplicate read_only test in librbd::async_flatten (`pr#5856 <http://github.com/ceph/ceph/pull/5856>`_, runsisi)
+* mailmap: modify member info  (`pr#6468 <http://github.com/ceph/ceph/pull/6468>`_, Xiaowei Chen)
+* mailmap: updates (`pr#6258 <http://github.com/ceph/ceph/pull/6258>`_, M Ranga Swami Reddy)
+* mailmap: Xie Xingguo affiliation (`pr#6409 <http://github.com/ceph/ceph/pull/6409>`_, Loic Dachary)
+* mds: implement snapshot rename (`pr#5645 <http://github.com/ceph/ceph/pull/5645>`_, xinxin shu)
+* mds: messages/MOSDOp: cast in assert to eliminate warnings (`issue#13625 <http://tracker.ceph.com/issues/13625>`_, `pr#6414 <http://github.com/ceph/ceph/pull/6414>`_, David Zafman)
+* mds: new filtered MDS tell commands for sessions (`pr#6180 <http://github.com/ceph/ceph/pull/6180>`_, John Spray)
+* mds/Session: use projected parent for auth path check (`issue#13364 <http://tracker.ceph.com/issues/13364>`_, `pr#6200 <http://github.com/ceph/ceph/pull/6200>`_, Sage Weil)
+* mon: should not set isvalid = true when cephx_verify_authorizer return false (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6306 <http://github.com/ceph/ceph/pull/6306>`_, Ruifeng Yang)
+* osd: Add config option osd_read_ec_check_for_errors for testing (`pr#5865 <http://github.com/ceph/ceph/pull/5865>`_, David Zafman)
+* osd: add pin/unpin support to cache tier (11066) (`pr#6326 <http://github.com/ceph/ceph/pull/6326>`_, Zhiqiang Wang)
+* osd: auto repair EC pool (`issue#12754 <http://tracker.ceph.com/issues/12754>`_, `pr#6196 <http://github.com/ceph/ceph/pull/6196>`_, Guang Yang)
+* osd: drop the interim set from load_pgs() (`pr#6277 <http://github.com/ceph/ceph/pull/6277>`_, Piotr Dałek)
+* osd: FileJournal: _fdump wrongly returns if journal is currently unreadable. (`issue#13626 <http://tracker.ceph.com/issues/13626>`_, `pr#6406 <http://github.com/ceph/ceph/pull/6406>`_, xie xingguo)
+* osd: FileStore: add a field indicate xattr only one chunk for set xattr. (`pr#6244 <http://github.com/ceph/ceph/pull/6244>`_, Jianpeng Ma)
+* osd: FileStore: LFNIndex: remove redundant local variable 'obj'. (`issue#13552 <http://tracker.ceph.com/issues/13552>`_, `pr#6333 <http://github.com/ceph/ceph/pull/6333>`_, xiexingguo)
+* osd: FileStore: potential memory leak if _fgetattrs fails (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6377 <http://github.com/ceph/ceph/pull/6377>`_, xie xingguo)
+* osd: FileStore: remove unused local variable 'handle' (`pr#6381 <http://github.com/ceph/ceph/pull/6381>`_, xie xingguo)
+* osd: fix bogus scrub results when missing a clone (`issue#12738 <http://tracker.ceph.com/issues/12738>`_, `issue#12740 <http://tracker.ceph.com/issues/12740>`_, `pr#5783 <http://github.com/ceph/ceph/pull/5783>`_, David Zafman)
+* osd: fix debug message in OSD::is_healthy (`pr#6226 <http://github.com/ceph/ceph/pull/6226>`_, Xiaoxi Chen)
+* osd: fix MOSDOp encoding (`pr#6174 <http://github.com/ceph/ceph/pull/6174>`_, Sage Weil)
+* osd: init started to 0 (`issue#13206 <http://tracker.ceph.com/issues/13206>`_, `pr#6107 <http://github.com/ceph/ceph/pull/6107>`_, Sage Weil)
+* osd: KeyValueStore: fix the name's typo of keyvaluestore_default_strip_size (`pr#6375 <http://github.com/ceph/ceph/pull/6375>`_, Zhi Zhang)
+* osd: new and delete ObjectStore::Transaction in a function is not necessary (`pr#6299 <http://github.com/ceph/ceph/pull/6299>`_, Ruifeng Yang)
+* osd: optimize get_object_context (`pr#6305 <http://github.com/ceph/ceph/pull/6305>`_, Jianpeng Ma)
+* osd: optimize MOSDOp/do_op/handle_op (`pr#5211 <http://github.com/ceph/ceph/pull/5211>`_, Jacek J. Lakis)
+* osd: os/chain_xattr: On linux use linux/limits.h for XATTR_NAME_MAX. (`pr#6343 <http://github.com/ceph/ceph/pull/6343>`_, John Coyle)
+* osd: reorder bool fields in PGLog struct (`pr#6279 <http://github.com/ceph/ceph/pull/6279>`_, Piotr Dałek)
+* osd: ReplicatedPG: remove unused local variables (`issue#13575 <http://tracker.ceph.com/issues/13575>`_, `pr#6360 <http://github.com/ceph/ceph/pull/6360>`_, xiexingguo)
+* osd: reset primary and up_primary when building a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6240 <http://github.com/ceph/ceph/pull/6240>`_, xiexingguo)
+* radosgw-admin: Checking the legality of the parameters (`issue#13018 <http://tracker.ceph.com/issues/13018>`_, `pr#5879 <http://github.com/ceph/ceph/pull/5879>`_, Qiankun Zheng)
+* radosgw-admin: Create --secret-key alias for --secret (`issue#5821 <http://tracker.ceph.com/issues/5821>`_, `pr#5335 <http://github.com/ceph/ceph/pull/5335>`_, Yuan Zhou)
+* radosgw-admin: metadata list user should return an empty list when user pool is empty (`issue#13596 <http://tracker.ceph.com/issues/13596>`_, `pr#6465 <http://github.com/ceph/ceph/pull/6465>`_, Orit Wasserman)
+* rados: new options for write benchmark (`pr#6340 <http://github.com/ceph/ceph/pull/6340>`_, Joaquim Rocha)
+* rbd: fix clone isssue (`issue#13553 <http://tracker.ceph.com/issues/13553>`_, `pr#6334 <http://github.com/ceph/ceph/pull/6334>`_, xinxin shu)
+* rbd: fix init-rbdmap CMDPARAMS (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6109 <http://github.com/ceph/ceph/pull/6109>`_, Sage Weil)
+* rbdmap: systemd support (`issue#13374 <http://tracker.ceph.com/issues/13374>`_, `pr#6479 <http://github.com/ceph/ceph/pull/6479>`_, Boris Ranto)
+* rbd: rbdmap improvements (`pr#6445 <http://github.com/ceph/ceph/pull/6445>`_, Boris Ranto)
+* release-notes: draft v0.94.4 release notes (`pr#5907 <http://github.com/ceph/ceph/pull/5907>`_, Loic Dachary)
+* release-notes: draft v0.94.4 release notes (`pr#6195 <http://github.com/ceph/ceph/pull/6195>`_, Loic Dachary)
+* release-notes: draft v0.94.4 release notes (`pr#6238 <http://github.com/ceph/ceph/pull/6238>`_, Loic Dachary)
+* rgw: add compat header for TEMP_FAILURE_RETRY (`pr#6294 <http://github.com/ceph/ceph/pull/6294>`_, John Coyle)
+* rgw: add default quota config (`pr#6400 <http://github.com/ceph/ceph/pull/6400>`_, Daniel Gryniewicz)
+* rgw: add support for getting Swift's DLO without manifest handling (`pr#6206 <http://github.com/ceph/ceph/pull/6206>`_, Radoslaw Zarzynski)
+* rgw: clarify the error message when trying to create an existed user (`pr#5938 <http://github.com/ceph/ceph/pull/5938>`_, Zeqiang Zhuang)
+* rgw: fix objects can not be displayed which object name does not cont… (`issue#12963 <http://tracker.ceph.com/issues/12963>`_, `pr#5738 <http://github.com/ceph/ceph/pull/5738>`_, Weijun Duan)
+* rgw: fix typo in RGWHTTPClient::process error message (`pr#6424 <http://github.com/ceph/ceph/pull/6424>`_, Brad Hubbard)
+* rgw: fix wrong etag calculation during POST on S3 bucket. (`issue#11241 <http://tracker.ceph.com/issues/11241>`_, `pr#6030 <http://github.com/ceph/ceph/pull/6030>`_, Radoslaw Zarzynski)
+* rgw: mdlog trim add usage prompt (`pr#6059 <http://github.com/ceph/ceph/pull/6059>`_, Weijun Duan)
+* rgw: modify the conditional statement in parse_metadata_key method. (`pr#5875 <http://github.com/ceph/ceph/pull/5875>`_, Zengran Zhang)
+* rgw: refuse to calculate digest when the s3 secret key is empty (`issue#13133 <http://tracker.ceph.com/issues/13133>`_, `pr#6045 <http://github.com/ceph/ceph/pull/6045>`_, Sangdi Xu)
+* rgw: remove extra check in RGWGetObj::execute (`issue#12352 <http://tracker.ceph.com/issues/12352>`_, `pr#5262 <http://github.com/ceph/ceph/pull/5262>`_, Javier M. Mellid)
+* rgw: support core file limit for radosgw daemon (`pr#6346 <http://github.com/ceph/ceph/pull/6346>`_, Guang Yang)
+* rgw: swift use Civetweb ssl can not get right url (`issue#13628 <http://tracker.ceph.com/issues/13628>`_, `pr#6408 <http://github.com/ceph/ceph/pull/6408>`_, Weijun Duan)
+* rocksdb: build with PORTABLE=1 (`pr#6311 <http://github.com/ceph/ceph/pull/6311>`_, Sage Weil)
+* rocksdb: remove rdb source files from dist tarball (`issue#13554 <http://tracker.ceph.com/issues/13554>`_, `pr#6379 <http://github.com/ceph/ceph/pull/6379>`_, Kefu Chai)
+* rocksdb: use native rocksdb makefile (and our autotools) (`pr#6290 <http://github.com/ceph/ceph/pull/6290>`_, Sage Weil)
+* rpm: ceph.spec.in: correctly declare systemd dependency for SLE/openSUSE (`pr#6114 <http://github.com/ceph/ceph/pull/6114>`_, Nathan Cutler)
+* rpm: ceph.spec.in: fix libs-compat / devel-compat conditional (`issue#12315 <http://tracker.ceph.com/issues/12315>`_, `pr#5219 <http://github.com/ceph/ceph/pull/5219>`_, Ken Dreyer)
+* rpm: rhel 5.9 librados compile fix, moved blkid to RBD check/compilation (`issue#13177 <http://tracker.ceph.com/issues/13177>`_, `pr#5954 <http://github.com/ceph/ceph/pull/5954>`_, Rohan Mars)
+* scripts: release_notes can track original issue (`pr#6009 <http://github.com/ceph/ceph/pull/6009>`_, Abhishek Lekshmanan)
+* test/libcephfs/flock: add sys/file.h include for flock operations (`pr#6310 <http://github.com/ceph/ceph/pull/6310>`_, John Coyle)
+* test_rgw_admin: use freopen for output redirection. (`pr#6303 <http://github.com/ceph/ceph/pull/6303>`_, John Coyle)
+* tests: allow docker-test.sh to run under root (`issue#13355 <http://tracker.ceph.com/issues/13355>`_, `pr#6173 <http://github.com/ceph/ceph/pull/6173>`_, Loic Dachary)
+* tests: ceph-disk workunit uses configobj  (`pr#6342 <http://github.com/ceph/ceph/pull/6342>`_, Loic Dachary)
+* tests: destroy testprofile before creating one (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6446 <http://github.com/ceph/ceph/pull/6446>`_, Loic Dachary)
+* tests: port uniqueness reminder (`pr#6387 <http://github.com/ceph/ceph/pull/6387>`_, Loic Dachary)
+* tests: test/librados/test.cc must create profile (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6452 <http://github.com/ceph/ceph/pull/6452>`_, Loic Dachary)
+* tools/cephfs: fix overflow writing header to fixed size buffer (#13816) (`pr#6617 <http://github.com/ceph/ceph/pull/6617>`_, John Spray)
+* tools: ceph-monstore-update-crush: add "--test" when testing crushmap (`pr#6418 <http://github.com/ceph/ceph/pull/6418>`_, Kefu Chai)
+* tools:remove duplicate references (`pr#5917 <http://github.com/ceph/ceph/pull/5917>`_, Bo Cai)
+* vstart: grant full access to Swift testing account (`pr#6239 <http://github.com/ceph/ceph/pull/6239>`_, Yuan Zhou)
+* vstart: set cephfs root uid/gid to caller (`pr#6255 <http://github.com/ceph/ceph/pull/6255>`_, John Spray)
+
+
+Notable Changes since Hammer
+----------------------------
+
+* aarch64: add optimized version of crc32c (Yazen Ghannam, Steve Capper)
+* auth: cache/reuse crypto lib key objects, optimize msg signature check (Sage Weil)
+* auth: reinit NSS after fork() (#11128 Yan, Zheng)
+* autotools: fix out of tree build (Krxysztof Kosinski)
+* autotools: improve make check output (Loic Dachary)
+* buffer: add invalidate_crc() (Piotr Dalek)
+* buffer: fix zero bug (#12252 Haomai Wang)
+* buffer: some cleanup (Michal Jarzabek)
+* build: allow tcmalloc-minimal (Thorsten Behrens)
+* build: C++11 now supported
+* build: cmake: fix nss linking (Danny Al-Gaaf)
+* build: cmake: misc fixes (Orit Wasserman, Casey Bodley)
+* build: disable LTTNG by default (#11333 Josh Durgin)
+* build: do not build ceph-dencoder with tcmalloc (#10691 Boris Ranto)
+* build: fix junit detection on Fedora 22 (Ira Cooper)
+* build: fix pg ref disabling (William A. Kennington III)
+* build: fix ppc build (James Page)
+* build: install-deps: misc fixes (Loic Dachary)
+* build: install-deps.sh improvements (Loic Dachary)
+* build: install-deps: support OpenSUSE (Loic Dachary)
+* build: make_dist_tarball.sh (Sage Weil)
+* build: many cmake improvements
+* build: misc cmake fixes (Matt Benjamin)
+* build: misc fixes (Boris Ranto, Ken Dreyer, Owen Synge)
+* build: OSX build fixes (Yan, Zheng)
+* build: remove rest-bench
+* ceph-authtool: fix return code on error (Gerhard Muntingh)
+* ceph-detect-init: added Linux Mint (Michal Jarzabek)
+* ceph-detect-init: robust init system detection (Owen Synge)
+* ceph-disk: ensure 'zap' only operates on a full disk (#11272 Loic Dachary)
+* ceph-disk: fix zap sgdisk invocation (Owen Synge, Thorsten Behrens)
+* ceph-disk: follow ceph-osd hints when creating journal (#9580 Sage Weil)
+* ceph-disk: handle re-using existing partition (#10987 Loic Dachary)
+* ceph-disk: improve parted output parsing (#10983 Loic Dachary)
+* ceph-disk: install pip > 6.1 (#11952 Loic Dachary)
+* ceph-disk: make suppression work for activate-all and activate-journal (Dan van der Ster)
+* ceph-disk: many fixes (Loic Dachary, Alfredo Deza)
+* ceph-disk: fixes to respect init system (Loic Dachary, Owen Synge)
+* ceph-disk: pass --cluster arg on prepare subcommand (Kefu Chai)
+* ceph-disk: support for multipath devices (Loic Dachary)
+* ceph-disk: support NVMe device partitions (#11612 Ilja Slepnev)
+* ceph: fix 'df' units (Zhe Zhang)
+* ceph: fix parsing in interactive cli mode (#11279 Kefu Chai)
+* cephfs-data-scan: many additions, improvements (John Spray)
+* ceph-fuse: do not require successful remount when unmounting (#10982 Greg Farnum)
+* ceph-fuse, libcephfs: don't clear COMPLETE when trimming null (Yan, Zheng)
+* ceph-fuse, libcephfs: drop inode when rmdir finishes (#11339 Yan, Zheng)
+* ceph-fuse,libcephfs: fix uninline (#11356 Yan, Zheng)
+* ceph-fuse, libcephfs: hold exclusive caps on dirs we "own" (#11226 Greg Farnum)
+* ceph-fuse: mostly behave on 32-bit hosts (Yan, Zheng)
+* ceph: improve error output for 'tell' (#11101 Kefu Chai)
+* ceph-monstore-tool: fix store-copy (Huangjun)
+* ceph: new 'ceph daemonperf' command (John Spray, Mykola Golub)
+* ceph-objectstore-tool: many many improvements (David Zafman)
+* ceph-objectstore-tool: refactoring and cleanup (John Spray)
+* ceph-post-file: misc fixes (Joey McDonald, Sage Weil)
+* ceph_test_rados: test pipelined reads (Zhiqiang Wang)
+* client: avoid sending unnecessary FLUSHSNAP messages (Yan, Zheng)
+* client: exclude setfilelock when calculating oldest tid (Yan, Zheng)
+* client: fix error handling in check_pool_perm (John Spray)
+* client: fsync waits only for inode's caps to flush (Yan, Zheng)
+* client: invalidate kernel dcache when cache size exceeds limits (Yan, Zheng)
+* client: make fsync wait for unsafe dir operations (Yan, Zheng)
+* client: pin lookup dentry to avoid inode being freed (Yan, Zheng)
+* common: add descriptions to perfcounters (Kiseleva Alyona)
+* common: add perf counter descriptions (Alyona Kiseleva)
+* common: bufferlist performance tuning (Piotr Dalek, Sage Weil)
+* common: detect overflow of int config values (#11484 Kefu Chai)
+* common: fix bit_vector extent calc (#12611 Jason Dillaman)
+* common: fix json parsing of utf8 (#7387 Tim Serong)
+* common: fix leak of pthread_mutexattr (#11762 Ketor Meng)
+* common: fix LTTNG vs fork issue (Josh Durgin)
+* common: fix throttle max change (Henry Chang)
+* common: make mutex more efficient
+* common: make work queue addition/removal thread safe (#12662 Jason Dillaman)
+* common: optracker improvements (Zhiqiang Wang, Jianpeng Ma)
+* common: PriorityQueue tests (Kefu Chai)
+* common: some async compression infrastructure (Haomai Wang)
+* crush: add --check to validate dangling names, max osd id (Kefu Chai)
+* crush: cleanup, sync with kernel (Ilya Dryomov)
+* crush: fix crash from invalid 'take' argument (#11602 Shiva Rkreddy, Sage Weil)
+* crush: fix divide-by-2 in straw2 (#11357 Yann Dupont, Sage Weil)
+* crush: fix has_v4_buckets (#11364 Sage Weil)
+* crush: fix subtree base weight on adjust_subtree_weight (#11855 Sage Weil)
+* crush: respect default replicated ruleset config on map creation (Ilya Dryomov)
+* crushtool: fix order of operations, usage (Sage Weil)
+* crypto: fix NSS leak (Jason Dillaman)
+* crypto: fix unbalanced init/shutdown (#12598 Zheng Yan)
+* deb: fix rest-bench-dbg and ceph-test-dbg dependendies (Ken Dreyer)
+* debian: minor package reorg (Ken Dreyer)
+* deb, rpm: move ceph-objectstore-tool to ceph (Ken Dreyer)
+* doc: docuemnt object corpus generation (#11099 Alexis Normand)
+* doc: document region hostnames (Robin H. Johnson)
+* doc: fix gender neutrality (Alexandre Maragone)
+* doc: fix install doc (#10957 Kefu Chai)
+* doc: fix sphinx issues (Kefu Chai)
+* doc: man page updates (Kefu Chai)
+* doc: mds data structure docs (Yan, Zheng)
+* doc: misc updates (Fracois Lafont, Ken Dreyer, Kefu Chai, Owen Synge, Gael Fenet-Garde, Loic Dachary, Yannick Atchy-Dalama, Jiaying Ren, Kevin Caradant, Robert Maxime, Nicolas Yong, Germain Chipaux, Arthur Gorjux, Gabriel Sentucq, Clement Lebrun, Jean-Remi Deveaux, Clair Massot, Robin Tang, Thomas Laumondais, Jordan Dorne, Yuan Zhou, Valentin Thomas, Pierre Chaumont, Benjamin Troquereau, Benjamin Sesia, Vikhyat Umrao, Nilamdyuti Goswami, Vartika Rai, Florian Haas, Loic Dachary, Simon G [...]
+* doc: swift tempurls (#10184 Abhishek Lekshmanan)
+* doc: switch doxygen integration back to breathe (#6115 Kefu Chai)
+* doc: update release schedule docs (Loic Dachary)
+* erasure-code: cleanup (Kefu Chai)
+* erasure-code: improve tests (Loic Dachary)
+* erasure-code: shec: fix recovery bugs (Takanori Nakao, Shotaro Kawaguchi)
+* erasure-code: update ISA-L to 2.13 (Yuan Zhou)
+* gmock: switch to submodule (Danny Al-Gaaf, Loic Dachary)
+* hadoop: add terasort test (Noah Watkins)
+* init-radosgw: merge with sysv version; fix enumeration (Sage Weil)
+* java: fix libcephfs bindings (Noah Watkins)
+* libcephfs: add pread, pwrite (Jevon Qiao)
+* libcephfs,ceph-fuse: cache cleanup (Zheng Yan)
+* libcephfs,ceph-fuse: fix request resend on cap reconnect (#10912 Yan, Zheng)
+* librados: add config observer (Alistair Strachan)
+* librados: add FULL_TRY and FULL_FORCE flags for dealing with full clusters or pools (Sage Weil)
+* librados: add src_fadvise_flags for copy-from (Jianpeng Ma)
+* librados: define C++ flags from C constants (Josh Durgin)
+* librados: fadvise flags per op (Jianpeng Ma)
+* librados: fix last_force_resent handling (#11026 Jianpeng Ma)
+* librados: fix memory leak from C_TwoContexts (Xiong Yiliang)
+* librados: fix notify completion race (#13114 Sage Weil)
+* librados: fix striper when stripe_count = 1 and stripe_unit != object_size (#11120 Yan, Zheng)
+* librados, libcephfs: randomize client nonces (Josh Durgin)
+* librados: op perf counters (John Spray)
+* librados: pybind: fix binary omap values (Robin H. Johnson)
+* librados: pybind: fix write() method return code (Javier Guerra)
+* librados: respect default_crush_ruleset on pool_create (#11640 Yuan Zhou)
+* libradosstriper: fix leak (Danny Al-Gaaf)
+* librbd: add const for single-client-only features (Josh Durgin)
+* librbd: add deep-flatten operation (Jason Dillaman)
+* librbd: add purge_on_error cache behavior (Jianpeng Ma)
+* librbd: allow additional metadata to be stored with the image (Haomai Wang)
+* librbd: avoid blocking aio API methods (#11056 Jason Dillaman)
+* librbd: better handling for dup flatten requests (#11370 Jason Dillaman)
+* librbd: cancel in-flight ops on watch error (#11363 Jason Dillaman)
+* librbd: default new images to format 2 (#11348 Jason Dillaman)
+* librbd: fadvise for copy, export, import (Jianpeng Ma)
+* librbd: fast diff implementation that leverages object map (Jason Dillaman)
+* librbd: fix fast diff bugs (#11553 Jason Dillaman)
+* librbd: fix image format detection (Zhiqiang Wang)
+* librbd: fix lock ordering issue (#11577 Jason Dillaman)
+* librbd: fix reads larger than the cache size (Lu Shi)
+* librbd: fix snapshot creation when other snap is active (#11475 Jason Dillaman)
+* librbd: flatten/copyup fixes (Jason Dillaman)
+* librbd: handle NOCACHE fadvise flag (Jinapeng Ma)
+* librbd: lockdep, helgrind validation (Jason Dillaman, Josh Durgin)
+* librbd: metadata filter fixes (Haomai Wang)
+* librbd: misc aio fixes (#5488 Jason Dillaman)
+* librbd: misc rbd fixes (#11478 #11113 #11342 #11380 Jason Dillaman, Zhiqiang Wang)
+* librbd: new diff_iterate2 API (Jason Dillaman)
+* librbd: object map rebuild support (Jason Dillaman)
+* librbd: only update image flags while hold exclusive lock (#11791 Jason Dillaman)
+* librbd: optionally disable allocation hint (Haomai Wang)
+* librbd: prevent race between resize requests (#12664 Jason Dillaman)
+* librbd: readahead fixes (Zhiqiang Wang)
+* librbd: return result code from close (#12069 Jason Dillaman)
+* librbd: store metadata, including config options, in image (Haomai Wang)
+* librbd: tolerate old osds when getting image metadata (#11549 Jason Dillaman)
+* librbd: use write_full when possible (Zhiqiang Wang)
+* log: fix data corruption race resulting from log rotation (#12465 Samuel Just)
+* logrotate.d: prefer service over invoke-rc.d (#11330 Win Hierman, Sage Weil)
+* mds: add 'damaged' state to MDSMap (John Spray)
+* mds: add nicknames for perfcounters (John Spray)
+* mds: avoid emitting cap warnigns before evicting session (John Spray)
+* mds: avoid getting stuck in XLOCKDONE (#11254 Yan, Zheng)
+* mds: disable problematic rstat propagation into snap parents (Yan, Zheng)
+* mds: do not add snapped items to bloom filter (Yan, Zheng)
+* mds: expose frags via asok (John Spray)
+* mds: fix expected holes in journal objects (#13167 Yan, Zheng)
+* mds: fix handling for missing mydir dirfrag (#11641 John Spray)
+* mds: fix integer truncateion on large client ids (Henry Chang)
+* mds: fix mydir replica issue with shutdown (#10743 John Spray)
+* mds: fix out-of-order messages (#11258 Yan, Zheng)
+* mds: fix rejoin (Yan, Zheng)
+* mds: fix setting entire file layout in one setxattr (John Spray)
+* mds: fix shutdown (John Spray)
+* mds: fix shutdown with strays (#10744 John Spray)
+* mds: fix SnapServer crash on deleted pool (John Spray)
+* mds: fix snapshot bugs (Yan, Zheng)
+* mds: fix stray reintegration (Yan, Zheng)
+* mds: fix stray handling (John Spray)
+* mds: fix suicide beacon (John Spray)
+* mds: flush immediately in do_open_truncate (#11011 John Spray)
+* mds: handle misc corruption issues (John Spray)
+* mds: improve dump methods (John Spray)
+* mds: many fixes (Yan, Zheng, John Spray, Greg Farnum)
+* mds: many snapshot and stray fixes (Yan, Zheng)
+* mds: misc fixes (Jianpeng Ma, Dan van der Ster, Zhang Zhi)
+* mds: misc journal cleanups and fixes (#10368 John Spray)
+* mds: misc repair improvements (John Spray)
+* mds: misc snap fixes (Zheng Yan)
+* mds: misc snapshot fixes (Yan, Zheng)
+* mds: new SessionMap storage using omap (#10649 John Spray)
+* mds: persist completed_requests reliably (#11048 John Spray)
+* mds: reduce memory consumption (Yan, Zheng)
+* mds: respawn instead of suicide on blacklist (John Spray)
+* mds: separate safe_pos in Journaler (#10368 John Spray)
+* mds: snapshot rename support (#3645 Yan, Zheng)
+* mds: store layout on header object (#4161 John Spray)
+* mds: throttle purge stray operations (#10390 John Spray)
+* mds: tolerate clock jumping backwards (#11053 Yan, Zheng)
+* mds: warn when clients fail to advance oldest_client_tid (#10657 Yan, Zheng)
+* misc cleanups and fixes (Danny Al-Gaaf)
+* misc coverity fixes (Danny Al-Gaaf)
+* misc performance and cleanup (Nathan Cutler, Xinxin Shu)
+* mon: add cache over MonitorDBStore (Kefu Chai)
+* mon: add 'mon_metadata <id>' command (Kefu Chai)
+* mon: add 'node ls ...' command (Kefu Chai)
+* mon: add NOFORWARD, OBSOLETE, DEPRECATE flags for mon commands (Joao Eduardo Luis)
+* mon: add PG count to 'ceph osd df' output (Michal Jarzabek)
+* mon: 'ceph osd metadata' can dump all osds (Haomai Wang)
+* mon: clean up, reorg some mon commands (Joao Eduardo Luis)
+* monclient: flush_log (John Spray)
+* mon: detect kv backend failures (Sage Weil)
+* mon: disallow >2 tiers (#11840 Kefu Chai)
+* mon: disallow ec pools as tiers (#11650 Samuel Just)
+* mon: do not deactivate last mds (#10862 John Spray)
+* mon: fix average utilization calc for 'osd df' (Mykola Golub)
+* mon: fix CRUSH map test for new pools (Sage Weil)
+* mon: fix log dump crash when debugging (Mykola Golub)
+* mon: fix mds beacon replies (#11590 Kefu Chai)
+* mon: fix metadata update race (Mykola Golub)
+* mon: fix min_last_epoch_clean tracking (Kefu Chai)
+* mon: fix 'pg ls' sort order, state names (#11569 Kefu Chai)
+* mon: fix refresh (#11470 Joao Eduardo Luis)
+* mon: fix variance calc in 'osd df' (Sage Weil)
+* mon: improve callout to crushtool (Mykola Golub)
+* mon: make blocked op messages more readable (Jianpeng Ma)
+* mon: make osd get pool 'all' only return applicable fields (#10891 Michal Jarzabek)
+* mon: misc scaling fixes (Sage Weil)
+* mon: normalize erasure-code profile for storage and comparison (Loic Dachary)
+* mon: only send mon metadata to supporting peers (Sage Weil)
+* mon: optionally specify osd id on 'osd create' (Mykola Golub)
+* mon: 'osd tree' fixes (Kefu Chai)
+* mon: periodic background scrub (Joao Eduardo Luis)
+* mon: prevent bucket deletion when referenced by a crush rule (#11602 Sage Weil)
+* mon: prevent pgp_num > pg_num (#12025 Xinxin Shu)
+* mon: prevent pool with snapshot state from being used as a tier (#11493 Sage Weil)
+* mon: prime pg_temp when CRUSH map changes (Sage Weil)
+* mon: refine check_remove_tier checks (#11504 John Spray)
+* mon: reject large max_mds values (#12222 John Spray)
+* mon: remove spurious who arg from 'mds rm ...' (John Spray)
+* mon: streamline session handling, fix memory leaks (Sage Weil)
+* mon: upgrades must pass through hammer (Sage Weil)
+* mon: warn on bogus cache tier config (Jianpeng Ma)
+* msgr: add ceph_perf_msgr tool (Hoamai Wang)
+* msgr: async: fix seq handling (Haomai Wang)
+* msgr: async: many many fixes (Haomai Wang)
+* msgr: simple: fix clear_pipe (#11381 Haomai Wang)
+* msgr: simple: fix connect_seq assert (Haomai Wang)
+* msgr: xio: fastpath improvements (Raju Kurunkad)
+* msgr: xio: fix ip and nonce (Raju Kurunkad)
+* msgr: xio: improve lane assignment (Vu Pham)
+* msgr: xio: sync with accellio v1.4 (Vu Pham)
+* msgr: xio: misc fixes (#10735 Matt Benjamin, Kefu Chai, Danny Al-Gaaf, Raju Kurunkad, Vu Pham, Casey Bodley)
+* msg: unit tests (Haomai Wang)
+* objectcacher: misc bug fixes (Jianpeng Ma)
+* osd: add latency perf counters for tier operations (Xinze Chi)
+* osd: add misc perfcounters (Xinze Chi)
+* osd: add simple sleep injection in recovery (Sage Weil)
+* osd: allow SEEK_HOLE/SEEK_DATA for sparse read (Zhiqiang Wang)
+* osd: avoid dup omap sets for in pg metadata (Sage Weil)
+* osd: avoid multiple hit set insertions (Zhiqiang Wang)
+* osd: avoid transaction append in some cases (Sage Weil)
+* osd: break PG removal into multiple iterations (#10198 Guang Yang)
+* osd: cache proxy-write support (Zhiqiang Wang, Samuel Just)
+* osd: check scrub state when handling map (Jianpeng Ma)
+* osd: clean up some constness, privateness (Kefu Chai)
+* osd: clean up temp object if promotion fails (Jianpeng Ma)
+* osd: configure promotion based on write recency (Zhiqiang Wang)
+* osd: constrain collections to meta and PGs (normal and temp) (Sage Weil)
+* osd: don't send dup MMonGetOSDMap requests (Sage Weil, Kefu Chai)
+* osd: EIO injection (David Zhang)
+* osd: elminiate txn apend, ECSubWrite copy (Samuel Just)
+* osd: erasure-code: drop entries according to LRU (Andreas-Joachim Peters)
+* osd: erasure-code: fix SHEC floating point bug (#12936 Loic Dachary)
+* osd: erasure-code: update to ISA-L 2.14 (Yuan Zhou)
+* osd: filejournal: cleanup (David Zafman)
+* osd: filestore: clone using splice (Jianpeng Ma)
+* osd: filestore: fix recursive lock (Xinxin Shu)
+* osd: fix check_for_full (Henry Chang)
+* osd: fix dirty accounting in make_writeable (Zhiqiang Wang)
+* osd: fix dup promotion lost op bug (Zhiqiang Wang)
+* osd: fix endless repair when object is unrecoverable (Jianpeng Ma, Kefu Chai)
+* osd: fix hitset object naming to use GMT (Kefu Chai)
+* osd: fix misc memory leaks (Sage Weil)
+* osd: fix negative degraded stats during backfill (Guang Yang)
+* osd: fix osdmap dump of blacklist items (John Spray)
+* osd: fix peek_queue locking in FileStore (Xinze Chi)
+* osd: fix pg resurrection (#11429 Samuel Just)
+* osd: fix promotion vs full cache tier (Samuel Just)
+* osd: fix replay requeue when pg is still activating (#13116 Samuel Just)
+* osd: fix scrub stat bugs (Sage Weil, Samuel Just)
+* osd: fix snap flushing from cache tier (again) (#11787 Samuel Just)
+* osd: fix snap handling on promotion (#11296 Sam Just)
+* osd: fix temp-clearing (David Zafman)
+* osd: force promotion for ops EC can't handle (Zhiqiang Wang)
+* osd: handle log split with overlapping entries (#11358 Samuel Just)
+* osd: ignore non-existent osds in unfound calc (#10976 Mykola Golub)
+* osd: improve behavior on machines with large memory pages (Steve Capper)
+* osd: include a temp namespace within each collection/pgid (Sage Weil)
+* osd: increase default max open files (Owen Synge)
+* osd: keyvaluestore: misc fixes (Varada Kari)
+* osd: low and high speed flush modes (Mingxin Liu)
+* osd: make suicide timeouts individually configurable (Samuel Just)
+* osd: merge multiple setattr calls into a setattrs call (Xinxin Shu)
+* osd: misc fixes (Ning Yao, Kefu Chai, Xinze Chi, Zhiqiang Wang, Jianpeng Ma)
+* osd: move scrub in OpWQ (Samuel Just)
+* osd: newstore prototype (Sage Weil)
+* osd: ObjectStore internal API refactor (Sage Weil)
+* osd: peer_features includes self (David Zafman)
+* osd: pool size change triggers new interval (#11771 Samuel Just)
+* osd: prepopulate needs_recovery_map when only one peer has missing (#9558 Guang Yang)
+* osd: randomize scrub times (#10973 Kefu Chai)
+* osd: recovery, peering fixes (#11687 Samuel Just)
+* osd: refactor scrub and digest recording (Sage Weil)
+* osd: refuse first write to EC object at non-zero offset (Jianpeng Ma)
+* osd: relax reply order on proxy read (#11211 Zhiqiang Wang)
+* osd: require firefly features (David Zafman)
+* osd: set initial crush weight with more precision (Sage Weil)
+* osd: SHEC no longer experimental
+* osd: skip promotion for flush/evict op (Zhiqiang Wang)
+* osd: stripe over small xattrs to fit in XFS's 255 byte inline limit (Sage Weil, Ning Yao)
+* osd: sync object_map on syncfs (Samuel Just)
+* osd: take excl lock of op is rw (Samuel Just)
+* osd: throttle evict ops (Yunchuan Wen)
+* osd: upgrades must pass through hammer (Sage Weil)
+* osd: use a temp object for recovery (Sage Weil)
+* osd: use blkid to collection partition information (Joseph Handzik)
+* osd: use SEEK_HOLE / SEEK_DATA for sparse copy (Xinxin Shu)
+* osd: WBThrottle cleanups (Jianpeng Ma)
+* osd: write journal header on clean shutdown (Xinze Chi)
+* osdc/Objecter: allow per-pool calls to op_cancel_writes (John Spray)
+* os/filestore: enlarge getxattr buffer size (Jianpeng Ma)
+* pybind: pep8 cleanups (Danny Al-Gaaf)
+* pycephfs: many fixes for bindings (Haomai Wang)
+* qa: fix filelock_interrupt.py test (Yan, Zheng)
+* qa: improve ceph-disk tests (Loic Dachary)
+* qa: improve docker build layers (Loic Dachary)
+* qa: run-make-check.sh script (Loic Dachary)
+* rados: add --striper option to use libradosstriper (#10759 Sebastien Ponce)
+* rados: bench: add --no-verify option to improve performance (Piotr Dalek)
+* rados bench: misc fixes (Dmitry Yatsushkevich)
+* rados: fix error message on failed pool removal (Wido den Hollander)
+* radosgw-admin: add 'bucket check' function to repair bucket index (Yehuda Sadeh)
+* radosgw-admin: fix subuser modify output (#12286 Guce)
+* rados: handle --snapid arg properly (Abhishek Lekshmanan)
+* rados: improve bench buffer handling, performance (Piotr Dalek)
+* rados: misc bench fixes (Dmitry Yatsushkevich)
+* rados: new pool import implementation (John Spray)
+* rados: translate errno to string in CLI (#10877 Kefu Chai)
+* rbd: accept map options config option (Ilya Dryomov)
+* rbd: add disk usage tool (#7746 Jason Dillaman)
+* rbd: allow unmapping by spec (Ilya Dryomov)
+* rbd: cli: fix arg parsing with --io-pattern (Dmitry Yatsushkevich)
+* rbd: deprecate --new-format option (Jason Dillman)
+* rbd: fix error messages (#2862 Rajesh Nambiar)
+* rbd: fix link issues (Jason Dillaman)
+* rbd: improve CLI arg parsing, usage (Ilya Dryomov)
+* rbd: rbd-replay-prep and rbd-replay improvements (Jason Dillaman)
+* rbd: recognize queue_depth kernel option (Ilya Dryomov)
+* rbd: support G and T units for CLI (Abhishek Lekshmanan)
+* rbd: update rbd man page (Ilya Dryomov)
+* rbd: update xfstests tests (Douglas Fuller)
+* rbd: use image-spec and snap-spec in help (Vikhyat Umrao, Ilya Dryomov)
+* rest-bench: misc fixes (Shawn Chen)
+* rest-bench: support https (#3968 Yuan Zhou)
+* rgw: add max multipart upload parts (#12146 Abshishek Dixit)
+* rgw: add missing headers to Swift container details (#10666 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: add stats to headers for account GET (#10684 Yuan Zhou)
+* rgw: add Trasnaction-Id to response (Abhishek Dixit)
+* rgw: add X-Timestamp for Swift containers (#10938 Radoslaw Zarzynski)
+* rgw: always check if token is expired (#11367 Anton Aksola, Riku Lehto)
+* rgw: conversion tool to repair broken multipart objects (#12079 Yehuda Sadeh)
+* rgw: document layout of pools and objects (Pete Zaitcev)
+* rgw: do not enclose bucket header in quotes (#11860 Wido den Hollander)
+* rgw: do not prefetch data for HEAD requests (Guang Yang)
+* rgw: do not preserve ACLs when copying object (#12370 Yehuda Sadeh)
+* rgw: do not set content-type if length is 0 (#11091 Orit Wasserman)
+* rgw: don't clobber bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
+* rgw: don't use end_marker for namespaced object listing (#11437 Yehuda Sadeh)
+* rgw: don't use rgw_socket_path if frontend is configured (#11160 Yehuda Sadeh)
+* rgw: enforce Content-Length for POST on Swift cont/obj (#10661 Radoslaw Zarzynski)
+* rgw: error out if frontend did not send all data (#11851 Yehuda Sadeh)
+* rgw: expose the number of unhealthy workers through admin socket (Guang Yang)
+* rgw: fail if parts not specified on multipart upload (#11435 Yehuda Sadeh)
+* rgw: fix assignment of copy obj attributes (#11563 Yehuda Sadeh)
+* rgw: fix broken stats in container listing (#11285 Radoslaw Zarzynski)
+* rgw: fix bug in domain/subdomain splitting (Robin H. Johnson)
+* rgw: fix casing of Content-Type header (Robin H. Johnson)
+* rgw: fix civetweb max threads (#10243 Yehuda Sadeh)
+* rgw: fix Connection: header handling (#12298 Wido den Hollander)
+* rgw: fix copy metadata, support X-Copied-From for swift (#10663 Radoslaw Zarzynski)
+* rgw: fix data corruptions race condition (#11749 Wuxingyi)
+* rgw: fix decoding of X-Object-Manifest from GET on Swift DLO (Radslow Rzarzynski)
+* rgw: fix GET on swift account when limit == 0 (#10683 Radoslaw Zarzynski)
+* rgw: fix handling empty metadata items on Swift container (#11088 Radoslaw Zarzynski)
+* rgw: fix JSON response when getting user quota (#12117 Wuxingyi)
+* rgw: fix locator for objects starting with _ (#11442 Yehuda Sadeh)
+* rgw: fix log rotation (Wuxingyi)
+* rgw: fix mulitipart upload in retry path (#11604 Yehuda Sadeh)
+* rgw: fix quota enforcement on POST (#11323 Sergey Arkhipov)
+* rgw: fix reset_loc (#11974 Yehuda Sadeh)
+* rgw: fix return code on missing upload (#11436 Yehuda Sadeh)
+* rgw: fix sysvinit script
+* rgw: fix sysvinit script w/ multiple instances (Sage Weil, Pavan Rallabhandi)
+* rgw: force content_type for swift bucket stats requests (#12095 Orit Wasserman)
+* rgw: force content type header on responses with no body (#11438 Orit Wasserman)
+* rgw: generate Date header for civetweb (#10873 Radoslaw Zarzynski)
+* rgw: generate new object tag when setting attrs (#11256 Yehuda Sadeh)
+* rgw: improve content-length env var handling (#11419 Robin H. Johnson)
+* rgw: improved support for swift account metadata (Radoslaw Zarzynski)
+* rgw: improve handling of already removed buckets in expirer (Radoslaw Rzarzynski)
+* rgw: issue aio for first chunk before flush cached data (#11322 Guang Yang)
+* rgw: log to /var/log/ceph instead of /var/log/radosgw
+* rgw: make init script wait for radosgw to stop (#11140 Dmitry Yatsushkevich)
+* rgw: make max put size configurable (#6999 Yuan Zhou)
+* rgw: make quota/gc threads configurable (#11047 Guang Yang)
+* rgw: make read user buckets backward compat (#10683 Radoslaw Zarzynski)
+* rgw: merge manifests properly with prefix override (#11622 Yehuda Sadeh)
+* rgw: only scan for objects not in a namespace (#11984 Yehuda Sadeh)
+* rgw: orphan detection tool (Yehuda Sadeh)
+* rgw: pass in civetweb configurables (#10907 Yehuda Sadeh)
+* rgw: rectify 202 Accepted in PUT response (#11148 Radoslaw Zarzynski)
+* rgw: remove meta file after deleting bucket (#11149 Orit Wasserman)
+* rgw: remove trailing :port from HTTP_HOST header (Sage Weil)
+* rgw: return 412 on bad limit when listing buckets (#11613 Yehuda Sadeh)
+* rgw: rework X-Trans-Id header to conform with Swift API (Radoslaw Rzarzynski)
+* rgw: s3 encoding-type for get bucket (Jeff Weber)
+* rgw: send ETag, Last-Modified for swift (#11087 Radoslaw Zarzynski)
+* rgw: set content length on container GET, PUT, DELETE, HEAD (#10971, #11036 Radoslaw Zarzynski)
+* rgw: set max buckets per user in ceph.conf (Vikhyat Umrao)
+* rgw: shard work over multiple librados instances (Pavan Rallabhandi)
+* rgw: support end marker on swift container GET (#10682 Radoslaw Zarzynski)
+* rgw: support for Swift expiration API (Radoslaw Rzarzynski, Yehuda Sadeh)
+* rgw: swift: allow setting attributes with COPY (#10662 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: swift: do not override sent content type (#12363 Orit Wasserman)
+* rgw: swift: enforce Content-Type in response (#12157 Radoslaw Zarzynski)
+* rgw: swift: fix account listing (#11501 Radoslaw Zarzynski)
+* rgw: swift: fix metadata handling on copy (#10645 Radoslaw Zarzynski)
+* rgw: swift: send Last-Modified header (#10650 Radoslaw Zarzynski)
+* rgw: swift: set Content-Length for account GET (#12158 Radoslav Zarzynski)
+* rgw: swift: set content-length on keystone tokens (#11473 Herv Rousseau)
+* rgw: update keystone cache with token info (#11125 Yehuda Sadeh)
+* rgw: update to latest civetweb, enable config for IPv6 (#10965 Yehuda Sadeh)
+* rgw: use attrs from source bucket on copy (#11639 Javier M. Mellid)
+* rgw: use correct oid for gc chains (#11447 Yehuda Sadeh)
+* rgw: user rm is idempotent (Orit Wasserman)
+* rgw: use unique request id for civetweb (#10295 Orit Wasserman)
+* rocksdb: add perf counters for get/put latency (Xinxin Shu)
+* rocksdb, leveldb: fix compact_on_mount (Xiaoxi Chen)
+* rocksdb: pass options as single string (Xiaoxi Chen)
+* rocksdb: update to latest (Xiaoxi Chen)
+* rpm: add suse firewall files (Tim Serong)
+* rpm: always rebuild and install man pages for rpm (Owen Synge)
+* rpm: loosen ceph-test dependencies (Ken Dreyer)
+* rpm: many spec file fixes (Owen Synge, Ken Dreyer)
+* rpm: misc fixes (Boris Ranto, Owen Synge, Ken Dreyer, Ira Cooper)
+* rpm: misc systemd and SUSE fixes (Owen Synge, Nathan Cutler)
+* selinux policy (Boris Ranto, Milan Broz)
+* systemd: logrotate fixes (Tim Serong, Lars Marowsky-Bree, Nathan Cutler)
+* systemd: many fixes (Sage Weil, Owen Synge, Boris Ranto, Dan van der Ster)
+* systemd: run daemons as user ceph
+* sysvinit compat: misc fixes (Owen Synge)
+* test: misc fs test improvements (John Spray, Loic Dachary)
+* test: python tests, linter cleanup (Alfredo Deza)
+* tests: fixes for rbd xstests (Douglas Fuller)
+* tests: fix tiering health checks (Loic Dachary)
+* tests for low-level performance (Haomai Wang)
+* tests: many ec non-regression improvements (Loic Dachary)
+* tests: many many ec test improvements (Loic Dachary)
+* upstart: throttle restarts (#11798 Sage Weil, Greg Farnum)
+
+  
+v10.1.2 Jewel (release candidate)
+=================================
+
+This is the third (and likely final) release candidate for Jewel.
+
+Notable Changes since v10.1.1
+-----------------------------
+
+* rgw: Jewel nfs fixes 3 (`pr#8460 <http://github.com/ceph/ceph/pull/8460>`_, Matt Benjamin)
+* osd/PG: set epoch_created and parent_split_bits for child pg (`issue#15426 <http://tracker.ceph.com/issues/15426>`_, `pr#8552 <http://github.com/ceph/ceph/pull/8552>`_, Kefu Chai)
+* rgw: signature mismatch with escaped characters in url query portion (`issue#15358 <http://tracker.ceph.com/issues/15358>`_, `pr#8445 <http://github.com/ceph/ceph/pull/8445>`_, Javier M. Mellid)
+* authtool: update --help and manpage to match code. (`pr#8456 <http://github.com/ceph/ceph/pull/8456>`_, Robin H. Johnson)
+* build: Respect TMPDIR for virtualenv. (`pr#8457 <http://github.com/ceph/ceph/pull/8457>`_, Robin H. Johnson)
+* ceph-disk: do not always fail when re-using a partition (`pr#8508 <http://github.com/ceph/ceph/pull/8508>`_, You Ji)
+* ceph-fuse: rotate log file (`pr#8485 <http://github.com/ceph/ceph/pull/8485>`_, Sage Weil)
+* ceph-rest-api: fix fs/flag/set (`pr#8428 <http://github.com/ceph/ceph/pull/8428>`_, Sage Weil)
+* check-generated.sh: can't source bash from sh (`pr#8521 <http://github.com/ceph/ceph/pull/8521>`_, Michal Jarzabek)
+* common: buffer: put a guard for stat() syscall during read_file (`pr#7956 <http://github.com/ceph/ceph/pull/7956>`_, xie xingguo)
+* common: fix time_t cast in decode (`issue#15330 <http://tracker.ceph.com/issues/15330>`_, `pr#8419 <http://github.com/ceph/ceph/pull/8419>`_, Adam C. Emerson)
+* crush: fix typo (`pr#8518 <http://github.com/ceph/ceph/pull/8518>`_, Wei Jin)
+* doc: rgw admin uses "region list" not "regions list" (`pr#8517 <http://github.com/ceph/ceph/pull/8517>`_, Kris Jurka)
+* journal: fix final result for JournalTrimmer::C_RemoveSet (`pr#8516 <http://github.com/ceph/ceph/pull/8516>`_, runsisi)
+* journal: fix race condition between Future and journal shutdown (`issue#15364 <http://tracker.ceph.com/issues/15364>`_, `pr#8477 <http://github.com/ceph/ceph/pull/8477>`_, Jason Dillaman)
+* librados: Revert "rados: Add new field flags for ceph_osd_op.copy_get." (`pr#8486 <http://github.com/ceph/ceph/pull/8486>`_, Sage Weil)
+* librbd: disallow unsafe rbd_op_threads values (`issue#15034 <http://tracker.ceph.com/issues/15034>`_, `pr#8459 <http://github.com/ceph/ceph/pull/8459>`_, Josh Durgin)
+* mailmap update (`pr#8522 <http://github.com/ceph/ceph/pull/8522>`_, M Ranga Swami Reddy)
+* mds: Add cmapv to ESessions default constructor initializer list (`pr#8403 <http://github.com/ceph/ceph/pull/8403>`_, John Coyle)
+* mds: fix file_layout_t legacy encoding snafu (`pr#8455 <http://github.com/ceph/ceph/pull/8455>`_, Sage Weil)
+* mds: Protect a number of unstable/experimental features behind durable flags (`pr#8383 <https://github.com/ceph/ceph/pull/8383>`_, Greg Farnum)
+* mds: Extend the existing pool access checking to include specific RADOS namespacse. (`pr#8444 <https://github.com/ceph/ceph/pull/8444>`_, Yan, Zheng)
+* os/ObjectStore: make device uuid probe output something friendly (`pr#8418 <http://github.com/ceph/ceph/pull/8418>`_, Sage Weil)
+* os/bluestore: revamp BlueFS bdev management and add perfcounters (`issue#15376 <http://tracker.ceph.com/issues/15376>`_, `pr#8431 <http://github.com/ceph/ceph/pull/8431>`_, Sage Weil)
+* os/filestore: force lfn attrs to be written atomically, restructure name length limits (`pr#8496 <http://github.com/ceph/ceph/pull/8496>`_, Samuel Just)
+* osd/ReplicatedPG::_rollback_to: update the OMAP flag (`issue#14777 <http://tracker.ceph.com/issues/14777>`_, `pr#8495 <http://github.com/ceph/ceph/pull/8495>`_, Samuel Just)
+* osd: clean up temp object if copy-from fails (`pr#8487 <http://github.com/ceph/ceph/pull/8487>`_, Sage Weil)
+* osd: fix two scrub relevant issues (`pr#8462 <http://github.com/ceph/ceph/pull/8462>`_, xie xingguo)
+* osd: fix/clean up full map request handling (`pr#8446 <http://github.com/ceph/ceph/pull/8446>`_, Sage Weil)
+* osdc/Objecter: fix narrow race with tid assignment (`issue#14364 <http://tracker.ceph.com/issues/14364>`_, `pr#7981 <http://github.com/ceph/ceph/pull/7981>`_, Sage Weil)
+* radosgw-admin: allow (`pr#8529 <http://github.com/ceph/ceph/pull/8529>`_, Orit Wasserman)
+* rbd-mirror: workaround for intermingled lockdep singletons (`pr#8476 <http://github.com/ceph/ceph/pull/8476>`_, Jason Dillaman)
+* rbd: journal reset should disable/re-enable journaling feature (`issue#15097 <http://tracker.ceph.com/issues/15097>`_, `pr#8490 <http://github.com/ceph/ceph/pull/8490>`_, Jason Dillaman)
+* rgw-admin: remove unused iterator and fix error message (`pr#8507 <http://github.com/ceph/ceph/pull/8507>`_, Karol Mroz)
+* rgw: aws4 subdomain calling bugfix (`issue#15369 <http://tracker.ceph.com/issues/15369>`_, `pr#8472 <http://github.com/ceph/ceph/pull/8472>`_, Javier M. Mellid)
+* rgw: fix a typo in error message (`pr#8434 <http://github.com/ceph/ceph/pull/8434>`_, Abhishek Lekshmanan)
+* rgw: fix problem deleting objects begining with double underscores (`issue#15318 <http://tracker.ceph.com/issues/15318>`_, `pr#8488 <http://github.com/ceph/ceph/pull/8488>`_, Orit Wasserman)
+* rgw: retry RGWRemoteMetaLog::read_log_info() while master is down (`pr#8453 <http://github.com/ceph/ceph/pull/8453>`_, Casey Bodley)
+* rgw: the map 'headers' is assigned a wrong value (`pr#8481 <http://github.com/ceph/ceph/pull/8481>`_, weiqiaomiao)
+* rgw_ldap: make ldap.h inclusion conditional (`pr#8500 <http://github.com/ceph/ceph/pull/8500>`_, Matt Benjamin)
+* systemd: drop any systemd imposed process/thread limits (`pr#8450 <http://github.com/ceph/ceph/pull/8450>`_, James Page)
+* test: fix ut test failure caused by lfn change (`issue#15464 <http://tracker.ceph.com/issues/15464>`_, `pr#8544 <http://github.com/ceph/ceph/pull/8544>`_, xie xingguo)
+* test: fix valgrind memcheck issues for rbd-mirror test cases (`issue#15354 <http://tracker.ceph.com/issues/15354>`_, `pr#8493 <http://github.com/ceph/ceph/pull/8493>`_, Jason Dillaman)
+* tests: add Ubuntu 16.04 xenial dockerfile (`pr#8519 <http://github.com/ceph/ceph/pull/8519>`_, Loic Dachary)
+
+v10.1.1 Jewel (release candidate)
+=================================
+
+This is the first release build that includes arm64/aarch64 packages
+for Ubuntu Xenial 16.04.
+
+Know issues with this release candidate
+---------------------------------------
+
+There are a few known issues to watch out for:
+
+ * Old CephFS clusters will mangle the layouts with this release; the
+   fix was committed just after it was cut.  Wait for the next RC or the
+   release if you're upgrading a cluster that has a CephFS data pool as
+   pool 0.
+
+ * The upstart ceph-mds-all.conf file is missing.
+
+
+Notable Changes since v10.1.0
+-----------------------------
+
+* Adding documentation on how to use new dynamic throttle scheme (`pr#8069 <http://github.com/ceph/ceph/pull/8069>`_, Somnath Roy)
+* Be more careful about directory fragmentation and scrubbing (`issue#15167 <http://tracker.ceph.com/issues/15167>`_, `pr#8180 <http://github.com/ceph/ceph/pull/8180>`_, Yan, Zheng)
+* CMake: For CMake version <= 2.8.11, use LINK_PRIVATE (`pr#8422 <http://github.com/ceph/ceph/pull/8422>`_, Haomai Wang)
+* Makefile-env.am: set a default for CEPH_BUILD_VIRTUALENV (part 2) (`pr#8320 <http://github.com/ceph/ceph/pull/8320>`_, Loic Dachary)
+* Minor fixes around data scan in some scenarios (`pr#8115 <http://github.com/ceph/ceph/pull/8115>`_, Yan, Zheng)
+* PG: pg down state blocked by osd.x, lost osd.x cannot solve peering stuck (`issue#13531 <http://tracker.ceph.com/issues/13531>`_, `pr#6317 <http://github.com/ceph/ceph/pull/6317>`_, Xiaowei Chen)
+* osd/PG: indicate in pg query output whether ignore_history_les would help (`pr#8156 <http://github.com/ceph/ceph/pull/8156>`_, Sage Weil)
+* Striper: reduce assemble_result log level (`pr#8426 <http://github.com/ceph/ceph/pull/8426>`_, Jason Dillaman)
+* Test exit values on test.sh, fix tier.cc (`issue#15165 <http://tracker.ceph.com/issues/15165>`_, `pr#8266 <http://github.com/ceph/ceph/pull/8266>`_, Samuel Just)
+* ceph.in: correct dev python path for automake builds (`pr#8360 <http://github.com/ceph/ceph/pull/8360>`_, Josh Durgin)
+* osd/OSD: fix build_past_intervals_parallel (`pr#8215 <http://github.com/ceph/ceph/pull/8215>`_, David Zafman)
+* rgw: sync fixes 4 (`pr#8190 <http://github.com/ceph/ceph/pull/8190>`_, Yehuda Sadeh)
+* [rgw] Check return code in RGWFileHandle::write (`pr#7875 <http://github.com/ceph/ceph/pull/7875>`_, Brad Hubbard)
+* build: fix compiling warnings (`pr#8366 <http://github.com/ceph/ceph/pull/8366>`_, Dongsheng Yang)
+* ceph-detect-init/run-tox.sh: FreeBSD: No init detect (`pr#8373 <http://github.com/ceph/ceph/pull/8373>`_, Willem Jan Withagen)
+* ceph.in: fix python libpath for automake as well (`pr#8362 <http://github.com/ceph/ceph/pull/8362>`_, Josh Durgin)
+* ceph: bash auto complete for CLI based on mon command descriptions (`pr#7693 <http://github.com/ceph/ceph/pull/7693>`_, Adam Kupczyk)
+* cls_journal: fix -EEXIST checking (`pr#8413 <http://github.com/ceph/ceph/pull/8413>`_, runsisi)
+* cls_rbd: fix -EEXIST checking in cls::rbd::image_set (`pr#8371 <http://github.com/ceph/ceph/pull/8371>`_, runsisi)
+* cls_rbd: mirror_image_list should return global image id (`pr#8297 <http://github.com/ceph/ceph/pull/8297>`_, Jason Dillaman)
+* cls_rbd: pass WILLNEED fadvise flags during object map update (`issue#15332 <http://tracker.ceph.com/issues/15332>`_, `pr#8380 <http://github.com/ceph/ceph/pull/8380>`_, Jason Dillaman)
+* cls_rbd: read_peers: update last_read on next cls_cxx_map_get_vals (`pr#8374 <http://github.com/ceph/ceph/pull/8374>`_, Mykola Golub)
+* cmake: Build cython modules and change paths to bin/, lib/ (`pr#8351 <http://github.com/ceph/ceph/pull/8351>`_, John Spray, Ali Maredia)
+* cmake: add FindOpenSSL.cmake (`pr#8106 <http://github.com/ceph/ceph/pull/8106>`_, Marcus Watts, Matt Benjamin)
+* cmake: add StandardPolicy.cc to librbd (`pr#8368 <http://github.com/ceph/ceph/pull/8368>`_, Kefu Chai)
+* cmake: add missing librbd/MirrorWatcher.cc and librd/ObjectWatcher.cc (`pr#8399 <http://github.com/ceph/ceph/pull/8399>`_, Orit Wasserman)
+* cmake: fix mrun to handle cmake build structure (`pr#8237 <http://github.com/ceph/ceph/pull/8237>`_, Orit Wasserman)
+* cmake: fix the build of test_rados_api_list (`pr#8438 <http://github.com/ceph/ceph/pull/8438>`_, Kefu Chai)
+* common: fix race during optracker switches between enabled/disabled mode (`pr#8330 <http://github.com/ceph/ceph/pull/8330>`_, xie xingguo)
+* config_opts: disable filestore throttle soft backoff by default (`pr#8265 <http://github.com/ceph/ceph/pull/8265>`_, Samuel Just)
+* configure: Add -D_LARGEFILE64_SOURCE to Linux build. (`pr#8402 <http://github.com/ceph/ceph/pull/8402>`_, Ira Cooper)
+* crush: fix error log (`pr#8430 <http://github.com/ceph/ceph/pull/8430>`_, Wei Jin)
+* crushtool: Don't crash when called on a file that isn't a crushmap (`issue#8286 <http://tracker.ceph.com/issues/8286>`_, `pr#8038 <http://github.com/ceph/ceph/pull/8038>`_, Brad Hubbard)
+* debian/rules: put init-ceph in /etc/init.d/ceph, not ceph-base (`issue#15329 <http://tracker.ceph.com/issues/15329>`_, `pr#8406 <http://github.com/ceph/ceph/pull/8406>`_, Dan Mick)
+* doc/dev: add "Deploy a cluster for manual testing" section (`issue#15218 <http://tracker.ceph.com/issues/15218>`_, `pr#8228 <http://github.com/ceph/ceph/pull/8228>`_, Nathan Cutler)
+* doc/rados/operations/crush: fix the formatting (`pr#8306 <http://github.com/ceph/ceph/pull/8306>`_, Kefu Chai)
+* doc/release-notes: fix indents (`pr#8345 <http://github.com/ceph/ceph/pull/8345>`_, Kefu Chai)
+* doc: Fixes headline different font size and type (`pr#8328 <http://github.com/ceph/ceph/pull/8328>`_, scienceluo)
+* doc: Remove Ceph Monitors do lots of fsync() (`issue#15288 <http://tracker.ceph.com/issues/15288>`_, `pr#8327 <http://github.com/ceph/ceph/pull/8327>`_, Vikhyat Umrao)
+* doc: Updated CloudStack RBD documentation (`pr#8308 <http://github.com/ceph/ceph/pull/8308>`_, Wido den Hollander)
+* doc: amend Fixes instructions in SubmittingPatches (`pr#8312 <http://github.com/ceph/ceph/pull/8312>`_, Nathan Cutler)
+* doc: draft notes for jewel (`pr#8211 <http://github.com/ceph/ceph/pull/8211>`_, Loic Dachary, Sage Weil)
+* doc: fix typo, duplicated content etc. for Jewel release notes (`pr#8342 <http://github.com/ceph/ceph/pull/8342>`_, xie xingguo)
+* doc: fix wrong type of hyphen (`pr#8252 <http://github.com/ceph/ceph/pull/8252>`_, xie xingguo)
+* doc: rgw_region_root_pool option should be in [global] (`issue#15244 <http://tracker.ceph.com/issues/15244>`_, `pr#8271 <http://github.com/ceph/ceph/pull/8271>`_, Vikhyat Umrao)
+* doc: very basic doc on mstart (`pr#8207 <http://github.com/ceph/ceph/pull/8207>`_, Abhishek Lekshmanan)
+* global/global_init: expand metavariables in setuser_match_path (`issue#15365 <http://tracker.ceph.com/issues/15365>`_, `pr#8433 <http://github.com/ceph/ceph/pull/8433>`_, Sage Weil)
+* global/signal_handler: print thread name in signal handler (`pr#8177 <http://github.com/ceph/ceph/pull/8177>`_, Jianpeng Ma)
+* libcephfs: fix python tests and fix getcwd on missing dir (`pr#7901 <http://github.com/ceph/ceph/pull/7901>`_, John Spray)
+* librbd: avoid throwing error if mirroring is unsupported (`pr#8417 <http://github.com/ceph/ceph/pull/8417>`_, Jason Dillaman)
+* librbd: disable image mirroring when image is removed (`issue#15265 <http://tracker.ceph.com/issues/15265>`_, `pr#8375 <http://github.com/ceph/ceph/pull/8375>`_, Ricardo Dias)
+* librbd: send notifications for mirroring status updates (`pr#8355 <http://github.com/ceph/ceph/pull/8355>`_, Jason Dillaman)
+* mailmap updates (`pr#8256 <http://github.com/ceph/ceph/pull/8256>`_, Loic Dachary)
+* makefile: fix rbdmap manpage (`pr#8310 <http://github.com/ceph/ceph/pull/8310>`_, Kefu Chai)
+* mds: allow client to request caps when opening file (`issue#14360 <http://tracker.ceph.com/issues/14360>`_, `pr#7952 <http://github.com/ceph/ceph/pull/7952>`_, Yan, Zheng)
+* messages/MOSDOp: clear reqid inc for v6 encoding (`issue#15230 <http://tracker.ceph.com/issues/15230>`_, `pr#8299 <http://github.com/ceph/ceph/pull/8299>`_, Sage Weil)
+* mon/MonClient: fix shutdown race (`issue#13992 <http://tracker.ceph.com/issues/13992>`_, `pr#8335 <http://github.com/ceph/ceph/pull/8335>`_, Sage Weil)
+* mon: do not send useless pg_create messages for split pgs (`pr#8247 <http://github.com/ceph/ceph/pull/8247>`_, Sage Weil)
+* mon: mark_down_pgs in lockstep with pg_map's osdmap epoch (`pr#8208 <http://github.com/ceph/ceph/pull/8208>`_, Sage Weil)
+* mon: remove remove_legacy_versions() (`pr#8324 <http://github.com/ceph/ceph/pull/8324>`_, Kefu Chai)
+* mon: remove unnecessary comment for update_from_paxos (`pr#8400 <http://github.com/ceph/ceph/pull/8400>`_, Qinghua Jin)
+* mon: remove unused variable (`issue#15292 <http://tracker.ceph.com/issues/15292>`_, `pr#8337 <http://github.com/ceph/ceph/pull/8337>`_, Javier M. Mellid)
+* mon: show the pool quota info on ceph df detail command (`issue#14216 <http://tracker.ceph.com/issues/14216>`_, `pr#7094 <http://github.com/ceph/ceph/pull/7094>`_, song baisen)
+* monclient: avoid key renew storm on clock skew (`issue#12065 <http://tracker.ceph.com/issues/12065>`_, `pr#8258 <http://github.com/ceph/ceph/pull/8258>`_, Alexey Sheplyakov)
+* mrun: update path to cmake binaries (`pr#8447 <http://github.com/ceph/ceph/pull/8447>`_, Casey Bodley)
+* msg/async: avoid log spam on throttle (`issue#15031 <http://tracker.ceph.com/issues/15031>`_, `pr#8263 <http://github.com/ceph/ceph/pull/8263>`_, Kefu Chai)
+* msg/async: remove experiment feature (`pr#7820 <http://github.com/ceph/ceph/pull/7820>`_, Haomai Wang)
+* os/ObjectStore: add noexcept to ensure move ctor is used (`pr#8421 <http://github.com/ceph/ceph/pull/8421>`_, Kefu Chai)
+* os/ObjectStore: fix _update_op for split dest_cid (`pr#8364 <http://github.com/ceph/ceph/pull/8364>`_, Sage Weil)
+* os/ObjectStore: try_move_rename in transaction append and add coverage to store_test (`issue#15205 <http://tracker.ceph.com/issues/15205>`_, `pr#8359 <http://github.com/ceph/ceph/pull/8359>`_, Samuel Just)
+* os/bluestore: a few fixes (`pr#8193 <http://github.com/ceph/ceph/pull/8193>`_, Sage Weil)
+* os/bluestore: ceph-bluefs-tool fixes (`issue#15261 <http://tracker.ceph.com/issues/15261>`_, `pr#8292 <http://github.com/ceph/ceph/pull/8292>`_, Venky Shankar)
+* osd/ClassHandler: only dlclose() the classes not missing (`pr#8354 <http://github.com/ceph/ceph/pull/8354>`_, Kefu Chai)
+* osd/OSD.cc: finish full_map_request every MOSDMap message. (`issue#15130 <http://tracker.ceph.com/issues/15130>`_, `pr#8147 <http://github.com/ceph/ceph/pull/8147>`_, Xiaoxi Chen)
+* osd: add 'proxy' cache mode (`issue#12814 <http://tracker.ceph.com/issues/12814>`_, `pr#8210 <http://github.com/ceph/ceph/pull/8210>`_, Sage Weil)
+* osd: add the support of per pool scrub priority (`pr#7062 <http://github.com/ceph/ceph/pull/7062>`_, Zhiqiang Wang)
+* osd: bail out of _committed_osd_maps if we are shutting down (`pr#8267 <http://github.com/ceph/ceph/pull/8267>`_, Samuel Just)
+* osd: duplicated clear for peer_missing (`pr#8315 <http://github.com/ceph/ceph/pull/8315>`_, Ning Yao)
+* osd: fix bugs for omap ops (`pr#8230 <http://github.com/ceph/ceph/pull/8230>`_, Jianpeng Ma)
+* osd: fix dirtying info without correctly setting drity_info field (`pr#8275 <http://github.com/ceph/ceph/pull/8275>`_, xie xingguo)
+* osd: fix dump_ops_in_flight races (`issue#8885 <http://tracker.ceph.com/issues/8885>`_, `pr#8044 <http://github.com/ceph/ceph/pull/8044>`_, David Zafman)
+* osd: fix epoch check in handle_pg_create (`pr#8382 <http://github.com/ceph/ceph/pull/8382>`_, Samuel Just)
+* osd: fix failure report handling during ms_handle_connect() (`pr#8348 <http://github.com/ceph/ceph/pull/8348>`_, xie xingguo)
+* osd: fix log info (`pr#8273 <http://github.com/ceph/ceph/pull/8273>`_, Wei Jin)
+* osd: fix reference count, rare race condition etc. (`pr#8254 <http://github.com/ceph/ceph/pull/8254>`_, xie xingguo)
+* osd: fix tick relevant issues (`pr#8369 <http://github.com/ceph/ceph/pull/8369>`_, xie xingguo)
+* osd: more fixes for incorrectly dirtying info; resend reply for duplicated scrub-reserve req (`pr#8291 <http://github.com/ceph/ceph/pull/8291>`_, xie xingguo)
+* osdc/Objecter: dout log after assign tid (`pr#8202 <http://github.com/ceph/ceph/pull/8202>`_, Xinze Chi)
+* osdc/Objecter: use full pgid hash in PGNLS ops (`pr#8378 <http://github.com/ceph/ceph/pull/8378>`_, Sage Weil)
+* osdmap: rm nonused variable (`pr#8423 <http://github.com/ceph/ceph/pull/8423>`_, Wei Jin)
+* pybind/Makefile.am: Prevent race creating CYTHON_BUILD_DIR (`issue#15276 <http://tracker.ceph.com/issues/15276>`_, `pr#8356 <http://github.com/ceph/ceph/pull/8356>`_, Dan Mick)
+* pybind/rados: python3 fix (`pr#8331 <http://github.com/ceph/ceph/pull/8331>`_, Mehdi Abaakouk)
+* pybind: add flock to libcephfs python bindings (`pr#7902 <http://github.com/ceph/ceph/pull/7902>`_, John Spray)
+* qa: update rest test cephfs calls (`issue#15309 <http://tracker.ceph.com/issues/15309>`_, `pr#8372 <http://github.com/ceph/ceph/pull/8372>`_, John Spray)
+* qa: update rest test cephfs calls (part 2) (`issue#15309 <http://tracker.ceph.com/issues/15309>`_, `pr#8393 <http://github.com/ceph/ceph/pull/8393>`_, John Spray)
+* radosgw-admin: 'period commit' supplies user-readable error messages (`pr#8264 <http://github.com/ceph/ceph/pull/8264>`_, Casey Bodley)
+* radosgw-admin: fix for 'realm pull' (`pr#8404 <http://github.com/ceph/ceph/pull/8404>`_, Casey Bodley)
+* rbd-mirror: asok commands to get status and flush on Mirror and Replayer level (`pr#8235 <http://github.com/ceph/ceph/pull/8235>`_, Mykola Golub)
+* rbd-mirror: enabling/disabling pool mirroring should update the mirroring directory (`issue#15217 <http://tracker.ceph.com/issues/15217>`_, `pr#8261 <http://github.com/ceph/ceph/pull/8261>`_, Ricardo Dias)
+* rbd-mirror: fix missing increment for iterators (`pr#8352 <http://github.com/ceph/ceph/pull/8352>`_, runsisi)
+* rbd-mirror: initial failover / failback support (`pr#8287 <http://github.com/ceph/ceph/pull/8287>`_, Jason Dillaman)
+* rbd-mirror: prevent enabling/disabling an image's mirroring when not in image mode (`issue#15267 <http://tracker.ceph.com/issues/15267>`_, `pr#8332 <http://github.com/ceph/ceph/pull/8332>`_, Ricardo Dias)
+* rbd-mirror: switch fsid over to mirror uuid (`issue#15238 <http://tracker.ceph.com/issues/15238>`_, `pr#8280 <http://github.com/ceph/ceph/pull/8280>`_, Ricardo Dias)
+* rbd: allow librados to prune the command-line for config overrides (`issue#15250 <http://tracker.ceph.com/issues/15250>`_, `pr#8282 <http://github.com/ceph/ceph/pull/8282>`_, Jason Dillaman)
+* rbdmap: add manpage (`issue#15212 <http://tracker.ceph.com/issues/15212>`_, `pr#8224 <http://github.com/ceph/ceph/pull/8224>`_, Nathan Cutler)
+* releases: what is merged where and when ? (`pr#8358 <http://github.com/ceph/ceph/pull/8358>`_, Loic Dachary)
+* rgw/rgw_admin:fix bug about list and stats command (`pr#8200 <http://github.com/ceph/ceph/pull/8200>`_, Qiankun Zheng)
+* rgw: Do not send a Content-Type on a '304 Not Modified' response (`issue#15119 <http://tracker.ceph.com/issues/15119>`_, `pr#8253 <http://github.com/ceph/ceph/pull/8253>`_, Wido den Hollander)
+* rgw: Multipart ListPartsResult ETag quotes (`issue#15334 <http://tracker.ceph.com/issues/15334>`_, `pr#8387 <http://github.com/ceph/ceph/pull/8387>`_, Robin H. Johnson)
+* rgw: S3: set EncodingType in ListBucketResult (`pr#7712 <http://github.com/ceph/ceph/pull/7712>`_, Victor Makarov)
+* rgw: accept data only at the first time in response to a request (`pr#8084 <http://github.com/ceph/ceph/pull/8084>`_, sunspot)
+* rgw: add a few more help options in admin interface (`pr#8410 <http://github.com/ceph/ceph/pull/8410>`_, Abhishek Lekshmanan)
+* rgw: add zone delete to rgw-admin help (`pr#8184 <http://github.com/ceph/ceph/pull/8184>`_, Abhishek Lekshmanan)
+* rgw: convert plain object to versioned (with null version) when removing (`issue#15243 <http://tracker.ceph.com/issues/15243>`_, `pr#8268 <http://github.com/ceph/ceph/pull/8268>`_, Yehuda Sadeh)
+* rgw: fix compiling error (`pr#8394 <http://github.com/ceph/ceph/pull/8394>`_, xie xingguo)
+* rgw: fix lockdep false positive (`pr#8284 <http://github.com/ceph/ceph/pull/8284>`_, Yehuda Sadeh)
+* rgw:Use count fn in RGWUserBuckets for quota check (`pr#8294 <http://github.com/ceph/ceph/pull/8294>`_, Abhishek Lekshmanan)
+* rgw_admin: remove unused parent_period arg (`pr#8411 <http://github.com/ceph/ceph/pull/8411>`_, Abhishek Lekshmanan)
+* rgw_file: set owner uid, gid, and Unix mode on new objects (`pr#8321 <http://github.com/ceph/ceph/pull/8321>`_, Matt Benjamin)
+* rpm: prefer UID/GID 167 when creating ceph user/group (`issue#15246 <http://tracker.ceph.com/issues/15246>`_, `pr#8277 <http://github.com/ceph/ceph/pull/8277>`_, Nathan Cutler)
+* script: subscription-manager support (`issue#14972 <http://tracker.ceph.com/issues/14972>`_, `pr#7907 <http://github.com/ceph/ceph/pull/7907>`_, Loic Dachary)
+* set 128MB tcmalloc cache size by bytes (`pr#8427 <http://github.com/ceph/ceph/pull/8427>`_, Star Guo)
+* systemd: set up environment in rbdmap unit file (`issue#14984 <http://tracker.ceph.com/issues/14984>`_, `pr#8222 <http://github.com/ceph/ceph/pull/8222>`_, Nathan Cutler)
+* test/system/*: use dynamically generated pool name (`issue#15240 <http://tracker.ceph.com/issues/15240>`_, `pr#8318 <http://github.com/ceph/ceph/pull/8318>`_, Kefu Chai)
+* test/system/rados_list_parallel: print oid if rados_write fails (`issue#15240 <http://tracker.ceph.com/issues/15240>`_, `pr#8309 <http://github.com/ceph/ceph/pull/8309>`_, Kefu Chai)
+* test/test-erasure-code.sh: disable pg_temp priming (`issue#15211 <http://tracker.ceph.com/issues/15211>`_, `pr#8260 <http://github.com/ceph/ceph/pull/8260>`_, Sage Weil)
+* test/test_pool_create.sh: fix port (`pr#8361 <http://github.com/ceph/ceph/pull/8361>`_, Sage Weil)
+* test: Fix test to run with btrfs which has snap_### dirs (`issue#15347 <http://tracker.ceph.com/issues/15347>`_, `pr#8420 <http://github.com/ceph/ceph/pull/8420>`_, David Zafman)
+* test: TestMirroringWatcher test cases were not closing images (`pr#8435 <http://github.com/ceph/ceph/pull/8435>`_, Jason Dillaman)
+* test: rbd-mirror: script improvements for manual testing (`pr#8325 <http://github.com/ceph/ceph/pull/8325>`_, Mykola Golub)
+* tests: Fixing broken test/cephtool-test-mon.sh test (`pr#8429 <http://github.com/ceph/ceph/pull/8429>`_, Erwan Velu)
+* tests: Improving 'make check' execution time (`pr#8131 <http://github.com/ceph/ceph/pull/8131>`_, Erwan Velu)
+* unittest_erasure_code_plugin: fix deadlock (Alpine) (`pr#8314 <http://github.com/ceph/ceph/pull/8314>`_, John Coyle)
+* vstart: fix up cmake paths when VSTART_DEST is given (`pr#8363 <http://github.com/ceph/ceph/pull/8363>`_, Casey Bodley)
+* vstart: make -k with optional mon_num. (`pr#8251 <http://github.com/ceph/ceph/pull/8251>`_, Jianpeng Ma)
+* xio: add prefix to xio msgr logs (`pr#8148 <http://github.com/ceph/ceph/pull/8148>`_, Roi Dayan)
+* xio: fix compilation against latest accelio (`pr#8022 <http://github.com/ceph/ceph/pull/8022>`_, Roi Dayan)
+* xio: xio_init needs to be called before any other xio function (`pr#8227 <http://github.com/ceph/ceph/pull/8227>`_, Roi Dayan)
+* ceph.spec.in: disable lttng and babeltrace explicitly (`issue#14844 <http://tracker.ceph.com/issues/14844>`_, `pr#7857 <http://github.com/ceph/ceph/pull/7857>`_, Kefu Chai)
+
+v10.1.0 Jewel (release candidate)
+=================================
+   
+There are a few known issues with this release candidate; see below.
+
+Known Issues with v10.1.0
+-------------------------
+
+* While running a mixed version cluster of jewel and infernalis or
+  hammer monitors, any MDSMap updates will cause the pre-jewel
+  monitors to crash.  Workaround is to simply upgrde all monitors.
+  There is a fix but it is still being tested.
+
+* Some of the rbd-mirror functionality for switching between active
+  and replica images is not yet merged.
+
+Notable Changes since v10.0.4
+-----------------------------
+
+* ceph.spec.in: do not install Ceph RA on systemd platforms (`issue#14828 <http://tracker.ceph.com/issues/14828>`_, `pr#7894 <http://github.com/ceph/ceph/pull/7894>`_, Nathan Cutler)
+* mdsa: A few more snapshot fixes, mostly around snapshotted inode/dentry tracking (`pr#7798 <http://github.com/ceph/ceph/pull/7798>`_, Yan, Zheng)
+* AUTHORS: update email (`pr#7854 <http://github.com/ceph/ceph/pull/7854>`_, Yehuda Sadeh)
+* ceph-disk: Add --setuser and --setgroup options for ceph-disk (`pr#7351 <http://github.com/ceph/ceph/pull/7351>`_, Mike Shuey)
+* build: Adding build requires (`pr#7742 <http://github.com/ceph/ceph/pull/7742>`_, Erwan Velu)
+* msg/async: AsyncMessenger: fix several bugs (`pr#7831 <http://github.com/ceph/ceph/pull/7831>`_, Haomai Wang)
+* msg/async: AsyncMessenger: fix valgrind leak (`pr#7725 <http://github.com/ceph/ceph/pull/7725>`_, Haomai Wang)
+* doc: Clarify usage on starting single osd/mds/mon. (`pr#7641 <http://github.com/ceph/ceph/pull/7641>`_, Patrick Donnelly)
+* common: Deprecate or free up a bunch of feature bits (`pr#8214 <http://github.com/ceph/ceph/pull/8214>`_, Samuel Just)
+* msg/async: Event: fix clock skew problem (`pr#7949 <http://github.com/ceph/ceph/pull/7949>`_, Wei Jin)
+* osd: FileStore: Added O_DSYNC write scheme (`pr#7752 <http://github.com/ceph/ceph/pull/7752>`_, Somnath Roy)
+* osd: FileStore: fix initialization order for m_disable_wbthrottle (`pr#8067 <http://github.com/ceph/ceph/pull/8067>`_, Samuel Just)
+* build: Fixing BTRFS issue at 'make check' (`pr#7805 <http://github.com/ceph/ceph/pull/7805>`_, Erwan Velu)
+* build: FreeBSD related fixes (`pr#7170 <http://github.com/ceph/ceph/pull/7170>`_, Mykola Golub)
+* ceph-disk: Improving 'make check' for ceph-disk (`pr#7762 <http://github.com/ceph/ceph/pull/7762>`_, Erwan Velu)
+* rgw: increase verbosity level on RGWObjManifest line (`pr#7285 <http://github.com/ceph/ceph/pull/7285>`_, magicrobotmonkey)
+* build: workaround an automake bug for "make check" (`issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7626 <http://github.com/ceph/ceph/pull/7626>`_, Kefu Chai)
+* ceph-fuse,libcephfs: Fix client handling of "lost" open directories on shutdown (`issue#14996 <http://tracker.ceph.com/issues/14996>`_, `pr#7994 <http://github.com/ceph/ceph/pull/7994>`_, Yan, Zheng)
+* mds: Multi-filesystem support (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#6953 <http://github.com/ceph/ceph/pull/6953>`_, John Spray, Sage Weil)
+* os/bluestore/NVMEDevice: refactor probe/attach codes and support zero command (`pr#7647 <http://github.com/ceph/ceph/pull/7647>`_, Haomai Wang)
+* librados: detect laggy ops with objecter_timeout, not osd_timeout (`pr#7629 <http://github.com/ceph/ceph/pull/7629>`_, Greg Farnum)
+* ceph.spec.in: fix openldap and openssl build dependencies for SUSE (`issue#15138 <http://tracker.ceph.com/issues/15138>`_, `pr#8120 <http://github.com/ceph/ceph/pull/8120>`_, Nathan Cutler)
+* osd: repop and lost-unfound overhaul (`pr#7765 <http://github.com/ceph/ceph/pull/7765>`_, Samuel Just)
+* librbd: Revert "librbd: use task finisher per CephContext" (`issue#14780 <http://tracker.ceph.com/issues/14780>`_, `pr#7667 <http://github.com/ceph/ceph/pull/7667>`_, Josh Durgin)
+* rgw: Fix subuser harder with tenants (`pr#7618 <http://github.com/ceph/ceph/pull/7618>`_, Pete Zaitcev)
+* rgw: ldap fixes (`pr#8168 <http://github.com/ceph/ceph/pull/8168>`_, Matt Benjamin)
+* rgw: check the return value when call fe->run() (`issue#14585 <http://tracker.ceph.com/issues/14585>`_, `pr#7457 <http://github.com/ceph/ceph/pull/7457>`_, wei qiaomiao)
+* rgw: Revert "rgw ldap" (`pr#8075 <http://github.com/ceph/ceph/pull/8075>`_, Yehuda Sadeh)
+* librados: Striper: Fix incorrect push_front -> append_zero change (`pr#7578 <http://github.com/ceph/ceph/pull/7578>`_, Haomai Wang)
+* rgw: build-related fixes (`pr#8076 <http://github.com/ceph/ceph/pull/8076>`_, Yehuda Sadeh, Matt Benjamin)
+* mirrors: Updated scripts and documentation for mirrors (`pr#7847 <http://github.com/ceph/ceph/pull/7847>`_, Wido den Hollander)
+* misc: use make_shared while creating shared_ptr (`pr#7769 <http://github.com/ceph/ceph/pull/7769>`_, Somnath Roy)
+* cmake (`pr#7849 <http://github.com/ceph/ceph/pull/7849>`_, Ali Maredia)
+* mds: filelock deadlock (`pr#7713 <http://github.com/ceph/ceph/pull/7713>`_, Yan, Zheng)
+* mds: fix fsmap decode (`pr#8063 <http://github.com/ceph/ceph/pull/8063>`_, Greg Farnum)
+* rgw: fix mdlog (`pr#8183 <http://github.com/ceph/ceph/pull/8183>`_, Orit Wasserman)
+* rgw: highres time stamps (`pr#8108 <http://github.com/ceph/ceph/pull/8108>`_, Yehuda Sadeh, Adam C. Emerson, Matt Benjamin)
+* rgw: swift versioning disabled (`pr#8066 <http://github.com/ceph/ceph/pull/8066>`_, Yehuda Sadeh, Radoslaw Zarzynski)
+* rgw: sync fixes 3 (`pr#8170 <http://github.com/ceph/ceph/pull/8170>`_, Yehuda Sadeh)
+* msg/xio: fixes (`pr#7603 <http://github.com/ceph/ceph/pull/7603>`_, Roi Dayan)
+* ceph-fuse,libcephfs: fix free fds being exhausted eventually because freed fds are never put back (`issue#14798 <http://tracker.ceph.com/issues/14798>`_, `pr#7685 <http://github.com/ceph/ceph/pull/7685>`_, Zhi Zhang)
+* rgw: RGWLib::env is not used so remove it (`pr#7874 <http://github.com/ceph/ceph/pull/7874>`_, Brad Hubbard)
+* build: a few armhf (32-bit build) fixes (`pr#7999 <http://github.com/ceph/ceph/pull/7999>`_, Eric Lee, Sage Weil)
+* osd: add scrub persist/query API (`issue#13505 <http://tracker.ceph.com/issues/13505>`_, `pr#6898 <http://github.com/ceph/ceph/pull/6898>`_, Kefu Chai, Samuel Just)
+* rgw: adds the radosgw-admin sync status command that gives a human readable status of the sync process at a specific zone (`pr#8030 <http://github.com/ceph/ceph/pull/8030>`_, Yehuda Sadeh)
+* scripts: adjust mstart and mstop script to run with cmake build (`pr#6920 <http://github.com/ceph/ceph/pull/6920>`_, Orit Wasserman)
+* buffer: add symmetry operator==() and operator!=() (`pr#7974 <http://github.com/ceph/ceph/pull/7974>`_, Kefu Chai)
+* buffer: hide iterator_impl symbols (`issue#14788 <http://tracker.ceph.com/issues/14788>`_, `pr#7688 <http://github.com/ceph/ceph/pull/7688>`_, Kefu Chai)
+* buffer: increment history alloc as well in raw_combined (`issue#14955 <http://tracker.ceph.com/issues/14955>`_, `pr#7910 <http://github.com/ceph/ceph/pull/7910>`_, Samuel Just)
+* buffer: raw_combined allocations buffer and ref count together (`pr#7612 <http://github.com/ceph/ceph/pull/7612>`_, Sage Weil)
+* ceph-detect-init: add debian/jessie test (`pr#8074 <http://github.com/ceph/ceph/pull/8074>`_, Kefu Chai)
+* ceph-detect-init: add missing test case (`pr#8105 <http://github.com/ceph/ceph/pull/8105>`_, Nathan Cutler)
+* ceph-detect-init: fix py3 test (`pr#7243 <http://github.com/ceph/ceph/pull/7243>`_, Kefu Chai)
+* ceph-detect-init: return correct value on recent SUSE distros (`issue#14770 <http://tracker.ceph.com/issues/14770>`_, `pr#7909 <http://github.com/ceph/ceph/pull/7909>`_, Nathan Cutler)
+* ceph-disk: deactivate / destroy PATH arg are optional (`pr#7756 <http://github.com/ceph/ceph/pull/7756>`_, Loic Dachary)
+* ceph-disk: fix prepare --help (`pr#7758 <http://github.com/ceph/ceph/pull/7758>`_, Loic Dachary)
+* ceph-disk: flake8 fixes (`pr#7646 <http://github.com/ceph/ceph/pull/7646>`_, Loic Dachary)
+* ceph-disk: key management support (`issue#14669 <http://tracker.ceph.com/issues/14669>`_, `pr#7552 <http://github.com/ceph/ceph/pull/7552>`_, Loic Dachary)
+* ceph-disk: make some arguments as required if necessary (`pr#7687 <http://github.com/ceph/ceph/pull/7687>`_, Dongsheng Yang)
+* ceph-disk: s/dmcrpyt/dmcrypt/ (`issue#14838 <http://tracker.ceph.com/issues/14838>`_, `pr#7744 <http://github.com/ceph/ceph/pull/7744>`_, Loic Dachary, Frode Sandholtbraaten)
+* ceph-fuse: Fix potential filehandle ref leak at umount (`issue#14800 <http://tracker.ceph.com/issues/14800>`_, `pr#7686 <http://github.com/ceph/ceph/pull/7686>`_, Zhi Zhang)
+* ceph.in: Minor python3 specific changes (`pr#7947 <http://github.com/ceph/ceph/pull/7947>`_, Sarthak Munshi)
+* ceph_daemon.py: Resolved ImportError to work with python3 (`pr#7937 <http://github.com/ceph/ceph/pull/7937>`_, Sarthak Munshi)
+* ceph_detect_init/__init__.py: remove shebang (`pr#7731 <http://github.com/ceph/ceph/pull/7731>`_, Nathan Cutler)
+* ceph_test_msgr: reduce test size to fix memory size (`pr#8127 <http://github.com/ceph/ceph/pull/8127>`_, Haomai Wang)
+* ceph_test_rados_misc: shorten mount timeout (`pr#8209 <http://github.com/ceph/ceph/pull/8209>`_, Sage Weil)
+* cleanup (`pr#8058 <http://github.com/ceph/ceph/pull/8058>`_, Yehuda Sadeh, Orit Wasserman)
+* client: flush kernel pagecache before creating snapshot (`issue#10436 <http://tracker.ceph.com/issues/10436>`_, `pr#7495 <http://github.com/ceph/ceph/pull/7495>`_, Yan, Zheng)
+* client: removed unused Mutex from MetaRequest (`pr#7655 <http://github.com/ceph/ceph/pull/7655>`_, Greg Farnum)
+* cls/rgw: fix FTBFS (`pr#8142 <http://github.com/ceph/ceph/pull/8142>`_, Kefu Chai)
+* cls/rgw: fix use of timespan (`issue#15181 <http://tracker.ceph.com/issues/15181>`_, `pr#8212 <http://github.com/ceph/ceph/pull/8212>`_, Yehuda Sadeh)
+* cls_hello: Fix grammatical error in description comment (`pr#7951 <http://github.com/ceph/ceph/pull/7951>`_, Brad Hubbard)
+* cls_rbd: fix the test for ceph-dencoder (`pr#7793 <http://github.com/ceph/ceph/pull/7793>`_, Kefu Chai)
+* cls_rbd: mirroring directory (`issue#14419 <http://tracker.ceph.com/issues/14419>`_, `pr#7620 <http://github.com/ceph/ceph/pull/7620>`_, Josh Durgin)
+* cls_rbd: protect against excessively large object maps (`issue#15121 <http://tracker.ceph.com/issues/15121>`_, `pr#8099 <http://github.com/ceph/ceph/pull/8099>`_, Jason Dillaman)
+* cmake: Remove duplicate find_package libcurl line. (`pr#7972 <http://github.com/ceph/ceph/pull/7972>`_, Brad Hubbard)
+* cmake: add ErasureCode.cc to jerasure plugins (`pr#7808 <http://github.com/ceph/ceph/pull/7808>`_, Casey Bodley)
+* cmake: add common/fs_types.cc to libcommon (`pr#7898 <http://github.com/ceph/ceph/pull/7898>`_, Orit Wasserman)
+* cmake: add missing librbd image_watcher sources (`issue#14823 <http://tracker.ceph.com/issues/14823>`_, `pr#7717 <http://github.com/ceph/ceph/pull/7717>`_, Casey Bodley)
+* cmake: avoid false-positive LDAP header detect (`pr#8100 <http://github.com/ceph/ceph/pull/8100>`_, Matt Benjamin)
+* cmake: fix paths to various EC source files (`pr#7748 <http://github.com/ceph/ceph/pull/7748>`_, Ali Maredia, Matt Benjamin)
+* cmake: fix the build of tests (`pr#7523 <http://github.com/ceph/ceph/pull/7523>`_, Kefu Chai)
+* common/TrackedOp: fix inaccurate counting for slow requests (`issue#14804 <http://tracker.ceph.com/issues/14804>`_, `pr#7690 <http://github.com/ceph/ceph/pull/7690>`_, xie xingguo)
+* common/bit_vector: use hard-coded value for block size (`issue#14747 <http://tracker.ceph.com/issues/14747>`_, `pr#7610 <http://github.com/ceph/ceph/pull/7610>`_, Jason Dillaman)
+* common/obj_bencher.cc: bump the precision of bandwidth field (`pr#8021 <http://github.com/ceph/ceph/pull/8021>`_, Piotr Dałek)
+* common/obj_bencher.cc: faster object name generation (`pr#7863 <http://github.com/ceph/ceph/pull/7863>`_, Piotr Dałek)
+* common/obj_bencher.cc: make verify error fatal (`issue#14971 <http://tracker.ceph.com/issues/14971>`_, `pr#7897 <http://github.com/ceph/ceph/pull/7897>`_, Piotr Dałek)
+* common/page.cc: _page_mask has too many bits (`pr#7588 <http://github.com/ceph/ceph/pull/7588>`_, Dan Mick)
+* common/strtol.cc: fix the coverity warnings (`pr#7967 <http://github.com/ceph/ceph/pull/7967>`_, Kefu Chai)
+* common: Do not use non-portable constants in mutex_debug (`pr#7766 <http://github.com/ceph/ceph/pull/7766>`_, Adam C. Emerson)
+* common: SubProcess: Avoid buffer corruption when calling err() (`issue#15011 <http://tracker.ceph.com/issues/15011>`_, `pr#8054 <http://github.com/ceph/ceph/pull/8054>`_, Erwan Velu)
+* common: default cluster name to config file prefix (`pr#7364 <http://github.com/ceph/ceph/pull/7364>`_, Javen Wu)
+* common: set thread name from correct thread (`pr#7845 <http://github.com/ceph/ceph/pull/7845>`_, Igor Podoski)
+* common: various fixes from SCA runs (`pr#7680 <http://github.com/ceph/ceph/pull/7680>`_, Danny Al-Gaaf)
+* config: fix osd_crush_initial_weight (`pr#7975 <http://github.com/ceph/ceph/pull/7975>`_, You Ji)
+* config: increase default async op threads (`pr#7802 <http://github.com/ceph/ceph/pull/7802>`_, Piotr Dałek)
+* configure.ac: boost_iostreams is required, not optional (`pr#7816 <http://github.com/ceph/ceph/pull/7816>`_, Hector Martin)
+* configure.ac: update help strings for cython (`pr#7856 <http://github.com/ceph/ceph/pull/7856>`_, Josh Durgin)
+* crush/CrushTester: workaround a bug in boost::icl (`pr#7560 <http://github.com/ceph/ceph/pull/7560>`_, Kefu Chai)
+* crush: fix cli tests for new crush tunables (`pr#8107 <http://github.com/ceph/ceph/pull/8107>`_, Sage Weil)
+* crush: update tunable docs.  change default profile to jewel (`pr#7964 <http://github.com/ceph/ceph/pull/7964>`_, Sage Weil)
+* debian/changelog: Remove stray 'v' in version (`pr#7936 <http://github.com/ceph/ceph/pull/7936>`_, Dan Mick)
+* debian/changelog: Remove stray 'v' in version (`pr#7938 <http://github.com/ceph/ceph/pull/7938>`_, Dan Mick)
+* debian: include cpio in build-requiers (`pr#7533 <http://github.com/ceph/ceph/pull/7533>`_, Rémi BUISSON)
+* debian: package librgw_file* tests (`pr#7930 <http://github.com/ceph/ceph/pull/7930>`_, Ken Dreyer)
+* doc/architecture.rst: remove redundant word "across" (`pr#8179 <http://github.com/ceph/ceph/pull/8179>`_, Zhao Junwang)
+* doc/dev: add section on interrupting a running suite (`pr#8116 <http://github.com/ceph/ceph/pull/8116>`_, Nathan Cutler)
+* doc/dev: continue writing Testing in the cloud chapter (`pr#7960 <http://github.com/ceph/ceph/pull/7960>`_, Nathan Cutler)
+* doc/dev: integrate testing into the narrative (`pr#7946 <http://github.com/ceph/ceph/pull/7946>`_, Nathan Cutler)
+* doc/dev: various refinements (`pr#7954 <http://github.com/ceph/ceph/pull/7954>`_, Nathan Cutler)
+* doc/rados/api/librados-intro.rst: fix typo (`pr#7879 <http://github.com/ceph/ceph/pull/7879>`_, xie xingguo)
+* doc: add ceph-detect-init(8) source to dist tarball (`pr#7933 <http://github.com/ceph/ceph/pull/7933>`_, Ken Dreyer)
+* doc: add cinder backend section to rbd-openstack.rst (`pr#7923 <http://github.com/ceph/ceph/pull/7923>`_, RustShen)
+* doc: detailed description of bugfixing workflow (`pr#7941 <http://github.com/ceph/ceph/pull/7941>`_, Nathan Cutler)
+* doc: fix 0.94.4 and 0.94.5 ordering (`pr#7763 <http://github.com/ceph/ceph/pull/7763>`_, Loic Dachary)
+* doc: fix typo, indention etc. (`pr#7829 <http://github.com/ceph/ceph/pull/7829>`_, xie xingguo)
+* doc: initial draft of RBD mirroring admin documentation (`issue#15041 <http://tracker.ceph.com/issues/15041>`_, `pr#8169 <http://github.com/ceph/ceph/pull/8169>`_, Jason Dillaman)
+* doc: osd-config Add Configuration Options for op queue. (`pr#7837 <http://github.com/ceph/ceph/pull/7837>`_, Robert LeBlanc)
+* doc: rgw explain keystone's verify ssl switch (`pr#7862 <http://github.com/ceph/ceph/pull/7862>`_, Abhishek Lekshmanan)
+* doc: small fixes (`pr#7813 <http://github.com/ceph/ceph/pull/7813>`_, xiexingguo)
+* doc: standardize @param (not @parma, @parmam, @params) (`pr#7714 <http://github.com/ceph/ceph/pull/7714>`_, Nathan Cutler)
+* fix FTBFS introduced by d0af316 (`pr#7792 <http://github.com/ceph/ceph/pull/7792>`_, Kefu Chai)
+* ghobject_t: use # instead of ! as a separator (`pr#8055 <http://github.com/ceph/ceph/pull/8055>`_, Sage Weil)
+* include/encoding: do not try to be clever with list encoding (`pr#7913 <http://github.com/ceph/ceph/pull/7913>`_, Sage Weil)
+* init-ceph.in: allow case-insensitive true in `osd crush update on start' (`pr#7943 <http://github.com/ceph/ceph/pull/7943>`_, Eric Cook)
+* init-ceph.in: skip ceph-disk if it is not present (`issue#10587 <http://tracker.ceph.com/issues/10587>`_, `pr#7286 <http://github.com/ceph/ceph/pull/7286>`_, Ken Dreyer)
+* journal: async methods to (un)register and update client (`pr#7832 <http://github.com/ceph/ceph/pull/7832>`_, Mykola Golub)
+* journal: improve commit position tracking (`pr#7776 <http://github.com/ceph/ceph/pull/7776>`_, Jason Dillaman)
+* journal: prevent race injecting new records into overflowed object (`issue#15202 <http://tracker.ceph.com/issues/15202>`_, `pr#8220 <http://github.com/ceph/ceph/pull/8220>`_, Jason Dillaman)
+* librados: cancel aio notification linger op upon completion (`pr#8102 <http://github.com/ceph/ceph/pull/8102>`_, Jason Dillaman)
+* librados: check connection state in rados_monitor_log (`issue#14499 <http://tracker.ceph.com/issues/14499>`_, `pr#7350 <http://github.com/ceph/ceph/pull/7350>`_, David Disseldorp)
+* librados: do not clear handle for aio_watch() (`pr#7771 <http://github.com/ceph/ceph/pull/7771>`_, xie xingguo)
+* librados: fix test failure with new aio watch/unwatch API  (`pr#7824 <http://github.com/ceph/ceph/pull/7824>`_, Jason Dillaman)
+* librados: implement async watch/unwatch (`pr#7649 <http://github.com/ceph/ceph/pull/7649>`_, Haomai Wang)
+* librados: mix lock cycle (un)registering asok commands (`pr#7581 <http://github.com/ceph/ceph/pull/7581>`_, John Spray)
+* librados: race condition on aio_notify completion handling (`pr#7864 <http://github.com/ceph/ceph/pull/7864>`_, Jason Dillaman)
+* librados: stat2 with higher time precision (`pr#7915 <http://github.com/ceph/ceph/pull/7915>`_, Yehuda Sadeh, Matt Benjamin)
+* librbd: allocate new journal tag after acquiring exclusive lock (`pr#7884 <http://github.com/ceph/ceph/pull/7884>`_, Jason Dillaman)
+* librbd: block read requests until journal replayed (`pr#7627 <http://github.com/ceph/ceph/pull/7627>`_, Jason Dillaman)
+* librbd: correct issues discovered via valgrind memcheck (`pr#8132 <http://github.com/ceph/ceph/pull/8132>`_, Jason Dillaman)
+* librbd: differentiate journal replay flush vs shut down (`pr#7698 <http://github.com/ceph/ceph/pull/7698>`_, Jason Dillaman)
+* librbd: enable/disable image mirroring automatically for pool mode (`issue#15143 <http://tracker.ceph.com/issues/15143>`_, `pr#8204 <http://github.com/ceph/ceph/pull/8204>`_, Ricardo Dias)
+* librbd: fix state machine race conditions during shut down (`pr#7761 <http://github.com/ceph/ceph/pull/7761>`_, Jason Dillaman)
+* librbd: handle unregistering the image watcher when disconnected (`pr#8094 <http://github.com/ceph/ceph/pull/8094>`_, Jason Dillaman)
+* librbd: integrate journal replay with fsx testing (`pr#7583 <http://github.com/ceph/ceph/pull/7583>`_, Jason Dillaman)
+* librbd: journal replay needs to support re-executing maintenance ops (`issue#14822 <http://tracker.ceph.com/issues/14822>`_, `pr#7785 <http://github.com/ceph/ceph/pull/7785>`_, Jason Dillaman)
+* librbd: reduce mem copies to user-buffer during read (`pr#7548 <http://github.com/ceph/ceph/pull/7548>`_, Jianpeng Ma)
+* librbd: refresh image if required before replaying journal ops (`issue#14908 <http://tracker.ceph.com/issues/14908>`_, `pr#7978 <http://github.com/ceph/ceph/pull/7978>`_, Jason Dillaman)
+* librbd: remove last synchronous librados calls from open/close state machine (`pr#7839 <http://github.com/ceph/ceph/pull/7839>`_, Jason Dillaman)
+* librbd: replaying a journal op post-refresh requires locking (`pr#8028 <http://github.com/ceph/ceph/pull/8028>`_, Jason Dillaman)
+* librbd: retrieve image name when opening by id (`pr#7736 <http://github.com/ceph/ceph/pull/7736>`_, Mykola Golub)
+* librbd: several race conditions discovered under single CPU environment (`pr#7653 <http://github.com/ceph/ceph/pull/7653>`_, Jason Dillaman)
+* librbd: truncate does not need to mark the object as existing in the object map (`issue#14789 <http://tracker.ceph.com/issues/14789>`_, `pr#7772 <http://github.com/ceph/ceph/pull/7772>`_, xinxin shu)
+* librbd: update of mirror pool mode and mirror peer handling (`pr#7718 <http://github.com/ceph/ceph/pull/7718>`_, Jason Dillaman)
+* librbd: use async librados notifications (`pr#7668 <http://github.com/ceph/ceph/pull/7668>`_, Jason Dillaman)
+* log: do not repeat errors to stderr (`issue#14616 <http://tracker.ceph.com/issues/14616>`_, `pr#7983 <http://github.com/ceph/ceph/pull/7983>`_, Sage Weil)
+* log: fix stack overflow when flushing large log lines (`issue#14707 <http://tracker.ceph.com/issues/14707>`_, `pr#7599 <http://github.com/ceph/ceph/pull/7599>`_, Igor Fedotov)
+* log: segv in a portable way (`issue#14856 <http://tracker.ceph.com/issues/14856>`_, `pr#7790 <http://github.com/ceph/ceph/pull/7790>`_, Kefu Chai)
+* log: use delete[] (`pr#7904 <http://github.com/ceph/ceph/pull/7904>`_, Sage Weil)
+* mailmap for 10.0.4 (`pr#7932 <http://github.com/ceph/ceph/pull/7932>`_, Abhishek Lekshmanan)
+* mailmap updates (`pr#7528 <http://github.com/ceph/ceph/pull/7528>`_, Yann Dupont)
+* man/8/ceph-disk: fix formatting issue (`pr#8012 <http://github.com/ceph/ceph/pull/8012>`_, Sage Weil)
+* man/8/ceph-disk: fix formatting issue (`pr#8003 <http://github.com/ceph/ceph/pull/8003>`_, Sage Weil)
+* mds, client: add namespace to file_layout_t (previously ceph_file_layout) (`pr#7098 <http://github.com/ceph/ceph/pull/7098>`_, Yan, Zheng, Sage Weil)
+* mds: don't double-shutdown the timer when suiciding (`issue#14697 <http://tracker.ceph.com/issues/14697>`_, `pr#7616 <http://github.com/ceph/ceph/pull/7616>`_, Greg Farnum)
+* mds: fix FSMap upgrade with daemons in the map (`pr#8073 <http://github.com/ceph/ceph/pull/8073>`_, John Spray, Greg Farnum)
+* mds: fix inode_t::compare() (`issue#15038 <http://tracker.ceph.com/issues/15038>`_, `pr#8014 <http://github.com/ceph/ceph/pull/8014>`_, Yan, Zheng)
+* mds: fix stray purging in 'stripe_count > 1' case (`issue#15050 <http://tracker.ceph.com/issues/15050>`_, `pr#8040 <http://github.com/ceph/ceph/pull/8040>`_, Yan, Zheng)
+* mds: function parameter 'df' should be passed by reference (`pr#7490 <http://github.com/ceph/ceph/pull/7490>`_, Na Xie)
+* mirrors: Change contact e-mail address for se.ceph.com (`pr#8007 <http://github.com/ceph/ceph/pull/8007>`_, Wido den Hollander)
+* mon/PGMonitor: reliably mark PGs state (`pr#8089 <http://github.com/ceph/ceph/pull/8089>`_, Sage Weil)
+* mon/monitor: some clean up (`pr#7520 <http://github.com/ceph/ceph/pull/7520>`_, huanwen ren)
+* mon/pgmonitor: use appropriate forced conversions in get_rule_avail (`pr#7705 <http://github.com/ceph/ceph/pull/7705>`_, huanwen ren)
+* mon: cleanup set-quota error msg (`pr#7371 <http://github.com/ceph/ceph/pull/7371>`_, Abhishek Lekshmanan)
+* mon: consider pool size when creating pool (`issue#14509 <http://tracker.ceph.com/issues/14509>`_, `pr#7359 <http://github.com/ceph/ceph/pull/7359>`_, songbaisen)
+* mon: enable 'mon osd prime pg temp' by default (`pr#7838 <http://github.com/ceph/ceph/pull/7838>`_, Robert LeBlanc)
+* mon: fix calculation of %USED (`pr#7881 <http://github.com/ceph/ceph/pull/7881>`_, Adam Kupczyk)
+* mon: fix keyring permissions (`issue#14950 <http://tracker.ceph.com/issues/14950>`_, `pr#7880 <http://github.com/ceph/ceph/pull/7880>`_, Owen Synge)
+* mon: initialize last_* timestamps on new pgs to creation time (`issue#14952 <http://tracker.ceph.com/issues/14952>`_, `pr#7980 <http://github.com/ceph/ceph/pull/7980>`_, Sage Weil)
+* mon: make clock skew checks sane (`issue#14175 <http://tracker.ceph.com/issues/14175>`_, `pr#7141 <http://github.com/ceph/ceph/pull/7141>`_, Joao Eduardo Luis)
+* mon: osd [test-]reweight-by-{pg,utilization} command updates (`pr#7890 <http://github.com/ceph/ceph/pull/7890>`_, Dan van der Ster, Sage Weil)
+* mon: remove 'mds setmap' (`issue#15136 <http://tracker.ceph.com/issues/15136>`_, `pr#8121 <http://github.com/ceph/ceph/pull/8121>`_, Sage Weil)
+* mon: standardize Ceph removal commands (`pr#7939 <http://github.com/ceph/ceph/pull/7939>`_, Dongsheng Yang)
+* mon: unconfuse object count skew message (`pr#7882 <http://github.com/ceph/ceph/pull/7882>`_, Piotr Dałek)
+* mon: unregister command on shutdown (`pr#7504 <http://github.com/ceph/ceph/pull/7504>`_, huanwen ren)
+* mount.fuse.ceph: better parsing of arguments passed to mount.fuse.ceph by mount command (`issue#14735 <http://tracker.ceph.com/issues/14735>`_, `pr#7607 <http://github.com/ceph/ceph/pull/7607>`_, Florent Bautista)
+* msg/async: _try_send trim already sent for outcoming_bl more efficient (`pr#7970 <http://github.com/ceph/ceph/pull/7970>`_, Yan Jun)
+* msg/async: don't calculate msg header crc when not needed (`pr#7815 <http://github.com/ceph/ceph/pull/7815>`_, Piotr Dałek)
+* msg/async: smarter MSG_MORE (`pr#7625 <http://github.com/ceph/ceph/pull/7625>`_, Piotr Dałek)
+* msg: add thread safety for "random" Messenger + fix wrong usage of random functions (`pr#7650 <http://github.com/ceph/ceph/pull/7650>`_, Avner BenHanoch)
+* msg: async: fix perf counter description and simplify _send_keepalive_or_ack (`pr#8046 <http://github.com/ceph/ceph/pull/8046>`_, xie xingguo)
+* msg: async: small cleanups (`pr#7871 <http://github.com/ceph/ceph/pull/7871>`_, xie xingguo)
+* msg: async: start over after failing to bind a port in specified range (`issue#14928 <http://tracker.ceph.com/issues/14928>`_, `issue#13002 <http://tracker.ceph.com/issues/13002>`_, `pr#7852 <http://github.com/ceph/ceph/pull/7852>`_, xie xingguo)
+* msg: remove duplicated code - local_delivery will now call 'enqueue' (`pr#7948 <http://github.com/ceph/ceph/pull/7948>`_, Avner BenHanoch)
+* msg: significantly reduce minimal memory usage of connections (`pr#7567 <http://github.com/ceph/ceph/pull/7567>`_, Piotr Dałek)
+* mstart: start rgw on different ports as well (`pr#8167 <http://github.com/ceph/ceph/pull/8167>`_, Abhishek Lekshmanan)
+* nfs for rgw (Matt Benjamin, Orit Wasserman) (`pr#7634 <http://github.com/ceph/ceph/pull/7634>`_, Yehuda Sadeh, Matt Benjamin)
+* os/ObjectStore: implement more efficient get_encoded_bytes()  (`pr#7775 <http://github.com/ceph/ceph/pull/7775>`_, Piotr Dałek)
+* os/bluestore/BlueFS: Before reap ioct, it should wait io complete (`pr#8178 <http://github.com/ceph/ceph/pull/8178>`_, Jianpeng Ma)
+* os/bluestore/BlueStore: Don't leak trim overlay data before write. (`pr#7895 <http://github.com/ceph/ceph/pull/7895>`_, Jianpeng Ma)
+* os/bluestore/KernelDevice: force block size (`pr#8006 <http://github.com/ceph/ceph/pull/8006>`_, Sage Weil)
+* os/bluestore/NVMEDevice: make IO thread using dpdk launch (`pr#8160 <http://github.com/ceph/ceph/pull/8160>`_, Haomai Wang)
+* os/bluestore: clone overlay data (`pr#7860 <http://github.com/ceph/ceph/pull/7860>`_, Jianpeng Ma)
+* os/bluestore: fix a typo in SPDK path parsing (`pr#7601 <http://github.com/ceph/ceph/pull/7601>`_, Jianjian Huo)
+* os/bluestore: make bluestore_sync_transaction = true can work. (`pr#7674 <http://github.com/ceph/ceph/pull/7674>`_, Jianpeng Ma)
+* os/bluestore: small fixes in bluestore StupidAllocator (`pr#8101 <http://github.com/ceph/ceph/pull/8101>`_, Jianjian Huo)
+* os/filestore/FileJournal: set block size via config option (`pr#7628 <http://github.com/ceph/ceph/pull/7628>`_, Sage Weil)
+* os/filestore: fix punch hole usage in _zero (`pr#8050 <http://github.com/ceph/ceph/pull/8050>`_, Sage Weil)
+* os/filestore: fix result handling logic of destroy_collection (`pr#7721 <http://github.com/ceph/ceph/pull/7721>`_, xie xingguo)
+* os/filestore: require offset == length == 0 for full object read; add test (`pr#7957 <http://github.com/ceph/ceph/pull/7957>`_, Jianpeng Ma)
+* osd/OSDMap: fix typo in summarize_mapping_stats (`pr#8088 <http://github.com/ceph/ceph/pull/8088>`_, Sage Weil)
+* osd/PGLog: fix warning (`pr#8057 <http://github.com/ceph/ceph/pull/8057>`_, Sage Weil)
+* osd/ReplicatedPG: be more careful about calling publish_stats_to_osd() (`issue#14962 <http://tracker.ceph.com/issues/14962>`_, `pr#8039 <http://github.com/ceph/ceph/pull/8039>`_, Greg Farnum)
+* osd/ReplicatedPG: clear watches on change after applying repops (`issue#15151 <http://tracker.ceph.com/issues/15151>`_, `pr#8163 <http://github.com/ceph/ceph/pull/8163>`_, Sage Weil)
+* osd/ScrubStore: remove unused function (`pr#8045 <http://github.com/ceph/ceph/pull/8045>`_, Kefu Chai)
+* osd: BlueStore/NVMEDevice: fix compiling and fd leak (`pr#7496 <http://github.com/ceph/ceph/pull/7496>`_, xie xingguo)
+* osd: FileStore: use pwritev instead of lseek+writev (`pr#7349 <http://github.com/ceph/ceph/pull/7349>`_, Haomai Wang, Tao Chang)
+* osd: OSDMap: reset osd_primary_affinity shared_ptr when deepish_copy_from (`issue#14686 <http://tracker.ceph.com/issues/14686>`_, `pr#7553 <http://github.com/ceph/ceph/pull/7553>`_, Xinze Chi)
+* osd: Replace snprintf with faster implementation in eversion_t::get_key_name (`pr#7121 <http://github.com/ceph/ceph/pull/7121>`_, Evgeniy Firsov)
+* osd: WeightedPriorityQueue: move to intrusive containers (`pr#7654 <http://github.com/ceph/ceph/pull/7654>`_, Robert LeBlanc)
+* osd: a fix for HeartbeatDispatcher and cleanups (`pr#7550 <http://github.com/ceph/ceph/pull/7550>`_, Kefu Chai)
+* osd: add missing newline to usage message (`pr#7613 <http://github.com/ceph/ceph/pull/7613>`_, Willem Jan Withagen)
+* osd: avoid FORCE updating digest been overwritten by MAYBE when comparing scrub map (`pr#7051 <http://github.com/ceph/ceph/pull/7051>`_, Zhiqiang Wang)
+* osd: bluefs: fix alignment for odd page sizes (`pr#7900 <http://github.com/ceph/ceph/pull/7900>`_, Dan Mick)
+* osd: bluestore updates, scrub fixes (`pr#8035 <http://github.com/ceph/ceph/pull/8035>`_, Sage Weil)
+* osd: bluestore/blockdevice: use std::mutex et al (`pr#7568 <http://github.com/ceph/ceph/pull/7568>`_, Sage Weil)
+* osd: bluestore: NVMEDevice: fix error handling (`pr#7799 <http://github.com/ceph/ceph/pull/7799>`_, xie xingguo)
+* osd: bluestore: Revert NVMEDevice task cstor and refresh interface changes (`pr#7729 <http://github.com/ceph/ceph/pull/7729>`_, Haomai Wang)
+* osd: bluestore: add 'override' to virtual functions (`pr#7886 <http://github.com/ceph/ceph/pull/7886>`_, Michal Jarzabek)
+* osd: bluestore: allow _dump_onode dynamic accept log level (`pr#7995 <http://github.com/ceph/ceph/pull/7995>`_, Jianpeng Ma)
+* osd: bluestore: fix check for write falling within the same extent (`issue#14954 <http://tracker.ceph.com/issues/14954>`_, `pr#7892 <http://github.com/ceph/ceph/pull/7892>`_, Jianpeng Ma)
+* osd: bluestore: for overwrite a extent, allocate new extent on min_alloc_size write (`pr#7996 <http://github.com/ceph/ceph/pull/7996>`_, Jianpeng Ma)
+* osd: bluestore: improve fs-type verification and tidy up (`pr#7651 <http://github.com/ceph/ceph/pull/7651>`_, xie xingguo)
+* osd: bluestore: misc fixes (`pr#7658 <http://github.com/ceph/ceph/pull/7658>`_, Jianpeng Ma)
+* osd: bluestore: remove unneeded includes (`pr#7870 <http://github.com/ceph/ceph/pull/7870>`_, Michal Jarzabek)
+* osd: clean up CMPXATTR checks (`pr#5961 <http://github.com/ceph/ceph/pull/5961>`_, Jianpeng Ma)
+* osd: consider high/low mode when putting agent to sleep (`issue#14752 <http://tracker.ceph.com/issues/14752>`_, `pr#7631 <http://github.com/ceph/ceph/pull/7631>`_, Sage Weil)
+* osd: ensure new osdmaps commit before publishing them to pgs (`issue#15073 <http://tracker.ceph.com/issues/15073>`_, `pr#8096 <http://github.com/ceph/ceph/pull/8096>`_, Sage Weil)
+* osd: filejournal: report journal entry count (`pr#7643 <http://github.com/ceph/ceph/pull/7643>`_, tianqing)
+* osd: filestore: FALLOC_FL_PUNCH_HOLE must be used with FALLOC_FL_KEEP_SIZE (`pr#7768 <http://github.com/ceph/ceph/pull/7768>`_, xinxin shu)
+* osd: filestore: fast abort if statfs encounters ENOENT (`pr#7703 <http://github.com/ceph/ceph/pull/7703>`_, xie xingguo)
+* osd: filestore: fix race condition with split vs collection_move_rename and long object names (`issue#14766 <http://tracker.ceph.com/issues/14766>`_, `pr#8136 <http://github.com/ceph/ceph/pull/8136>`_, Samuel Just)
+* osd: filestore: fix result code overwritten for clone (`issue#14817 <http://tracker.ceph.com/issues/14817>`_, `issue#14827 <http://tracker.ceph.com/issues/14827>`_, `pr#7711 <http://github.com/ceph/ceph/pull/7711>`_, xie xingguo)
+* osd: filestore: fix wrong scope of result code for error cases during mkfs (`issue#14814 <http://tracker.ceph.com/issues/14814>`_, `pr#7704 <http://github.com/ceph/ceph/pull/7704>`_, xie xingguo)
+* osd: filestore: fix wrong scope of result code for error cases during mount (`issue#14815 <http://tracker.ceph.com/issues/14815>`_, `pr#7707 <http://github.com/ceph/ceph/pull/7707>`_, xie xingguo)
+* osd: filestore: restructure journal and op queue throttling (`pr#7767 <http://github.com/ceph/ceph/pull/7767>`_, Samuel Just)
+* osd: fix forced prmootion for CALL ops (`issue#14745 <http://tracker.ceph.com/issues/14745>`_, `pr#7617 <http://github.com/ceph/ceph/pull/7617>`_, Sage Weil)
+* osd: fix fusestore hanging during stop/quit (`issue#14786 <http://tracker.ceph.com/issues/14786>`_, `pr#7677 <http://github.com/ceph/ceph/pull/7677>`_, xie xingguo)
+* osd: fix inaccurate counter and skip over queueing an empty transaction (`pr#7754 <http://github.com/ceph/ceph/pull/7754>`_, xie xingguo)
+* osd: fix lack of object unblock when flush fails (`issue#14511 <http://tracker.ceph.com/issues/14511>`_, `pr#7584 <http://github.com/ceph/ceph/pull/7584>`_, Igor Fedotov)
+* osd: fix overload of '==' operator for pg_stat_t (`issue#14921 <http://tracker.ceph.com/issues/14921>`_, `pr#7842 <http://github.com/ceph/ceph/pull/7842>`_, xie xingguo)
+* osd: fix race condition for heartbeat_need_update (`issue#14387 <http://tracker.ceph.com/issues/14387>`_, `pr#7739 <http://github.com/ceph/ceph/pull/7739>`_, xie xingguo)
+* osd: fix return value from maybe_handle_cache_detail() (`pr#7593 <http://github.com/ceph/ceph/pull/7593>`_, Igor Fedotov)
+* osd: fix unnecessary object promotion when deleting from cache pool (`issue#13894 <http://tracker.ceph.com/issues/13894>`_, `pr#7537 <http://github.com/ceph/ceph/pull/7537>`_, Igor Fedotov)
+* osd: fix wrong return type of find_osd_on_ip() (`issue#14872 <http://tracker.ceph.com/issues/14872>`_, `pr#7812 <http://github.com/ceph/ceph/pull/7812>`_, xie xingguo)
+* osd: ghobject_t: use ! instead of @ as a separator (`pr#7595 <http://github.com/ceph/ceph/pull/7595>`_, Sage Weil)
+* osd: handle dup pg_create that races with pg deletion (`pr#8033 <http://github.com/ceph/ceph/pull/8033>`_, Sage Weil)
+* osd: initialize last_recalibrate field at construction (`pr#8071 <http://github.com/ceph/ceph/pull/8071>`_, xie xingguo)
+* osd: kstore: fix a race condition in _txc_finish() (`pr#7804 <http://github.com/ceph/ceph/pull/7804>`_, Jianjian Huo)
+* osd: kstore: latency breakdown (`pr#7850 <http://github.com/ceph/ceph/pull/7850>`_, James Liu)
+* osd: kstore: sync up kstore with recent bluestore updates (`pr#7681 <http://github.com/ceph/ceph/pull/7681>`_, Jianjian Huo)
+* osd: memstore: fix alignment of Page for test_pageset (`pr#7587 <http://github.com/ceph/ceph/pull/7587>`_, Casey Bodley)
+* osd: min_write_recency_for_promote & min_read_recency_for_promote are tiering only (`pr#8081 <http://github.com/ceph/ceph/pull/8081>`_, huanwen ren)
+* osd: probabilistic cache tier promotion throttling (`pr#7465 <http://github.com/ceph/ceph/pull/7465>`_, Sage Weil)
+* osd: remove up_thru_pending field, which is never used (`pr#7991 <http://github.com/ceph/ceph/pull/7991>`_, xie xingguo)
+* osd: replicatedpg: break out loop if we encounter fatal error during do_pg_op() (`issue#14922 <http://tracker.ceph.com/issues/14922>`_, `pr#7844 <http://github.com/ceph/ceph/pull/7844>`_, xie xingguo)
+* osd: resolve boot vs NOUP set + clear race (`pr#7483 <http://github.com/ceph/ceph/pull/7483>`_, Sage Weil)
+* packaging: make infernalis -> jewel upgrade work (`issue#15047 <http://tracker.ceph.com/issues/15047>`_, `pr#8034 <http://github.com/ceph/ceph/pull/8034>`_, Nathan Cutler)
+* packaging: move cephfs repair tools to ceph-common (`issue#15145 <http://tracker.ceph.com/issues/15145>`_, `pr#8133 <http://github.com/ceph/ceph/pull/8133>`_, Boris Ranto, Ken Dreyer)
+* pybind/rados: fix object lifetime issues and other bugs in aio (`pr#7778 <http://github.com/ceph/ceph/pull/7778>`_, Hector Martin)
+* pybind/rados: use __dealloc__ since __del__ is ignored by cython (`pr#7692 <http://github.com/ceph/ceph/pull/7692>`_, Mehdi Abaakouk)
+* pybind: Ensure correct python flags are passed (`pr#7663 <http://github.com/ceph/ceph/pull/7663>`_, James Page)
+* pybind: flag an RBD image as closed regardless of result code (`pr#8005 <http://github.com/ceph/ceph/pull/8005>`_, Jason Dillaman)
+* pybind: move cephfs to Cython (`pr#7745 <http://github.com/ceph/ceph/pull/7745>`_, John Spray, Mehdi Abaakouk)
+* pybind: remove next() on iterators (`pr#7706 <http://github.com/ceph/ceph/pull/7706>`_, Mehdi Abaakouk)
+* pybind: replace __del__ with __dealloc__ for rbd (`pr#7708 <http://github.com/ceph/ceph/pull/7708>`_, Josh Durgin)
+* pybind: use correct subdir for rados install-exec rule (`pr#7684 <http://github.com/ceph/ceph/pull/7684>`_, Josh Durgin)
+* python binding of librados with cython (`pr#7621 <http://github.com/ceph/ceph/pull/7621>`_, Mehdi Abaakouk)
+* python: use pip instead of python setup.py (`pr#7605 <http://github.com/ceph/ceph/pull/7605>`_, Loic Dachary)
+* qa/workunits/cephtool/test.sh: wait longer in ceph_watch_start() (`issue#14910 <http://tracker.ceph.com/issues/14910>`_, `pr#7861 <http://github.com/ceph/ceph/pull/7861>`_, Kefu Chai)
+* qa/workunits/rados/test.sh: capture stderr too (`pr#8004 <http://github.com/ceph/ceph/pull/8004>`_, Sage Weil)
+* qa/workunits/rados/test.sh: test tmap_migrate (`pr#8114 <http://github.com/ceph/ceph/pull/8114>`_, Sage Weil)
+* qa/workunits/rbd: do not use object map during read flag testing (`pr#8104 <http://github.com/ceph/ceph/pull/8104>`_, Jason Dillaman)
+* qa/workunits/rbd: new online maintenance op tests (`pr#8216 <http://github.com/ceph/ceph/pull/8216>`_, Jason Dillaman)
+* qa/workunits/rbd: use POSIX function definition (`issue#15104 <http://tracker.ceph.com/issues/15104>`_, `pr#8068 <http://github.com/ceph/ceph/pull/8068>`_, Nathan Cutler)
+* qa/workunits/rest/test.py: add confirmation to 'mds setmap' (`issue#14606 <http://tracker.ceph.com/issues/14606>`_, `pr#7982 <http://github.com/ceph/ceph/pull/7982>`_, Sage Weil)
+* qa/workunits/rest/test.py: don't use newfs (`pr#8191 <http://github.com/ceph/ceph/pull/8191>`_, Sage Weil)
+* qa: add workunit to run ceph_test_rbd_mirror (`pr#8221 <http://github.com/ceph/ceph/pull/8221>`_, Josh Durgin)
+* rados: add ceph:: namespace to bufferlist type (`pr#8059 <http://github.com/ceph/ceph/pull/8059>`_, Noah Watkins)
+* rados: fix bug for write bench (`pr#7851 <http://github.com/ceph/ceph/pull/7851>`_, James Liu)
+* rbd-mirror: ImageReplayer async start/stop (`pr#7944 <http://github.com/ceph/ceph/pull/7944>`_, Mykola Golub)
+* rbd-mirror: ImageReplayer improvements (`pr#7759 <http://github.com/ceph/ceph/pull/7759>`_, Mykola Golub)
+* rbd-mirror: fix image replay test failures (`pr#8158 <http://github.com/ceph/ceph/pull/8158>`_, Jason Dillaman)
+* rbd-mirror: fix long termination due to 30sec wait in main loop (`pr#8185 <http://github.com/ceph/ceph/pull/8185>`_, Mykola Golub)
+* rbd-mirror: implement ImageReplayer (`pr#7614 <http://github.com/ceph/ceph/pull/7614>`_, Mykola Golub)
+* rbd-mirror: integrate with image sync state machine (`pr#8079 <http://github.com/ceph/ceph/pull/8079>`_, Jason Dillaman)
+* rbd-mirror: minor fix-ups for initial skeleton implementation (`pr#7958 <http://github.com/ceph/ceph/pull/7958>`_, Mykola Golub)
+* rbd-mirror: remote to local cluster image sync (`pr#7979 <http://github.com/ceph/ceph/pull/7979>`_, Jason Dillaman)
+* rbd-mirror: use pool/image names in asok commands (`pr#8159 <http://github.com/ceph/ceph/pull/8159>`_, Mykola Golub)
+* rbd-mirror: use the mirroring directory to detect candidate images (`issue#15142 <http://tracker.ceph.com/issues/15142>`_, `pr#8162 <http://github.com/ceph/ceph/pull/8162>`_, Ricardo Dias)
+* rbd/run_cli_tests.sh: Reflect test failures (`issue#14825 <http://tracker.ceph.com/issues/14825>`_, `pr#7781 <http://github.com/ceph/ceph/pull/7781>`_, Zack Cerza)
+* rbd: add support for mirror image promotion/demotion/resync (`pr#8138 <http://github.com/ceph/ceph/pull/8138>`_, Jason Dillaman)
+* rbd: clone operation should default to image format 2 (`pr#8119 <http://github.com/ceph/ceph/pull/8119>`_, Jason Dillaman)
+* rbd: deprecate image format 1 (`pr#7841 <http://github.com/ceph/ceph/pull/7841>`_, Jason Dillaman)
+* rbd: support for enabling/disabling mirroring on specific images (`issue#13296 <http://tracker.ceph.com/issues/13296>`_, `pr#8056 <http://github.com/ceph/ceph/pull/8056>`_, Ricardo Dias)
+* release-notes: draft v0.94.6 release notes (`issue#13356 <http://tracker.ceph.com/issues/13356>`_, `pr#7689 <http://github.com/ceph/ceph/pull/7689>`_, Abhishek Varshney, Loic Dachary)
+* release-notes: draft v10.0.3 release notes (`pr#7592 <http://github.com/ceph/ceph/pull/7592>`_, Loic Dachary)
+* release-notes: draft v10.0.4 release notes (`pr#7966 <http://github.com/ceph/ceph/pull/7966>`_, Loic Dachary)
+* release-notes: draft v9.2.1 release notes (`issue#13750 <http://tracker.ceph.com/issues/13750>`_, `pr#7694 <http://github.com/ceph/ceph/pull/7694>`_, Abhishek Varshney)
+* rgw: ldap (Matt Benjamin) (`pr#7985 <http://github.com/ceph/ceph/pull/7985>`_, Matt Benjamin)
+* rgw: multisite fixes (`pr#8013 <http://github.com/ceph/ceph/pull/8013>`_, Yehuda Sadeh)
+* rgw: support for aws authentication v4 (Javier M. Mellid) (`issue#10333 <http://tracker.ceph.com/issues/10333>`_, `pr#7720 <http://github.com/ceph/ceph/pull/7720>`_, Yehuda Sadeh, Javier M. Mellid)
+* rgw sync fixes (`pr#8095 <http://github.com/ceph/ceph/pull/8095>`_, Yehuda Sadeh)
+* rgw/rgw_common.h: fix the RGWBucketInfo decoding (`pr#8165 <http://github.com/ceph/ceph/pull/8165>`_, Kefu Chai)
+* rgw/rgw_common.h: fix the RGWBucketInfo decoding (`pr#8154 <http://github.com/ceph/ceph/pull/8154>`_, Kefu Chai)
+* rgw/rgw_orphan: check the return value of save_state (`pr#7544 <http://github.com/ceph/ceph/pull/7544>`_, Boris Ranto)
+* rgw: Allow an implicit tenant in case of Keystone (`pr#8139 <http://github.com/ceph/ceph/pull/8139>`_, Pete Zaitcev)
+* rgw: Drop unused usage_exit from rgw_admin.cc (`pr#7632 <http://github.com/ceph/ceph/pull/7632>`_, Pete Zaitcev)
+* rgw: RGWZoneParams::create should not handle -EEXIST error (`pr#7927 <http://github.com/ceph/ceph/pull/7927>`_, Orit Wasserman)
+* rgw: add bucket request payment feature usage statistics integration (`issue#13834 <http://tracker.ceph.com/issues/13834>`_, `pr#6656 <http://github.com/ceph/ceph/pull/6656>`_, Javier M. Mellid)
+* rgw: add support for caching of Keystone admin token. (`pr#7630 <http://github.com/ceph/ceph/pull/7630>`_, Radoslaw Zarzynski)
+* rgw: add support for metadata upload during PUT on Swift container. (`pr#8002 <http://github.com/ceph/ceph/pull/8002>`_, Radoslaw Zarzynski)
+* rgw: add support for system requests over Swift API (`pr#7666 <http://github.com/ceph/ceph/pull/7666>`_, Radoslaw Zarzynski)
+* rgw: adjust the request_uri to support absoluteURI of http request (`issue#12917 <http://tracker.ceph.com/issues/12917>`_, `pr#7675 <http://github.com/ceph/ceph/pull/7675>`_, Wenjun Huang)
+* rgw: admin api for retrieving usage info (Ji Chen) (`pr#8031 <http://github.com/ceph/ceph/pull/8031>`_, Yehuda Sadeh, Ji Chen)
+* rgw: allow authentication keystone with self signed certs  (`issue#14853 <http://tracker.ceph.com/issues/14853>`_, `issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7777 <http://github.com/ceph/ceph/pull/7777>`_, Abhishek Lekshmanan)
+* rgw: approximate AmazonS3 HostId error field. (`pr#7444 <http://github.com/ceph/ceph/pull/7444>`_, Robin H. Johnson)
+* rgw: calculate payload hash in RGWPutObj_ObjStore only when necessary. (`pr#7869 <http://github.com/ceph/ceph/pull/7869>`_, Radoslaw Zarzynski)
+* rgw: cleanups to comments and messages (`pr#7633 <http://github.com/ceph/ceph/pull/7633>`_, Pete Zaitcev)
+* rgw: don't use s->bucket for metadata api path entry (`issue#14549 <http://tracker.ceph.com/issues/14549>`_, `pr#7408 <http://github.com/ceph/ceph/pull/7408>`_, Yehuda Sadeh)
+* rgw: drop permissions of rgw/civetweb after startup (`issue#13600 <http://tracker.ceph.com/issues/13600>`_, `pr#8019 <http://github.com/ceph/ceph/pull/8019>`_, Karol Mroz)
+* rgw: fcgi should include acconfig (`pr#7760 <http://github.com/ceph/ceph/pull/7760>`_, Abhishek Lekshmanan)
+* rgw: fix wrong handling of limit=0 during listing of Swift account. (`issue#14903 <http://tracker.ceph.com/issues/14903>`_, `pr#7821 <http://github.com/ceph/ceph/pull/7821>`_, Radoslaw Zarzynski)
+* rgw: fixes for per-period metadata logs (`pr#7827 <http://github.com/ceph/ceph/pull/7827>`_, Casey Bodley)
+* rgw: improve error handling in S3/Keystone integration (`pr#7597 <http://github.com/ceph/ceph/pull/7597>`_, Radoslaw Zarzynski)
+* rgw: link civetweb with openssl (Sage, Marcus Watts) (`pr#7825 <http://github.com/ceph/ceph/pull/7825>`_, Marcus Watts, Sage Weil)
+* rgw: link payer info to usage logging (`pr#7918 <http://github.com/ceph/ceph/pull/7918>`_, Yehuda Sadeh, Javier M. Mellid)
+* rgw: move signal.h dependency from rgw_front.h (`pr#7678 <http://github.com/ceph/ceph/pull/7678>`_, Matt Benjamin)
+* rgw: multiple Swift API compliance improvements for TempURL (Radoslaw Zarzynsk) (`issue#14806 <http://tracker.ceph.com/issues/14806>`_, `issue#11163 <http://tracker.ceph.com/issues/11163>`_, `pr#7891 <http://github.com/ceph/ceph/pull/7891>`_, Radoslaw Zarzynski)
+* rgw: multiple improvements regarding etag calculation for SLO/DLO of Swift API. (`pr#7764 <http://github.com/ceph/ceph/pull/7764>`_, Radoslaw Zarzynski)
+* rgw: remove duplicated code in RGWRados::get_bucket_info() (`pr#7413 <http://github.com/ceph/ceph/pull/7413>`_, liyankun)
+* rgw: remove unused vector (`pr#7990 <http://github.com/ceph/ceph/pull/7990>`_, Na Xie)
+* rgw: reset return code in when iterating over the bucket the objects (`issue#14826 <http://tracker.ceph.com/issues/14826>`_, `pr#7803 <http://github.com/ceph/ceph/pull/7803>`_, Orit Wasserman)
+* rgw: store system object meta in cache when creating it (`issue#14678 <http://tracker.ceph.com/issues/14678>`_, `pr#7615 <http://github.com/ceph/ceph/pull/7615>`_, Yehuda Sadeh)
+* rgw: support json format for admin policy API (Dunrong Huang) (`issue#14090 <http://tracker.ceph.com/issues/14090>`_, `pr#8036 <http://github.com/ceph/ceph/pull/8036>`_, Yehuda Sadeh, Dunrong Huang)
+* rgw: try to parse Keystone token in order appropriate to configuration. (`pr#7822 <http://github.com/ceph/ceph/pull/7822>`_, Radoslaw Zarzynski)
+* rgw: use pimpl pattern for RGWPeriodHistory (`pr#7809 <http://github.com/ceph/ceph/pull/7809>`_, Casey Bodley)
+* rgw: user quota may not adjust on bucket removal (`issue#14507 <http://tracker.ceph.com/issues/14507>`_, `pr#7586 <http://github.com/ceph/ceph/pull/7586>`_, root)
+* rgw:bucket link now set the bucket.instance acl (bug fix) (`issue#11076 <http://tracker.ceph.com/issues/11076>`_, `pr#8037 <http://github.com/ceph/ceph/pull/8037>`_, Zengran Zhang)
+* rpm,deb: remove conditional BuildRequires for btrfs-progs (`issue#15042 <http://tracker.ceph.com/issues/15042>`_, `pr#8016 <http://github.com/ceph/ceph/pull/8016>`_, Erwan Velu)
+* rpm: remove sub-package dependencies on "ceph" (`issue#15146 <http://tracker.ceph.com/issues/15146>`_, `pr#8137 <http://github.com/ceph/ceph/pull/8137>`_, Ken Dreyer)
+* script: add missing stop_rgw variable to stop.sh script (`pr#7959 <http://github.com/ceph/ceph/pull/7959>`_, Karol Mroz)
+* selinux: Update policy to grant additional access (`issue#14870 <http://tracker.ceph.com/issues/14870>`_, `pr#7971 <http://github.com/ceph/ceph/pull/7971>`_, Boris Ranto)
+* selinux: allow log files to be located in /var/log/radosgw (`pr#7604 <http://github.com/ceph/ceph/pull/7604>`_, Boris Ranto)
+* sstring.hh: return type from str_len(...) need not be const (`pr#7679 <http://github.com/ceph/ceph/pull/7679>`_, Matt Benjamin)
+* submodules: revert an accidental change (`pr#7929 <http://github.com/ceph/ceph/pull/7929>`_, Yehuda Sadeh)
+* systemd: correctly escape block device paths (`issue#14706 <http://tracker.ceph.com/issues/14706>`_, `pr#7579 <http://github.com/ceph/ceph/pull/7579>`_, James Page)
+* test/TestPGLog: fix the FTBFS (`issue#14930 <http://tracker.ceph.com/issues/14930>`_, `pr#7855 <http://github.com/ceph/ceph/pull/7855>`_, Kefu Chai)
+* test/bufferlist: Avoid false-positive tests (`pr#7955 <http://github.com/ceph/ceph/pull/7955>`_, Erwan Velu)
+* test/cli-integration/rbd: disable progress output (`issue#14931 <http://tracker.ceph.com/issues/14931>`_, `pr#7858 <http://github.com/ceph/ceph/pull/7858>`_, Josh Durgin)
+* test/osd: Relax the timing intervals in osd-markdown.sh (`pr#7899 <http://github.com/ceph/ceph/pull/7899>`_, Dan Mick)
+* test/pybind/test_ceph_argparse: fix reweight-by-utilization tests (`pr#8027 <http://github.com/ceph/ceph/pull/8027>`_, Kefu Chai, Sage Weil)
+* test/radosgw-admin: update the expected usage outputs (`pr#7723 <http://github.com/ceph/ceph/pull/7723>`_, Kefu Chai)
+* test/rgw: add multisite test for meta sync across periods (`pr#7887 <http://github.com/ceph/ceph/pull/7887>`_, Casey Bodley)
+* test/time: no need to abs(uint64_t) for comparing (`pr#7726 <http://github.com/ceph/ceph/pull/7726>`_, Kefu Chai)
+* test: add missing shut_down mock method (`pr#8125 <http://github.com/ceph/ceph/pull/8125>`_, Jason Dillaman)
+* test: correct librbd errors discovered with unoptimized cmake build (`pr#7914 <http://github.com/ceph/ceph/pull/7914>`_, Jason Dillaman)
+* test: create pools for rbd tests with different prefix (`pr#7738 <http://github.com/ceph/ceph/pull/7738>`_, Mykola Golub)
+* test: enable test for bug #2339 which has been resolved. (`pr#7743 <http://github.com/ceph/ceph/pull/7743>`_, You Ji)
+* test: fix issues discovered via the rbd permissions test case (`pr#8129 <http://github.com/ceph/ceph/pull/8129>`_, Jason Dillaman)
+* test: fixup and improvements for rbd-mirror test (`pr#8090 <http://github.com/ceph/ceph/pull/8090>`_, Mykola Golub)
+* test: handle exception thrown from close during rbd lock test (`pr#8124 <http://github.com/ceph/ceph/pull/8124>`_, Jason Dillaman)
+* test: more debug logging for TestWatchNotify (`pr#7737 <http://github.com/ceph/ceph/pull/7737>`_, Mykola Golub)
+* test: new librbd flatten test case (`pr#7609 <http://github.com/ceph/ceph/pull/7609>`_, Jason Dillaman)
+* test: rbd-mirror: add "switch to the next tag" test (`pr#8149 <http://github.com/ceph/ceph/pull/8149>`_, Mykola Golub)
+* test: rbd-mirror: compare positions using all fields (`pr#8172 <http://github.com/ceph/ceph/pull/8172>`_, Mykola Golub)
+* test: reproducer for writeback CoW deadlock (`pr#8009 <http://github.com/ceph/ceph/pull/8009>`_, Jason Dillaman)
+* test: update rbd integration cram tests for new default features (`pr#8001 <http://github.com/ceph/ceph/pull/8001>`_, Jason Dillaman)
+* test_pool_create.sh: put test files in the test dir so they are cleaned up (`pr#8219 <http://github.com/ceph/ceph/pull/8219>`_, Josh Durgin)
+* tests: ceph-disk.sh: should use "readlink -f" instead (`pr#7594 <http://github.com/ceph/ceph/pull/7594>`_, Kefu Chai)
+* tests: ceph-disk.sh: use "readlink -f" instead for fullpath (`pr#7606 <http://github.com/ceph/ceph/pull/7606>`_, Kefu Chai)
+* tests: fix a few build warnings (`pr#7608 <http://github.com/ceph/ceph/pull/7608>`_, Sage Weil)
+* tests: sync ceph-erasure-code-corpus for mktemp -d (`pr#7596 <http://github.com/ceph/ceph/pull/7596>`_, Loic Dachary)
+* tests: test_pidfile.sh lingering processes (`issue#14834 <http://tracker.ceph.com/issues/14834>`_, `pr#7734 <http://github.com/ceph/ceph/pull/7734>`_, Loic Dachary)
+* tools/cephfs: add tmap_upgrade (`pr#7003 <http://github.com/ceph/ceph/pull/7003>`_, John Spray)
+* tools/cephfs: fix tmap_upgrade (`issue#15135 <http://tracker.ceph.com/issues/15135>`_, `pr#8128 <http://github.com/ceph/ceph/pull/8128>`_, John Spray)
+* tools/rados: reduce "rados put" memory usage by op_size (`pr#7928 <http://github.com/ceph/ceph/pull/7928>`_, Piotr Dałek)
+* unittest_compression_zlib: do not assume buffer will be null terminated (`pr#8064 <http://github.com/ceph/ceph/pull/8064>`_, Sage Weil)
+* unittest_osdmap: default crush tunables now firefly (`pr#8098 <http://github.com/ceph/ceph/pull/8098>`_, Sage Weil)
+* vstart.sh: avoid race condition starting rgw via vstart.sh (`issue#14829 <http://tracker.ceph.com/issues/14829>`_, `pr#7727 <http://github.com/ceph/ceph/pull/7727>`_, Javier M. Mellid)
+* vstart.sh: silence a harmless msg where btrfs is not found (`pr#7640 <http://github.com/ceph/ceph/pull/7640>`_, Patrick Donnelly)
+* xio: fix incorrect ip being assigned in case of multiple RDMA ports (`pr#7747 <http://github.com/ceph/ceph/pull/7747>`_, Subramanyam Varanasi)
+* xio: remove duplicate assignment of peer addr (`pr#8025 <http://github.com/ceph/ceph/pull/8025>`_, Roi Dayan)
+* xio: remove redundant magic methods (`pr#7773 <http://github.com/ceph/ceph/pull/7773>`_, Roi Dayan)
+* xio: remove unused variable (`pr#8023 <http://github.com/ceph/ceph/pull/8023>`_, Roi Dayan)
+* xxhash: use clone of xxhash.git; add .gitignore (`pr#7986 <http://github.com/ceph/ceph/pull/7986>`_, Sage Weil)
+* rbd: update default image features (`pr#7846 <http://github.com/ceph/ceph/pull/7846>`_, Jason Dillaman)
+* rbd-mirror: make remote context respect env and argv config params (`pr#8182 <http://github.com/ceph/ceph/pull/8182>`_, Mykola Golub)
+* journal: re-use common threads between journalers (`pr#7906 <http://github.com/ceph/ceph/pull/7906>`_, Jason Dillaman)
+* client: add option to control how directory size is calculated (`pr#7323 <http://github.com/ceph/ceph/pull/7323>`_, Yan, Zheng)
+* rgw: keystone v3 (`pr#7719 <http://github.com/ceph/ceph/pull/7719>`_, Mark Barnes, Radoslaw Zarzynski)
+* rgw: new multisite merge (`issue#14549 <http://tracker.ceph.com/issues/14549>`_, `pr#7709 <http://github.com/ceph/ceph/pull/7709>`_, Yehuda Sadeh, Orit Wasserman, Casey Bodley, Daniel Gryniewicz)
+* rgw: adjust error code when bucket does not exist in copy operation (`issue#14975 <http://tracker.ceph.com/issues/14975>`_, `pr#7916 <http://github.com/ceph/ceph/pull/7916>`_, Yehuda Sadeh)
+* rgw: indexless (`pr#7786 <http://github.com/ceph/ceph/pull/7786>`_, Yehuda Sadeh)
+
+
+
+v10.0.5
+=======
+
+This is identical to v10.0.4 and was only created because of a git tagging mistake.
+
+v10.0.4
+=======
+
+This is the fifth and last development release before Jewel.  The next release
+will be a release candidate with the final set of features.  Big items include
+RGW static website support, librbd journal framework, fixed mon sync of config-key
+data, C++11 updates, and bluestore/kstore.
+
+Notable Changes
+---------------
+
+* admin/build-doc: depend on zlib1g-dev and graphviz (`pr#7522 <http://github.com/ceph/ceph/pull/7522>`_, Ken Dreyer)
+* buffer: use move construct to append/push_back/push_front (`pr#7455 <http://github.com/ceph/ceph/pull/7455>`_, Haomai Wang)
+* build: allow jemalloc with rocksdb-static (`pr#7368 <http://github.com/ceph/ceph/pull/7368>`_, Somnath Roy)
+* build: fix the autotools and cmake build (the new fusestore needs libfuse) (`pr#7393 <http://github.com/ceph/ceph/pull/7393>`_, Kefu Chai)
+* build: fix warnings (`pr#7197 <http://github.com/ceph/ceph/pull/7197>`_, Kefu Chai, xie xingguo)
+* build: fix warnings (`pr#7315 <http://github.com/ceph/ceph/pull/7315>`_, Kefu Chai)
+* build: kill warnings (`pr#7397 <http://github.com/ceph/ceph/pull/7397>`_, Kefu Chai)
+* build: move libexec scripts to standardize across distros (`issue#14687 <http://tracker.ceph.com/issues/14687>`_, `issue#14705 <http://tracker.ceph.com/issues/14705>`_, `issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7636 <http://github.com/ceph/ceph/pull/7636>`_, Nathan Cutler, Kefu Chai)
+* build: Refrain from versioning and packaging EC testing plugins (`issue#14756 <http://tracker.ceph.com/issues/14756>`_, `issue#14723 <http://tracker.ceph.com/issues/14723>`_, `pr#7637 <http://github.com/ceph/ceph/pull/7637>`_, Nathan Cutler, Kefu Chai)
+* build: spdk submodule; cmake (`pr#7503 <http://github.com/ceph/ceph/pull/7503>`_, Kefu Chai)
+* ceph-disk: support bluestore (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7218 <http://github.com/ceph/ceph/pull/7218>`_, Loic Dachary, Sage Weil)
+* ceph-disk/test: fix test_prepare.py::TestPrepare tests (`pr#7549 <http://github.com/ceph/ceph/pull/7549>`_, Kefu Chai)
+* cleanup: remove misc dead code (`pr#7201 <http://github.com/ceph/ceph/pull/7201>`_, Erwan Velu)
+* cls/cls_rbd: pass string by reference (`pr#7232 <http://github.com/ceph/ceph/pull/7232>`_, Jeffrey Lu)
+* cmake: Added new unittests to make check (`pr#7572 <http://github.com/ceph/ceph/pull/7572>`_, Ali Maredia)
+* cmake: add KernelDevice.cc to libos_srcs (`pr#7507 <http://github.com/ceph/ceph/pull/7507>`_, Kefu Chai)
+* cmake: check for libsnappy in default path also (`pr#7366 <http://github.com/ceph/ceph/pull/7366>`_, Kefu Chai)
+* cmake: feb5 (`pr#7541 <http://github.com/ceph/ceph/pull/7541>`_, Matt Benjamin)
+* cmake: For CMake version <= 2.8.11, use LINK_PRIVATE and LINK_PUBLIC (`pr#7474 <http://github.com/ceph/ceph/pull/7474>`_, Tao Chang)
+* cmake: let ceph-client-debug link with tcmalloc (`pr#7314 <http://github.com/ceph/ceph/pull/7314>`_, Kefu Chai)
+* cmake: support ccache via a WITH_CCACHE build option (`pr#6875 <http://github.com/ceph/ceph/pull/6875>`_, John Coyle)
+* common: add zlib compression plugin (`pr#7437 <http://github.com/ceph/ceph/pull/7437>`_, Alyona Kiseleva, Kiseleva Alyona)
+* common: admin socket commands for tcmalloc heap get/set operations (`pr#7512 <http://github.com/ceph/ceph/pull/7512>`_, Samuel Just)
+* common: ake ceph_time clocks work under BSD (`pr#7340 <http://github.com/ceph/ceph/pull/7340>`_, Adam C. Emerson)
+* common: Allow OPT_INT settings with negative values (`issue#13829 <http://tracker.ceph.com/issues/13829>`_, `pr#7390 <http://github.com/ceph/ceph/pull/7390>`_, Brad Hubbard, Kefu Chai)
+* common/buffer: replace RWLock with spinlocks (`pr#7294 <http://github.com/ceph/ceph/pull/7294>`_, Piotr Dałek)
+* common: change the type of counter total/unhealthy_workers (`pr#7254 <http://github.com/ceph/ceph/pull/7254>`_, Guang Yang)
+* common: snappy decompressor may assert when handling segmented input bufferlist (`issue#14400 <http://tracker.ceph.com/issues/14400>`_, `pr#7268 <http://github.com/ceph/ceph/pull/7268>`_, Igor Fedotov)
+* common/str_map: cleanup: replaced get_str_map() function overloading by using default parameters for delimiters (`pr#7266 <http://github.com/ceph/ceph/pull/7266>`_, Sahithi R V)
+* common: time: have skewing-now call non-skewing now (`pr#7466 <http://github.com/ceph/ceph/pull/7466>`_, Adam C. Emerson)
+* common: unit test for interval_set implementations (`pr#6 <http://github.com/ceph/ceph/pull/6>`_, Igor Fedotov)
+* config: add $data_dir/config to config search path (`pr#7377 <http://github.com/ceph/ceph/pull/7377>`_, Sage Weil)
+* configure.ac: make "--with-librocksdb-static" default to 'check' (`issue#14463 <http://tracker.ceph.com/issues/14463>`_, `pr#7317 <http://github.com/ceph/ceph/pull/7317>`_, Dan Mick)
+* crush: add safety assert (`issue#14496 <http://tracker.ceph.com/issues/14496>`_, `pr#7344 <http://github.com/ceph/ceph/pull/7344>`_, songbaisen)
+* crush: reply quickly from get_immediate_parent (`issue#14334 <http://tracker.ceph.com/issues/14334>`_, `pr#7181 <http://github.com/ceph/ceph/pull/7181>`_, song baisen)
+* debian: packaging fixes for jewel (`pr#7807 <http://github.com/ceph/ceph/pull/7807>`_, Ken Dreyer, Ali Maredia)
+* debian/rpm split servers (`issue#10587 <http://tracker.ceph.com/issues/10587>`_, `pr#7746 <http://github.com/ceph/ceph/pull/7746>`_, Ken Dreyer)
+* doc: add orphans commands to radosgw-admin(8) (`issue#14637 <http://tracker.ceph.com/issues/14637>`_, `pr#7518 <http://github.com/ceph/ceph/pull/7518>`_, Ken Dreyer)
+* doc: amend the rados.8 (`pr#7251 <http://github.com/ceph/ceph/pull/7251>`_, Kefu Chai)
+* doc: Fixes a CRUSH map step take argument (`pr#7327 <http://github.com/ceph/ceph/pull/7327>`_, Ivan Grcic)
+* doc: fixing image in section ERASURE CODING (`pr#7298 <http://github.com/ceph/ceph/pull/7298>`_, Rachana Patel)
+* doc: fix misleading configuration guide on cache tiering (`pr#7000 <http://github.com/ceph/ceph/pull/7000>`_, Yuan Zhou)
+* doc: fix S3 C# example (`pr#7027 <http://github.com/ceph/ceph/pull/7027>`_, Dunrong Huang)
+* doc: remove redundant space in ceph-authtool/monmaptool doc (`pr#7244 <http://github.com/ceph/ceph/pull/7244>`_, Jiaying Ren)
+* doc: revise SubmittingPatches (`pr#7292 <http://github.com/ceph/ceph/pull/7292>`_, Kefu Chai)
+* doc: rgw: port changes from downstream to upstream (`pr#7264 <http://github.com/ceph/ceph/pull/7264>`_, Bara Ancincova)
+* doc: script and guidelines for mirroring Ceph (`pr#7384 <http://github.com/ceph/ceph/pull/7384>`_, Wido den Hollander)
+* doc: use 'ceph auth get-or-create' for creating RGW keyring (`pr#6930 <http://github.com/ceph/ceph/pull/6930>`_, Wido den Hollander)
+* global: do not start two daemons with a single pid-file (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7075 <http://github.com/ceph/ceph/pull/7075>`_, shun song)
+* global: do not start two daemons with a single pid-file (part 2) (`issue#13422 <http://tracker.ceph.com/issues/13422>`_, `pr#7463 <http://github.com/ceph/ceph/pull/7463>`_, Loic Dachary)
+* journal: flush commit position on metadata shutdown (`pr#7385 <http://github.com/ceph/ceph/pull/7385>`_, Mykola Golub)
+* journal: reset commit_position_task_ctx pointer after task complete (`pr#7480 <http://github.com/ceph/ceph/pull/7480>`_, Mykola Golub)
+* libcephfs: update LIBCEPHFS_VERSION to indicate the interface was changed (`pr#7551 <http://github.com/ceph/ceph/pull/7551>`_, Jevon Qiao)
+* librados: move to c++11 concurrency types (`pr#5931 <http://github.com/ceph/ceph/pull/5931>`_, Adam C. Emerson)
+* librados: remove duplicate definitions for rados pool_stat_t and cluster_stat_t (`pr#7330 <http://github.com/ceph/ceph/pull/7330>`_, Igor Fedotov)
+* librados: shutdown finisher in a more graceful way (`pr#7519 <http://github.com/ceph/ceph/pull/7519>`_, xie xingguo)
+* librados_test_stub: protect against notify/unwatch race (`pr#7540 <http://github.com/ceph/ceph/pull/7540>`_, Jason Dillaman)
+* librbd: API: async open and close (`issue#14264 <http://tracker.ceph.com/issues/14264>`_, `pr#7259 <http://github.com/ceph/ceph/pull/7259>`_, Mykola Golub)
+* librbd: Avoid create two threads per image (`pr#7400 <http://github.com/ceph/ceph/pull/7400>`_, Haomai Wang)
+* librbd: block maintenance ops until after journal is ready (`issue#14510 <http://tracker.ceph.com/issues/14510>`_, `pr#7382 <http://github.com/ceph/ceph/pull/7382>`_, Jason Dillaman)
+* librbd: fix internal handling of dynamic feature updates (`pr#7299 <http://github.com/ceph/ceph/pull/7299>`_, Jason Dillaman)
+* librbd: journal framework for tracking exclusive lock transitions (`issue#13298 <http://tracker.ceph.com/issues/13298>`_, `pr#7529 <http://github.com/ceph/ceph/pull/7529>`_, Jason Dillaman)
+* librbd: journal shut down flush race condition (`issue#14434 <http://tracker.ceph.com/issues/14434>`_, `pr#7302 <http://github.com/ceph/ceph/pull/7302>`_, Jason Dillaman)
+* librbd: remove canceled tasks from timer thread (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7329 <http://github.com/ceph/ceph/pull/7329>`_, Douglas Fuller)
+* makefile: remove libedit from libclient.la (`pr#7284 <http://github.com/ceph/ceph/pull/7284>`_, Kefu Chai)
+* mds, client: fix locking around handle_conf_change (`issue#14365 <http://tracker.ceph.com/issues/14365>`_, `issue#14374 <http://tracker.ceph.com/issues/14374>`_, `pr#7312 <http://github.com/ceph/ceph/pull/7312>`_, John Spray)
+* mds: judgment added to avoid the risk of visiting the NULL pointer (`pr#7358 <http://github.com/ceph/ceph/pull/7358>`_, Kongming Wu)
+* mon: add an independent option for max election time (`pr#7245 <http://github.com/ceph/ceph/pull/7245>`_, Sangdi Xu)
+* mon: compact full epochs also (`issue#14537 <http://tracker.ceph.com/issues/14537>`_, `pr#7396 <http://github.com/ceph/ceph/pull/7396>`_, Kefu Chai)
+* mon: consider the pool size when setting pool crush rule (`issue#14495 <http://tracker.ceph.com/issues/14495>`_, `pr#7341 <http://github.com/ceph/ceph/pull/7341>`_, song baisen)
+* mon: drop useless rank init assignment (`issue#14508 <http://tracker.ceph.com/issues/14508>`_, `pr#7321 <http://github.com/ceph/ceph/pull/7321>`_, huanwen ren)
+* mon: fix locking in preinit error paths (`issue#14473 <http://tracker.ceph.com/issues/14473>`_, `pr#7353 <http://github.com/ceph/ceph/pull/7353>`_, huanwen ren)
+* mon: fix monmap creation stamp (`pr#7459 <http://github.com/ceph/ceph/pull/7459>`_, duanweijun)
+* mon: fix sync of config-key data (`pr#7363 <http://github.com/ceph/ceph/pull/7363>`_, Xiaowei Chen)
+* mon: go into ERR state if multiple PGs are stuck inactive (`issue#13923 <http://tracker.ceph.com/issues/13923>`_, `pr#7253 <http://github.com/ceph/ceph/pull/7253>`_, Wido den Hollander)
+* mon/MDSMonitor.cc: properly note beacon when health metrics changes (`issue#14684 <http://tracker.ceph.com/issues/14684>`_, `pr#7757 <http://github.com/ceph/ceph/pull/7757>`_, Yan, Zheng)
+* mon/MonClient: avoid null pointer error when configured incorrectly (`issue#14405 <http://tracker.ceph.com/issues/14405>`_, `pr#7276 <http://github.com/ceph/ceph/pull/7276>`_, Bo Cai)
+* mon: PG Monitor should report waiting for backfill (`issue#12744 <http://tracker.ceph.com/issues/12744>`_, `pr#7398 <http://github.com/ceph/ceph/pull/7398>`_, Abhishek Lekshmanan)
+* mon: reduce CPU and memory manager pressure of pg health check (`pr#7482 <http://github.com/ceph/ceph/pull/7482>`_, Piotr Dałek)
+* mon: some cleanup in MonmapMonitor.cc (`pr#7418 <http://github.com/ceph/ceph/pull/7418>`_, huanwen ren)
+* mon: warn if pg(s) not scrubbed (`issue#13142 <http://tracker.ceph.com/issues/13142>`_, `pr#6440 <http://github.com/ceph/ceph/pull/6440>`_, Michal Jarzabek)
+* msg/async: AsyncConnection: avoid debug log in cleanup_handler (`pr#7547 <http://github.com/ceph/ceph/pull/7547>`_, Haomai Wang)
+* msg/async: bunch of fixes (`pr#7379 <http://github.com/ceph/ceph/pull/7379>`_, Piotr Dałek)
+* msg/async: fix array boundary (`pr#7451 <http://github.com/ceph/ceph/pull/7451>`_, Wei Jin)
+* msg/async: fix potential race condition (`pr#7453 <http://github.com/ceph/ceph/pull/7453>`_, Haomai Wang)
+* msg/async: fix send closed local_connection message problem (`pr#7255 <http://github.com/ceph/ceph/pull/7255>`_, Haomai Wang)
+* msg/async: reduce extra tcp packet for message ack (`pr#7380 <http://github.com/ceph/ceph/pull/7380>`_, Haomai Wang)
+* msg/xio: fix compilation (`pr#7479 <http://github.com/ceph/ceph/pull/7479>`_, Roi Dayan)
+* organizationmap: modify org mail info. (`pr#7240 <http://github.com/ceph/ceph/pull/7240>`_, Xiaowei Chen)
+* os/bluestore: fix assert (`issue#14436 <http://tracker.ceph.com/issues/14436>`_, `pr#7293 <http://github.com/ceph/ceph/pull/7293>`_, xie xingguo)
+* os/bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7342 <http://github.com/ceph/ceph/pull/7342>`_, Kefu Chai)
+* os/bluestore: insert new onode to the front position of onode LRU (`pr#7492 <http://github.com/ceph/ceph/pull/7492>`_, Jianjian Huo)
+* os/bluestore: use intrusive_ptr for Dir (`pr#7247 <http://github.com/ceph/ceph/pull/7247>`_, Igor Fedotov)
+* osd: blockdevice: avoid implicit cast and add guard (`pr#7460 <http://github.com/ceph/ceph/pull/7460>`_, xie xingguo)
+* osd: bluestore/BlueFS: initialize super block_size earlier in mkfs (`pr#7535 <http://github.com/ceph/ceph/pull/7535>`_, Sage Weil)
+* osd: BlueStore: fix fsck and blockdevice read-relevant issue (`pr#7362 <http://github.com/ceph/ceph/pull/7362>`_, xie xingguo)
+* osd: BlueStore: fix null pointer access (`issue#14561 <http://tracker.ceph.com/issues/14561>`_, `pr#7435 <http://github.com/ceph/ceph/pull/7435>`_, xie xingguo)
+* osd: bluestore, kstore: fix nid overwritten logic (`issue#14407 <http://tracker.ceph.com/issues/14407>`_, `issue#14433 <http://tracker.ceph.com/issues/14433>`_, `pr#7283 <http://github.com/ceph/ceph/pull/7283>`_, xie xingguo)
+* osd: bluestore: use btree_map for allocator (`pr#7269 <http://github.com/ceph/ceph/pull/7269>`_, Igor Fedotov, Sage Weil)
+* osd: drop fiemap len=0 logic (`pr#7267 <http://github.com/ceph/ceph/pull/7267>`_, Sage Weil)
+* osd: FileStore: add error check for object_map->sync() (`pr#7281 <http://github.com/ceph/ceph/pull/7281>`_, Chendi Xue)
+* osd: FileStore: cleanup: remove obsolete option "filestore_xattr_use_omap" (`issue#14356 <http://tracker.ceph.com/issues/14356>`_, `pr#7217 <http://github.com/ceph/ceph/pull/7217>`_, Vikhyat Umrao)
+* osd: FileStore: modify the format of colon (`pr#7333 <http://github.com/ceph/ceph/pull/7333>`_, Donghai Xu)
+* osd: FileStore: print file name before osd assert if read file failed (`pr#7111 <http://github.com/ceph/ceph/pull/7111>`_, Ji Chen)
+* osd: fix invalid list traversal in process_copy_chunk (`pr#7511 <http://github.com/ceph/ceph/pull/7511>`_, Samuel Just)
+* osd, mon: fix exit issue (`pr#7420 <http://github.com/ceph/ceph/pull/7420>`_, Jiaying Ren)
+* osd: PG::activate(): handle unexpected cached_removed_snaps more gracefully (`issue#14428 <http://tracker.ceph.com/issues/14428>`_, `pr#7309 <http://github.com/ceph/ceph/pull/7309>`_, Alexey Sheplyakov)
+* os/fs: fix io_getevents argument (`pr#7355 <http://github.com/ceph/ceph/pull/7355>`_, Jingkai Yuan)
+* os/fusestore: add error handling (`pr#7395 <http://github.com/ceph/ceph/pull/7395>`_, xie xingguo)
+* os/keyvaluestore: kill KeyValueStore (`pr#7320 <http://github.com/ceph/ceph/pull/7320>`_, Haomai Wang)
+* os/kstore: insert new onode to the front position of onode LRU (`pr#7505 <http://github.com/ceph/ceph/pull/7505>`_, xie xingguo)
+* os/ObjectStore: add custom move operations for ObjectStore::Transaction (`pr#7303 <http://github.com/ceph/ceph/pull/7303>`_, Casey Bodley)
+* rgw: Bug fix for mtime anomalies in RadosGW and other places (`pr#7328 <http://github.com/ceph/ceph/pull/7328>`_, Adam C. Emerson, Casey Bodley)
+* rpm: move %post(un) ldconfig calls to ceph-base (`issue#14940 <http://tracker.ceph.com/issues/14940>`_, `pr#7867 <http://github.com/ceph/ceph/pull/7867>`_, Nathan Cutler)
+* rpm: move runtime dependencies to ceph-base and fix other packaging issues (`issue#14864 <http://tracker.ceph.com/issues/14864>`_, `pr#7826 <http://github.com/ceph/ceph/pull/7826>`_, Nathan Cutler)
+* test: ceph_test_rados: use less CPU (`pr#7513 <http://github.com/ceph/ceph/pull/7513>`_, Samuel Just)
+
+v10.0.3
+=======
+
+This is the fourth development release for Jewel.  Several big pieces
+have been added this release, including BlueStore (a new backend for
+OSD to replace FileStore), many ceph-disk fixes, a new CRUSH tunable
+that improves mapping stability, a new librados object enumeration API,
+and a whole slew of OSD and RADOS optimizations.
+
+Note that, due to general developer busyness, we aren't building official
+release packages for this dev release.  You can fetch autobuilt gitbuilder
+packages from the usual location (gitbuilder.ceph.com).
+
+Notable Changes
+---------------
+
+* bluestore: latest and greatest (`issue#14210 <http://tracker.ceph.com/issues/14210>`_, `issue#13801 <http://tracker.ceph.com/issues/13801>`_, `pr#6896 <http://github.com/ceph/ceph/pull/6896>`_, xie.xingguo, Jianpeng Ma, YiQiang Chen, Sage Weil, Ning Yao)
+* buffer: fix internal iterator invalidation on rebuild, get_contiguous (`pr#6962 <http://github.com/ceph/ceph/pull/6962>`_, Sage Weil)
+* build: fix a few warnings (`pr#6847 <http://github.com/ceph/ceph/pull/6847>`_, Orit Wasserman)
+* build: misc make check fixes (`pr#7153 <http://github.com/ceph/ceph/pull/7153>`_, Sage Weil)
+* ceph-detect-init: fix py3 test (`pr#7025 <http://github.com/ceph/ceph/pull/7025>`_, Kefu Chai)
+* ceph-disk: add -f flag for btrfs mkfs (`pr#7222 <http://github.com/ceph/ceph/pull/7222>`_, Darrell Enns)
+* ceph-disk: ceph-disk list fails on /dev/cciss!c0d0 (`issue#13970 <http://tracker.ceph.com/issues/13970>`_, `issue#14233 <http://tracker.ceph.com/issues/14233>`_, `issue#14230 <http://tracker.ceph.com/issues/14230>`_, `pr#6879 <http://github.com/ceph/ceph/pull/6879>`_, Loic Dachary)
+* ceph-disk: fix failures when preparing disks with udev > 214 (`issue#14080 <http://tracker.ceph.com/issues/14080>`_, `issue#14094 <http://tracker.ceph.com/issues/14094>`_, `pr#6926 <http://github.com/ceph/ceph/pull/6926>`_, Loic Dachary, Ilya Dryomov)
+* ceph-disk: Fix trivial typo (`pr#7472 <http://github.com/ceph/ceph/pull/7472>`_, Brad Hubbard)
+* ceph-disk: warn for prepare partitions with bad GUIDs (`issue#13943 <http://tracker.ceph.com/issues/13943>`_, `pr#6760 <http://github.com/ceph/ceph/pull/6760>`_, David Disseldorp)
+* ceph-fuse: fix double decreasing the count to trim caps (`issue#14319 <http://tracker.ceph.com/issues/14319>`_, `pr#7229 <http://github.com/ceph/ceph/pull/7229>`_, Zhi Zhang)
+* ceph-fuse: fix double free of args (`pr#7015 <http://github.com/ceph/ceph/pull/7015>`_, Ilya Shipitsin)
+* ceph-fuse: fix fsync() (`pr#6388 <http://github.com/ceph/ceph/pull/6388>`_, Yan, Zheng)
+* ceph-fuse:print usage information when no parameter specified (`pr#6868 <http://github.com/ceph/ceph/pull/6868>`_, Bo Cai)
+* ceph: improve the error message (`issue#11101 <http://tracker.ceph.com/issues/11101>`_, `pr#7106 <http://github.com/ceph/ceph/pull/7106>`_, Kefu Chai)
+* ceph.in: avoid a broken pipe error when use ceph command (`issue#14354 <http://tracker.ceph.com/issues/14354>`_, `pr#7212 <http://github.com/ceph/ceph/pull/7212>`_, Bo Cai)
+* ceph.spec.in: add copyright notice (`issue#14694 <http://tracker.ceph.com/issues/14694>`_, `pr#7569 <http://github.com/ceph/ceph/pull/7569>`_, Nathan Cutler)
+* ceph.spec.in: add license declaration (`pr#7574 <http://github.com/ceph/ceph/pull/7574>`_, Nathan Cutler)
+* ceph_test_libcephfs: tolerate duplicated entries in readdir (`issue#14377 <http://tracker.ceph.com/issues/14377>`_, `pr#7246 <http://github.com/ceph/ceph/pull/7246>`_, Yan, Zheng)
+* client: check if Fh is readable when processing a read (`issue#11517 <http://tracker.ceph.com/issues/11517>`_, `pr#7209 <http://github.com/ceph/ceph/pull/7209>`_, Yan, Zheng)
+* client: properly trim unlinked inode (`issue#13903 <http://tracker.ceph.com/issues/13903>`_, `pr#7297 <http://github.com/ceph/ceph/pull/7297>`_, Yan, Zheng)
+* cls_rbd: add guards for error cases (`issue#14316 <http://tracker.ceph.com/issues/14316>`_, `issue#14317 <http://tracker.ceph.com/issues/14317>`_, `pr#7165 <http://github.com/ceph/ceph/pull/7165>`_, xie xingguo)
+* cls_rbd: enable object map checksums for object_map_save (`issue#14280 <http://tracker.ceph.com/issues/14280>`_, `pr#7149 <http://github.com/ceph/ceph/pull/7149>`_, Douglas Fuller)
+* cmake: Add ENABLE_GIT_VERSION to avoid rebuilding (`pr#7171 <http://github.com/ceph/ceph/pull/7171>`_, Kefu Chai)
+* cmake: add missing check for HAVE_EXECINFO_H (`pr#7270 <http://github.com/ceph/ceph/pull/7270>`_, Casey Bodley)
+* cmake: cleanups and more features from automake (`pr#7103 <http://github.com/ceph/ceph/pull/7103>`_, Casey Bodley, Ali Maredia)
+* cmake: detect bzip2 and lz4 (`pr#7126 <http://github.com/ceph/ceph/pull/7126>`_, Kefu Chai)
+* cmake: fix build with bluestore (`pr#7099 <http://github.com/ceph/ceph/pull/7099>`_, John Spray)
+* cmake: fix the build on trusty (`pr#7249 <http://github.com/ceph/ceph/pull/7249>`_, Kefu Chai)
+* cmake: made rocksdb an imported library (`pr#7131 <http://github.com/ceph/ceph/pull/7131>`_, Ali Maredia)
+* cmake: no need to run configure from run-cmake-check.sh (`pr#6959 <http://github.com/ceph/ceph/pull/6959>`_, Orit Wasserman)
+* cmake: test_build_libcephfs needs ${ALLOC_LIBS} (`pr#7300 <http://github.com/ceph/ceph/pull/7300>`_, Ali Maredia)
+* common/address_help.cc: fix the leak in entity_addr_from_url() (`issue#14132 <http://tracker.ceph.com/issues/14132>`_, `pr#6987 <http://github.com/ceph/ceph/pull/6987>`_, Qiankun Zheng)
+* common: add thread names (`pr#5882 <http://github.com/ceph/ceph/pull/5882>`_, Igor Podoski)
+* common: assert: abort() rather than throw (`pr#6804 <http://github.com/ceph/ceph/pull/6804>`_, Adam C. Emerson)
+* common: buffer/assert minor fixes (`pr#6990 <http://github.com/ceph/ceph/pull/6990>`_, Matt Benjamin)
+* common/Formatter: avoid newline if there is no output (`pr#5351 <http://github.com/ceph/ceph/pull/5351>`_, Aran85)
+* common: improve shared_cache and simple_cache efficiency with hash table (`pr#6909 <http://github.com/ceph/ceph/pull/6909>`_, Ning Yao)
+* common/lockdep: increase max lock names (`pr#6961 <http://github.com/ceph/ceph/pull/6961>`_, Sage Weil)
+* common: new timekeeping common code, and Objecter conversion (`pr#5782 <http://github.com/ceph/ceph/pull/5782>`_, Adam C. Emerson)
+* common: signal_handler: added support for using reentrant strsignal() implementations vs. sys_siglist[] (`pr#6796 <http://github.com/ceph/ceph/pull/6796>`_, John Coyle)
+* config: complains when a setting is not tracked (`issue#11692 <http://tracker.ceph.com/issues/11692>`_, `pr#7085 <http://github.com/ceph/ceph/pull/7085>`_, Kefu Chai)
+* configure: detect bz2 and lz4 (`issue#13850 <http://tracker.ceph.com/issues/13850>`_, `issue#13981 <http://tracker.ceph.com/issues/13981>`_, `pr#7030 <http://github.com/ceph/ceph/pull/7030>`_, Kefu Chai)
+* correct radosgw-admin command (`pr#7006 <http://github.com/ceph/ceph/pull/7006>`_, YankunLi)
+* crush: add chooseleaf_stable tunable (`pr#6572 <http://github.com/ceph/ceph/pull/6572>`_, Sangdi Xu, Sage Weil)
+* crush: clean up whitespace removal (`issue#14302 <http://tracker.ceph.com/issues/14302>`_, `pr#7157 <http://github.com/ceph/ceph/pull/7157>`_, songbaisen)
+* crush/CrushTester: check for overlapped rules (`pr#7139 <http://github.com/ceph/ceph/pull/7139>`_, Kefu Chai)
+* crushtool: improve usage/tip messages (`pr#7142 <http://github.com/ceph/ceph/pull/7142>`_, xie xingguo)
+* crushtool: set type 0 name "device" for --build option (`pr#6824 <http://github.com/ceph/ceph/pull/6824>`_, Sangdi Xu)
+* doc: adding "--allow-shrink" in decreasing the size of the rbd block to distinguish from the increasing option (`pr#7020 <http://github.com/ceph/ceph/pull/7020>`_, Yehua)
+* doc: admin/build-doc: make paths absolute (`pr#7119 <http://github.com/ceph/ceph/pull/7119>`_, Dan Mick)
+* doc: dev: document ceph-qa-suite (`pr#6955 <http://github.com/ceph/ceph/pull/6955>`_, Loic Dachary)
+* doc: document "readforward" and "readproxy" cache mode (`pr#7023 <http://github.com/ceph/ceph/pull/7023>`_, Kefu Chai)
+* doc: fix "mon osd down out subtree limit" option name (`pr#7164 <http://github.com/ceph/ceph/pull/7164>`_, François Lafont)
+* doc: fix typo (`pr#7004 <http://github.com/ceph/ceph/pull/7004>`_, tianqing)
+* doc: Updated the rados command man page to include the --run-name opt… (`issue#12899 <http://tracker.ceph.com/issues/12899>`_, `pr#5900 <http://github.com/ceph/ceph/pull/5900>`_, ritz303)
+* fs: be more careful about the "mds setmap" command to prevent breakage (`issue#14380 <http://tracker.ceph.com/issues/14380>`_, `pr#7262 <http://github.com/ceph/ceph/pull/7262>`_, Yan, Zheng)
+* helgrind: additional race conditionslibrbd: journal replay should honor inter-event dependencies (`pr#7274 <http://github.com/ceph/ceph/pull/7274>`_, Jason Dillaman)
+* helgrind: fix real (and imaginary) race conditions (`issue#14163 <http://tracker.ceph.com/issues/14163>`_, `pr#7208 <http://github.com/ceph/ceph/pull/7208>`_, Jason Dillaman)
+* kv: implement value_as_ptr() and use it in .get() (`pr#7052 <http://github.com/ceph/ceph/pull/7052>`_, Piotr Dałek)
+* librados: add c++ style osd/pg command interface (`pr#6893 <http://github.com/ceph/ceph/pull/6893>`_, Yunchuan Wen)
+* librados: fix several flaws introduced by the enumeration_objects API (`issue#14299 <http://tracker.ceph.com/issues/14299>`_, `issue#14301 <http://tracker.ceph.com/issues/14301>`_, `issue#14300 <http://tracker.ceph.com/issues/14300>`_, `pr#7156 <http://github.com/ceph/ceph/pull/7156>`_, xie xingguo)
+* librados: new style (sharded) object listing (`pr#6405 <http://github.com/ceph/ceph/pull/6405>`_, John Spray, Sage Weil)
+* librados: potential null pointer access in list_(n)objects (`issue#13822 <http://tracker.ceph.com/issues/13822>`_, `pr#6639 <http://github.com/ceph/ceph/pull/6639>`_, xie xingguo)
+* librbd: exit if parent's snap is gone during clone (`issue#14118 <http://tracker.ceph.com/issues/14118>`_, `pr#6968 <http://github.com/ceph/ceph/pull/6968>`_, xie xingguo)
+* librbd: fix potential memory leak (`issue#14332 <http://tracker.ceph.com/issues/14332>`_, `issue#14333 <http://tracker.ceph.com/issues/14333>`_, `pr#7174 <http://github.com/ceph/ceph/pull/7174>`_, xie xingguo)
+* librbd: fix snap_exists API return code overflow (`issue#14129 <http://tracker.ceph.com/issues/14129>`_, `pr#6986 <http://github.com/ceph/ceph/pull/6986>`_, xie xingguo)
+* librbd: journal replay should honor inter-event dependencies (`pr#7019 <http://github.com/ceph/ceph/pull/7019>`_, Jason Dillaman)
+* librbd: return error if we fail to delete object_map head object (`issue#14098 <http://tracker.ceph.com/issues/14098>`_, `pr#6958 <http://github.com/ceph/ceph/pull/6958>`_, xie xingguo)
+* librbd: small fixes for error messages and readahead counter (`issue#14127 <http://tracker.ceph.com/issues/14127>`_, `pr#6983 <http://github.com/ceph/ceph/pull/6983>`_, xie xingguo)
+* librbd: uninitialized state in snap remove state machine (`pr#6982 <http://github.com/ceph/ceph/pull/6982>`_, Jason Dillaman)
+* mailmap: hange organization for Dongmao Zhang (`pr#7173 <http://github.com/ceph/ceph/pull/7173>`_, Dongmao Zhang)
+* mailmap: Igor Podoski affiliation (`pr#7219 <http://github.com/ceph/ceph/pull/7219>`_, Igor Podoski)
+* mailmap update (`pr#7210 <http://github.com/ceph/ceph/pull/7210>`_, M Ranga Swami Reddy)
+* mailmap updates (`pr#6992 <http://github.com/ceph/ceph/pull/6992>`_, Loic Dachary)
+* mailmap updates (`pr#7189 <http://github.com/ceph/ceph/pull/7189>`_, Loic Dachary)
+* man: document listwatchers cmd in "rados" manpage (`pr#7021 <http://github.com/ceph/ceph/pull/7021>`_, Kefu Chai)
+* mds: advance clientreplay when replying (`issue#14357 <http://tracker.ceph.com/issues/14357>`_, `pr#7216 <http://github.com/ceph/ceph/pull/7216>`_, John Spray)
+* mds: expose state of recovery to status ASOK command (`issue#14146 <http://tracker.ceph.com/issues/14146>`_, `pr#7068 <http://github.com/ceph/ceph/pull/7068>`_, Yan, Zheng)
+* mds: fix client cap/message replay order on restart (`issue#14254 <http://tracker.ceph.com/issues/14254>`_, `issue#13546 <http://tracker.ceph.com/issues/13546>`_, `pr#7199 <http://github.com/ceph/ceph/pull/7199>`_, Yan, Zheng)
+* mds: fix standby replay thread creation (`issue#14144 <http://tracker.ceph.com/issues/14144>`_, `pr#7132 <http://github.com/ceph/ceph/pull/7132>`_, John Spray)
+* mds: we should wait messenger when MDSDaemon suicide (`pr#6996 <http://github.com/ceph/ceph/pull/6996>`_, Wei Feng)
+* mon: add `osd blacklist clear` (`pr#6945 <http://github.com/ceph/ceph/pull/6945>`_, John Spray)
+* mon: add RAW USED column to ceph df detail (`pr#7087 <http://github.com/ceph/ceph/pull/7087>`_, Ruifeng Yang)
+* mon: degrade a log message to level 2 (`pr#6929 <http://github.com/ceph/ceph/pull/6929>`_, Kongming Wu)
+* mon: fix coding-style on PG related Monitor files (`pr#6881 <http://github.com/ceph/ceph/pull/6881>`_, Wido den Hollander)
+* mon: fixes related to mondbstore->get() changes (`pr#6564 <http://github.com/ceph/ceph/pull/6564>`_, Piotr Dałek)
+* mon: fix reuse of osd ids (clear osd info on osd deletion) (`issue#13988 <http://tracker.ceph.com/issues/13988>`_, `pr#6900 <http://github.com/ceph/ceph/pull/6900>`_, Loic Dachary, Sage Weil)
+* mon: fix the can't change subscribe level bug in monitoring log (`pr#7031 <http://github.com/ceph/ceph/pull/7031>`_, Zhiqiang Wang)
+* mon/MDSMonitor: add confirmation to "ceph mds rmfailed" (`issue#14379 <http://tracker.ceph.com/issues/14379>`_, `pr#7248 <http://github.com/ceph/ceph/pull/7248>`_, Yan, Zheng)
+* mon: modify a dout level in OSDMonitor.cc (`pr#6928 <http://github.com/ceph/ceph/pull/6928>`_, Yongqiang He)
+* mon: MonmapMonitor: don't expose uncommitted state to client (`pr#6854 <http://github.com/ceph/ceph/pull/6854>`_, Joao Eduardo Luis)
+* mon/OSDMonitor: osdmap laggy set a maximum limit for interval (`pr#7109 <http://github.com/ceph/ceph/pull/7109>`_, Zengran Zhang)
+* mon: paxos is_recovering calc error (`pr#7227 <http://github.com/ceph/ceph/pull/7227>`_, Weijun Duan)
+* mon/PGMap: show rd/wr iops separately in status reports (`pr#7072 <http://github.com/ceph/ceph/pull/7072>`_, Cilang Zhao)
+* mon: PGMonitor: acting primary diff with cur_stat, should not set pg to stale (`pr#7083 <http://github.com/ceph/ceph/pull/7083>`_, Xiaowei Chen)
+* msg: add override to virutal methods (`pr#6977 <http://github.com/ceph/ceph/pull/6977>`_, Michal Jarzabek)
+* msg/async: cleanup dead connection and misc things (`pr#7158 <http://github.com/ceph/ceph/pull/7158>`_, Haomai Wang)
+* msg/async: don't use shared_ptr to manage EventCallback (`pr#7028 <http://github.com/ceph/ceph/pull/7028>`_, Haomai Wang)
+* msg: filter out lo addr when bind osd addr (`pr#7012 <http://github.com/ceph/ceph/pull/7012>`_, Ji Chen)
+* msg: removed unneeded includes from Dispatcher (`pr#6814 <http://github.com/ceph/ceph/pull/6814>`_, Michal Jarzabek)
+* msg: remove unneeded inline (`pr#6989 <http://github.com/ceph/ceph/pull/6989>`_, Michal Jarzabek)
+* msgr:  fix large message data content length causing overflow (`pr#6809 <http://github.com/ceph/ceph/pull/6809>`_, Jun Huang, Haomai Wang)
+* msg/simple: pipe: memory leak when signature check failed (`pr#7096 <http://github.com/ceph/ceph/pull/7096>`_, Ruifeng Yang)
+* msg/simple: remove unneeded friend declarations (`pr#6924 <http://github.com/ceph/ceph/pull/6924>`_, Michal Jarzabek)
+* objecter: avoid recursive lock of Objecter::rwlock (`pr#7343 <http://github.com/ceph/ceph/pull/7343>`_, Yan, Zheng)
+* os/bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7419 <http://github.com/ceph/ceph/pull/7419>`_, Kefu Chai, Brad Hubbard)
+* osd: add cache hint when pushing raw clone during recovery (`pr#7069 <http://github.com/ceph/ceph/pull/7069>`_, Zhiqiang Wang)
+* osd: avoid debug std::string initialization in PG::get/put (`pr#7117 <http://github.com/ceph/ceph/pull/7117>`_, Evgeniy Firsov)
+* osd: avoid osd_op_thread suicide because osd_scrub_sleep (`pr#7009 <http://github.com/ceph/ceph/pull/7009>`_, Jianpeng Ma)
+* osd: bluestore: bluefs: fix several small bugs (`issue#14344 <http://tracker.ceph.com/issues/14344>`_, `issue#14343 <http://tracker.ceph.com/issues/14343>`_, `pr#7200 <http://github.com/ceph/ceph/pull/7200>`_, xie xingguo)
+* osd: bluestore: don't include when building without libaio (`issue#14207 <http://tracker.ceph.com/issues/14207>`_, `pr#7169 <http://github.com/ceph/ceph/pull/7169>`_, Mykola Golub)
+* osd: bluestore: fix bluestore onode_t attr leak (`pr#7125 <http://github.com/ceph/ceph/pull/7125>`_, Ning Yao)
+* osd: bluestore: fix bluestore_wal_transaction_t encoding test (`pr#7168 <http://github.com/ceph/ceph/pull/7168>`_, Kefu Chai)
+* osd: bluestore: fix several bugs (`issue#14259 <http://tracker.ceph.com/issues/14259>`_, `issue#14353 <http://tracker.ceph.com/issues/14353>`_, `issue#14260 <http://tracker.ceph.com/issues/14260>`_, `issue#14261 <http://tracker.ceph.com/issues/14261>`_, `pr#7122 <http://github.com/ceph/ceph/pull/7122>`_, xie xingguo)
+* osd: bluestore: fix space rebalancing, collection split, buffered reads (`pr#7196 <http://github.com/ceph/ceph/pull/7196>`_, Sage Weil)
+* osd: bluestore: more fixes (`pr#7130 <http://github.com/ceph/ceph/pull/7130>`_, Sage Weil)
+* osd: cache tier: add config option for eviction check list size (`pr#6997 <http://github.com/ceph/ceph/pull/6997>`_, Yuan Zhou)
+* osdc: Fix race condition with tick_event and shutdown (`issue#14256 <http://tracker.ceph.com/issues/14256>`_, `pr#7151 <http://github.com/ceph/ceph/pull/7151>`_, Adam C. Emerson)
+* osd: check health state before pre_booting (`issue#14181 <http://tracker.ceph.com/issues/14181>`_, `pr#7053 <http://github.com/ceph/ceph/pull/7053>`_, Xiaoxi Chen)
+* osd: clear pg_stat_queue after stopping pgs (`issue#14212 <http://tracker.ceph.com/issues/14212>`_, `pr#7091 <http://github.com/ceph/ceph/pull/7091>`_, Sage Weil)
+* osd: delay populating in-memory PG log hashmaps (`pr#6425 <http://github.com/ceph/ceph/pull/6425>`_, Piotr Dałek)
+* osd: disable filestore_xfs_extsize by default (`issue#14397 <http://tracker.ceph.com/issues/14397>`_, `pr#7265 <http://github.com/ceph/ceph/pull/7265>`_, Ken Dreyer)
+* osd: do not keep ref of old osdmap in pg (`issue#13990 <http://tracker.ceph.com/issues/13990>`_, `pr#7007 <http://github.com/ceph/ceph/pull/7007>`_, Kefu Chai)
+* osd: drop deprecated removal pg type (`pr#6970 <http://github.com/ceph/ceph/pull/6970>`_, Igor Podoski)
+* osd: FileJournal: fix return code of create method (`issue#14134 <http://tracker.ceph.com/issues/14134>`_, `pr#6988 <http://github.com/ceph/ceph/pull/6988>`_, xie xingguo)
+* osd: FileJournal: support batch peak and pop from writeq (`pr#6701 <http://github.com/ceph/ceph/pull/6701>`_, Xinze Chi)
+* osd: FileStore: conditional collection of drive metadata (`pr#6956 <http://github.com/ceph/ceph/pull/6956>`_, Somnath Roy)
+* osd: FileStore:: optimize lfn_unlink (`pr#6649 <http://github.com/ceph/ceph/pull/6649>`_, Jianpeng Ma)
+* osd: fix null pointer access and race condition (`issue#14072 <http://tracker.ceph.com/issues/14072>`_, `pr#6916 <http://github.com/ceph/ceph/pull/6916>`_, xie xingguo)
+* osd: fix scrub start hobject (`pr#7467 <http://github.com/ceph/ceph/pull/7467>`_, Sage Weil)
+* osd: fix sparse-read result code checking logic (`issue#14151 <http://tracker.ceph.com/issues/14151>`_, `pr#7016 <http://github.com/ceph/ceph/pull/7016>`_, xie xingguo)
+* osd: fix temp object removal after upgrade (`issue#13862 <http://tracker.ceph.com/issues/13862>`_, `pr#6976 <http://github.com/ceph/ceph/pull/6976>`_, David Zafman)
+* osd: fix wip (l_osd_op_wip) perf counter and remove repop_map (`pr#7077 <http://github.com/ceph/ceph/pull/7077>`_, Xinze Chi)
+* osd: fix wrongly placed assert and some cleanups (`pr#6766 <http://github.com/ceph/ceph/pull/6766>`_, xiexingguo, xie xingguo)
+* osd: KeyValueStore: fix return code of mkfs (`pr#7036 <http://github.com/ceph/ceph/pull/7036>`_, xie xingguo)
+* osd: KeyValueStore: fix wrongly placed assert (`issue#14176 <http://tracker.ceph.com/issues/14176>`_, `issue#14178 <http://tracker.ceph.com/issues/14178>`_, `pr#7047 <http://github.com/ceph/ceph/pull/7047>`_, xie xingguo)
+* osd: kstore: several small fixes (`issue#14351 <http://tracker.ceph.com/issues/14351>`_, `issue#14352 <http://tracker.ceph.com/issues/14352>`_, `pr#7213 <http://github.com/ceph/ceph/pull/7213>`_, xie xingguo)
+* osd: kstore: small fixes to kstore (`issue#14204 <http://tracker.ceph.com/issues/14204>`_, `pr#7095 <http://github.com/ceph/ceph/pull/7095>`_, xie xingguo)
+* osd: make list_missing query missing_loc.needs_recovery_map (`pr#6298 <http://github.com/ceph/ceph/pull/6298>`_, Guang Yang)
+* osdmap: remove unused local variables (`pr#6864 <http://github.com/ceph/ceph/pull/6864>`_, luo kexue)
+* osd: memstore: fix two bugs (`pr#6963 <http://github.com/ceph/ceph/pull/6963>`_, Casey Bodley, Sage Weil)
+* osd: misc FileStore fixes (`issue#14192 <http://tracker.ceph.com/issues/14192>`_, `issue#14188 <http://tracker.ceph.com/issues/14188>`_, `issue#14194 <http://tracker.ceph.com/issues/14194>`_, `issue#14187 <http://tracker.ceph.com/issues/14187>`_, `issue#14186 <http://tracker.ceph.com/issues/14186>`_, `pr#7059 <http://github.com/ceph/ceph/pull/7059>`_, xie xingguo)
+* osd: misc optimization for map utilization (`pr#6950 <http://github.com/ceph/ceph/pull/6950>`_, Ning Yao)
+* osd,mon: log leveldb and rocksdb to ceph log (`pr#6921 <http://github.com/ceph/ceph/pull/6921>`_, Sage Weil)
+* osd: Omap small bugs adapted (`pr#6669 <http://github.com/ceph/ceph/pull/6669>`_, Jianpeng Ma, David Zafman)
+* osd: optimize the session_handle_reset function (`issue#14182 <http://tracker.ceph.com/issues/14182>`_, `pr#7054 <http://github.com/ceph/ceph/pull/7054>`_, songbaisen)
+* osd: OSDService: Fix typo in osdmap comment (`pr#7275 <http://github.com/ceph/ceph/pull/7275>`_, Brad Hubbard)
+* osd: os: skip checking pg_meta object existance in FileStore (`pr#6870 <http://github.com/ceph/ceph/pull/6870>`_, Ning Yao)
+* osd: PGLog: clean up read_log (`pr#7092 <http://github.com/ceph/ceph/pull/7092>`_, Jie Wang)
+* osd: prevent osd_recovery_sleep from causing recovery-thread suicide (`pr#7065 <http://github.com/ceph/ceph/pull/7065>`_, Jianpeng Ma)
+* osd: reduce string use in coll_t::calc_str() (`pr#6505 <http://github.com/ceph/ceph/pull/6505>`_, Igor Podoski)
+* osd: release related sources when scrub is interrupted (`pr#6744 <http://github.com/ceph/ceph/pull/6744>`_, Jianpeng Ma)
+* osd: remove unused OSDMap::set_weightf() (`issue#14369 <http://tracker.ceph.com/issues/14369>`_, `pr#7231 <http://github.com/ceph/ceph/pull/7231>`_, huanwen ren)
+* osd: ReplicatedPG: clean up unused function (`pr#7211 <http://github.com/ceph/ceph/pull/7211>`_, Xiaowei Chen)
+* osd/ReplicatedPG: fix promotion recency logic (`issue#14320 <http://tracker.ceph.com/issues/14320>`_, `pr#6702 <http://github.com/ceph/ceph/pull/6702>`_, Sage Weil)
+* osd: several small cleanups (`pr#7055 <http://github.com/ceph/ceph/pull/7055>`_, xie xingguo)
+* osd: shut down if we flap too many times in a short period (`pr#6708 <http://github.com/ceph/ceph/pull/6708>`_, Xiaoxi Chen)
+* osd: skip promote for writefull w/ FADVISE_DONTNEED/NOCACHE (`pr#7010 <http://github.com/ceph/ceph/pull/7010>`_, Jianpeng Ma)
+* osd: small fixes to memstore (`issue#14228 <http://tracker.ceph.com/issues/14228>`_, `issue#14229 <http://tracker.ceph.com/issues/14229>`_, `issue#14227 <http://tracker.ceph.com/issues/14227>`_, `pr#7107 <http://github.com/ceph/ceph/pull/7107>`_, xie xingguo)
+* osd: try evicting after flushing is done (`pr#5630 <http://github.com/ceph/ceph/pull/5630>`_, Zhiqiang Wang)
+* osd: use atomic to generate ceph_tid (`pr#7017 <http://github.com/ceph/ceph/pull/7017>`_, Evgeniy Firsov)
+* osd: use optimized is_zero in object_stat_sum_t.is_zero() (`pr#7203 <http://github.com/ceph/ceph/pull/7203>`_, Piotr Dałek)
+* osd: utime_t, eversion_t, osd_stat_sum_t encoding optimization (`pr#6902 <http://github.com/ceph/ceph/pull/6902>`_, Xinze Chi)
+* pybind: add ceph_volume_client interface for Manila and similar frameworks (`pr#6205 <http://github.com/ceph/ceph/pull/6205>`_, John Spray)
+* pybind: fix build failure, remove extraneous semicolon in method (`issue#14371 <http://tracker.ceph.com/issues/14371>`_, `pr#7235 <http://github.com/ceph/ceph/pull/7235>`_, Abhishek Lekshmanan)
+* pybind/test_rbd: fix test_create_defaults (`issue#14279 <http://tracker.ceph.com/issues/14279>`_, `pr#7155 <http://github.com/ceph/ceph/pull/7155>`_, Josh Durgin)
+* qa: disable rbd/qemu-iotests test case 055 on RHEL/CentOSlibrbd: journal replay should honor inter-event dependencies (`issue#14385 <http://tracker.ceph.com/issues/14385>`_, `pr#7272 <http://github.com/ceph/ceph/pull/7272>`_, Jason Dillaman)
+* qa/workunits: merge_diff shouldn't attempt to use striping (`issue#14165 <http://tracker.ceph.com/issues/14165>`_, `pr#7041 <http://github.com/ceph/ceph/pull/7041>`_, Jason Dillaman)
+* qa/workunits/snaps: move snap tests into fs sub-directory (`pr#6496 <http://github.com/ceph/ceph/pull/6496>`_, Yan, Zheng)
+* rados: implement rm --force option to force remove when full (`pr#6202 <http://github.com/ceph/ceph/pull/6202>`_, Xiaowei Chen)
+* rbd: additional validation for striping parameters (`pr#6914 <http://github.com/ceph/ceph/pull/6914>`_, Na Xie)
+* rbd: add pool name to disambiguate rbd admin socket commands (`pr#6904 <http://github.com/ceph/ceph/pull/6904>`_, wuxiangwei)
+* rbd: correct an output string for merge-diff (`pr#7046 <http://github.com/ceph/ceph/pull/7046>`_, Kongming Wu)
+* rbd: fix static initialization ordering issues (`pr#6978 <http://github.com/ceph/ceph/pull/6978>`_, Mykola Golub)
+* rbd-fuse: image name can not include snap name (`pr#7044 <http://github.com/ceph/ceph/pull/7044>`_, Yongqiang He)
+* rbd-fuse: implement mv operation (`pr#6938 <http://github.com/ceph/ceph/pull/6938>`_, wuxiangwei)
+* rbd: must specify both of stripe-unit and stripe-count when specifying stripingv2 feature (`pr#7026 <http://github.com/ceph/ceph/pull/7026>`_, Donghai Xu)
+* rbd-nbd: add copyright (`pr#7166 <http://github.com/ceph/ceph/pull/7166>`_, Li Wang)
+* rbd-nbd: fix up return code handling (`pr#7215 <http://github.com/ceph/ceph/pull/7215>`_, Mykola Golub)
+* rbd-nbd: small improvements in logging and forking (`pr#7127 <http://github.com/ceph/ceph/pull/7127>`_, Mykola Golub)
+* rbd: rbd order will be place in 22, when set to 0 in the config_opt (`issue#14139 <http://tracker.ceph.com/issues/14139>`_, `issue#14047 <http://tracker.ceph.com/issues/14047>`_, `pr#6886 <http://github.com/ceph/ceph/pull/6886>`_, huanwen ren)
+* rbd: striping parameters should support 64bit integers (`pr#6942 <http://github.com/ceph/ceph/pull/6942>`_, Na Xie)
+* rbd: use default order from configuration when not specified (`pr#6965 <http://github.com/ceph/ceph/pull/6965>`_, Yunchuan Wen)
+* rgw: add a method to purge all associate keys when removing a subuser (`issue#12890 <http://tracker.ceph.com/issues/12890>`_, `pr#6002 <http://github.com/ceph/ceph/pull/6002>`_, Sangdi Xu)
+* rgw: add missing error code for admin op API (`pr#7037 <http://github.com/ceph/ceph/pull/7037>`_, Dunrong Huang)
+* rgw: add support for "end_marker" parameter for GET on Swift account. (`issue#10682 <http://tracker.ceph.com/issues/10682>`_, `pr#4216 <http://github.com/ceph/ceph/pull/4216>`_, Radoslaw Zarzynski)
+* rgw_admin: orphans finish segfaults (`pr#6652 <http://github.com/ceph/ceph/pull/6652>`_, Igor Fedotov)
+* rgw: content length (`issue#13582 <http://tracker.ceph.com/issues/13582>`_, `pr#6975 <http://github.com/ceph/ceph/pull/6975>`_, Yehuda Sadeh)
+* rgw: delete default zone (`pr#7005 <http://github.com/ceph/ceph/pull/7005>`_, YankunLi)
+* rgw: do not abort radowgw server when using admin op API with bad parameters  (`issue#14190 <http://tracker.ceph.com/issues/14190>`_, `issue#14191 <http://tracker.ceph.com/issues/14191>`_, `pr#7063 <http://github.com/ceph/ceph/pull/7063>`_, Dunrong Huang)
+* rgw: Drop a debugging message (`pr#7280 <http://github.com/ceph/ceph/pull/7280>`_, Pete Zaitcev)
+* rgw: fix a typo in init-radosgw (`pr#6817 <http://github.com/ceph/ceph/pull/6817>`_, Zhi Zhang)
+* rgw: fix compilation warning (`pr#7160 <http://github.com/ceph/ceph/pull/7160>`_, Yehuda Sadeh)
+* rgw: fix wrong check for parse() return (`pr#6797 <http://github.com/ceph/ceph/pull/6797>`_, Dunrong Huang)
+* rgw: let radosgw-admin bucket stats return a standard josn (`pr#7029 <http://github.com/ceph/ceph/pull/7029>`_, Ruifeng Yang)
+* rgw: modify command stucking when operating radosgw-admin metadata list user (`pr#7032 <http://github.com/ceph/ceph/pull/7032>`_, Peiyang Liu)
+* rgw: modify documents and help infos' descriptions to the usage of option date when executing command "log show" (`pr#6080 <http://github.com/ceph/ceph/pull/6080>`_, Kongming Wu)
+* rgw: Parse --subuser better (`pr#7279 <http://github.com/ceph/ceph/pull/7279>`_, Pete Zaitcev)
+* rgw: radosgw-admin bucket check --fix not work (`pr#7093 <http://github.com/ceph/ceph/pull/7093>`_, Weijun Duan)
+* rgw: warn on suspicious civetweb frontend parameters (`pr#6944 <http://github.com/ceph/ceph/pull/6944>`_, Matt Benjamin)
+* rocksdb: remove rdb sources from dist tarball (`issue#13554 <http://tracker.ceph.com/issues/13554>`_, `pr#7105 <http://github.com/ceph/ceph/pull/7105>`_, Venky Shankar)
+* stringify outputted error code and fix unmatched parentheses. (`pr#6998 <http://github.com/ceph/ceph/pull/6998>`_, xie.xingguo, xie xingguo)
+* test/librbd/fsx: Use c++11 std::mt19937 generator instead of random_r() (`pr#6332 <http://github.com/ceph/ceph/pull/6332>`_, John Coyle)
+* test/mon/osd-erasure-code-profile: pick new mon port (`pr#7161 <http://github.com/ceph/ceph/pull/7161>`_, Sage Weil)
+* tests: add const for ec test (`pr#6911 <http://github.com/ceph/ceph/pull/6911>`_, Michal Jarzabek)
+* tests: configure with rocksdb by default (`issue#14220 <http://tracker.ceph.com/issues/14220>`_, `pr#7100 <http://github.com/ceph/ceph/pull/7100>`_, Loic Dachary)
+* tests: Fix for make check. (`pr#7102 <http://github.com/ceph/ceph/pull/7102>`_, David Zafman)
+* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7220 <http://github.com/ceph/ceph/pull/7220>`_, Jason Dillaman)
+* tests: snap rename and rebuild object map in client update test (`pr#7224 <http://github.com/ceph/ceph/pull/7224>`_, Jason Dillaman)
+* tests: unittest_bufferlist: fix hexdump test (`pr#7152 <http://github.com/ceph/ceph/pull/7152>`_, Sage Weil)
+* tests: unittest_ipaddr: fix segv (`pr#7154 <http://github.com/ceph/ceph/pull/7154>`_, Sage Weil)
+* tools: ceph_monstore_tool: add inflate-pgmap command (`issue#14217 <http://tracker.ceph.com/issues/14217>`_, `pr#7097 <http://github.com/ceph/ceph/pull/7097>`_, Kefu Chai)
+* tools: monstore: add 'show-versions' command. (`pr#7073 <http://github.com/ceph/ceph/pull/7073>`_, Cilang Zhao)
+
+v10.0.2
+=======
+
+This development release includes a raft of changes and improvements
+for Jewel.  Key additions include CephFS scrub/repair improvements, an
+AIX and Solaris port of librados, many librbd journaling additions and
+fixes, extended per-pool options, and NBD driver for RBD (rbd-nbd)
+that allows librbd to present a kernel-level block device on Linux,
+multitenancy support for RGW, RGW bucket lifecycle support, RGW
+support for Swift static large objects (SLO), and RGW support for
+Swift bulk delete.
+
+There are also lots of smaller optimizations and performance fixes
+going in all over the tree, particular in the OSD and common code.
+
+Notable Changes
+---------------
+
+* auth: fail if rotating key is missing (do not spam log) (`pr#6473 <http://github.com/ceph/ceph/pull/6473>`_, Qiankun Zheng)
+* auth: fix crash when bad keyring is passed (`pr#6698 <http://github.com/ceph/ceph/pull/6698>`_, Dunrong Huang)
+* auth: make keyring without mon entity type return -EACCES (`pr#5734 <http://github.com/ceph/ceph/pull/5734>`_, Xiaowei Chen)
+* buffer: make usable outside of ceph source again (`pr#6863 <http://github.com/ceph/ceph/pull/6863>`_, Josh Durgin)
+* build: cmake check fixes (`pr#6787 <http://github.com/ceph/ceph/pull/6787>`_, Orit Wasserman)
+* build: fix bz2-dev dependency (`pr#6948 <http://github.com/ceph/ceph/pull/6948>`_, Samuel Just)
+* build: Gentoo: _FORTIFY_SOURCE fix. (`issue#13920 <http://tracker.ceph.com/issues/13920>`_, `pr#6739 <http://github.com/ceph/ceph/pull/6739>`_, Robin H. Johnson)
+* build/ops: systemd ceph-disk unit must not assume /bin/flock (`issue#13975 <http://tracker.ceph.com/issues/13975>`_, `pr#6803 <http://github.com/ceph/ceph/pull/6803>`_, Loic Dachary)
+* ceph-detect-init: Ubuntu >= 15.04 uses systemd (`pr#6873 <http://github.com/ceph/ceph/pull/6873>`_, James Page)
+* cephfs-data-scan: scan_frags (`pr#5941 <http://github.com/ceph/ceph/pull/5941>`_, John Spray)
+* cephfs-data-scan: scrub tag filtering (#12133 and #12145) (`issue#12133 <http://tracker.ceph.com/issues/12133>`_, `issue#12145 <http://tracker.ceph.com/issues/12145>`_, `pr#5685 <http://github.com/ceph/ceph/pull/5685>`_, John Spray)
+* ceph-fuse: add process to ceph-fuse --help (`pr#6821 <http://github.com/ceph/ceph/pull/6821>`_, Wei Feng)
+* ceph-kvstore-tool: handle bad out file on command line (`pr#6093 <http://github.com/ceph/ceph/pull/6093>`_, Kefu Chai)
+* ceph-mds:add --help/-h (`pr#6850 <http://github.com/ceph/ceph/pull/6850>`_, Cilang Zhao)
+* ceph_objectstore_bench: fix race condition, bugs (`issue#13516 <http://tracker.ceph.com/issues/13516>`_, `pr#6681 <http://github.com/ceph/ceph/pull/6681>`_, Igor Fedotov)
+* ceph.spec.in: add BuildRequires: systemd (`issue#13860 <http://tracker.ceph.com/issues/13860>`_, `pr#6692 <http://github.com/ceph/ceph/pull/6692>`_, Nathan Cutler)
+* client: a better check for MDS availability (`pr#6253 <http://github.com/ceph/ceph/pull/6253>`_, John Spray)
+* client: close mds sessions in shutdown() (`pr#6269 <http://github.com/ceph/ceph/pull/6269>`_, John Spray)
+* client: don't invalidate page cache when inode is no longer used (`pr#6380 <http://github.com/ceph/ceph/pull/6380>`_, Yan, Zheng)
+* client: modify a word in log (`pr#6906 <http://github.com/ceph/ceph/pull/6906>`_, YongQiang He)
+* cls/cls_rbd.cc: fix misused metadata_name_from_key (`issue#13922 <http://tracker.ceph.com/issues/13922>`_, `pr#6661 <http://github.com/ceph/ceph/pull/6661>`_, Xiaoxi Chen)
+* cmake: Add common/PluginRegistry.cc to CMakeLists.txt (`pr#6805 <http://github.com/ceph/ceph/pull/6805>`_, Pete Zaitcev)
+* cmake: add rgw_basic_types.cc to librgw.a (`pr#6786 <http://github.com/ceph/ceph/pull/6786>`_, Orit Wasserman)
+* cmake: add TracepointProvider.cc to libcommon (`pr#6823 <http://github.com/ceph/ceph/pull/6823>`_, Orit Wasserman)
+* cmake: define STRERROR_R_CHAR_P for GNU-specific strerror_r (`pr#6751 <http://github.com/ceph/ceph/pull/6751>`_, Ilya Dryomov)
+* cmake: update for recent librbd changes (`pr#6715 <http://github.com/ceph/ceph/pull/6715>`_, John Spray)
+* cmake: update for recent rbd changes (`pr#6818 <http://github.com/ceph/ceph/pull/6818>`_, Mykola Golub)
+* common: add generic plugin infrastructure (`pr#6696 <http://github.com/ceph/ceph/pull/6696>`_, Sage Weil)
+* common: add latency perf counter for finisher (`pr#6175 <http://github.com/ceph/ceph/pull/6175>`_, Xinze Chi)
+* common: buffer: add cached_crc and cached_crc_adjust counts to perf dump (`pr#6535 <http://github.com/ceph/ceph/pull/6535>`_, Ning Yao)
+* common: buffer: remove unneeded list destructor (`pr#6456 <http://github.com/ceph/ceph/pull/6456>`_, Michal Jarzabek)
+* common/ceph_context.cc:fix order of initialisers (`pr#6838 <http://github.com/ceph/ceph/pull/6838>`_, Michal Jarzabek)
+* common: don't reverse hobject_t hash bits when zero (`pr#6653 <http://github.com/ceph/ceph/pull/6653>`_, Piotr Dałek)
+* common: log: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6815 <http://github.com/ceph/ceph/pull/6815>`_, Brad Hubbard)
+* common: log: predict log message buffer allocation size (`pr#6641 <http://github.com/ceph/ceph/pull/6641>`_, Adam Kupczyk)
+* common: optimize debug logging code (`pr#6441 <http://github.com/ceph/ceph/pull/6441>`_, Adam Kupczyk)
+* common: perf counter for bufferlist history total alloc (`pr#6198 <http://github.com/ceph/ceph/pull/6198>`_, Xinze Chi)
+* common: reduce CPU usage by making stringstream in stringify function thread local (`pr#6543 <http://github.com/ceph/ceph/pull/6543>`_, Evgeniy Firsov)
+* common: re-enable backtrace support (`pr#6771 <http://github.com/ceph/ceph/pull/6771>`_, Jason Dillaman)
+* common: SubProcess: fix multiple definition bug (`pr#6790 <http://github.com/ceph/ceph/pull/6790>`_, Yunchuan Wen)
+* common: use namespace instead of subclasses for buffer (`pr#6686 <http://github.com/ceph/ceph/pull/6686>`_, Michal Jarzabek)
+* configure.ac: macro fix (`pr#6769 <http://github.com/ceph/ceph/pull/6769>`_, Igor Podoski)
+* doc: admin/build-doc: add lxml dependencies on debian (`pr#6610 <http://github.com/ceph/ceph/pull/6610>`_, Ken Dreyer)
+* doc/cephfs/posix: update (`pr#6922 <http://github.com/ceph/ceph/pull/6922>`_, Sage Weil)
+* doc: CodingStyle: fix broken URLs (`pr#6733 <http://github.com/ceph/ceph/pull/6733>`_, Kefu Chai)
+* doc: correct typo 'restared' to 'restarted' (`pr#6734 <http://github.com/ceph/ceph/pull/6734>`_, Yilong Zhao)
+* doc/dev/index: refactor/reorg (`pr#6792 <http://github.com/ceph/ceph/pull/6792>`_, Nathan Cutler)
+* doc/dev/index.rst: begin writing Contributing to Ceph (`pr#6727 <http://github.com/ceph/ceph/pull/6727>`_, Nathan Cutler)
+* doc/dev/index.rst: fix headings (`pr#6780 <http://github.com/ceph/ceph/pull/6780>`_, Nathan Cutler)
+* doc: dev: introduction to tests (`pr#6910 <http://github.com/ceph/ceph/pull/6910>`_, Loic Dachary)
+* doc: file must be empty when writing layout fields of file use "setfattr" (`pr#6848 <http://github.com/ceph/ceph/pull/6848>`_, Cilang Zhao)
+* doc: Fixed incorrect name of a "List Multipart Upload Parts" Response Entity (`issue#14003 <http://tracker.ceph.com/issues/14003>`_, `pr#6829 <http://github.com/ceph/ceph/pull/6829>`_, Lenz Grimmer)
+* doc: Fixes a spelling error (`pr#6705 <http://github.com/ceph/ceph/pull/6705>`_, Jeremy Qian)
+* doc: fix typo in cephfs/quota (`pr#6745 <http://github.com/ceph/ceph/pull/6745>`_, Drunkard Zhang)
+* doc: fix typo in developer guide (`pr#6943 <http://github.com/ceph/ceph/pull/6943>`_, Nathan Cutler)
+* doc: INSTALL redirect to online documentation (`pr#6749 <http://github.com/ceph/ceph/pull/6749>`_, Loic Dachary)
+* doc: little improvements for troubleshooting scrub issues (`pr#6827 <http://github.com/ceph/ceph/pull/6827>`_, Mykola Golub)
+* doc: Modified a note section in rbd-snapshot doc. (`pr#6908 <http://github.com/ceph/ceph/pull/6908>`_, Nilamdyuti Goswami)
+* doc: note that cephfs auth stuff is new in jewel (`pr#6858 <http://github.com/ceph/ceph/pull/6858>`_, John Spray)
+* doc: osd: s/schedued/scheduled/ (`pr#6872 <http://github.com/ceph/ceph/pull/6872>`_, Loic Dachary)
+* doc: remove unnecessary period in headline (`pr#6775 <http://github.com/ceph/ceph/pull/6775>`_, Marc Koderer)
+* doc: rst style fix for pools document (`pr#6816 <http://github.com/ceph/ceph/pull/6816>`_, Drunkard Zhang)
+* doc: Update list of admin/build-doc dependencies (`issue#14070 <http://tracker.ceph.com/issues/14070>`_, `pr#6934 <http://github.com/ceph/ceph/pull/6934>`_, Nathan Cutler)
+* init-ceph: do umount when the path exists. (`pr#6866 <http://github.com/ceph/ceph/pull/6866>`_, Xiaoxi Chen)
+* journal: disconnect watch after watch error (`issue#14168 <http://tracker.ceph.com/issues/14168>`_, `pr#7113 <http://github.com/ceph/ceph/pull/7113>`_, Jason Dillaman)
+* journal: fire replay complete event after reading last object (`issue#13924 <http://tracker.ceph.com/issues/13924>`_, `pr#6762 <http://github.com/ceph/ceph/pull/6762>`_, Jason Dillaman)
+* journal: support replaying beyond skipped splay objects (`pr#6687 <http://github.com/ceph/ceph/pull/6687>`_, Jason Dillaman)
+* librados: aix gcc librados port (`pr#6675 <http://github.com/ceph/ceph/pull/6675>`_, Rohan Mars)
+* librados: avoid malloc(0) (which can return NULL on some platforms) (`issue#13944 <http://tracker.ceph.com/issues/13944>`_, `pr#6779 <http://github.com/ceph/ceph/pull/6779>`_, Dan Mick)
+* librados: clean up Objecter.h (`pr#6731 <http://github.com/ceph/ceph/pull/6731>`_, Jie Wang)
+* librados: include/rados/librados.h: fix typo (`pr#6741 <http://github.com/ceph/ceph/pull/6741>`_, Nathan Cutler)
+* librbd: automatically flush IO after blocking write operations (`issue#13913 <http://tracker.ceph.com/issues/13913>`_, `pr#6742 <http://github.com/ceph/ceph/pull/6742>`_, Jason Dillaman)
+* librbd: better handling of exclusive lock transition period (`pr#7204 <http://github.com/ceph/ceph/pull/7204>`_, Jason Dillaman)
+* librbd: check for presence of journal before attempting to remove  (`issue#13912 <http://tracker.ceph.com/issues/13912>`_, `pr#6737 <http://github.com/ceph/ceph/pull/6737>`_, Jason Dillaman)
+* librbd: clear error when older OSD doesn't support image flags (`issue#14122 <http://tracker.ceph.com/issues/14122>`_, `pr#7035 <http://github.com/ceph/ceph/pull/7035>`_, Jason Dillaman)
+* librbd: correct include guard in RenameRequest.h (`pr#7143 <http://github.com/ceph/ceph/pull/7143>`_, Jason Dillaman)
+* librbd: correct issues discovered during teuthology testing (`issue#14108 <http://tracker.ceph.com/issues/14108>`_, `issue#14107 <http://tracker.ceph.com/issues/14107>`_, `pr#6974 <http://github.com/ceph/ceph/pull/6974>`_, Jason Dillaman)
+* librbd: correct issues discovered when cache is disabled (`issue#14123 <http://tracker.ceph.com/issues/14123>`_, `pr#6979 <http://github.com/ceph/ceph/pull/6979>`_, Jason Dillaman)
+* librbd: correct race conditions discovered during unit testing (`issue#14060 <http://tracker.ceph.com/issues/14060>`_, `pr#6923 <http://github.com/ceph/ceph/pull/6923>`_, Jason Dillaman)
+* librbd: disable copy-on-read when not exclusive lock owner (`issue#14167 <http://tracker.ceph.com/issues/14167>`_, `pr#7129 <http://github.com/ceph/ceph/pull/7129>`_, Jason Dillaman)
+* librbd: do not ignore self-managed snapshot release result (`issue#14170 <http://tracker.ceph.com/issues/14170>`_, `pr#7043 <http://github.com/ceph/ceph/pull/7043>`_, Jason Dillaman)
+* librbd: ensure copy-on-read requests are complete prior to closing parent image  (`pr#6740 <http://github.com/ceph/ceph/pull/6740>`_, Jason Dillaman)
+* librbd: ensure librados callbacks are flushed prior to destroying (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `pr#7040 <http://github.com/ceph/ceph/pull/7040>`_, Jason Dillaman)
+* librbd: fix journal iohint (`pr#6917 <http://github.com/ceph/ceph/pull/6917>`_, Jianpeng Ma)
+* librbd: fix known test case race condition failures (`issue#13969 <http://tracker.ceph.com/issues/13969>`_, `pr#6800 <http://github.com/ceph/ceph/pull/6800>`_, Jason Dillaman)
+* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6889 <http://github.com/ceph/ceph/pull/6889>`_, Yunchuan Wen)
+* librbd: fix test case race condition for journaling ops (`pr#6877 <http://github.com/ceph/ceph/pull/6877>`_, Jason Dillaman)
+* librbd: fix tracepoint parameter in diff_iterate (`pr#6892 <http://github.com/ceph/ceph/pull/6892>`_, Yunchuan Wen)
+* librbd: image refresh code paths converted to async state machines (`pr#6859 <http://github.com/ceph/ceph/pull/6859>`_, Jason Dillaman)
+* librbd: include missing header for bool type (`pr#6798 <http://github.com/ceph/ceph/pull/6798>`_, Mykola Golub)
+* librbd: initial collection of state machine unit tests (`pr#6703 <http://github.com/ceph/ceph/pull/6703>`_, Jason Dillaman)
+* librbd: integrate journaling for maintenance operations (`pr#6625 <http://github.com/ceph/ceph/pull/6625>`_, Jason Dillaman)
+* librbd: journaling-related lock dependency cleanup (`pr#6777 <http://github.com/ceph/ceph/pull/6777>`_, Jason Dillaman)
+* librbd: not necessary to hold owner_lock while releasing snap id (`issue#13914 <http://tracker.ceph.com/issues/13914>`_, `pr#6736 <http://github.com/ceph/ceph/pull/6736>`_, Jason Dillaman)
+* librbd: only send signal when AIO completions queue empty (`pr#6729 <http://github.com/ceph/ceph/pull/6729>`_, Jianpeng Ma)
+* librbd: optionally validate new RBD pools for snapshot support (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#6925 <http://github.com/ceph/ceph/pull/6925>`_, Jason Dillaman)
+* librbd: partial revert of commit 9b0e359 (`issue#13969 <http://tracker.ceph.com/issues/13969>`_, `pr#6789 <http://github.com/ceph/ceph/pull/6789>`_, Jason Dillaman)
+* librbd: properly handle replay of snap remove RPC message (`issue#14164 <http://tracker.ceph.com/issues/14164>`_, `pr#7042 <http://github.com/ceph/ceph/pull/7042>`_, Jason Dillaman)
+* librbd: reduce verbosity of common error condition logging (`issue#14234 <http://tracker.ceph.com/issues/14234>`_, `pr#7114 <http://github.com/ceph/ceph/pull/7114>`_, Jason Dillaman)
+* librbd: simplify IO method signatures for 32bit environments (`pr#6700 <http://github.com/ceph/ceph/pull/6700>`_, Jason Dillaman)
+* librbd: support eventfd for AIO completion notifications (`pr#5465 <http://github.com/ceph/ceph/pull/5465>`_, Haomai Wang)
+* mailmap: add UMCloud affiliation (`pr#6820 <http://github.com/ceph/ceph/pull/6820>`_, Jiaying Ren)
+* mailmap: Jewel updates (`pr#6750 <http://github.com/ceph/ceph/pull/6750>`_, Abhishek Lekshmanan)
+* makefiles: remove bz2-dev from dependencies (`issue#13981 <http://tracker.ceph.com/issues/13981>`_, `pr#6939 <http://github.com/ceph/ceph/pull/6939>`_, Piotr Dałek)
+* mds: add 'p' flag in auth caps to control setting pool in layout (`pr#6567 <http://github.com/ceph/ceph/pull/6567>`_, John Spray)
+* mds: fix client capabilities during reconnect (client.XXXX isn't responding to mclientcaps(revoke)) (`issue#11482 <http://tracker.ceph.com/issues/11482>`_, `pr#6432 <http://github.com/ceph/ceph/pull/6432>`_, Yan, Zheng)
+* mds: fix setvxattr (broken in a536d114) (`issue#14029 <http://tracker.ceph.com/issues/14029>`_, `pr#6941 <http://github.com/ceph/ceph/pull/6941>`_, John Spray)
+* mds: repair the command option "--hot-standby" (`pr#6454 <http://github.com/ceph/ceph/pull/6454>`_, Wei Feng)
+* mds: tear down connections from `tell` commands (`issue#14048 <http://tracker.ceph.com/issues/14048>`_, `pr#6933 <http://github.com/ceph/ceph/pull/6933>`_, John Spray)
+* mon: fix ceph df pool available calculation for 0-weighted OSDs (`pr#6660 <http://github.com/ceph/ceph/pull/6660>`_, Chengyuan Li)
+* mon: fix routed_request_tids leak (`pr#6102 <http://github.com/ceph/ceph/pull/6102>`_, Ning Yao)
+* mon: support min_down_reporter by subtree level (default by host) (`pr#6709 <http://github.com/ceph/ceph/pull/6709>`_, Xiaoxi Chen)
+* mount.ceph: memory leaks (`pr#6905 <http://github.com/ceph/ceph/pull/6905>`_, Qiankun Zheng)
+* osd: add osd op queue latency perfcounter (`pr#5793 <http://github.com/ceph/ceph/pull/5793>`_, Haomai Wang)
+* osd: Allow repair of history.last_epoch_started using config (`pr#6793 <http://github.com/ceph/ceph/pull/6793>`_, David Zafman)
+* osd: avoid duplicate op->mark_started in ReplicatedBackend (`pr#6689 <http://github.com/ceph/ceph/pull/6689>`_, Jacek J. Łakis)
+* osd: cancel failure reports if we fail to rebind network (`pr#6278 <http://github.com/ceph/ceph/pull/6278>`_, Xinze Chi)
+* osd: correctly handle small osd_scrub_interval_randomize_ratio (`pr#7147 <http://github.com/ceph/ceph/pull/7147>`_, Samuel Just)
+* osd: defer decoding of MOSDRepOp/MOSDRepOpReply (`pr#6503 <http://github.com/ceph/ceph/pull/6503>`_, Xinze Chi)
+* osd: don't update epoch and rollback_info objects attrs if there is no need (`pr#6555 <http://github.com/ceph/ceph/pull/6555>`_, Ning Yao)
+* osd: dump number of missing objects for each peer with pg query (`pr#6058 <http://github.com/ceph/ceph/pull/6058>`_, Guang Yang)
+* osd: enable perfcounters on sharded work queue mutexes (`pr#6455 <http://github.com/ceph/ceph/pull/6455>`_, Jacek J. Łakis)
+* osd: FileJournal: reduce locking scope in write_aio_bl (`issue#12789 <http://tracker.ceph.com/issues/12789>`_, `pr#5670 <http://github.com/ceph/ceph/pull/5670>`_, Zhi Zhang)
+* osd: FileStore: remove __SWORD_TYPE dependency (`pr#6263 <http://github.com/ceph/ceph/pull/6263>`_, John Coyle)
+* osd: fix FileStore::_destroy_collection error return code (`pr#6612 <http://github.com/ceph/ceph/pull/6612>`_, Ruifeng Yang)
+* osd: fix incorrect throttle in WBThrottle (`pr#6713 <http://github.com/ceph/ceph/pull/6713>`_, Zhang Huan)
+* osd: fix MOSDRepScrub reference counter in replica_scrub (`pr#6730 <http://github.com/ceph/ceph/pull/6730>`_, Jie Wang)
+* osd: fix rollback_info_trimmed_to before index() (`issue#13965 <http://tracker.ceph.com/issues/13965>`_, `pr#6801 <http://github.com/ceph/ceph/pull/6801>`_, Samuel Just)
+* osd: fix trivial scrub bug (`pr#6533 <http://github.com/ceph/ceph/pull/6533>`_, Li Wang)
+* osd: KeyValueStore: don't queue NULL context (`pr#6783 <http://github.com/ceph/ceph/pull/6783>`_, Haomai Wang)
+* osd: make backend and block device code a bit more generic (`pr#6759 <http://github.com/ceph/ceph/pull/6759>`_, Sage Weil)
+* osd: move newest decode version of MOSDOp and MOSDOpReply to the front (`pr#6642 <http://github.com/ceph/ceph/pull/6642>`_, Jacek J. Łakis)
+* osd: pg_pool_t: add dictionary for pool options (`issue#13077 <http://tracker.ceph.com/issues/13077>`_, `pr#6081 <http://github.com/ceph/ceph/pull/6081>`_, Mykola Golub)
+* osd: reduce memory consumption of some structs (`pr#6475 <http://github.com/ceph/ceph/pull/6475>`_, Piotr Dałek)
+* osd: release the message throttle when OpRequest unregistered (`issue#14248 <http://tracker.ceph.com/issues/14248>`_, `pr#7148 <http://github.com/ceph/ceph/pull/7148>`_, Samuel Just)
+* osd: remove __SWORD_TYPE dependency (`pr#6262 <http://github.com/ceph/ceph/pull/6262>`_, John Coyle)
+* osd: slightly reduce actual size of pg_log_entry_t (`pr#6690 <http://github.com/ceph/ceph/pull/6690>`_, Piotr Dałek)
+* osd: support pool level recovery_priority and recovery_op_priority (`pr#5953 <http://github.com/ceph/ceph/pull/5953>`_, Guang Yang)
+* osd: use pg id (without shard) when referring the PG (`pr#6236 <http://github.com/ceph/ceph/pull/6236>`_, Guang Yang)
+* packaging: add build dependency on python devel package (`pr#7205 <http://github.com/ceph/ceph/pull/7205>`_, Josh Durgin)
+* pybind/cephfs: add symlink and its unit test (`pr#6323 <http://github.com/ceph/ceph/pull/6323>`_, Shang Ding)
+* pybind: decode empty string in conf_parse_argv() correctly (`pr#6711 <http://github.com/ceph/ceph/pull/6711>`_, Josh Durgin)
+* pybind: Implementation of rados_ioctx_snapshot_rollback (`pr#6878 <http://github.com/ceph/ceph/pull/6878>`_, Florent Manens)
+* pybind: port the rbd bindings to Cython (`issue#13115 <http://tracker.ceph.com/issues/13115>`_, `pr#6768 <http://github.com/ceph/ceph/pull/6768>`_, Hector Martin)
+* pybind: support ioctx:exec (`pr#6795 <http://github.com/ceph/ceph/pull/6795>`_, Noah Watkins)
+* qa: erasure-code benchmark plugin selection (`pr#6685 <http://github.com/ceph/ceph/pull/6685>`_, Loic Dachary)
+* qa/krbd: Expunge generic/247 (`pr#6831 <http://github.com/ceph/ceph/pull/6831>`_, Douglas Fuller)
+* qa/workunits/cephtool/test.sh: false positive fail on /tmp/obj1. (`pr#6837 <http://github.com/ceph/ceph/pull/6837>`_, Robin H. Johnson)
+* qa/workunits/cephtool/test.sh: no ./ (`pr#6748 <http://github.com/ceph/ceph/pull/6748>`_, Sage Weil)
+* qa/workunits/rbd: rbd-nbd test should use sudo for map/unmap ops (`issue#14221 <http://tracker.ceph.com/issues/14221>`_, `pr#7101 <http://github.com/ceph/ceph/pull/7101>`_, Jason Dillaman)
+* rados: bench: fix off-by-one to avoid writing past object_size (`pr#6677 <http://github.com/ceph/ceph/pull/6677>`_, Tao Chang)
+* rbd: add --object-size option, deprecate --order (`issue#12112 <http://tracker.ceph.com/issues/12112>`_, `pr#6830 <http://github.com/ceph/ceph/pull/6830>`_, Vikhyat Umrao)
+* rbd: add RBD pool mirroring configuration API + CLI (`pr#6129 <http://github.com/ceph/ceph/pull/6129>`_, Jason Dillaman)
+* rbd: fix build with "--without-rbd" (`issue#14058 <http://tracker.ceph.com/issues/14058>`_, `pr#6899 <http://github.com/ceph/ceph/pull/6899>`_, Piotr Dałek)
+* rbd: journal: configuration via conf, cli, api and some fixes (`pr#6665 <http://github.com/ceph/ceph/pull/6665>`_, Mykola Golub)
+* rbd: merge_diff test should use new --object-size parameter instead of --order (`issue#14106 <http://tracker.ceph.com/issues/14106>`_, `pr#6972 <http://github.com/ceph/ceph/pull/6972>`_, Na Xie, Jason Dillaman)
+* rbd-nbd: network block device (NBD) support for RBD  (`pr#6657 <http://github.com/ceph/ceph/pull/6657>`_, Yunchuan Wen, Li Wang)
+* rbd: output formatter may not be closed upon error (`issue#13711 <http://tracker.ceph.com/issues/13711>`_, `pr#6706 <http://github.com/ceph/ceph/pull/6706>`_, xie xingguo)
+* rgw: add a missing cap type (`pr#6774 <http://github.com/ceph/ceph/pull/6774>`_, Yehuda Sadeh)
+* rgw: add an inspection to the field of type when assigning user caps (`pr#6051 <http://github.com/ceph/ceph/pull/6051>`_, Kongming Wu)
+* rgw: add LifeCycle feature (`pr#6331 <http://github.com/ceph/ceph/pull/6331>`_, Ji Chen)
+* rgw: add support for Static Large Objects of Swift API (`issue#12886 <http://tracker.ceph.com/issues/12886>`_, `issue#13452 <http://tracker.ceph.com/issues/13452>`_, `pr#6643 <http://github.com/ceph/ceph/pull/6643>`_, Yehuda Sadeh, Radoslaw Zarzynski)
+* rgw: fix a glaring syntax error (`pr#6888 <http://github.com/ceph/ceph/pull/6888>`_, Pavan Rallabhandi)
+* rgw: fix the build failure (`pr#6927 <http://github.com/ceph/ceph/pull/6927>`_, Kefu Chai)
+* rgw: multitenancy support (`pr#6784 <http://github.com/ceph/ceph/pull/6784>`_, Yehuda Sadeh, Pete Zaitcev)
+* rgw: Remove unused code in PutMetadataAccount:execute (`pr#6668 <http://github.com/ceph/ceph/pull/6668>`_, Pete Zaitcev)
+* rgw: remove unused variable in RGWPutMetadataBucket::execute (`pr#6735 <http://github.com/ceph/ceph/pull/6735>`_, Radoslaw Zarzynski)
+* rgw/rgw_resolve: fallback to res_query when res_nquery not implemented (`pr#6292 <http://github.com/ceph/ceph/pull/6292>`_, John Coyle)
+* rgw: static large objects (Radoslaw Zarzynski, Yehuda Sadeh)
+* rgw: swift bulk delete (Radoslaw Zarzynski)
+* systemd: start/stop/restart ceph services by daemon type (`issue#13497 <http://tracker.ceph.com/issues/13497>`_, `pr#6276 <http://github.com/ceph/ceph/pull/6276>`_, Zhi Zhang)
+* sysvinit: allow custom cluster names (`pr#6732 <http://github.com/ceph/ceph/pull/6732>`_, Richard Chan)
+* test/encoding/readable.sh fix (`pr#6714 <http://github.com/ceph/ceph/pull/6714>`_, Igor Podoski)
+* test: fix osd-scrub-snaps.sh (`pr#6697 <http://github.com/ceph/ceph/pull/6697>`_, Xinze Chi)
+* test/librados/test.cc: clean up EC pools' crush rules too (`issue#13878 <http://tracker.ceph.com/issues/13878>`_, `pr#6788 <http://github.com/ceph/ceph/pull/6788>`_, Loic Dachary, Dan Mick)
+* tests: allow object corpus readable test to skip specific incompat instances (`pr#6932 <http://github.com/ceph/ceph/pull/6932>`_, Igor Podoski)
+* tests: ceph-helpers assert success getting backfills (`pr#6699 <http://github.com/ceph/ceph/pull/6699>`_, Loic Dachary)
+* tests: ceph_test_keyvaluedb_iterators: fix broken test (`pr#6597 <http://github.com/ceph/ceph/pull/6597>`_, Haomai Wang)
+* tests: fix failure for osd-scrub-snap.sh (`issue#13986 <http://tracker.ceph.com/issues/13986>`_, `pr#6890 <http://github.com/ceph/ceph/pull/6890>`_, Loic Dachary, Ning Yao)
+* tests: fix race condition testing auto scrub (`issue#13592 <http://tracker.ceph.com/issues/13592>`_, `pr#6724 <http://github.com/ceph/ceph/pull/6724>`_, Xinze Chi, Loic Dachary)
+* tests: flush op work queue prior to destroying MockImageCtx (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `pr#7002 <http://github.com/ceph/ceph/pull/7002>`_, Jason Dillaman)
+* tests: --osd-scrub-load-threshold=2000 for more consistency (`issue#14027 <http://tracker.ceph.com/issues/14027>`_, `pr#6871 <http://github.com/ceph/ceph/pull/6871>`_, Loic Dachary)
+* tests: osd-scrub-snaps.sh to display full osd logs on error (`issue#13986 <http://tracker.ceph.com/issues/13986>`_, `pr#6857 <http://github.com/ceph/ceph/pull/6857>`_, Loic Dachary)
+* test: use sequential journal_tid for object cacher test (`issue#13877 <http://tracker.ceph.com/issues/13877>`_, `pr#6710 <http://github.com/ceph/ceph/pull/6710>`_, Josh Durgin)
+* tools: add cephfs-table-tool 'take_inos' (`pr#6655 <http://github.com/ceph/ceph/pull/6655>`_, John Spray)
+* tools: Fix layout handing in cephfs-data-scan (#13898) (`pr#6719 <http://github.com/ceph/ceph/pull/6719>`_, John Spray)
+* tools: support printing part cluster map in readable fashion (`issue#13079 <http://tracker.ceph.com/issues/13079>`_, `pr#5921 <http://github.com/ceph/ceph/pull/5921>`_, Bo Cai)
+* vstart.sh: add mstart, mstop, mrun wrappers for running multiple vstart-style test clusters out of src tree (`pr#6901 <http://github.com/ceph/ceph/pull/6901>`_, Yehuda Sadeh)
+
+v10.0.1
+=======
+
+This is the second development release for the Jewel cycle.
+Highlights include some KeyValueDB interface optimizations, initial
+journaling support in librbd, MDS scrubbing progress, and a bunch of
+OSD optimizations and improvements (removal of an unnecessary CRUSH
+calculation in the IO path, sharding for FileStore completions,
+improved temperature calculation for cache tiering, fixed
+randomization of scrub times, and various optimizations).
+
+Notable Changes
+---------------
+
+* build: build internal plugins and classes as modules (`pr#6462 <http://github.com/ceph/ceph/pull/6462>`_, James Page)
+* build: fix Jenkins make check errors due to deep-scrub randomization (`pr#6671 <http://github.com/ceph/ceph/pull/6671>`_, David Zafman)
+* build/ops: enable CR in CentOS 7 (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6844 <http://github.com/ceph/ceph/pull/6844>`_, Loic Dachary)
+* build/ops: rbd-replay moved from ceph-test-dbg to ceph-common-dbg (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6578 <http://github.com/ceph/ceph/pull/6578>`_, Loic Dachary)
+* ceph-disk: Add destroy and deactivate option (`issue#7454 <http://tracker.ceph.com/issues/7454>`_, `pr#5867 <http://github.com/ceph/ceph/pull/5867>`_, Vicente Cheng)
+* ceph-disk: compare parted output with the dereferenced path (`issue#13438 <http://tracker.ceph.com/issues/13438>`_, `pr#6219 <http://github.com/ceph/ceph/pull/6219>`_, Joe Julian)
+* ceph-objectstore-tool: fix --dry-run for many ceph-objectstore-tool operations (`pr#6545 <http://github.com/ceph/ceph/pull/6545>`_, David Zafman)
+* ceph.spec.in: limit _smp_mflags when lowmem_builder is set in SUSE's OBS (`issue#13858 <http://tracker.ceph.com/issues/13858>`_, `pr#6691 <http://github.com/ceph/ceph/pull/6691>`_, Nathan Cutler)
+* ceph_test_msgr: Use send_message instead of keepalive to wakeup connection (`pr#6605 <http://github.com/ceph/ceph/pull/6605>`_, Haomai Wang)
+* client: avoid creating orphan object in Client::check_pool_perm() (`issue#13782 <http://tracker.ceph.com/issues/13782>`_, `pr#6603 <http://github.com/ceph/ceph/pull/6603>`_, Yan, Zheng)
+* client: use null snapc to check pool permission (`issue#13714 <http://tracker.ceph.com/issues/13714>`_, `pr#6497 <http://github.com/ceph/ceph/pull/6497>`_, Yan, Zheng)
+* cmake: add nss as a suffix for pk11pub.h (`pr#6556 <http://github.com/ceph/ceph/pull/6556>`_, Samuel Just)
+* cmake: fix files list (`pr#6539 <http://github.com/ceph/ceph/pull/6539>`_, Yehuda Sadeh)
+* cmake: librbd and libjournal build fixes (`pr#6557 <http://github.com/ceph/ceph/pull/6557>`_, Ilya Dryomov)
+* coc: fix typo in the apt-get command (`pr#6659 <http://github.com/ceph/ceph/pull/6659>`_, Chris Holcombe)
+* common: allow enable/disable of optracker at runtime (`pr#5168 <http://github.com/ceph/ceph/pull/5168>`_, Jianpeng Ma)
+* common: fix reset max in Throttle using perf reset command (`issue#13517 <http://tracker.ceph.com/issues/13517>`_, `pr#6300 <http://github.com/ceph/ceph/pull/6300>`_, Xinze Chi)
+* doc: add v0.80.11 to the release timeline (`pr#6658 <http://github.com/ceph/ceph/pull/6658>`_, Loic Dachary)
+* doc: release-notes: draft v0.80.11 release notes (`pr#6374 <http://github.com/ceph/ceph/pull/6374>`_, Loic Dachary)
+* doc: release-notes: draft v10.0.0 release notes (`pr#6666 <http://github.com/ceph/ceph/pull/6666>`_, Loic Dachary)
+* doc: SubmittingPatches: there is no next; only jewel (`pr#6811 <http://github.com/ceph/ceph/pull/6811>`_, Nathan Cutler)
+* doc: Update ceph-disk manual page with new feature deactivate/destroy. (`pr#6637 <http://github.com/ceph/ceph/pull/6637>`_, Vicente Cheng)
+* doc: update infernalis release notes (`pr#6575 <http://github.com/ceph/ceph/pull/6575>`_, vasukulkarni)
+* fix: use right init_flags to finish CephContext (`pr#6549 <http://github.com/ceph/ceph/pull/6549>`_, Yunchuan Wen)
+* init-ceph: use getopt to make option processing more flexible (`issue#3015 <http://tracker.ceph.com/issues/3015>`_, `pr#6089 <http://github.com/ceph/ceph/pull/6089>`_, Nathan Cutler)
+* journal: incremental improvements and fixes (`pr#6552 <http://github.com/ceph/ceph/pull/6552>`_, Mykola Golub)
+* krbd: remove deprecated --quiet param from udevadm (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6394 <http://github.com/ceph/ceph/pull/6394>`_, Jason Dillaman)
+* kv: fix bug in kv key optimization (`pr#6511 <http://github.com/ceph/ceph/pull/6511>`_, Sage Weil)
+* kv/KineticStore: fix broken split_key (`pr#6574 <http://github.com/ceph/ceph/pull/6574>`_, Haomai Wang)
+* kv: optimize and clean up internal key/value interface (`pr#6312 <http://github.com/ceph/ceph/pull/6312>`_, Piotr Dałek, Sage Weil)
+* librados: do cleanup (`pr#6488 <http://github.com/ceph/ceph/pull/6488>`_, xie xingguo)
+* librados: fix pool alignment API overflow issue (`issue#13715 <http://tracker.ceph.com/issues/13715>`_, `pr#6489 <http://github.com/ceph/ceph/pull/6489>`_, xie xingguo)
+* librados: fix potential null pointer access when do pool_snap_list (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6422 <http://github.com/ceph/ceph/pull/6422>`_, xie xingguo)
+* librados: fix PromoteOn2ndRead test for EC (`pr#6373 <http://github.com/ceph/ceph/pull/6373>`_, Sage Weil)
+* librados: fix rare race where pool op callback may hang forever (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6426 <http://github.com/ceph/ceph/pull/6426>`_, xie xingguo)
+* librados: Solaris port (`pr#6416 <http://github.com/ceph/ceph/pull/6416>`_, Rohan Mars)
+* librbd: flush and invalidate cache via admin socket (`issue#2468 <http://tracker.ceph.com/issues/2468>`_, `pr#6453 <http://github.com/ceph/ceph/pull/6453>`_, Mykola Golub)
+* librbd: integrate journaling support for IO operations (`pr#6541 <http://github.com/ceph/ceph/pull/6541>`_, Jason Dillaman)
+* librbd: perf counters might not be initialized on error (`issue#13740 <http://tracker.ceph.com/issues/13740>`_, `pr#6523 <http://github.com/ceph/ceph/pull/6523>`_, Jason Dillaman)
+* librbd: perf section name: use hyphen to separate components (`issue#13719 <http://tracker.ceph.com/issues/13719>`_, `pr#6516 <http://github.com/ceph/ceph/pull/6516>`_, Mykola Golub)
+* librbd: resize should only update image size within header (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6447 <http://github.com/ceph/ceph/pull/6447>`_, Jason Dillaman)
+* librbd: start perf counters after id is initialized (`issue#13720 <http://tracker.ceph.com/issues/13720>`_, `pr#6494 <http://github.com/ceph/ceph/pull/6494>`_, Mykola Golub)
+* mailmap: revise organization (`pr#6519 <http://github.com/ceph/ceph/pull/6519>`_, Li Wang)
+* mailmap: Ubuntu Kylin name changed to Kylin Cloud (`pr#6532 <http://github.com/ceph/ceph/pull/6532>`_, Loic Dachary)
+* mailmap: update .organizationmap (`pr#6565 <http://github.com/ceph/ceph/pull/6565>`_, chenji-kael)
+* mailmap: updates for infernalis. (`pr#6495 <http://github.com/ceph/ceph/pull/6495>`_, Yann Dupont)
+* mailmap: updates (`pr#6594 <http://github.com/ceph/ceph/pull/6594>`_, chenji-kael)
+* mds: fix scrub_path (`pr#6684 <http://github.com/ceph/ceph/pull/6684>`_, John Spray)
+* mds: properly set STATE_STRAY/STATE_ORPHAN for stray dentry/inode (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#6553 <http://github.com/ceph/ceph/pull/6553>`_, Yan, Zheng)
+* mds: ScrubStack and "tag path" command (`pr#5662 <http://github.com/ceph/ceph/pull/5662>`_, Yan, Zheng, John Spray, Greg Farnum)
+* mon: block 'ceph osd pg-temp ...' if pg_temp update is already pending (`pr#6704 <http://github.com/ceph/ceph/pull/6704>`_, Sage Weil)
+* mon: don't require OSD W for MRemoveSnaps (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#6601 <http://github.com/ceph/ceph/pull/6601>`_, John Spray)
+* mon: initialize recorded election epoch properly even when standalone (`issue#13627 <http://tracker.ceph.com/issues/13627>`_, `pr#6407 <http://github.com/ceph/ceph/pull/6407>`_, huanwen ren)
+* mon: revert MonitorDBStore's WholeStoreIteratorImpl::get (`issue#13742 <http://tracker.ceph.com/issues/13742>`_, `pr#6522 <http://github.com/ceph/ceph/pull/6522>`_, Piotr Dałek)
+* msg/async: let receiver ack message ASAP (`pr#6478 <http://github.com/ceph/ceph/pull/6478>`_, Haomai Wang)
+* msg/async: support of non-block connect in async messenger (`issue#12802 <http://tracker.ceph.com/issues/12802>`_, `pr#5848 <http://github.com/ceph/ceph/pull/5848>`_, Jianhui Yuan)
+* msg/async: will crash if enabling async msg because of an assertion (`pr#6640 <http://github.com/ceph/ceph/pull/6640>`_, Zhi Zhang)
+* osd: avoid calculating crush mapping for most ops (`pr#6371 <http://github.com/ceph/ceph/pull/6371>`_, Sage Weil)
+* osd: avoid double-check for replaying and can_checkpoint() in FileStore::_check_replay_guard (`pr#6471 <http://github.com/ceph/ceph/pull/6471>`_, Ning Yao)
+* osd: call on_new_interval on newly split child PG (`issue#13962 <http://tracker.ceph.com/issues/13962>`_, `pr#6778 <http://github.com/ceph/ceph/pull/6778>`_, Sage Weil)
+* osd: change mutex to spinlock to optimize thread context switch. (`pr#6492 <http://github.com/ceph/ceph/pull/6492>`_, Xiaowei Chen)
+* osd: check do_shutdown before do_restart (`pr#6547 <http://github.com/ceph/ceph/pull/6547>`_, Xiaoxi Chen)
+* osd: clarify the scrub result report (`pr#6534 <http://github.com/ceph/ceph/pull/6534>`_, Li Wang)
+* osd: don't do random deep scrubs for user initiated scrubs (`pr#6673 <http://github.com/ceph/ceph/pull/6673>`_, David Zafman)
+* osd: FileStore: support multiple ondisk finish and apply finishers (`pr#6486 <http://github.com/ceph/ceph/pull/6486>`_, Xinze Chi, Haomai Wang)
+* osd: fix broken balance / localized read handling (`issue#13491 <http://tracker.ceph.com/issues/13491>`_, `pr#6364 <http://github.com/ceph/ceph/pull/6364>`_, Jason Dillaman)
+* osd: fix bug in last_* PG state timestamps (`pr#6517 <http://github.com/ceph/ceph/pull/6517>`_, Li Wang)
+* osd: fix ClassHandler::ClassData::get_filter() (`pr#6747 <http://github.com/ceph/ceph/pull/6747>`_, Yan, Zheng)
+* osd: fixes for several cases where op result code was not checked or set (`issue#13566 <http://tracker.ceph.com/issues/13566>`_, `pr#6347 <http://github.com/ceph/ceph/pull/6347>`_, xie xingguo)
+* osd: fix reactivate (check OSDSuperblock in mkfs() when we already have the superblock) (`issue#13586 <http://tracker.ceph.com/issues/13586>`_, `pr#6385 <http://github.com/ceph/ceph/pull/6385>`_, Vicente Cheng)
+* osd: fix wrong use of right parenthesis in localized read logic (`pr#6566 <http://github.com/ceph/ceph/pull/6566>`_, Jie Wang)
+* osd: improve temperature calculation for cache tier agent (`pr#4737 <http://github.com/ceph/ceph/pull/4737>`_, MingXin Liu)
+* osd: merge local_t and op_t txn to single one (`pr#6439 <http://github.com/ceph/ceph/pull/6439>`_, Xinze Chi)
+* osd: newstore: misc updates (including kv and os/fs stuff) (`pr#6609 <http://github.com/ceph/ceph/pull/6609>`_, Sage Weil)
+* osd: note down the number of missing clones (`pr#6654 <http://github.com/ceph/ceph/pull/6654>`_, Kefu Chai)
+* osd: optimize clone write path if object-map is enabled (`pr#6403 <http://github.com/ceph/ceph/pull/6403>`_, xinxin shu)
+* osd: optimize scrub subset_last_update calculation (`pr#6518 <http://github.com/ceph/ceph/pull/6518>`_, Li Wang)
+* osd: partial revert of "ReplicatedPG: result code not correctly set in some cases." (`issue#13796 <http://tracker.ceph.com/issues/13796>`_, `pr#6622 <http://github.com/ceph/ceph/pull/6622>`_, Sage Weil)
+* osd: randomize deep scrubbing (`pr#6550 <http://github.com/ceph/ceph/pull/6550>`_, Dan van der Ster, Herve Rousseau)
+* osd: scrub: do not assign value if read error (`pr#6568 <http://github.com/ceph/ceph/pull/6568>`_, Li Wang)
+* osd: write file journal optimization (`pr#6484 <http://github.com/ceph/ceph/pull/6484>`_, Xinze Chi)
+* rbd: accept --user, refuse -i command-line optionals (`pr#6590 <http://github.com/ceph/ceph/pull/6590>`_, Ilya Dryomov)
+* rbd: add missing command aliases to refactored CLI (`issue#13806 <http://tracker.ceph.com/issues/13806>`_, `pr#6606 <http://github.com/ceph/ceph/pull/6606>`_, Jason Dillaman)
+* rbd: dynamically generated bash completion (`issue#13494 <http://tracker.ceph.com/issues/13494>`_, `pr#6316 <http://github.com/ceph/ceph/pull/6316>`_, Jason Dillaman)
+* rbd: fixes for refactored CLI and related tests (`pr#6738 <http://github.com/ceph/ceph/pull/6738>`_, Ilya Dryomov)
+* rbd: make config changes actually apply (`pr#6520 <http://github.com/ceph/ceph/pull/6520>`_, Mykola Golub)
+* rbd: refactor cli command handling (`pr#5987 <http://github.com/ceph/ceph/pull/5987>`_, Jason Dillaman)
+* rbd: stripe unit/count set incorrectly from config (`pr#6593 <http://github.com/ceph/ceph/pull/6593>`_, Mykola Golub)
+* rbd: support negative boolean command-line optionals (`issue#13784 <http://tracker.ceph.com/issues/13784>`_, `pr#6607 <http://github.com/ceph/ceph/pull/6607>`_, Jason Dillaman)
+* rbd: unbreak rbd map + cephx_sign_messages option (`pr#6583 <http://github.com/ceph/ceph/pull/6583>`_, Ilya Dryomov)
+* rgw: bucket request payment support (`issue#13427 <http://tracker.ceph.com/issues/13427>`_, `pr#6214 <http://github.com/ceph/ceph/pull/6214>`_, Javier M. Mellid)
+* rgw: extend rgw_extended_http_attrs to affect Swift accounts and containers as well (`pr#5969 <http://github.com/ceph/ceph/pull/5969>`_, Radoslaw Zarzynski)
+* rgw: fix openssl linkage (`pr#6513 <http://github.com/ceph/ceph/pull/6513>`_, Yehuda Sadeh)
+* rgw: fix partial read issue in rgw_admin and rgw_tools (`pr#6761 <http://github.com/ceph/ceph/pull/6761>`_, Jiaying Ren)
+* rgw: fix reload on non Debian systems. (`pr#6482 <http://github.com/ceph/ceph/pull/6482>`_, Hervé Rousseau)
+* rgw: fix response of delete expired objects (`issue#13469 <http://tracker.ceph.com/issues/13469>`_, `pr#6228 <http://github.com/ceph/ceph/pull/6228>`_, Yuan Zhou)
+* rgw: fix swift API returning incorrect account metadata (`issue#13140 <http://tracker.ceph.com/issues/13140>`_, `pr#6047 <http://github.com/ceph/ceph/pull/6047>`_, Sangdi Xu)
+* rgw: link against system openssl (instead of dlopen at runtime) (`pr#6419 <http://github.com/ceph/ceph/pull/6419>`_, Sage Weil)
+* rgw: prevent anonymous user from reading bucket with authenticated read ACL (`issue#13207 <http://tracker.ceph.com/issues/13207>`_, `pr#6057 <http://github.com/ceph/ceph/pull/6057>`_, root)
+* rgw: use smart pointer for C_Reinitwatch (`pr#6767 <http://github.com/ceph/ceph/pull/6767>`_, Orit Wasserman)
+* systemd: fix typos (`pr#6679 <http://github.com/ceph/ceph/pull/6679>`_, Tobias Suckow)
+* tests: centos7 needs the Continuous Release (CR) Repository enabled for (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6842 <http://github.com/ceph/ceph/pull/6842>`_, Brad Hubbard)
+* tests: concatenate test_rados_test_tool from src and qa (`issue#13691 <http://tracker.ceph.com/issues/13691>`_, `pr#6464 <http://github.com/ceph/ceph/pull/6464>`_, Loic Dachary)
+* tests: fix test_rados_tools.sh rados lookup (`issue#13691 <http://tracker.ceph.com/issues/13691>`_, `pr#6502 <http://github.com/ceph/ceph/pull/6502>`_, Loic Dachary)
+* tests: fix typo in TestClsRbd.snapshots test case (`issue#13727 <http://tracker.ceph.com/issues/13727>`_, `pr#6504 <http://github.com/ceph/ceph/pull/6504>`_, Jason Dillaman)
+* tests: ignore test-suite.log (`pr#6584 <http://github.com/ceph/ceph/pull/6584>`_, Loic Dachary)
+* tests: restore run-cli-tests (`pr#6571 <http://github.com/ceph/ceph/pull/6571>`_, Loic Dachary, Sage Weil, Jason Dillaman)
+* tools/cephfs: fix overflow writing header to fixed size buffer (#13816) (`pr#6617 <http://github.com/ceph/ceph/pull/6617>`_, John Spray)
+
+v10.0.0
+=======
+
+This is the first development release for the Jewel cycle.
+
+Notable Changes
+---------------
+
+* build: cmake tweaks (`pr#6254 <http://github.com/ceph/ceph/pull/6254>`_, John Spray)
+* build: more CMake package check fixes (`pr#6108 <http://github.com/ceph/ceph/pull/6108>`_, Daniel Gryniewicz)
+* ceph-disk: get Nonetype when ceph-disk list with --format plain on single device. (`pr#6410 <http://github.com/ceph/ceph/pull/6410>`_, Vicente Cheng)
+* ceph: fix tell behavior (`pr#6329 <http://github.com/ceph/ceph/pull/6329>`_, David Zafman)
+* ceph-fuse: While starting ceph-fuse, start the log thread first (`issue#13443 <http://tracker.ceph.com/issues/13443>`_, `pr#6224 <http://github.com/ceph/ceph/pull/6224>`_, Wenjun Huang)
+* client: don't mark_down on command reply (`pr#6204 <http://github.com/ceph/ceph/pull/6204>`_, John Spray)
+* client: drop prefix from ints (`pr#6275 <http://github.com/ceph/ceph/pull/6275>`_, John Coyle)
+* client: sys/file.h includes for flock operations (`pr#6282 <http://github.com/ceph/ceph/pull/6282>`_, John Coyle)
+* cls_rbd: change object_map_update to return 0 on success, add logging (`pr#6467 <http://github.com/ceph/ceph/pull/6467>`_, Douglas Fuller)
+* cmake: Use uname instead of arch. (`pr#6358 <http://github.com/ceph/ceph/pull/6358>`_, John Coyle)
+* common: assert: __STRING macro is not defined by musl libc. (`pr#6210 <http://github.com/ceph/ceph/pull/6210>`_, John Coyle)
+* common: fix OpTracker age histogram calculation (`pr#5065 <http://github.com/ceph/ceph/pull/5065>`_, Zhiqiang Wang)
+* common/MemoryModel: Added explicit feature check for mallinfo(). (`pr#6252 <http://github.com/ceph/ceph/pull/6252>`_, John Coyle)
+* common/obj_bencher.cc: fix verification crashing when there's no objects (`pr#5853 <http://github.com/ceph/ceph/pull/5853>`_, Piotr Dałek)
+* common: optimize debug logging (`pr#6307 <http://github.com/ceph/ceph/pull/6307>`_, Adam Kupczyk)
+* common: Thread: move copy constructor and assignment op (`pr#5133 <http://github.com/ceph/ceph/pull/5133>`_, Michal Jarzabek)
+* common: WorkQueue: new PointerWQ base class for ContextWQ (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6525 <http://github.com/ceph/ceph/pull/6525>`_, Jason Dillaman)
+* compat: use prefixed typeof extension (`pr#6216 <http://github.com/ceph/ceph/pull/6216>`_, John Coyle)
+* crush: validate bucket id before indexing buckets array (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6246 <http://github.com/ceph/ceph/pull/6246>`_, Sage Weil)
+* doc: download GPG key from download.ceph.com (`issue#13603 <http://tracker.ceph.com/issues/13603>`_, `pr#6384 <http://github.com/ceph/ceph/pull/6384>`_, Ken Dreyer)
+* doc: fix outdated content in cache tier (`pr#6272 <http://github.com/ceph/ceph/pull/6272>`_, Yuan Zhou)
+* doc/release-notes: v9.1.0 (`pr#6281 <http://github.com/ceph/ceph/pull/6281>`_, Loic Dachary)
+* doc/releases-notes: fix build error (`pr#6483 <http://github.com/ceph/ceph/pull/6483>`_, Kefu Chai)
+* doc: remove toctree items under Create CephFS (`pr#6241 <http://github.com/ceph/ceph/pull/6241>`_, Jevon Qiao)
+* doc: rename the "Create a Ceph User" section and add verbage about… (`issue#13502 <http://tracker.ceph.com/issues/13502>`_, `pr#6297 <http://github.com/ceph/ceph/pull/6297>`_, ritz303)
+* docs: Fix styling of newly added mirror docs (`pr#6127 <http://github.com/ceph/ceph/pull/6127>`_, Wido den Hollander)
+* doc, tests: update all http://ceph.com/ to download.ceph.com (`pr#6435 <http://github.com/ceph/ceph/pull/6435>`_, Alfredo Deza)
+* doc: update doc for with new pool settings (`pr#5951 <http://github.com/ceph/ceph/pull/5951>`_, Guang Yang)
+* doc: update radosgw-admin example (`pr#6256 <http://github.com/ceph/ceph/pull/6256>`_, YankunLi)
+* doc: update the OS recommendations for newer Ceph releases (`pr#6355 <http://github.com/ceph/ceph/pull/6355>`_, ritz303)
+* drop envz.h includes (`pr#6285 <http://github.com/ceph/ceph/pull/6285>`_, John Coyle)
+* libcephfs: Improve portability by replacing loff_t type usage with off_t (`pr#6301 <http://github.com/ceph/ceph/pull/6301>`_, John Coyle)
+* libcephfs: only check file offset on glibc platforms (`pr#6288 <http://github.com/ceph/ceph/pull/6288>`_, John Coyle)
+* librados: fix examples/librados/Makefile error. (`pr#6320 <http://github.com/ceph/ceph/pull/6320>`_, You Ji)
+* librados: init crush_location from config file. (`issue#13473 <http://tracker.ceph.com/issues/13473>`_, `pr#6243 <http://github.com/ceph/ceph/pull/6243>`_, Wei Luo)
+* librados: wrongly passed in argument for stat command (`issue#13703 <http://tracker.ceph.com/issues/13703>`_, `pr#6476 <http://github.com/ceph/ceph/pull/6476>`_, xie xingguo)
+* librbd: deadlock while attempting to flush AIO requests (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6508 <http://github.com/ceph/ceph/pull/6508>`_, Jason Dillaman)
+* librbd: fix enable objectmap feature issue (`issue#13558 <http://tracker.ceph.com/issues/13558>`_, `pr#6339 <http://github.com/ceph/ceph/pull/6339>`_, xinxin shu)
+* librbd: remove duplicate read_only test in librbd::async_flatten (`pr#5856 <http://github.com/ceph/ceph/pull/5856>`_, runsisi)
+* mailmap: modify member info  (`pr#6468 <http://github.com/ceph/ceph/pull/6468>`_, Xiaowei Chen)
+* mailmap: updates (`pr#6258 <http://github.com/ceph/ceph/pull/6258>`_, M Ranga Swami Reddy)
+* mailmap: Xie Xingguo affiliation (`pr#6409 <http://github.com/ceph/ceph/pull/6409>`_, Loic Dachary)
+* mds: implement snapshot rename (`pr#5645 <http://github.com/ceph/ceph/pull/5645>`_, xinxin shu)
+* mds: messages/MOSDOp: cast in assert to eliminate warnings (`issue#13625 <http://tracker.ceph.com/issues/13625>`_, `pr#6414 <http://github.com/ceph/ceph/pull/6414>`_, David Zafman)
+* mds: new filtered MDS tell commands for sessions (`pr#6180 <http://github.com/ceph/ceph/pull/6180>`_, John Spray)
+* mds/Session: use projected parent for auth path check (`issue#13364 <http://tracker.ceph.com/issues/13364>`_, `pr#6200 <http://github.com/ceph/ceph/pull/6200>`_, Sage Weil)
+* mon: should not set isvalid = true when cephx_verify_authorizer return false (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6306 <http://github.com/ceph/ceph/pull/6306>`_, Ruifeng Yang)
+* osd: Add config option osd_read_ec_check_for_errors for testing (`pr#5865 <http://github.com/ceph/ceph/pull/5865>`_, David Zafman)
+* osd: add pin/unpin support to cache tier (11066) (`pr#6326 <http://github.com/ceph/ceph/pull/6326>`_, Zhiqiang Wang)
+* osd: auto repair EC pool (`issue#12754 <http://tracker.ceph.com/issues/12754>`_, `pr#6196 <http://github.com/ceph/ceph/pull/6196>`_, Guang Yang)
+* osd: drop the interim set from load_pgs() (`pr#6277 <http://github.com/ceph/ceph/pull/6277>`_, Piotr Dałek)
+* osd: FileJournal: _fdump wrongly returns if journal is currently unreadable. (`issue#13626 <http://tracker.ceph.com/issues/13626>`_, `pr#6406 <http://github.com/ceph/ceph/pull/6406>`_, xie xingguo)
+* osd: FileStore: add a field indicate xattr only one chunk for set xattr. (`pr#6244 <http://github.com/ceph/ceph/pull/6244>`_, Jianpeng Ma)
+* osd: FileStore: LFNIndex: remove redundant local variable 'obj'. (`issue#13552 <http://tracker.ceph.com/issues/13552>`_, `pr#6333 <http://github.com/ceph/ceph/pull/6333>`_, xiexingguo)
+* osd: FileStore: potential memory leak if _fgetattrs fails (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6377 <http://github.com/ceph/ceph/pull/6377>`_, xie xingguo)
+* osd: FileStore: remove unused local variable 'handle' (`pr#6381 <http://github.com/ceph/ceph/pull/6381>`_, xie xingguo)
+* osd: fix bogus scrub results when missing a clone (`issue#12738 <http://tracker.ceph.com/issues/12738>`_, `issue#12740 <http://tracker.ceph.com/issues/12740>`_, `pr#5783 <http://github.com/ceph/ceph/pull/5783>`_, David Zafman)
+* osd: fix debug message in OSD::is_healthy (`pr#6226 <http://github.com/ceph/ceph/pull/6226>`_, Xiaoxi Chen)
+* osd: fix MOSDOp encoding (`pr#6174 <http://github.com/ceph/ceph/pull/6174>`_, Sage Weil)
+* osd: init started to 0 (`issue#13206 <http://tracker.ceph.com/issues/13206>`_, `pr#6107 <http://github.com/ceph/ceph/pull/6107>`_, Sage Weil)
+* osd: KeyValueStore: fix the name's typo of keyvaluestore_default_strip_size (`pr#6375 <http://github.com/ceph/ceph/pull/6375>`_, Zhi Zhang)
+* osd: new and delete ObjectStore::Transaction in a function is not necessary (`pr#6299 <http://github.com/ceph/ceph/pull/6299>`_, Ruifeng Yang)
+* osd: optimize get_object_context (`pr#6305 <http://github.com/ceph/ceph/pull/6305>`_, Jianpeng Ma)
+* osd: optimize MOSDOp/do_op/handle_op (`pr#5211 <http://github.com/ceph/ceph/pull/5211>`_, Jacek J. Lakis)
+* osd: os/chain_xattr: On linux use linux/limits.h for XATTR_NAME_MAX. (`pr#6343 <http://github.com/ceph/ceph/pull/6343>`_, John Coyle)
+* osd: reorder bool fields in PGLog struct (`pr#6279 <http://github.com/ceph/ceph/pull/6279>`_, Piotr Dałek)
+* osd: ReplicatedPG: remove unused local variables (`issue#13575 <http://tracker.ceph.com/issues/13575>`_, `pr#6360 <http://github.com/ceph/ceph/pull/6360>`_, xiexingguo)
+* osd: reset primary and up_primary when building a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6240 <http://github.com/ceph/ceph/pull/6240>`_, xiexingguo)
+* radosgw-admin: Checking the legality of the parameters (`issue#13018 <http://tracker.ceph.com/issues/13018>`_, `pr#5879 <http://github.com/ceph/ceph/pull/5879>`_, Qiankun Zheng)
+* radosgw-admin: Create --secret-key alias for --secret (`issue#5821 <http://tracker.ceph.com/issues/5821>`_, `pr#5335 <http://github.com/ceph/ceph/pull/5335>`_, Yuan Zhou)
+* radosgw-admin: metadata list user should return an empty list when user pool is empty (`issue#13596 <http://tracker.ceph.com/issues/13596>`_, `pr#6465 <http://github.com/ceph/ceph/pull/6465>`_, Orit Wasserman)
+* rados: new options for write benchmark (`pr#6340 <http://github.com/ceph/ceph/pull/6340>`_, Joaquim Rocha)
+* rbd: fix clone isssue (`issue#13553 <http://tracker.ceph.com/issues/13553>`_, `pr#6334 <http://github.com/ceph/ceph/pull/6334>`_, xinxin shu)
+* rbd: fix init-rbdmap CMDPARAMS (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6109 <http://github.com/ceph/ceph/pull/6109>`_, Sage Weil)
+* rbdmap: systemd support (`issue#13374 <http://tracker.ceph.com/issues/13374>`_, `pr#6479 <http://github.com/ceph/ceph/pull/6479>`_, Boris Ranto)
+* rbd: rbdmap improvements (`pr#6445 <http://github.com/ceph/ceph/pull/6445>`_, Boris Ranto)
+* release-notes: draft v0.94.4 release notes (`pr#5907 <http://github.com/ceph/ceph/pull/5907>`_, Loic Dachary)
+* release-notes: draft v0.94.4 release notes (`pr#6195 <http://github.com/ceph/ceph/pull/6195>`_, Loic Dachary)
+* release-notes: draft v0.94.4 release notes (`pr#6238 <http://github.com/ceph/ceph/pull/6238>`_, Loic Dachary)
+* rgw: add compat header for TEMP_FAILURE_RETRY (`pr#6294 <http://github.com/ceph/ceph/pull/6294>`_, John Coyle)
+* rgw: add default quota config (`pr#6400 <http://github.com/ceph/ceph/pull/6400>`_, Daniel Gryniewicz)
+* rgw: add support for getting Swift's DLO without manifest handling (`pr#6206 <http://github.com/ceph/ceph/pull/6206>`_, Radoslaw Zarzynski)
+* rgw: clarify the error message when trying to create an existed user (`pr#5938 <http://github.com/ceph/ceph/pull/5938>`_, Zeqiang Zhuang)
+* rgw: fix objects can not be displayed which object name does not cont… (`issue#12963 <http://tracker.ceph.com/issues/12963>`_, `pr#5738 <http://github.com/ceph/ceph/pull/5738>`_, Weijun Duan)
+* rgw: fix typo in RGWHTTPClient::process error message (`pr#6424 <http://github.com/ceph/ceph/pull/6424>`_, Brad Hubbard)
+* rgw: fix wrong etag calculation during POST on S3 bucket. (`issue#11241 <http://tracker.ceph.com/issues/11241>`_, `pr#6030 <http://github.com/ceph/ceph/pull/6030>`_, Radoslaw Zarzynski)
+* rgw: mdlog trim add usage prompt (`pr#6059 <http://github.com/ceph/ceph/pull/6059>`_, Weijun Duan)
+* rgw: modify the conditional statement in parse_metadata_key method. (`pr#5875 <http://github.com/ceph/ceph/pull/5875>`_, Zengran Zhang)
+* rgw: refuse to calculate digest when the s3 secret key is empty (`issue#13133 <http://tracker.ceph.com/issues/13133>`_, `pr#6045 <http://github.com/ceph/ceph/pull/6045>`_, Sangdi Xu)
+* rgw: remove extra check in RGWGetObj::execute (`issue#12352 <http://tracker.ceph.com/issues/12352>`_, `pr#5262 <http://github.com/ceph/ceph/pull/5262>`_, Javier M. Mellid)
+* rgw: support core file limit for radosgw daemon (`pr#6346 <http://github.com/ceph/ceph/pull/6346>`_, Guang Yang)
+* rgw: swift use Civetweb ssl can not get right url (`issue#13628 <http://tracker.ceph.com/issues/13628>`_, `pr#6408 <http://github.com/ceph/ceph/pull/6408>`_, Weijun Duan)
+* rocksdb: build with PORTABLE=1 (`pr#6311 <http://github.com/ceph/ceph/pull/6311>`_, Sage Weil)
+* rocksdb: remove rdb source files from dist tarball (`issue#13554 <http://tracker.ceph.com/issues/13554>`_, `pr#6379 <http://github.com/ceph/ceph/pull/6379>`_, Kefu Chai)
+* rocksdb: use native rocksdb makefile (and our autotools) (`pr#6290 <http://github.com/ceph/ceph/pull/6290>`_, Sage Weil)
+* rpm: ceph.spec.in: correctly declare systemd dependency for SLE/openSUSE (`pr#6114 <http://github.com/ceph/ceph/pull/6114>`_, Nathan Cutler)
+* rpm: ceph.spec.in: fix libs-compat / devel-compat conditional (`issue#12315 <http://tracker.ceph.com/issues/12315>`_, `pr#5219 <http://github.com/ceph/ceph/pull/5219>`_, Ken Dreyer)
+* rpm: rhel 5.9 librados compile fix, moved blkid to RBD check/compilation (`issue#13177 <http://tracker.ceph.com/issues/13177>`_, `pr#5954 <http://github.com/ceph/ceph/pull/5954>`_, Rohan Mars)
+* scripts: release_notes can track original issue (`pr#6009 <http://github.com/ceph/ceph/pull/6009>`_, Abhishek Lekshmanan)
+* test/libcephfs/flock: add sys/file.h include for flock operations (`pr#6310 <http://github.com/ceph/ceph/pull/6310>`_, John Coyle)
+* test_rgw_admin: use freopen for output redirection. (`pr#6303 <http://github.com/ceph/ceph/pull/6303>`_, John Coyle)
+* tests: allow docker-test.sh to run under root (`issue#13355 <http://tracker.ceph.com/issues/13355>`_, `pr#6173 <http://github.com/ceph/ceph/pull/6173>`_, Loic Dachary)
+* tests: ceph-disk workunit uses configobj  (`pr#6342 <http://github.com/ceph/ceph/pull/6342>`_, Loic Dachary)
+* tests: destroy testprofile before creating one (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6446 <http://github.com/ceph/ceph/pull/6446>`_, Loic Dachary)
+* tests: port uniqueness reminder (`pr#6387 <http://github.com/ceph/ceph/pull/6387>`_, Loic Dachary)
+* tests: test/librados/test.cc must create profile (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6452 <http://github.com/ceph/ceph/pull/6452>`_, Loic Dachary)
+* tools/cephfs: fix overflow writing header to fixed size buffer (#13816) (`pr#6617 <http://github.com/ceph/ceph/pull/6617>`_, John Spray)
+* tools: ceph-monstore-update-crush: add "--test" when testing crushmap (`pr#6418 <http://github.com/ceph/ceph/pull/6418>`_, Kefu Chai)
+* tools:remove duplicate references (`pr#5917 <http://github.com/ceph/ceph/pull/5917>`_, Bo Cai)
+* vstart: grant full access to Swift testing account (`pr#6239 <http://github.com/ceph/ceph/pull/6239>`_, Yuan Zhou)
+* vstart: set cephfs root uid/gid to caller (`pr#6255 <http://github.com/ceph/ceph/pull/6255>`_, John Spray)
+
+
+v9.2.1 Infernalis
+=================
+
+This Infernalis point release fixes several packagins and init script
+issues, enables the librbd objectmap feature by default, a few librbd
+bugs, and a range of miscellaneous bug fixes across the system.
+
+We recommend that all infernalis v9.2.0 users upgrade.
+
+For more detailed information, see :download:`the complete changelog <changelog/v9.2.1.txt>`.
+
+Upgrading
+---------
+
+* Some symbols wrongly exposed by the C++ interface for librados in
+  v9.1.0 and v9.2.0 were removed.  If you compiled your own
+  application against librados shipped with these releases, it is very
+  likely referencing these removed symbols. So you will need to
+  recompile it.
+
+
+Notable Changes
+---------------
+* build/ops: Ceph daemon failed to start, because the service name was already used. (`issue#13474 <http://tracker.ceph.com/issues/13474>`_, `pr#6833 <http://github.com/ceph/ceph/pull/6833>`_, Chuanhong Wang)
+* build/ops: ceph upstart script rbdmap.conf incorrectly processes parameters (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6396 <http://github.com/ceph/ceph/pull/6396>`_, Sage Weil)
+* build/ops: libunwind package missing on CentOS 7 (`issue#13997 <http://tracker.ceph.com/issues/13997>`_, `pr#6845 <http://github.com/ceph/ceph/pull/6845>`_, Loic Dachary)
+* build/ops: rbd-replay-* moved from ceph-test-dbg to ceph-common-dbg as well (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6628 <http://github.com/ceph/ceph/pull/6628>`_, Loic Dachary)
+* build/ops: systemd/ceph-disk at .service assumes /bin/flock (`issue#13975 <http://tracker.ceph.com/issues/13975>`_, `pr#6852 <http://github.com/ceph/ceph/pull/6852>`_, Loic Dachary)
+* build/ops: systemd: no rbdmap systemd unit file (`issue#13374 <http://tracker.ceph.com/issues/13374>`_, `pr#6500 <http://github.com/ceph/ceph/pull/6500>`_, Boris Ranto)
+* common: auth/cephx: large amounts of log are produced by osd (`issue#13610 <http://tracker.ceph.com/issues/13610>`_, `pr#6836 <http://github.com/ceph/ceph/pull/6836>`_, Qiankun Zheng)
+* common: log: Log.cc: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6993 <http://github.com/ceph/ceph/pull/6993>`_, Brad Hubbard)
+* crush: crash if we see CRUSH_ITEM_NONE in early rule step (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6626 <http://github.com/ceph/ceph/pull/6626>`_, Sage Weil)
+* fs: Ceph file system is not freeing space (`issue#13777 <http://tracker.ceph.com/issues/13777>`_, `pr#7431 <http://github.com/ceph/ceph/pull/7431>`_, Yan, Zheng, John Spray)
+* fs: Ceph-fuse won't start correctly when the option log_max_new in ceph.conf set to zero (`issue#13443 <http://tracker.ceph.com/issues/13443>`_, `pr#6395 <http://github.com/ceph/ceph/pull/6395>`_, Wenjun Huang)
+* fs: Segmentation fault accessing file using fuse mount (`issue#13714 <http://tracker.ceph.com/issues/13714>`_, `pr#6853 <http://github.com/ceph/ceph/pull/6853>`_, Yan, Zheng)
+* librbd: Avoid re-writing old-format image header on resize (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6630 <http://github.com/ceph/ceph/pull/6630>`_, Jason Dillaman)
+* librbd: ImageWatcher shouldn't block the notification thread (`issue#14373 <http://tracker.ceph.com/issues/14373>`_, `pr#7406 <http://github.com/ceph/ceph/pull/7406>`_, Jason Dillaman)
+* librbd: QEMU hangs after creating snapshot and stopping VM (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6632 <http://github.com/ceph/ceph/pull/6632>`_, Jason Dillaman)
+* librbd: Verify self-managed snapshot functionality on image create (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#7080 <http://github.com/ceph/ceph/pull/7080>`_, Jason Dillaman)
+* librbd: [ FAILED ] TestLibRBD.SnapRemoveViaLockOwner (`issue#14164 <http://tracker.ceph.com/issues/14164>`_, `pr#7079 <http://github.com/ceph/ceph/pull/7079>`_, Jason Dillaman)
+* librbd: enable feature objectmap (`issue#13558 <http://tracker.ceph.com/issues/13558>`_, `pr#6477 <http://github.com/ceph/ceph/pull/6477>`_, xinxin shu)
+* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6981 <http://github.com/ceph/ceph/pull/6981>`_, Jason Dillaman)
+* librbd: flattening an rbd image with active IO can lead to hang (`issue#14092 <http://tracker.ceph.com/issues/14092>`_, `issue#14483 <http://tracker.ceph.com/issues/14483>`_, `pr#7484 <http://github.com/ceph/ceph/pull/7484>`_, Jason Dillaman)
+* mds: fix client capabilities during reconnect (client.XXXX isn't responding to mclientcaps warning) (`issue#11482 <http://tracker.ceph.com/issues/11482>`_, `pr#6752 <http://github.com/ceph/ceph/pull/6752>`_, Yan, Zheng)
+* mon: Ceph Pools' MAX AVAIL is 0 if some OSDs' weight is 0 (`issue#13840 <http://tracker.ceph.com/issues/13840>`_, `pr#6907 <http://github.com/ceph/ceph/pull/6907>`_, Chengyuan Li)
+* mon: should not set isvalid = true when cephx_verify_authorizer retur... (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6392 <http://github.com/ceph/ceph/pull/6392>`_, Ruifeng Yang)
+* objecter: pool op callback may hang forever. (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6627 <http://github.com/ceph/ceph/pull/6627>`_, xie xingguo)
+* objecter: potential null pointer access when do pool_snap_list. (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6840 <http://github.com/ceph/ceph/pull/6840>`_, xie xingguo)
+* osd: FileStore: potential memory leak if getattrs fails. (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6846 <http://github.com/ceph/ceph/pull/6846>`_, xie xingguo)
+* osd: OSD::build_past_intervals_parallel() shall reset primary and up_primary when begin a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6397 <http://github.com/ceph/ceph/pull/6397>`_, xiexingguo)
+* osd: call on_new_interval on newly split child PG (`issue#13962 <http://tracker.ceph.com/issues/13962>`_, `pr#6849 <http://github.com/ceph/ceph/pull/6849>`_, Sage Weil)
+* osd: ceph-disk list fails on /dev/cciss!c0d0 (`issue#13970 <http://tracker.ceph.com/issues/13970>`_, `issue#14230 <http://tracker.ceph.com/issues/14230>`_, `pr#6880 <http://github.com/ceph/ceph/pull/6880>`_, Loic Dachary)
+* osd: ceph-disk: use blkid instead of sgdisk -i (`issue#14080 <http://tracker.ceph.com/issues/14080>`_, `pr#7001 <http://github.com/ceph/ceph/pull/7001>`_, Loic Dachary, Ilya Dryomov)
+* osd: fix race condition during send_failures (`issue#13821 <http://tracker.ceph.com/issues/13821>`_, `pr#6694 <http://github.com/ceph/ceph/pull/6694>`_, Sage Weil)
+* osd: osd/PG.cc: 288: FAILED assert(info.last_epoch_started >= info.history.last_epoch_started) (`issue#14015 <http://tracker.ceph.com/issues/14015>`_, `pr#6851 <http://github.com/ceph/ceph/pull/6851>`_, David Zafman)
+* osd: pgs stuck inconsistent after infernalis upgrade (`issue#13862 <http://tracker.ceph.com/issues/13862>`_, `pr#7421 <http://github.com/ceph/ceph/pull/7421>`_, David Zafman)
+* rbd: TaskFinisher::cancel should remove event from SafeTimer (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7426 <http://github.com/ceph/ceph/pull/7426>`_, Douglas Fuller)
+* rbd: cls_rbd: object_map_save should enable checksums (`issue#14280 <http://tracker.ceph.com/issues/14280>`_, `pr#7428 <http://github.com/ceph/ceph/pull/7428>`_, Douglas Fuller)
+* rbd: misdirected op in rbd balance-reads test (`issue#13491 <http://tracker.ceph.com/issues/13491>`_, `pr#6629 <http://github.com/ceph/ceph/pull/6629>`_, Jason Dillaman)
+* rbd: pure virtual method called (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6633 <http://github.com/ceph/ceph/pull/6633>`_, Jason Dillaman)
+* rbd: rbd clone issue (`issue#13553 <http://tracker.ceph.com/issues/13553>`_, `pr#6474 <http://github.com/ceph/ceph/pull/6474>`_, xinxin shu)
+* rbd: rbd-replay does not check for EOF and goes to endless loop (`issue#14452 <http://tracker.ceph.com/issues/14452>`_, `pr#7427 <http://github.com/ceph/ceph/pull/7427>`_, Mykola Golub)
+* rbd: unknown argument --quiet in udevadm settle (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6634 <http://github.com/ceph/ceph/pull/6634>`_, Jason Dillaman)
+* rgw: init script reload doesn't work on EL7 (`issue#13709 <http://tracker.ceph.com/issues/13709>`_, `pr#6650 <http://github.com/ceph/ceph/pull/6650>`_, Hervé Rousseau)
+* rgw: radosgw-admin --help doesn't show the orphans find command (`issue#14516 <http://tracker.ceph.com/issues/14516>`_, `pr#7543 <http://github.com/ceph/ceph/pull/7543>`_, Yehuda Sadeh)
+* tests: ceph-disk workunit uses configobj (`issue#14004 <http://tracker.ceph.com/issues/14004>`_, `pr#6828 <http://github.com/ceph/ceph/pull/6828>`_, Loic Dachary)
+* tests: fsx failed to compile (`issue#14384 <http://tracker.ceph.com/issues/14384>`_, `pr#7429 <http://github.com/ceph/ceph/pull/7429>`_, Greg Farnum)
+* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7225 <http://github.com/ceph/ceph/pull/7225>`_, Jason Dillaman)
+* tests: rebuild exclusive lock test should acquire exclusive lock (`issue#14121 <http://tracker.ceph.com/issues/14121>`_, `pr#7038 <http://github.com/ceph/ceph/pull/7038>`_, Jason Dillaman)
+* tests: testprofile must be removed before it is re-created (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6449 <http://github.com/ceph/ceph/pull/6449>`_, Loic Dachary)
+* tests: verify it is possible to reuse an OSD id (`issue#13988 <http://tracker.ceph.com/issues/13988>`_, `pr#6882 <http://github.com/ceph/ceph/pull/6882>`_, Loic Dachary)
+
+v9.2.0 Infernalis
+=================
+
+This major release will be the foundation for the next stable series.
+There have been some major changes since v0.94.x Hammer, and the
+upgrade process is non-trivial.  Please read these release notes carefully.
+
+Major Changes from Hammer
+-------------------------
+
+- *General*:
+
+  * Ceph daemons are now managed via systemd (with the exception of
+    Ubuntu Trusty, which still uses upstart).
+  * Ceph daemons run as 'ceph' user instead root.
+  * On Red Hat distros, there is also an SELinux policy.
+
+- *RADOS*:
+
+  * The RADOS cache tier can now proxy write operations to the base
+    tier, allowing writes to be handled without forcing migration of
+    an object into the cache.
+  * The SHEC erasure coding support is no longer flagged as
+    experimental. SHEC trades some additional storage space for faster
+    repair.
+  * There is now a unified queue (and thus prioritization) of client
+    IO, recovery, scrubbing, and snapshot trimming.
+  * There have been many improvements to low-level repair tooling
+    (ceph-objectstore-tool).
+  * The internal ObjectStore API has been significantly cleaned up in order
+    to faciliate new storage backends like NewStore.
+
+- *RGW*:
+
+  * The Swift API now supports object expiration.
+  * There are many Swift API compatibility improvements.
+
+- *RBD*:
+
+  * The ``rbd du`` command shows actual usage (quickly, when
+    object-map is enabled).
+  * The object-map feature has seen many stability improvements.
+  * Object-map and exclusive-lock features can be enabled or disabled
+    dynamically.
+  * You can now store user metadata and set persistent librbd options
+    associated with individual images.
+  * The new deep-flatten features allows flattening of a clone and all
+    of its snapshots.  (Previously snapshots could not be flattened.)
+  * The export-diff command command is now faster (it uses aio).  There is also
+    a new fast-diff feature.
+  * The --size argument can be specified with a suffix for units
+    (e.g., ``--size 64G``).
+  * There is a new ``rbd status`` command that, for now, shows who has
+    the image open/mapped.
+
+- *CephFS*:
+
+  * You can now rename snapshots.
+  * There have been ongoing improvements around administration, diagnostics,
+    and the check and repair tools.
+  * The caching and revocation of client cache state due to unused
+    inodes has been dramatically improved.
+  * The ceph-fuse client behaves better on 32-bit hosts.
+
+Distro compatibility
+--------------------
+
+We have decided to drop support for many older distributions so that we can
+move to a newer compiler toolchain (e.g., C++11).  Although it is still possible
+to build Ceph on older distributions by installing backported development tools,
+we are not building and publishing release packages for ceph.com.
+
+We now build packages for:
+
+* CentOS 7 or later.  We have dropped support for CentOS 6 (and other
+  RHEL 6 derivatives, like Scientific Linux 6).
+* Debian Jessie 8.x or later.  Debian Wheezy 7.x's g++ has incomplete
+  support for C++11 (and no systemd).
+* Ubuntu Trusty 14.04 or later.  Ubuntu Precise 12.04 is no longer
+  supported.
+* Fedora 22 or later.
+
+Upgrading from Firefly
+----------------------
+
+Upgrading directly from Firefly v0.80.z is not recommended.  It is
+possible to do a direct upgrade, but not without downtime.  We
+recommend that clusters are first upgraded to Hammer v0.94.4 or a
+later v0.94.z release; only then is it possible to upgrade to
+Infernalis 9.2.z for an online upgrade (see below).
+
+To do an offline upgrade directly from Firefly, all Firefly OSDs must
+be stopped and marked down before any Infernalis OSDs will be allowed
+to start up.  This fencing is enforced by the Infernalis monitor, so
+use an upgrade procedure like:
+
+#. Upgrade Ceph on monitor hosts
+#. Restart all ceph-mon daemons
+#. Upgrade Ceph on all OSD hosts
+#. Stop all ceph-osd daemons
+#. Mark all OSDs down with something like::
+
+     ceph osd down `seq 0 1000`
+
+#. Start all ceph-osd daemons
+#. Upgrade and restart remaining daemons (ceph-mds, radosgw)
+
+Upgrading from Hammer
+---------------------
+
+* All cluster nodes must first upgrade to Hammer v0.94.4 or a later v0.94.z release; only
+  then is it possible to upgrade to Infernalis 9.2.z.
+
+* For all distributions that support systemd (CentOS 7, Fedora, Debian
+  Jessie 8.x, OpenSUSE), ceph daemons are now managed using native systemd
+  files instead of the legacy sysvinit scripts.  For example,::
+
+    systemctl start ceph.target       # start all daemons
+    systemctl status ceph-osd at 12      # check status of osd.12
+
+  The main notable distro that is *not* yet using systemd is Ubuntu trusty
+  14.04.  (The next Ubuntu LTS, 16.04, will use systemd instead of upstart.)
+
+* Ceph daemons now run as user and group ``ceph`` by default.  The
+  ceph user has a static UID assigned by Fedora and Debian (also used
+  by derivative distributions like RHEL/CentOS and Ubuntu).  On SUSE
+  the ceph user will currently get a dynamically assigned UID when the
+  user is created.
+
+  If your systems already have a ceph user, upgrading the package will cause
+  problems.  We suggest you first remove or rename the existing 'ceph' user
+  and 'ceph' group before upgrading.
+
+  When upgrading, administrators have two options:
+
+   #. Add the following line to ``ceph.conf`` on all hosts::
+
+        setuser match path = /var/lib/ceph/$type/$cluster-$id
+
+      This will make the Ceph daemons run as root (i.e., not drop
+      privileges and switch to user ceph) if the daemon's data
+      directory is still owned by root.  Newly deployed daemons will
+      be created with data owned by user ceph and will run with
+      reduced privileges, but upgraded daemons will continue to run as
+      root.
+
+   #. Fix the data ownership during the upgrade.  This is the
+      preferred option, but it is more work and can be very time
+      consuming.  The process for each host is to:
+
+      #. Upgrade the ceph package.  This creates the ceph user and group.  For
+	 example::
+
+	   ceph-deploy install --stable infernalis HOST
+
+      #. Stop the daemon(s).::
+
+	   service ceph stop           # fedora, centos, rhel, debian
+	   stop ceph-all               # ubuntu
+
+      #. Fix the ownership::
+
+	   chown -R ceph:ceph /var/lib/ceph
+
+      #. Restart the daemon(s).::
+
+	   start ceph-all                # ubuntu
+	   systemctl start ceph.target   # debian, centos, fedora, rhel
+
+      Alternatively, the same process can be done with a single daemon
+      type, for example by stopping only monitors and chowning only
+      ``/var/lib/ceph/mon``.
+
+* The on-disk format for the experimental KeyValueStore OSD backend has
+  changed.  You will need to remove any OSDs using that backend before you
+  upgrade any test clusters that use it.
+
+* When a pool quota is reached, librados operations now block indefinitely,
+  the same way they do when the cluster fills up.  (Previously they would return
+  -ENOSPC).  By default, a full cluster or pool will now block.  If your
+  librados application can handle ENOSPC or EDQUOT errors gracefully, you can
+  get error returns instead by using the new librados OPERATION_FULL_TRY flag.
+
+* The return code for librbd's rbd_aio_read and Image::aio_read API methods no
+  longer returns the number of bytes read upon success.  Instead, it returns 0
+  upon success and a negative value upon failure.
+
+* 'ceph scrub', 'ceph compact' and 'ceph sync force are now DEPRECATED.  Users
+  should instead use 'ceph mon scrub', 'ceph mon compact' and
+  'ceph mon sync force'.
+
+* 'ceph mon_metadata' should now be used as 'ceph mon metadata'. There is no
+  need to deprecate this command (same major release since it was first
+  introduced).
+
+* The `--dump-json` option of "osdmaptool" is replaced by `--dump json`.
+
+* The commands of "pg ls-by-{pool,primary,osd}" and "pg ls" now take "recovering"
+  instead of "recovery", to include the recovering pgs in the listed pgs.
+
+Notable Changes since Hammer
+----------------------------
+
+* aarch64: add optimized version of crc32c (Yazen Ghannam, Steve Capper)
+* auth: cache/reuse crypto lib key objects, optimize msg signature check (Sage Weil)
+* auth: reinit NSS after fork() (#11128 Yan, Zheng)
+* autotools: fix out of tree build (Krxysztof Kosinski)
+* autotools: improve make check output (Loic Dachary)
+* buffer: add invalidate_crc() (Piotr Dalek)
+* buffer: fix zero bug (#12252 Haomai Wang)
+* buffer: some cleanup (Michal Jarzabek)
+* build: allow tcmalloc-minimal (Thorsten Behrens)
+* build: C++11 now supported
+* build: cmake: fix nss linking (Danny Al-Gaaf)
+* build: cmake: misc fixes (Orit Wasserman, Casey Bodley)
+* build: disable LTTNG by default (#11333 Josh Durgin)
+* build: do not build ceph-dencoder with tcmalloc (#10691 Boris Ranto)
+* build: fix junit detection on Fedora 22 (Ira Cooper)
+* build: fix pg ref disabling (William A. Kennington III)
+* build: fix ppc build (James Page)
+* build: install-deps: misc fixes (Loic Dachary)
+* build: install-deps.sh improvements (Loic Dachary)
+* build: install-deps: support OpenSUSE (Loic Dachary)
+* build: make_dist_tarball.sh (Sage Weil)
+* build: many cmake improvements
+* build: misc cmake fixes (Matt Benjamin)
+* build: misc fixes (Boris Ranto, Ken Dreyer, Owen Synge)
+* build: OSX build fixes (Yan, Zheng)
+* build: remove rest-bench
+* ceph-authtool: fix return code on error (Gerhard Muntingh)
+* ceph-detect-init: added Linux Mint (Michal Jarzabek)
+* ceph-detect-init: robust init system detection (Owen Synge)
+* ceph-disk: ensure 'zap' only operates on a full disk (#11272 Loic Dachary)
+* ceph-disk: fix zap sgdisk invocation (Owen Synge, Thorsten Behrens)
+* ceph-disk: follow ceph-osd hints when creating journal (#9580 Sage Weil)
+* ceph-disk: handle re-using existing partition (#10987 Loic Dachary)
+* ceph-disk: improve parted output parsing (#10983 Loic Dachary)
+* ceph-disk: install pip > 6.1 (#11952 Loic Dachary)
+* ceph-disk: make suppression work for activate-all and activate-journal (Dan van der Ster)
+* ceph-disk: many fixes (Loic Dachary, Alfredo Deza)
+* ceph-disk: fixes to respect init system (Loic Dachary, Owen Synge)
+* ceph-disk: pass --cluster arg on prepare subcommand (Kefu Chai)
+* ceph-disk: support for multipath devices (Loic Dachary)
+* ceph-disk: support NVMe device partitions (#11612 Ilja Slepnev)
+* ceph: fix 'df' units (Zhe Zhang)
+* ceph: fix parsing in interactive cli mode (#11279 Kefu Chai)
+* cephfs-data-scan: many additions, improvements (John Spray)
+* ceph-fuse: do not require successful remount when unmounting (#10982 Greg Farnum)
+* ceph-fuse, libcephfs: don't clear COMPLETE when trimming null (Yan, Zheng)
+* ceph-fuse, libcephfs: drop inode when rmdir finishes (#11339 Yan, Zheng)
+* ceph-fuse,libcephfs: fix uninline (#11356 Yan, Zheng)
+* ceph-fuse, libcephfs: hold exclusive caps on dirs we "own" (#11226 Greg Farnum)
+* ceph-fuse: mostly behave on 32-bit hosts (Yan, Zheng)
+* ceph: improve error output for 'tell' (#11101 Kefu Chai)
+* ceph-monstore-tool: fix store-copy (Huangjun)
+* ceph: new 'ceph daemonperf' command (John Spray, Mykola Golub)
+* ceph-objectstore-tool: many many improvements (David Zafman)
+* ceph-objectstore-tool: refactoring and cleanup (John Spray)
+* ceph-post-file: misc fixes (Joey McDonald, Sage Weil)
+* ceph_test_rados: test pipelined reads (Zhiqiang Wang)
+* client: avoid sending unnecessary FLUSHSNAP messages (Yan, Zheng)
+* client: exclude setfilelock when calculating oldest tid (Yan, Zheng)
+* client: fix error handling in check_pool_perm (John Spray)
+* client: fsync waits only for inode's caps to flush (Yan, Zheng)
+* client: invalidate kernel dcache when cache size exceeds limits (Yan, Zheng)
+* client: make fsync wait for unsafe dir operations (Yan, Zheng)
+* client: pin lookup dentry to avoid inode being freed (Yan, Zheng)
+* common: add descriptions to perfcounters (Kiseleva Alyona)
+* common: add perf counter descriptions (Alyona Kiseleva)
+* common: bufferlist performance tuning (Piotr Dalek, Sage Weil)
+* common: detect overflow of int config values (#11484 Kefu Chai)
+* common: fix bit_vector extent calc (#12611 Jason Dillaman)
+* common: fix json parsing of utf8 (#7387 Tim Serong)
+* common: fix leak of pthread_mutexattr (#11762 Ketor Meng)
+* common: fix LTTNG vs fork issue (Josh Durgin)
+* common: fix throttle max change (Henry Chang)
+* common: make mutex more efficient
+* common: make work queue addition/removal thread safe (#12662 Jason Dillaman)
+* common: optracker improvements (Zhiqiang Wang, Jianpeng Ma)
+* common: PriorityQueue tests (Kefu Chai)
+* common: some async compression infrastructure (Haomai Wang)
+* crush: add --check to validate dangling names, max osd id (Kefu Chai)
+* crush: cleanup, sync with kernel (Ilya Dryomov)
+* crush: fix crash from invalid 'take' argument (#11602 Shiva Rkreddy, Sage Weil)
+* crush: fix divide-by-2 in straw2 (#11357 Yann Dupont, Sage Weil)
+* crush: fix has_v4_buckets (#11364 Sage Weil)
+* crush: fix subtree base weight on adjust_subtree_weight (#11855 Sage Weil)
+* crush: respect default replicated ruleset config on map creation (Ilya Dryomov)
+* crushtool: fix order of operations, usage (Sage Weil)
+* crypto: fix NSS leak (Jason Dillaman)
+* crypto: fix unbalanced init/shutdown (#12598 Zheng Yan)
+* deb: fix rest-bench-dbg and ceph-test-dbg dependendies (Ken Dreyer)
+* debian: minor package reorg (Ken Dreyer)
+* deb, rpm: move ceph-objectstore-tool to ceph (Ken Dreyer)
+* doc: docuemnt object corpus generation (#11099 Alexis Normand)
+* doc: document region hostnames (Robin H. Johnson)
+* doc: fix gender neutrality (Alexandre Maragone)
+* doc: fix install doc (#10957 Kefu Chai)
+* doc: fix sphinx issues (Kefu Chai)
+* doc: man page updates (Kefu Chai)
+* doc: mds data structure docs (Yan, Zheng)
+* doc: misc updates (Fracois Lafont, Ken Dreyer, Kefu Chai, Owen Synge, Gael Fenet-Garde, Loic Dachary, Yannick Atchy-Dalama, Jiaying Ren, Kevin Caradant, Robert Maxime, Nicolas Yong, Germain Chipaux, Arthur Gorjux, Gabriel Sentucq, Clement Lebrun, Jean-Remi Deveaux, Clair Massot, Robin Tang, Thomas Laumondais, Jordan Dorne, Yuan Zhou, Valentin Thomas, Pierre Chaumont, Benjamin Troquereau, Benjamin Sesia, Vikhyat Umrao, Nilamdyuti Goswami, Vartika Rai, Florian Haas, Loic Dachary, Simon G [...]
+* doc: swift tempurls (#10184 Abhishek Lekshmanan)
+* doc: switch doxygen integration back to breathe (#6115 Kefu Chai)
+* doc: update release schedule docs (Loic Dachary)
+* erasure-code: cleanup (Kefu Chai)
+* erasure-code: improve tests (Loic Dachary)
+* erasure-code: shec: fix recovery bugs (Takanori Nakao, Shotaro Kawaguchi)
+* erasure-code: update ISA-L to 2.13 (Yuan Zhou)
+* gmock: switch to submodule (Danny Al-Gaaf, Loic Dachary)
+* hadoop: add terasort test (Noah Watkins)
+* init-radosgw: merge with sysv version; fix enumeration (Sage Weil)
+* java: fix libcephfs bindings (Noah Watkins)
+* libcephfs: add pread, pwrite (Jevon Qiao)
+* libcephfs,ceph-fuse: cache cleanup (Zheng Yan)
+* libcephfs,ceph-fuse: fix request resend on cap reconnect (#10912 Yan, Zheng)
+* librados: add config observer (Alistair Strachan)
+* librados: add FULL_TRY and FULL_FORCE flags for dealing with full clusters or pools (Sage Weil)
+* librados: add src_fadvise_flags for copy-from (Jianpeng Ma)
+* librados: define C++ flags from C constants (Josh Durgin)
+* librados: fadvise flags per op (Jianpeng Ma)
+* librados: fix last_force_resent handling (#11026 Jianpeng Ma)
+* librados: fix memory leak from C_TwoContexts (Xiong Yiliang)
+* librados: fix notify completion race (#13114 Sage Weil)
+* librados: fix striper when stripe_count = 1 and stripe_unit != object_size (#11120 Yan, Zheng)
+* librados, libcephfs: randomize client nonces (Josh Durgin)
+* librados: op perf counters (John Spray)
+* librados: pybind: fix binary omap values (Robin H. Johnson)
+* librados: pybind: fix write() method return code (Javier Guerra)
+* librados: respect default_crush_ruleset on pool_create (#11640 Yuan Zhou)
+* libradosstriper: fix leak (Danny Al-Gaaf)
+* librbd: add const for single-client-only features (Josh Durgin)
+* librbd: add deep-flatten operation (Jason Dillaman)
+* librbd: add purge_on_error cache behavior (Jianpeng Ma)
+* librbd: allow additional metadata to be stored with the image (Haomai Wang)
+* librbd: avoid blocking aio API methods (#11056 Jason Dillaman)
+* librbd: better handling for dup flatten requests (#11370 Jason Dillaman)
+* librbd: cancel in-flight ops on watch error (#11363 Jason Dillaman)
+* librbd: default new images to format 2 (#11348 Jason Dillaman)
+* librbd: fadvise for copy, export, import (Jianpeng Ma)
+* librbd: fast diff implementation that leverages object map (Jason Dillaman)
+* librbd: fix fast diff bugs (#11553 Jason Dillaman)
+* librbd: fix image format detection (Zhiqiang Wang)
+* librbd: fix lock ordering issue (#11577 Jason Dillaman)
+* librbd: fix reads larger than the cache size (Lu Shi)
+* librbd: fix snapshot creation when other snap is active (#11475 Jason Dillaman)
+* librbd: flatten/copyup fixes (Jason Dillaman)
+* librbd: handle NOCACHE fadvise flag (Jinapeng Ma)
+* librbd: lockdep, helgrind validation (Jason Dillaman, Josh Durgin)
+* librbd: metadata filter fixes (Haomai Wang)
+* librbd: misc aio fixes (#5488 Jason Dillaman)
+* librbd: misc rbd fixes (#11478 #11113 #11342 #11380 Jason Dillaman, Zhiqiang Wang)
+* librbd: new diff_iterate2 API (Jason Dillaman)
+* librbd: object map rebuild support (Jason Dillaman)
+* librbd: only update image flags while hold exclusive lock (#11791 Jason Dillaman)
+* librbd: optionally disable allocation hint (Haomai Wang)
+* librbd: prevent race between resize requests (#12664 Jason Dillaman)
+* librbd: readahead fixes (Zhiqiang Wang)
+* librbd: return result code from close (#12069 Jason Dillaman)
+* librbd: store metadata, including config options, in image (Haomai Wang)
+* librbd: tolerate old osds when getting image metadata (#11549 Jason Dillaman)
+* librbd: use write_full when possible (Zhiqiang Wang)
+* log: fix data corruption race resulting from log rotation (#12465 Samuel Just)
+* logrotate.d: prefer service over invoke-rc.d (#11330 Win Hierman, Sage Weil)
+* mds: add 'damaged' state to MDSMap (John Spray)
+* mds: add nicknames for perfcounters (John Spray)
+* mds: avoid emitting cap warnigns before evicting session (John Spray)
+* mds: avoid getting stuck in XLOCKDONE (#11254 Yan, Zheng)
+* mds: disable problematic rstat propagation into snap parents (Yan, Zheng)
+* mds: do not add snapped items to bloom filter (Yan, Zheng)
+* mds: expose frags via asok (John Spray)
+* mds: fix expected holes in journal objects (#13167 Yan, Zheng)
+* mds: fix handling for missing mydir dirfrag (#11641 John Spray)
+* mds: fix integer truncateion on large client ids (Henry Chang)
+* mds: fix mydir replica issue with shutdown (#10743 John Spray)
+* mds: fix out-of-order messages (#11258 Yan, Zheng)
+* mds: fix rejoin (Yan, Zheng)
+* mds: fix setting entire file layout in one setxattr (John Spray)
+* mds: fix shutdown (John Spray)
+* mds: fix shutdown with strays (#10744 John Spray)
+* mds: fix SnapServer crash on deleted pool (John Spray)
+* mds: fix snapshot bugs (Yan, Zheng)
+* mds: fix stray reintegration (Yan, Zheng)
+* mds: fix stray handling (John Spray)
+* mds: fix suicide beacon (John Spray)
+* mds: flush immediately in do_open_truncate (#11011 John Spray)
+* mds: handle misc corruption issues (John Spray)
+* mds: improve dump methods (John Spray)
+* mds: many fixes (Yan, Zheng, John Spray, Greg Farnum)
+* mds: many snapshot and stray fixes (Yan, Zheng)
+* mds: misc fixes (Jianpeng Ma, Dan van der Ster, Zhang Zhi)
+* mds: misc journal cleanups and fixes (#10368 John Spray)
+* mds: misc repair improvements (John Spray)
+* mds: misc snap fixes (Zheng Yan)
+* mds: misc snapshot fixes (Yan, Zheng)
+* mds: new SessionMap storage using omap (#10649 John Spray)
+* mds: persist completed_requests reliably (#11048 John Spray)
+* mds: reduce memory consumption (Yan, Zheng)
+* mds: respawn instead of suicide on blacklist (John Spray)
+* mds: separate safe_pos in Journaler (#10368 John Spray)
+* mds: snapshot rename support (#3645 Yan, Zheng)
+* mds: store layout on header object (#4161 John Spray)
+* mds: throttle purge stray operations (#10390 John Spray)
+* mds: tolerate clock jumping backwards (#11053 Yan, Zheng)
+* mds: warn when clients fail to advance oldest_client_tid (#10657 Yan, Zheng)
+* misc cleanups and fixes (Danny Al-Gaaf)
+* misc coverity fixes (Danny Al-Gaaf)
+* misc performance and cleanup (Nathan Cutler, Xinxin Shu)
+* mon: add cache over MonitorDBStore (Kefu Chai)
+* mon: add 'mon_metadata <id>' command (Kefu Chai)
+* mon: add 'node ls ...' command (Kefu Chai)
+* mon: add NOFORWARD, OBSOLETE, DEPRECATE flags for mon commands (Joao Eduardo Luis)
+* mon: add PG count to 'ceph osd df' output (Michal Jarzabek)
+* mon: 'ceph osd metadata' can dump all osds (Haomai Wang)
+* mon: clean up, reorg some mon commands (Joao Eduardo Luis)
+* monclient: flush_log (John Spray)
+* mon: detect kv backend failures (Sage Weil)
+* mon: disallow >2 tiers (#11840 Kefu Chai)
+* mon: disallow ec pools as tiers (#11650 Samuel Just)
+* mon: do not deactivate last mds (#10862 John Spray)
+* mon: fix average utilization calc for 'osd df' (Mykola Golub)
+* mon: fix CRUSH map test for new pools (Sage Weil)
+* mon: fix log dump crash when debugging (Mykola Golub)
+* mon: fix mds beacon replies (#11590 Kefu Chai)
+* mon: fix metadata update race (Mykola Golub)
+* mon: fix min_last_epoch_clean tracking (Kefu Chai)
+* mon: fix 'pg ls' sort order, state names (#11569 Kefu Chai)
+* mon: fix refresh (#11470 Joao Eduardo Luis)
+* mon: fix variance calc in 'osd df' (Sage Weil)
+* mon: improve callout to crushtool (Mykola Golub)
+* mon: make blocked op messages more readable (Jianpeng Ma)
+* mon: make osd get pool 'all' only return applicable fields (#10891 Michal Jarzabek)
+* mon: misc scaling fixes (Sage Weil)
+* mon: normalize erasure-code profile for storage and comparison (Loic Dachary)
+* mon: only send mon metadata to supporting peers (Sage Weil)
+* mon: optionally specify osd id on 'osd create' (Mykola Golub)
+* mon: 'osd tree' fixes (Kefu Chai)
+* mon: periodic background scrub (Joao Eduardo Luis)
+* mon: prevent bucket deletion when referenced by a crush rule (#11602 Sage Weil)
+* mon: prevent pgp_num > pg_num (#12025 Xinxin Shu)
+* mon: prevent pool with snapshot state from being used as a tier (#11493 Sage Weil)
+* mon: prime pg_temp when CRUSH map changes (Sage Weil)
+* mon: refine check_remove_tier checks (#11504 John Spray)
+* mon: reject large max_mds values (#12222 John Spray)
+* mon: remove spurious who arg from 'mds rm ...' (John Spray)
+* mon: streamline session handling, fix memory leaks (Sage Weil)
+* mon: upgrades must pass through hammer (Sage Weil)
+* mon: warn on bogus cache tier config (Jianpeng Ma)
+* msgr: add ceph_perf_msgr tool (Hoamai Wang)
+* msgr: async: fix seq handling (Haomai Wang)
+* msgr: async: many many fixes (Haomai Wang)
+* msgr: simple: fix clear_pipe (#11381 Haomai Wang)
+* msgr: simple: fix connect_seq assert (Haomai Wang)
+* msgr: xio: fastpath improvements (Raju Kurunkad)
+* msgr: xio: fix ip and nonce (Raju Kurunkad)
+* msgr: xio: improve lane assignment (Vu Pham)
+* msgr: xio: sync with accellio v1.4 (Vu Pham)
+* msgr: xio: misc fixes (#10735 Matt Benjamin, Kefu Chai, Danny Al-Gaaf, Raju Kurunkad, Vu Pham, Casey Bodley)
+* msg: unit tests (Haomai Wang)
+* objectcacher: misc bug fixes (Jianpeng Ma)
+* osd: add latency perf counters for tier operations (Xinze Chi)
+* osd: add misc perfcounters (Xinze Chi)
+* osd: add simple sleep injection in recovery (Sage Weil)
+* osd: allow SEEK_HOLE/SEEK_DATA for sparse read (Zhiqiang Wang)
+* osd: avoid dup omap sets for in pg metadata (Sage Weil)
+* osd: avoid multiple hit set insertions (Zhiqiang Wang)
+* osd: avoid transaction append in some cases (Sage Weil)
+* osd: break PG removal into multiple iterations (#10198 Guang Yang)
+* osd: cache proxy-write support (Zhiqiang Wang, Samuel Just)
+* osd: check scrub state when handling map (Jianpeng Ma)
+* osd: clean up some constness, privateness (Kefu Chai)
+* osd: clean up temp object if promotion fails (Jianpeng Ma)
+* osd: configure promotion based on write recency (Zhiqiang Wang)
+* osd: constrain collections to meta and PGs (normal and temp) (Sage Weil)
+* osd: don't send dup MMonGetOSDMap requests (Sage Weil, Kefu Chai)
+* osd: EIO injection (David Zhang)
+* osd: elminiate txn apend, ECSubWrite copy (Samuel Just)
+* osd: erasure-code: drop entries according to LRU (Andreas-Joachim Peters)
+* osd: erasure-code: fix SHEC floating point bug (#12936 Loic Dachary)
+* osd: erasure-code: update to ISA-L 2.14 (Yuan Zhou)
+* osd: filejournal: cleanup (David Zafman)
+* osd: filestore: clone using splice (Jianpeng Ma)
+* osd: filestore: fix recursive lock (Xinxin Shu)
+* osd: fix check_for_full (Henry Chang)
+* osd: fix dirty accounting in make_writeable (Zhiqiang Wang)
+* osd: fix dup promotion lost op bug (Zhiqiang Wang)
+* osd: fix endless repair when object is unrecoverable (Jianpeng Ma, Kefu Chai)
+* osd: fix hitset object naming to use GMT (Kefu Chai)
+* osd: fix misc memory leaks (Sage Weil)
+* osd: fix negative degraded stats during backfill (Guang Yang)
+* osd: fix osdmap dump of blacklist items (John Spray)
+* osd: fix peek_queue locking in FileStore (Xinze Chi)
+* osd: fix pg resurrection (#11429 Samuel Just)
+* osd: fix promotion vs full cache tier (Samuel Just)
+* osd: fix replay requeue when pg is still activating (#13116 Samuel Just)
+* osd: fix scrub stat bugs (Sage Weil, Samuel Just)
+* osd: fix snap flushing from cache tier (again) (#11787 Samuel Just)
+* osd: fix snap handling on promotion (#11296 Sam Just)
+* osd: fix temp-clearing (David Zafman)
+* osd: force promotion for ops EC can't handle (Zhiqiang Wang)
+* osd: handle log split with overlapping entries (#11358 Samuel Just)
+* osd: ignore non-existent osds in unfound calc (#10976 Mykola Golub)
+* osd: improve behavior on machines with large memory pages (Steve Capper)
+* osd: include a temp namespace within each collection/pgid (Sage Weil)
+* osd: increase default max open files (Owen Synge)
+* osd: keyvaluestore: misc fixes (Varada Kari)
+* osd: low and high speed flush modes (Mingxin Liu)
+* osd: make suicide timeouts individually configurable (Samuel Just)
+* osd: merge multiple setattr calls into a setattrs call (Xinxin Shu)
+* osd: misc fixes (Ning Yao, Kefu Chai, Xinze Chi, Zhiqiang Wang, Jianpeng Ma)
+* osd: move scrub in OpWQ (Samuel Just)
+* osd: newstore prototype (Sage Weil)
+* osd: ObjectStore internal API refactor (Sage Weil)
+* osd: peer_features includes self (David Zafman)
+* osd: pool size change triggers new interval (#11771 Samuel Just)
+* osd: prepopulate needs_recovery_map when only one peer has missing (#9558 Guang Yang)
+* osd: randomize scrub times (#10973 Kefu Chai)
+* osd: recovery, peering fixes (#11687 Samuel Just)
+* osd: refactor scrub and digest recording (Sage Weil)
+* osd: refuse first write to EC object at non-zero offset (Jianpeng Ma)
+* osd: relax reply order on proxy read (#11211 Zhiqiang Wang)
+* osd: require firefly features (David Zafman)
+* osd: set initial crush weight with more precision (Sage Weil)
+* osd: SHEC no longer experimental
+* osd: skip promotion for flush/evict op (Zhiqiang Wang)
+* osd: stripe over small xattrs to fit in XFS's 255 byte inline limit (Sage Weil, Ning Yao)
+* osd: sync object_map on syncfs (Samuel Just)
+* osd: take excl lock of op is rw (Samuel Just)
+* osd: throttle evict ops (Yunchuan Wen)
+* osd: upgrades must pass through hammer (Sage Weil)
+* osd: use a temp object for recovery (Sage Weil)
+* osd: use blkid to collection partition information (Joseph Handzik)
+* osd: use SEEK_HOLE / SEEK_DATA for sparse copy (Xinxin Shu)
+* osd: WBThrottle cleanups (Jianpeng Ma)
+* osd: write journal header on clean shutdown (Xinze Chi)
+* osdc/Objecter: allow per-pool calls to op_cancel_writes (John Spray)
+* os/filestore: enlarge getxattr buffer size (Jianpeng Ma)
+* pybind: pep8 cleanups (Danny Al-Gaaf)
+* pycephfs: many fixes for bindings (Haomai Wang)
+* qa: fix filelock_interrupt.py test (Yan, Zheng)
+* qa: improve ceph-disk tests (Loic Dachary)
+* qa: improve docker build layers (Loic Dachary)
+* qa: run-make-check.sh script (Loic Dachary)
+* rados: add --striper option to use libradosstriper (#10759 Sebastien Ponce)
+* rados: bench: add --no-verify option to improve performance (Piotr Dalek)
+* rados bench: misc fixes (Dmitry Yatsushkevich)
+* rados: fix error message on failed pool removal (Wido den Hollander)
+* radosgw-admin: add 'bucket check' function to repair bucket index (Yehuda Sadeh)
+* radosgw-admin: fix subuser modify output (#12286 Guce)
+* rados: handle --snapid arg properly (Abhishek Lekshmanan)
+* rados: improve bench buffer handling, performance (Piotr Dalek)
+* rados: misc bench fixes (Dmitry Yatsushkevich)
+* rados: new pool import implementation (John Spray)
+* rados: translate errno to string in CLI (#10877 Kefu Chai)
+* rbd: accept map options config option (Ilya Dryomov)
+* rbd: add disk usage tool (#7746 Jason Dillaman)
+* rbd: allow unmapping by spec (Ilya Dryomov)
+* rbd: cli: fix arg parsing with --io-pattern (Dmitry Yatsushkevich)
+* rbd: deprecate --new-format option (Jason Dillman)
+* rbd: fix error messages (#2862 Rajesh Nambiar)
+* rbd: fix link issues (Jason Dillaman)
+* rbd: improve CLI arg parsing, usage (Ilya Dryomov)
+* rbd: rbd-replay-prep and rbd-replay improvements (Jason Dillaman)
+* rbd: recognize queue_depth kernel option (Ilya Dryomov)
+* rbd: support G and T units for CLI (Abhishek Lekshmanan)
+* rbd: update rbd man page (Ilya Dryomov)
+* rbd: update xfstests tests (Douglas Fuller)
+* rbd: use image-spec and snap-spec in help (Vikhyat Umrao, Ilya Dryomov)
+* rest-bench: misc fixes (Shawn Chen)
+* rest-bench: support https (#3968 Yuan Zhou)
+* rgw: add max multipart upload parts (#12146 Abshishek Dixit)
+* rgw: add missing headers to Swift container details (#10666 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: add stats to headers for account GET (#10684 Yuan Zhou)
+* rgw: add Trasnaction-Id to response (Abhishek Dixit)
+* rgw: add X-Timestamp for Swift containers (#10938 Radoslaw Zarzynski)
+* rgw: always check if token is expired (#11367 Anton Aksola, Riku Lehto)
+* rgw: conversion tool to repair broken multipart objects (#12079 Yehuda Sadeh)
+* rgw: document layout of pools and objects (Pete Zaitcev)
+* rgw: do not enclose bucket header in quotes (#11860 Wido den Hollander)
+* rgw: do not prefetch data for HEAD requests (Guang Yang)
+* rgw: do not preserve ACLs when copying object (#12370 Yehuda Sadeh)
+* rgw: do not set content-type if length is 0 (#11091 Orit Wasserman)
+* rgw: don't clobber bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
+* rgw: don't use end_marker for namespaced object listing (#11437 Yehuda Sadeh)
+* rgw: don't use rgw_socket_path if frontend is configured (#11160 Yehuda Sadeh)
+* rgw: enforce Content-Length for POST on Swift cont/obj (#10661 Radoslaw Zarzynski)
+* rgw: error out if frontend did not send all data (#11851 Yehuda Sadeh)
+* rgw: expose the number of unhealthy workers through admin socket (Guang Yang)
+* rgw: fail if parts not specified on multipart upload (#11435 Yehuda Sadeh)
+* rgw: fix assignment of copy obj attributes (#11563 Yehuda Sadeh)
+* rgw: fix broken stats in container listing (#11285 Radoslaw Zarzynski)
+* rgw: fix bug in domain/subdomain splitting (Robin H. Johnson)
+* rgw: fix casing of Content-Type header (Robin H. Johnson)
+* rgw: fix civetweb max threads (#10243 Yehuda Sadeh)
+* rgw: fix Connection: header handling (#12298 Wido den Hollander)
+* rgw: fix copy metadata, support X-Copied-From for swift (#10663 Radoslaw Zarzynski)
+* rgw: fix data corruptions race condition (#11749 Wuxingyi)
+* rgw: fix decoding of X-Object-Manifest from GET on Swift DLO (Radslow Rzarzynski)
+* rgw: fix GET on swift account when limit == 0 (#10683 Radoslaw Zarzynski)
+* rgw: fix handling empty metadata items on Swift container (#11088 Radoslaw Zarzynski)
+* rgw: fix JSON response when getting user quota (#12117 Wuxingyi)
+* rgw: fix locator for objects starting with _ (#11442 Yehuda Sadeh)
+* rgw: fix log rotation (Wuxingyi)
+* rgw: fix mulitipart upload in retry path (#11604 Yehuda Sadeh)
+* rgw: fix quota enforcement on POST (#11323 Sergey Arkhipov)
+* rgw: fix reset_loc (#11974 Yehuda Sadeh)
+* rgw: fix return code on missing upload (#11436 Yehuda Sadeh)
+* rgw: fix sysvinit script
+* rgw: fix sysvinit script w/ multiple instances (Sage Weil, Pavan Rallabhandi)
+* rgw: force content_type for swift bucket stats requests (#12095 Orit Wasserman)
+* rgw: force content type header on responses with no body (#11438 Orit Wasserman)
+* rgw: generate Date header for civetweb (#10873 Radoslaw Zarzynski)
+* rgw: generate new object tag when setting attrs (#11256 Yehuda Sadeh)
+* rgw: improve content-length env var handling (#11419 Robin H. Johnson)
+* rgw: improved support for swift account metadata (Radoslaw Zarzynski)
+* rgw: improve handling of already removed buckets in expirer (Radoslaw Rzarzynski)
+* rgw: issue aio for first chunk before flush cached data (#11322 Guang Yang)
+* rgw: log to /var/log/ceph instead of /var/log/radosgw
+* rgw: make init script wait for radosgw to stop (#11140 Dmitry Yatsushkevich)
+* rgw: make max put size configurable (#6999 Yuan Zhou)
+* rgw: make quota/gc threads configurable (#11047 Guang Yang)
+* rgw: make read user buckets backward compat (#10683 Radoslaw Zarzynski)
+* rgw: merge manifests properly with prefix override (#11622 Yehuda Sadeh)
+* rgw: only scan for objects not in a namespace (#11984 Yehuda Sadeh)
+* rgw: orphan detection tool (Yehuda Sadeh)
+* rgw: pass in civetweb configurables (#10907 Yehuda Sadeh)
+* rgw: rectify 202 Accepted in PUT response (#11148 Radoslaw Zarzynski)
+* rgw: remove meta file after deleting bucket (#11149 Orit Wasserman)
+* rgw: remove trailing :port from HTTP_HOST header (Sage Weil)
+* rgw: return 412 on bad limit when listing buckets (#11613 Yehuda Sadeh)
+* rgw: rework X-Trans-Id header to conform with Swift API (Radoslaw Rzarzynski)
+* rgw: s3 encoding-type for get bucket (Jeff Weber)
+* rgw: send ETag, Last-Modified for swift (#11087 Radoslaw Zarzynski)
+* rgw: set content length on container GET, PUT, DELETE, HEAD (#10971, #11036 Radoslaw Zarzynski)
+* rgw: set max buckets per user in ceph.conf (Vikhyat Umrao)
+* rgw: shard work over multiple librados instances (Pavan Rallabhandi)
+* rgw: support end marker on swift container GET (#10682 Radoslaw Zarzynski)
+* rgw: support for Swift expiration API (Radoslaw Rzarzynski, Yehuda Sadeh)
+* rgw: swift: allow setting attributes with COPY (#10662 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: swift: do not override sent content type (#12363 Orit Wasserman)
+* rgw: swift: enforce Content-Type in response (#12157 Radoslaw Zarzynski)
+* rgw: swift: fix account listing (#11501 Radoslaw Zarzynski)
+* rgw: swift: fix metadata handling on copy (#10645 Radoslaw Zarzynski)
+* rgw: swift: send Last-Modified header (#10650 Radoslaw Zarzynski)
+* rgw: swift: set Content-Length for account GET (#12158 Radoslav Zarzynski)
+* rgw: swift: set content-length on keystone tokens (#11473 Herv Rousseau)
+* rgw: update keystone cache with token info (#11125 Yehuda Sadeh)
+* rgw: update to latest civetweb, enable config for IPv6 (#10965 Yehuda Sadeh)
+* rgw: use attrs from source bucket on copy (#11639 Javier M. Mellid)
+* rgw: use correct oid for gc chains (#11447 Yehuda Sadeh)
+* rgw: user rm is idempotent (Orit Wasserman)
+* rgw: use unique request id for civetweb (#10295 Orit Wasserman)
+* rocksdb: add perf counters for get/put latency (Xinxin Shu)
+* rocksdb, leveldb: fix compact_on_mount (Xiaoxi Chen)
+* rocksdb: pass options as single string (Xiaoxi Chen)
+* rocksdb: update to latest (Xiaoxi Chen)
+* rpm: add suse firewall files (Tim Serong)
+* rpm: always rebuild and install man pages for rpm (Owen Synge)
+* rpm: loosen ceph-test dependencies (Ken Dreyer)
+* rpm: many spec file fixes (Owen Synge, Ken Dreyer)
+* rpm: misc fixes (Boris Ranto, Owen Synge, Ken Dreyer, Ira Cooper)
+* rpm: misc systemd and SUSE fixes (Owen Synge, Nathan Cutler)
+* selinux policy (Boris Ranto, Milan Broz)
+* systemd: logrotate fixes (Tim Serong, Lars Marowsky-Bree, Nathan Cutler)
+* systemd: many fixes (Sage Weil, Owen Synge, Boris Ranto, Dan van der Ster)
+* systemd: run daemons as user ceph
+* sysvinit compat: misc fixes (Owen Synge)
+* test: misc fs test improvements (John Spray, Loic Dachary)
+* test: python tests, linter cleanup (Alfredo Deza)
+* tests: fixes for rbd xstests (Douglas Fuller)
+* tests: fix tiering health checks (Loic Dachary)
+* tests for low-level performance (Haomai Wang)
+* tests: many ec non-regression improvements (Loic Dachary)
+* tests: many many ec test improvements (Loic Dachary)
+* upstart: throttle restarts (#11798 Sage Weil, Greg Farnum)
+
+
+v9.1.0 Infernalis release candidate
+===================================
+
+This is the first Infernalis release candidate.  There have been some
+major changes since Hammer, and the upgrade process is non-trivial.
+Please read carefully.
+
+Getting the release candidate
+-----------------------------
+
+The v9.1.0 packages are pushed to the development release repositories::
+  
+  http://download.ceph.com/rpm-testing
+  http://download.ceph.com/debian-testing
+
+For for info, see::
+  
+  http://docs.ceph.com/docs/master/install/get-packages/
+
+Or install with ceph-deploy via::
+  
+  ceph-deploy install --testing HOST
+
+
+Known issues
+------------
+
+* librbd and librados ABI compatibility is broken.  Be careful
+  installing this RC on client machines (e.g., those running qemu).
+  It will be fixed in the final v9.2.0 release.
+
+
+Major Changes from Hammer
+-------------------------
+
+- *General*:
+
+  * Ceph daemons are now managed via systemd (with the exception of
+    Ubuntu Trusty, which still uses upstart).
+  * Ceph daemons run as 'ceph' user instead of root.
+  * On Red Hat distros, there is also an SELinux policy.
+
+- *RADOS*:
+
+  * The RADOS cache tier can now proxy write operations to the base
+    tier, allowing writes to be handled without forcing migration of
+    an object into the cache.
+  * The SHEC erasure coding support is no longer flagged as
+    experimental. SHEC trades some additional storage space for faster
+    repair.
+  * There is now a unified queue (and thus prioritization) of client
+    IO, scrubbing, and snapshot trimming.
+  * There have been many improvements to low-level repair tooling
+    (ceph-objectstore-tool).
+  * The internal ObjectStore API has been significantly cleaned up in order
+    to faciliate new storage backends like NewStore.
+
+- *RGW*:
+
+  * The Swift API now supports object expiration.
+  * There are many Swift API compatibility improvements.
+
+- *RBD*:
+
+  * The ``rbd du`` command shows actual usage (quickly, when
+    object-map is enabled).
+  * The object-map feature has seen many stability improvements.
+  * Object-map and exclusive-lock features can be enabled or disabled
+    dynamically.
+  * You can now store user metadata and set persistent librbd options
+    associated with individual images.
+  * The new deep-flatten features allows flattening of a clone and all
+    of its snapshots.  (Previously snapshots could not be flattened.)
+  * The export-diff command command is now faster (it uses aio).  There is also
+    a new fast-diff feature.
+  * The --size argument can be specified with a suffix for units
+    (e.g., ``--size 64G``).
+  * There is a new ``rbd status`` command that, for now, shows who has
+    the image open/mapped.
+
+- *CephFS*:
+
+  * You can now rename snapshots.
+  * There have been ongoing improvements around administration, diagnostics,
+    and the check and repair tools.
+  * The caching and revocation of client cache state due to unused
+    inodes has been dramatically improved.
+  * The ceph-fuse client behaves better on 32-bit hosts.
+
+Distro compatibility
+--------------------
+
+We have decided to drop support for many older distributions so that we can
+move to a newer compiler toolchain (e.g., C++11).  Although it is still possible
+to build Ceph on older distributions by installing backported development tools,
+we are not building and publishing release packages for them on ceph.com.
+
+In particular,
+
+* CentOS 7 or later; we have dropped support for CentOS 6 (and other
+  RHEL 6 derivatives, like Scientific Linux 6).
+* Debian Jessie 8.x or later; Debian Wheezy 7.x's g++ has incomplete
+  support for C++11 (and no systemd).
+* Ubuntu Trusty 14.04 or later; Ubuntu Precise 12.04 is no longer
+  supported.
+* Fedora 22 or later.
+
+Upgrading from Firefly
+----------------------
+
+Upgrading directly from Firefly v0.80.z is not possible.  All clusters
+must first upgrade to Hammer v0.94.4 or a later v0.94.z release; only
+then is it possible to do online upgrade to Infernalis 9.2.z.
+
+User can upgrade to latest hammer v0.94.z 
+from gitbuilder with(also refer the hammer release notes for more details)::
+
+  ceph-deploy install --release hammer HOST
+
+
+Upgrading from Hammer
+---------------------
+
+* All cluster nodes must first upgrade to Hammer v0.94.4 or a later v0.94.z release; only
+  then is it possible to do online upgrade to Infernalis 9.2.z.
+
+* For all distributions that support systemd (CentOS 7, Fedora, Debian
+  Jessie 8.x, OpenSUSE), ceph daemons are now managed using native systemd
+  files instead of the legacy sysvinit scripts.  For example,::
+
+    systemctl start ceph.target       # start all daemons
+    systemctl status ceph-osd at 12      # check status of osd.12
+
+  The main notable distro that is *not* yet using systemd is Ubuntu trusty
+  14.04.  (The next Ubuntu LTS, 16.04, will use systemd instead of upstart.)
+    
+* Ceph daemons now run as user and group ``ceph`` by default.  The
+  ceph user has a static UID assigned by Fedora and Debian (also used
+  by derivative distributions like RHEL/CentOS and Ubuntu).  On SUSE
+  the ceph user will currently get a dynamically assigned UID when the
+  user is created.
+
+  If your systems already have a ceph user, the package upgrade
+  process will usually fail with an error.  We suggest you first
+  remove or rename the existing 'ceph' user and then upgrade.
+
+  When upgrading, administrators have two options:
+
+   #. Add the following line to ``ceph.conf`` on all hosts::
+
+        setuser match path = /var/lib/ceph/$type/$cluster-$id
+
+      This will make the Ceph daemons run as root (i.e., not drop
+      privileges and switch to user ceph) if the daemon's data
+      directory is still owned by root.  Newly deployed daemons will
+      be created with data owned by user ceph and will run with
+      reduced privileges, but upgraded daemons will continue to run as
+      root.
+
+   #. Fix the data ownership during the upgrade.  This is the preferred option,
+      but is more work.  The process for each host would be to:
+
+      #. Upgrade the ceph package.  This creates the ceph user and group.  For
+	 example::
+
+	   ceph-deploy install --stable infernalis HOST
+
+      #. Stop the daemon(s).::
+
+	   service ceph stop           # fedora, centos, rhel, debian
+	   stop ceph-all               # ubuntu
+	   
+      #. Fix the ownership::
+
+	   chown -R ceph:ceph /var/lib/ceph
+
+      #. Restart the daemon(s).::
+
+	   start ceph-all                # ubuntu
+	   systemctl start ceph.target   # debian, centos, fedora, rhel
+
+* The on-disk format for the experimental KeyValueStore OSD backend has
+  changed.  You will need to remove any OSDs using that backend before you
+  upgrade any test clusters that use it.
+
+Upgrade notes
+-------------
+
+* When a pool quota is reached, librados operations now block indefinitely,
+  the same way they do when the cluster fills up.  (Previously they would return
+  -ENOSPC).  By default, a full cluster or pool will now block.  If your
+  librados application can handle ENOSPC or EDQUOT errors gracefully, you can
+  get error returns instead by using the new librados OPERATION_FULL_TRY flag.
+
+Notable changes
+---------------
+
+NOTE: These notes are somewhat abbreviated while we find a less
+time-consuming process for generating them.
+
+* build: C++11 now supported
+* build: many cmake improvements
+* build: OSX build fixes (Yan, Zheng)
+* build: remove rest-bench
+* ceph-disk: many fixes (Loic Dachary)
+* ceph-disk: support for multipath devices (Loic Dachary)
+* ceph-fuse: mostly behave on 32-bit hosts (Yan, Zheng)
+* ceph-objectstore-tool: many improvements (David Zafman)
+* common: bufferlist performance tuning (Piotr Dalek, Sage Weil)
+* common: make mutex more efficient
+* common: some async compression infrastructure (Haomai Wang)
+* librados: add FULL_TRY and FULL_FORCE flags for dealing with full clusters or pools (Sage Weil)
+* librados: fix notify completion race (#13114 Sage Weil)
+* librados, libcephfs: randomize client nonces (Josh Durgin)
+* librados: pybind: fix binary omap values (Robin H. Johnson)
+* librbd: fix reads larger than the cache size (Lu Shi)
+* librbd: metadata filter fixes (Haomai Wang)
+* librbd: use write_full when possible (Zhiqiang Wang)
+* mds: avoid emitting cap warnigns before evicting session (John Spray)
+* mds: fix expected holes in journal objects (#13167 Yan, Zheng)
+* mds: fix SnapServer crash on deleted pool (John Spray)
+* mds: many fixes (Yan, Zheng, John Spray, Greg Farnum)
+* mon: add cache over MonitorDBStore (Kefu Chai)
+* mon: 'ceph osd metadata' can dump all osds (Haomai Wang)
+* mon: detect kv backend failures (Sage Weil)
+* mon: fix CRUSH map test for new pools (Sage Weil)
+* mon: fix min_last_epoch_clean tracking (Kefu Chai)
+* mon: misc scaling fixes (Sage Weil)
+* mon: streamline session handling, fix memory leaks (Sage Weil)
+* mon: upgrades must pass through hammer (Sage Weil)
+* msg/async: many fixes (Haomai Wang)
+* osd: cache proxy-write support (Zhiqiang Wang, Samuel Just)
+* osd: configure promotion based on write recency (Zhiqiang Wang)
+* osd: don't send dup MMonGetOSDMap requests (Sage Weil, Kefu Chai)
+* osd: erasure-code: fix SHEC floating point bug (#12936 Loic Dachary)
+* osd: erasure-code: update to ISA-L 2.14 (Yuan Zhou)
+* osd: fix hitset object naming to use GMT (Kefu Chai)
+* osd: fix misc memory leaks (Sage Weil)
+* osd: fix peek_queue locking in FileStore (Xinze Chi)
+* osd: fix promotion vs full cache tier (Samuel Just)
+* osd: fix replay requeue when pg is still activating (#13116 Samuel Just)
+* osd: fix scrub stat bugs (Sage Weil, Samuel Just)
+* osd: force promotion for ops EC can't handle (Zhiqiang Wang)
+* osd: improve behavior on machines with large memory pages (Steve Capper)
+* osd: merge multiple setattr calls into a setattrs call (Xinxin Shu)
+* osd: newstore prototype (Sage Weil)
+* osd: ObjectStore internal API refactor (Sage Weil)
+* osd: SHEC no longer experimental
+* osd: throttle evict ops (Yunchuan Wen)
+* osd: upgrades must pass through hammer (Sage Weil)
+* osd: use SEEK_HOLE / SEEK_DATA for sparse copy (Xinxin Shu)
+* rbd: rbd-replay-prep and rbd-replay improvements (Jason Dillaman)
+* rgw: expose the number of unhealthy workers through admin socket (Guang Yang)
+* rgw: fix casing of Content-Type header (Robin H. Johnson)
+* rgw: fix decoding of X-Object-Manifest from GET on Swift DLO (Radslow Rzarzynski)
+* rgw: fix sysvinit script
+* rgw: fix sysvinit script w/ multiple instances (Sage Weil, Pavan Rallabhandi)
+* rgw: improve handling of already removed buckets in expirer (Radoslaw Rzarzynski)
+* rgw: log to /var/log/ceph instead of /var/log/radosgw
+* rgw: rework X-Trans-Id header to be conform with Swift API (Radoslaw Rzarzynski)
+* rgw: s3 encoding-type for get bucket (Jeff Weber)
+* rgw: set max buckets per user in ceph.conf (Vikhyat Umrao)
+* rgw: support for Swift expiration API (Radoslaw Rzarzynski, Yehuda Sadeh)
+* rgw: user rm is idempotent (Orit Wasserman)
+* selinux policy (Boris Ranto, Milan Broz)
+* systemd: many fixes (Sage Weil, Owen Synge, Boris Ranto, Dan van der Ster)
+* systemd: run daemons as user ceph
+
+
+v9.0.3
+======
+
+This is the second to last batch of development work for the
+Infernalis cycle.  The most intrusive change is an internal (non
+user-visible) change to the OSD's ObjectStore interface.  Many fixes and
+improvements elsewhere across RGW, RBD, and another big pile of CephFS
+scrub/repair improvements.
+
+Upgrading
+---------
+
+* The return code for librbd's rbd_aio_read and Image::aio_read API methods no
+  longer returns the number of bytes read upon success.  Instead, it returns 0
+  upon success and a negative value upon failure.
+
+* 'ceph scrub', 'ceph compact' and 'ceph sync force' are now deprecated.  Users
+  should instead use 'ceph mon scrub', 'ceph mon compact' and
+  'ceph mon sync force'.
+
+* 'ceph mon_metadata' should now be used as 'ceph mon metadata'.
+
+* The `--dump-json` option of "osdmaptool" is replaced by `--dump json`.
+
+* The commands of 'pg ls-by-{pool,primary,osd}' and 'pg ls' now take 'recovering'
+  instead of 'recovery' to include the recovering pgs in the listed pgs.
+
+
+Notable Changes
+---------------
+
+  * autotools: fix out of tree build (Krxysztof Kosinski)
+  * autotools: improve make check output (Loic Dachary)
+  * buffer: add invalidate_crc() (Piotr Dalek)
+  * buffer: fix zero bug (#12252 Haomai Wang)
+  * build: fix junit detection on Fedora 22 (Ira Cooper)
+  * ceph-disk: install pip > 6.1 (#11952 Loic Dachary)
+  * cephfs-data-scan: many additions, improvements (John Spray)
+  * ceph: improve error output for 'tell' (#11101 Kefu Chai)
+  * ceph-objectstore-tool: misc improvements (David Zafman)
+  * ceph-objectstore-tool: refactoring and cleanup (John Spray)
+  * ceph_test_rados: test pipelined reads (Zhiqiang Wang)
+  * common: fix bit_vector extent calc (#12611 Jason Dillaman)
+  * common: make work queue addition/removal thread safe (#12662 Jason Dillaman)
+  * common: optracker improvements (Zhiqiang Wang, Jianpeng Ma)
+  * crush: add --check to validate dangling names, max osd id (Kefu Chai)
+  * crush: cleanup, sync with kernel (Ilya Dryomov)
+  * crush: fix subtree base weight on adjust_subtree_weight (#11855 Sage Weil)
+  * crypo: fix NSS leak (Jason Dillaman)
+  * crypto: fix unbalanced init/shutdown (#12598 Zheng Yan)
+  * doc: misc updates (Kefu Chai, Owen Synge, Gael Fenet-Garde, Loic Dachary, Yannick Atchy-Dalama, Jiaying Ren, Kevin Caradant, Robert Maxime, Nicolas Yong, Germain Chipaux, Arthur Gorjux, Gabriel Sentucq, Clement Lebrun, Jean-Remi Deveaux, Clair Massot, Robin Tang, Thomas Laumondais, Jordan Dorne, Yuan Zhou, Valentin Thomas, Pierre Chaumont, Benjamin Troquereau, Benjamin Sesia, Vikhyat Umrao)
+  * erasure-code: cleanup (Kefu Chai)
+  * erasure-code: improve tests (Loic Dachary)
+  * erasure-code: shec: fix recovery bugs (Takanori Nakao, Shotaro Kawaguchi)
+  * libcephfs: add pread, pwrite (Jevon Qiao)
+  * libcephfs,ceph-fuse: cache cleanup (Zheng Yan)
+  * librados: add src_fadvise_flags for copy-from (Jianpeng Ma)
+  * librados: respect default_crush_ruleset on pool_create (#11640 Yuan Zhou)
+  * librbd: fadvise for copy, export, import (Jianpeng Ma)
+  * librbd: handle NOCACHE fadvise flag (Jinapeng Ma)
+  * librbd: optionally disable allocation hint (Haomai Wang)
+  * librbd: prevent race between resize requests (#12664 Jason Dillaman)
+  * log: fix data corruption race resulting from log rotation (#12465 Samuel Just)
+  * mds: expose frags via asok (John Spray)
+  * mds: fix setting entire file layout in one setxattr (John Spray)
+  * mds: fix shutdown (John Spray)
+  * mds: handle misc corruption issues (John Spray)
+  * mds: misc fixes (Jianpeng Ma, Dan van der Ster, Zhang Zhi)
+  * mds: misc snap fixes (Zheng Yan)
+  * mds: store layout on header object (#4161 John Spray)
+  * misc performance and cleanup (Nathan Cutler, Xinxin Shu)
+  * mon: add NOFORWARD, OBSOLETE, DEPRECATE flags for mon commands (Joao Eduardo Luis)
+  * mon: add PG count to 'ceph osd df' output (Michal Jarzabek)
+  * mon: clean up, reorg some mon commands (Joao Eduardo Luis)
+  * mon: disallow >2 tiers (#11840 Kefu Chai)
+  * mon: fix log dump crash when debugging (Mykola Golub)
+  * mon: fix metadata update race (Mykola Golub)
+  * mon: fix refresh (#11470 Joao Eduardo Luis)
+  * mon: make blocked op messages more readable (Jianpeng Ma)
+  * mon: only send mon metadata to supporting peers (Sage Weil)
+  * mon: periodic background scrub (Joao Eduardo Luis)
+  * mon: prevent pgp_num > pg_num (#12025 Xinxin Shu)
+  * mon: reject large max_mds values (#12222 John Spray)
+  * msgr: add ceph_perf_msgr tool (Hoamai Wang)
+  * msgr: async: fix seq handling (Haomai Wang)
+  * msgr: xio: fastpath improvements (Raju Kurunkad)
+  * msgr: xio: sync with accellio v1.4 (Vu Pham)
+  * osd: clean up temp object if promotion fails (Jianpeng Ma)
+  * osd: constrain collections to meta and PGs (normal and temp) (Sage Weil)
+  * osd: filestore: clone using splice (Jianpeng Ma)
+  * osd: filestore: fix recursive lock (Xinxin Shu)
+  * osd: fix dup promotion lost op bug (Zhiqiang Wang)
+  * osd: fix temp-clearing (David Zafman)
+  * osd: include a temp namespace within each collection/pgid (Sage Weil)
+  * osd: low and high speed flush modes (Mingxin Liu)
+  * osd: peer_features includes self (David Zafman)
+  * osd: recovery, peering fixes (#11687 Samuel Just)
+  * osd: require firefly features (David Zafman)
+  * osd: set initial crush weight with more precision (Sage Weil)
+  * osd: use a temp object for recovery (Sage Weil)
+  * osd: use blkid to collection partition information (Joseph Handzik)
+  * rados: add --striper option to use libradosstriper (#10759 Sebastien Ponce)
+  * radosgw-admin: fix subuser modify output (#12286 Guce)
+  * rados: handle --snapid arg properly (Abhishek Lekshmanan)
+  * rados: improve bench buffer handling, performance (Piotr Dalek)
+  * rados: new pool import implementation (John Spray)
+  * rbd: fix link issues (Jason Dillaman)
+  * rbd: improve CLI arg parsing, usage (Ilya Dryomov)
+  * rbd: recognize queue_depth kernel option (Ilya Dryomov)
+  * rbd: support G and T units for CLI (Abhishek Lekshmanan)
+  * rbd: use image-spec and snap-spec in help (Vikhyat Umrao, Ilya Dryomov)
+  * rest-bench: misc fixes (Shawn Chen)
+  * rest-bench: support https (#3968 Yuan Zhou)
+  * rgw: add max multipart upload parts (#12146 Abshishek Dixit)
+  * rgw: add Trasnaction-Id to response (Abhishek Dixit)
+  * rgw: document layout of pools and objects (Pete Zaitcev)
+  * rgw: do not preserve ACLs when copying object (#12370 Yehuda Sadeh)
+  * rgw: fix Connection: header handling (#12298 Wido den Hollander)
+  * rgw: fix data corruptions race condition (#11749 Wuxingyi)
+  * rgw: fix JSON response when getting user quota (#12117 Wuxingyi)
+  * rgw: force content_type for swift bucket stats requests (#12095 Orit Wasserman)
+  * rgw: improved support for swift account metadata (Radoslaw Zarzynski)
+  * rgw: make max put size configurable (#6999 Yuan Zhou)
+  * rgw: orphan detection tool (Yehuda Sadeh)
+  * rgw: swift: do not override sent content type (#12363 Orit Wasserman)
+  * rgw: swift: set Content-Length for account GET (#12158 Radoslav Zarzynski)
+  * rpm: always rebuild and install man pages for rpm (Owen Synge)
+  * rpm: misc fixes (Boris Ranto, Owen Synge, Ken Dreyer, Ira Cooper)
+  * systemd: logrotate fixes (Tim Seron, Lars Marowsky-Bree, Nathan Cutler)
+  * sysvinit compat: misc fixes (Owen Synge)
+  * test: misc fs test improvements (John Spray, Loic Dachary)
+  * test: python tests, linter cleanup (Alfredo Deza)
+
+
+v9.0.2
+======
+
+This development release features more of the OSD work queue
+unification, randomized osd scrub times, a huge pile of librbd fixes,
+more MDS repair and snapshot fixes, and a significant amount of work
+on the tests and build infrastructure.
+
+Notable Changes
+---------------
+
+* buffer: some cleanup (Michal Jarzabek)
+* build: cmake: fix nss linking (Danny Al-Gaaf)
+* build: cmake: misc fixes (Orit Wasserman, Casey Bodley)
+* build: install-deps: misc fixes (Loic Dachary)
+* build: make_dist_tarball.sh (Sage Weil)
+* ceph-detect-init: added Linux Mint (Michal Jarzabek)
+* ceph-detect-init: robust init system detection (Owen Synge, Loic Dachary)
+* ceph-disk: ensure 'zap' only operates on a full disk (#11272 Loic Dachary)
+* ceph-disk: misc fixes to respect init system (Loic Dachary, Owen Synge)
+* ceph-disk: support NVMe device partitions (#11612 Ilja Slepnev)
+* ceph: fix 'df' units (Zhe Zhang)
+* ceph: fix parsing in interactive cli mode (#11279 Kefu Chai)
+* ceph-objectstore-tool: many many changes (David Zafman)
+* ceph-post-file: misc fixes (Joey McDonald, Sage Weil)
+* client: avoid sending unnecessary FLUSHSNAP messages (Yan, Zheng)
+* client: exclude setfilelock when calculating oldest tid (Yan, Zheng)
+* client: fix error handling in check_pool_perm (John Spray)
+* client: fsync waits only for inode's caps to flush (Yan, Zheng)
+* client: invalidate kernel dcache when cache size exceeds limits (Yan, Zheng)
+* client: make fsync wait for unsafe dir operations (Yan, Zheng)
+* client: pin lookup dentry to avoid inode being freed (Yan, Zheng)
+* common: detect overflow of int config values (#11484 Kefu Chai)
+* common: fix json parsing of utf8 (#7387 Tim Serong)
+* common: fix leak of pthread_mutexattr (#11762 Ketor Meng)
+* crush: respect default replicated ruleset config on map creation (Ilya Dryomov)
+* deb, rpm: move ceph-objectstore-tool to ceph (Ken Dreyer)
+* doc: man page updates (Kefu Chai)
+* doc: misc updates (#11396 Nilamdyuti, Fracois Lafont, Ken Dreyer, Kefu Chai)
+* init-radosgw: merge with sysv version; fix enumeration (Sage Weil)
+* librados: add config observer (Alistair Strachan)
+* librbd: add const for single-client-only features (Josh Durgin)
+* librbd: add deep-flatten operation (Jason Dillaman)
+* librbd: avoid blocking aio API methods (#11056 Jason Dillaman)
+* librbd: fix fast diff bugs (#11553 Jason Dillaman)
+* librbd: fix image format detection (Zhiqiang Wang)
+* librbd: fix lock ordering issue (#11577 Jason Dillaman)
+* librbd: flatten/copyup fixes (Jason Dillaman)
+* librbd: lockdep, helgrind validation (Jason Dillaman, Josh Durgin)
+* librbd: only update image flags while hold exclusive lock (#11791 Jason Dillaman)
+* librbd: return result code from close (#12069 Jason Dillaman)
+* librbd: tolerate old osds when getting image metadata (#11549 Jason Dillaman)
+* mds: do not add snapped items to bloom filter (Yan, Zheng)
+* mds: fix handling for missing mydir dirfrag (#11641 John Spray)
+* mds: fix rejoin (Yan, Zheng)
+* mds: fix stra reintegration (Yan, Zheng)
+* mds: fix suicide beason (John Spray)
+* mds: misc repair improvements (John Spray)
+* mds: misc snapshot fixes (Yan, Zheng)
+* mds: respawn instead of suicide on blacklist (John Spray)
+* misc coverity fixes (Danny Al-Gaaf)
+* mon: add 'mon_metadata <id>' command (Kefu Chai)
+* mon: add 'node ls ...' command (Kefu Chai)
+* mon: disallow ec pools as tiers (#11650 Samuel Just)
+* mon: fix mds beacon replies (#11590 Kefu Chai)
+* mon: fix 'pg ls' sort order, state names (#11569 Kefu Chai)
+* mon: normalize erasure-code profile for storage and comparison (Loic Dachary)
+* mon: optionally specify osd id on 'osd create' (Mykola Golub)
+* mon: 'osd tree' fixes (Kefu Chai)
+* mon: prevent pool with snapshot state from being used as a tier (#11493 Sage Weil)
+* mon: refine check_remove_tier checks (#11504 John Spray)
+* mon: remove spurious who arg from 'mds rm ...' (John Spray)
+* msgr: async: misc fixes (Haomai Wang)
+* msgr: xio: fix ip and nonce (Raju Kurunkad)
+* msgr: xio: improve lane assignment (Vu Pham)
+* msgr: xio: misc fixes (Vu Pham, Cosey Bodley)
+* osd: avoid transaction append in some cases (Sage Weil)
+* osdc/Objecter: allow per-pool calls to op_cancel_writes (John Spray)
+* osd: elminiate txn apend, ECSubWrite copy (Samuel Just)
+* osd: filejournal: cleanup (David Zafman)
+* osd: fix check_for_full (Henry Chang)
+* osd: fix dirty accounting in make_writeable (Zhiqiang Wang)
+* osd: fix osdmap dump of blacklist items (John Spray)
+* osd: fix snap flushing from cache tier (again) (#11787 Samuel Just)
+* osd: fix snap handling on promotion (#11296 Sam Just)
+* osd: handle log split with overlapping entries (#11358 Samuel Just)
+* osd: keyvaluestore: misc fixes (Varada Kari)
+* osd: make suicide timeouts individually configurable (Samuel Just)
+* osd: move scrub in OpWQ (Samuel Just)
+* osd: pool size change triggers new interval (#11771 Samuel Just)
+* osd: randomize scrub times (#10973 Kefu Chai)
+* osd: refactor scrub and digest recording (Sage Weil)
+* osd: refuse first write to EC object at non-zero offset (Jianpeng Ma)
+* osd: stripe over small xattrs to fit in XFS's 255 byte inline limit (Sage Weil, Ning Yao)
+* osd: sync object_map on syncfs (Samuel Just)
+* osd: take excl lock of op is rw (Samuel Just)
+* osd: WBThrottle cleanups (Jianpeng Ma)
+* pycephfs: many fixes for bindings (Haomai Wang)
+* rados: bench: add --no-verify option to improve performance (Piotr Dalek)
+* rados: misc bench fixes (Dmitry Yatsushkevich)
+* rbd: add disk usage tool (#7746 Jason Dillaman)
+* rgw: alwasy check if token is expired (#11367 Anton Aksola, Riku Lehto)
+* rgw: conversion tool to repair broken multipart objects (#12079 Yehuda Sadeh)
+* rgw: do not enclose bucket header in quotes (#11860 Wido den Hollander)
+* rgw: error out if frontend did not send all data (#11851 Yehuda Sadeh)
+* rgw: fix assignment of copy obj attributes (#11563 Yehuda Sadeh)
+* rgw: fix reset_loc (#11974 Yehuda Sadeh)
+* rgw: improve content-length env var handling (#11419 Robin H. Johnson)
+* rgw: only scan for objects not in a namespace (#11984 Yehuda Sadeh)
+* rgw: remove trailing :port from HTTP_HOST header (Sage Weil)
+* rgw: shard work over multiple librados instances (Pavan Rallabhandi)
+* rgw: swift: enforce Content-Type in response (#12157 Radoslaw Zarzynski)
+* rgw: use attrs from source bucket on copy (#11639 Javier M. Mellid)
+* rocksdb: pass options as single string (Xiaoxi Chen)
+* rpm: many spec file fixes (Owen Synge, Ken Dreyer)
+* tests: fixes for rbd xstests (Douglas Fuller)
+* tests: fix tiering health checks (Loic Dachary)
+* tests for low-level performance (Haomai Wang)
+* tests: many ec non-regression improvements (Loic Dachary)
+* tests: many many ec test improvements (Loic Dachary)
+* upstart: throttle restarts (#11798 Sage Weil, Greg Farnum)
+
+
+v9.0.1
+======
+
+This development release is delayed a bit due to tooling changes in the build
+environment.  As a result the next one (v9.0.2) will have a bit more work than
+is usual.
+
+Highlights here include lots of RGW Swift fixes, RBD feature work
+surrounding the new object map feature, more CephFS snapshot fixes,
+and a few important CRUSH fixes.
+
+Notable Changes
+---------------
+
+* auth: cache/reuse crypto lib key objects, optimize msg signature check (Sage Weil)
+* build: allow tcmalloc-minimal (Thorsten Behrens)
+* build: do not build ceph-dencoder with tcmalloc (#10691 Boris Ranto)
+* build: fix pg ref disabling (William A. Kennington III)
+* build: install-deps.sh improvements (Loic Dachary)
+* build: misc fixes (Boris Ranto, Ken Dreyer, Owen Synge)
+* ceph-authtool: fix return code on error (Gerhard Muntingh)
+* ceph-disk: fix zap sgdisk invocation (Owen Synge, Thorsten Behrens)
+* ceph-disk: pass --cluster arg on prepare subcommand (Kefu Chai)
+* ceph-fuse, libcephfs: drop inode when rmdir finishes (#11339 Yan, Zheng)
+* ceph-fuse,libcephfs: fix uninline (#11356 Yan, Zheng)
+* ceph-monstore-tool: fix store-copy (Huangjun)
+* common: add perf counter descriptions (Alyona Kiseleva)
+* common: fix throttle max change (Henry Chang)
+* crush: fix crash from invalid 'take' argument (#11602 Shiva Rkreddy, Sage Weil)
+* crush: fix divide-by-2 in straw2 (#11357 Yann Dupont, Sage Weil)
+* deb: fix rest-bench-dbg and ceph-test-dbg dependendies (Ken Dreyer)
+* doc: document region hostnames (Robin H. Johnson)
+* doc: update release schedule docs (Loic Dachary)
+* init-radosgw: run radosgw as root (#11453 Ken Dreyer)
+* librados: fadvise flags per op (Jianpeng Ma)
+* librbd: allow additional metadata to be stored with the image (Haomai Wang)
+* librbd: better handling for dup flatten requests (#11370 Jason Dillaman)
+* librbd: cancel in-flight ops on watch error (#11363 Jason Dillaman)
+* librbd: default new images to format 2 (#11348 Jason Dillaman)
+* librbd: fast diff implementation that leverages object map (Jason Dillaman)
+* librbd: fix snapshot creation when other snap is active (#11475 Jason Dillaman)
+* librbd: new diff_iterate2 API (Jason Dillaman)
+* librbd: object map rebuild support (Jason Dillaman)
+* logrotate.d: prefer service over invoke-rc.d (#11330 Win Hierman, Sage Weil)
+* mds: avoid getting stuck in XLOCKDONE (#11254 Yan, Zheng)
+* mds: fix integer truncateion on large client ids (Henry Chang)
+* mds: many snapshot and stray fixes (Yan, Zheng)
+* mds: persist completed_requests reliably (#11048 John Spray)
+* mds: separate safe_pos in Journaler (#10368 John Spray)
+* mds: snapshot rename support (#3645 Yan, Zheng)
+* mds: warn when clients fail to advance oldest_client_tid (#10657 Yan, Zheng)
+* misc cleanups and fixes (Danny Al-Gaaf)
+* mon: fix average utilization calc for 'osd df' (Mykola Golub)
+* mon: fix variance calc in 'osd df' (Sage Weil)
+* mon: improve callout to crushtool (Mykola Golub)
+* mon: prevent bucket deletion when referenced by a crush rule (#11602 Sage Weil)
+* mon: prime pg_temp when CRUSH map changes (Sage Weil)
+* monclient: flush_log (John Spray)
+* msgr: async: many many fixes (Haomai Wang)
+* msgr: simple: fix clear_pipe (#11381 Haomai Wang)
+* osd: add latency perf counters for tier operations (Xinze Chi)
+* osd: avoid multiple hit set insertions (Zhiqiang Wang)
+* osd: break PG removal into multiple iterations (#10198 Guang Yang)
+* osd: check scrub state when handling map (Jianpeng Ma)
+* osd: fix endless repair when object is unrecoverable (Jianpeng Ma, Kefu Chai)
+* osd: fix pg resurrection (#11429 Samuel Just)
+* osd: ignore non-existent osds in unfound calc (#10976 Mykola Golub)
+* osd: increase default max open files (Owen Synge)
+* osd: prepopulate needs_recovery_map when only one peer has missing (#9558 Guang Yang)
+* osd: relax reply order on proxy read (#11211 Zhiqiang Wang)
+* osd: skip promotion for flush/evict op (Zhiqiang Wang)
+* osd: write journal header on clean shutdown (Xinze Chi)
+* qa: run-make-check.sh script (Loic Dachary)
+* rados bench: misc fixes (Dmitry Yatsushkevich)
+* rados: fix error message on failed pool removal (Wido den Hollander)
+* radosgw-admin: add 'bucket check' function to repair bucket index (Yehuda Sadeh)
+* rbd: allow unmapping by spec (Ilya Dryomov)
+* rbd: deprecate --new-format option (Jason Dillman)
+* rgw: do not set content-type if length is 0 (#11091 Orit Wasserman)
+* rgw: don't use end_marker for namespaced object listing (#11437 Yehuda Sadeh)
+* rgw: fail if parts not specified on multipart upload (#11435 Yehuda Sadeh)
+* rgw: fix GET on swift account when limit == 0 (#10683 Radoslaw Zarzynski)
+* rgw: fix broken stats in container listing (#11285 Radoslaw Zarzynski)
+* rgw: fix bug in domain/subdomain splitting (Robin H. Johnson)
+* rgw: fix civetweb max threads (#10243 Yehuda Sadeh)
+* rgw: fix copy metadata, support X-Copied-From for swift (#10663 Radoslaw Zarzynski)
+* rgw: fix locator for objects starting with _ (#11442 Yehuda Sadeh)
+* rgw: fix mulitipart upload in retry path (#11604 Yehuda Sadeh)
+* rgw: fix quota enforcement on POST (#11323 Sergey Arkhipov)
+* rgw: fix return code on missing upload (#11436 Yehuda Sadeh)
+* rgw: force content type header on responses with no body (#11438 Orit Wasserman)
+* rgw: generate new object tag when setting attrs (#11256 Yehuda Sadeh)
+* rgw: issue aio for first chunk before flush cached data (#11322 Guang Yang)
+* rgw: make read user buckets backward compat (#10683 Radoslaw Zarzynski)
+* rgw: merge manifests properly with prefix override (#11622 Yehuda Sadeh)
+* rgw: return 412 on bad limit when listing buckets (#11613 Yehuda Sadeh)
+* rgw: send ETag, Last-Modified for swift (#11087 Radoslaw Zarzynski)
+* rgw: set content length on container GET, PUT, DELETE, HEAD (#10971, #11036 Radoslaw Zarzynski)
+* rgw: support end marker on swift container GET (#10682 Radoslaw Zarzynski)
+* rgw: swift: fix account listing (#11501 Radoslaw Zarzynski)
+* rgw: swift: set content-length on keystone tokens (#11473 Herv Rousseau)
+* rgw: use correct oid for gc chains (#11447 Yehuda Sadeh)
+* rgw: use unique request id for civetweb (#10295 Orit Wasserman)
+* rocksdb, leveldb: fix compact_on_mount (Xiaoxi Chen)
+* rocksdb: add perf counters for get/put latency (Xinxin Shu)
+* rpm: add suse firewall files (Tim Serong)
+* rpm: misc systemd and suse fixes (Owen Synge, Nathan Cutler)
+
+
+
+v9.0.0
+======
+
+This is the first development release for the Infernalis cycle, and
+the first Ceph release to sport a version number from the new
+numbering scheme.  The "9" indicates this is the 9th release cycle--I
+(for Infernalis) is the 9th letter.  The first "0" indicates this is a
+development release ("1" will mean release candidate and "2" will mean
+stable release), and the final "0" indicates this is the first such
+development release.
+
+A few highlights include:
+
+* a new 'ceph daemonperf' command to watch perfcounter stats in realtime
+* reduced MDS memory usage
+* many MDS snapshot fixes
+* librbd can now store options in the image itself
+* many fixes for RGW Swift API support
+* OSD performance improvements
+* many doc updates and misc bug fixes
+
+Notable Changes
+---------------
+
+* aarch64: add optimized version of crc32c (Yazen Ghannam, Steve Capper)
+* auth: reinit NSS after fork() (#11128 Yan, Zheng)
+* build: disable LTTNG by default (#11333 Josh Durgin)
+* build: fix ppc build (James Page)
+* build: install-deps: support OpenSUSE (Loic Dachary)
+* build: misc cmake fixes (Matt Benjamin)
+* ceph-disk: follow ceph-osd hints when creating journal (#9580 Sage Weil)
+* ceph-disk: handle re-using existing partition (#10987 Loic Dachary)
+* ceph-disk: improve parted output parsing (#10983 Loic Dachary)
+* ceph-disk: make suppression work for activate-all and activate-journal (Dan van der Ster)
+* ceph-disk: misc fixes (Alfredo Deza)
+* ceph-fuse, libcephfs: don't clear COMPLETE when trimming null (Yan, Zheng)
+* ceph-fuse, libcephfs: hold exclusive caps on dirs we "own" (#11226 Greg Farnum)
+* ceph-fuse: do not require successful remount when unmounting (#10982 Greg Farnum)
+* ceph: new 'ceph daemonperf' command (John Spray, Mykola Golub)
+* common: PriorityQueue tests (Kefu Chai)
+* common: add descriptions to perfcounters (Kiseleva Alyona)
+* common: fix LTTNG vs fork issue (Josh Durgin)
+* crush: fix has_v4_buckets (#11364 Sage Weil)
+* crushtool: fix order of operations, usage (Sage Weil)
+* debian: minor package reorg (Ken Dreyer)
+* doc: docuemnt object corpus generation (#11099 Alexis Normand)
+* doc: fix gender neutrality (Alexandre Maragone)
+* doc: fix install doc (#10957 Kefu Chai)
+* doc: fix sphinx issues (Kefu Chai)
+* doc: mds data structure docs (Yan, Zheng)
+* doc: misc updates (Nilamdyuti Goswami, Vartika Rai, Florian Haas, Loic Dachary, Simon Guinot, Andy Allan, Alistair Israel, Ken Dreyer, Robin Rehu, Lee Revell, Florian Marsylle, Thomas Johnson, Bosse Klykken, Travis Rhoden, Ian Kelling)
+* doc: swift tempurls (#10184 Abhishek Lekshmanan)
+* doc: switch doxygen integration back to breathe (#6115 Kefu Chai)
+* erasure-code: update ISA-L to 2.13 (Yuan Zhou)
+* gmock: switch to submodule (Danny Al-Gaaf, Loic Dachary)
+* hadoop: add terasort test (Noah Watkins)
+* java: fix libcephfs bindings (Noah Watkins)
+* libcephfs,ceph-fuse: fix request resend on cap reconnect (#10912 Yan, Zheng)
+* librados: define C++ flags from C constants (Josh Durgin)
+* librados: fix last_force_resent handling (#11026 Jianpeng Ma)
+* librados: fix memory leak from C_TwoContexts (Xiong Yiliang)
+* librados: fix striper when stripe_count = 1 and stripe_unit != object_size (#11120 Yan, Zheng)
+* librados: op perf counters (John Spray)
+* librados: pybind: fix write() method return code (Javier Guerra)
+* libradosstriper: fix leak (Danny Al-Gaaf)
+* librbd: add purge_on_error cache behavior (Jianpeng Ma)
+* librbd: misc aio fixes (#5488 Jason Dillaman)
+* librbd: misc rbd fixes (#11478 #11113 #11342 #11380 Jason Dillaman, Zhiqiang Wang)
+* librbd: readahead fixes (Zhiqiang Wang)
+* librbd: store metadata, including config options, in image (Haomai Wang)
+* mds: add 'damaged' state to MDSMap (John Spray)
+* mds: add nicknames for perfcounters (John Spray)
+* mds: disable problematic rstat propagation into snap parents (Yan, Zheng)
+* mds: fix mydir replica issue with shutdown (#10743 John Spray)
+* mds: fix out-of-order messages (#11258 Yan, Zheng)
+* mds: fix shutdown with strays (#10744 John Spray)
+* mds: fix snapshot fixes (Yan, Zheng)
+* mds: fix stray handling (John Spray)
+* mds: flush immediately in do_open_truncate (#11011 John Spray)
+* mds: improve dump methods (John Spray)
+* mds: misc journal cleanups and fixes (#10368 John Spray)
+* mds: new SessionMap storage using omap (#10649 John Spray)
+* mds: reduce memory consumption (Yan, Zheng)
+* mds: throttle purge stray operations (#10390 John Spray)
+* mds: tolerate clock jumping backwards (#11053 Yan, Zheng)
+* misc coverity fixes (Danny Al-Gaaf)
+* mon: do not deactivate last mds (#10862 John Spray)
+* mon: make osd get pool 'all' only return applicable fields (#10891 Michal Jarzabek)
+* mon: warn on bogus cache tier config (Jianpeng Ma)
+* msg/async: misc bug fixes and updates (Haomai Wang)
+* msg/simple: fix connect_seq assert (Haomai Wang)
+* msg/xio: misc fixes (#10735 Matt Benjamin, Kefu Chai, Danny Al-Gaaf, Raju Kurunkad, Vu Pham)
+* msg: unit tests (Haomai Wang)
+* objectcacher: misc bug fixes (Jianpeng Ma)
+* os/filestore: enlarge getxattr buffer size (Jianpeng Ma)
+* osd: EIO injection (David Zhang)
+* osd: add misc perfcounters (Xinze Chi)
+* osd: add simple sleep injection in recovery (Sage Weil)
+* osd: allow SEEK_HOLE/SEEK_DATA for sparse read (Zhiqiang Wang)
+* osd: avoid dup omap sets for in pg metadata (Sage Weil)
+* osd: clean up some constness, privateness (Kefu Chai)
+* osd: erasure-code: drop entries according to LRU (Andreas-Joachim Peters)
+* osd: fix negative degraded stats during backfill (Guang Yang)
+* osd: misc fixes (Ning Yao, Kefu Chai, Xinze Chi, Zhiqiang Wang, Jianpeng Ma)
+* pybind: pep8 cleanups (Danny Al-Gaaf)
+* qa: fix filelock_interrupt.py test (Yan, Zheng)
+* qa: improve ceph-disk tests (Loic Dachary)
+* qa: improve docker build layers (Loic Dachary)
+* rados: translate erno to string in CLI (#10877 Kefu Chai)
+* rbd: accept map options config option (Ilya Dryomov)
+* rbd: cli: fix arg parsing with --io-pattern (Dmitry Yatsushkevich)
+* rbd: fix error messages (#2862 Rajesh Nambiar)
+* rbd: update rbd man page (Ilya Dryomov)
+* rbd: update xfstests tests (Douglas Fuller)
+* rgw: add X-Timestamp for Swift containers (#10938 Radoslaw Zarzynski)
+* rgw: add missing headers to Swift container details (#10666 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: add stats to headers for account GET (#10684 Yuan Zhou)
+* rgw: do not prefecth data for HEAD requests (Guang Yang)
+* rgw: don't clobber bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
+* rgw: don't use rgw_socket_path if frontend is configured (#11160 Yehuda Sadeh)
+* rgw: enforce Content-Lenth for POST on Swift cont/obj (#10661 Radoslaw Zarzynski)
+* rgw: fix handling empty metadata items on Swift container (#11088 Radoslaw Zarzynski)
+* rgw: fix log rotation (Wuxingyi)
+* rgw: generate Date header for civetweb (#10873 Radoslaw Zarzynski)
+* rgw: make init script wait for radosgw to stop (#11140 Dmitry Yatsushkevich)
+* rgw: make quota/gc threads configurable (#11047 Guang Yang)
+* rgw: pass in civetweb configurables (#10907 Yehuda Sadeh)
+* rgw: rectify 202 Accepted in PUT response (#11148 Radoslaw Zarzynski)
+* rgw: remove meta file after deleting bucket (#11149 Orit Wasserman)
+* rgw: swift: allow setting attributes with COPY (#10662 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: swift: fix metadata handling on copy (#10645 Radoslaw Zarzynski)
+* rgw: swift: send Last-Modified header (#10650 Radoslaw Zarzynski)
+* rgw: update keystone cache with token info (#11125 Yehuda Sadeh)
+* rgw: update to latest civetweb, enable config for IPv6 (#10965 Yehuda Sadeh)
+* rocksdb: update to latest (Xiaoxi Chen)
+* rpm: loosen ceph-test dependencies (Ken Dreyer)
+
+v0.94.6 Hammer
+======================
+
+This Hammer point release fixes a range of bugs, most notably a fix
+for unbounded growth of the monitor's leveldb store, and a workaround
+in the OSD to keep most xattrs small enough to be stored inline in XFS
+inodes.
+
+We recommend that all hammer v0.94.x users upgrade.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.94.6.txt>`.
+
+Notable Changes
+---------------
+* build/ops: Ceph daemon failed to start, because the service name was already used. (`issue#13474 <http://tracker.ceph.com/issues/13474>`_, `pr#6832 <http://github.com/ceph/ceph/pull/6832>`_, Chuanhong Wang)
+* build/ops: LTTng-UST tracing should be dynamically enabled (`issue#13274 <http://tracker.ceph.com/issues/13274>`_, `pr#6415 <http://github.com/ceph/ceph/pull/6415>`_, Jason Dillaman)
+* build/ops: ceph upstart script rbdmap.conf incorrectly processes parameters (`issue#13214 <http://tracker.ceph.com/issues/13214>`_, `pr#6159 <http://github.com/ceph/ceph/pull/6159>`_, Sage Weil)
+* build/ops: ceph.spec.in License line does not reflect COPYING (`issue#12935 <http://tracker.ceph.com/issues/12935>`_, `pr#6680 <http://github.com/ceph/ceph/pull/6680>`_, Nathan Cutler)
+* build/ops: ceph.spec.in libcephfs_jni1 has no %post and %postun  (`issue#12927 <http://tracker.ceph.com/issues/12927>`_, `pr#5789 <http://github.com/ceph/ceph/pull/5789>`_, Owen Synge)
+* build/ops: configure.ac: no use to add "+" before ac_ext=c (`issue#14330 <http://tracker.ceph.com/issues/14330>`_, `pr#6973 <http://github.com/ceph/ceph/pull/6973>`_, Kefu Chai, Robin H. Johnson)
+* build/ops: deb: strip tracepoint libraries from Wheezy/Precise builds (`issue#14801 <http://tracker.ceph.com/issues/14801>`_, `pr#7316 <http://github.com/ceph/ceph/pull/7316>`_, Jason Dillaman)
+* build/ops: init script reload doesn't work on EL7 (`issue#13709 <http://tracker.ceph.com/issues/13709>`_, `pr#7187 <http://github.com/ceph/ceph/pull/7187>`_, Hervé Rousseau)
+* build/ops: init-rbdmap uses distro-specific functions (`issue#12415 <http://tracker.ceph.com/issues/12415>`_, `pr#6528 <http://github.com/ceph/ceph/pull/6528>`_, Boris Ranto)
+* build/ops: logrotate reload error on Ubuntu 14.04 (`issue#11330 <http://tracker.ceph.com/issues/11330>`_, `pr#5787 <http://github.com/ceph/ceph/pull/5787>`_, Sage Weil)
+* build/ops: miscellaneous spec file fixes (`issue#12931 <http://tracker.ceph.com/issues/12931>`_, `issue#12994 <http://tracker.ceph.com/issues/12994>`_, `issue#12924 <http://tracker.ceph.com/issues/12924>`_, `issue#12360 <http://tracker.ceph.com/issues/12360>`_, `pr#5790 <http://github.com/ceph/ceph/pull/5790>`_, Boris Ranto, Nathan Cutler, Owen Synge, Travis Rhoden, Ken Dreyer)
+* build/ops: pass tcmalloc env through to ceph-os (`issue#14802 <http://tracker.ceph.com/issues/14802>`_, `pr#7365 <http://github.com/ceph/ceph/pull/7365>`_, Sage Weil)
+* build/ops: rbd-replay-* moved from ceph-test-dbg to ceph-common-dbg as well (`issue#13785 <http://tracker.ceph.com/issues/13785>`_, `pr#6580 <http://github.com/ceph/ceph/pull/6580>`_, Loic Dachary)
+* build/ops: unknown argument --quiet in udevadm settle (`issue#13560 <http://tracker.ceph.com/issues/13560>`_, `pr#6530 <http://github.com/ceph/ceph/pull/6530>`_, Jason Dillaman)
+* common: Objecter: pool op callback may hang forever. (`issue#13642 <http://tracker.ceph.com/issues/13642>`_, `pr#6588 <http://github.com/ceph/ceph/pull/6588>`_, xie xingguo)
+* common: Objecter: potential null pointer access when do pool_snap_list. (`issue#13639 <http://tracker.ceph.com/issues/13639>`_, `pr#6839 <http://github.com/ceph/ceph/pull/6839>`_, xie xingguo)
+* common: ThreadPool add/remove work queue methods not thread safe (`issue#12662 <http://tracker.ceph.com/issues/12662>`_, `pr#5889 <http://github.com/ceph/ceph/pull/5889>`_, Jason Dillaman)
+* common: auth/cephx: large amounts of log are produced by osd (`issue#13610 <http://tracker.ceph.com/issues/13610>`_, `pr#6835 <http://github.com/ceph/ceph/pull/6835>`_, Qiankun Zheng)
+* common: client nonce collision due to unshared pid namespaces (`issue#13032 <http://tracker.ceph.com/issues/13032>`_, `pr#6151 <http://github.com/ceph/ceph/pull/6151>`_, Josh Durgin)
+* common: common/Thread:pthread_attr_destroy(thread_attr) when done with it (`issue#12570 <http://tracker.ceph.com/issues/12570>`_, `pr#6157 <http://github.com/ceph/ceph/pull/6157>`_, Piotr Dałek)
+* common: log: Log.cc: Assign LOG_DEBUG priority to syslog calls (`issue#13993 <http://tracker.ceph.com/issues/13993>`_, `pr#6994 <http://github.com/ceph/ceph/pull/6994>`_, Brad Hubbard)
+* common: objecter: cancellation bugs (`issue#13071 <http://tracker.ceph.com/issues/13071>`_, `pr#6155 <http://github.com/ceph/ceph/pull/6155>`_, Jianpeng Ma)
+* common: pure virtual method called (`issue#13636 <http://tracker.ceph.com/issues/13636>`_, `pr#6587 <http://github.com/ceph/ceph/pull/6587>`_, Jason Dillaman)
+* common: small probability sigabrt when setting rados_osd_op_timeout (`issue#13208 <http://tracker.ceph.com/issues/13208>`_, `pr#6143 <http://github.com/ceph/ceph/pull/6143>`_, Ruifeng Yang)
+* common: wrong conditional for boolean function KeyServer::get_auth() (`issue#9756 <http://tracker.ceph.com/issues/9756>`_, `issue#13424 <http://tracker.ceph.com/issues/13424>`_, `pr#6213 <http://github.com/ceph/ceph/pull/6213>`_, Nathan Cutler)
+* crush: crash if we see CRUSH_ITEM_NONE in early rule step (`issue#13477 <http://tracker.ceph.com/issues/13477>`_, `pr#6430 <http://github.com/ceph/ceph/pull/6430>`_, Sage Weil)
+* doc: man: document listwatchers cmd in "rados" manpage (`issue#14556 <http://tracker.ceph.com/issues/14556>`_, `pr#7434 <http://github.com/ceph/ceph/pull/7434>`_, Kefu Chai)
+* doc: regenerate man pages, add orphans commands to radosgw-admin(8) (`issue#14637 <http://tracker.ceph.com/issues/14637>`_, `pr#7524 <http://github.com/ceph/ceph/pull/7524>`_, Ken Dreyer)
+* fs: CephFS restriction on removing cache tiers is overly strict (`issue#11504 <http://tracker.ceph.com/issues/11504>`_, `pr#6402 <http://github.com/ceph/ceph/pull/6402>`_, John Spray)
+* fs: fsstress.sh fails (`issue#12710 <http://tracker.ceph.com/issues/12710>`_, `pr#7454 <http://github.com/ceph/ceph/pull/7454>`_, Yan, Zheng)
+* librados: LibRadosWatchNotify.WatchNotify2Timeout (`issue#13114 <http://tracker.ceph.com/issues/13114>`_, `pr#6336 <http://github.com/ceph/ceph/pull/6336>`_, Sage Weil)
+* librbd: ImageWatcher shouldn't block the notification thread (`issue#14373 <http://tracker.ceph.com/issues/14373>`_, `pr#7407 <http://github.com/ceph/ceph/pull/7407>`_, Jason Dillaman)
+* librbd: diff_iterate needs to handle holes in parent images (`issue#12885 <http://tracker.ceph.com/issues/12885>`_, `pr#6097 <http://github.com/ceph/ceph/pull/6097>`_, Jason Dillaman)
+* librbd: fix merge-diff for >2GB diff-files (`issue#14030 <http://tracker.ceph.com/issues/14030>`_, `pr#6980 <http://github.com/ceph/ceph/pull/6980>`_, Jason Dillaman)
+* librbd: invalidate object map on error even w/o holding lock (`issue#13372 <http://tracker.ceph.com/issues/13372>`_, `pr#6289 <http://github.com/ceph/ceph/pull/6289>`_, Jason Dillaman)
+* librbd: reads larger than cache size hang (`issue#13164 <http://tracker.ceph.com/issues/13164>`_, `pr#6354 <http://github.com/ceph/ceph/pull/6354>`_, Lu Shi)
+* mds: ceph mds add_data_pool check for EC pool is wrong (`issue#12426 <http://tracker.ceph.com/issues/12426>`_, `pr#5766 <http://github.com/ceph/ceph/pull/5766>`_, John Spray)
+* mon: MonitorDBStore: get_next_key() only if prefix matches (`issue#11786 <http://tracker.ceph.com/issues/11786>`_, `pr#5361 <http://github.com/ceph/ceph/pull/5361>`_, Joao Eduardo Luis)
+* mon: OSDMonitor: do not assume a session exists in send_incremental() (`issue#14236 <http://tracker.ceph.com/issues/14236>`_, `pr#7150 <http://github.com/ceph/ceph/pull/7150>`_, Joao Eduardo Luis)
+* mon: check for store writeablility before participating in election (`issue#13089 <http://tracker.ceph.com/issues/13089>`_, `pr#6144 <http://github.com/ceph/ceph/pull/6144>`_, Sage Weil)
+* mon: compact full epochs also (`issue#14537 <http://tracker.ceph.com/issues/14537>`_, `pr#7446 <http://github.com/ceph/ceph/pull/7446>`_, Kefu Chai)
+* mon: include min_last_epoch_clean as part of PGMap::print_summary and PGMap::dump (`issue#13198 <http://tracker.ceph.com/issues/13198>`_, `pr#6152 <http://github.com/ceph/ceph/pull/6152>`_, Guang Yang)
+* mon: map_cache can become inaccurate if osd does not receive the osdmaps (`issue#10930 <http://tracker.ceph.com/issues/10930>`_, `pr#5773 <http://github.com/ceph/ceph/pull/5773>`_, Kefu Chai)
+* mon: should not set isvalid = true when cephx_verify_authorizer return false (`issue#13525 <http://tracker.ceph.com/issues/13525>`_, `pr#6391 <http://github.com/ceph/ceph/pull/6391>`_, Ruifeng Yang)
+* osd: Ceph Pools' MAX AVAIL is 0 if some OSDs' weight is 0 (`issue#13840 <http://tracker.ceph.com/issues/13840>`_, `pr#6834 <http://github.com/ceph/ceph/pull/6834>`_, Chengyuan Li)
+* osd: FileStore calls syncfs(2) even it is not supported (`issue#12512 <http://tracker.ceph.com/issues/12512>`_, `pr#5530 <http://github.com/ceph/ceph/pull/5530>`_, Kefu Chai)
+* osd: FileStore: potential memory leak if getattrs fails. (`issue#13597 <http://tracker.ceph.com/issues/13597>`_, `pr#6420 <http://github.com/ceph/ceph/pull/6420>`_, xie xingguo)
+* osd: IO error on kvm/rbd with an erasure coded pool tier (`issue#12012 <http://tracker.ceph.com/issues/12012>`_, `pr#5897 <http://github.com/ceph/ceph/pull/5897>`_, Kefu Chai)
+* osd: OSD::build_past_intervals_parallel() shall reset primary and up_primary when begin a new past_interval. (`issue#13471 <http://tracker.ceph.com/issues/13471>`_, `pr#6398 <http://github.com/ceph/ceph/pull/6398>`_, xiexingguo)
+* osd: ReplicatedBackend: populate recovery_info.size for clone (bug symptom is size mismatch on replicated backend on a clone in scrub) (`issue#12828 <http://tracker.ceph.com/issues/12828>`_, `pr#6153 <http://github.com/ceph/ceph/pull/6153>`_, Samuel Just)
+* osd: ReplicatedPG: wrong result code checking logic during sparse_read (`issue#14151 <http://tracker.ceph.com/issues/14151>`_, `pr#7179 <http://github.com/ceph/ceph/pull/7179>`_, xie xingguo)
+* osd: ReplicatedPG::hit_set_trim osd/ReplicatedPG.cc: 11006: FAILED assert(obc) (`issue#13192 <http://tracker.ceph.com/issues/13192>`_, `issue#9732 <http://tracker.ceph.com/issues/9732>`_, `issue#12968 <http://tracker.ceph.com/issues/12968>`_, `pr#5825 <http://github.com/ceph/ceph/pull/5825>`_, Kefu Chai, Zhiqiang Wang, Samuel Just, David Zafman)
+* osd: avoid multi set osd_op.outdata in tier pool (`issue#12540 <http://tracker.ceph.com/issues/12540>`_, `pr#6060 <http://github.com/ceph/ceph/pull/6060>`_, Xinze Chi)
+* osd: bug with cache/tiering and snapshot reads (`issue#12748 <http://tracker.ceph.com/issues/12748>`_, `pr#6589 <http://github.com/ceph/ceph/pull/6589>`_, Kefu Chai)
+* osd: ceph osd pool stats broken in hammer (`issue#13843 <http://tracker.ceph.com/issues/13843>`_, `pr#7180 <http://github.com/ceph/ceph/pull/7180>`_, BJ Lougee)
+* osd: ceph-disk prepare fails if device is a symlink (`issue#13438 <http://tracker.ceph.com/issues/13438>`_, `pr#7176 <http://github.com/ceph/ceph/pull/7176>`_, Joe Julian)
+* osd: check for full before changing the cached obc (hammer) (`issue#13098 <http://tracker.ceph.com/issues/13098>`_, `pr#6918 <http://github.com/ceph/ceph/pull/6918>`_, Alexey Sheplyakov)
+* osd: config_opts: increase suicide timeout to 300 to match recovery (`issue#14376 <http://tracker.ceph.com/issues/14376>`_, `pr#7236 <http://github.com/ceph/ceph/pull/7236>`_, Samuel Just)
+* osd: disable filestore_xfs_extsize by default (`issue#14397 <http://tracker.ceph.com/issues/14397>`_, `pr#7411 <http://github.com/ceph/ceph/pull/7411>`_, Ken Dreyer)
+* osd: do not cache unused memory in attrs (`issue#12565 <http://tracker.ceph.com/issues/12565>`_, `pr#6499 <http://github.com/ceph/ceph/pull/6499>`_, Xinze Chi, Ning Yao)
+* osd: dumpling incrementals do not work properly on hammer and newer (`issue#13234 <http://tracker.ceph.com/issues/13234>`_, `pr#6132 <http://github.com/ceph/ceph/pull/6132>`_, Samuel Just)
+* osd: filestore: fix peek_queue for OpSequencer (`issue#13209 <http://tracker.ceph.com/issues/13209>`_, `pr#6145 <http://github.com/ceph/ceph/pull/6145>`_, Xinze Chi)
+* osd: hit set clear repops fired in same epoch as map change -- segfault since they fall into the new interval even though the repops are cleared (`issue#12809 <http://tracker.ceph.com/issues/12809>`_, `pr#5890 <http://github.com/ceph/ceph/pull/5890>`_, Samuel Just)
+* osd: object_info_t::decode() has wrong version (`issue#13462 <http://tracker.ceph.com/issues/13462>`_, `pr#6335 <http://github.com/ceph/ceph/pull/6335>`_, David Zafman)
+* osd: osd/OSD.cc: 2469: FAILED assert(pg_stat_queue.empty()) on shutdown (`issue#14212 <http://tracker.ceph.com/issues/14212>`_, `pr#7178 <http://github.com/ceph/ceph/pull/7178>`_, Sage Weil)
+* osd: osd/PG.cc: 288: FAILED assert(info.last_epoch_started >= info.history.last_epoch_started) (`issue#14015 <http://tracker.ceph.com/issues/14015>`_, `pr#7177 <http://github.com/ceph/ceph/pull/7177>`_, David Zafman)
+* osd: osd/PG.cc: 3837: FAILED assert(0 == "Running incompatible OSD") (`issue#11661 <http://tracker.ceph.com/issues/11661>`_, `pr#7206 <http://github.com/ceph/ceph/pull/7206>`_, David Zafman)
+* osd: osd/ReplicatedPG: Recency fix (`issue#14320 <http://tracker.ceph.com/issues/14320>`_, `pr#7207 <http://github.com/ceph/ceph/pull/7207>`_, Sage Weil, Robert LeBlanc)
+* osd: pg stuck in replay (`issue#13116 <http://tracker.ceph.com/issues/13116>`_, `pr#6401 <http://github.com/ceph/ceph/pull/6401>`_, Sage Weil)
+* osd: race condition detected during send_failures (`issue#13821 <http://tracker.ceph.com/issues/13821>`_, `pr#6755 <http://github.com/ceph/ceph/pull/6755>`_, Sage Weil)
+* osd: randomize scrub times (`issue#10973 <http://tracker.ceph.com/issues/10973>`_, `pr#6199 <http://github.com/ceph/ceph/pull/6199>`_, Kefu Chai)
+* osd: requeue_scrub when kick_object_context_blocked (`issue#12515 <http://tracker.ceph.com/issues/12515>`_, `pr#5891 <http://github.com/ceph/ceph/pull/5891>`_, Xinze Chi)
+* osd: revert: use GMT time for hitsets (`issue#13812 <http://tracker.ceph.com/issues/13812>`_, `pr#6644 <http://github.com/ceph/ceph/pull/6644>`_, Loic Dachary)
+* osd: segfault in agent_work (`issue#13199 <http://tracker.ceph.com/issues/13199>`_, `pr#6146 <http://github.com/ceph/ceph/pull/6146>`_, Samuel Just)
+* osd: should recalc the min_last_epoch_clean when decode PGMap (`issue#13112 <http://tracker.ceph.com/issues/13112>`_, `pr#6154 <http://github.com/ceph/ceph/pull/6154>`_, Kefu Chai)
+* osd: smaller object_info_t xattrs (`issue#14803 <http://tracker.ceph.com/issues/14803>`_, `pr#6544 <http://github.com/ceph/ceph/pull/6544>`_, Sage Weil)
+* osd: we do not ignore notify from down osds (`issue#12990 <http://tracker.ceph.com/issues/12990>`_, `pr#6158 <http://github.com/ceph/ceph/pull/6158>`_, Samuel Just)
+* rbd: QEMU hangs after creating snapshot and stopping VM (`issue#13726 <http://tracker.ceph.com/issues/13726>`_, `pr#6586 <http://github.com/ceph/ceph/pull/6586>`_, Jason Dillaman)
+* rbd: TaskFinisher::cancel should remove event from SafeTimer (`issue#14476 <http://tracker.ceph.com/issues/14476>`_, `pr#7417 <http://github.com/ceph/ceph/pull/7417>`_, Douglas Fuller)
+* rbd: avoid re-writing old-format image header on resize (`issue#13674 <http://tracker.ceph.com/issues/13674>`_, `pr#6585 <http://github.com/ceph/ceph/pull/6585>`_, Jason Dillaman)
+* rbd: fix bench-write (`issue#14225 <http://tracker.ceph.com/issues/14225>`_, `pr#7183 <http://github.com/ceph/ceph/pull/7183>`_, Sage Weil)
+* rbd: rbd-replay does not check for EOF and goes to endless loop (`issue#14452 <http://tracker.ceph.com/issues/14452>`_, `pr#7416 <http://github.com/ceph/ceph/pull/7416>`_, Mykola Golub)
+* rbd: rbd-replay-prep and rbd-replay improvements (`issue#13221 <http://tracker.ceph.com/issues/13221>`_, `issue#13220 <http://tracker.ceph.com/issues/13220>`_, `issue#13378 <http://tracker.ceph.com/issues/13378>`_, `pr#6286 <http://github.com/ceph/ceph/pull/6286>`_, Jason Dillaman)
+* rbd: verify self-managed snapshot functionality on image create (`issue#13633 <http://tracker.ceph.com/issues/13633>`_, `pr#7182 <http://github.com/ceph/ceph/pull/7182>`_, Jason Dillaman)
+* rgw: Make RGW_MAX_PUT_SIZE configurable (`issue#6999 <http://tracker.ceph.com/issues/6999>`_, `pr#7441 <http://github.com/ceph/ceph/pull/7441>`_, Vladislav Odintsov, Yuan Zhou)
+* rgw: Setting ACL on Object removes ETag (`issue#12955 <http://tracker.ceph.com/issues/12955>`_, `pr#6620 <http://github.com/ceph/ceph/pull/6620>`_, Brian Felton)
+* rgw: backport content-type casing (`issue#12939 <http://tracker.ceph.com/issues/12939>`_, `pr#5910 <http://github.com/ceph/ceph/pull/5910>`_, Robin H. Johnson)
+* rgw: bucket listing hangs on versioned buckets (`issue#12913 <http://tracker.ceph.com/issues/12913>`_, `pr#6352 <http://github.com/ceph/ceph/pull/6352>`_, Yehuda Sadeh)
+* rgw: fix wrong etag calculation during POST on S3 bucket. (`issue#11241 <http://tracker.ceph.com/issues/11241>`_, `pr#7442 <http://github.com/ceph/ceph/pull/7442>`_, Vladislav Odintsov, Radoslaw Zarzynski)
+* rgw: get bucket location returns region name, not region api name (`issue#13458 <http://tracker.ceph.com/issues/13458>`_, `pr#6349 <http://github.com/ceph/ceph/pull/6349>`_, Yehuda Sadeh)
+* rgw: missing handling of encoding-type=url when listing keys in bucket (`issue#12735 <http://tracker.ceph.com/issues/12735>`_, `pr#6527 <http://github.com/ceph/ceph/pull/6527>`_, Jeff Weber)
+* rgw: orphan tool should be careful about removing head objects (`issue#12958 <http://tracker.ceph.com/issues/12958>`_, `pr#6351 <http://github.com/ceph/ceph/pull/6351>`_, Yehuda Sadeh)
+* rgw: orphans finish segfaults (`issue#13824 <http://tracker.ceph.com/issues/13824>`_, `pr#7186 <http://github.com/ceph/ceph/pull/7186>`_, Igor Fedotov)
+* rgw: rgw-admin: document orphans commands in usage (`issue#14516 <http://tracker.ceph.com/issues/14516>`_, `pr#7526 <http://github.com/ceph/ceph/pull/7526>`_, Yehuda Sadeh)
+* rgw: swift API returns more than real object count and bytes used when retrieving account metadata (`issue#13140 <http://tracker.ceph.com/issues/13140>`_, `pr#6512 <http://github.com/ceph/ceph/pull/6512>`_, Sangdi Xu)
+* rgw: swift use Civetweb ssl can not get right url (`issue#13628 <http://tracker.ceph.com/issues/13628>`_, `pr#6491 <http://github.com/ceph/ceph/pull/6491>`_, Weijun Duan)
+* rgw: value of Swift API's X-Object-Manifest header is not url_decoded during segment look up (`issue#12728 <http://tracker.ceph.com/issues/12728>`_, `pr#6353 <http://github.com/ceph/ceph/pull/6353>`_, Radoslaw Zarzynski)
+* tests: fixed broken Makefiles after integration of ttng into rados (`issue#13210 <http://tracker.ceph.com/issues/13210>`_, `pr#6322 <http://github.com/ceph/ceph/pull/6322>`_, Sebastien Ponce)
+* tests: fsx failed to compile (`issue#14384 <http://tracker.ceph.com/issues/14384>`_, `pr#7501 <http://github.com/ceph/ceph/pull/7501>`_, Greg Farnum)
+* tests: notification slave needs to wait for master (`issue#13810 <http://tracker.ceph.com/issues/13810>`_, `pr#7226 <http://github.com/ceph/ceph/pull/7226>`_, Jason Dillaman)
+* tests: qa: remove legacy OS support from rbd/qemu-iotests (`issue#13483 <http://tracker.ceph.com/issues/13483>`_, `issue#14385 <http://tracker.ceph.com/issues/14385>`_, `pr#7252 <http://github.com/ceph/ceph/pull/7252>`_, Vasu Kulkarni, Jason Dillaman)
+* tests: testprofile must be removed before it is re-created (`issue#13664 <http://tracker.ceph.com/issues/13664>`_, `pr#6450 <http://github.com/ceph/ceph/pull/6450>`_, Loic Dachary)
+* tools: ceph-monstore-tool must do out_store.close() (`issue#10093 <http://tracker.ceph.com/issues/10093>`_, `pr#7347 <http://github.com/ceph/ceph/pull/7347>`_, huangjun)
+* tools: heavy memory shuffling in rados bench (`issue#12946 <http://tracker.ceph.com/issues/12946>`_, `pr#5810 <http://github.com/ceph/ceph/pull/5810>`_, Piotr Dałek)
+* tools: race condition in rados bench (`issue#12947 <http://tracker.ceph.com/issues/12947>`_, `pr#6791 <http://github.com/ceph/ceph/pull/6791>`_, Piotr Dałek)
+* tools: tool for artificially inflate the leveldb of the mon store for testing purposes  (`issue#10093 <http://tracker.ceph.com/issues/10093>`_, `issue#11815 <http://tracker.ceph.com/issues/11815>`_, `issue#14217 <http://tracker.ceph.com/issues/14217>`_, `pr#7412 <http://github.com/ceph/ceph/pull/7412>`_, Cilang Zhao, Bo Cai, Kefu Chai, huangjun, Joao Eduardo Luis)
+
+v0.94.5 Hammer
+==============
+
+This Hammer point release fixes a critical regression in librbd that can cause
+Qemu/KVM to crash when caching is enabled on images that have been cloned.
+
+All v0.94.4 Hammer users are strongly encouraged to upgrade.
+
+Notable Changes
+---------------
+* librbd: potential assertion failure during cache read (`issue#13559 <http://tracker.ceph.com/issues/13559>`_, `pr#6348 <http://github.com/ceph/ceph/pull/6348>`_, Jason Dillaman)
+* osd: osd/ReplicatedPG: remove stray debug line (`issue#13455 <http://tracker.ceph.com/issues/13455>`_, `pr#6362 <http://github.com/ceph/ceph/pull/6362>`_, Sage Weil)
+* tests: qemu workunit refers to apt-mirror.front.sepia.ceph.com (`issue#13420 <http://tracker.ceph.com/issues/13420>`_, `pr#6330 <http://github.com/ceph/ceph/pull/6330>`_, Yuan Zhou)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.94.5.txt>`.
+
+v0.94.4 Hammer
+==============
+
+This Hammer point release fixes several important bugs in Hammer, as well as
+fixing interoperability issues that are required before an upgrade to
+Infernalis. That is, all users of earlier version of Hammer or any
+version of Firefly will first need to upgrade to hammer v0.94.4 or
+later before upgrading to Infernalis (or future releases).
+
+All v0.94.x Hammer users are strongly encouraged to upgrade.
+
+Notable Changes
+---------------
+* build/ops: ceph.spec.in: 50-rbd.rules conditional is wrong (`issue#12166 <http://tracker.ceph.com/issues/12166>`_, `pr#5207 <http://github.com/ceph/ceph/pull/5207>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: ceph-common needs python-argparse on older distros, but doesn't require it (`issue#12034 <http://tracker.ceph.com/issues/12034>`_, `pr#5216 <http://github.com/ceph/ceph/pull/5216>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: radosgw requires apache for SUSE only -- makes no sense (`issue#12358 <http://tracker.ceph.com/issues/12358>`_, `pr#5411 <http://github.com/ceph/ceph/pull/5411>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: rpm: cephfs_java not fully conditionalized (`issue#11991 <http://tracker.ceph.com/issues/11991>`_, `pr#5202 <http://github.com/ceph/ceph/pull/5202>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: rpm: not possible to turn off Java (`issue#11992 <http://tracker.ceph.com/issues/11992>`_, `pr#5203 <http://github.com/ceph/ceph/pull/5203>`_, Owen Synge)
+* build/ops: ceph.spec.in: running fdupes unnecessarily (`issue#12301 <http://tracker.ceph.com/issues/12301>`_, `pr#5223 <http://github.com/ceph/ceph/pull/5223>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: snappy-devel for all supported distros (`issue#12361 <http://tracker.ceph.com/issues/12361>`_, `pr#5264 <http://github.com/ceph/ceph/pull/5264>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: SUSE/openSUSE builds need libbz2-devel (`issue#11629 <http://tracker.ceph.com/issues/11629>`_, `pr#5204 <http://github.com/ceph/ceph/pull/5204>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: useless %py_requires breaks SLE11-SP3 build (`issue#12351 <http://tracker.ceph.com/issues/12351>`_, `pr#5412 <http://github.com/ceph/ceph/pull/5412>`_, Nathan Cutler)
+* build/ops: error in ext_mime_map_init() when /etc/mime.types is missing (`issue#11864 <http://tracker.ceph.com/issues/11864>`_, `pr#5385 <http://github.com/ceph/ceph/pull/5385>`_, Ken Dreyer)
+* build/ops: upstart: limit respawn to 3 in 30 mins (instead of 5 in 30s) (`issue#11798 <http://tracker.ceph.com/issues/11798>`_, `pr#5930 <http://github.com/ceph/ceph/pull/5930>`_, Sage Weil)
+* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#10927 <http://tracker.ceph.com/issues/10927>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
+* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#11140 <http://tracker.ceph.com/issues/11140>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
+* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#11686 <http://tracker.ceph.com/issues/11686>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
+* build/ops: With root as default user, unable to have multiple RGW instances running (`issue#12407 <http://tracker.ceph.com/issues/12407>`_, `pr#6161 <http://github.com/ceph/ceph/pull/6161>`_, Sage Weil)
+* cli: ceph: cli throws exception on unrecognized errno (`issue#11354 <http://tracker.ceph.com/issues/11354>`_, `pr#5368 <http://github.com/ceph/ceph/pull/5368>`_, Kefu Chai)
+* cli: ceph tell: broken error message / misleading hinting (`issue#11101 <http://tracker.ceph.com/issues/11101>`_, `pr#5371 <http://github.com/ceph/ceph/pull/5371>`_, Kefu Chai)
+* common: arm: all programs that link to librados2 hang forever on startup (`issue#12505 <http://tracker.ceph.com/issues/12505>`_, `pr#5366 <http://github.com/ceph/ceph/pull/5366>`_, Boris Ranto)
+* common: buffer: critical bufferlist::zero bug (`issue#12252 <http://tracker.ceph.com/issues/12252>`_, `pr#5365 <http://github.com/ceph/ceph/pull/5365>`_, Haomai Wang)
+* common: ceph-object-corpus: add 0.94.2-207-g88e7ee7 hammer objects (`issue#13070 <http://tracker.ceph.com/issues/13070>`_, `pr#5551 <http://github.com/ceph/ceph/pull/5551>`_, Sage Weil)
+* common: do not insert emtpy ptr when rebuild emtpy bufferlist (`issue#12775 <http://tracker.ceph.com/issues/12775>`_, `pr#5764 <http://github.com/ceph/ceph/pull/5764>`_, Xinze Chi)
+* common: [  FAILED  ] TestLibRBD.BlockingAIO (`issue#12479 <http://tracker.ceph.com/issues/12479>`_, `pr#5768 <http://github.com/ceph/ceph/pull/5768>`_, Jason Dillaman)
+* common: LibCephFS.GetPoolId failure (`issue#12598 <http://tracker.ceph.com/issues/12598>`_, `pr#5887 <http://github.com/ceph/ceph/pull/5887>`_, Yan, Zheng)
+* common: Memory leak in Mutex.cc, pthread_mutexattr_init without pthread_mutexattr_destroy (`issue#11762 <http://tracker.ceph.com/issues/11762>`_, `pr#5378 <http://github.com/ceph/ceph/pull/5378>`_, Ketor Meng)
+* common: object_map_update fails with -EINVAL return code (`issue#12611 <http://tracker.ceph.com/issues/12611>`_, `pr#5559 <http://github.com/ceph/ceph/pull/5559>`_, Jason Dillaman)
+* common: Pipe: Drop connect_seq increase line (`issue#13093 <http://tracker.ceph.com/issues/13093>`_, `pr#5908 <http://github.com/ceph/ceph/pull/5908>`_, Haomai Wang)
+* common: recursive lock of md_config_t (0) (`issue#12614 <http://tracker.ceph.com/issues/12614>`_, `pr#5759 <http://github.com/ceph/ceph/pull/5759>`_, Josh Durgin)
+* crush: ceph osd crush reweight-subtree does not reweight parent node (`issue#11855 <http://tracker.ceph.com/issues/11855>`_, `pr#5374 <http://github.com/ceph/ceph/pull/5374>`_, Sage Weil)
+* doc: update docs to point to download.ceph.com (`issue#13162 <http://tracker.ceph.com/issues/13162>`_, `pr#6156 <http://github.com/ceph/ceph/pull/6156>`_, Alfredo Deza)
+* fs: ceph-fuse 0.94.2-1trusty segfaults / aborts (`issue#12297 <http://tracker.ceph.com/issues/12297>`_, `pr#5381 <http://github.com/ceph/ceph/pull/5381>`_, Greg Farnum)
+* fs: segfault launching ceph-fuse with bad --name (`issue#12417 <http://tracker.ceph.com/issues/12417>`_, `pr#5382 <http://github.com/ceph/ceph/pull/5382>`_, John Spray)
+* librados: Change radosgw pools default crush ruleset (`issue#11640 <http://tracker.ceph.com/issues/11640>`_, `pr#5754 <http://github.com/ceph/ceph/pull/5754>`_, Yuan Zhou)
+* librbd: correct issues discovered via lockdep / helgrind (`issue#12345 <http://tracker.ceph.com/issues/12345>`_, `pr#5296 <http://github.com/ceph/ceph/pull/5296>`_, Jason Dillaman)
+* librbd: Crash during TestInternal.MultipleResize (`issue#12664 <http://tracker.ceph.com/issues/12664>`_, `pr#5769 <http://github.com/ceph/ceph/pull/5769>`_, Jason Dillaman)
+* librbd: deadlock during cooperative exclusive lock transition (`issue#11537 <http://tracker.ceph.com/issues/11537>`_, `pr#5319 <http://github.com/ceph/ceph/pull/5319>`_, Jason Dillaman)
+* librbd: Possible crash while concurrently writing and shrinking an image (`issue#11743 <http://tracker.ceph.com/issues/11743>`_, `pr#5318 <http://github.com/ceph/ceph/pull/5318>`_, Jason Dillaman)
+* mon: add a cache layer over MonitorDBStore (`issue#12638 <http://tracker.ceph.com/issues/12638>`_, `pr#5697 <http://github.com/ceph/ceph/pull/5697>`_, Kefu Chai)
+* mon: fix crush testing for new pools (`issue#13400 <http://tracker.ceph.com/issues/13400>`_, `pr#6192 <http://github.com/ceph/ceph/pull/6192>`_, Sage Weil)
+* mon: get pools health'info have error (`issue#12402 <http://tracker.ceph.com/issues/12402>`_, `pr#5369 <http://github.com/ceph/ceph/pull/5369>`_, renhwztetecs)
+* mon: implicit erasure code crush ruleset is not validated (`issue#11814 <http://tracker.ceph.com/issues/11814>`_, `pr#5276 <http://github.com/ceph/ceph/pull/5276>`_, Loic Dachary)
+* mon: PaxosService: call post_refresh() instead of post_paxos_update() (`issue#11470 <http://tracker.ceph.com/issues/11470>`_, `pr#5359 <http://github.com/ceph/ceph/pull/5359>`_, Joao Eduardo Luis)
+* mon: pgmonitor: wrong at/near target max“ reporting (`issue#12401 <http://tracker.ceph.com/issues/12401>`_, `pr#5370 <http://github.com/ceph/ceph/pull/5370>`_, huangjun)
+* mon: register_new_pgs() should check ruleno instead of its index (`issue#12210 <http://tracker.ceph.com/issues/12210>`_, `pr#5377 <http://github.com/ceph/ceph/pull/5377>`_, Xinze Chi)
+* mon: Show osd as NONE in ceph osd map <pool> <object>  output (`issue#11820 <http://tracker.ceph.com/issues/11820>`_, `pr#5376 <http://github.com/ceph/ceph/pull/5376>`_, Shylesh Kumar)
+* mon: the output is wrong when runing ceph osd reweight (`issue#12251 <http://tracker.ceph.com/issues/12251>`_, `pr#5372 <http://github.com/ceph/ceph/pull/5372>`_, Joao Eduardo Luis)
+* osd: allow peek_map_epoch to return an error (`issue#13060 <http://tracker.ceph.com/issues/13060>`_, `pr#5892 <http://github.com/ceph/ceph/pull/5892>`_, Sage Weil)
+* osd: cache agent is idle although one object is left in the cache (`issue#12673 <http://tracker.ceph.com/issues/12673>`_, `pr#5765 <http://github.com/ceph/ceph/pull/5765>`_, Loic Dachary)
+* osd: copy-from doesn't preserve truncate_{seq,size} (`issue#12551 <http://tracker.ceph.com/issues/12551>`_, `pr#5885 <http://github.com/ceph/ceph/pull/5885>`_, Samuel Just)
+* osd: crash creating/deleting pools (`issue#12429 <http://tracker.ceph.com/issues/12429>`_, `pr#5527 <http://github.com/ceph/ceph/pull/5527>`_, John Spray)
+* osd: fix repair when recorded digest is wrong (`issue#12577 <http://tracker.ceph.com/issues/12577>`_, `pr#5468 <http://github.com/ceph/ceph/pull/5468>`_, Sage Weil)
+* osd: include/ceph_features: define HAMMER_0_94_4 feature (`issue#13026 <http://tracker.ceph.com/issues/13026>`_, `pr#5687 <http://github.com/ceph/ceph/pull/5687>`_, Sage Weil)
+* osd: is_new_interval() fixes (`issue#10399 <http://tracker.ceph.com/issues/10399>`_, `pr#5691 <http://github.com/ceph/ceph/pull/5691>`_, Jason Dillaman)
+* osd: is_new_interval() fixes (`issue#11771 <http://tracker.ceph.com/issues/11771>`_, `pr#5691 <http://github.com/ceph/ceph/pull/5691>`_, Jason Dillaman)
+* osd: long standing slow requests: connection->session->waiting_for_map->connection ref cycle (`issue#12338 <http://tracker.ceph.com/issues/12338>`_, `pr#5761 <http://github.com/ceph/ceph/pull/5761>`_, Samuel Just)
+* osd: Mutex Assert from PipeConnection::try_get_pipe (`issue#12437 <http://tracker.ceph.com/issues/12437>`_, `pr#5758 <http://github.com/ceph/ceph/pull/5758>`_, David Zafman)
+* osd: pg_interval_t::check_new_interval - for ec pool, should not rely on min_size to determine if the PG was active at the interval (`issue#12162 <http://tracker.ceph.com/issues/12162>`_, `pr#5373 <http://github.com/ceph/ceph/pull/5373>`_, Guang G Yang)
+* osd: PGLog.cc: 732: FAILED assert(log.log.size() == log_keys_debug.size()) (`issue#12652 <http://tracker.ceph.com/issues/12652>`_, `pr#5763 <http://github.com/ceph/ceph/pull/5763>`_, Sage Weil)
+* osd: PGLog::proc_replica_log: correctly handle case where entries between olog.head and log.tail were split out (`issue#11358 <http://tracker.ceph.com/issues/11358>`_, `pr#5380 <http://github.com/ceph/ceph/pull/5380>`_, Samuel Just)
+* osd: read on chunk-aligned xattr not handled (`issue#12309 <http://tracker.ceph.com/issues/12309>`_, `pr#5367 <http://github.com/ceph/ceph/pull/5367>`_, Sage Weil)
+* osd: suicide timeout during peering - search for missing objects (`issue#12523 <http://tracker.ceph.com/issues/12523>`_, `pr#5762 <http://github.com/ceph/ceph/pull/5762>`_, Guang G Yang)
+* osd: WBThrottle::clear_object: signal on cond when we reduce throttle values (`issue#12223 <http://tracker.ceph.com/issues/12223>`_, `pr#5757 <http://github.com/ceph/ceph/pull/5757>`_, Samuel Just)
+* rbd: crash during shutdown after writeback blocked by IO errors (`issue#12597 <http://tracker.ceph.com/issues/12597>`_, `pr#5767 <http://github.com/ceph/ceph/pull/5767>`_, Jianpeng Ma)
+* rgw: add delimiter to prefix only when path is specified (`issue#12960 <http://tracker.ceph.com/issues/12960>`_, `pr#5860 <http://github.com/ceph/ceph/pull/5860>`_, Sylvain Baubeau)
+* rgw: create a tool for orphaned objects cleanup (`issue#9604 <http://tracker.ceph.com/issues/9604>`_, `pr#5717 <http://github.com/ceph/ceph/pull/5717>`_, Yehuda Sadeh)
+* rgw: don't preserve acls when copying object (`issue#11563 <http://tracker.ceph.com/issues/11563>`_, `pr#6039 <http://github.com/ceph/ceph/pull/6039>`_, Yehuda Sadeh)
+* rgw: don't preserve acls when copying object (`issue#12370 <http://tracker.ceph.com/issues/12370>`_, `pr#6039 <http://github.com/ceph/ceph/pull/6039>`_, Yehuda Sadeh)
+* rgw: don't preserve acls when copying object (`issue#13015 <http://tracker.ceph.com/issues/13015>`_, `pr#6039 <http://github.com/ceph/ceph/pull/6039>`_, Yehuda Sadeh)
+* rgw: Ensure that swift keys don't include backslashes (`issue#7647 <http://tracker.ceph.com/issues/7647>`_, `pr#5716 <http://github.com/ceph/ceph/pull/5716>`_, Yehuda Sadeh)
+* rgw: GWWatcher::handle_error -> common/Mutex.cc: 95: FAILED assert(r == 0) (`issue#12208 <http://tracker.ceph.com/issues/12208>`_, `pr#6164 <http://github.com/ceph/ceph/pull/6164>`_, Yehuda Sadeh)
+* rgw: HTTP return code is not being logged by CivetWeb  (`issue#12432 <http://tracker.ceph.com/issues/12432>`_, `pr#5498 <http://github.com/ceph/ceph/pull/5498>`_, Yehuda Sadeh)
+* rgw: init_rados failed leads to repeated delete (`issue#12978 <http://tracker.ceph.com/issues/12978>`_, `pr#6165 <http://github.com/ceph/ceph/pull/6165>`_, Xiaowei Chen)
+* rgw: init some manifest fields when handling explicit objs (`issue#11455 <http://tracker.ceph.com/issues/11455>`_, `pr#5732 <http://github.com/ceph/ceph/pull/5732>`_, Yehuda Sadeh)
+* rgw: Keystone Fernet tokens break auth (`issue#12761 <http://tracker.ceph.com/issues/12761>`_, `pr#6162 <http://github.com/ceph/ceph/pull/6162>`_, Abhishek Lekshmanan)
+* rgw: region data still exist in region-map after region-map update (`issue#12964 <http://tracker.ceph.com/issues/12964>`_, `pr#6163 <http://github.com/ceph/ceph/pull/6163>`_, dwj192)
+* rgw: remove trailing :port from host for purposes of subdomain matching (`issue#12353 <http://tracker.ceph.com/issues/12353>`_, `pr#6042 <http://github.com/ceph/ceph/pull/6042>`_, Yehuda Sadeh)
+* rgw: rest-bench common/WorkQueue.cc: 54: FAILED assert(_threads.empty()) (`issue#3896 <http://tracker.ceph.com/issues/3896>`_, `pr#5383 <http://github.com/ceph/ceph/pull/5383>`_, huangjun)
+* rgw: returns requested bucket name raw in Bucket response header (`issue#12537 <http://tracker.ceph.com/issues/12537>`_, `pr#5715 <http://github.com/ceph/ceph/pull/5715>`_, Yehuda Sadeh)
+* rgw: segmentation fault when rgw_gc_max_objs > HASH_PRIME (`issue#12630 <http://tracker.ceph.com/issues/12630>`_, `pr#5719 <http://github.com/ceph/ceph/pull/5719>`_, Ruifeng Yang)
+* rgw: segments are read during HEAD on Swift DLO (`issue#12780 <http://tracker.ceph.com/issues/12780>`_, `pr#6160 <http://github.com/ceph/ceph/pull/6160>`_, Yehuda Sadeh)
+* rgw: setting max number of buckets for user via ceph.conf option  (`issue#12714 <http://tracker.ceph.com/issues/12714>`_, `pr#6166 <http://github.com/ceph/ceph/pull/6166>`_, Vikhyat Umrao)
+* rgw: Swift API: X-Trans-Id header is wrongly formatted (`issue#12108 <http://tracker.ceph.com/issues/12108>`_, `pr#5721 <http://github.com/ceph/ceph/pull/5721>`_, Radoslaw Zarzynski)
+* rgw: testGetContentType and testHead failed (`issue#11091 <http://tracker.ceph.com/issues/11091>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
+* rgw: testGetContentType and testHead failed (`issue#11438 <http://tracker.ceph.com/issues/11438>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
+* rgw: testGetContentType and testHead failed (`issue#12157 <http://tracker.ceph.com/issues/12157>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
+* rgw: testGetContentType and testHead failed (`issue#12158 <http://tracker.ceph.com/issues/12158>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
+* rgw: testGetContentType and testHead failed (`issue#12363 <http://tracker.ceph.com/issues/12363>`_, `pr#5718 <http://github.com/ceph/ceph/pull/5718>`_, Radoslaw Zarzynski)
+* rgw: the arguments 'domain' should not be assigned when return false (`issue#12629 <http://tracker.ceph.com/issues/12629>`_, `pr#5720 <http://github.com/ceph/ceph/pull/5720>`_, Ruifeng Yang)
+* tests: qa/workunits/cephtool/test.sh: don't assume crash_replay_interval=45 (`issue#13406 <http://tracker.ceph.com/issues/13406>`_, `pr#6172 <http://github.com/ceph/ceph/pull/6172>`_, Sage Weil)
+* tests: TEST_crush_rule_create_erasure consistently fails on i386 builder (`issue#12419 <http://tracker.ceph.com/issues/12419>`_, `pr#6201 <http://github.com/ceph/ceph/pull/6201>`_, Loic Dachary)
+* tools: ceph-disk zap should ensure block device (`issue#11272 <http://tracker.ceph.com/issues/11272>`_, `pr#5755 <http://github.com/ceph/ceph/pull/5755>`_, Loic Dachary)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.94.4.txt>`.
+
+
+v0.94.3 Hammer
+==============
+
+This Hammer point release fixes a critical (though rare) data
+corruption bug that could be triggered when logs are rotated via
+SIGHUP.  It also fixes a range of other important bugs in the OSD,
+monitor, RGW, RGW, and CephFS.
+
+All v0.94.x Hammer users are strongly encouraged to upgrade.
+
+Upgrading
+---------
+
+* The ``pg ls-by-{pool,primary,osd}`` commands and ``pg ls`` now take
+  the argument ``recovering`` instead of ``recovery`` in order to
+  include the recovering pgs in the listed pgs.
+
+Notable Changes
+---------------
+* librbd: aio calls may block (`issue#11770 <http://tracker.ceph.com/issues/11770>`_, `pr#4875 <http://github.com/ceph/ceph/pull/4875>`_, Jason Dillaman)
+* osd: make the all osd/filestore thread pool suicide timeouts separately configurable (`issue#11701 <http://tracker.ceph.com/issues/11701>`_, `pr#5159 <http://github.com/ceph/ceph/pull/5159>`_, Samuel Just)
+* mon: ceph fails to compile with boost 1.58 (`issue#11982 <http://tracker.ceph.com/issues/11982>`_, `pr#5122 <http://github.com/ceph/ceph/pull/5122>`_, Kefu Chai)
+* tests: TEST_crush_reject_empty must not run a mon (`issue#12285,11975 <http://tracker.ceph.com/issues/12285,11975>`_, `pr#5208 <http://github.com/ceph/ceph/pull/5208>`_, Kefu Chai)
+* osd: FAILED assert(!old_value.deleted()) in upgrade:giant-x-hammer-distro-basic-multi run (`issue#11983 <http://tracker.ceph.com/issues/11983>`_, `pr#5121 <http://github.com/ceph/ceph/pull/5121>`_, Samuel Just)
+* build/ops: linking ceph to tcmalloc causes segfault on SUSE SLE11-SP3 (`issue#12368 <http://tracker.ceph.com/issues/12368>`_, `pr#5265 <http://github.com/ceph/ceph/pull/5265>`_, Thorsten Behrens)
+* common: utf8 and old gcc breakage on RHEL6.5 (`issue#7387 <http://tracker.ceph.com/issues/7387>`_, `pr#4687 <http://github.com/ceph/ceph/pull/4687>`_, Kefu Chai)
+* crush: take crashes due to invalid arg (`issue#11740 <http://tracker.ceph.com/issues/11740>`_, `pr#4891 <http://github.com/ceph/ceph/pull/4891>`_, Sage Weil)
+* rgw: need conversion tool to handle fixes following #11974 (`issue#12502 <http://tracker.ceph.com/issues/12502>`_, `pr#5384 <http://github.com/ceph/ceph/pull/5384>`_, Yehuda Sadeh)
+* rgw: Swift API: support for 202 Accepted response code on container creation (`issue#12299 <http://tracker.ceph.com/issues/12299>`_, `pr#5214 <http://github.com/ceph/ceph/pull/5214>`_, Radoslaw Zarzynski)
+* common: Log::reopen_log_file: take m_flush_mutex (`issue#12520 <http://tracker.ceph.com/issues/12520>`_, `pr#5405 <http://github.com/ceph/ceph/pull/5405>`_, Samuel Just)
+* rgw: Properly respond to the Connection header with Civetweb (`issue#12398 <http://tracker.ceph.com/issues/12398>`_, `pr#5284 <http://github.com/ceph/ceph/pull/5284>`_, Wido den Hollander)
+* rgw: multipart list part response returns incorrect field (`issue#12399 <http://tracker.ceph.com/issues/12399>`_, `pr#5285 <http://github.com/ceph/ceph/pull/5285>`_, Henry Chang)
+* build/ops: ceph.spec.in: 95-ceph-osd.rules, mount.ceph, and mount.fuse.ceph not installed properly on SUSE (`issue#12397 <http://tracker.ceph.com/issues/12397>`_, `pr#5283 <http://github.com/ceph/ceph/pull/5283>`_, Nathan Cutler)
+* rgw: radosgw-admin dumps user info twice (`issue#12400 <http://tracker.ceph.com/issues/12400>`_, `pr#5286 <http://github.com/ceph/ceph/pull/5286>`_, guce)
+* doc: fix doc build (`issue#12180 <http://tracker.ceph.com/issues/12180>`_, `pr#5095 <http://github.com/ceph/ceph/pull/5095>`_, Kefu Chai)
+* tests: backport 11493 fixes, and test, preventing ec cache pools (`issue#12314 <http://tracker.ceph.com/issues/12314>`_, `pr#4961 <http://github.com/ceph/ceph/pull/4961>`_, Samuel Just)
+* rgw: does not send Date HTTP header when civetweb frontend is used (`issue#11872 <http://tracker.ceph.com/issues/11872>`_, `pr#5228 <http://github.com/ceph/ceph/pull/5228>`_, Radoslaw Zarzynski)
+* mon: pg ls is broken (`issue#11910 <http://tracker.ceph.com/issues/11910>`_, `pr#5160 <http://github.com/ceph/ceph/pull/5160>`_, Kefu Chai)
+* librbd: A client opening an image mid-resize can result in the object map being invalidated (`issue#12237 <http://tracker.ceph.com/issues/12237>`_, `pr#5279 <http://github.com/ceph/ceph/pull/5279>`_, Jason Dillaman)
+* doc: missing man pages for ceph-create-keys, ceph-disk-* (`issue#11862 <http://tracker.ceph.com/issues/11862>`_, `pr#4846 <http://github.com/ceph/ceph/pull/4846>`_, Nathan Cutler)
+* tools: ceph-post-file fails on rhel7 (`issue#11876 <http://tracker.ceph.com/issues/11876>`_, `pr#5038 <http://github.com/ceph/ceph/pull/5038>`_, Sage Weil)
+* build/ops: rcceph script is buggy (`issue#12090 <http://tracker.ceph.com/issues/12090>`_, `pr#5028 <http://github.com/ceph/ceph/pull/5028>`_, Owen Synge)
+* rgw: Bucket header is enclosed by quotes (`issue#11874 <http://tracker.ceph.com/issues/11874>`_, `pr#4862 <http://github.com/ceph/ceph/pull/4862>`_, Wido den Hollander)
+* build/ops: packaging: add SuSEfirewall2 service files (`issue#12092 <http://tracker.ceph.com/issues/12092>`_, `pr#5030 <http://github.com/ceph/ceph/pull/5030>`_, Tim Serong)
+* rgw: Keystone PKI token expiration is not enforced (`issue#11722 <http://tracker.ceph.com/issues/11722>`_, `pr#4884 <http://github.com/ceph/ceph/pull/4884>`_, Anton Aksola)
+* build/ops: debian/control: ceph-common (>> 0.94.2) must be >= 0.94.2-2 (`issue#12529,11998 <http://tracker.ceph.com/issues/12529,11998>`_, `pr#5417 <http://github.com/ceph/ceph/pull/5417>`_, Loic Dachary)
+* mon: Clock skew causes missing summary and confuses Calamari (`issue#11879 <http://tracker.ceph.com/issues/11879>`_, `pr#4868 <http://github.com/ceph/ceph/pull/4868>`_, Thorsten Behrens)
+* rgw: rados objects wronly deleted (`issue#12099 <http://tracker.ceph.com/issues/12099>`_, `pr#5117 <http://github.com/ceph/ceph/pull/5117>`_, wuxingyi)
+* tests: kernel_untar_build fails on EL7 (`issue#12098 <http://tracker.ceph.com/issues/12098>`_, `pr#5119 <http://github.com/ceph/ceph/pull/5119>`_, Greg Farnum)
+* fs: Fh ref count will leak if readahead does not need to do read from osd (`issue#12319 <http://tracker.ceph.com/issues/12319>`_, `pr#5427 <http://github.com/ceph/ceph/pull/5427>`_, Zhi Zhang)
+* mon: OSDMonitor: allow addition of cache pool with non-empty snaps with co… (`issue#12595 <http://tracker.ceph.com/issues/12595>`_, `pr#5252 <http://github.com/ceph/ceph/pull/5252>`_, Samuel Just)
+* mon: MDSMonitor: handle MDSBeacon messages properly (`issue#11979 <http://tracker.ceph.com/issues/11979>`_, `pr#5123 <http://github.com/ceph/ceph/pull/5123>`_, Kefu Chai)
+* tools: ceph-disk: get_partition_type fails on /dev/cciss... (`issue#11760 <http://tracker.ceph.com/issues/11760>`_, `pr#4892 <http://github.com/ceph/ceph/pull/4892>`_, islepnev)
+* build/ops: max files open limit for OSD daemon is too low (`issue#12087 <http://tracker.ceph.com/issues/12087>`_, `pr#5026 <http://github.com/ceph/ceph/pull/5026>`_, Owen Synge)
+* mon: add an "osd crush tree" command (`issue#11833 <http://tracker.ceph.com/issues/11833>`_, `pr#5248 <http://github.com/ceph/ceph/pull/5248>`_, Kefu Chai)
+* mon: mon crashes when "ceph osd tree 85 --format json" (`issue#11975 <http://tracker.ceph.com/issues/11975>`_, `pr#4936 <http://github.com/ceph/ceph/pull/4936>`_, Kefu Chai)
+* build/ops: ceph / ceph-dbg steal ceph-objecstore-tool from ceph-test / ceph-test-dbg (`issue#11806 <http://tracker.ceph.com/issues/11806>`_, `pr#5069 <http://github.com/ceph/ceph/pull/5069>`_, Loic Dachary)
+* rgw: DragonDisk fails to create directories via S3: MissingContentLength (`issue#12042 <http://tracker.ceph.com/issues/12042>`_, `pr#5118 <http://github.com/ceph/ceph/pull/5118>`_, Yehuda Sadeh)
+* build/ops: /usr/bin/ceph from ceph-common is broken without installing ceph (`issue#11998 <http://tracker.ceph.com/issues/11998>`_, `pr#5206 <http://github.com/ceph/ceph/pull/5206>`_, Ken Dreyer)
+* build/ops: systemd: Increase max files open limit for OSD daemon (`issue#11964 <http://tracker.ceph.com/issues/11964>`_, `pr#5040 <http://github.com/ceph/ceph/pull/5040>`_, Owen Synge)
+* build/ops: rgw/logrotate.conf calls service with wrong init script name (`issue#12044 <http://tracker.ceph.com/issues/12044>`_, `pr#5055 <http://github.com/ceph/ceph/pull/5055>`_, wuxingyi)
+* common: OPT_INT option interprets 3221225472 as -1073741824, and crashes in Throttle::Throttle() (`issue#11738 <http://tracker.ceph.com/issues/11738>`_, `pr#4889 <http://github.com/ceph/ceph/pull/4889>`_, Kefu Chai)
+* doc: doc/release-notes: v0.94.2 (`issue#11492 <http://tracker.ceph.com/issues/11492>`_, `pr#4934 <http://github.com/ceph/ceph/pull/4934>`_, Sage Weil)
+* common: admin_socket: close socket descriptor in destructor (`issue#11706 <http://tracker.ceph.com/issues/11706>`_, `pr#4657 <http://github.com/ceph/ceph/pull/4657>`_, Jon Bernard)
+* rgw: Object copy bug (`issue#11755 <http://tracker.ceph.com/issues/11755>`_, `pr#4885 <http://github.com/ceph/ceph/pull/4885>`_, Javier M. Mellid)
+* rgw: empty json response when getting user quota (`issue#12245 <http://tracker.ceph.com/issues/12245>`_, `pr#5237 <http://github.com/ceph/ceph/pull/5237>`_, wuxingyi)
+* fs: cephfs Dumper tries to load whole journal into memory at once (`issue#11999 <http://tracker.ceph.com/issues/11999>`_, `pr#5120 <http://github.com/ceph/ceph/pull/5120>`_, John Spray)
+* rgw: Fix tool for #11442 does not correctly fix objects created via multipart uploads (`issue#12242 <http://tracker.ceph.com/issues/12242>`_, `pr#5229 <http://github.com/ceph/ceph/pull/5229>`_, Yehuda Sadeh)
+* rgw: Civetweb RGW appears to report full size of object as downloaded when only partially downloaded (`issue#12243 <http://tracker.ceph.com/issues/12243>`_, `pr#5231 <http://github.com/ceph/ceph/pull/5231>`_, Yehuda Sadeh)
+* osd: stuck incomplete (`issue#12362 <http://tracker.ceph.com/issues/12362>`_, `pr#5269 <http://github.com/ceph/ceph/pull/5269>`_, Samuel Just)
+* osd: start_flush: filter out removed snaps before determining snapc's (`issue#11911 <http://tracker.ceph.com/issues/11911>`_, `pr#4899 <http://github.com/ceph/ceph/pull/4899>`_, Samuel Just)
+* librbd: internal.cc: 1967: FAILED assert(watchers.size() == 1) (`issue#12239 <http://tracker.ceph.com/issues/12239>`_, `pr#5243 <http://github.com/ceph/ceph/pull/5243>`_, Jason Dillaman)
+* librbd: new QA client upgrade tests (`issue#12109 <http://tracker.ceph.com/issues/12109>`_, `pr#5046 <http://github.com/ceph/ceph/pull/5046>`_, Jason Dillaman)
+* librbd: [  FAILED  ] TestLibRBD.ExclusiveLockTransition (`issue#12238 <http://tracker.ceph.com/issues/12238>`_, `pr#5241 <http://github.com/ceph/ceph/pull/5241>`_, Jason Dillaman)
+* rgw: Swift API: XML document generated in response for GET on account does not contain account name (`issue#12323 <http://tracker.ceph.com/issues/12323>`_, `pr#5227 <http://github.com/ceph/ceph/pull/5227>`_, Radoslaw Zarzynski)
+* rgw: keystone does not support chunked input (`issue#12322 <http://tracker.ceph.com/issues/12322>`_, `pr#5226 <http://github.com/ceph/ceph/pull/5226>`_, Hervé Rousseau)
+* mds: MDS is crashed (mds/CDir.cc: 1391: FAILED assert(!is_complete())) (`issue#11737 <http://tracker.ceph.com/issues/11737>`_, `pr#4886 <http://github.com/ceph/ceph/pull/4886>`_, Yan, Zheng)
+* cli: ceph: cli interactive mode does not understand quotes (`issue#11736 <http://tracker.ceph.com/issues/11736>`_, `pr#4776 <http://github.com/ceph/ceph/pull/4776>`_, Kefu Chai)
+* librbd: add valgrind memory checks for unit tests (`issue#12384 <http://tracker.ceph.com/issues/12384>`_, `pr#5280 <http://github.com/ceph/ceph/pull/5280>`_, Zhiqiang Wang)
+* build/ops: admin/build-doc: script fails silently under certain circumstances (`issue#11902 <http://tracker.ceph.com/issues/11902>`_, `pr#4877 <http://github.com/ceph/ceph/pull/4877>`_, John Spray)
+* osd: Fixes for rados ops with snaps (`issue#11908 <http://tracker.ceph.com/issues/11908>`_, `pr#4902 <http://github.com/ceph/ceph/pull/4902>`_, Samuel Just)
+* build/ops: ceph.spec.in: ceph-common subpackage def needs tweaking for SUSE/openSUSE (`issue#12308 <http://tracker.ceph.com/issues/12308>`_, `pr#4883 <http://github.com/ceph/ceph/pull/4883>`_, Nathan Cutler)
+* fs: client: reference counting 'struct Fh' (`issue#12088 <http://tracker.ceph.com/issues/12088>`_, `pr#5222 <http://github.com/ceph/ceph/pull/5222>`_, Yan, Zheng)
+* build/ops: ceph.spec: update OpenSUSE BuildRequires  (`issue#11611 <http://tracker.ceph.com/issues/11611>`_, `pr#4667 <http://github.com/ceph/ceph/pull/4667>`_, Loic Dachary)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.94.3.txt>`.
+
+
+  
+v0.94.2 Hammer
+==============
+
+This Hammer point release fixes a few critical bugs in RGW that can
+prevent objects starting with underscore from behaving properly and
+that prevent garbage collection of deleted objects when using the
+Civetweb standalone mode.
+
+All v0.94.x Hammer users are strongly encouraged to upgrade, and to
+make note of the repair procedure below if RGW is in use.
+
+Upgrading from previous Hammer release
+--------------------------------------
+
+Bug #11442 introduced a change that made rgw objects that start with underscore
+incompatible with previous versions. The fix to that bug reverts to the
+previous behavior. In order to be able to access objects that start with an
+underscore and were created in prior Hammer releases, following the upgrade it
+is required to run (for each affected bucket)::
+
+    $ radosgw-admin bucket check --check-head-obj-locator \
+                                 --bucket=<bucket> [--fix]
+
+Notable changes
+---------------
+
+* build: compilation error: No high-precision counter available  (armhf, powerpc..) (#11432, James Page)
+* ceph-dencoder links to libtcmalloc, and shouldn't (#10691, Boris Ranto)
+* ceph-disk: disk zap sgdisk invocation (#11143, Owen Synge)
+* ceph-disk: use a new disk as journal disk,ceph-disk prepare fail (#10983, Loic Dachary)
+* ceph-objectstore-tool should be in the ceph server package (#11376, Ken Dreyer)
+* librados: can get stuck in redirect loop if osdmap epoch == last_force_op_resend (#11026, Jianpeng Ma)
+* librbd: A retransmit of proxied flatten request can result in -EINVAL (Jason Dillaman)
+* librbd: ImageWatcher should cancel in-flight ops on watch error (#11363, Jason Dillaman)
+* librbd: Objectcacher setting max object counts too low (#7385, Jason Dillaman)
+* librbd: Periodic failure of TestLibRBD.DiffIterateStress (#11369, Jason Dillaman)
+* librbd: Queued AIO reference counters not properly updated (#11478, Jason Dillaman)
+* librbd: deadlock in image refresh (#5488, Jason Dillaman)
+* librbd: notification race condition on snap_create (#11342, Jason Dillaman)
+* mds: Hammer uclient checking (#11510, John Spray)
+* mds: remove caps from revoking list when caps are voluntarily released (#11482, Yan, Zheng)
+* messenger: double clear of pipe in reaper (#11381, Haomai Wang)
+* mon: Total size of OSDs is a maginitude less than it is supposed to be. (#11534, Zhe Zhang)
+* osd: don't check order in finish_proxy_read (#11211, Zhiqiang Wang)
+* osd: handle old semi-deleted pgs after upgrade (#11429, Samuel Just)
+* osd: object creation by write cannot use an offset on an erasure coded pool (#11507, Jianpeng Ma)
+* rgw: Improve rgw HEAD request by avoiding read the body of the first chunk (#11001, Guang Yang)
+* rgw: civetweb is hitting a limit (number of threads 1024) (#10243, Yehuda Sadeh)
+* rgw: civetweb should use unique request id (#10295, Orit Wasserman)
+* rgw: critical fixes for hammer (#11447, #11442, Yehuda Sadeh)
+* rgw: fix swift COPY headers (#10662, #10663, #11087, #10645, Radoslaw Zarzynski)
+* rgw: improve performance for large object  (multiple chunks) GET (#11322, Guang Yang)
+* rgw: init-radosgw: run RGW as root (#11453, Ken Dreyer)
+* rgw: keystone token cache does not work correctly (#11125, Yehuda Sadeh)
+* rgw: make quota/gc thread configurable for starting (#11047, Guang Yang)
+* rgw: make swift responses of RGW return last-modified, content-length, x-trans-id headers.(#10650, Radoslaw Zarzynski)
+* rgw: merge manifests correctly when there's prefix override (#11622, Yehuda Sadeh)
+* rgw: quota not respected in POST object (#11323, Sergey Arkhipov)
+* rgw: restore buffer of multipart upload after EEXIST (#11604, Yehuda Sadeh)
+* rgw: shouldn't need to disable rgw_socket_path if frontend is configured (#11160, Yehuda Sadeh)
+* rgw: swift: Response header of GET request for container does not contain X-Container-Object-Count, X-Container-Bytes-Used and x-trans-id headers (#10666, Dmytro Iurchenko)
+* rgw: swift: Response header of POST request for object does not contain content-length and x-trans-id headers (#10661, Radoslaw Zarzynski)
+* rgw: swift: response for GET/HEAD on container does not contain the X-Timestamp header (#10938, Radoslaw Zarzynski)
+* rgw: swift: response for PUT on /container does not contain the mandatory Content-Length header when FCGI is used (#11036, #10971, Radoslaw Zarzynski)
+* rgw: swift: wrong handling of empty metadata on Swift container (#11088, Radoslaw Zarzynski)
+* tests: TestFlatIndex.cc races with TestLFNIndex.cc (#11217, Xinze Chi)
+* tests: ceph-helpers kill_daemons fails when kill fails (#11398, Loic Dachary)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.94.2.txt>`.
+
+
+v0.94.1 Hammer
+==============
+
+This bug fix release fixes a few critical issues with CRUSH.  The most
+important addresses a bug in feature bit enforcement that may prevent
+pre-hammer clients from communicating with the cluster during an
+upgrade.  This only manifests in some cases (for example, when the
+'rack' type is in use in the CRUSH map, and possibly other cases), but for
+safety we strongly recommend that all users use 0.94.1 instead of 0.94 when
+upgrading.
+
+There is also a fix in the new straw2 buckets when OSD weights are 0.
+
+We recommend that all v0.94 users upgrade.
+
+Notable changes
+---------------
+
+* crush: fix divide-by-0 in straw2 (#11357 Sage Weil)
+* crush: fix has_v4_buckets (#11364 Sage Weil)
+* osd: fix negative degraded objects during backfilling (#7737 Guang Yang)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.94.1.txt>`.
+
+
+v0.94 Hammer
+============
+
+This major release is expected to form the basis of the next long-term
+stable series.  It is intended to supersede v0.80.x Firefly.
+
+Highlights since Giant include:
+
+* *RADOS Performance*: a range of improvements have been made in the
+  OSD and client-side librados code that improve the throughput on
+  flash backends and improve parallelism and scaling on fast machines.
+* *Simplified RGW deployment*: the ceph-deploy tool now has a new
+  'ceph-deploy rgw create HOST' command that quickly deploys a
+  instance of the S3/Swift gateway using the embedded Civetweb server.
+  This is vastly simpler than the previous Apache-based deployment.
+  There are a few rough edges (e.g., around SSL support) but we
+  encourage users to try `the new method`_.
+* *RGW object versioning*: RGW now supports the S3 object versioning
+  API, which preserves old version of objects instead of overwriting
+  them.
+* *RGW bucket sharding*: RGW can now shard the bucket index for large
+  buckets across, improving performance for very large buckets.
+* *RBD object maps*: RBD now has an object map function that tracks
+  which parts of the image are allocating, improving performance for
+  clones and for commands like export and delete.
+* *RBD mandatory locking*: RBD has a new mandatory locking framework
+  (still disabled by default) that adds additional safeguards to
+  prevent multiple clients from using the same image at the same time.
+* *RBD copy-on-read*: RBD now supports copy-on-read for image clones,
+  improving performance for some workloads.
+* *CephFS snapshot improvements*: Many many bugs have been fixed with
+  CephFS snapshots.  Although they are still disabled by default,
+  stability has improved significantly.
+* *CephFS Recovery tools*: We have built some journal recovery and
+  diagnostic tools. Stability and performance of single-MDS systems is
+  vastly improved in Giant, and more improvements have been made now
+  in Hammer.  Although we still recommend caution when storing
+  important data in CephFS, we do encourage testing for non-critical
+  workloads so that we can better guage the feature, usability,
+  performance, and stability gaps.
+* *CRUSH improvements*: We have added a new straw2 bucket algorithm
+  that reduces the amount of data migration required when changes are
+  made to the cluster.
+* *Shingled erasure codes (SHEC)*: The OSDs now have experimental
+  support for shingled erasure codes, which allow a small amount of
+  additional storage to be traded for improved recovery performance.
+* *RADOS cache tiering*: A series of changes have been made in the
+  cache tiering code that improve performance and reduce latency.
+* *RDMA support*: There is now experimental support the RDMA via the
+  Accelio (libxio) library.
+* *New administrator commands*: The 'ceph osd df' command shows
+  pertinent details on OSD disk utilizations.  The 'ceph pg ls ...'
+  command makes it much simpler to query PG states while diagnosing
+  cluster issues.
+
+.. _the new method: ../start/quick-ceph-deploy/#add-an-rgw-instance
+
+Other highlights since Firefly include:
+
+* *CephFS*: we have fixed a raft of bugs in CephFS and built some
+  basic journal recovery and diagnostic tools.  Stability and
+  performance of single-MDS systems is vastly improved in Giant.
+  Although we do not yet recommend CephFS for production deployments,
+  we do encourage testing for non-critical workloads so that we can
+  better guage the feature, usability, performance, and stability
+  gaps.
+* *Local Recovery Codes*: the OSDs now support an erasure-coding scheme
+  that stores some additional data blocks to reduce the IO required to
+  recover from single OSD failures.
+* *Degraded vs misplaced*: the Ceph health reports from 'ceph -s' and
+  related commands now make a distinction between data that is
+  degraded (there are fewer than the desired number of copies) and
+  data that is misplaced (stored in the wrong location in the
+  cluster).  The distinction is important because the latter does not
+  compromise data safety.
+* *Tiering improvements*: we have made several improvements to the
+  cache tiering implementation that improve performance.  Most
+  notably, objects are not promoted into the cache tier by a single
+  read; they must be found to be sufficiently hot before that happens.
+* *Monitor performance*: the monitors now perform writes to the local
+  data store asynchronously, improving overall responsiveness.
+* *Recovery tools*: the ceph-objectstore-tool is greatly expanded to
+  allow manipulation of an individual OSDs data store for debugging
+  and repair purposes.  This is most heavily used by our QA
+  infrastructure to exercise recovery code.
+
+I would like to take this opportunity to call out the amazing growth
+in contributors to Ceph beyond the core development team from Inktank.
+Hammer features major new features and improvements from Intel, Fujitsu,
+UnitedStack, Yahoo, UbuntuKylin, CohortFS, Mellanox, CERN, Deutsche
+Telekom, Mirantis, and SanDisk.
+
+Dedication
+----------
+
+This release is dedicated in memoriam to Sandon Van Ness, aka
+Houkouonchi, who unexpectedly passed away a few weeks ago.  Sandon was
+responsible for maintaining the large and complex Sepia lab that
+houses the Ceph project's build and test infrastructure.  His efforts
+have made an important impact on our ability to reliably test Ceph
+with a relatively small group of people.  He was a valued member of
+the team and we will miss him.  H is also for Houkouonchi.
+
+Upgrading
+---------
+
+* If your existing cluster is running a version older than v0.80.x
+  Firefly, please first upgrade to the latest Firefly release before
+  moving on to Giant.  We have not tested upgrades directly from
+  Emperor, Dumpling, or older releases.
+
+  We *have* tested:
+
+   * Firefly to Hammer
+   * Giant to Hammer
+   * Dumpling to Firefly to Hammer
+
+* Please upgrade daemons in the following order:
+
+   #. Monitors
+   #. OSDs
+   #. MDSs and/or radosgw
+
+  Note that the relative ordering of OSDs and monitors should not matter, but
+  we primarily tested upgrading monitors first.
+
+* The ceph-osd daemons will perform a disk-format upgrade improve the
+  PG metadata layout and to repair a minor bug in the on-disk format.
+  It may take a minute or two for this to complete, depending on how
+  many objects are stored on the node; do not be alarmed if they do
+  not marked "up" by the cluster immediately after starting.
+
+* If upgrading from v0.93, set
+   osd enable degraded writes = false
+
+  on all osds prior to upgrading.  The degraded writes feature has
+  been reverted due to 11155.
+
+* The LTTNG tracing in librbd and librados is disabled in the release packages
+  until we find a way to avoid violating distro security policies when linking
+  libust.
+
+Upgrading from v0.87.x Giant
+----------------------------
+
+* librbd and librados include lttng tracepoints on distros with
+  liblttng 2.4 or later (only Ubuntu Trusty for the ceph.com
+  packages). When running a daemon that uses these libraries, i.e. an
+  application that calls fork(2) or clone(2) without exec(3), you must
+  set LD_PRELOAD=liblttng-ust-fork.so.0 to prevent a crash in the
+  lttng atexit handler when the process exits. The only ceph tool that
+  requires this is rbd-fuse.
+
+* If rgw_socket_path is defined and rgw_frontends defines a
+  socket_port and socket_host, we now allow the rgw_frontends settings
+  to take precedence.  This change should only affect users who have
+  made non-standard changes to their radosgw configuration.
+
+* If you are upgrading specifically from v0.92, you must stop all OSD
+  daemons and flush their journals (``ceph-osd -i NNN
+  --flush-journal``) before upgrading.  There was a transaction
+  encoding bug in v0.92 that broke compatibility.  Upgrading from v0.93,
+  v0.91, or anything earlier is safe.
+
+* The experimental 'keyvaluestore-dev' OSD backend has been renamed
+  'keyvaluestore' (for simplicity) and marked as experimental.  To
+  enable this untested feature and acknowledge that you understand
+  that it is untested and may destroy data, you need to add the
+  following to your ceph.conf::
+
+    enable experimental unrecoverable data corrupting featuers = keyvaluestore
+
+* The following librados C API function calls take a 'flags' argument whose value
+  is now correctly interpreted:
+
+     rados_write_op_operate()
+     rados_aio_write_op_operate()
+     rados_read_op_operate()
+     rados_aio_read_op_operate()
+
+  The flags were not correctly being translated from the librados constants to the
+  internal values.  Now they are.  Any code that is passing flags to these methods
+  should be audited to ensure that they are using the correct LIBRADOS_OP_FLAG_*
+  constants.
+
+* The 'rados' CLI 'copy' and 'cppool' commands now use the copy-from operation,
+  which means the latest CLI cannot run these commands against pre-firefly OSDs.
+
+* The librados watch/notify API now includes a watch_flush() operation to flush
+  the async queue of notify operations.  This should be called by any watch/notify
+  user prior to rados_shutdown().
+
+* The 'category' field for objects has been removed.  This was originally added
+  to track PG stat summations over different categories of objects for use by
+  radosgw.  It is no longer has any known users and is prone to abuse because it
+  can lead to a pg_stat_t structure that is unbounded.  The librados API calls
+  that accept this field now ignore it, and the OSD no longers tracks the
+  per-category summations.
+
+* The output for 'rados df' has changed.  The 'category' level has been
+  eliminated, so there is now a single stat object per pool.  The structure of
+  the JSON output is different, and the plaintext output has one less column.
+
+* The 'rados create <objectname> [category]' optional category argument is no
+  longer supported or recognized.
+
+* rados.py's Rados class no longer has a __del__ method; it was causing
+  problems on interpreter shutdown and use of threads.  If your code has
+  Rados objects with limited lifetimes and you're concerned about locked
+  resources, call Rados.shutdown() explicitly.
+
+* There is a new version of the librados watch/notify API with vastly
+  improved semantics.  Any applications using this interface are
+  encouraged to migrate to the new API.  The old API calls are marked
+  as deprecated and will eventually be removed.
+
+* The librados rados_unwatch() call used to be safe to call on an
+  invalid handle.  The new version has undefined behavior when passed
+  a bogus value (for example, when rados_watch() returns an error and
+  handle is not defined).
+
+* The structure of the formatted 'pg stat' command is changed for the
+  portion that counts states by name to avoid using the '+' character
+  (which appears in state names) as part of the XML token (it is not
+  legal).
+
+* Previously, the formatted output of 'ceph pg stat -f ...' was a full
+  pg dump that included all metadata about all PGs in the system.  It
+  is now a concise summary of high-level PG stats, just like the
+  unformatted 'ceph pg stat' command.
+
+* All JSON dumps of floating point values were incorrecting surrounding the
+  value with quotes.  These quotes have been removed.  Any consumer of structured
+  JSON output that was consuming the floating point values was previously having
+  to interpret the quoted string and will most likely need to be fixed to take
+  the unquoted number.
+
+* New ability to list all objects from all namespaces that can fail or
+  return incomplete results when not all OSDs have been upgraded.
+  Features rados --all ls, rados cppool, rados export, rados
+  cache-flush-evict-all and rados cache-try-flush-evict-all can also
+  fail or return incomplete results.
+
+* Due to a change in the Linux kernel version 3.18 and the limits of the FUSE
+  interface, ceph-fuse needs be mounted as root on at least some systems. See
+  issues #9997, #10277, and #10542 for details.
+
+Upgrading from v0.80x Firefly (additional notes)
+------------------------------------------------
+
+* The client-side caching for librbd is now enabled by default (rbd
+  cache = true).  A safety option (rbd cache writethrough until flush
+  = true) is also enabled so that writeback caching is not used until
+  the library observes a 'flush' command, indicating that the librbd
+  users is passing that operation through from the guest VM.  This
+  avoids potential data loss when used with older versions of qemu
+  that do not support flush.
+
+    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
+    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
+    leveldb_block_size        = 64*1024       = 65536     // 64KB
+    leveldb_compression       = false
+    leveldb_log               = ""
+
+  OSDs will still maintain the following osd-specific defaults:
+
+    leveldb_log               = ""
+
+* The 'rados getxattr ...' command used to add a gratuitous newline to the attr
+  value; it now does not.
+
+* The ``*_kb perf`` counters on the monitor have been removed.  These are
+  replaced with a new set of ``*_bytes`` counters (e.g., ``cluster_osd_kb`` is
+  replaced by ``cluster_osd_bytes``).
+
+* The ``rd_kb`` and ``wr_kb`` fields in the JSON dumps for pool stats (accessed
+  via the ``ceph df detail -f json-pretty`` and related commands) have been
+  replaced with corresponding ``*_bytes`` fields.  Similarly, the
+  ``total_space``, ``total_used``, and ``total_avail`` fields are replaced with
+  ``total_bytes``, ``total_used_bytes``,  and ``total_avail_bytes`` fields.
+
+* The ``rados df --format=json`` output ``read_bytes`` and ``write_bytes``
+  fields were incorrectly reporting ops; this is now fixed.
+
+* The ``rados df --format=json`` output previously included ``read_kb`` and
+  ``write_kb`` fields; these have been removed.  Please use ``read_bytes`` and
+  ``write_bytes`` instead (and divide by 1024 if appropriate).
+
+* The experimental keyvaluestore-dev OSD backend had an on-disk format
+  change that prevents existing OSD data from being upgraded.  This
+  affects developers and testers only.
+
+* mon-specific and osd-specific leveldb options have been removed.
+  From this point onward users should use the `leveldb_*` generic
+  options and add the options in the appropriate sections of their
+  configuration files.  Monitors will still maintain the following
+  monitor-specific defaults:
+
+    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
+    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
+    leveldb_block_size        = 64*1024       = 65536     // 64KB
+    leveldb_compression       = false
+    leveldb_log               = ""
+
+  OSDs will still maintain the following osd-specific defaults:
+
+    leveldb_log               = ""
+
+* CephFS support for the legacy anchor table has finally been removed.
+  Users with file systems created before firefly should ensure that inodes
+  with multiple hard links are modified *prior* to the upgrade to ensure that
+  the backtraces are written properly.  For example::
+
+    sudo find /mnt/cephfs -type f -links +1 -exec touch \{\} \;
+
+* We disallow nonsensical 'tier cache-mode' transitions.  From this point
+  onward, 'writeback' can only transition to 'forward' and 'forward'
+  can transition to 1) 'writeback' if there are dirty objects, or 2) any if
+  there are no dirty objects.
+
+
+Notable changes since v0.93
+---------------------------
+
+* build: a few cmake fixes (Matt Benjamin)
+* build: fix build on RHEL/CentOS 5.9 (Rohan Mars)
+* build: reorganize Makefile to allow modular builds (Boris Ranto)
+* ceph-fuse: be more forgiving on remount (#10982 Greg Farnum)
+* ceph: improve CLI parsing (#11093 David Zafman)
+* common: fix cluster logging to default channel (#11177 Sage Weil)
+* crush: fix parsing of straw2 buckets (#11015 Sage Weil)
+* doc: update man pages (David Zafman)
+* librados: fix leak in C_TwoContexts (Xiong Yiliang)
+* librados: fix leak in watch/notify path (Sage Weil)
+* librbd: fix and improve AIO cache invalidation (#10958 Jason Dillaman)
+* librbd: fix memory leak (Jason Dillaman)
+* librbd: fix ordering/queueing of resize operations (Jason Dillaman)
+* librbd: validate image is r/w on resize/flatten (Jason Dillaman)
+* librbd: various internal locking fixes (Jason Dillaman)
+* lttng: tracing is disabled until we streamline dependencies (Josh Durgin)
+* mon: add bootstrap-rgw profile (Sage Weil)
+* mon: do not pollute mon dir with CSV files from CRUSH check (Loic Dachary)
+* mon: fix clock drift time check interval (#10546 Joao Eduardo Luis)
+* mon: fix units in store stats (Joao Eduardo Luis)
+* mon: improve error handling on erasure code profile set (#10488, #11144 Loic Dachary)
+* mon: set {read,write}_tier on 'osd tier add-cache ...' (Jianpeng Ma)
+* ms: xio: fix misc bugs (Matt Benjamin, Vu Pham)
+* osd: DBObjectMap: fix locking to prevent rare crash (#9891 Samuel Just)
+* osd: fix and document last_epoch_started semantics (Samuel Just)
+* osd: fix divergent entry handling on PG split (Samuel Just)
+* osd: fix leak on shutdown (Kefu Chai)
+* osd: fix recording of digest on scrub (Samuel Just)
+* osd: fix whiteout handling (Sage Weil)
+* rbd: allow v2 striping parameters for clones and imports (Jason Dillaman)
+* rbd: fix formatted output of image features (Jason Dillaman)
+* rbd: updat eman page (Ilya Dryomov)
+* rgw: don't overwrite bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
+* rgw: enable IPv6 for civetweb (#10965 Yehuda Sadeh)
+* rgw: fix sysvinit script when rgw_socket_path is not defined (#11159 Yehuda Sadeh, Dan Mick)
+* rgw: pass civetweb configurables through (#10907 Yehuda Sadeh)
+* rgw: use new watch/notify API (Yehuda Sadeh, Sage Weil)
+* osd: reverted degraded writes feature due to 11155
+
+Notable changes since v0.87.x Giant
+-----------------------------------
+
+* add experimental features option (Sage Weil)
+* arch: fix NEON feaeture detection (#10185 Loic Dachary)
+* asyncmsgr: misc fixes (Haomai Wang)
+* buffer: add 'shareable' construct (Matt Benjamin)
+* buffer: add list::get_contiguous (Sage Weil)
+* buffer: avoid rebuild if buffer already contiguous (Jianpeng Ma)
+* build: CMake support (Ali Maredia, Casey Bodley, Adam Emerson, Marcus Watts, Matt Benjamin)
+* build: a few cmake fixes (Matt Benjamin)
+* build: aarch64 build fixes (Noah Watkins, Haomai Wang)
+* build: adjust build deps for yasm, virtualenv (Jianpeng Ma)
+* build: fix 'make check' races (#10384 Loic Dachary)
+* build: fix build on RHEL/CentOS 5.9 (Rohan Mars)
+* build: fix pkg names when libkeyutils is missing (Pankag Garg, Ken Dreyer)
+* build: improve build dependency tooling (Loic Dachary)
+* build: reorganize Makefile to allow modular builds (Boris Ranto)
+* build: support for jemalloc (Shishir Gowda)
+* ceph-disk: Scientific Linux support (Dan van der Ster)
+* ceph-disk: allow journal partition re-use (#10146 Loic Dachary, Dav van der Ster)
+* ceph-disk: call partx/partprobe consistency (#9721 Loic Dachary)
+* ceph-disk: do not re-use partition if encryption is required (Loic Dachary)
+* ceph-disk: fix dmcrypt key permissions (Loic Dachary)
+* ceph-disk: fix umount race condition (#10096 Blaine Gardner)
+* ceph-disk: improved systemd support (Owen Synge)
+* ceph-disk: init=none option (Loic Dachary)
+* ceph-disk: misc fixes (Christos Stavrakakis)
+* ceph-disk: respect --statedir for keyring (Loic Dachary)
+* ceph-disk: set guid if reusing journal partition (Dan van der Ster)
+* ceph-disk: support LUKS for encrypted partitions (Andrew Bartlett, Loic Dachary)
+* ceph-fuse, libcephfs: POSIX file lock support (Yan, Zheng)
+* ceph-fuse, libcephfs: allow xattr caps in inject_release_failure (#9800 John Spray)
+* ceph-fuse, libcephfs: fix I_COMPLETE_ORDERED checks (#9894 Yan, Zheng)
+* ceph-fuse, libcephfs: fix cap flush overflow (Greg Farnum, Yan, Zheng)
+* ceph-fuse, libcephfs: fix root inode xattrs (Yan, Zheng)
+* ceph-fuse, libcephfs: preserve dir ordering (#9178 Yan, Zheng)
+* ceph-fuse, libcephfs: trim inodes before reconnecting to MDS (Yan, Zheng)
+* ceph-fuse,libcephfs: add support for O_NOFOLLOW and O_PATH (Greg Farnum)
+* ceph-fuse,libcephfs: resend requests before completing cap reconnect (#10912 Yan, Zheng)
+* ceph-fuse: be more forgiving on remount (#10982 Greg Farnum)
+* ceph-fuse: fix dentry invalidation on 3.18+ kernels (#9997 Yan, Zheng)
+* ceph-fuse: fix kernel cache trimming (#10277 Yan, Zheng)
+* ceph-fuse: select kernel cache invalidation mechanism based on kernel version (Greg Farnum)
+* ceph-monstore-tool: fix shutdown (#10093 Loic Dachary)
+* ceph-monstore-tool: fix/improve CLI (Joao Eduardo Luis)
+* ceph-objectstore-tool: fix import (#10090 David Zafman)
+* ceph-objectstore-tool: improved import (David Zafman)
+* ceph-objectstore-tool: many improvements and tests (David Zafman)
+* ceph-objectstore-tool: many many improvements (David Zafman)
+* ceph-objectstore-tool: misc improvements, fixes (#9870 #9871 David Zafman)
+* ceph.spec: package rbd-replay-prep (Ken Dreyer)
+* ceph: add 'ceph osd df [tree]' command (#10452 Mykola Golub)
+* ceph: do not parse injectargs twice (Loic Dachary)
+* ceph: fix 'ceph tell ...' command validation (#10439 Joao Eduardo Luis)
+* ceph: improve 'ceph osd tree' output (Mykola Golub)
+* ceph: improve CLI parsing (#11093 David Zafman)
+* ceph: make 'ceph -s' output more readable (Sage Weil)
+* ceph: make 'ceph -s' show PG state counts in sorted order (Sage Weil)
+* ceph: make 'ceph tell mon.* version' work (Mykola Golub)
+* ceph: new 'ceph tell mds.$name_or_rank_or_gid' (John Spray)
+* ceph: show primary-affinity in 'ceph osd tree' (Mykola Golub)
+* ceph: test robustness (Joao Eduardo Luis)
+* ceph_objectstore_tool: behave with sharded flag (#9661 David Zafman)
+* cephfs-journal-tool: add recover_dentries function (#9883 John Spray)
+* cephfs-journal-tool: fix journal import (#10025 John Spray)
+* cephfs-journal-tool: skip up to expire_pos (#9977 John Spray)
+* cleanup rados.h definitions with macros (Ilya Dryomov)
+* common: add 'perf reset ...' admin command (Jianpeng Ma)
+* common: add TableFormatter (Andreas Peters)
+* common: add newline to flushed json output (Sage Weil)
+* common: check syncfs() return code (Jianpeng Ma)
+* common: do not unlock rwlock on destruction (Federico Simoncelli)
+* common: filtering for 'perf dump' (John Spray)
+* common: fix Formatter factory breakage (#10547 Loic Dachary)
+* common: fix block device discard check (#10296 Sage Weil)
+* common: make json-pretty output prettier (Sage Weil)
+* common: remove broken CEPH_LOCKDEP optoin (Kefu Chai)
+* common: shared_cache unit tests (Cheng Cheng)
+* common: support new gperftools header locations (Key Dreyer)
+* config: add $cctid meta variable (Adam Crume)
+* crush: fix buffer overrun for poorly formed rules (#9492 Johnu George)
+* crush: fix detach_bucket (#10095 Sage Weil)
+* crush: fix parsing of straw2 buckets (#11015 Sage Weil)
+* crush: fix several bugs in adjust_item_weight (Rongze Zhu)
+* crush: fix tree bucket behavior (Rongze Zhu)
+* crush: improve constness (Loic Dachary)
+* crush: new and improved straw2 bucket type (Sage Weil, Christina Anderson, Xiaoxi Chen)
+* crush: straw bucket weight calculation fixes (#9998 Sage Weil)
+* crush: update tries stats for indep rules (#10349 Loic Dachary)
+* crush: use larger choose_tries value for erasure code rulesets (#10353 Loic Dachary)
+* crushtool: add --location <id> command (Sage Weil, Loic Dachary)
+* debian,rpm: move RBD udev rules to ceph-common (#10864 Ken Dreyer)
+* debian: split python-ceph into python-{rbd,rados,cephfs} (Boris Ranto)
+* default to libnss instead of crypto++ (Federico Gimenez)
+* doc: CephFS disaster recovery guidance (John Spray)
+* doc: CephFS for early adopters (John Spray)
+* doc: add build-doc guidlines for Fedora and CentOS/RHEL (Nilamdyuti Goswami)
+* doc: add dumpling to firefly upgrade section (#7679 John Wilkins)
+* doc: ceph osd reweight vs crush weight (Laurent Guerby)
+* doc: do not suggest dangerous XFS nobarrier option (Dan van der Ster)
+* doc: document erasure coded pool operations (#9970 Loic Dachary)
+* doc: document the LRC per-layer plugin configuration (Yuan Zhou)
+* doc: enable rbd cache on openstack deployments (Sebastien Han)
+* doc: erasure code doc updates (Loic Dachary)
+* doc: file system osd config settings (Kevin Dalley)
+* doc: fix OpenStack Glance docs (#10478 Sebastien Han)
+* doc: improved installation nots on CentOS/RHEL installs (John Wilkins)
+* doc: key/value store config reference (John Wilkins)
+* doc: misc cleanups (Adam Spiers, Sebastien Han, Nilamdyuti Goswami, Ken Dreyer, John Wilkins)
+* doc: misc improvements (Nilamdyuti Goswami, John Wilkins, Chris Holcombe)
+* doc: misc updates (#9793 #9922 #10204 #10203 Travis Rhoden, Hazem, Ayari, Florian Coste, Andy Allan, Frank Yu, Baptiste Veuillez-Mainard, Yuan Zhou, Armando Segnini, Robert Jansen, Tyler Brekke, Viktor Suprun)
+* doc: misc updates (Alfredo Deza, VRan Liu)
+* doc: misc updates (Nilamdyuti Goswami, John Wilkins)
+* doc: new man pages (Nilamdyuti Goswami)
+* doc: preflight doc fixes (John Wilkins)
+* doc: replace cloudfiles with swiftclient Python Swift example (Tim Freund)
+* doc: update PG count guide (Gerben Meijer, Laurent Guerby, Loic Dachary)
+* doc: update man pages (David Zafman)
+* doc: update openstack docs for Juno (Sebastien Han)
+* doc: update release descriptions (Ken Dreyer)
+* doc: update sepia hardware inventory (Sandon Van Ness)
+* erasure-code: add mSHEC erasure code support (Takeshi Miyamae)
+* erasure-code: improved docs (#10340 Loic Dachary)
+* erasure-code: set max_size to 20 (#10363 Loic Dachary)
+* fix cluster logging from non-mon daemons (Sage Weil)
+* init-ceph: check for systemd-run before using it (Boris Ranto)
+* install-deps.sh: do not require sudo when root (Loic Dachary)
+* keyvaluestore: misc fixes (Haomai Wang)
+* keyvaluestore: performance improvements (Haomai Wang)
+* libcephfs,ceph-fuse: add 'status' asok (John Spray)
+* libcephfs,ceph-fuse: fix getting zero-length xattr (#10552 Yan, Zheng)
+* libcephfs: fix dirfrag trimming (#10387 Yan, Zheng)
+* libcephfs: fix mount timeout (#10041 Yan, Zheng)
+* libcephfs: fix test (#10415 Yan, Zheng)
+* libcephfs: fix use-afer-free on umount (#10412 Yan, Zheng)
+* libcephfs: include ceph and git version in client metadata (Sage Weil)
+* librados, osd: new watch/notify implementation (Sage Weil)
+* librados: add blacklist_add convenience method (Jason Dillaman)
+* librados: add rados_pool_get_base_tier() call (Adam Crume)
+* librados: add watch_flush() operation (Sage Weil, Haomai Wang)
+* librados: avoid memcpy on getxattr, read (Jianpeng Ma)
+* librados: cap buffer length (Loic Dachary)
+* librados: create ioctx by pool id (Jason Dillaman)
+* librados: do notify completion in fast-dispatch (Sage Weil)
+* librados: drop 'category' feature (Sage Weil)
+* librados: expose rados_{read|write}_op_assert_version in C API (Kim Vandry)
+* librados: fix infinite loop with skipped map epochs (#9986 Ding Dinghua)
+* librados: fix iterator operator= bugs (#10082 David Zafman, Yehuda Sadeh)
+* librados: fix leak in C_TwoContexts (Xiong Yiliang)
+* librados: fix leak in watch/notify path (Sage Weil)
+* librados: fix null deref when pool DNE (#9944 Sage Weil)
+* librados: fix objecter races (#9617 Josh Durgin)
+* librados: fix pool deletion handling (#10372 Sage Weil)
+* librados: fix pool name caching (#10458 Radoslaw Zarzynski)
+* librados: fix resource leak, misc bugs (#10425 Radoslaw Zarzynski)
+* librados: fix some watch/notify locking (Jason Dillaman, Josh Durgin)
+* librados: fix timer race from recent refactor (Sage Weil)
+* librados: new fadvise API (Ma Jianpeng)
+* librados: only export public API symbols (Jason Dillaman)
+* librados: remove shadowed variable (Kefu Chain)
+* librados: translate op flags from C APIs (Matthew Richards)
+* libradosstriper: fix remove() (Dongmao Zhang)
+* libradosstriper: fix shutdown hang (Dongmao Zhang)
+* libradosstriper: fix stat strtoll (Dongmao Zhang)
+* libradosstriper: fix trunc method (#10129 Sebastien Ponce)
+* libradosstriper: fix write_full when ENOENT (#10758 Sebastien Ponce)
+* libradosstriper: misc fixes (Sebastien Ponce)
+* librbd: CRC protection for RBD image map (Jason Dillaman)
+* librbd: add missing python docstrings (Jason Dillaman)
+* librbd: add per-image object map for improved performance (Jason Dillaman)
+* librbd: add readahead (Adam Crume)
+* librbd: add support for an "object map" indicating which objects exist (Jason Dillaman)
+* librbd: adjust internal locking (Josh Durgin, Jason Dillaman)
+* librbd: better handling of watch errors (Jason Dillaman)
+* librbd: complete pending ops before closing image (#10299 Josh Durgin)
+* librbd: coordinate maint operations through lock owner (Jason Dillaman)
+* librbd: copy-on-read (Min Chen, Li Wang, Yunchuan Wen, Cheng Cheng, Jason Dillaman)
+* librbd: differentiate between R/O vs R/W features (Jason Dillaman)
+* librbd: don't close a closed parent in failure path (#10030 Jason Dillaman)
+* librbd: enforce write ordering with a snapshot (Jason Dillaman)
+* librbd: exclusive image locking (Jason Dillaman)
+* librbd: fadvise API (Ma Jianpeng)
+* librbd: fadvise-style hints; add misc hints for certain operations (Jianpeng Ma)
+* librbd: fix and improve AIO cache invalidation (#10958 Jason Dillaman)
+* librbd: fix cache tiers in list_children and snap_unprotect (Adam Crume)
+* librbd: fix coverity false-positives (Jason Dillaman)
+* librbd: fix diff test (#10002 Josh Durgin)
+* librbd: fix list_children from invalid pool ioctxs (#10123 Jason Dillaman)
+* librbd: fix locking for readahead (#10045 Jason Dillaman)
+* librbd: fix memory leak (Jason Dillaman)
+* librbd: fix ordering/queueing of resize operations (Jason Dillaman)
+* librbd: fix performance regression in ObjectCacher (#9513 Adam Crume)
+* librbd: fix snap create races (Jason Dillaman)
+* librbd: fix write vs import race (#10590 Jason Dillaman)
+* librbd: flush AIO operations asynchronously (#10714 Jason Dillaman)
+* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
+* librbd: lttng tracepoints (Adam Crume)
+* librbd: make async versions of long-running maint operations (Jason Dillaman)
+* librbd: misc fixes (Xinxin Shu, Jason Dillaman)
+* librbd: mock tests (Jason Dillaman)
+* librbd: only export public API symbols (Jason Dillaman)
+* librbd: optionally blacklist clients before breaking locks (#10761 Jason Dillaman)
+* librbd: prevent copyup during shrink (Jason Dillaman)
+* librbd: refactor unit tests to use fixtures (Jason Dillaman)
+* librbd: validate image is r/w on resize/flatten (Jason Dillaman)
+* librbd: various internal locking fixes (Jason Dillaman)
+* many coverity fixes (Danny Al-Gaaf)
+* many many coverity cleanups (Danny Al-Gaaf)
+* mds: 'flush journal' admin command (John Spray)
+* mds: ENOSPC and OSDMap epoch barriers (#7317 John Spray)
+* mds: a whole bunch of initial scrub infrastructure (Greg Farnum)
+* mds: add cephfs-table-tool (John Spray)
+* mds: asok command for fetching subtree map (John Spray)
+* mds: avoid sending traceless replies in most cases (Yan, Zheng)
+* mds: constify MDSCacheObjects (John Spray)
+* mds: dirfrag buf fix (Yan, Zheng)
+* mds: disallow most commands on inactive MDS's (Greg Farnum)
+* mds: drop dentries, leases on deleted directories (#10164 Yan, Zheng)
+* mds: export dir asok command (John Spray)
+* mds: fix MDLog IO callback deadlock (John Spray)
+* mds: fix compat_version for MClientSession (#9945 John Spray)
+* mds: fix deadlock during journal probe vs purge (#10229 Yan, Zheng)
+* mds: fix race trimming log segments (Yan, Zheng)
+* mds: fix reply snapbl (Yan, Zheng)
+* mds: fix sessionmap lifecycle bugs (Yan, Zheng)
+* mds: fix stray/purge perfcounters (#10388 John Spray)
+* mds: handle heartbeat_reset during shutdown (#10382 John Spray)
+* mds: handle zero-size xattr (#10335 Yan, Zheng)
+* mds: initialize root inode xattr version (Yan, Zheng)
+* mds: introduce auth caps (John Spray)
+* mds: many many snapshot-related fixes (Yan, Zheng)
+* mds: misc bugs (Greg Farnum, John Spray, Yan, Zheng, Henry Change)
+* mds: refactor, improve Session storage (John Spray)
+* mds: store backtrace for stray dir (Yan, Zheng)
+* mds: subtree quota support (Yunchuan Wen)
+* mds: verify backtrace when fetching dirfrag (#9557 Yan, Zheng)
+* memstore: free space tracking (John Spray)
+* misc cleanup (Danny Al-Gaaf, David Anderson)
+* misc coverity fixes (Danny Al-Gaaf)
+* misc coverity fixes (Danny Al-Gaaf)
+* misc: various valgrind fixes and cleanups (Danny Al-Gaaf)
+* mon: 'osd crush reweight-all' command (Sage Weil)
+* mon: add 'ceph osd rename-bucket ...' command (Loic Dachary)
+* mon: add bootstrap-rgw profile (Sage Weil)
+* mon: add max pgs per osd warning (Sage Weil)
+* mon: add noforward flag for some mon commands (Mykola Golub)
+* mon: allow adding tiers to fs pools (#10135 John Spray)
+* mon: allow full flag to be manually cleared (#9323 Sage Weil)
+* mon: clean up auth list output (Loic Dachary)
+* mon: delay failure injection (Joao Eduardo Luis)
+* mon: disallow empty pool names (#10555 Wido den Hollander)
+* mon: do not deactivate last mds (#10862 John Spray)
+* mon: do not pollute mon dir with CSV files from CRUSH check (Loic Dachary)
+* mon: drop old ceph_mon_store_converter (Sage Weil)
+* mon: fix 'ceph pg dump_stuck degraded' (Xinxin Shu)
+* mon: fix 'mds fail' for standby MDSs (John Spray)
+* mon: fix 'osd crush link' id resolution (John Spray)
+* mon: fix 'profile osd' use of config-key function on mon (#10844 Joao Eduardo Luis)
+* mon: fix *_ratio* units and types (Sage Weil)
+* mon: fix JSON dumps to dump floats as flots and not strings (Sage Weil)
+* mon: fix MDS health status from peons (#10151 John Spray)
+* mon: fix caching for min_last_epoch_clean (#9987 Sage Weil)
+* mon: fix clock drift time check interval (#10546 Joao Eduardo Luis)
+* mon: fix compatset initalization during mkfs (Joao Eduardo Luis)
+* mon: fix error output for add_data_pool (#9852 Joao Eduardo Luis)
+* mon: fix feature tracking during elections (Joao Eduardo Luis)
+* mon: fix formatter 'pg stat' command output (Sage Weil)
+* mon: fix mds gid/rank/state parsing (John Spray)
+* mon: fix misc error paths (Joao Eduardo Luis)
+* mon: fix paxos off-by-one corner case (#9301 Sage Weil)
+* mon: fix paxos timeouts (#10220 Joao Eduardo Luis)
+* mon: fix stashed monmap encoding (#5203 Xie Rui)
+* mon: fix units in store stats (Joao Eduardo Luis)
+* mon: get canonical OSDMap from leader (#10422 Sage Weil)
+* mon: ignore failure reports from before up_from (#10762 Dan van der Ster, Sage Weil)
+* mon: implement 'fs reset' command (John Spray)
+* mon: improve error handling on erasure code profile set (#10488, #11144 Loic Dachary)
+* mon: improved corrupt CRUSH map detection (Joao Eduardo Luis)
+* mon: include entity name in audit log for forwarded requests (#9913 Joao Eduardo Luis)
+* mon: include pg_temp count in osdmap summary (Sage Weil)
+* mon: log health summary to cluster log (#9440 Joao Eduardo Luis)
+* mon: make 'mds fail' idempotent (John Spray)
+* mon: make pg dump {sum,pgs,pgs_brief} work for format=plain (#5963 #6759 Mykola Golub)
+* mon: new 'ceph pool ls [detail]' command (Sage Weil)
+* mon: new pool safety flags nodelete, nopgchange, nosizechange (#9792 Mykola Golub)
+* mon: new, friendly 'ceph pg ls ...' command (Xinxin Shu)
+* mon: paxos: allow reads while proposing (#9321 #9322 Joao Eduardo Luis)
+* mon: prevent MDS transition from STOPPING (#10791 Greg Farnum)
+* mon: propose all pending work in one transaction (Sage Weil)
+* mon: remove pg_temps for nonexistent pools (Joao Eduardo Luis)
+* mon: require mon_allow_pool_delete option to remove pools (Sage Weil)
+* mon: respect down flag when promoting standbys (John Spray)
+* mon: set globalid prealloc to larger value (Sage Weil)
+* mon: set {read,write}_tier on 'osd tier add-cache ...' (Jianpeng Ma)
+* mon: skip zeroed osd stats in get_rule_avail (#10257 Joao Eduardo Luis)
+* mon: validate min_size range (Jianpeng Ma)
+* mon: wait for writeable before cross-proposing (#9794 Joao Eduardo Luis)
+* mount.ceph: fix suprious error message (#10351 Yan, Zheng)
+* ms: xio: fix misc bugs (Matt Benjamin, Vu Pham)
+* msgr: async: bind threads to CPU cores, improved poll (Haomai Wang)
+* msgr: async: many fixes, unit tests (Haomai Wang)
+* msgr: async: several fixes (Haomai Wang)
+* msgr: asyncmessenger: add kqueue support (#9926 Haomai Wang)
+* msgr: avoid useless new/delete (Haomai Wang)
+* msgr: fix RESETSESSION bug (#10080 Greg Farnum)
+* msgr: fix crc configuration (Mykola Golub)
+* msgr: fix delay injection bug (#9910 Sage Weil, Greg Farnum)
+* msgr: misc unit tests (Haomai Wang)
+* msgr: new AsymcMessenger alternative implementation (Haomai Wang)
+* msgr: prefetch data when doing recv (Yehuda Sadeh)
+* msgr: simple: fix rare deadlock (Greg Farnum)
+* msgr: simple: retry binding to port on failure (#10029 Wido den Hollander)
+* msgr: xio: XioMessenger RDMA support (Casey Bodley, Vu Pham, Matt Benjamin)
+* objectstore: deprecate collection attrs (Sage Weil)
+* osd, librados: fadvise-style librados hints (Jianpeng Ma)
+* osd, librados: fix xattr_cmp_u64 (Dongmao Zhang)
+* osd, librados: revamp PG listing API to handle namespaces (#9031 #9262 #9438 David Zafman)
+* osd, mds: 'ops' as shorthand for 'dump_ops_in_flight' on asok (Sage Weil)
+* osd, mon: add checksums to all OSDMaps (Sage Weil)
+* osd, mon: send intiial pg create time from mon to osd (#9887 David Zafman)
+* osd,mon: add 'norebalance' flag (Kefu Chai)
+* osd,mon: specify OSD features explicitly in MOSDBoot (#10911 Sage Weil)
+* osd: DBObjectMap: fix locking to prevent rare crash (#9891 Samuel Just)
+* osd: EIO on whole-object reads when checksum is wrong (Sage Weil)
+* osd: add erasure code corpus (Loic Dachary)
+* osd: add fadvise flags to ObjectStore API (Jianpeng Ma)
+* osd: add get_latest_osdmap asok command (#9483 #9484 Mykola Golub)
+* osd: add misc tests (Loic Dachary, Danny Al-Gaaf)
+* osd: add option to prioritize heartbeat network traffic (Jian Wen)
+* osd: add support for the SHEC erasure-code algorithm (Takeshi Miyamae, Loic Dachary)
+* osd: allow deletion of objects with watcher (#2339 Sage Weil)
+* osd: allow recovery while below min_size (Samuel Just)
+* osd: allow recovery with fewer than min_size OSDs (Samuel Just)
+* osd: allow sparse read for Push/Pull (Haomai Wang)
+* osd: allow whiteout deletion in cache pool (Sage Weil)
+* osd: allow writes to degraded objects (Samuel Just)
+* osd: allow writes to degraded objects (Samuel Just)
+* osd: avoid publishing unchanged PG stats (Sage Weil)
+* osd: batch pg log trim (Xinze Chi)
+* osd: cache pool: ignore min flush age when cache is full (Xinze Chi)
+* osd: cache recent ObjectContexts (Dong Yuan)
+* osd: cache reverse_nibbles hash value (Dong Yuan)
+* osd: clean up internal ObjectStore interface (Sage Weil)
+* osd: cleanup boost optionals (William Kennington)
+* osd: clear cache on interval change (Samuel Just)
+* osd: do no proxy reads unless target OSDs are new (#10788 Sage Weil)
+* osd: do not abort deep scrub on missing hinfo (#10018 Loic Dachary)
+* osd: do not update digest on inconsistent object (#10524 Samuel Just)
+* osd: don't record digests for snapdirs (#10536 Samuel Just)
+* osd: drop upgrade support for pre-dumpling (Sage Weil)
+* osd: enable and use posix_fadvise (Sage Weil)
+* osd: erasure coding: allow bench.sh to test ISA backend (Yuan Zhou)
+* osd: erasure-code: encoding regression tests, corpus (#9420 Loic Dachary)
+* osd: erasure-code: enforce chunk size alignment (#10211 Loic Dachary)
+* osd: erasure-code: jerasure support for NEON (Loic Dachary)
+* osd: erasure-code: relax cauchy w restrictions (#10325 David Zhang, Loic Dachary)
+* osd: erasure-code: update gf-complete to latest upstream (Loic Dachary)
+* osd: expose non-journal backends via ceph-osd CLI (Hoamai Wang)
+* osd: filejournal: don't cache journal when not using direct IO (Jianpeng Ma)
+* osd: fix JSON output for stray OSDs (Loic Dachary)
+* osd: fix OSDCap parser on old (el6) boost::spirit (#10757 Kefu Chai)
+* osd: fix OSDCap parsing on el6 (#10757 Kefu Chai)
+* osd: fix ObjectStore::Transaction encoding version (#10734 Samuel Just)
+* osd: fix WBTHrottle perf counters (Haomai Wang)
+* osd: fix and document last_epoch_started semantics (Samuel Just)
+* osd: fix auth object selection during repair (#10524 Samuel Just)
+* osd: fix backfill bug (#10150 Samuel Just)
+* osd: fix bug in pending digest updates (#10840 Samuel Just)
+* osd: fix cancel_proxy_read_ops (Sage Weil)
+* osd: fix cleanup of interrupted pg deletion (#10617 Sage Weil)
+* osd: fix divergent entry handling on PG split (Samuel Just)
+* osd: fix ghobject_t formatted output to include shard (#10063 Loic Dachary)
+* osd: fix ioprio option (Mykola Golub)
+* osd: fix ioprio options (Loic Dachary)
+* osd: fix journal shutdown race (Sage Weil)
+* osd: fix journal wrapping bug (#10883 David Zafman)
+* osd: fix leak in SnapTrimWQ (#10421 Kefu Chai)
+* osd: fix leak on shutdown (Kefu Chai)
+* osd: fix memstore free space calculation (Xiaoxi Chen)
+* osd: fix mixed-version peering issues (Samuel Just)
+* osd: fix object age eviction (Zhiqiang Wang)
+* osd: fix object atime calculation (Xinze Chi)
+* osd: fix object digest update bug (#10840 Samuel Just)
+* osd: fix occasional peering stalls (#10431 Sage Weil)
+* osd: fix ordering issue with new transaction encoding (#10534 Dong Yuan)
+* osd: fix osd peer check on scrub messages (#9555 Sage Weil)
+* osd: fix past_interval display bug (#9752 Loic Dachary)
+* osd: fix past_interval generation (#10427 #10430 David Zafman)
+* osd: fix pgls filter ops (#9439 David Zafman)
+* osd: fix recording of digest on scrub (Samuel Just)
+* osd: fix scrub delay bug (#10693 Samuel Just)
+* osd: fix scrub vs try-flush bug (#8011 Samuel Just)
+* osd: fix short read handling on push (#8121 David Zafman)
+* osd: fix stderr with -f or -d (Dan Mick)
+* osd: fix transaction accounting (Jianpeng Ma)
+* osd: fix watch reconnect race (#10441 Sage Weil)
+* osd: fix watch timeout cache state update (#10784 David Zafman)
+* osd: fix whiteout handling (Sage Weil)
+* osd: flush snapshots from cache tier immediately (Sage Weil)
+* osd: force promotion of watch/notify ops (Zhiqiang Wang)
+* osd: handle no-op write with snapshot (#10262 Sage Weil)
+* osd: improve idempotency detection across cache promotion/demotion (#8935 Sage Weil, Samuel Just)
+* osd: include activating peers in blocked_by (#10477 Sage Weil)
+* osd: jerasure and gf-complete updates from upstream (#10216 Loic Dachary)
+* osd: journal: check fsync/fdatasync result (Jianpeng Ma)
+* osd: journal: fix alignment checks, avoid useless memmove (Jianpeng Ma)
+* osd: journal: fix hang on shutdown (#10474 David Zafman)
+* osd: journal: fix header.committed_up_to (Xinze Chi)
+* osd: journal: fix journal zeroing when direct IO is enabled (Xie Rui)
+* osd: journal: initialize throttle (Ning Yao)
+* osd: journal: misc bug fixes (#6003 David Zafman, Samuel Just)
+* osd: journal: update committed_thru after replay (#6756 Samuel Just)
+* osd: keyvaluestore: cleanup dead code (Ning Yao)
+* osd: keyvaluestore: fix getattr semantics (Haomai Wang)
+* osd: keyvaluestore: fix key ordering (#10119 Haomai Wang)
+* osd: keyvaluestore_dev: optimization (Chendi Xue)
+* osd: limit in-flight read requests (Jason Dillaman)
+* osd: log when scrub or repair starts (Loic Dachary)
+* osd: make misdirected op checks robust for EC pools (#9835 Sage Weil)
+* osd: memstore: fix size limit (Xiaoxi Chen)
+* osd: misc FIEMAP fixes (Ma Jianpeng)
+* osd: misc cleanup (Xinze Chi, Yongyue Sun)
+* osd: misc optimizations (Xinxin Shu, Zhiqiang Wang, Xinze Chi)
+* osd: misc scrub fixes (#10017 Loic Dachary)
+* osd: new 'activating' state between peering and active (Sage Weil)
+* osd: new optimized encoding for ObjectStore::Transaction (Dong Yuan)
+* osd: optimize Finisher (Xinze Chi)
+* osd: optimize WBThrottle map with unordered_map (Ning Yao)
+* osd: optimize filter_snapc (Ning Yao)
+* osd: preserve reqids for idempotency checks for promote/demote (Sage Weil, Zhiqiang Wang, Samuel Just)
+* osd: proxy read support (Zhiqiang Wang)
+* osd: proxy reads during cache promote (Zhiqiang Wang)
+* osd: remove dead locking code (Xinxin Shu)
+* osd: remove legacy classic scrub code (Sage Weil)
+* osd: remove unused fields in MOSDSubOp (Xiaoxi Chen)
+* osd: removed some dead code (Xinze Chi)
+* osd: replace MOSDSubOp messages with simpler, optimized MOSDRepOp (Xiaoxi Chen)
+* osd: restrict scrub to certain times of day (Xinze Chi)
+* osd: rocksdb: fix shutdown (Hoamai Wang)
+* osd: store PG metadata in per-collection objects for better concurrency (Sage Weil)
+* osd: store whole-object checksums on scrub, write_full (Sage Weil)
+* osd: support for discard for journal trim (Jianpeng Ma)
+* osd: use FIEMAP_FLAGS_SYNC instead of fsync (Jianpeng Ma)
+* osd: verify kernel is new enough before using XFS extsize ioctl, enable by default (#9956 Sage Weil)
+* pybind: fix memory leak in librados bindings (Billy Olsen)
+* pyrados: add object lock support (#6114 Mehdi Abaakouk)
+* pyrados: fix misnamed wait_* routings (#10104 Dan Mick)
+* pyrados: misc cleanups (Kefu Chai)
+* qa: add large auth ticket tests (Ilya Dryomov)
+* qa: fix mds tests (#10539 John Spray)
+* qa: fix osd create dup tests (#10083 Loic Dachary)
+* qa: ignore duplicates in rados ls (Josh Durgin)
+* qa: improve hadoop tests (Noah Watkins)
+* qa: many 'make check' improvements (Loic Dachary)
+* qa: misc tests (Loic Dachary, Yan, Zheng)
+* qa: parallelize make check (Loic Dachary)
+* qa: reorg fs quota tests (Greg Farnum)
+* qa: tolerate nearly-full disk for make check (Loic Dachary)
+* rados: fix put of /dev/null (Loic Dachary)
+* rados: fix usage (Jianpeng Ma)
+* rados: parse command-line arguments more strictly (#8983 Adam Crume)
+* rados: use copy-from operation for copy, cppool (Sage Weil)
+* radosgw-admin: add replicalog update command (Yehuda Sadeh)
+* rbd-fuse: clean up on shutdown (Josh Durgin)
+* rbd-fuse: fix memory leak (Adam Crume)
+* rbd-replay-many (Adam Crume)
+* rbd-replay: --anonymize flag to rbd-replay-prep (Adam Crume)
+* rbd: add 'merge-diff' function (MingXin Liu, Yunchuan Wen, Li Wang)
+* rbd: allow v2 striping parameters for clones and imports (Jason Dillaman)
+* rbd: fix 'rbd diff' for non-existent objects (Adam Crume)
+* rbd: fix buffer handling on image import (#10590 Jason Dillaman)
+* rbd: fix error when striping with format 1 (Sebastien Han)
+* rbd: fix export for image sizes over 2GB (Vicente Cheng)
+* rbd: fix formatted output of image features (Jason Dillaman)
+* rbd: leave exclusive lockin goff by default (Jason Dillaman)
+* rbd: updat eman page (Ilya Dryomov)
+* rbd: update init-rbdmap to fix dup mount point (Karel Striegel)
+* rbd: use IO hints for import, export, and bench operations (#10462 Jason Dillaman)
+* rbd: use rolling average for rbd bench-write throughput (Jason Dillaman)
+* rbd_recover_tool: RBD image recovery tool (Min Chen)
+* rgw: S3-style object versioning support (Yehuda Sadeh)
+* rgw: add location header when object is in another region (VRan Liu)
+* rgw: change multipart upload id magic (#10271 Yehuda Sadeh)
+* rgw: check keystone auth for S3 POST requests (#10062 Abhishek Lekshmanan)
+* rgw: check timestamp on s3 keystone auth (#10062 Abhishek Lekshmanan)
+* rgw: conditional PUT on ETag (#8562 Ray Lv)
+* rgw: create subuser if needed when creating user (#10103 Yehuda Sadeh)
+* rgw: decode http query params correction (#10271 Yehuda Sadeh)
+* rgw: don't overwrite bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
+* rgw: enable IPv6 for civetweb (#10965 Yehuda Sadeh)
+* rgw: extend replica log API (purge-all) (Yehuda Sadeh)
+* rgw: fail S3 POST if keystone not configured (#10688 Valery Tschopp, Yehuda Sadeh)
+* rgw: fix If-Modified-Since (VRan Liu)
+* rgw: fix XML header on get ACL request (#10106 Yehuda Sadeh)
+* rgw: fix bucket removal with data purge (Yehuda Sadeh)
+* rgw: fix content length check (#10701 Axel Dunkel, Yehuda Sadeh)
+* rgw: fix content-length update (#9576 Yehuda Sadeh)
+* rgw: fix disabling of max_size quota (#9907 Dong Lei)
+* rgw: fix error codes (#10334 #10329 Yehuda Sadeh)
+* rgw: fix incorrect len when len is 0 (#9877 Yehuda Sadeh)
+* rgw: fix object copy content type (#9478 Yehuda Sadeh)
+* rgw: fix partial GET in swift (#10553 Yehuda Sadeh)
+* rgw: fix replica log indexing (#8251 Yehuda Sadeh)
+* rgw: fix shutdown (#10472 Yehuda Sadeh)
+* rgw: fix swift metadata header name (Dmytro Iurchenko)
+* rgw: fix sysvinit script when rgw_socket_path is not defined (#11159 Yehuda Sadeh, Dan Mick)
+* rgw: fix user stags in get-user-info API (#9359 Ray Lv)
+* rgw: include XML ns on get ACL request (#10106 Yehuda Sadeh)
+* rgw: index swift keys appropriately (#10471 Yehuda Sadeh)
+* rgw: make sysvinit script set ulimit -n properly (Sage Weil)
+* rgw: misc fixes (#10307 Yehuda Sadeh)
+* rgw: only track cleanup for objects we write (#10311 Yehuda Sadeh)
+* rgw: pass civetweb configurables through (#10907 Yehuda Sadeh)
+* rgw: prevent illegal bucket policy that doesn't match placement rule (Yehuda Sadeh)
+* rgw: remove multipart entries from bucket index on abort (#10719 Yehuda Sadeh)
+* rgw: remove swift user manifest (DLO) hash calculation (#9973 Yehuda Sadeh)
+* rgw: respond with 204 to POST on containers (#10667 Yuan Zhou)
+* rgw: return timestamp on GET/HEAD (#8911 Yehuda Sadeh)
+* rgw: reuse fcgx connection struct (#10194 Yehuda Sadeh)
+* rgw: run radosgw as apache with systemd (#10125 Loic Dachary)
+* rgw: send explicit HTTP status string (Yehuda Sadeh)
+* rgw: set ETag on object copy (#9479 Yehuda Sadeh)
+* rgw: set length for keystone token validation request (#7796 Yehuda Sadeh, Mark Kirkwood)
+* rgw: support X-Storage-Policy header for Swift storage policy compat (Yehuda Sadeh)
+* rgw: support multiple host names (#7467 Yehuda Sadeh)
+* rgw: swift: dump container's custom metadata (#10665 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: swift: support Accept header for response format (#10746 Dmytro Iurchenko)
+* rgw: swift: support for X-Remove-Container-Meta-{key} (#10475 Dmytro Iurchenko)
+* rgw: tweak error codes (#10329 #10334 Yehuda Sadeh)
+* rgw: update bucket index on attr changes, for multi-site sync (#5595 Yehuda Sadeh)
+* rgw: use \r\n for http headers (#9254 Yehuda Sadeh)
+* rgw: use gc for multipart abort (#10445 Aaron Bassett, Yehuda Sadeh)
+* rgw: use new watch/notify API (Yehuda Sadeh, Sage Weil)
+* rpm: misc fixes (Key Dreyer)
+* rpm: move rgw logrotate to radosgw subpackage (Ken Dreyer)
+* systemd: better systemd unit files (Owen Synge)
+* sysvinit: fix race in 'stop' (#10389 Loic Dachary)
+* test: fix bufferlist tests (Jianpeng Ma)
+* tests: ability to run unit tests under docker (Loic Dachary)
+* tests: centos-6 dockerfile (#10755 Loic Dachary)
+* tests: improve docker-based tests (Loic Dachary)
+* tests: unit tests for shared_cache (Dong Yuan)
+* udev: fix rules for CentOS7/RHEL7 (Loic Dachary)
+* use clock_gettime instead of gettimeofday (Jianpeng Ma)
+* vstart.sh: set up environment for s3-tests (Luis Pabon)
+* vstart.sh: work with cmake (Yehuda Sadeh)
+
+
+
+
+
+
+v0.93
+=====
+
+This is the first release candidate for Hammer, and includes all of
+the features that will be present in the final release.  We welcome
+and encourage any and all testing in non-production clusters to identify
+any problems with functionality, stability, or performance before the
+final Hammer release.
+
+We suggest some caution in one area: librbd.  There is a lot of new
+functionality around object maps and locking that is disabled by
+default but may still affect stability for existing images.  We are
+continuing to shake out those bugs so that the final Hammer release
+(probably v0.94) will be rock solid.
+
+Major features since Giant include:
+
+* cephfs: journal scavenger repair tool (John Spray)
+* crush: new and improved straw2 bucket type (Sage Weil, Christina Anderson, Xiaoxi Chen)
+* doc: improved guidance for CephFS early adopters (John Spray)
+* librbd: add per-image object map for improved performance (Jason Dillaman)
+* librbd: copy-on-read (Min Chen, Li Wang, Yunchuan Wen, Cheng Cheng)
+* librados: fadvise-style IO hints (Jianpeng Ma)
+* mds: many many snapshot-related fixes (Yan, Zheng)
+* mon: new 'ceph osd df' command (Mykola Golub)
+* mon: new 'ceph pg ls ...' command (Xinxin Shu)
+* osd: improved performance for high-performance backends
+* osd: improved recovery behavior (Samuel Just)
+* osd: improved cache tier behavior with reads (Zhiqiang Wang)
+* rgw: S3-compatible bucket versioning support (Yehuda Sadeh)
+* rgw: large bucket index sharding (Guang Yang, Yehuda Sadeh)
+* RDMA "xio" messenger support (Matt Benjamin, Vu Pham)
+
+Upgrading
+---------
+
+* If you are upgrading from v0.92, you must stop all OSD daemons and flush their
+  journals (``ceph-osd -i NNN --flush-journal``) before upgrading.  There was
+  a transaction encoding bug in v0.92 that broke compatibility.  Upgrading from
+  v0.91 or anything earlier is safe.
+
+* No special restrictions when upgrading from firefly or giant.
+
+Notable Changes
+---------------
+
+* build: CMake support (Ali Maredia, Casey Bodley, Adam Emerson, Marcus Watts, Matt Benjamin)
+* ceph-disk: do not re-use partition if encryption is required (Loic Dachary)
+* ceph-disk: support LUKS for encrypted partitions (Andrew Bartlett, Loic Dachary)
+* ceph-fuse,libcephfs: add support for O_NOFOLLOW and O_PATH (Greg Farnum)
+* ceph-fuse,libcephfs: resend requests before completing cap reconnect (#10912 Yan, Zheng)
+* ceph-fuse: select kernel cache invalidation mechanism based on kernel version (Greg Farnum)
+* ceph-objectstore-tool: improved import (David Zafman)
+* ceph-objectstore-tool: misc improvements, fixes (#9870 #9871 David Zafman)
+* ceph: add 'ceph osd df [tree]' command (#10452 Mykola Golub)
+* ceph: fix 'ceph tell ...' command validation (#10439 Joao Eduardo Luis)
+* ceph: improve 'ceph osd tree' output (Mykola Golub)
+* cephfs-journal-tool: add recover_dentries function (#9883 John Spray)
+* common: add newline to flushed json output (Sage Weil)
+* common: filtering for 'perf dump' (John Spray)
+* common: fix Formatter factory breakage (#10547 Loic Dachary)
+* common: make json-pretty output prettier (Sage Weil)
+* crush: new and improved straw2 bucket type (Sage Weil, Christina Anderson, Xiaoxi Chen)
+* crush: update tries stats for indep rules (#10349 Loic Dachary)
+* crush: use larger choose_tries value for erasure code rulesets (#10353 Loic Dachary)
+* debian,rpm: move RBD udev rules to ceph-common (#10864 Ken Dreyer)
+* debian: split python-ceph into python-{rbd,rados,cephfs} (Boris Ranto)
+* doc: CephFS disaster recovery guidance (John Spray)
+* doc: CephFS for early adopters (John Spray)
+* doc: fix OpenStack Glance docs (#10478 Sebastien Han)
+* doc: misc updates (#9793 #9922 #10204 #10203 Travis Rhoden, Hazem, Ayari, Florian Coste, Andy Allan, Frank Yu, Baptiste Veuillez-Mainard, Yuan Zhou, Armando Segnini, Robert Jansen, Tyler Brekke, Viktor Suprun)
+* doc: replace cloudfiles with swiftclient Python Swift example (Tim Freund)
+* erasure-code: add mSHEC erasure code support (Takeshi Miyamae)
+* erasure-code: improved docs (#10340 Loic Dachary)
+* erasure-code: set max_size to 20 (#10363 Loic Dachary)
+* libcephfs,ceph-fuse: fix getting zero-length xattr (#10552 Yan, Zheng)
+* librados: add blacklist_add convenience method (Jason Dillaman)
+* librados: expose rados_{read|write}_op_assert_version in C API (Kim Vandry)
+* librados: fix pool name caching (#10458 Radoslaw Zarzynski)
+* librados: fix resource leak, misc bugs (#10425 Radoslaw Zarzynski)
+* librados: fix some watch/notify locking (Jason Dillaman, Josh Durgin)
+* libradosstriper: fix write_full when ENOENT (#10758 Sebastien Ponce)
+* librbd: CRC protection for RBD image map (Jason Dillaman)
+* librbd: add per-image object map for improved performance (Jason Dillaman)
+* librbd: add support for an "object map" indicating which objects exist (Jason Dillaman)
+* librbd: adjust internal locking (Josh Durgin, Jason Dillaman)
+* librbd: better handling of watch errors (Jason Dillaman)
+* librbd: coordinate maint operations through lock owner (Jason Dillaman)
+* librbd: copy-on-read (Min Chen, Li Wang, Yunchuan Wen, Cheng Cheng, Jason Dillaman)
+* librbd: enforce write ordering with a snapshot (Jason Dillaman)
+* librbd: fadvise-style hints; add misc hints for certain operations (Jianpeng Ma)
+* librbd: fix coverity false-positives (Jason Dillaman)
+* librbd: fix snap create races (Jason Dillaman)
+* librbd: flush AIO operations asynchronously (#10714 Jason Dillaman)
+* librbd: make async versions of long-running maint operations (Jason Dillaman)
+* librbd: mock tests (Jason Dillaman)
+* librbd: optionally blacklist clients before breaking locks (#10761 Jason Dillaman)
+* librbd: prevent copyup during shrink (Jason Dillaman)
+* mds: add cephfs-table-tool (John Spray)
+* mds: avoid sending traceless replies in most cases (Yan, Zheng)
+* mds: export dir asok command (John Spray)
+* mds: fix stray/purge perfcounters (#10388 John Spray)
+* mds: handle heartbeat_reset during shutdown (#10382 John Spray)
+* mds: many many snapshot-related fixes (Yan, Zheng)
+* mds: refactor, improve Session storage (John Spray)
+* misc coverity fixes (Danny Al-Gaaf)
+* mon: add noforward flag for some mon commands (Mykola Golub)
+* mon: disallow empty pool names (#10555 Wido den Hollander)
+* mon: do not deactivate last mds (#10862 John Spray)
+* mon: drop old ceph_mon_store_converter (Sage Weil)
+* mon: fix 'ceph pg dump_stuck degraded' (Xinxin Shu)
+* mon: fix 'profile osd' use of config-key function on mon (#10844 Joao Eduardo Luis)
+* mon: fix compatset initalization during mkfs (Joao Eduardo Luis)
+* mon: fix feature tracking during elections (Joao Eduardo Luis)
+* mon: fix mds gid/rank/state parsing (John Spray)
+* mon: ignore failure reports from before up_from (#10762 Dan van der Ster, Sage Weil)
+* mon: improved corrupt CRUSH map detection (Joao Eduardo Luis)
+* mon: include pg_temp count in osdmap summary (Sage Weil)
+* mon: log health summary to cluster log (#9440 Joao Eduardo Luis)
+* mon: make 'mds fail' idempotent (John Spray)
+* mon: make pg dump {sum,pgs,pgs_brief} work for format=plain (#5963 #6759 Mykola Golub)
+* mon: new pool safety flags nodelete, nopgchange, nosizechange (#9792 Mykola Golub)
+* mon: new, friendly 'ceph pg ls ...' command (Xinxin Shu)
+* mon: prevent MDS transition from STOPPING (#10791 Greg Farnum)
+* mon: propose all pending work in one transaction (Sage Weil)
+* mon: remove pg_temps for nonexistent pools (Joao Eduardo Luis)
+* mon: require mon_allow_pool_delete option to remove pools (Sage Weil)
+* mon: set globalid prealloc to larger value (Sage Weil)
+* mon: skip zeroed osd stats in get_rule_avail (#10257 Joao Eduardo Luis)
+* mon: validate min_size range (Jianpeng Ma)
+* msgr: async: bind threads to CPU cores, improved poll (Haomai Wang)
+* msgr: fix crc configuration (Mykola Golub)
+* msgr: misc unit tests (Haomai Wang)
+* msgr: xio: XioMessenger RDMA support (Casey Bodley, Vu Pham, Matt Benjamin)
+* osd, librados: fadvise-style librados hints (Jianpeng Ma)
+* osd, librados: fix xattr_cmp_u64 (Dongmao Zhang)
+* osd,mon: add 'norebalance' flag (Kefu Chai)
+* osd,mon: specify OSD features explicitly in MOSDBoot (#10911 Sage Weil)
+* osd: add option to prioritize heartbeat network traffic (Jian Wen)
+* osd: add support for the SHEC erasure-code algorithm (Takeshi Miyamae, Loic Dachary)
+* osd: allow recovery while below min_size (Samuel Just)
+* osd: allow recovery with fewer than min_size OSDs (Samuel Just)
+* osd: allow writes to degraded objects (Samuel Just)
+* osd: allow writes to degraded objects (Samuel Just)
+* osd: avoid publishing unchanged PG stats (Sage Weil)
+* osd: cache recent ObjectContexts (Dong Yuan)
+* osd: clear cache on interval change (Samuel Just)
+* osd: do no proxy reads unless target OSDs are new (#10788 Sage Weil)
+* osd: do not update digest on inconsistent object (#10524 Samuel Just)
+* osd: don't record digests for snapdirs (#10536 Samuel Just)
+* osd: fix OSDCap parser on old (el6) boost::spirit (#10757 Kefu Chai)
+* osd: fix OSDCap parsing on el6 (#10757 Kefu Chai)
+* osd: fix ObjectStore::Transaction encoding version (#10734 Samuel Just)
+* osd: fix auth object selection during repair (#10524 Samuel Just)
+* osd: fix bug in pending digest updates (#10840 Samuel Just)
+* osd: fix cancel_proxy_read_ops (Sage Weil)
+* osd: fix cleanup of interrupted pg deletion (#10617 Sage Weil)
+* osd: fix journal wrapping bug (#10883 David Zafman)
+* osd: fix leak in SnapTrimWQ (#10421 Kefu Chai)
+* osd: fix memstore free space calculation (Xiaoxi Chen)
+* osd: fix mixed-version peering issues (Samuel Just)
+* osd: fix object digest update bug (#10840 Samuel Just)
+* osd: fix ordering issue with new transaction encoding (#10534 Dong Yuan)
+* osd: fix past_interval generation (#10427 #10430 David Zafman)
+* osd: fix short read handling on push (#8121 David Zafman)
+* osd: fix watch timeout cache state update (#10784 David Zafman)
+* osd: force promotion of watch/notify ops (Zhiqiang Wang)
+* osd: improve idempotency detection across cache promotion/demotion (#8935 Sage Weil, Samuel Just)
+* osd: include activating peers in blocked_by (#10477 Sage Weil)
+* osd: jerasure and gf-complete updates from upstream (#10216 Loic Dachary)
+* osd: journal: check fsync/fdatasync result (Jianpeng Ma)
+* osd: journal: fix hang on shutdown (#10474 David Zafman)
+* osd: journal: fix header.committed_up_to (Xinze Chi)
+* osd: journal: initialize throttle (Ning Yao)
+* osd: journal: misc bug fixes (#6003 David Zafman, Samuel Just)
+* osd: misc cleanup (Xinze Chi, Yongyue Sun)
+* osd: new 'activating' state between peering and active (Sage Weil)
+* osd: preserve reqids for idempotency checks for promote/demote (Sage Weil, Zhiqiang Wang, Samuel Just)
+* osd: remove dead locking code (Xinxin Shu)
+* osd: restrict scrub to certain times of day (Xinze Chi)
+* osd: rocksdb: fix shutdown (Hoamai Wang)
+* pybind: fix memory leak in librados bindings (Billy Olsen)
+* qa: fix mds tests (#10539 John Spray)
+* qa: ignore duplicates in rados ls (Josh Durgin)
+* qa: improve hadoop tests (Noah Watkins)
+* qa: reorg fs quota tests (Greg Farnum)
+* rados: fix usage (Jianpeng Ma)
+* radosgw-admin: add replicalog update command (Yehuda Sadeh)
+* rbd-fuse: clean up on shutdown (Josh Durgin)
+* rbd: add 'merge-diff' function (MingXin Liu, Yunchuan Wen, Li Wang)
+* rbd: fix buffer handling on image import (#10590 Jason Dillaman)
+* rbd: leave exclusive lockin goff by default (Jason Dillaman)
+* rbd: update init-rbdmap to fix dup mount point (Karel Striegel)
+* rbd: use IO hints for import, export, and bench operations (#10462 Jason Dillaman)
+* rbd_recover_tool: RBD image recovery tool (Min Chen)
+* rgw: S3-style object versioning support (Yehuda Sadeh)
+* rgw: check keystone auth for S3 POST requests (#10062 Abhishek Lekshmanan)
+* rgw: extend replica log API (purge-all) (Yehuda Sadeh)
+* rgw: fail S3 POST if keystone not configured (#10688 Valery Tschopp, Yehuda Sadeh)
+* rgw: fix XML header on get ACL request (#10106 Yehuda Sadeh)
+* rgw: fix bucket removal with data purge (Yehuda Sadeh)
+* rgw: fix replica log indexing (#8251 Yehuda Sadeh)
+* rgw: fix swift metadata header name (Dmytro Iurchenko)
+* rgw: remove multipart entries from bucket index on abort (#10719 Yehuda Sadeh)
+* rgw: respond with 204 to POST on containers (#10667 Yuan Zhou)
+* rgw: reuse fcgx connection struct (#10194 Yehuda Sadeh)
+* rgw: support multiple host names (#7467 Yehuda Sadeh)
+* rgw: swift: dump container's custom metadata (#10665 Ahmad Faheem, Dmytro Iurchenko)
+* rgw: swift: support Accept header for response format (#10746 Dmytro Iurchenko)
+* rgw: swift: support for X-Remove-Container-Meta-{key} (#10475 Dmytro Iurchenko)
+* rpm: move rgw logrotate to radosgw subpackage (Ken Dreyer)
+* tests: centos-6 dockerfile (#10755 Loic Dachary)
+* tests: unit tests for shared_cache (Dong Yuan)
+* vstart.sh: work with cmake (Yehuda Sadeh)
+
+
+
+v0.92
+=====
+
+This is the second-to-last chunk of new stuff before Hammer.  Big items
+include additional checksums on OSD objects, proxied reads in the
+cache tier, image locking in RBD, optimized OSD Transaction and
+replication messages, and a big pile of RGW and MDS bug fixes.
+
+Upgrading
+---------
+
+* The experimental 'keyvaluestore-dev' OSD backend has been renamed
+  'keyvaluestore' (for simplicity) and marked as experimental.  To
+  enable this untested feature and acknowledge that you understand
+  that it is untested and may destroy data, you need to add the
+  following to your ceph.conf::
+
+    enable experimental unrecoverable data corrupting featuers = keyvaluestore
+
+* The following librados C API function calls take a 'flags' argument whose value
+  is now correctly interpreted:
+
+     rados_write_op_operate()
+     rados_aio_write_op_operate()
+     rados_read_op_operate()
+     rados_aio_read_op_operate()
+
+  The flags were not correctly being translated from the librados constants to the
+  internal values.  Now they are.  Any code that is passing flags to these methods
+  should be audited to ensure that they are using the correct LIBRADOS_OP_FLAG_*
+  constants.
+
+* The 'rados' CLI 'copy' and 'cppool' commands now use the copy-from operation,
+  which means the latest CLI cannot run these commands against pre-firefly OSDs.
+
+* The librados watch/notify API now includes a watch_flush() operation to flush
+  the async queue of notify operations.  This should be called by any watch/notify
+  user prior to rados_shutdown().
+
+Notable Changes
+---------------
+
+* add experimental features option (Sage Weil)
+* build: fix 'make check' races (#10384 Loic Dachary)
+* build: fix pkg names when libkeyutils is missing (Pankag Garg, Ken Dreyer)
+* ceph: make 'ceph -s' show PG state counts in sorted order (Sage Weil)
+* ceph: make 'ceph tell mon.* version' work (Mykola Golub)
+* ceph-monstore-tool: fix/improve CLI (Joao Eduardo Luis)
+* ceph: show primary-affinity in 'ceph osd tree' (Mykola Golub)
+* common: add TableFormatter (Andreas Peters)
+* common: check syncfs() return code (Jianpeng Ma)
+* doc: do not suggest dangerous XFS nobarrier option (Dan van der Ster)
+* doc: misc updates (Nilamdyuti Goswami, John Wilkins)
+* install-deps.sh: do not require sudo when root (Loic Dachary)
+* libcephfs: fix dirfrag trimming (#10387 Yan, Zheng)
+* libcephfs: fix mount timeout (#10041 Yan, Zheng)
+* libcephfs: fix test (#10415 Yan, Zheng)
+* libcephfs: fix use-afer-free on umount (#10412 Yan, Zheng)
+* libcephfs: include ceph and git version in client metadata (Sage Weil)
+* librados: add watch_flush() operation (Sage Weil, Haomai Wang)
+* librados: avoid memcpy on getxattr, read (Jianpeng Ma)
+* librados: create ioctx by pool id (Jason Dillaman)
+* librados: do notify completion in fast-dispatch (Sage Weil)
+* librados: remove shadowed variable (Kefu Chain)
+* librados: translate op flags from C APIs (Matthew Richards)
+* librbd: differentiate between R/O vs R/W features (Jason Dillaman)
+* librbd: exclusive image locking (Jason Dillaman)
+* librbd: fix write vs import race (#10590 Jason Dillaman)
+* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
+* mds: asok command for fetching subtree map (John Spray)
+* mds: constify MDSCacheObjects (John Spray)
+* misc: various valgrind fixes and cleanups (Danny Al-Gaaf)
+* mon: fix 'mds fail' for standby MDSs (John Spray)
+* mon: fix stashed monmap encoding (#5203 Xie Rui)
+* mon: implement 'fs reset' command (John Spray)
+* mon: respect down flag when promoting standbys (John Spray)
+* mount.ceph: fix suprious error message (#10351 Yan, Zheng)
+* msgr: async: many fixes, unit tests (Haomai Wang)
+* msgr: simple: retry binding to port on failure (#10029 Wido den Hollander)
+* osd: add fadvise flags to ObjectStore API (Jianpeng Ma)
+* osd: add get_latest_osdmap asok command (#9483 #9484 Mykola Golub)
+* osd: EIO on whole-object reads when checksum is wrong (Sage Weil)
+* osd: filejournal: don't cache journal when not using direct IO (Jianpeng Ma)
+* osd: fix ioprio option (Mykola Golub)
+* osd: fix scrub delay bug (#10693 Samuel Just)
+* osd: fix watch reconnect race (#10441 Sage Weil)
+* osd: handle no-op write with snapshot (#10262 Sage Weil)
+* osd: journal: fix journal zeroing when direct IO is enabled (Xie Rui)
+* osd: keyvaluestore: cleanup dead code (Ning Yao)
+* osd, mds: 'ops' as shorthand for 'dump_ops_in_flight' on asok (Sage Weil)
+* osd: memstore: fix size limit (Xiaoxi Chen)
+* osd: misc scrub fixes (#10017 Loic Dachary)
+* osd: new optimized encoding for ObjectStore::Transaction (Dong Yuan)
+* osd: optimize filter_snapc (Ning Yao)
+* osd: optimize WBThrottle map with unordered_map (Ning Yao)
+* osd: proxy reads during cache promote (Zhiqiang Wang)
+* osd: proxy read support (Zhiqiang Wang)
+* osd: remove legacy classic scrub code (Sage Weil)
+* osd: remove unused fields in MOSDSubOp (Xiaoxi Chen)
+* osd: replace MOSDSubOp messages with simpler, optimized MOSDRepOp (Xiaoxi Chen)
+* osd: store whole-object checksums on scrub, write_full (Sage Weil)
+* osd: verify kernel is new enough before using XFS extsize ioctl, enable by default (#9956 Sage Weil)
+* rados: use copy-from operation for copy, cppool (Sage Weil)
+* rgw: change multipart upload id magic (#10271 Yehuda Sadeh)
+* rgw: decode http query params correction (#10271 Yehuda Sadeh)
+* rgw: fix content length check (#10701 Axel Dunkel, Yehuda Sadeh)
+* rgw: fix partial GET in swift (#10553 Yehuda Sadeh)
+* rgw: fix shutdown (#10472 Yehuda Sadeh)
+* rgw: include XML ns on get ACL request (#10106 Yehuda Sadeh)
+* rgw: misc fixes (#10307 Yehuda Sadeh)
+* rgw: only track cleanup for objects we write (#10311 Yehuda Sadeh)
+* rgw: tweak error codes (#10329 #10334 Yehuda Sadeh)
+* rgw: use gc for multipart abort (#10445 Aaron Bassett, Yehuda Sadeh)
+* sysvinit: fix race in 'stop' (#10389 Loic Dachary)
+* test: fix bufferlist tests (Jianpeng Ma)
+* tests: improve docker-based tests (Loic Dachary)
+
+
+v0.91
+=====
+
+We are quickly approaching the Hammer feature freeze but have a few
+more dev releases to go before we get there.  The headline items are
+subtree-based quota support in CephFS (ceph-fuse/libcephfs client
+support only for now), a rewrite of the watch/notify librados API used
+by RBD and RGW, OSDMap checksums to ensure that maps are always
+consistent inside the cluster, new API calls in librados and librbd
+for IO hinting modeled after posix_fadvise, and improved storage of
+per-PG state.
+
+We expect two more releases before the Hammer feature freeze (v0.93).
+
+Upgrading
+---------
+
+* The 'category' field for objects has been removed.  This was originally added
+  to track PG stat summations over different categories of objects for use by
+  radosgw.  It is no longer has any known users and is prone to abuse because it
+  can lead to a pg_stat_t structure that is unbounded.  The librados API calls
+  that accept this field now ignore it, and the OSD no longers tracks the
+  per-category summations.
+
+* The output for 'rados df' has changed.  The 'category' level has been
+  eliminated, so there is now a single stat object per pool.  The structure of
+  the JSON output is different, and the plaintext output has one less column.
+
+* The 'rados create <objectname> [category]' optional category argument is no
+  longer supported or recognized.
+
+* rados.py's Rados class no longer has a __del__ method; it was causing
+  problems on interpreter shutdown and use of threads.  If your code has
+  Rados objects with limited lifetimes and you're concerned about locked
+  resources, call Rados.shutdown() explicitly.
+
+* There is a new version of the librados watch/notify API with vastly
+  improved semantics.  Any applications using this interface are
+  encouraged to migrate to the new API.  The old API calls are marked
+  as deprecated and will eventually be removed.
+
+* The librados rados_unwatch() call used to be safe to call on an
+  invalid handle.  The new version has undefined behavior when passed
+  a bogus value (for example, when rados_watch() returns an error and
+  handle is not defined).
+
+* The structure of the formatted 'pg stat' command is changed for the
+  portion that counts states by name to avoid using the '+' character
+  (which appears in state names) as part of the XML token (it is not
+  legal).
+
+Notable Changes
+---------------
+
+* asyncmsgr: misc fixes (Haomai Wang)
+* buffer: add 'shareable' construct (Matt Benjamin)
+* build: aarch64 build fixes (Noah Watkins, Haomai Wang)
+* build: support for jemalloc (Shishir Gowda)
+* ceph-disk: allow journal partition re-use (#10146 Loic Dachary, Dav van der Ster)
+* ceph-disk: misc fixes (Christos Stavrakakis)
+* ceph-fuse: fix kernel cache trimming (#10277 Yan, Zheng)
+* ceph-objectstore-tool: many many improvements (David Zafman)
+* common: support new gperftools header locations (Key Dreyer)
+* crush: straw bucket weight calculation fixes (#9998 Sage Weil)
+* doc: misc improvements (Nilamdyuti Goswami, John Wilkins, Chris Holcombe)
+* libcephfs,ceph-fuse: add 'status' asok (John Spray)
+* librados, osd: new watch/notify implementation (Sage Weil)
+* librados: drop 'category' feature (Sage Weil)
+* librados: fix pool deletion handling (#10372 Sage Weil)
+* librados: new fadvise API (Ma Jianpeng)
+* libradosstriper: fix remove() (Dongmao Zhang)
+* librbd: complete pending ops before closing image (#10299 Josh Durgin)
+* librbd: fadvise API (Ma Jianpeng)
+* mds: ENOSPC and OSDMap epoch barriers (#7317 John Spray)
+* mds: dirfrag buf fix (Yan, Zheng)
+* mds: disallow most commands on inactive MDS's (Greg Farnum)
+* mds: drop dentries, leases on deleted directories (#10164 Yan, Zheng)
+* mds: handle zero-size xattr (#10335 Yan, Zheng)
+* mds: subtree quota support (Yunchuan Wen)
+* memstore: free space tracking (John Spray)
+* misc cleanup (Danny Al-Gaaf, David Anderson)
+* mon: 'osd crush reweight-all' command (Sage Weil)
+* mon: allow full flag to be manually cleared (#9323 Sage Weil)
+* mon: delay failure injection (Joao Eduardo Luis)
+* mon: fix paxos timeouts (#10220 Joao Eduardo Luis)
+* mon: get canonical OSDMap from leader (#10422 Sage Weil)
+* msgr: fix RESETSESSION bug (#10080 Greg Farnum)
+* objectstore: deprecate collection attrs (Sage Weil)
+* osd, mon: add checksums to all OSDMaps (Sage Weil)
+* osd: allow deletion of objects with watcher (#2339 Sage Weil)
+* osd: allow sparse read for Push/Pull (Haomai Wang)
+* osd: cache reverse_nibbles hash value (Dong Yuan)
+* osd: drop upgrade support for pre-dumpling (Sage Weil)
+* osd: enable and use posix_fadvise (Sage Weil)
+* osd: erasure-code: enforce chunk size alignment (#10211 Loic Dachary)
+* osd: erasure-code: jerasure support for NEON (Loic Dachary)
+* osd: erasure-code: relax cauchy w restrictions (#10325 David Zhang, Loic Dachary)
+* osd: erasure-code: update gf-complete to latest upstream (Loic Dachary)
+* osd: fix WBTHrottle perf counters (Haomai Wang)
+* osd: fix backfill bug (#10150 Samuel Just)
+* osd: fix occasional peering stalls (#10431 Sage Weil)
+* osd: fix scrub vs try-flush bug (#8011 Samuel Just)
+* osd: fix stderr with -f or -d (Dan Mick)
+* osd: misc FIEMAP fixes (Ma Jianpeng)
+* osd: optimize Finisher (Xinze Chi)
+* osd: store PG metadata in per-collection objects for better concurrency (Sage Weil)
+* pyrados: add object lock support (#6114 Mehdi Abaakouk)
+* pyrados: fix misnamed wait_* routings (#10104 Dan Mick)
+* pyrados: misc cleanups (Kefu Chai)
+* qa: add large auth ticket tests (Ilya Dryomov)
+* qa: many 'make check' improvements (Loic Dachary)
+* qa: misc tests (Loic Dachary, Yan, Zheng)
+* rgw: conditional PUT on ETag (#8562 Ray Lv)
+* rgw: fix error codes (#10334 #10329 Yehuda Sadeh)
+* rgw: index swift keys appropriately (#10471 Yehuda Sadeh)
+* rgw: prevent illegal bucket policy that doesn't match placement rule (Yehuda Sadeh)
+* rgw: run radosgw as apache with systemd (#10125 Loic Dachary)
+* rgw: support X-Storage-Policy header for Swift storage policy compat (Yehuda Sadeh)
+* rgw: use \r\n for http headers (#9254 Yehuda Sadeh)
+* rpm: misc fixes (Key Dreyer)
+
+
+v0.90
+=====
+
+This is the last development release before Christmas.  There are some
+API cleanups for librados and librbd, and lots of bug fixes across the
+board for the OSD, MDS, RGW, and CRUSH.  The OSD also gets support for
+discard (potentially helpful on SSDs, although it is off by default), and there
+are several improvements to ceph-disk.
+
+The next two development releases will be getting a slew of new
+functionality for hammer.  Stay tuned!
+
+Upgrading
+---------
+
+* Previously, the formatted output of 'ceph pg stat -f ...' was a full
+  pg dump that included all metadata about all PGs in the system.  It
+  is now a concise summary of high-level PG stats, just like the
+  unformatted 'ceph pg stat' command.
+
+* All JSON dumps of floating point values were incorrecting surrounding the
+  value with quotes.  These quotes have been removed.  Any consumer of structured
+  JSON output that was consuming the floating point values was previously having
+  to interpret the quoted string and will most likely need to be fixed to take
+  the unquoted number.
+
+Notable Changes
+---------------
+
+* arch: fix NEON feaeture detection (#10185 Loic Dachary)
+* build: adjust build deps for yasm, virtualenv (Jianpeng Ma)
+* build: improve build dependency tooling (Loic Dachary)
+* ceph-disk: call partx/partprobe consistency (#9721 Loic Dachary)
+* ceph-disk: fix dmcrypt key permissions (Loic Dachary)
+* ceph-disk: fix umount race condition (#10096 Blaine Gardner)
+* ceph-disk: init=none option (Loic Dachary)
+* ceph-monstore-tool: fix shutdown (#10093 Loic Dachary)
+* ceph-objectstore-tool: fix import (#10090 David Zafman)
+* ceph-objectstore-tool: many improvements and tests (David Zafman)
+* ceph.spec: package rbd-replay-prep (Ken Dreyer)
+* common: add 'perf reset ...' admin command (Jianpeng Ma)
+* common: do not unlock rwlock on destruction (Federico Simoncelli)
+* common: fix block device discard check (#10296 Sage Weil)
+* common: remove broken CEPH_LOCKDEP optoin (Kefu Chai)
+* crush: fix tree bucket behavior (Rongze Zhu)
+* doc: add build-doc guidlines for Fedora and CentOS/RHEL (Nilamdyuti Goswami)
+* doc: enable rbd cache on openstack deployments (Sebastien Han)
+* doc: improved installation nots on CentOS/RHEL installs (John Wilkins)
+* doc: misc cleanups (Adam Spiers, Sebastien Han, Nilamdyuti Goswami, Ken Dreyer, John Wilkins)
+* doc: new man pages (Nilamdyuti Goswami)
+* doc: update release descriptions (Ken Dreyer)
+* doc: update sepia hardware inventory (Sandon Van Ness)
+* librados: only export public API symbols (Jason Dillaman)
+* libradosstriper: fix stat strtoll (Dongmao Zhang)
+* libradosstriper: fix trunc method (#10129 Sebastien Ponce)
+* librbd: fix list_children from invalid pool ioctxs (#10123 Jason Dillaman)
+* librbd: only export public API symbols (Jason Dillaman)
+* many coverity fixes (Danny Al-Gaaf)
+* mds: 'flush journal' admin command (John Spray)
+* mds: fix MDLog IO callback deadlock (John Spray)
+* mds: fix deadlock during journal probe vs purge (#10229 Yan, Zheng)
+* mds: fix race trimming log segments (Yan, Zheng)
+* mds: store backtrace for stray dir (Yan, Zheng)
+* mds: verify backtrace when fetching dirfrag (#9557 Yan, Zheng)
+* mon: add max pgs per osd warning (Sage Weil)
+* mon: fix *_ratio* units and types (Sage Weil)
+* mon: fix JSON dumps to dump floats as flots and not strings (Sage Weil)
+* mon: fix formatter 'pg stat' command output (Sage Weil)
+* msgr: async: several fixes (Haomai Wang)
+* msgr: simple: fix rare deadlock (Greg Farnum)
+* osd: batch pg log trim (Xinze Chi)
+* osd: clean up internal ObjectStore interface (Sage Weil)
+* osd: do not abort deep scrub on missing hinfo (#10018 Loic Dachary)
+* osd: fix ghobject_t formatted output to include shard (#10063 Loic Dachary)
+* osd: fix osd peer check on scrub messages (#9555 Sage Weil)
+* osd: fix pgls filter ops (#9439 David Zafman)
+* osd: flush snapshots from cache tier immediately (Sage Weil)
+* osd: keyvaluestore: fix getattr semantics (Haomai Wang)
+* osd: keyvaluestore: fix key ordering (#10119 Haomai Wang)
+* osd: limit in-flight read requests (Jason Dillaman)
+* osd: log when scrub or repair starts (Loic Dachary)
+* osd: support for discard for journal trim (Jianpeng Ma)
+* qa: fix osd create dup tests (#10083 Loic Dachary)
+* rgw: add location header when object is in another region (VRan Liu)
+* rgw: check timestamp on s3 keystone auth (#10062 Abhishek Lekshmanan)
+* rgw: make sysvinit script set ulimit -n properly (Sage Weil)
+* systemd: better systemd unit files (Owen Synge)
+* tests: ability to run unit tests under docker (Loic Dachary)
+
+
+v0.89
+=====
+
+This is the second development release since Giant.  The big items
+include the first batch of scrub patchs from Greg for CephFS, a rework
+in the librados object listing API to properly handle namespaces, and
+a pile of bug fixes for RGW.  There are also several smaller issues
+fixed up in the performance area with buffer alignment and memory
+copies, osd cache tiering agent, and various CephFS fixes.
+
+Upgrading
+---------
+
+* New ability to list all objects from all namespaces can fail or
+  return incomplete results when not all OSDs have been upgraded.
+  Features rados --all ls, rados cppool, rados export, rados
+  cache-flush-evict-all and rados cache-try-flush-evict-all can also
+  fail or return incomplete results.
+
+Notable Changes
+---------------
+
+* buffer: add list::get_contiguous (Sage Weil)
+* buffer: avoid rebuild if buffer already contiguous (Jianpeng Ma)
+* ceph-disk: improved systemd support (Owen Synge)
+* ceph-disk: set guid if reusing journal partition (Dan van der Ster)
+* ceph-fuse, libcephfs: allow xattr caps in inject_release_failure (#9800 John Spray)
+* ceph-fuse, libcephfs: fix I_COMPLETE_ORDERED checks (#9894 Yan, Zheng)
+* ceph-fuse: fix dentry invalidation on 3.18+ kernels (#9997 Yan, Zheng)
+* crush: fix detach_bucket (#10095 Sage Weil)
+* crush: fix several bugs in adjust_item_weight (Rongze Zhu)
+* doc: add dumpling to firefly upgrade section (#7679 John Wilkins)
+* doc: document erasure coded pool operations (#9970 Loic Dachary)
+* doc: file system osd config settings (Kevin Dalley)
+* doc: key/value store config reference (John Wilkins)
+* doc: update openstack docs for Juno (Sebastien Han)
+* fix cluster logging from non-mon daemons (Sage Weil)
+* init-ceph: check for systemd-run before using it (Boris Ranto)
+* librados: fix infinite loop with skipped map epochs (#9986 Ding Dinghua)
+* librados: fix iterator operator= bugs (#10082 David Zafman, Yehuda Sadeh)
+* librados: fix null deref when pool DNE (#9944 Sage Weil)
+* librados: fix timer race from recent refactor (Sage Weil)
+* libradosstriper: fix shutdown hang (Dongmao Zhang)
+* librbd: don't close a closed parent in failure path (#10030 Jason Dillaman)
+* librbd: fix diff test (#10002 Josh Durgin)
+* librbd: fix locking for readahead (#10045 Jason Dillaman)
+* librbd: refactor unit tests to use fixtures (Jason Dillaman)
+* many many coverity cleanups (Danny Al-Gaaf)
+* mds: a whole bunch of initial scrub infrastructure (Greg Farnum)
+* mds: fix compat_version for MClientSession (#9945 John Spray)
+* mds: fix reply snapbl (Yan, Zheng)
+* mon: allow adding tiers to fs pools (#10135 John Spray)
+* mon: fix MDS health status from peons (#10151 John Spray)
+* mon: fix caching for min_last_epoch_clean (#9987 Sage Weil)
+* mon: fix error output for add_data_pool (#9852 Joao Eduardo Luis)
+* mon: include entity name in audit log for forwarded requests (#9913 Joao Eduardo Luis)
+* mon: paxos: allow reads while proposing (#9321 #9322 Joao Eduardo Luis)
+* msgr: asyncmessenger: add kqueue support (#9926 Haomai Wang)
+* osd, librados: revamp PG listing API to handle namespaces (#9031 #9262 #9438 David Zafman)
+* osd, mon: send intiial pg create time from mon to osd (#9887 David Zafman)
+* osd: allow whiteout deletion in cache pool (Sage Weil)
+* osd: cache pool: ignore min flush age when cache is full (Xinze Chi)
+* osd: erasure coding: allow bench.sh to test ISA backend (Yuan Zhou)
+* osd: erasure-code: encoding regression tests, corpus (#9420 Loic Dachary)
+* osd: fix journal shutdown race (Sage Weil)
+* osd: fix object age eviction (Zhiqiang Wang)
+* osd: fix object atime calculation (Xinze Chi)
+* osd: fix past_interval display bug (#9752 Loic Dachary)
+* osd: journal: fix alignment checks, avoid useless memmove (Jianpeng Ma)
+* osd: journal: update committed_thru after replay (#6756 Samuel Just)
+* osd: keyvaluestore_dev: optimization (Chendi Xue)
+* osd: make misdirected op checks robust for EC pools (#9835 Sage Weil)
+* osd: removed some dead code (Xinze Chi)
+* qa: parallelize make check (Loic Dachary)
+* qa: tolerate nearly-full disk for make check (Loic Dachary)
+* rgw: create subuser if needed when creating user (#10103 Yehuda Sadeh)
+* rgw: fix If-Modified-Since (VRan Liu)
+* rgw: fix content-length update (#9576 Yehuda Sadeh)
+* rgw: fix disabling of max_size quota (#9907 Dong Lei)
+* rgw: fix incorrect len when len is 0 (#9877 Yehuda Sadeh)
+* rgw: fix object copy content type (#9478 Yehuda Sadeh)
+* rgw: fix user stags in get-user-info API (#9359 Ray Lv)
+* rgw: remove swift user manifest (DLO) hash calculation (#9973 Yehuda Sadeh)
+* rgw: return timestamp on GET/HEAD (#8911 Yehuda Sadeh)
+* rgw: set ETag on object copy (#9479 Yehuda Sadeh)
+* rgw: update bucket index on attr changes, for multi-site sync (#5595 Yehuda Sadeh)
+
+
+v0.88
+=====
+
+This is the first development release after Giant.  The two main
+features merged this round are the new AsyncMessenger (an alternative
+implementation of the network layer) from Haomai Wang at UnitedStack,
+and support for POSIX file locks in ceph-fuse and libcephfs from Yan,
+Zheng.  There is also a big pile of smaller items that re merged while
+we were stabilizing Giant, including a range of smaller performance
+and bug fixes and some new tracepoints for LTTNG.
+
+Notable Changes
+---------------
+
+* ceph-disk: Scientific Linux support (Dan van der Ster)
+* ceph-disk: respect --statedir for keyring (Loic Dachary)
+* ceph-fuse, libcephfs: POSIX file lock support (Yan, Zheng)
+* ceph-fuse, libcephfs: fix cap flush overflow (Greg Farnum, Yan, Zheng)
+* ceph-fuse, libcephfs: fix root inode xattrs (Yan, Zheng)
+* ceph-fuse, libcephfs: preserve dir ordering (#9178 Yan, Zheng)
+* ceph-fuse, libcephfs: trim inodes before reconnecting to MDS (Yan, Zheng)
+* ceph: do not parse injectargs twice (Loic Dachary)
+* ceph: make 'ceph -s' output more readable (Sage Weil)
+* ceph: new 'ceph tell mds.$name_or_rank_or_gid' (John Spray)
+* ceph: test robustness (Joao Eduardo Luis)
+* ceph_objectstore_tool: behave with sharded flag (#9661 David Zafman)
+* cephfs-journal-tool: fix journal import (#10025 John Spray)
+* cephfs-journal-tool: skip up to expire_pos (#9977 John Spray)
+* cleanup rados.h definitions with macros (Ilya Dryomov)
+* common: shared_cache unit tests (Cheng Cheng)
+* config: add $cctid meta variable (Adam Crume)
+* crush: fix buffer overrun for poorly formed rules (#9492 Johnu George)
+* crush: improve constness (Loic Dachary)
+* crushtool: add --location <id> command (Sage Weil, Loic Dachary)
+* default to libnss instead of crypto++ (Federico Gimenez)
+* doc: ceph osd reweight vs crush weight (Laurent Guerby)
+* doc: document the LRC per-layer plugin configuration (Yuan Zhou)
+* doc: erasure code doc updates (Loic Dachary)
+* doc: misc updates (Alfredo Deza, VRan Liu)
+* doc: preflight doc fixes (John Wilkins)
+* doc: update PG count guide (Gerben Meijer, Laurent Guerby, Loic Dachary)
+* keyvaluestore: misc fixes (Haomai Wang)
+* keyvaluestore: performance improvements (Haomai Wang)
+* librados: add rados_pool_get_base_tier() call (Adam Crume)
+* librados: cap buffer length (Loic Dachary)
+* librados: fix objecter races (#9617 Josh Durgin)
+* libradosstriper: misc fixes (Sebastien Ponce)
+* librbd: add missing python docstrings (Jason Dillaman)
+* librbd: add readahead (Adam Crume)
+* librbd: fix cache tiers in list_children and snap_unprotect (Adam Crume)
+* librbd: fix performance regression in ObjectCacher (#9513 Adam Crume)
+* librbd: lttng tracepoints (Adam Crume)
+* librbd: misc fixes (Xinxin Shu, Jason Dillaman)
+* mds: fix sessionmap lifecycle bugs (Yan, Zheng)
+* mds: initialize root inode xattr version (Yan, Zheng)
+* mds: introduce auth caps (John Spray)
+* mds: misc bugs (Greg Farnum, John Spray, Yan, Zheng, Henry Change)
+* misc coverity fixes (Danny Al-Gaaf)
+* mon: add 'ceph osd rename-bucket ...' command (Loic Dachary)
+* mon: clean up auth list output (Loic Dachary)
+* mon: fix 'osd crush link' id resolution (John Spray)
+* mon: fix misc error paths (Joao Eduardo Luis)
+* mon: fix paxos off-by-one corner case (#9301 Sage Weil)
+* mon: new 'ceph pool ls [detail]' command (Sage Weil)
+* mon: wait for writeable before cross-proposing (#9794 Joao Eduardo Luis)
+* msgr: avoid useless new/delete (Haomai Wang)
+* msgr: fix delay injection bug (#9910 Sage Weil, Greg Farnum)
+* msgr: new AsymcMessenger alternative implementation (Haomai Wang)
+* msgr: prefetch data when doing recv (Yehuda Sadeh)
+* osd: add erasure code corpus (Loic Dachary)
+* osd: add misc tests (Loic Dachary, Danny Al-Gaaf)
+* osd: cleanup boost optionals (William Kennington)
+* osd: expose non-journal backends via ceph-osd CLI (Hoamai Wang)
+* osd: fix JSON output for stray OSDs (Loic Dachary)
+* osd: fix ioprio options (Loic Dachary)
+* osd: fix transaction accounting (Jianpeng Ma)
+* osd: misc optimizations (Xinxin Shu, Zhiqiang Wang, Xinze Chi)
+* osd: use FIEMAP_FLAGS_SYNC instead of fsync (Jianpeng Ma)
+* rados: fix put of /dev/null (Loic Dachary)
+* rados: parse command-line arguments more strictly (#8983 Adam Crume)
+* rbd-fuse: fix memory leak (Adam Crume)
+* rbd-replay-many (Adam Crume)
+* rbd-replay: --anonymize flag to rbd-replay-prep (Adam Crume)
+* rbd: fix 'rbd diff' for non-existent objects (Adam Crume)
+* rbd: fix error when striping with format 1 (Sebastien Han)
+* rbd: fix export for image sizes over 2GB (Vicente Cheng)
+* rbd: use rolling average for rbd bench-write throughput (Jason Dillaman)
+* rgw: send explicit HTTP status string (Yehuda Sadeh)
+* rgw: set length for keystone token validation request (#7796 Yehuda Sadeh, Mark Kirkwood)
+* udev: fix rules for CentOS7/RHEL7 (Loic Dachary)
+* use clock_gettime instead of gettimeofday (Jianpeng Ma)
+* vstart.sh: set up environment for s3-tests (Luis Pabon)
+
+
+v0.87.2 Giant
+=============
+
+This is the second (and possibly final) point release for Giant.
+
+We recommend all v0.87.x Giant users upgrade to this release.
+
+Notable Changes
+---------------
+
+* ceph-objectstore-tool: only output unsupported features when incompatible (#11176 David Zafman)
+* common: do not implicitly unlock rwlock on destruction (Federico Simoncelli)
+* common: make wait timeout on empty queue configurable (#10818 Samuel Just)
+* crush: pick ruleset id that matches and rule id (Xiaoxi Chen)
+* crush: set_choose_tries = 100 for new erasure code rulesets (#10353 Loic Dachary)
+* librados: check initialized atomic safely (#9617 Josh Durgin)
+* librados: fix failed tick_event assert (#11183 Zhiqiang Wang)
+* librados: fix looping on skipped maps (#9986 Ding Dinghua)
+* librados: fix op submit with timeout (#10340 Samuel Just)
+* librados: pybind: fix memory leak (#10723 Billy Olsen)
+* librados: pybind: keep reference to callbacks (#10775 Josh Durgin)
+* librados: translate operation flags from C APIs (Matthew Richards)
+* libradosstriper: fix write_full on ENOENT (#10758 Sebastien Ponce)
+* libradosstriper: use strtoll instead of strtol (Dongmao Zhang)
+* mds: fix assertion caused by system time moving backwards (#11053 Yan, Zheng)
+* mon: allow injection of random delays on writes (Joao Eduardo Luis)
+* mon: do not trust small osd epoch cache values (#10787 Sage Weil)
+* mon: fail non-blocking flush if object is being scrubbed (#8011 Samuel Just)
+* mon: fix division by zero in stats dump (Joao Eduardo Luis)
+* mon: fix get_rule_avail when no osds (#10257 Joao Eduardo Luis)
+* mon: fix timeout rounds period (#10546 Joao Eduardo Luis)
+* mon: ignore osd failures before up_from (#10762 Dan van der Ster, Sage Weil)
+* mon: paxos: reset accept timeout before writing to store (#10220 Joao Eduardo Luis)
+* mon: return if fs exists on 'fs new' (Joao Eduardo Luis)
+* mon: use EntityName when expanding profiles (#10844 Joao Eduardo Luis)
+* mon: verify cross-service proposal preconditions (#10643 Joao Eduardo Luis)
+* mon: wait for osdmon to be writeable when requesting proposal (#9794 Joao Eduardo Luis)
+* mount.ceph: avoid spurious error message about /etc/mtab (#10351 Yan, Zheng)
+* msg/simple: allow RESETSESSION when we forget an endpoint (#10080 Greg Farnum)
+* msg/simple: discard delay queue before incoming queue (#9910 Sage Weil)
+* osd: clear_primary_state when leaving Primary (#10059 Samuel Just)
+* osd: do not ignore deleted pgs on startup (#10617 Sage Weil)
+* osd: fix FileJournal wrap to get header out first (#10883 David Zafman)
+* osd: fix PG leak in SnapTrimWQ (#10421 Kefu Chai)
+* osd: fix journalq population in do_read_entry (#6003 Samuel Just)
+* osd: fix operator== for op_queue_age_hit and fs_perf_stat (#10259 Samuel Just)
+* osd: fix rare assert after split (#10430 David Zafman)
+* osd: get pgid ancestor from last_map when building past intervals (#10430 David Zafman)
+* osd: include rollback_info_trimmed_to in {read,write}_log (#10157 Samuel Just)
+* osd: lock header_lock in DBObjectMap::sync (#9891 Samuel Just)
+* osd: requeue blocked op before flush it was blocked on (#10512 Sage Weil)
+* osd: tolerate missing object between list and attr get on backfill (#10150 Samuel Just)
+* osd: use correct atime for eviction decision (Xinze Chi)
+* rgw: flush XML header on get ACL request (#10106 Yehuda Sadeh)
+* rgw: index swift keys appropriately (#10471 Hemant Bruman, Yehuda Sadeh)
+* rgw: send cancel for bucket index pending ops (#10770 Baijiaruo, Yehuda Sadeh)
+* rgw: swift: support X_Remove_Container-Meta-{key} (#01475 Dmytro Iurchenko)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.87.2.txt>`.
+
+v0.87.1 Giant
+=============
+
+This is the first (and possibly final) point release for Giant.  Our focus
+on stability fixes will be directed towards Hammer and Firefly.
+
+We recommend that all v0.87 Giant users upgrade to this release.
+
+Upgrading
+---------
+
+* Due to a change in the Linux kernel version 3.18 and the limits of the FUSE
+  interface, ceph-fuse needs be mounted as root on at least some systems. See
+  issues #9997, #10277, and #10542 for details.
+
+Notable Changes
+---------------
+
+* build: disable stack-execute bit on assembler objects (#10114 Dan Mick)
+* build: support boost 1.57.0 (#10688 Ken Dreyer)
+* ceph-disk: fix dmcrypt file permissions (#9785 Loic Dachary)
+* ceph-disk: run partprobe after zap, behave with partx or partprobe (#9665 #9721 Loic Dachary)
+* cephfs-journal-tool: fix import for aged journals (#9977 John Spray)
+* cephfs-journal-tool: fix journal import (#10025 John Spray)
+* ceph-fuse: use remount to trim kernel dcache (#10277 Yan, Zheng)
+* common: add cctid meta variable (#6228 Adam Crume)
+* common: fix dump of shard for ghobject_t (#10063 Loic Dachary)
+* crush: fix bucket weight underflow (#9998 Pawel Sadowski)
+* erasure-code: enforce chunk size alignment (#10211 Loic Dachary)
+* erasure-code: regression test suite (#9420 Loic Dachary)
+* erasure-code: relax caucy w restrictions (#10325 Loic Dachary)
+* libcephfs,ceph-fuse: allow xattr caps on inject_release_failure (#9800 John Spray)
+* libcephfs,ceph-fuse: fix cap flush tid comparison (#9869 Greg Farnum)
+* libcephfs,ceph-fuse: new flag to indicated sorted dcache (#9178 Yan, Zheng)
+* libcephfs,ceph-fuse: prune cache before reconnecting to MDS (Yan, Zheng)
+* librados: limit number of in-flight read requests (#9854 Jason Dillaman)
+* libradospy: fix thread shutdown (#8797 Dan Mick)
+* libradosstriper: fix locking issue in truncate (#10129 Sebastien Ponce)
+* librbd: complete pending ops before closing mage (#10299 Jason Dillaman)
+* librbd: fix error path on image open failure (#10030 Jason Dillaman)
+* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
+* librbd: handle errors when creating ioctx while listing children (#10123 Jason Dillaman)
+* mds: fix compat version in MClientSession (#9945 John Spray)
+* mds: fix journaler write error handling (#10011 John Spray)
+* mds: fix locking for file size recovery (#10229 Yan, Zheng)
+* mds: handle heartbeat_reset during shutdown (#10382 John Spray)
+* mds: store backtrace for straydir (Yan, Zheng)
+* mon: allow tiers for FS pools (#10135 John Spray)
+* mon: fix caching of last_epoch_clean, osdmap trimming (#9987 Sage Weil)
+* mon: fix 'fs ls' on peons (#10288 John Spray)
+* mon: fix MDS health status from peons (#10151 John Spray)
+* mon: fix paxos off-by-one (#9301 Sage Weil)
+* msgr: simple: do not block on takeover while holding global lock (#9921 Greg Farnum)
+* osd: deep scrub must not abort if hinfo is missing (#10018 Loic Dachary)
+* osd: fix misdirected op detection (#9835 Sage Weil)
+* osd: fix past_interval display for acting (#9752 Loic Dachary)
+* osd: fix PG peering backoff when behind on osdmaps (#10431 Sage Weil)
+* osd: handle no-op write with snapshot case (#10262 Ssage Weil)
+* osd: use fast-dispatch (Sage Weil, Greg Farnum)
+* rados: fix write to /dev/null (Loic Dachary)
+* radosgw-admin: create subuser when needed (#10103 Yehuda Sadeh)
+* rbd: avoid invalidating aio_write buffer during image import (#10590 Jason Dillaman)
+* rbd: fix export with images > 2GB (Vicente Cheng)
+* rgw: change multipart upload id magic (#10271 Georgios Dimitrakakis, Yehuda Sadeh)
+* rgw: check keystone auth for S3 POST (#10062 Abhishek Lekshmanan)
+* rgw: check timestamp for S3 keystone auth (#10062 Abhishek Lekshmanan)
+* rgw: fix partial GET with swift (#10553 Yehuda Sadeh)
+* rgw: fix quota disable (#9907 Dong Lei)
+* rgw: fix rare corruption of object metadata on put (#9576 Yehuda Sadeh)
+* rgw: fix S3 object copy content-type (#9478 Yehuda Sadeh)
+* rgw: headers end with \r\n (#9254 Benedikt Fraunhofer, Yehuda Sadeh)
+* rgw: remove swift user manifest DLO hash calculation (#9973 Yehuda Sadeh)
+* rgw: return correct len when len is 0 (#9877 Yehuda Sadeh)
+* rgw: return X-Timestamp field (#8911 Yehuda Sadeh)
+* rgw: run radosgw as apache with systemd (#10125)
+* rgw: sent ETag on S3 object copy (#9479 Yehuda Sadeh)
+* rgw: sent HTTP status reason explicitly in fastcgi (Yehuda Sadeh)
+* rgw: set length for keystone token validation (#7796 Mark Kirkwood, Yehuda Sadeh)
+* rgw: set ulimit -n on sysvinit before starting daemon (#9587 Sage Weil)
+* rgw: update bucket index on set_attrs (#5595 Yehuda Sadeh)
+* rgw: update swift subuser permission masks when authenticating (#9918 Yehuda Sadeh)
+* rgw: URL decode HTTP query params correction (#10271 Georgios Dimitrakakis, Yehuda Sadeh)
+* rgw: use cached attrs while reading object attrs (#10307 Yehuda Sadeh)
+* rgw: use strict_strtoll for content length (#10701 Axel Dunkel, Yehuda Sadeh)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.87.1.txt>`.
+
+
+
+v0.87 Giant
+===========
+
+This release will form the basis for the stable release Giant,
+v0.87.x.  Highlights for Giant include:
+
+* *RADOS Performance*: a range of improvements have been made in the
+  OSD and client-side librados code that improve the throughput on
+  flash backends and improve parallelism and scaling on fast machines.
+* *CephFS*: we have fixed a raft of bugs in CephFS and built some
+  basic journal recovery and diagnostic tools.  Stability and
+  performance of single-MDS systems is vastly improved in Giant.
+  Although we do not yet recommend CephFS for production deployments,
+  we do encourage testing for non-critical workloads so that we can
+  better guage the feature, usability, performance, and stability
+  gaps.
+* *Local Recovery Codes*: the OSDs now support an erasure-coding scheme
+  that stores some additional data blocks to reduce the IO required to
+  recover from single OSD failures.
+* *Degraded vs misplaced*: the Ceph health reports from 'ceph -s' and
+  related commands now make a distinction between data that is
+  degraded (there are fewer than the desired number of copies) and
+  data that is misplaced (stored in the wrong location in the
+  cluster).  The distinction is important because the latter does not
+  compromise data safety.
+* *Tiering improvements*: we have made several improvements to the
+  cache tiering implementation that improve performance.  Most
+  notably, objects are not promoted into the cache tier by a single
+  read; they must be found to be sufficiently hot before that happens.
+* *Monitor performance*: the monitors now perform writes to the local
+  data store asynchronously, improving overall responsiveness.
+* *Recovery tools*: the ceph_objectstore_tool is greatly expanded to
+  allow manipulation of an individual OSDs data store for debugging
+  and repair purposes.  This is most heavily used by our QA
+  infrastructure to exercise recovery code.
+
+Upgrade Sequencing
+------------------
+
+* If your existing cluster is running a version older than v0.80.x
+  Firefly, please first upgrade to the latest Firefly release before
+  moving on to Giant.  We have not tested upgrades directly from
+  Emperor, Dumpling, or older releases.
+
+  We *have* tested:
+
+   * Firefly to Giant
+   * Dumpling to Firefly to Giant
+
+* Please upgrade daemons in the following order:
+
+   #. Monitors
+   #. OSDs
+   #. MDSs and/or radosgw
+
+  Note that the relative ordering of OSDs and monitors should not matter, but
+  we primarily tested upgrading monitors first.
+
+Upgrading from v0.80x Firefly
+-----------------------------
+
+* The client-side caching for librbd is now enabled by default (rbd
+  cache = true).  A safety option (rbd cache writethrough until flush
+  = true) is also enabled so that writeback caching is not used until
+  the library observes a 'flush' command, indicating that the librbd
+  users is passing that operation through from the guest VM.  This
+  avoids potential data loss when used with older versions of qemu
+  that do not support flush.
+
+    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
+    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
+    leveldb_block_size        = 64*1024       = 65536     // 64KB
+    leveldb_compression       = false
+    leveldb_log               = ""
+
+  OSDs will still maintain the following osd-specific defaults:
+
+    leveldb_log               = ""
+
+* The 'rados getxattr ...' command used to add a gratuitous newline to the attr
+  value; it now does not.
+
+* The ``*_kb perf`` counters on the monitor have been removed.  These are
+  replaced with a new set of ``*_bytes`` counters (e.g., ``cluster_osd_kb`` is
+  replaced by ``cluster_osd_bytes``).
+
+* The ``rd_kb`` and ``wr_kb`` fields in the JSON dumps for pool stats (accessed
+  via the ``ceph df detail -f json-pretty`` and related commands) have been
+  replaced with corresponding ``*_bytes`` fields.  Similarly, the
+  ``total_space``, ``total_used``, and ``total_avail`` fields are replaced with
+  ``total_bytes``, ``total_used_bytes``,  and ``total_avail_bytes`` fields.
+
+* The ``rados df --format=json`` output ``read_bytes`` and ``write_bytes``
+  fields were incorrectly reporting ops; this is now fixed.
+
+* The ``rados df --format=json`` output previously included ``read_kb`` and
+  ``write_kb`` fields; these have been removed.  Please use ``read_bytes`` and
+  ``write_bytes`` instead (and divide by 1024 if appropriate).
+
+* The experimental keyvaluestore-dev OSD backend had an on-disk format
+  change that prevents existing OSD data from being upgraded.  This
+  affects developers and testers only.
+
+* mon-specific and osd-specific leveldb options have been removed.
+  From this point onward users should use the `leveldb_*` generic
+  options and add the options in the appropriate sections of their
+  configuration files.  Monitors will still maintain the following
+  monitor-specific defaults:
+
+    leveldb_write_buffer_size = 8*1024*1024  = 33554432   // 8MB
+    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
+    leveldb_block_size        = 64*1024       = 65536     // 64KB
+    leveldb_compression       = false
+    leveldb_log               = ""
+
+  OSDs will still maintain the following osd-specific defaults:
+
+    leveldb_log               = ""
+
+* CephFS support for the legacy anchor table has finally been removed.
+  Users with file systems created before firefly should ensure that inodes
+  with multiple hard links are modified *prior* to the upgrade to ensure that
+  the backtraces are written properly.  For example::
+
+    sudo find /mnt/cephfs -type f -links +1 -exec touch \{\} \;
+
+* We disallow nonsensical 'tier cache-mode' transitions.  From this point
+  onward, 'writeback' can only transition to 'forward' and 'forward'
+  can transition to 1) 'writeback' if there are dirty objects, or 2) any if
+  there are no dirty objects.
+
+Notable Changes since v0.86
+---------------------------
+
+* ceph-disk: use new udev rules for centos7/rhel7 (#9747 Loic Dachary)
+* libcephfs-java: fix fstat mode (Noah Watkins)
+* librados: fix deadlock when listing PG contents (Guang Yang)
+* librados: misc fixes to the new threading model (#9582 #9706 #9845 #9873 Sage Weil)
+* mds: fix inotable initialization (Henry C Chang)
+* mds: gracefully handle unknown lock type in flock requests (Yan, Zheng)
+* mon: add read-only, read-write, and role-definer rols (Joao Eduardo Luis)
+* mon: fix mon cap checks (Joao Eduardo Luis)
+* mon: misc fixes for new paxos async writes (#9635 Sage Weil)
+* mon: set scrub timestamps on PG creation (#9496 Joao Eduardo Luis)
+* osd: erasure code: fix buffer alignment (Janne Grunau, Loic Dachary)
+* osd: fix alloc hint induced crashes on mixed clusters (#9419 David Zafman)
+* osd: fix backfill reservation release on rejection (#9626, Samuel Just)
+* osd: fix ioprio option parsing (#9676 #9677 Loic Dachary)
+* osd: fix memory leak during snap trimming (#9113 Samuel Just)
+* osd: misc peering and recovery fixes (#9614 #9696 #9731 #9718 #9821 #9875 Samuel Just, Guang Yang)
+
+Notable Changes since v0.80.x Firefly
+-------------------------------------
+
+* bash completion improvements (Wido den Hollander)
+* brag: fixes, improvements (Loic Dachary)
+* buffer: improve rebuild_page_aligned (Ma Jianpeng)
+* build: fix build on alpha (Michael Cree, Dmitry Smirnov)
+* build: fix CentOS 5 (Gerben Meijer)
+* build: fix yasm check for x32 (Daniel Schepler, Sage Weil)
+* ceph-brag: add tox tests (Alfredo Deza)
+* ceph-conf: flush log on exit (Sage Weil)
+* ceph.conf: update sample (Sebastien Han)
+* ceph-dencoder: refactor build a bit to limit dependencies (Sage Weil, Dan Mick)
+* ceph-disk: add Scientific Linux support (Dan van der Ster)
+* ceph-disk: do not inadvertantly create directories (Owne Synge)
+* ceph-disk: fix dmcrypt support (Sage Weil)
+* ceph-disk: fix dmcrypt support (Stephen Taylor)
+* ceph-disk: handle corrupt volumes (Stuart Longlang)
+* ceph-disk: linter cleanup, logging improvements (Alfredo Deza)
+* ceph-disk: partprobe as needed (Eric Eastman)
+* ceph-disk: show information about dmcrypt in 'ceph-disk list' output (Sage Weil)
+* ceph-disk: use partition type UUIDs and blkid (Sage Weil)
+* ceph: fix for non-default cluster names (#8944, Dan Mick)
+* ceph-fuse, libcephfs: asok hooks for handling session resets, timeouts (Yan, Zheng)
+* ceph-fuse, libcephfs: fix crash in trim_caps (John Spray)
+* ceph-fuse, libcephfs: improve cap trimming (John Spray)
+* ceph-fuse, libcephfs: improve traceless reply handling (Sage Weil)
+* ceph-fuse, libcephfs: virtual xattrs for rstat (Yan, Zheng)
+* ceph_objectstore_tool: vastly improved and extended tool for working offline with OSD data stores (David Zafman)
+* ceph.spec: many fixes (Erik Logtenberg, Boris Ranto, Dan Mick, Sandon Van Ness)
+* ceph.spec: split out ceph-common package, other fixes (Sandon Van Ness)
+* ceph_test_librbd_fsx: fix RNG, make deterministic (Ilya Dryomov)
+* cephtool: fix help (Yilong Zhao)
+* cephtool: refactor and improve CLI tests (Joao Eduardo Luis)
+* cephtool: test cleanup (Joao Eduardo Luis)
+* clang build fixes (John Spray, Danny Al-Gaaf)
+* client: improved MDS session dumps (John Spray)
+* common: add config diff admin socket command (Joao Eduardo Luis)
+* common: add rwlock assertion checks (Yehuda Sadeh)
+* common: fix dup log messages (#9080, Sage Weil)
+* common: perfcounters now use atomics and go faster (Sage Weil)
+* config: support G, M, K, etc. suffixes (Joao Eduardo Luis)
+* coverity cleanups (Danny Al-Gaaf)
+* crush: clean up CrushWrapper interface (Xioaxi Chen)
+* crush: include new tunables in dump (Sage Weil)
+* crush: make ruleset ids unique (Xiaoxi Chen, Loic Dachary)
+* crush: only require rule features if the rule is used (#8963, Sage Weil)
+* crushtool: send output to stdout, not stderr (Wido den Hollander)
+* doc: cache tiering (John Wilkins)
+* doc: CRUSH updates (John Wilkins)
+* doc: document new upstream wireshark dissector (Kevin Cox)
+* doc: improve manual install docs (Francois Lafont)
+* doc: keystone integration docs (John Wilkins)
+* doc: librados example fixes (Kevin Dalley)
+* doc: many doc updates (John Wilkins)
+* doc: many install doc updates (John Wilkins)
+* doc: misc updates (John Wilkins, Loic Dachary, David Moreau Simard, Wido den Hollander. Volker Voigt, Alfredo Deza, Stephen Jahl, Dan van der Ster)
+* doc: osd primary affinity (John Wilkins)
+* doc: pool quotas (John Wilkins)
+* doc: pre-flight doc improvements (Kevin Dalley)
+* doc: switch to an unencumbered font (Ross Turk)
+* doc: updated simple configuration guides (John Wilkins)
+* doc: update erasure docs (Loic Dachary, Venky Shankar)
+* doc: update openstack docs (Josh Durgin)
+* filestore: disable use of XFS hint (buggy on old kernels) (Samuel Just)
+* filestore: fix xattr spillout (Greg Farnum, Haomai Wang)
+* fix hppa arch build (Dmitry Smirnov)
+* fix i386 builds (Sage Weil)
+* fix struct vs class inconsistencies (Thorsten Behrens)
+* global: write pid file even when running in foreground (Alexandre Oliva)
+* hadoop: improve tests (Huamin Chen, Greg Farnum, John Spray)
+* hadoop: update hadoop tests for Hadoop 2.0 (Haumin Chen)
+* init-ceph: continue starting other daemons on crush or mount failure (#8343, Sage Weil)
+* journaler: fix locking (Zheng, Yan)
+* keyvaluestore: fix hint crash (#8381, Haomai Wang)
+* keyvaluestore: header cache (Haomai Wang)
+* libcephfs-java: build against older JNI headers (Greg Farnum)
+* libcephfs-java: fix gcj-jdk build (Dmitry Smirnov)
+* librados: fix crash on read op timeout (#9362 Matthias Kiefer, Sage Weil)
+* librados: fix lock leaks in error paths (#9022, Paval Rallabhandi)
+* librados: fix pool existence check (#8835, Pavan Rallabhandi)
+* librados: fix rados_pool_list bounds checks (Sage Weil)
+* librados: fix shutdown race (#9130 Sage Weil)
+* librados: fix watch/notify test (#7934 David Zafman)
+* librados: fix watch reregistration on acting set change (#9220 Samuel Just)
+* librados: give Objecter fine-grained locks (Yehuda Sadeh, Sage Weil, John Spray)
+* librados: lttng tracepoitns (Adam Crume)
+* librados, osd: return ETIMEDOUT on failed notify (Sage Weil)
+* librados: pybind: fix reads when \0 is present (#9547 Mohammad Salehe)
+* librados_striper: striping library for librados (Sebastien Ponce)
+* librbd, ceph-fuse: reduce cache flush overhead (Haomai Wang)
+* librbd: check error code on cache invalidate (Josh Durgin)
+* librbd: enable caching by default (Sage Weil)
+* librbd: enforce cache size on read requests (Jason Dillaman)
+* librbd: fix crash using clone of flattened image (#8845, Josh Durgin)
+* librbd: fix error path when opening image (#8912, Josh Durgin)
+* librbd: handle blacklisting during shutdown (#9105 John Spray)
+* librbd: lttng tracepoints (Adam Crume)
+* librbd: new libkrbd library for kernel map/unmap/showmapped (Ilya Dryomov)
+* librbd: store and retrieve snapshot metadata based on id (Josh Durgin)
+* libs3: update to latest (Danny Al-Gaaf)
+* log: fix derr level (Joao Eduardo Luis)
+* logrotate: fix osd log rotation on ubuntu (Sage Weil)
+* lttng: tracing infrastructure (Noah Watkins, Adam Crume)
+* mailmap: many updates (Loic Dachary)
+* mailmap: updates (Loic Dachary, Abhishek Lekshmanan, M Ranga Swami Reddy)
+* Makefile: fix out of source builds (Stefan Eilemann)
+* many many coverity fixes, cleanups (Danny Al-Gaaf)
+* mds: adapt to new Objecter locking, give types to all Contexts (John Spray)
+* mds: add file system name, enabled flag (John Spray)
+* mds: add internal health checks (John Spray)
+* mds: add min/max UID for snapshot creation/deletion (#9029, Wido den Hollander)
+* mds: avoid tight mon reconnect loop (#9428 Sage Weil)
+* mds: boot refactor, cleanup (John Spray)
+* mds: cephfs-journal-tool (John Spray)
+* mds: fix crash killing sessions (#9173 John Spray)
+* mds: fix ctime updates (#9514 Greg Farnum)
+* mds: fix journal conversion with standby-replay (John Spray)
+* mds: fix replay locking (Yan, Zheng)
+* mds: fix standby-replay cache trimming (#8648 Zheng, Yan)
+* mds: fix xattr bug triggered by ACLs (Yan, Zheng)
+* mds: give perfcounters meaningful names (Sage Weil)
+* mds: improve health reporting to monitor (John Spray)
+* mds: improve Journaler on-disk format (John Spray)
+* mds: improve journal locking (Zheng, Yan)
+* mds, libcephfs: use client timestamp for mtime/ctime (Sage Weil)
+* mds: make max file recoveries tunable (Sage Weil)
+* mds: misc encoding improvements (John Spray)
+* mds: misc fixes for multi-mds (Yan, Zheng)
+* mds: multi-mds fixes (Yan, Zheng)
+* mds: OPTracker integration, dump_ops_in_flight (Greg Farnum)
+* mds: prioritize file recovery when appropriate (Sage Weil)
+* mds: refactor beacon, improve reliability (John Spray)
+* mds: remove legacy anchor table (Yan, Zheng)
+* mds: remove legacy discover ino (Yan, Zheng)
+* mds: restart on EBLACKLISTED (John Spray)
+* mds: separate inode recovery queue (John Spray)
+* mds: session ls, evict commands (John Spray)
+* mds: submit log events in async thread (Yan, Zheng)
+* mds: track RECALL progress, report failure (#9284 John Spray)
+* mds: update segment references during journal write (John Spray, Greg Farnum)
+* mds: use client-provided timestamp for user-visible file metadata (Yan, Zheng)
+* mds: use meaningful names for clients (John Spray)
+* mds: validate journal header on load and save (John Spray)
+* mds: warn clients which aren't revoking caps (Zheng, Yan, John Spray)
+* misc build errors/warnings for Fedora 20 (Boris Ranto)
+* misc build fixes for OS X (John Spray)
+* misc cleanup (Christophe Courtaut)
+* misc integer size cleanups (Kevin Cox)
+* misc memory leaks, cleanups, fixes (Danny Al-Gaaf, Sahid Ferdjaoui)
+* misc suse fixes (Danny Al-Gaaf)
+* misc word size fixes (Kevin Cox)
+* mon: add audit log for all admin commands (Joao Eduardo Luis)
+* mon: add cluster fingerprint (Sage Weil)
+* mon: add get-quota commands (Joao Eduardo Luis)
+* mon: add 'osd blocked-by' command to easily see which OSDs are blocking peering progress (Sage Weil)
+* mon: add 'osd reweight-by-pg' command (Sage Weil, Guang Yang)
+* mon: add perfcounters for paxos operations (Sage Weil)
+* mon: avoid creating unnecessary rule on pool create (#9304 Loic Dachary)
+* monclient: fix hang (Sage Weil)
+* mon: create default EC profile if needed (Loic Dachary)
+* mon: do not create file system by default (John Spray)
+* mon: do not spam log (Aanchal Agrawal, Sage Weil)
+* mon: drop mon- and osd- specific leveldb options (Joao Eduardo Luis)
+* mon: ec pool profile fixes (Loic Dachary)
+* mon: fix bug when no auth keys are present (#8851, Joao Eduardo Luis)
+* mon: fix 'ceph df' output for available space (Xiaoxi Chen)
+* mon: fix compat version for MForward (Joao Eduardo Luis)
+* mon: fix crash on loopback messages and paxos timeouts (#9062, Sage Weil)
+* mon: fix default replication pool ruleset choice (#8373, John Spray)
+* mon: fix divide by zero when pg_num is adjusted before OSDs are added (#9101, Sage Weil)
+* mon: fix double-free of old MOSDBoot (Sage Weil)
+* mon: fix health down messages (Sage Weil)
+* mon: fix occasional memory leak after session reset (#9176, Sage Weil)
+* mon: fix op write latency perfcounter (#9217 Xinxin Shu)
+* mon: fix 'osd perf' reported latency (#9269 Samuel Just)
+* mon: fix quorum feature check (#8738, Greg Farnum)
+* mon: fix ruleset/ruleid bugs (#9044, Loic Dachary)
+* mon: fix set cache_target_full_ratio (#8440, Geoffrey Hartz)
+* mon: fix store check on startup (Joao Eduardo Luis)
+* mon: include per-pool 'max avail' in df output (Sage Weil)
+* mon: make paxos transaction commits asynchronous (Sage Weil)
+* mon: make usage dumps in terms of bytes, not kB (Sage Weil)
+* mon: 'osd crush reweight-subtree ...' (Sage Weil)
+* mon, osd: relax client EC support requirements (Sage Weil)
+* mon: preload erasure plugins (#9153 Loic Dachary)
+* mon: prevent cache pools from being used directly by CephFS (#9435 John Spray)
+* mon: prevent EC pools from being used with cephfs (Joao Eduardo Luis)
+* mon: prevent implicit destruction of OSDs with 'osd setmaxosd ...' (#8865, Anand Bhat)
+* mon: prevent nonsensical cache-mode transitions (Joao Eduardo Luis)
+* mon: restore original weight when auto-marked out OSDs restart (Sage Weil)
+* mon: restrict some pool properties to tiered pools (Joao Eduardo Luis)
+* mon: some instrumentation (Sage Weil)
+* mon: use msg header tid for MMonGetVersionReply (Ilya Dryomov)
+* mon: use user-provided ruleset for replicated pool (Xiaoxi Chen)
+* mon: verify all quorum members are contiguous at end of Paxos round (#9053, Sage Weil)
+* mon: verify available disk space on startup (#9502 Joao Eduardo Luis)
+* mon: verify erasure plugin version on load (Loic Dachary)
+* msgr: avoid big lock when sending (most) messages (Greg Farnum)
+* msgr: fix logged address (Yongyue Sun)
+* msgr: misc locking fixes for fast dispatch (#8891, Sage Weil)
+* msgr: refactor to cleanly separate SimpleMessenger implemenetation, move toward Connection-based calls (Matt Benjamin, Sage Wei)
+* objecter: flag operations that are redirected by caching (Sage Weil)
+* objectstore: clean up KeyValueDB interface for key/value backends (Sage Weil)
+* osd: account for hit_set_archive bytes (Sage Weil)
+* osd: add ability to prehash filestore directories (Guang Yang)
+* osd: add 'dump_reservations' admin socket command (Sage Weil)
+* osd: add feature bit for erasure plugins (Loic Dachary)
+* osd: add header cache for KeyValueStore (Haomai Wang)
+* osd: add ISA erasure plugin table cache (Andreas-Joachim Peters)
+* osd: add local_mtime for use by cache agent (Zhiqiang Wang)
+* osd: add local recovery code (LRC) erasure plugin (Loic Dachary)
+* osd: add prototype KineticStore based on Seagate Kinetic (Josh Durgin)
+* osd: add READFORWARD caching mode (Luis Pabon)
+* osd: add superblock for KeyValueStore backend (Haomai Wang)
+* osd: add support for Intel ISA-L erasure code library (Andreas-Joachim Peters)
+* osd: allow map cache size to be adjusted at runtime (Sage Weil)
+* osd: avoid refcounting overhead by passing a few things by ref (Somnath Roy)
+* osd: avoid sharing PG info that is not durable (Samuel Just)
+* osd: bound osdmap epoch skew between PGs (Sage Weil)
+* osd: cache tier flushing fixes for snapped objects (Samuel Just)
+* osd: cap hit_set size (#9339 Samuel Just)
+* osd: clean up shard_id_t, shard_t (Loic Dachary)
+* osd: clear FDCache on unlink (#8914 Loic Dachary)
+* osd: clear slow request latency info on osd up/down (Sage Weil)
+* osd: do not evict blocked objects (#9285 Zhiqiang Wang)
+* osd: do not skip promote for write-ordered reads (#9064, Samuel Just)
+* osd: fix agent early finish looping (David Zafman)
+* osd: fix ambigous encoding order for blacklisted clients (#9211, Sage Weil)
+* osd: fix bogus assert during OSD shutdown (Sage Weil)
+* osd: fix bug with long object names and rename (#8701, Sage Weil)
+* osd: fix cache flush corner case for snapshotted objects (#9054, Samuel Just)
+* osd: fix cache full -> not full requeueing (#8931, Sage Weil)
+* osd: fix clone deletion case (#8334, Sam Just)
+* osd: fix clone vs cache_evict bug (#8629 Sage Weil)
+* osd: fix connection reconnect race (Greg Farnum)
+* osd: fix crash from duplicate backfill reservation (#8863 Sage Weil)
+* osd: fix dead peer connection checks (#9295 Greg Farnum, Sage Weil)
+* osd: fix discard of old/obsolete subop replies (#9259, Samuel Just)
+* osd: fix discard of peer messages from previous intervals (Greg Farnum)
+* osd: fix dump of open fds on EMFILE (Sage Weil)
+* osd: fix dumps (Joao Eduardo Luis)
+* osd: fix erasure-code lib initialization (Loic Dachary)
+* osd: fix extent normalization (Adam Crume)
+* osd: fix filestore removal corner case (#8332, Sam Just)
+* osd: fix flush vs OpContext (Samuel Just)
+* osd: fix gating of messages from old OSD instances (Greg Farnum)
+* osd: fix hang waiting for osdmap (#8338, Greg Farnum)
+* osd: fix interval check corner case during peering (#8104, Sam Just)
+* osd: fix ISA erasure alignment (Loic Dachary, Andreas-Joachim Peters)
+* osd: fix journal dump (Ma Jianpeng)
+* osd: fix journal-less operation (Sage Weil)
+* osd: fix keyvaluestore scrub (#8589 Haomai Wang)
+* osd: fix keyvaluestore upgrade (Haomai Wang)
+* osd: fix loopback msgr issue (Ma Jianpeng)
+* osd: fix LSB release parsing (Danny Al-Gaaf)
+* osd: fix MarkMeDown and other shutdown races (Sage Weil)
+* osd: fix memstore bugs with collection_move_rename, lock ordering (Sage Weil)
+* osd: fix min_read_recency_for_promote default on upgrade (Zhiqiang Wang)
+* osd: fix mon feature bit requirements bug and resulting log spam (Sage Weil)
+* osd: fix mount/remount sync race (#9144 Sage Weil)
+* osd: fix PG object listing/ordering bug (Guang Yang)
+* osd: fix PG stat errors with tiering (#9082, Sage Weil)
+* osd: fix purged_snap initialization on backfill (Sage Weil, Samuel Just, Dan van der Ster, Florian Haas)
+* osd: fix race condition on object deletion (#9480 Somnath Roy)
+* osd: fix recovery chunk size usage during EC recovery (Ma Jianpeng)
+* osd: fix recovery reservation deadlock for EC pools (Samuel Just)
+* osd: fix removal of old xattrs when overwriting chained xattrs (Ma Jianpeng)
+* osd: fix requesting queueing on PG split (Samuel Just)
+* osd: fix scrub vs cache bugs (Samuel Just)
+* osd: fix snap object writeback from cache tier (#9054 Samuel Just)
+* osd: fix trim of hitsets (Sage Weil)
+* osd: force new xattrs into leveldb if fs returns E2BIG (#7779, Sage Weil)
+* osd: implement alignment on chunk sizes (Loic Dachary)
+* osd: improved backfill priorities (Sage Weil)
+* osd: improve journal shutdown (Ma Jianpeng, Mark Kirkwood)
+* osd: improve locking for KeyValueStore (Haomai Wang)
+* osd: improve locking in OpTracker (Pavan Rallabhandi, Somnath Roy)
+* osd: improve prioritization of recovery of degraded over misplaced objects (Sage Weil)
+* osd: improve tiering agent arithmetic (Zhiqiang Wang, Sage Weil, Samuel Just)
+* osd: include backend information in metadata reported to mon (Sage Weil)
+* osd: locking, sharding, caching improvements in FileStore's FDCache (Somnath Roy, Greg Farnum)
+* osd: lttng tracepoints for filestore (Noah Watkins)
+* osd: make blacklist encoding deterministic (#9211 Sage Weil)
+* osd: make tiering behave if hit_sets aren't enabled (Sage Weil)
+* osd: many important bug fixes (Samuel Just)
+* osd: many many core fixes (Samuel Just)
+* osd: many many important fixes (#8231 #8315 #9113 #9179 #9293 #9294 #9326 #9453 #9481 #9482 #9497 #9574 Samuel Just)
+* osd: mark pools with incomplete clones (Sage Weil)
+* osd: misc erasure code plugin fixes (Loic Dachary)
+* osd: misc locking fixes for fast dispatch (Samuel Just, Ma Jianpeng)
+* osd, mon: add rocksdb support (Xinxin Shu, Sage Weil)
+* osd, mon: config sanity checks on start (Sage Weil, Joao Eduardo Luis)
+* osd, mon: distinguish between "misplaced" and "degraded" objects in cluster health and PG state reporting (Sage Weil)
+* osd, msgr: fast-dispatch of OSD ops (Greg Farnum, Samuel Just)
+* osd, objecter: resend ops on last_force_op_resend barrier; fix cache overlay op ordering (Sage Weil)
+* osd: preload erasure plugins (#9153 Loic Dachary)
+* osd: prevent old rados clients from using tiered pools (#8714, Sage Weil)
+* osd: reduce OpTracker overhead (Somnath Roy)
+* osd: refactor some ErasureCode functionality into command parent class (Loic Dachary)
+* osd: remove obsolete classic scrub code (David Zafman)
+* osd: scrub PGs with invalid stats (Sage Weil)
+* osd: set configurable hard limits on object and xattr names (Sage Weil, Haomai Wang)
+* osd: set rollback_info_completed on create (#8625, Samuel Just)
+* osd: sharded threadpool to improve parallelism (Somnath Roy)
+* osd: shard OpTracker to improve performance (Somnath Roy)
+* osd: simple io prioritization for scrub (Sage Weil)
+* osd: simple scrub throttling (Sage Weil)
+* osd: simple snap trimmer throttle (Sage Weil)
+* osd: tests for bench command (Loic Dachary)
+* osd: trim old EC objects quickly; verify on scrub (Samuel Just)
+* osd: use FIEMAP to inform copy_range (Haomai Wang)
+* osd: use local time for tiering decisions (Zhiqiang Wang)
+* osd: use xfs hint less frequently (Ilya Dryomov)
+* osd: verify erasure plugin version on load (Loic Dachary)
+* osd: work around GCC 4.8 bug in journal code (Matt Benjamin)
+* pybind/rados: fix small timeouts (John Spray)
+* qa: xfstests updates (Ilya Dryomov)
+* rados: allow setxattr value to be read from stdin (Sage Weil)
+* rados bench: fix arg order (Kevin Dalley)
+* rados: drop gratuitous \n from getxattr command (Sage Weil)
+* rados: fix bench write arithmetic (Jiangheng)
+* rados: fix {read,write}_ops values for df output (Sage Weil)
+* rbd: add rbdmap pre- and post post- hooks, fix misc bugs (Dmitry Smirnov)
+* rbd-fuse: allow exposing single image (Stephen Taylor)
+* rbd-fuse: fix unlink (Josh Durgin)
+* rbd: improve option default behavior (Josh Durgin)
+* rbd: parallelize rbd import, export (Jason Dillaman)
+* rbd: rbd-replay utility to replay captured rbd workload traces (Adam Crume)
+* rbd: use write-back (not write-through) when caching is enabled (Jason Dillaman)
+* removed mkcephfs (deprecated since dumpling)
+* rest-api: fix help (Ailing Zhang)
+* rgw: add civetweb as default frontent on port 7490 (#9013 Yehuda Sadeh)
+* rgw: add --min-rewrite-stripe-size for object restriper (Yehuda Sadeh)
+* rgw: add powerdns hook for dynamic DNS for global clusters (Wido den Hollander)
+* rgw: add S3 bucket get location operation (Abhishek Lekshmanan)
+* rgw: allow : in S3 access key (Roman Haritonov)
+* rgw: automatically align writes to EC pool (#8442, Yehuda Sadeh)
+* rgw: bucket link uses instance id (Yehuda Sadeh)
+* rgw: cache bucket info (Yehuda Sadeh)
+* rgw: cache decoded user info (Yehuda Sadeh)
+* rgw: check entity permission for put_metadata (#8428, Yehuda Sadeh)
+* rgw: copy object data is target bucket is in a different pool (#9039, Yehuda Sadeh)
+* rgw: do not try to authenticate CORS preflight requests (#8718, Robert Hubbard, Yehuda Sadeh)
+* rgw: fix admin create user op (#8583 Ray Lv)
+* rgw: fix civetweb URL decoding (#8621, Yehuda Sadeh)
+* rgw: fix crash on swift CORS preflight request (#8586, Yehuda Sadeh)
+* rgw: fix log filename suffix (#9353 Alexandre Marangone)
+* rgw: fix memory leak following chunk read error (Yehuda Sadeh)
+* rgw: fix memory leaks (Andrey Kuznetsov)
+* rgw: fix multipart object attr regression (#8452, Yehuda Sadeh)
+* rgw: fix multipart upload (#8846, Silvain Munaut, Yehuda Sadeh)
+* rgw: fix radosgw-admin 'show log' command (#8553, Yehuda Sadeh)
+* rgw: fix removal of objects during object creation (Patrycja Szablowska, Yehuda Sadeh)
+* rgw: fix striping for copied objects (#9089, Yehuda Sadeh)
+* rgw: fix test for identify whether an object has a tail (#9226, Yehuda Sadeh)
+* rgw: fix URL decoding (#8702, Brian Rak)
+* rgw: fix URL escaping (Yehuda Sadeh)
+* rgw: fix usage (Abhishek Lekshmanan)
+* rgw: fix user manifest (Yehuda Sadeh)
+* rgw: fix when stripe size is not a multiple of chunk size (#8937, Yehuda Sadeh)
+* rgw: handle empty extra pool name (Yehuda Sadeh)
+* rgw: improve civetweb logging (Yehuda Sadeh)
+* rgw: improve delimited listing of bucket, misc fixes (Yehuda Sadeh)
+* rgw: improve -h (Abhishek Lekshmanan)
+* rgw: many fixes for civetweb (Yehuda Sadeh)
+* rgw: misc civetweb fixes (Yehuda Sadeh)
+* rgw: misc civetweb frontend fixes (Yehuda Sadeh)
+* rgw: object and bucket rewrite functions to allow restriping old objects (Yehuda Sadeh)
+* rgw: powerdns backend for global namespaces (Wido den Hollander)
+* rgw: prevent multiobject PUT race (Yehuda Sadeh)
+* rgw: send user manifest header (Yehuda Sadeh)
+* rgw: subuser creation fixes (#8587 Yehuda Sadeh)
+* rgw: use systemd-run from sysvinit script (JuanJose Galvez)
+* rpm: do not restart daemons on upgrade (Alfredo Deza)
+* rpm: misc packaging fixes for rhel7 (Sandon Van Ness)
+* rpm: split ceph-common from ceph (Sandon Van Ness)
+* systemd: initial systemd config files (Federico Simoncelli)
+* systemd: wrap started daemons in new systemd environment (Sage Weil, Dan Mick)
+* sysvinit: add support for non-default cluster names (Alfredo Deza)
+* sysvinit: less sensitive to failures (Sage Weil)
+* test_librbd_fsx: test krbd as well as librbd (Ilya Dryomov)
+* unit test improvements (Loic Dachary)
+* upstart: increase max open files limit (Sage Weil)
+* vstart.sh: fix/improve rgw support (Luis Pabon, Abhishek Lekshmanan)
+
+
+
+
+v0.86
+=====
+
+This is a release candidate for Giant, which will hopefully be out
+in another week or two.  We did a feature freeze about a month ago
+and since then have been doing only stabilization and bug fixing (and
+a handful on low-risk enhancements).  A fair bit of new functionality
+went into the final sprint, but it's baked for quite a while now and
+we're feeling pretty good about it.
+
+Major items include:
+
+* librados locking refactor to improve scaling and client performance
+* local recovery code (LRC) erasure code plugin to trade some
+  additional storage overhead for improved recovery performance
+* LTTNG tracing framework, with initial tracepoints in librados,
+  librbd, and the OSD FileStore backend
+* separate monitor audit log for all administrative commands
+* asynchronos monitor transaction commits to reduce the impact on
+  monitor read requests while processing updates
+* low-level tool for working with individual OSD data stores for
+  debugging, recovery, and testing
+* many MDS improvements (bug fixes, health reporting)
+
+There are still a handful of known bugs in this release, but nothing
+severe enough to prevent a release.  By and large we are pretty
+pleased with the stability and expect the final Giant release to be
+quite reliable.
+
+Please try this out on your non-production clusters for a preview
+
+Notable Changes
+---------------
+
+* buffer: improve rebuild_page_aligned (Ma Jianpeng)
+* build: fix CentOS 5 (Gerben Meijer)
+* build: fix build on alpha (Michael Cree, Dmitry Smirnov)
+* build: fix yasm check for x32 (Daniel Schepler, Sage Weil)
+* ceph-disk: add Scientific Linux support (Dan van der Ster)
+* ceph-fuse, libcephfs: fix crash in trim_caps (John Spray)
+* ceph-fuse, libcephfs: improve cap trimming (John Spray)
+* ceph-fuse, libcephfs: virtual xattrs for rstat (Yan, Zheng)
+* ceph.conf: update sample (Sebastien Han)
+* ceph.spec: many fixes (Erik Logtenberg, Boris Ranto, Dan Mick, Sandon Van Ness)
+* ceph_objectstore_tool: vastly improved and extended tool for working offline with OSD data stores (David Zafman)
+* common: add config diff admin socket command (Joao Eduardo Luis)
+* common: add rwlock assertion checks (Yehuda Sadeh)
+* crush: clean up CrushWrapper interface (Xioaxi Chen)
+* crush: make ruleset ids unique (Xiaoxi Chen, Loic Dachary)
+* doc: improve manual install docs (Francois Lafont)
+* doc: misc updates (John Wilkins, Loic Dachary, David Moreau Simard, Wido den Hollander. Volker Voigt, Alfredo Deza, Stephen Jahl, Dan van der Ster)
+* global: write pid file even when running in foreground (Alexandre Oliva)
+* hadoop: improve tests (Huamin Chen, Greg Farnum, John Spray)
+* journaler: fix locking (Zheng, Yan)
+* librados, osd: return ETIMEDOUT on failed notify (Sage Weil)
+* librados: fix crash on read op timeout (#9362 Matthias Kiefer, Sage Weil)
+* librados: fix shutdown race (#9130 Sage Weil)
+* librados: fix watch reregistration on acting set change (#9220 Samuel Just)
+* librados: fix watch/notify test (#7934 David Zafman)
+* librados: give Objecter fine-grained locks (Yehuda Sadeh, Sage Weil, John Spray)
+* librados: lttng tracepoitns (Adam Crume)
+* librados: pybind: fix reads when \0 is present (#9547 Mohammad Salehe)
+* librbd: enforce cache size on read requests (Jason Dillaman)
+* librbd: handle blacklisting during shutdown (#9105 John Spray)
+* librbd: lttng tracepoints (Adam Crume)
+* lttng: tracing infrastructure (Noah Watkins, Adam Crume)
+* mailmap: updates (Loic Dachary, Abhishek Lekshmanan, M Ranga Swami Reddy)
+* many many coverity fixes, cleanups (Danny Al-Gaaf)
+* mds: adapt to new Objecter locking, give types to all Contexts (John Spray)
+* mds: add internal health checks (John Spray)
+* mds: avoid tight mon reconnect loop (#9428 Sage Weil)
+* mds: fix crash killing sessions (#9173 John Spray)
+* mds: fix ctime updates (#9514 Greg Farnum)
+* mds: fix replay locking (Yan, Zheng)
+* mds: fix standby-replay cache trimming (#8648 Zheng, Yan)
+* mds: give perfcounters meaningful names (Sage Weil)
+* mds: improve health reporting to monitor (John Spray)
+* mds: improve journal locking (Zheng, Yan)
+* mds: make max file recoveries tunable (Sage Weil)
+* mds: prioritize file recovery when appropriate (Sage Weil)
+* mds: refactor beacon, improve reliability (John Spray)
+* mds: restart on EBLACKLISTED (John Spray)
+* mds: track RECALL progress, report failure (#9284 John Spray)
+* mds: update segment references during journal write (John Spray, Greg Farnum)
+* mds: use meaningful names for clients (John Spray)
+* mds: warn clients which aren't revoking caps (Zheng, Yan, John Spray)
+* mon: add 'osd reweight-by-pg' command (Sage Weil, Guang Yang)
+* mon: add audit log for all admin commands (Joao Eduardo Luis)
+* mon: add cluster fingerprint (Sage Weil)
+* mon: avoid creating unnecessary rule on pool create (#9304 Loic Dachary)
+* mon: do not spam log (Aanchal Agrawal, Sage Weil)
+* mon: fix 'osd perf' reported latency (#9269 Samuel Just)
+* mon: fix double-free of old MOSDBoot (Sage Weil)
+* mon: fix op write latency perfcounter (#9217 Xinxin Shu)
+* mon: fix store check on startup (Joao Eduardo Luis)
+* mon: make paxos transaction commits asynchronous (Sage Weil)
+* mon: preload erasure plugins (#9153 Loic Dachary)
+* mon: prevent cache pools from being used directly by CephFS (#9435 John Spray)
+* mon: use user-provided ruleset for replicated pool (Xiaoxi Chen)
+* mon: verify available disk space on startup (#9502 Joao Eduardo Luis)
+* mon: verify erasure plugin version on load (Loic Dachary)
+* msgr: fix logged address (Yongyue Sun)
+* osd: account for hit_set_archive bytes (Sage Weil)
+* osd: add ISA erasure plugin table cache (Andreas-Joachim Peters)
+* osd: add ability to prehash filestore directories (Guang Yang)
+* osd: add feature bit for erasure plugins (Loic Dachary)
+* osd: add local recovery code (LRC) erasure plugin (Loic Dachary)
+* osd: cap hit_set size (#9339 Samuel Just)
+* osd: clear FDCache on unlink (#8914 Loic Dachary)
+* osd: do not evict blocked objects (#9285 Zhiqiang Wang)
+* osd: fix ISA erasure alignment (Loic Dachary, Andreas-Joachim Peters)
+* osd: fix clone vs cache_evict bug (#8629 Sage Weil)
+* osd: fix crash from duplicate backfill reservation (#8863 Sage Weil)
+* osd: fix dead peer connection checks (#9295 Greg Farnum, Sage Weil)
+* osd: fix keyvaluestore scrub (#8589 Haomai Wang)
+* osd: fix keyvaluestore upgrade (Haomai Wang)
+* osd: fix min_read_recency_for_promote default on upgrade (Zhiqiang Wang)
+* osd: fix mount/remount sync race (#9144 Sage Weil)
+* osd: fix purged_snap initialization on backfill (Sage Weil, Samuel Just, Dan van der Ster, Florian Haas)
+* osd: fix race condition on object deletion (#9480 Somnath Roy)
+* osd: fix snap object writeback from cache tier (#9054 Samuel Just)
+* osd: improve journal shutdown (Ma Jianpeng, Mark Kirkwood)
+* osd: improve locking in OpTracker (Pavan Rallabhandi, Somnath Roy)
+* osd: improve tiering agent arithmetic (Zhiqiang Wang, Sage Weil, Samuel Just)
+* osd: lttng tracepoints for filestore (Noah Watkins)
+* osd: make blacklist encoding deterministic (#9211 Sage Weil)
+* osd: many many important fixes (#8231 #8315 #9113 #9179 #9293 #9294 #9326 #9453 #9481 #9482 #9497 #9574 Samuel Just)
+* osd: misc erasure code plugin fixes (Loic Dachary)
+* osd: preload erasure plugins (#9153 Loic Dachary)
+* osd: shard OpTracker to improve performance (Somnath Roy)
+* osd: use local time for tiering decisions (Zhiqiang Wang)
+* osd: verify erasure plugin version on load (Loic Dachary)
+* rados: fix bench write arithmetic (Jiangheng)
+* rbd: parallelize rbd import, export (Jason Dillaman)
+* rbd: rbd-replay utility to replay captured rbd workload traces (Adam Crume)
+* rbd: use write-back (not write-through) when caching is enabled (Jason Dillaman)
+* rgw: add S3 bucket get location operation (Abhishek Lekshmanan)
+* rgw: add civetweb as default frontent on port 7490 (#9013 Yehuda Sadeh)
+* rgw: allow : in S3 access key (Roman Haritonov)
+* rgw: fix admin create user op (#8583 Ray Lv)
+* rgw: fix log filename suffix (#9353 Alexandre Marangone)
+* rgw: fix usage (Abhishek Lekshmanan)
+* rgw: many fixes for civetweb (Yehuda Sadeh)
+* rgw: subuser creation fixes (#8587 Yehuda Sadeh)
+* rgw: use systemd-run from sysvinit script (JuanJose Galvez)
+* unit test improvements (Loic Dachary)
+* vstart.sh: fix/improve rgw support (Luis Pabon, Abhishek Lekshmanan)
+
+v0.85
+=====
+
+This is the second-to-last development release before Giant that
+contains new functionality.  The big items to land during this cycle
+are the messenger refactoring from Matt Benjmain that lays some
+groundwork for RDMA support, a performance improvement series from
+SanDisk that improves performance on SSDs, lots of improvements to our
+new standalone civetweb-based RGW frontend, and a new 'osd blocked-by'
+mon command that allows admins to easily identify which OSDs are
+blocking peering progress.  The other big change is that the OSDs and
+Monitors now distinguish between "misplaced" and "degraded" objects:
+the latter means there are fewer copies than we'd like, while the
+former simply means the are not stored in the locations where we want
+them to be.
+
+Also of note is a change to librbd that enables client-side caching by
+default.  This is coupled with another option that makes the cache
+write-through until a "flush" operations is observed: this implies
+that the librbd user (usually a VM guest OS) supports barriers and
+flush and that it is safe for the cache to switch into writeback mode
+without compromising data safety or integrity.  It has long been
+recommended practice that these options be enabled (e.g., in OpenStack
+environments) but until now it has not been the default.
+
+We have frozen the tree for the looming Giant release, and the next
+development release will be a release candidate with a final batch of
+new functionality.
+
+Upgrading
+---------
+
+* The client-side caching for librbd is now enabled by default (rbd
+  cache = true).  A safety option (rbd cache writethrough until flush
+  = true) is also enabled so that writeback caching is not used until
+  the library observes a 'flush' command, indicating that the librbd
+  users is passing that operation through from the guest VM.  This
+  avoids potential data loss when used with older versions of qemu
+  that do not support flush.
+
+    leveldb_write_buffer_size = 32*1024*1024  = 33554432  // 32MB
+    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
+    leveldb_block_size        = 64*1024       = 65536     // 64KB
+    leveldb_compression       = false
+    leveldb_log               = ""
+
+  OSDs will still maintain the following osd-specific defaults:
+
+    leveldb_log               = ""
+
+* The 'rados getxattr ...' command used to add a gratuitous newline to the attr
+  value; it now does not.
+
+Notable Changes
+---------------
+
+* ceph-disk: do not inadvertantly create directories (Owne Synge)
+* ceph-disk: fix dmcrypt support (Sage Weil)
+* ceph-disk: linter cleanup, logging improvements (Alfredo Deza)
+* ceph-disk: show information about dmcrypt in 'ceph-disk list' output (Sage Weil)
+* ceph-disk: use partition type UUIDs and blkid (Sage Weil)
+* ceph: fix for non-default cluster names (#8944, Dan Mick)
+* doc: document new upstream wireshark dissector (Kevin Cox)
+* doc: many install doc updates (John Wilkins)
+* librados: fix lock leaks in error paths (#9022, Paval Rallabhandi)
+* librados: fix pool existence check (#8835, Pavan Rallabhandi)
+* librbd: enable caching by default (Sage Weil)
+* librbd: fix crash using clone of flattened image (#8845, Josh Durgin)
+* librbd: store and retrieve snapshot metadata based on id (Josh Durgin)
+* mailmap: many updates (Loic Dachary)
+* mds: add min/max UID for snapshot creation/deletion (#9029, Wido den Hollander)
+* misc build errors/warnings for Fedora 20 (Boris Ranto)
+* mon: add 'osd blocked-by' command to easily see which OSDs are blocking peering progress (Sage Weil)
+* mon: add perfcounters for paxos operations (Sage Weil)
+* mon: create default EC profile if needed (Loic Dachary)
+* mon: fix crash on loopback messages and paxos timeouts (#9062, Sage Weil)
+* mon: fix divide by zero when pg_num is adjusted before OSDs are added (#9101, Sage Weil)
+* mon: fix occasional memory leak after session reset (#9176, Sage Weil)
+* mon: fix ruleset/ruleid bugs (#9044, Loic Dachary)
+* mon: make usage dumps in terms of bytes, not kB (Sage Weil)
+* mon: prevent implicit destruction of OSDs with 'osd setmaxosd ...' (#8865, Anand Bhat)
+* mon: verify all quorum members are contiguous at end of Paxos round (#9053, Sage Weil)
+* msgr: refactor to cleanly separate SimpleMessenger implemenetation, move toward Connection-based calls (Matt Benjamin, Sage Wei)
+* objectstore: clean up KeyValueDB interface for key/value backends (Sage Weil)
+* osd: add local_mtime for use by cache agent (Zhiqiang Wang)
+* osd: add superblock for KeyValueStore backend (Haomai Wang)
+* osd: add support for Intel ISA-L erasure code library (Andreas-Joachim Peters)
+* osd: do not skip promote for write-ordered reads (#9064, Samuel Just)
+* osd: fix ambigous encoding order for blacklisted clients (#9211, Sage Weil)
+* osd: fix cache flush corner case for snapshotted objects (#9054, Samuel Just)
+* osd: fix discard of old/obsolete subop replies (#9259, Samuel Just)
+* osd: fix discard of peer messages from previous intervals (Greg Farnum)
+* osd: fix dump of open fds on EMFILE (Sage Weil)
+* osd: fix journal dump (Ma Jianpeng)
+* osd: fix mon feature bit requirements bug and resulting log spam (Sage Weil)
+* osd: fix recovery chunk size usage during EC recovery (Ma Jianpeng)
+* osd: fix recovery reservation deadlock for EC pools (Samuel Just)
+* osd: fix removal of old xattrs when overwriting chained xattrs (Ma Jianpeng)
+* osd: fix requesting queueing on PG split (Samuel Just)
+* osd: force new xattrs into leveldb if fs returns E2BIG (#7779, Sage Weil)
+* osd: implement alignment on chunk sizes (Loic Dachary)
+* osd: improve prioritization of recovery of degraded over misplaced objects (Sage Weil)
+* osd: locking, sharding, caching improvements in FileStore's FDCache (Somnath Roy, Greg Farnum)
+* osd: many important bug fixes (Samuel Just)
+* osd, mon: add rocksdb support (Xinxin Shu, Sage Weil)
+* osd, mon: distinguish between "misplaced" and "degraded" objects in cluster health and PG state reporting (Sage Weil)
+* osd: refactor some ErasureCode functionality into command parent class (Loic Dachary)
+* osd: set rollback_info_completed on create (#8625, Samuel Just)
+* rados: allow setxattr value to be read from stdin (Sage Weil)
+* rados: drop gratuitous \n from getxattr command (Sage Weil)
+* rgw: add --min-rewrite-stripe-size for object restriper (Yehuda Sadeh)
+* rgw: add powerdns hook for dynamic DNS for global clusters (Wido den Hollander)
+* rgw: copy object data is target bucket is in a different pool (#9039, Yehuda Sadeh)
+* rgw: do not try to authenticate CORS preflight requests (#8718, Robert Hubbard, Yehuda Sadeh)
+* rgw: fix civetweb URL decoding (#8621, Yehuda Sadeh)
+* rgw: fix removal of objects during object creation (Patrycja Szablowska, Yehuda Sadeh)
+* rgw: fix striping for copied objects (#9089, Yehuda Sadeh)
+* rgw: fix test for identify whether an object has a tail (#9226, Yehuda Sadeh)
+* rgw: fix when stripe size is not a multiple of chunk size (#8937, Yehuda Sadeh)
+* rgw: improve civetweb logging (Yehuda Sadeh)
+* rgw: misc civetweb frontend fixes (Yehuda Sadeh)
+* sysvinit: add support for non-default cluster names (Alfredo Deza)
+
+
+v0.84
+=====
+
+The next Ceph development release is here!  This release contains
+several meaty items, including some MDS improvements for journaling,
+the ability to remove the CephFS file system (and name it), several
+mon cleanups with tiered pools, several OSD performance branches, a
+new "read forward" RADOS caching mode, a prototype Kinetic OSD
+backend, and various radosgw improvements (especially with the new
+standalone civetweb frontend).  And there are a zillion OSD bug
+fixes. Things are looking pretty good for the Giant release that is
+coming up in the next month.
+
+Upgrading
+---------
+
+* The ``*_kb perf`` counters on the monitor have been removed.  These are
+  replaced with a new set of ``*_bytes`` counters (e.g., ``cluster_osd_kb`` is
+  replaced by ``cluster_osd_bytes``).
+
+* The ``rd_kb`` and ``wr_kb`` fields in the JSON dumps for pool stats (accessed
+  via the ``ceph df detail -f json-pretty`` and related commands) have been 
+  replaced with corresponding ``*_bytes`` fields.  Similarly, the 
+  ``total_space``, ``total_used``, and ``total_avail`` fields are replaced with 
+  ``total_bytes``, ``total_used_bytes``,  and ``total_avail_bytes`` fields.
+  
+* The ``rados df --format=json`` output ``read_bytes`` and ``write_bytes``
+  fields were incorrectly reporting ops; this is now fixed.
+
+* The ``rados df --format=json`` output previously included ``read_kb`` and
+  ``write_kb`` fields; these have been removed.  Please use ``read_bytes`` and
+  ``write_bytes`` instead (and divide by 1024 if appropriate).
+
+Notable Changes
+---------------
+
+* ceph-conf: flush log on exit (Sage Weil)
+* ceph-dencoder: refactor build a bit to limit dependencies (Sage Weil, Dan Mick)
+* ceph.spec: split out ceph-common package, other fixes (Sandon Van Ness)
+* ceph_test_librbd_fsx: fix RNG, make deterministic (Ilya Dryomov)
+* cephtool: refactor and improve CLI tests (Joao Eduardo Luis)
+* client: improved MDS session dumps (John Spray)
+* common: fix dup log messages (#9080, Sage Weil)
+* crush: include new tunables in dump (Sage Weil)
+* crush: only require rule features if the rule is used (#8963, Sage Weil)
+* crushtool: send output to stdout, not stderr (Wido den Hollander)
+* fix i386 builds (Sage Weil)
+* fix struct vs class inconsistencies (Thorsten Behrens)
+* hadoop: update hadoop tests for Hadoop 2.0 (Haumin Chen)
+* librbd, ceph-fuse: reduce cache flush overhead (Haomai Wang)
+* librbd: fix error path when opening image (#8912, Josh Durgin)
+* mds: add file system name, enabled flag (John Spray)
+* mds: boot refactor, cleanup (John Spray)
+* mds: fix journal conversion with standby-replay (John Spray)
+* mds: separate inode recovery queue (John Spray)
+* mds: session ls, evict commands (John Spray)
+* mds: submit log events in async thread (Yan, Zheng)
+* mds: use client-provided timestamp for user-visible file metadata (Yan, Zheng)
+* mds: validate journal header on load and save (John Spray)
+* misc build fixes for OS X (John Spray)
+* misc integer size cleanups (Kevin Cox)
+* mon: add get-quota commands (Joao Eduardo Luis)
+* mon: do not create file system by default (John Spray)
+* mon: fix 'ceph df' output for available space (Xiaoxi Chen)
+* mon: fix bug when no auth keys are present (#8851, Joao Eduardo Luis)
+* mon: fix compat version for MForward (Joao Eduardo Luis)
+* mon: restrict some pool properties to tiered pools (Joao Eduardo Luis)
+* msgr: misc locking fixes for fast dispatch (#8891, Sage Weil)
+* osd: add 'dump_reservations' admin socket command (Sage Weil)
+* osd: add READFORWARD caching mode (Luis Pabon)
+* osd: add header cache for KeyValueStore (Haomai Wang)
+* osd: add prototype KineticStore based on Seagate Kinetic (Josh Durgin)
+* osd: allow map cache size to be adjusted at runtime (Sage Weil)
+* osd: avoid refcounting overhead by passing a few things by ref (Somnath Roy)
+* osd: avoid sharing PG info that is not durable (Samuel Just)
+* osd: clear slow request latency info on osd up/down (Sage Weil)
+* osd: fix PG object listing/ordering bug (Guang Yang)
+* osd: fix PG stat errors with tiering (#9082, Sage Weil)
+* osd: fix bug with long object names and rename (#8701, Sage Weil)
+* osd: fix cache full -> not full requeueing (#8931, Sage Weil)
+* osd: fix gating of messages from old OSD instances (Greg Farnum)
+* osd: fix memstore bugs with collection_move_rename, lock ordering (Sage Weil)
+* osd: improve locking for KeyValueStore (Haomai Wang)
+* osd: make tiering behave if hit_sets aren't enabled (Sage Weil)
+* osd: mark pools with incomplete clones (Sage Weil)
+* osd: misc locking fixes for fast dispatch (Samuel Just, Ma Jianpeng)
+* osd: prevent old rados clients from using tiered pools (#8714, Sage Weil)
+* osd: reduce OpTracker overhead (Somnath Roy)
+* osd: set configurable hard limits on object and xattr names (Sage Weil, Haomai Wang)
+* osd: trim old EC objects quickly; verify on scrub (Samuel Just)
+* osd: work around GCC 4.8 bug in journal code (Matt Benjamin)
+* rados bench: fix arg order (Kevin Dalley)
+* rados: fix {read,write}_ops values for df output (Sage Weil)
+* rbd: add rbdmap pre- and post post- hooks, fix misc bugs (Dmitry Smirnov)
+* rbd: improve option default behavior (Josh Durgin)
+* rgw: automatically align writes to EC pool (#8442, Yehuda Sadeh)
+* rgw: fix crash on swift CORS preflight request (#8586, Yehuda Sadeh)
+* rgw: fix memory leaks (Andrey Kuznetsov)
+* rgw: fix multipart upload (#8846, Silvain Munaut, Yehuda Sadeh)
+* rgw: improve -h (Abhishek Lekshmanan)
+* rgw: improve delimited listing of bucket, misc fixes (Yehuda Sadeh)
+* rgw: misc civetweb fixes (Yehuda Sadeh)
+* rgw: powerdns backend for global namespaces (Wido den Hollander)
+* systemd: initial systemd config files (Federico Simoncelli)
+
+
+v0.83
+=====
+
+Another Ceph development release!  This has been a longer cycle, so
+there has been quite a bit of bug fixing and stabilization in this
+round.  There is also a bunch of packaging fixes for RPM distros
+(RHEL/CentOS, Fedora, and SUSE) and for systemd.  We've also added a new
+librados-striper library from Sebastien Ponce that provides a generic
+striping API for applications to code to.
+
+Upgrading
+---------
+
+* The experimental keyvaluestore-dev OSD backend had an on-disk format
+  change that prevents existing OSD data from being upgraded.  This
+  affects developers and testers only.
+
+* mon-specific and osd-specific leveldb options have been removed.
+  From this point onward users should use the `leveldb_*` generic
+  options and add the options in the appropriate sections of their
+  configuration files.  Monitors will still maintain the following
+  monitor-specific defaults:
+
+    leveldb_write_buffer_size = 32*1024*1024  = 33554432  // 32MB
+    leveldb_cache_size        = 512*1024*1204 = 536870912 // 512MB
+    leveldb_block_size        = 64*1024       = 65536     // 64KB
+    leveldb_compression       = false
+    leveldb_log               = ""
+
+  OSDs will still maintain the following osd-specific defaults:
+
+    leveldb_log               = ""
+
+Notable Changes
+---------------
+
+* ceph-disk: fix dmcrypt support (Stephen Taylor)
+* cephtool: fix help (Yilong Zhao)
+* cephtool: test cleanup (Joao Eduardo Luis)
+* doc: librados example fixes (Kevin Dalley)
+* doc: many doc updates (John Wilkins)
+* doc: update erasure docs (Loic Dachary, Venky Shankar)
+* filestore: disable use of XFS hint (buggy on old kernels) (Samuel Just)
+* filestore: fix xattr spillout (Greg Farnum, Haomai Wang)
+* keyvaluestore: header cache (Haomai Wang)
+* librados_striper: striping library for librados (Sebastien Ponce)
+* libs3: update to latest (Danny Al-Gaaf)
+* log: fix derr level (Joao Eduardo Luis)
+* logrotate: fix osd log rotation on ubuntu (Sage Weil)
+* mds: fix xattr bug triggered by ACLs (Yan, Zheng)
+* misc memory leaks, cleanups, fixes (Danny Al-Gaaf, Sahid Ferdjaoui)
+* misc suse fixes (Danny Al-Gaaf)
+* misc word size fixes (Kevin Cox)
+* mon: drop mon- and osd- specific leveldb options (Joao Eduardo Luis)
+* mon: ec pool profile fixes (Loic Dachary)
+* mon: fix health down messages (Sage Weil)
+* mon: fix quorum feature check (#8738, Greg Farnum)
+* mon: 'osd crush reweight-subtree ...' (Sage Weil)
+* mon, osd: relax client EC support requirements (Sage Weil)
+* mon: some instrumentation (Sage Weil)
+* objecter: flag operations that are redirected by caching (Sage Weil)
+* osd: clean up shard_id_t, shard_t (Loic Dachary)
+* osd: fix connection reconnect race (Greg Farnum)
+* osd: fix dumps (Joao Eduardo Luis)
+* osd: fix erasure-code lib initialization (Loic Dachary)
+* osd: fix extent normalization (Adam Crume)
+* osd: fix loopback msgr issue (Ma Jianpeng)
+* osd: fix LSB release parsing (Danny Al-Gaaf)
+* osd: improved backfill priorities (Sage Weil)
+* osd: many many core fixes (Samuel Just)
+* osd, mon: config sanity checks on start (Sage Weil, Joao Eduardo Luis)
+* osd: sharded threadpool to improve parallelism (Somnath Roy)
+* osd: simple io prioritization for scrub (Sage Weil)
+* osd: simple scrub throttling (Sage Weil)
+* osd: tests for bench command (Loic Dachary)
+* osd: use xfs hint less frequently (Ilya Dryomov)
+* pybind/rados: fix small timeouts (John Spray)
+* qa: xfstests updates (Ilya Dryomov)
+* rgw: cache bucket info (Yehuda Sadeh)
+* rgw: cache decoded user info (Yehuda Sadeh)
+* rgw: fix multipart object attr regression (#8452, Yehuda Sadeh)
+* rgw: fix radosgw-admin 'show log' command (#8553, Yehuda Sadeh)
+* rgw: fix URL decoding (#8702, Brian Rak)
+* rgw: handle empty extra pool name (Yehuda Sadeh)
+* rpm: do not restart daemons on upgrade (Alfredo Deza)
+* rpm: misc packaging fixes for rhel7 (Sandon Van Ness)
+* rpm: split ceph-common from ceph (Sandon Van Ness)
+* systemd: wrap started daemons in new systemd environment (Sage Weil, Dan Mick)
+* sysvinit: less sensitive to failures (Sage Weil)
+* upstart: increase max open files limit (Sage Weil)
+
+v0.82
+=====
+
+This is the second post-firefly development release.  It includes a range
+of bug fixes and some usability improvements.  There are some MDS debugging
+and diagnostic tools, an improved 'ceph df', and some OSD backend refactoring
+and cleanup.
+
+Notable Changes
+---------------
+
+* ceph-brag: add tox tests (Alfredo Deza)
+* common: perfcounters now use atomics and go faster (Sage Weil)
+* doc: CRUSH updates (John Wilkins)
+* doc: osd primary affinity (John Wilkins)
+* doc: pool quotas (John Wilkins)
+* doc: pre-flight doc improvements (Kevin Dalley)
+* doc: switch to an unencumbered font (Ross Turk)
+* doc: update openstack docs (Josh Durgin)
+* fix hppa arch build (Dmitry Smirnov)
+* init-ceph: continue starting other daemons on crush or mount failure (#8343, Sage Weil)
+* keyvaluestore: fix hint crash (#8381, Haomai Wang)
+* libcephfs-java: build against older JNI headers (Greg Farnum)
+* librados: fix rados_pool_list bounds checks (Sage Weil)
+* mds: cephfs-journal-tool (John Spray)
+* mds: improve Journaler on-disk format (John Spray)
+* mds, libcephfs: use client timestamp for mtime/ctime (Sage Weil)
+* mds: misc encoding improvements (John Spray)
+* mds: misc fixes for multi-mds (Yan, Zheng)
+* mds: OPTracker integration, dump_ops_in_flight (Greg Farnum)
+* misc cleanup (Christophe Courtaut)
+* mon: fix default replication pool ruleset choice (#8373, John Spray)
+* mon: fix set cache_target_full_ratio (#8440, Geoffrey Hartz)
+* mon: include per-pool 'max avail' in df output (Sage Weil)
+* mon: prevent EC pools from being used with cephfs (Joao Eduardo Luis)
+* mon: restore original weight when auto-marked out OSDs restart (Sage Weil)
+* mon: use msg header tid for MMonGetVersionReply (Ilya Dryomov)
+* osd: fix bogus assert during OSD shutdown (Sage Weil)
+* osd: fix clone deletion case (#8334, Sam Just)
+* osd: fix filestore removal corner case (#8332, Sam Just)
+* osd: fix hang waiting for osdmap (#8338, Greg Farnum)
+* osd: fix interval check corner case during peering (#8104, Sam Just)
+* osd: fix journal-less operation (Sage Weil)
+* osd: include backend information in metadata reported to mon (Sage Weil)
+* rest-api: fix help (Ailing Zhang)
+* rgw: check entity permission for put_metadata (#8428, Yehuda Sadeh)
+
+
+v0.81
+=====
+
+This is the first development release since Firefly.  It includes a
+lot of work that we delayed merging while stabilizing things.  Lots of
+new functionality, as well as several fixes that are baking a bit before
+getting backported.
+
+Upgrading
+---------
+
+* CephFS support for the legacy anchor table has finally been removed.
+  Users with file systems created before firefly should ensure that inodes
+  with multiple hard links are modified *prior* to the upgrade to ensure that
+  the backtraces are written properly.  For example::
+
+    sudo find /mnt/cephfs -type f -links +1 -exec touch \{\} \;
+
+* Disallow nonsensical 'tier cache-mode' transitions.  From this point
+  onward, 'writeback' can only transition to 'forward' and 'forward'
+  can transition to 1) 'writeback' if there are dirty objects, or 2) any if
+  there are no dirty objects.
+
+Notable Changes
+---------------
+
+* bash completion improvements (Wido den Hollander)
+* brag: fixes, improvements (Loic Dachary)
+* ceph-disk: handle corrupt volumes (Stuart Longlang)
+* ceph-disk: partprobe as needed (Eric Eastman)
+* ceph-fuse, libcephfs: asok hooks for handling session resets, timeouts (Yan, Zheng)
+* ceph-fuse, libcephfs: improve traceless reply handling (Sage Weil)
+* clang build fixes (John Spray, Danny Al-Gaaf)
+* config: support G, M, K, etc. suffixes (Joao Eduardo Luis)
+* coverity cleanups (Danny Al-Gaaf)
+* doc: cache tiering (John Wilkins)
+* doc: keystone integration docs (John Wilkins)
+* doc: updated simple configuration guides (John Wilkins)
+* libcephfs-java: fix gcj-jdk build (Dmitry Smirnov)
+* librbd: check error code on cache invalidate (Josh Durgin)
+* librbd: new libkrbd library for kernel map/unmap/showmapped (Ilya Dryomov)
+* Makefile: fix out of source builds (Stefan Eilemann)
+* mds: multi-mds fixes (Yan, Zheng)
+* mds: remove legacy anchor table (Yan, Zheng)
+* mds: remove legacy discover ino (Yan, Zheng)
+* monclient: fix hang (Sage Weil)
+* mon: prevent nonsensical cache-mode transitions (Joao Eduardo Luis)
+* msgr: avoid big lock when sending (most) messages (Greg Farnum)
+* osd: bound osdmap epoch skew between PGs (Sage Weil)
+* osd: cache tier flushing fixes for snapped objects (Samuel Just)
+* osd: fix agent early finish looping (David Zafman)
+* osd: fix flush vs OpContext (Samuel Just)
+* osd: fix MarkMeDown and other shutdown races (Sage Weil)
+* osd: fix scrub vs cache bugs (Samuel Just)
+* osd: fix trim of hitsets (Sage Weil)
+* osd, msgr: fast-dispatch of OSD ops (Greg Farnum, Samuel Just)
+* osd, objecter: resend ops on last_force_op_resend barrier; fix cache overlay op ordering (Sage Weil)
+* osd: remove obsolete classic scrub code (David Zafman)
+* osd: scrub PGs with invalid stats (Sage Weil)
+* osd: simple snap trimmer throttle (Sage Weil)
+* osd: use FIEMAP to inform copy_range (Haomai Wang)
+* rbd-fuse: allow exposing single image (Stephen Taylor)
+* rbd-fuse: fix unlink (Josh Durgin)
+* removed mkcephfs (deprecated since dumpling)
+* rgw: bucket link uses instance id (Yehuda Sadeh)
+* rgw: fix memory leak following chunk read error (Yehuda Sadeh)
+* rgw: fix URL escaping (Yehuda Sadeh)
+* rgw: fix user manifest (Yehuda Sadeh)
+* rgw: object and bucket rewrite functions to allow restriping old objects (Yehuda Sadeh)
+* rgw: prevent multiobject PUT race (Yehuda Sadeh)
+* rgw: send user manifest header (Yehuda Sadeh)
+* test_librbd_fsx: test krbd as well as librbd (Ilya Dryomov)
+
+v0.80.11 Firefly
+================
+
+This is a bugfix release for Firefly.  This Firefly 0.80.x is nearing
+its planned end of life in January 2016 it may also be the last.
+
+We recommend that all Firefly users upgrade.
+
+For more detailed information, see :download:`the complete changelog
+<changelog/v0.80.11.txt>`.
+
+Notable Changes
+---------------
+
+* build/ops: /etc/init.d/radosgw restart does not work correctly (`issue#11140 <http://tracker.ceph.com/issues/11140>`_, `pr#5831 <http://github.com/ceph/ceph/pull/5831>`_, Dmitry Yatsushkevich)
+* build/ops: Fix -Wno-format and -Werror=format-security options clash  (`issue#13417 <http://tracker.ceph.com/issues/13417>`_, `pr#6207 <http://github.com/ceph/ceph/pull/6207>`_, Boris Ranto)
+* build/ops: ceph-common needs python-argparse on older distros, but doesn't require it (`issue#12034 <http://tracker.ceph.com/issues/12034>`_, `pr#5217 <http://github.com/ceph/ceph/pull/5217>`_, Nathan Cutler)
+* build/ops: ceph.spec.in running fdupes unnecessarily (`issue#12301 <http://tracker.ceph.com/issues/12301>`_, `pr#5224 <http://github.com/ceph/ceph/pull/5224>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: 50-rbd.rules conditional is wrong (`issue#12166 <http://tracker.ceph.com/issues/12166>`_, `pr#5225 <http://github.com/ceph/ceph/pull/5225>`_, Nathan Cutler)
+* build/ops: ceph.spec.in: useless %py_requires breaks SLE11-SP3 build (`issue#12351 <http://tracker.ceph.com/issues/12351>`_, `pr#5394 <http://github.com/ceph/ceph/pull/5394>`_, Nathan Cutler)
+* build/ops: fedora21 has junit, not junit4  (`issue#10728 <http://tracker.ceph.com/issues/10728>`_, `pr#6203 <http://github.com/ceph/ceph/pull/6203>`_, Ken Dreyer, Loic Dachary)
+* build/ops: upstart: configuration is too generous on restarts (`issue#11798 <http://tracker.ceph.com/issues/11798>`_, `pr#5992 <http://github.com/ceph/ceph/pull/5992>`_, Sage Weil)
+* common: Client admin socket leaks file descriptors (`issue#11535 <http://tracker.ceph.com/issues/11535>`_, `pr#4633 <http://github.com/ceph/ceph/pull/4633>`_, Jon Bernard)
+* common: FileStore calls syncfs(2) even it is not supported (`issue#12512 <http://tracker.ceph.com/issues/12512>`_, `pr#5529 <http://github.com/ceph/ceph/pull/5529>`_, Danny Al-Gaaf, Kefu Chai, Jianpeng Ma)
+* common: HeartBeat: include types (`issue#13088 <http://tracker.ceph.com/issues/13088>`_, `pr#6038 <http://github.com/ceph/ceph/pull/6038>`_, Sage Weil)
+* common: Malformed JSON command output when non-ASCII strings are present  (`issue#7387 <http://tracker.ceph.com/issues/7387>`_, `pr#4635 <http://github.com/ceph/ceph/pull/4635>`_, Kefu Chai, Tim Serong)
+* common: Memory leak in Mutex.cc, pthread_mutexattr_init without pthread_mutexattr_destroy (`issue#11762 <http://tracker.ceph.com/issues/11762>`_, `pr#5403 <http://github.com/ceph/ceph/pull/5403>`_, Ketor Meng)
+* common: Thread:pthread_attr_destroy(thread_attr) when done with it (`issue#12570 <http://tracker.ceph.com/issues/12570>`_, `pr#6325 <http://github.com/ceph/ceph/pull/6325>`_, Piotr Dałek, Zheng Qiankun)
+* common: ThreadPool add/remove work queue methods not thread safe (`issue#12662 <http://tracker.ceph.com/issues/12662>`_, `pr#5991 <http://github.com/ceph/ceph/pull/5991>`_, Jason Dillaman)
+* common: buffer: critical bufferlist::zero bug (`issue#12252 <http://tracker.ceph.com/issues/12252>`_, `pr#5388 <http://github.com/ceph/ceph/pull/5388>`_, Haomai Wang)
+* common: log: take mutex while opening fd (`issue#12465 <http://tracker.ceph.com/issues/12465>`_, `pr#5406 <http://github.com/ceph/ceph/pull/5406>`_, Samuel Just)
+* common: recursive lock of md_config_t (0) (`issue#12614 <http://tracker.ceph.com/issues/12614>`_, `pr#5814 <http://github.com/ceph/ceph/pull/5814>`_, Josh Durgin)
+* crush: take crashes due to invalid arg (`issue#11602 <http://tracker.ceph.com/issues/11602>`_, `pr#4769 <http://github.com/ceph/ceph/pull/4769>`_, Sage Weil)
+* doc: backport v0.80.10 release notes to firefly (`issue#11090 <http://tracker.ceph.com/issues/11090>`_, `pr#5307 <http://github.com/ceph/ceph/pull/5307>`_, Loic Dachary, Sage Weil)
+* doc: update docs to point to download.ceph.com (`issue#13162 <http://tracker.ceph.com/issues/13162>`_, `pr#5993 <http://github.com/ceph/ceph/pull/5993>`_, Alfredo Deza)
+* fs: MDSMonitor: handle MDSBeacon messages properly (`issue#11590 <http://tracker.ceph.com/issues/11590>`_, `pr#5199 <http://github.com/ceph/ceph/pull/5199>`_, Kefu Chai)
+* fs: client nonce collision due to unshared pid namespaces (`issue#13032 <http://tracker.ceph.com/issues/13032>`_, `pr#6087 <http://github.com/ceph/ceph/pull/6087>`_, Josh Durgin, Sage Weil)
+* librbd: Objectcacher setting max object counts too low (`issue#7385 <http://tracker.ceph.com/issues/7385>`_, `pr#4639 <http://github.com/ceph/ceph/pull/4639>`_, Jason Dillaman)
+* librbd: aio calls may block (`issue#11056 <http://tracker.ceph.com/issues/11056>`_, `pr#4854 <http://github.com/ceph/ceph/pull/4854>`_, Haomai Wang, Sage Weil, Jason Dillaman)
+* librbd: internal.cc: 1967: FAILED assert(watchers.size() == 1) (`issue#12176 <http://tracker.ceph.com/issues/12176>`_, `pr#5171 <http://github.com/ceph/ceph/pull/5171>`_, Jason Dillaman)
+* mon: Clock skew causes missing summary and confuses Calamari (`issue#11877 <http://tracker.ceph.com/issues/11877>`_, `pr#4867 <http://github.com/ceph/ceph/pull/4867>`_, Thorsten Behrens)
+* mon: EC pools are not allowed as cache pools, disallow in the mon (`issue#11650 <http://tracker.ceph.com/issues/11650>`_, `pr#5389 <http://github.com/ceph/ceph/pull/5389>`_, Samuel Just)
+* mon: Make it more difficult to delete pools in firefly (`issue#11800 <http://tracker.ceph.com/issues/11800>`_, `pr#4788 <http://github.com/ceph/ceph/pull/4788>`_, Sage Weil)
+* mon: MonitorDBStore: get_next_key() only if prefix matches (`issue#11786 <http://tracker.ceph.com/issues/11786>`_, `pr#5360 <http://github.com/ceph/ceph/pull/5360>`_, Joao Eduardo Luis)
+* mon: PaxosService: call post_refresh() instead of post_paxos_update() (`issue#11470 <http://tracker.ceph.com/issues/11470>`_, `pr#5358 <http://github.com/ceph/ceph/pull/5358>`_, Joao Eduardo Luis)
+* mon: add a cache layer over MonitorDBStore (`issue#12638 <http://tracker.ceph.com/issues/12638>`_, `pr#5698 <http://github.com/ceph/ceph/pull/5698>`_, Kefu Chai)
+* mon: adding exsting pool as tier with --force-nonempty clobbers removed_snaps (`issue#11493 <http://tracker.ceph.com/issues/11493>`_, `pr#5236 <http://github.com/ceph/ceph/pull/5236>`_, Sage Weil, Samuel Just)
+* mon: ceph fails to compile with boost 1.58 (`issue#11576 <http://tracker.ceph.com/issues/11576>`_, `pr#5129 <http://github.com/ceph/ceph/pull/5129>`_, Kefu Chai)
+* mon: does not check for IO errors on every transaction (`issue#13089 <http://tracker.ceph.com/issues/13089>`_, `pr#6091 <http://github.com/ceph/ceph/pull/6091>`_, Sage Weil)
+* mon: get pools health'info have error (`issue#12402 <http://tracker.ceph.com/issues/12402>`_, `pr#5410 <http://github.com/ceph/ceph/pull/5410>`_, renhwztetecs)
+* mon: increase globalid default for firefly (`issue#13255 <http://tracker.ceph.com/issues/13255>`_, `pr#6010 <http://github.com/ceph/ceph/pull/6010>`_, Sage Weil)
+* mon: pgmonitor: wrong at/near target max“ reporting (`issue#12401 <http://tracker.ceph.com/issues/12401>`_, `pr#5409 <http://github.com/ceph/ceph/pull/5409>`_, huangjun)
+* mon: register_new_pgs() should check ruleno instead of its index (`issue#12210 <http://tracker.ceph.com/issues/12210>`_, `pr#5404 <http://github.com/ceph/ceph/pull/5404>`_, Xinze Chi)
+* mon: scrub error (osdmap encoding mismatch?) upgrading from 0.80 to ~0.80.2 (`issue#8815 <http://tracker.ceph.com/issues/8815>`_, `issue#8674 <http://tracker.ceph.com/issues/8674>`_, `issue#9064 <http://tracker.ceph.com/issues/9064>`_, `pr#5200 <http://github.com/ceph/ceph/pull/5200>`_, Sage Weil, Zhiqiang Wang, Samuel Just)
+* mon: the output is wrong when runing ceph osd reweight (`issue#12251 <http://tracker.ceph.com/issues/12251>`_, `pr#5408 <http://github.com/ceph/ceph/pull/5408>`_, Joao Eduardo Luis)
+* objecter: can get stuck in redirect loop if osdmap epoch == last_force_op_resend (`issue#11026 <http://tracker.ceph.com/issues/11026>`_, `pr#4597 <http://github.com/ceph/ceph/pull/4597>`_, Jianpeng Ma, Sage Weil)
+* objecter: pg listing can deadlock when throttling is in use (`issue#9008 <http://tracker.ceph.com/issues/9008>`_, `pr#5043 <http://github.com/ceph/ceph/pull/5043>`_, Guang Yang)
+* objecter: resend linger ops on split (`issue#9806 <http://tracker.ceph.com/issues/9806>`_, `pr#5062 <http://github.com/ceph/ceph/pull/5062>`_, Josh Durgin, Samuel Just)
+* osd: Cleanup boost optionals for boost 1.56 (`issue#9983 <http://tracker.ceph.com/issues/9983>`_, `pr#5039 <http://github.com/ceph/ceph/pull/5039>`_, William A. Kennington III)
+* osd: LibRadosTwoPools[EC]PP.PromoteSnap failure (`issue#10052 <http://tracker.ceph.com/issues/10052>`_, `pr#5050 <http://github.com/ceph/ceph/pull/5050>`_, Sage Weil)
+* osd: Mutex Assert from PipeConnection::try_get_pipe (`issue#12437 <http://tracker.ceph.com/issues/12437>`_, `pr#5815 <http://github.com/ceph/ceph/pull/5815>`_, David Zafman)
+* osd: PG stuck with remapped (`issue#9614 <http://tracker.ceph.com/issues/9614>`_, `pr#5044 <http://github.com/ceph/ceph/pull/5044>`_, Guang Yang)
+* osd: PG::handle_advance_map: on_pool_change after handling the map change (`issue#12809 <http://tracker.ceph.com/issues/12809>`_, `pr#5988 <http://github.com/ceph/ceph/pull/5988>`_, Samuel Just)
+* osd: PGLog: split divergent priors as well (`issue#11069 <http://tracker.ceph.com/issues/11069>`_, `pr#4631 <http://github.com/ceph/ceph/pull/4631>`_, Samuel Just)
+* osd: PGLog::proc_replica_log: correctly handle case where entries between olog.head and log.tail were split out (`issue#11358 <http://tracker.ceph.com/issues/11358>`_, `pr#5287 <http://github.com/ceph/ceph/pull/5287>`_, Samuel Just)
+* osd: WBThrottle::clear_object: signal on cond when we reduce throttle values (`issue#12223 <http://tracker.ceph.com/issues/12223>`_, `pr#5822 <http://github.com/ceph/ceph/pull/5822>`_, Samuel Just)
+* osd: cache full mode still skips young objects (`issue#10006 <http://tracker.ceph.com/issues/10006>`_, `pr#5051 <http://github.com/ceph/ceph/pull/5051>`_, Xinze Chi, Zhiqiang Wang)
+* osd: crash creating/deleting pools (`issue#12429 <http://tracker.ceph.com/issues/12429>`_, `pr#5526 <http://github.com/ceph/ceph/pull/5526>`_, John Spray)
+* osd: explicitly specify OSD features in MOSDBoot (`issue#10911 <http://tracker.ceph.com/issues/10911>`_, `pr#4960 <http://github.com/ceph/ceph/pull/4960>`_, Sage Weil)
+* osd: is_new_interval() fixes (`issue#11771 <http://tracker.ceph.com/issues/11771>`_, `issue#10399 <http://tracker.ceph.com/issues/10399>`_, `pr#5726 <http://github.com/ceph/ceph/pull/5726>`_, Samuel Just, Jason Dillaman)
+* osd: make the all osd/filestore thread pool suicide timeouts separately configurable (`issue#11439 <http://tracker.ceph.com/issues/11439>`_, `pr#5823 <http://github.com/ceph/ceph/pull/5823>`_, Samuel Just)
+* osd: object creation by write cannot use an offset on an erasure coded pool (`issue#11507 <http://tracker.ceph.com/issues/11507>`_, `pr#4632 <http://github.com/ceph/ceph/pull/4632>`_, Jianpeng Ma, Loic Dachary)
+* osd: os/FileJournal: Fix journal write fail, align for direct io (`issue#12943 <http://tracker.ceph.com/issues/12943>`_, `pr#5619 <http://github.com/ceph/ceph/pull/5619>`_, Xie Rui)
+* osd: osd/PGLog.cc: 732: FAILED assert(log.log.size() == log_keys_debug.size()) (`issue#12652 <http://tracker.ceph.com/issues/12652>`_, `pr#5820 <http://github.com/ceph/ceph/pull/5820>`_, Sage Weil)
+* osd: read on chunk-aligned xattr not handled (`issue#12309 <http://tracker.ceph.com/issues/12309>`_, `pr#5235 <http://github.com/ceph/ceph/pull/5235>`_, Sage Weil)
+* rgw: Change variable length array of std::strings (not legal in C++) to std::vector<std::string> (`issue#12467 <http://tracker.ceph.com/issues/12467>`_, `pr#4583 <http://github.com/ceph/ceph/pull/4583>`_, Daniel J. Hofmann)
+* rgw: Civetweb RGW appears to report full size of object as downloaded when only partially downloaded (`issue#11851 <http://tracker.ceph.com/issues/11851>`_, `pr#5234 <http://github.com/ceph/ceph/pull/5234>`_, Yehuda Sadeh)
+* rgw: Keystone PKI token expiration is not enforced (`issue#11367 <http://tracker.ceph.com/issues/11367>`_, `pr#4765 <http://github.com/ceph/ceph/pull/4765>`_, Anton Aksola)
+* rgw: Object copy bug (`issue#11639 <http://tracker.ceph.com/issues/11639>`_, `pr#4762 <http://github.com/ceph/ceph/pull/4762>`_, Javier M. Mellid)
+* rgw: RGW returns requested bucket name raw in "Bucket" response header (`issue#11860 <http://tracker.ceph.com/issues/11860>`_, `issue#12537 <http://tracker.ceph.com/issues/12537>`_, `pr#5730 <http://github.com/ceph/ceph/pull/5730>`_, Yehuda Sadeh, Wido den Hollander)
+* rgw: Swift API: response for PUT on /container does not contain the mandatory Content-Length header when FCGI is used (`issue#11036 <http://tracker.ceph.com/issues/11036>`_, `pr#5170 <http://github.com/ceph/ceph/pull/5170>`_, Radoslaw Zarzynski)
+* rgw: content length parsing calls strtol() instead of strtoll() (`issue#10701 <http://tracker.ceph.com/issues/10701>`_, `pr#5997 <http://github.com/ceph/ceph/pull/5997>`_, Yehuda Sadeh)
+* rgw: delete bucket does not remove .bucket.meta file (`issue#11149 <http://tracker.ceph.com/issues/11149>`_, `pr#4641 <http://github.com/ceph/ceph/pull/4641>`_, Orit Wasserman)
+* rgw: doesn't return 'x-timestamp' in header which is used by 'View Details' of OpenStack (`issue#8911 <http://tracker.ceph.com/issues/8911>`_, `pr#4584 <http://github.com/ceph/ceph/pull/4584>`_, Yehuda Sadeh)
+* rgw: init some manifest fields when handling explicit objs (`issue#11455 <http://tracker.ceph.com/issues/11455>`_, `pr#5729 <http://github.com/ceph/ceph/pull/5729>`_, Yehuda Sadeh)
+* rgw: logfile does not get chowned properly (`issue#12073 <http://tracker.ceph.com/issues/12073>`_, `pr#5233 <http://github.com/ceph/ceph/pull/5233>`_, Thorsten Behrens)
+* rgw: logrotate.conf calls service with wrong init script name (`issue#12043 <http://tracker.ceph.com/issues/12043>`_, `pr#5390 <http://github.com/ceph/ceph/pull/5390>`_, wuxingyi)
+* rgw: quota not respected in POST object (`issue#11323 <http://tracker.ceph.com/issues/11323>`_, `pr#4642 <http://github.com/ceph/ceph/pull/4642>`_, Sergey Arkhipov)
+* rgw: swift smoke test fails on TestAccountUTF8 (`issue#11091 <http://tracker.ceph.com/issues/11091>`_, `issue#11438 <http://tracker.ceph.com/issues/11438>`_, `issue#12939 <http://tracker.ceph.com/issues/12939>`_, `issue#12157 <http://tracker.ceph.com/issues/12157>`_, `issue#12158 <http://tracker.ceph.com/issues/12158>`_, `issue#12363 <http://tracker.ceph.com/issues/12363>`_, `pr#5532 <http://github.com/ceph/ceph/pull/5532>`_, Radoslaw Zarzynski, Orit Wasserman, Robin H. Johnson)
+* rgw: use correct objv_tracker for bucket instance (`issue#11416 <http://tracker.ceph.com/issues/11416>`_, `pr#4535 <http://github.com/ceph/ceph/pull/4535>`_, Yehuda Sadeh)
+* tests: ceph-fuse crash in test_client_recovery (`issue#12673 <http://tracker.ceph.com/issues/12673>`_, `pr#5813 <http://github.com/ceph/ceph/pull/5813>`_, Loic Dachary)
+* tests: kernel_untar_build fails on EL7 (`issue#11758 <http://tracker.ceph.com/issues/11758>`_, `pr#6000 <http://github.com/ceph/ceph/pull/6000>`_, Greg Farnum)
+* tests: qemu workunit refers to apt-mirror.front.sepia.ceph.com (`issue#13420 <http://tracker.ceph.com/issues/13420>`_, `pr#6328 <http://github.com/ceph/ceph/pull/6328>`_, Yuan Zhou, Sage Weil)
+* tools:  src/ceph-disk : disk zap sgdisk invocation (`issue#11143 <http://tracker.ceph.com/issues/11143>`_, `pr#4636 <http://github.com/ceph/ceph/pull/4636>`_, Thorsten Behrens, Owen Synge)
+* tools: ceph-disk: sometimes the journal symlink is not created (`issue#10146 <http://tracker.ceph.com/issues/10146>`_, `pr#5541 <http://github.com/ceph/ceph/pull/5541>`_, Dan van der Ster)
+* tools: ceph-disk: support NVMe device partitions (`issue#11612 <http://tracker.ceph.com/issues/11612>`_, `pr#4771 <http://github.com/ceph/ceph/pull/4771>`_, Ilja Slepnev)
+* tools: ceph-post-file fails on rhel7 (`issue#11836 <http://tracker.ceph.com/issues/11836>`_, `pr#5037 <http://github.com/ceph/ceph/pull/5037>`_, Joseph McDonald, Sage Weil)
+* tools: ceph_argparse_flag has no regular 3rd parameter (`issue#11543 <http://tracker.ceph.com/issues/11543>`_, `pr#4582 <http://github.com/ceph/ceph/pull/4582>`_, Thorsten Behrens)
+* tools: use a new disk as journal disk,ceph-disk prepare fail (`issue#10983 <http://tracker.ceph.com/issues/10983>`_, `pr#4630 <http://github.com/ceph/ceph/pull/4630>`_, Loic Dachary)
+
+
+v0.80.10 Firefly
+================
+
+This is a bugfix release for Firefly.
+
+We recommend that all Firefly users upgrade.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.10.txt>`.
+
+Notable Changes
+---------------
+
+* build/ops: ceph.spec.in: package mkcephfs on EL6 (`issue#11955 <http://tracker.ceph.com/issues/11955>`_, `pr#4924 <http://github.com/ceph/ceph/pull/4924>`_, Ken Dreyer)
+* build/ops: debian: ceph-test and rest-bench debug packages should require their respective binary packages (`issue#11673 <http://tracker.ceph.com/issues/11673>`_, `pr#4766 <http://github.com/ceph/ceph/pull/4766>`_, Ken Dreyer)
+* build/ops: run RGW as root (`issue#11453 <http://tracker.ceph.com/issues/11453>`_, `pr#4638 <http://github.com/ceph/ceph/pull/4638>`_, Ken Dreyer)
+* common: messages/MWatchNotify: include an error code in the message (`issue#9193 <http://tracker.ceph.com/issues/9193>`_, `pr#3944 <http://github.com/ceph/ceph/pull/3944>`_, Sage Weil)
+* common: Rados.shutdown() dies with Illegal instruction (core dumped) (`issue#10153 <http://tracker.ceph.com/issues/10153>`_, `pr#3963 <http://github.com/ceph/ceph/pull/3963>`_, Federico Simoncelli)
+* common: SimpleMessenger: allow RESETSESSION whenever we forget an endpoint (`issue#10080 <http://tracker.ceph.com/issues/10080>`_, `pr#3915 <http://github.com/ceph/ceph/pull/3915>`_, Greg Farnum)
+* common: WorkQueue: make wait timeout on empty queue configurable (`issue#10817 <http://tracker.ceph.com/issues/10817>`_, `pr#3941 <http://github.com/ceph/ceph/pull/3941>`_, Samuel Just)
+* crush: set_choose_tries = 100 for erasure code rulesets (`issue#10353 <http://tracker.ceph.com/issues/10353>`_, `pr#3824 <http://github.com/ceph/ceph/pull/3824>`_, Loic Dachary)
+* doc: backport ceph-disk man page to Firefly (`issue#10724 <http://tracker.ceph.com/issues/10724>`_, `pr#3936 <http://github.com/ceph/ceph/pull/3936>`_, Nilamdyuti Goswami)
+* doc: Fix ceph command manpage to match ceph -h (`issue#10676 <http://tracker.ceph.com/issues/10676>`_, `pr#3996 <http://github.com/ceph/ceph/pull/3996>`_, David Zafman)
+* fs: mount.ceph: avoid spurious error message (`issue#10351 <http://tracker.ceph.com/issues/10351>`_, `pr#3927 <http://github.com/ceph/ceph/pull/3927>`_, Yan, Zheng)
+* librados: Fix memory leak in python rados bindings (`issue#10723 <http://tracker.ceph.com/issues/10723>`_, `pr#3935 <http://github.com/ceph/ceph/pull/3935>`_, Josh Durgin)
+* librados: fix resources leakage in RadosClient::connect() (`issue#10425 <http://tracker.ceph.com/issues/10425>`_, `pr#3828 <http://github.com/ceph/ceph/pull/3828>`_, Radoslaw Zarzynski)
+* librados: Translate operation flags from C APIs (`issue#10497 <http://tracker.ceph.com/issues/10497>`_, `pr#3930 <http://github.com/ceph/ceph/pull/3930>`_, Matt Richards)
+* librbd: acquire cache_lock before refreshing parent (`issue#5488 <http://tracker.ceph.com/issues/5488>`_, `pr#4206 <http://github.com/ceph/ceph/pull/4206>`_, Jason Dillaman)
+* librbd: snap_remove should ignore -ENOENT errors (`issue#11113 <http://tracker.ceph.com/issues/11113>`_, `pr#4245 <http://github.com/ceph/ceph/pull/4245>`_, Jason Dillaman)
+* mds: fix assertion caused by system clock backwards (`issue#11053 <http://tracker.ceph.com/issues/11053>`_, `pr#3970 <http://github.com/ceph/ceph/pull/3970>`_, Yan, Zheng)
+* mon: ignore osd failures from before up_from (`issue#10762 <http://tracker.ceph.com/issues/10762>`_, `pr#3937 <http://github.com/ceph/ceph/pull/3937>`_, Sage Weil)
+* mon: MonCap: take EntityName instead when expanding profiles (`issue#10844 <http://tracker.ceph.com/issues/10844>`_, `pr#3942 <http://github.com/ceph/ceph/pull/3942>`_, Joao Eduardo Luis)
+* mon: Monitor: fix timecheck rounds period (`issue#10546 <http://tracker.ceph.com/issues/10546>`_, `pr#3932 <http://github.com/ceph/ceph/pull/3932>`_, Joao Eduardo Luis)
+* mon: OSDMonitor: do not trust small values in osd epoch cache (`issue#10787 <http://tracker.ceph.com/issues/10787>`_, `pr#3823 <http://github.com/ceph/ceph/pull/3823>`_, Sage Weil)
+* mon: OSDMonitor: fallback to json-pretty in case of invalid formatter (`issue#9538 <http://tracker.ceph.com/issues/9538>`_, `pr#4475 <http://github.com/ceph/ceph/pull/4475>`_, Loic Dachary)
+* mon: PGMonitor: several stats output error fixes (`issue#10257 <http://tracker.ceph.com/issues/10257>`_, `pr#3826 <http://github.com/ceph/ceph/pull/3826>`_, Joao Eduardo Luis)
+* objecter: fix map skipping (`issue#9986 <http://tracker.ceph.com/issues/9986>`_, `pr#3952 <http://github.com/ceph/ceph/pull/3952>`_, Ding Dinghua)
+* osd: cache tiering: fix the atime logic of the eviction (`issue#9915 <http://tracker.ceph.com/issues/9915>`_, `pr#3949 <http://github.com/ceph/ceph/pull/3949>`_, Zhiqiang Wang)
+* osd: cancel_pull: requeue waiters (`issue#11244 <http://tracker.ceph.com/issues/11244>`_, `pr#4415 <http://github.com/ceph/ceph/pull/4415>`_, Samuel Just)
+* osd: check that source OSD is valid for MOSDRepScrub (`issue#9555 <http://tracker.ceph.com/issues/9555>`_, `pr#3947 <http://github.com/ceph/ceph/pull/3947>`_, Sage Weil)
+* osd: DBObjectMap: lock header_lock on sync() (`issue#9891 <http://tracker.ceph.com/issues/9891>`_, `pr#3948 <http://github.com/ceph/ceph/pull/3948>`_, Samuel Just)
+* osd: do not ignore deleted pgs on startup (`issue#10617 <http://tracker.ceph.com/issues/10617>`_, `pr#3933 <http://github.com/ceph/ceph/pull/3933>`_, Sage Weil)
+* osd: ENOENT on clone (`issue#11199 <http://tracker.ceph.com/issues/11199>`_, `pr#4385 <http://github.com/ceph/ceph/pull/4385>`_, Samuel Just)
+* osd: erasure-code-profile set races with erasure-code-profile rm (`issue#11144 <http://tracker.ceph.com/issues/11144>`_, `pr#4383 <http://github.com/ceph/ceph/pull/4383>`_, Loic Dachary)
+* osd: FAILED assert(soid < scrubber.start || soid >= scrubber.end) (`issue#11156 <http://tracker.ceph.com/issues/11156>`_, `pr#4185 <http://github.com/ceph/ceph/pull/4185>`_, Samuel Just)
+* osd: FileJournal: fix journalq population in do_read_entry() (`issue#6003 <http://tracker.ceph.com/issues/6003>`_, `pr#3960 <http://github.com/ceph/ceph/pull/3960>`_, Samuel Just)
+* osd: fix negative degraded objects during backfilling (`issue#7737 <http://tracker.ceph.com/issues/7737>`_, `pr#4021 <http://github.com/ceph/ceph/pull/4021>`_, Guang Yang)
+* osd: get the currently atime of the object in cache pool for eviction (`issue#9985 <http://tracker.ceph.com/issues/9985>`_, `pr#3950 <http://github.com/ceph/ceph/pull/3950>`_, Sage Weil)
+* osd: load_pgs: we need to handle the case where an upgrade from earlier versions which ignored non-existent pgs resurrects a pg with a prehistoric osdmap (`issue#11429 <http://tracker.ceph.com/issues/11429>`_, `pr#4556 <http://github.com/ceph/ceph/pull/4556>`_, Samuel Just)
+* osd: ObjectStore: Don't use largest_data_off to calc data_align. (`issue#10014 <http://tracker.ceph.com/issues/10014>`_, `pr#3954 <http://github.com/ceph/ceph/pull/3954>`_, Jianpeng Ma)
+* osd: osd_types: op_queue_age_hist and fs_perf_stat should be in osd_stat_t::o... (`issue#10259 <http://tracker.ceph.com/issues/10259>`_, `pr#3827 <http://github.com/ceph/ceph/pull/3827>`_, Samuel Just)
+* osd: PG::actingset should be used when checking the number of acting OSDs for... (`issue#11454 <http://tracker.ceph.com/issues/11454>`_, `pr#4453 <http://github.com/ceph/ceph/pull/4453>`_, Guang Yang)
+* osd: PG::all_unfound_are_queried_or_lost for non-existent osds (`issue#10976 <http://tracker.ceph.com/issues/10976>`_, `pr#4416 <http://github.com/ceph/ceph/pull/4416>`_, Mykola Golub)
+* osd: PG: always clear_primary_state (`issue#10059 <http://tracker.ceph.com/issues/10059>`_, `pr#3955 <http://github.com/ceph/ceph/pull/3955>`_, Samuel Just)
+* osd: PGLog.h: 279: FAILED assert(log.log.size() == log_keys_debug.size()) (`issue#10718 <http://tracker.ceph.com/issues/10718>`_, `pr#4382 <http://github.com/ceph/ceph/pull/4382>`_, Samuel Just)
+* osd: PGLog: include rollback_info_trimmed_to in (read|write)_log (`issue#10157 <http://tracker.ceph.com/issues/10157>`_, `pr#3964 <http://github.com/ceph/ceph/pull/3964>`_, Samuel Just)
+* osd: pg stuck stale after create with activation delay (`issue#11197 <http://tracker.ceph.com/issues/11197>`_, `pr#4384 <http://github.com/ceph/ceph/pull/4384>`_, Samuel Just)
+* osd: ReplicatedPG: fail a non-blocking flush if the object is being scrubbed (`issue#8011 <http://tracker.ceph.com/issues/8011>`_, `pr#3943 <http://github.com/ceph/ceph/pull/3943>`_, Samuel Just)
+* osd: ReplicatedPG::on_change: clean up callbacks_for_degraded_object (`issue#8753 <http://tracker.ceph.com/issues/8753>`_, `pr#3940 <http://github.com/ceph/ceph/pull/3940>`_, Samuel Just)
+* osd: ReplicatedPG::scan_range: an object can disappear between the list and t... (`issue#10150 <http://tracker.ceph.com/issues/10150>`_, `pr#3962 <http://github.com/ceph/ceph/pull/3962>`_, Samuel Just)
+* osd: requeue blocked op before flush it was blocked on (`issue#10512 <http://tracker.ceph.com/issues/10512>`_, `pr#3931 <http://github.com/ceph/ceph/pull/3931>`_, Sage Weil)
+* rgw: check for timestamp for s3 keystone auth (`issue#10062 <http://tracker.ceph.com/issues/10062>`_, `pr#3958 <http://github.com/ceph/ceph/pull/3958>`_, Abhishek Lekshmanan)
+* rgw: civetweb should use unique request id (`issue#11720 <http://tracker.ceph.com/issues/11720>`_, `pr#4780 <http://github.com/ceph/ceph/pull/4780>`_, Orit Wasserman)
+* rgw: don't allow negative / invalid content length (`issue#11890 <http://tracker.ceph.com/issues/11890>`_, `pr#4829 <http://github.com/ceph/ceph/pull/4829>`_, Yehuda Sadeh)
+* rgw: fail s3 POST auth if keystone not configured (`issue#10698 <http://tracker.ceph.com/issues/10698>`_, `pr#3966 <http://github.com/ceph/ceph/pull/3966>`_, Yehuda Sadeh)
+* rgw: flush xml header on get acl request (`issue#10106 <http://tracker.ceph.com/issues/10106>`_, `pr#3961 <http://github.com/ceph/ceph/pull/3961>`_, Yehuda Sadeh)
+* rgw: generate new tag for object when setting object attrs (`issue#11256 <http://tracker.ceph.com/issues/11256>`_, `pr#4571 <http://github.com/ceph/ceph/pull/4571>`_, Yehuda Sadeh)
+* rgw: generate the "Date" HTTP header for civetweb. (`issue#11871,11891 <http://tracker.ceph.com/issues/11871,11891>`_, `pr#4851 <http://github.com/ceph/ceph/pull/4851>`_, Radoslaw Zarzynski)
+* rgw: keystone token cache does not work correctly (`issue#11125 <http://tracker.ceph.com/issues/11125>`_, `pr#4414 <http://github.com/ceph/ceph/pull/4414>`_, Yehuda Sadeh)
+* rgw: merge manifests correctly when there's prefix override (`issue#11622 <http://tracker.ceph.com/issues/11622>`_, `pr#4697 <http://github.com/ceph/ceph/pull/4697>`_, Yehuda Sadeh)
+* rgw: send appropriate op to cancel bucket index pending operation (`issue#10770 <http://tracker.ceph.com/issues/10770>`_, `pr#3938 <http://github.com/ceph/ceph/pull/3938>`_, Yehuda Sadeh)
+* rgw: shouldn't need to disable rgw_socket_path if frontend is configured (`issue#11160 <http://tracker.ceph.com/issues/11160>`_, `pr#4275 <http://github.com/ceph/ceph/pull/4275>`_, Yehuda Sadeh)
+* rgw: Swift API. Dump container's custom metadata. (`issue#10665 <http://tracker.ceph.com/issues/10665>`_, `pr#3934 <http://github.com/ceph/ceph/pull/3934>`_, Dmytro Iurchenko)
+* rgw: Swift API. Support for X-Remove-Container-Meta-{key} header. (`issue#10475 <http://tracker.ceph.com/issues/10475>`_, `pr#3929 <http://github.com/ceph/ceph/pull/3929>`_, Dmytro Iurchenko)
+* rgw: use correct objv_tracker for bucket instance (`issue#11416 <http://tracker.ceph.com/issues/11416>`_, `pr#4379 <http://github.com/ceph/ceph/pull/4379>`_, Yehuda Sadeh)
+* tests: force checkout of submodules (`issue#11157 <http://tracker.ceph.com/issues/11157>`_, `pr#4079 <http://github.com/ceph/ceph/pull/4079>`_, Loic Dachary)
+* tools: Backport ceph-objectstore-tool changes to firefly (`issue#12327 <http://tracker.ceph.com/issues/12327>`_, `pr#3866 <http://github.com/ceph/ceph/pull/3866>`_, David Zafman)
+* tools: ceph-objectstore-tool: Output only unsupported features when incomatible (`issue#11176 <http://tracker.ceph.com/issues/11176>`_, `pr#4126 <http://github.com/ceph/ceph/pull/4126>`_, David Zafman)
+* tools: ceph-objectstore-tool: Use exit status 11 for incompatible import attemp... (`issue#11139 <http://tracker.ceph.com/issues/11139>`_, `pr#4129 <http://github.com/ceph/ceph/pull/4129>`_, David Zafman)
+* tools: Fix do_autogen.sh so that -L is allowed (`issue#11303 <http://tracker.ceph.com/issues/11303>`_, `pr#4247 <http://github.com/ceph/ceph/pull/4247>`_, Alfredo Deza)
+
+v0.80.9 Firefly
+===============
+
+This is a bugfix release for firefly.  It fixes a performance
+regression in librbd, an important CRUSH misbehavior (see below), and
+several RGW bugs.  We have also backported support for flock/fcntl
+locks to ceph-fuse and libcephfs.
+
+We recommend that all Firefly users upgrade.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.9.txt>`.
+
+Adjusting CRUSH maps
+--------------------
+
+* This point release fixes several issues with CRUSH that trigger
+  excessive data migration when adjusting OSD weights.  These are most
+  obvious when a very small weight change (e.g., a change from 0 to
+  .01) triggers a large amount of movement, but the same set of bugs
+  can also lead to excessive (though less noticeable) movement in
+  other cases.
+
+  However, because the bug may already have affected your cluster,
+  fixing it may trigger movement *back* to the more correct location.
+  For this reason, you must manually opt-in to the fixed behavior.
+
+  In order to set the new tunable to correct the behavior::
+
+     ceph osd crush set-tunable straw_calc_version 1
+
+  Note that this change will have no immediate effect.  However, from
+  this point forward, any 'straw' bucket in your CRUSH map that is
+  adjusted will get non-buggy internal weights, and that transition
+  may trigger some rebalancing.
+
+  You can estimate how much rebalancing will eventually be necessary
+  on your cluster with::
+
+     ceph osd getcrushmap -o /tmp/cm
+     crushtool -i /tmp/cm --num-rep 3 --test --show-mappings > /tmp/a 2>&1
+     crushtool -i /tmp/cm --set-straw-calc-version 1 -o /tmp/cm2
+     crushtool -i /tmp/cm2 --reweight -o /tmp/cm2
+     crushtool -i /tmp/cm2 --num-rep 3 --test --show-mappings > /tmp/b 2>&1
+     wc -l /tmp/a                          # num total mappings
+     diff -u /tmp/a /tmp/b | grep -c ^+    # num changed mappings
+
+   Divide the number of changed lines by the total number of lines in
+   /tmp/a.  We've found that most clusters are under 10%.
+
+   You can force all of this rebalancing to happen at once with::
+
+     ceph osd crush reweight-all
+
+   Otherwise, it will happen at some unknown point in the future when
+   CRUSH weights are next adjusted.
+
+Notable Changes
+---------------
+
+* ceph-fuse: flock, fcntl lock support (Yan, Zheng, Greg Farnum)
+* crush: fix straw bucket weight calculation, add straw_calc_version tunable (#10095 Sage Weil)
+* crush: fix tree bucket (Rongzu Zhu)
+* crush: fix underflow of tree weights (Loic Dachary, Sage Weil)
+* crushtool: add --reweight (Sage Weil)
+* librbd: complete pending operations before losing image (#10299 Jason Dillaman)
+* librbd: fix read caching performance regression (#9854 Jason Dillaman)
+* librbd: gracefully handle deleted/renamed pools (#10270 Jason Dillaman)
+* mon: fix dump of chooseleaf_vary_r tunable (Sage Weil)
+* osd: fix PG ref leak in snaptrimmer on peering (#10421 Kefu Chai)
+* osd: handle no-op write with snapshot (#10262 Sage Weil)
+* radosgw-admin: create subuser when creating user (#10103 Yehuda Sadeh)
+* rgw: change multipart uplaod id magic (#10271 Georgio Dimitrakakis, Yehuda Sadeh)
+* rgw: don't overwrite bucket/object owner when setting ACLs (#10978 Yehuda Sadeh)
+* rgw: enable IPv6 for embedded civetweb (#10965 Yehuda Sadeh)
+* rgw: fix partial swift GET (#10553 Yehuda Sadeh)
+* rgw: fix quota disable (#9907 Dong Lei)
+* rgw: index swift keys appropriately (#10471 Hemant Burman, Yehuda Sadeh)
+* rgw: make setattrs update bucket index (#5595 Yehuda Sadeh)
+* rgw: pass civetweb configurables (#10907 Yehuda Sadeh)
+* rgw: remove swift user manifest (DLO) hash calculation (#9973 Yehuda Sadeh)
+* rgw: return correct len for 0-len objects (#9877 Yehuda Sadeh)
+* rgw: S3 object copy content-type fix (#9478 Yehuda Sadeh)
+* rgw: send ETag on S3 object copy (#9479 Yehuda Sadeh)
+* rgw: send HTTP status reason explicitly in fastcgi (Yehuda Sadeh)
+* rgw: set ulimit -n from sysvinit (el6) init script (#9587 Sage Weil)
+* rgw: update swift subuser permission masks when authenticating (#9918 Yehuda Sadeh)
+* rgw: URL decode query params correctly (#10271 Georgio Dimitrakakis, Yehuda Sadeh)
+* rgw: use attrs when reading object attrs (#10307 Yehuda Sadeh)
+* rgw: use \r\n for http headers (#9254 Benedikt Fraunhofer, Yehuda Sadeh)
+
+
+v0.80.8 Firefly
+===============
+
+This is a long-awaited bugfix release for firefly.  It has several
+imporant (but relatively rare) OSD peering fixes, performance issues
+when snapshots are trimmed, several RGW fixes, a paxos corner case
+fix, and some packaging updates.
+
+We recommend that all users for v0.80.x firefly upgrade when it is
+convenient to do so.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.8.txt>`.
+
+Notable Changes
+---------------
+
+* build: remove stack-execute bit from assembled code sections (#10114 Dan Mick)
+* ceph-disk: fix dmcrypt key permissions (#9785 Loic Dachary)
+* ceph-disk: fix keyring location (#9653 Loic Dachary)
+* ceph-disk: make partition checks more robust (#9721 #9665 Loic Dachary)
+* ceph: cleanly shut down librados context on shutdown (#8797 Dan Mick)
+* common: add $cctid config metavariable (#6228 Adam Crume)
+* crush: align rule and ruleset ids (#9675 Xiaoxi Chen)
+* crush: fix negative weight bug during create_or_move_item (#9998 Pawel Sadowski)
+* crush: fix potential buffer overflow in erasure rules (#9492 Johnu George)
+* debian: fix python-ceph -> ceph file movement (Sage Weil)
+* libcephfs,ceph-fuse: fix flush tid wraparound bug (#9869 Greg Farnum, Yan, Zheng)
+* libcephfs: close fd befure umount (#10415 Yan, Zheng)
+* librados: fix crash from C API when read timeout is enabled (#9582 Sage Weil)
+* librados: handle reply race with pool deletion (#10372 Sage Weil)
+* librbd: cap memory utilization for read requests (Jason Dillaman)
+* librbd: do not close a closed parent image on failure (#10030 Jason Dillaman)
+* librbd: fix diff tests (#10002 Josh Durgin)
+* librbd: protect list_children from invalid pools (#10123 Jason Dillaman)
+* make check improvemens (Loic Dachary)
+* mds: fix ctime updates (#9514 Greg Farnum)
+* mds: fix journal import tool (#10025 John Spray)
+* mds: fix rare NULL deref in cap flush handler (Greg Farnum)
+* mds: handle unknown lock messages (Yan, Zheng)
+* mds: store backtrace for straydir (Yan, Zheng)
+* mon: abort startup if disk is full (#9502 Joao Eduardo Luis)
+* mon: add paxos instrumentation (Sage Weil)
+* mon: fix double-free in rare OSD startup path (Sage Weil)
+* mon: fix osdmap trimming (#9987 Sage Weil)
+* mon: fix paxos corner cases (#9301 #9053 Sage Weil)
+* osd: cancel callback on blacklisted watchers (#8315 Samuel Just)
+* osd: cleanly abort set-alloc-hint operations during upgrade (#9419 David Zafman)
+* osd: clear rollback PG metadata on PG deletion (#9293 Samuel Just)
+* osd: do not abort deep scrub if hinfo is missing (#10018 Loic Dachary)
+* osd: erasure-code regression tests (Loic Dachary)
+* osd: fix distro metadata reporting for SUSE (#8654 Danny Al-Gaaf)
+* osd: fix full OSD checks during backfill (#9574 Samuel Just)
+* osd: fix ioprio parsing (#9677 Loic Dachary)
+* osd: fix journal direct-io shutdown (#9073 Mark Kirkwood, Ma Jianpeng, Somnath Roy)
+* osd: fix journal dump (Ma Jianpeng)
+* osd: fix occasional stall during peering or activation (Sage Weil)
+* osd: fix past_interval display bug (#9752 Loic Dachary)
+* osd: fix rare crash triggered by admin socket dump_ops_in_filght (#9916 Dong Lei)
+* osd: fix snap trimming performance issues (#9487 #9113 Samuel Just, Sage Weil, Dan van der Ster, Florian Haas)
+* osd: fix snapdir handling on cache eviction (#8629 Sage Weil)
+* osd: handle map gaps in map advance code (Sage Weil)
+* osd: handle undefined CRUSH results in interval check (#9718 Samuel Just)
+* osd: include shard in JSON dump of ghobject (#10063 Loic Dachary)
+* osd: make backfill reservation denial handling more robust (#9626 Samuel Just)
+* osd: make misdirected op checks handle EC + primary affinity (#9835 Samuel Just, Sage Weil)
+* osd: mount XFS with inode64 by default (Sage Weil)
+* osd: other misc bugs (#9821 #9875 Samuel Just)
+* rgw: add .log to default log path (#9353 Alexandre Marangone)
+* rgw: clean up fcgi request context (#10194 Yehuda Sadeh)
+* rgw: convet header underscores to dashes (#9206 Yehuda Sadeh)
+* rgw: copy object data if copy target is in different pool (#9039 Yehuda Sadeh)
+* rgw: don't try to authenticate CORS peflight request (#8718 Robert Hubbard, Yehuda Sadeh)
+* rgw: fix civetweb URL decoding (#8621 Yehuda Sadeh)
+* rgw: fix hash calculation during PUT (Yehuda Sadeh)
+* rgw: fix misc bugs (#9089 #9201 Yehuda Sadeh)
+* rgw: fix object tail test (#9226 Sylvain Munaut, Yehuda Sadeh)
+* rgw: make sysvinit script run rgw under systemd context as needed (#10125 Loic Dachary)
+* rgw: separate civetweb log from rgw log (Yehuda Sadeh)
+* rgw: set length for keystone token validations (#7796 Mark Kirkwood, Yehuda Sadeh)
+* rgw: subuser creation fixes (#8587 Yehuda Sadeh)
+* rpm: misc packaging improvements (Sandon Van Ness, Dan Mick, Erik Logthenberg, Boris Ranto)
+* rpm: use standard udev rules for CentOS7/RHEL7 (#9747 Loic Dachary)
+
+
+v0.80.7 Firefly
+===============
+
+This release fixes a few critical issues with v0.80.6, particularly
+with clusters running mixed versions.
+
+We recommend that all v0.80.x Firefly users upgrade to this release.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.7.txt>`.
+
+Notable Changes
+---------------
+
+* osd: fix invalid memory reference in log trimming (#9731 Samuel Just)
+* osd: fix use-after-free in cache tiering code (#7588 Sage Weil)
+* osd: remove bad backfill assertion for mixed-version clusters (#9696 Samuel Just)
+
+
+
+v0.80.6 Firefly
+===============
+
+This is a major bugfix release for firefly, fixing a range of issues
+in the OSD and monitor, particularly with cache tiering.  There are
+also important fixes in librados, with the watch/notify mechanism used
+by librbd, and in radosgw.
+
+A few pieces of new functionality of been backported, including improved
+'ceph df' output (view amount of writeable space per pool), support for
+non-default cluster names when using sysvinit or systemd, and improved
+(and fixed) support for dmcrypt.
+
+We recommend that all v0.80.x Firefly users upgrade to this release.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.6.txt>`.
+
+Notable Changes
+---------------
+
+* build: fix atomic64_t on i386 (#8969 Sage Weil)
+* build: fix build on alpha (Michael Cree, Dmitry Smirnov)
+* build: fix build on hppa (Dmitry Smirnov)
+* build: fix yasm detection on x32 arch (Sage Weil)
+* ceph-disk: fix 'list' function with dmcrypt (Sage Weil)
+* ceph-disk: fix dmcrypt support (Alfredo Deza)
+* ceph: allow non-default cluster to be specified (#8944)
+* common: fix dup log messages to mon (#9080 Sage Weil)
+* global: write pid file when -f is used (systemd, upstart) (Alexandre Oliva)
+* librados: fix crash when read timeout is enabled (#9362 Matthias Kiefer, Sage Weil)
+* librados: fix lock leaks in error paths (#9022 Pavan Rallabhandi)
+* librados: fix watch resend on PG acting set change (#9220 Samuel Just)
+* librados: python: fix aio_read handling with \0 (Mohammad Salehe)
+* librbd: add interface to invalidate cached data (Josh Durgin)
+* librbd: fix crash when using clone of flattened image (#8845 Josh Durgin)
+* librbd: fix error path cleanup on open (#8912 Josh Durgin)
+* librbd: fix null pointer check (Danny Al-Gaaf)
+* librbd: limit dirty object count (Haomai Wang)
+* mds: fix rstats for root and mdsdir (Yan, Zheng)
+* mon: add 'get' command for new cache tier pool properties (Joao Eduardo Luis)
+* mon: add 'osd pool get-quota' (#8523 Joao Eduardo Luis)
+* mon: add cluster fingerprint (Sage Weil)
+* mon: disallow nonsensical cache-mode transitions (#8155 Joao Eduardo Luis)
+* mon: fix cache tier rounding error on i386 (Sage Weil)
+* mon: fix occasional memory leak (#9176 Sage Weil)
+* mon: fix reported latency for 'osd perf' (#9269 Samuel Just)
+* mon: include 'max avail' in 'ceph df' output (Sage Weil, Xioaxi Chen)
+* mon: persistently mark pools where scrub may find incomplete clones (#8882 Sage Weil)
+* mon: preload erasure plugins (Loic Dachary)
+* mon: prevent cache-specific settings on non-tier pools (#8696 Joao Eduardo Luis)
+* mon: reduce log spam (Aanchal Agrawal, Sage Weil)
+* mon: warn when cache pools have no hit_sets enabled (Sage Weil)
+* msgr: fix trivial memory leak (Sage Weil)
+* osd: automatically scrub PGs with invalid stats (#8147 Sage Weil)
+* osd: avoid sharing PG metadata that is not durable (Samuel Just)
+* osd: cap hit_set size (#9339 Samuel Just)
+* osd: create default erasure profile if needed (#8601 Loic Dachary)
+* osd: dump tid as JSON int (not string)  where appropriate (Joao Eduardo Luis)
+* osd: encode blacklist in deterministic order (#9211 Sage Weil)
+* osd: fix behavior when cache tier has no hit_sets enabled (#8982 Sage Weil)
+* osd: fix cache tier flushing of snapshots (#9054 Samuel Just)
+* osd: fix cache tier op ordering when going from full to non-full (#8931 Sage Weil)
+* osd: fix crash on dup recovery reservation (#8863 Sage Weil)
+* osd: fix division by zero when pg_num adjusted with no OSDs (#9052 Sage Weil)
+* osd: fix hint crash in experimental keyvaluestore_dev backend (Hoamai Wang)
+* osd: fix leak in copyfrom cancellation (#8894 Samuel Just)
+* osd: fix locking for copyfrom finish (#8889 Sage Weil)
+* osd: fix long filename handling in backend (#8701 Sage Weil)
+* osd: fix min_size check with backfill (#9497 Samuel Just)
+* osd: fix mount/remount sync race (#9144 Sage Weil)
+* osd: fix object listing + erasure code bug (Guang Yang)
+* osd: fix race on reconnect to failed OSD (#8944 Greg Farnum)
+* osd: fix recovery reservation deadlock (Samuel Just)
+* osd: fix tiering agent arithmetic for negative values (#9082 Karan Singh)
+* osd: improve shutdown order (#9218 Sage Weil)
+* osd: improve subop discard logic (#9259 Samuel Just)
+* osd: introduce optional sleep, io priority for scrub and snap trim (Sage Weil)
+* osd: make scrub check for and remove stale erasure-coded objects (Samuel Just)
+* osd: misc fixes (#9481 #9482 #9179 Sameul Just)
+* osd: mix keyvaluestore_dev improvements (Haomai Wang)
+* osd: only require CRUSH features for rules that are used (#8963 Sage Weil)
+* osd: preload erasure plugins on startup (Loic Dachary)
+* osd: prevent PGs from falling behind when consuming OSDMaps (#7576 Sage Weil)
+* osd: prevent old clients from using tiered pools (#8714 Sage Weil)
+* osd: set min_size on erasure pools to data chunk count (Sage Weil)
+* osd: trim old erasure-coded objects more aggressively (Samuel Just)
+* rados: enforce erasure code alignment (Lluis Pamies-Juarez)
+* rgw: align object stripes with erasure pool alignment (#8442 Yehuda Sadeh)
+* rgw: don't send error body on HEAD for civetweb (#8539 Yehuda Sadeh)
+* rgw: fix crash in CORS preflight request (Yehuda Sadeh)
+* rgw: fix decoding of + in URL (#8702 Brian Rak)
+* rgw: fix object removal on object create (#8972 Patrycja Szabowska, Yehuda Sadeh)
+* systemd: use systemd-run when starting radosgw (JuanJose Galvez)
+* sysvinit: support non-default cluster name (Alfredo Deza)
+
+
+v0.80.5 Firefly
+===============
+
+This release fixes a few important bugs in the radosgw and fixes
+several packaging and environment issues, including OSD log rotation,
+systemd environments, and daemon restarts on upgrade.
+
+We recommend that all v0.80.x Firefly users upgrade, particularly if they
+are using upstart, systemd, or radosgw.
+
+Notable Changes
+---------------
+
+* ceph-dencoder: do not needlessly link to librgw, librados, etc. (Sage Weil)
+* do not needlessly link binaries to leveldb (Sage Weil)
+* mon: fix mon crash when no auth keys are present (#8851, Joao Eduardo Luis)
+* osd: fix cleanup (and avoid occasional crash) during shutdown (#7981, Sage Weil)
+* osd: fix log rotation under upstart (Sage Weil)
+* rgw: fix multipart upload when object has irregular size (#8846, Yehuda Sadeh, Sylvain Munaut)
+* rgw: improve bucket listing S3 compatibility (#8858, Yehuda Sadeh)
+* rgw: improve delimited bucket listing (Yehuda Sadeh)
+* rpm: do not restart daemons on upgrade (#8849, Alfredo Deza)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.5.txt>`.
+
+v0.80.4 Firefly
+===============
+
+This Firefly point release fixes an potential data corruption problem
+when ceph-osd daemons run on top of XFS and service Firefly librbd
+clients.  A recently added allocation hint that RBD utilizes triggers
+an XFS bug on some kernels (Linux 3.2, and likely others) that leads
+to data corruption and deep-scrub errors (and inconsistent PGs).  This
+release avoids the situation by disabling the allocation hint until we
+can validate which kernels are affected and/or are known to be safe to
+use the hint on.
+
+We recommend that all v0.80.x Firefly users urgently upgrade,
+especially if they are using RBD.
+
+Notable Changes
+---------------
+
+* osd: disable XFS extsize hint by default (#8830, Samuel Just)
+* rgw: fix extra data pool default name (Yehuda Sadeh)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.4.txt>`.
+
+
+v0.80.3 Firefly
+===============
+
+This is the third Firefly point release.  It includes a single fix
+for a radosgw regression that was discovered in v0.80.2 right after it
+was released.
+
+We recommand that all v0.80.x Firefly users upgrade.
+
+Notable Changes
+---------------
+
+* radosgw: fix regression in manifest decoding (#8804, Sage Weil)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.3.txt>`.
+
+
+v0.80.2 Firefly
+===============
+
+This is the second Firefly point release.  It contains a range of
+important fixes, including several bugs in the OSD cache tiering, some
+compatibility checks that affect upgrade situations, several radosgw
+bugs, and an irritating and unnecessary feature bit check that
+prevents older clients from communicating with a cluster with any
+erasure coded pools.
+
+One someone large change in this point release is that the ceph RPM
+package is separated into a ceph and ceph-common package, similar to
+Debian.  The ceph-common package contains just the client libraries
+without any of the server-side daemons.
+
+We recommend that all v0.80.x Firefly users skip this release and use
+v0.80.3.
+
+Notable Changes
+---------------
+
+* ceph-disk: better debug logging (Alfredo Deza)
+* ceph-disk: fix preparation of OSDs with dmcrypt (#6700, Stephen F Taylor)
+* ceph-disk: partprobe on prepare to fix dm-crypt (#6966, Eric Eastman)
+* do not require ERASURE_CODE feature from clients (#8556, Sage Weil)
+* libcephfs-java: build with older JNI headers (Greg Farnum)
+* libcephfs-java: fix build with gcj-jdk (Dmitry Smirnov)
+* librados: fix osd op tid for redirected ops (#7588, Samuel Just)
+* librados: fix rados_pool_list buffer bounds checks (#8447, Sage Weil)
+* librados: resend ops when pool overlay changes (#8305, Sage Weil)
+* librbd, ceph-fuse: reduce CPU overhead for clean object check in cache (Haomai Wang)
+* mon: allow deletion of cephfs pools (John Spray)
+* mon: fix default pool ruleset choice (#8373, John Spray)
+* mon: fix health summary for mon low disk warning (Sage Weil)
+* mon: fix 'osd pool set <pool> cache_target_full_ratio' (Geoffrey Hartz)
+* mon: fix quorum feature check (Greg Farnum)
+* mon: fix request forwarding in mixed firefly+dumpling clusters 9#8727, Joao Eduardo Luis)
+* mon: fix rule vs ruleset check in 'osd pool set ... crush_ruleset' command (John Spray)
+* mon: make osd 'down' count accurate (Sage Weil)
+* mon: set 'next commit' in primary-affinity reply (Ilya Dryomov)
+* mon: verify CRUSH features are supported by all mons (#8738, Greg Farnum)
+* msgr: fix sequence negotiation during connection reset (Guang Yang)
+* osd: block scrub on blocked objects (#8011, Samuel Just)
+* osd: call XFS hint ioctl less often (#8241, Ilya Dryomov)
+* osd: copy xattr spill out marker on clone (Haomai Wang)
+* osd: fix flush of snapped objects (#8334, Samuel Just)
+* osd: fix hashindex restart of merge operation (#8332, Samuel Just)
+* osd: fix osdmap subscription bug causing startup hang (Greg Farnum)
+* osd: fix potential null deref (#8328, Sage Weil)
+* osd: fix shutdown race (#8319, Sage Weil)
+* osd: handle 'none' in CRUSH results properly during peering (#8507, Samuel Just)
+* osd: set no spill out marker on new objects (Greg Farnum)
+* osd: skip op ordering debug checks on tiered pools (#8380, Sage Weil)
+* rados: enforce 'put' alignment (Lluis Pamies-Juarez)
+* rest-api: fix for 'rx' commands (Ailing Zhang)
+* rgw: calc user manifest etag and fix check (#8169, #8436, Yehuda Sadeh)
+* rgw: fetch attrs on multipart completion (#8452, Yehuda Sadeh, Sylvain Munaut)
+* rgw: fix buffer overflow for long instance ids (#8608, Yehuda Sadeh)
+* rgw: fix entity permission check on metadata put (#8428, Yehuda Sadeh)
+* rgw: fix multipart retry race (#8269, Yehuda Sadeh)
+* rpm: split ceph into ceph and ceph-common RPMs (Sandon Van Ness, Dan Mick)
+* sysvinit: continue startin daemons after failure doing mount (#8554, Sage Weil)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.2.txt>`.
+
+v0.80.1 Firefly
+===============
+
+This first Firefly point release fixes a few bugs, the most visible
+being a problem that prevents scrub from completing in some cases.
+
+Notable Changes
+---------------
+
+* osd: revert incomplete scrub fix (Samuel Just)
+* rgw: fix stripe calculation for manifest objects (Yehuda Sadeh)
+* rgw: improve handling, memory usage for abort reads (Yehuda Sadeh)
+* rgw: send Swift user manifest HTTP header (Yehuda Sadeh)
+* libcephfs, ceph-fuse: expose MDS session state via admin socket (Yan, Zheng)
+* osd: add simple throttle for snap trimming (Sage Weil)
+* monclient: fix possible hang from ill-timed monitor connection failure (Sage Weil)
+* osd: fix trimming of past HitSets (Sage Weil)
+* osd: fix whiteouts for non-writeback cache modes (Sage Weil)
+* osd: prevent divide by zero in tiering agent (David Zafman)
+* osd: prevent busy loop when tiering agent can do no work (David Zafman)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.80.1.txt>`.
+
+
+v0.80 Firefly
+=============
+
+This release will form the basis for our long-term supported release
+Firefly, v0.80.x.  The big new features are support for erasure coding
+and cache tiering, although a broad range of other features, fixes,
+and improvements have been made across the code base.  Highlights include:
+
+* *Erasure coding*: support for a broad range of erasure codes for lower
+  storage overhead and better data durability.
+* *Cache tiering*: support for creating 'cache pools' that store hot,
+  recently accessed objects with automatic demotion of colder data to
+  a base tier.  Typically the cache pool is backed by faster storage
+  devices like SSDs.
+* *Primary affinity*: Ceph now has the ability to skew selection of
+  OSDs as the "primary" copy, which allows the read workload to be
+  cheaply skewed away from parts of the cluster without migrating any
+  data.
+* *Key/value OSD backend* (experimental): An alternative storage backend
+  for Ceph OSD processes that puts all data in a key/value database like
+  leveldb.  This provides better performance for workloads dominated by
+  key/value operations (like radosgw bucket indices).
+* *Standalone radosgw* (experimental): The radosgw process can now run
+  in a standalone mode without an apache (or similar) web server or
+  fastcgi.  This simplifies deployment and can improve performance.
+
+We expect to maintain a series of stable releases based on v0.80
+Firefly for as much as a year.  In the meantime, development of Ceph
+continues with the next release, Giant, which will feature work on the
+CephFS distributed file system, more alternative storage backends
+(like RocksDB and f2fs), RDMA support, support for pyramid erasure
+codes, and additional functionality in the block device (RBD) like
+copy-on-read and multisite mirroring.
+
+
+Upgrade Sequencing
+------------------
+
+* If your existing cluster is running a version older than v0.67
+  Dumpling, please first upgrade to the latest Dumpling release before
+  upgrading to v0.80 Firefly.  Please refer to the `Dumpling upgrade`_
+  documentation.
+
+* We recommand adding the following to the [mon] section of your
+  ceph.conf prior to upgrade::
+
+    mon warn on legacy crush tunables = false
+
+  This will prevent health warnings due to the use of legacy CRUSH
+  placement.  Although it is possible to rebalance existing data
+  across your cluster (see the upgrade notes below), we do not
+  normally recommend it for production environments as a large amount
+  of data will move and there is a significant performance impact from
+  the rebalancing.
+
+* Upgrade daemons in the following order:
+
+    #. Monitors
+    #. OSDs
+    #. MDSs and/or radosgw
+
+  If the ceph-mds daemon is restarted first, it will wait until all
+  OSDs have been upgraded before finishing its startup sequence.  If
+  the ceph-mon daemons are not restarted prior to the ceph-osd
+  daemons, they will not correctly register their new capabilities
+  with the cluster and new features may not be usable until they are
+  restarted a second time.
+
+* Upgrade radosgw daemons together.  There is a subtle change in behavior
+  for multipart uploads that prevents a multipart request that was initiated
+  with a new radosgw from being completed by an old radosgw.
+
+
+Upgrading from v0.79
+--------------------
+
+* OSDMap's json-formatted dump changed for keys 'full' and 'nearfull'.
+  What was previously being outputted as 'true' or 'false' strings are
+  now being outputted 'true' and 'false' booleans according to json syntax.
+
+* HEALTH_WARN on 'mon osd down out interval == 0'. Having this option set
+  to zero on the leader acts much like having the 'noout' flag set.  This
+  warning will only be reported if the monitor getting the 'health' or
+  'status' request has this option set to zero.
+
+* Monitor 'auth' commands now require the mon 'x' capability.  This matches
+  dumpling v0.67.x and earlier, but differs from emperor v0.72.x.
+
+* A librados WATCH operation on a non-existent object now returns ENOENT;
+  previously it did not.
+
+* Librados interface change:  As there are no partial writes, the rados_write()
+  and rados_append() operations now return 0 on success like rados_write_full()
+  always has.  This includes the C++ interface equivalents and AIO return
+  values for the aio variants.
+
+* The radosgw init script (sysvinit) how requires that the 'host = ...' line in
+  ceph.conf, if present, match the short hostname (the output of 'hostname -s'),
+  not the fully qualified hostname or the (occasionally non-short) output of
+  'hostname'.  Failure to adjust this when upgrading from emperor or dumpling
+  may prevent the radosgw daemon from starting.
+
+Upgrading from v0.72 Emperor
+----------------------------
+
+* See notes above.
+
+* The 'ceph -s' or 'ceph status' command's 'num_in_osds' field in the
+  JSON and XML output has been changed from a string to an int.
+
+* The recently added 'ceph mds set allow_new_snaps' command's syntax
+  has changed slightly; it is now 'ceph mds set allow_new_snaps true'.
+  The 'unset' command has been removed; instead, set the value to
+  'false'.
+
+* The syntax for allowing snapshots is now 'mds set allow_new_snaps
+  <true|false>' instead of 'mds <set,unset> allow_new_snaps'.
+
+* 'rbd ls' on a pool which never held rbd images now exits with code
+  0. It outputs nothing in plain format, or an empty list in
+  non-plain format. This is consistent with the behavior for a pool
+  which used to hold images, but contains none. Scripts relying on
+  this behavior should be updated.
+
+* The MDS requires a new OSD operation TMAP2OMAP, added in this release.  When
+  upgrading, be sure to upgrade and restart the ceph-osd daemons before the
+  ceph-mds daemon.  The MDS will refuse to start if any up OSDs do not support
+  the new feature.
+
+* The 'ceph mds set_max_mds N' command is now deprecated in favor of
+  'ceph mds set max_mds N'.
+
+* The 'osd pool create ...' syntax has changed for erasure pools.
+
+* The default CRUSH rules and layouts are now using the 'bobtail'
+  tunables and defaults.  Upgaded clusters using the old values will
+  now present with a health WARN state.  This can be disabled by
+  adding 'mon warn on legacy crush tunables = false' to ceph.conf and
+  restarting the monitors.  Alternatively, you can switch to the new
+  tunables with 'ceph osd crush tunables firefly,' but keep in mind
+  that this will involve moving a *significant* portion of the data
+  already stored in the cluster and in a large cluster may take
+  several days to complete.  We do not recommend adjusting tunables on a
+  production cluster.
+
+* We now default to the 'bobtail' CRUSH tunable values that are first supported
+  by Ceph clients in bobtail (v0.56) and Linux kernel version v3.9.  If you
+  plan to access a newly created Ceph cluster with an older kernel client, you
+  should use 'ceph osd crush tunables legacy' to switch back to the legacy
+  behavior.  Note that making that change will likely result in some data
+  movement in the system, so adjust the setting before populating the new
+  cluster with data.
+
+* We now set the HASHPSPOOL flag on newly created pools (and new
+  clusters) by default.  Support for this flag first appeared in
+  v0.64; v0.67 Dumpling is the first major release that supports it.
+  It is first supported by the Linux kernel version v3.9.  If you plan
+  to access a newly created Ceph cluster with an older kernel or
+  clients (e.g, librados, librbd) from a pre-dumpling Ceph release,
+  you should add 'osd pool default flag hashpspool = false' to the
+  '[global]' section of your 'ceph.conf' prior to creating your
+  monitors (e.g., after 'ceph-deploy new' but before 'ceph-deploy mon
+  create ...').
+
+* The configuration option 'osd pool default crush rule' is deprecated
+  and replaced with 'osd pool default crush replicated ruleset'. 'osd
+  pool default crush rule' takes precedence for backward compatibility
+  and a deprecation warning is displayed when it is used.
+
+* As part of fix for #6796, 'ceph osd pool set <pool> <var> <arg>' now
+  receives <arg> as an integer instead of a string.  This affects how
+  'hashpspool' flag is set/unset: instead of 'true' or 'false', it now
+  must be '0' or '1'.
+
+* The behavior of the CRUSH 'indep' choose mode has been changed.  No
+  ceph cluster should have been using this behavior unless someone has
+  manually extracted a crush map, modified a CRUSH rule to replace
+  'firstn' with 'indep', recompiled, and reinjected the new map into
+  the cluster.  If the 'indep' mode is currently in use on a cluster,
+  the rule should be modified to use 'firstn' instead, and the
+  administrator should wait until any data movement completes before
+  upgrading.
+
+* The 'osd dump' command now dumps pool snaps as an array instead of an
+  object.
+
+
+Upgrading from v0.67 Dumpling
+-----------------------------
+
+* See notes above.
+
+* ceph-fuse and radosgw now use the same default values for the admin
+  socket and log file paths that the other daemons (ceph-osd,
+  ceph-mon, etc.) do.  If you run these daemons as non-root, you may
+  need to adjust your ceph.conf to disable these options or to adjust
+  the permissions on /var/run/ceph and /var/log/ceph.
+
+* The MDS now disallows snapshots by default as they are not
+  considered stable.  The command 'ceph mds set allow_snaps' will
+  enable them.
+
+* For clusters that were created before v0.44 (pre-argonaut, Spring
+  2012) and store radosgw data, the auto-upgrade from TMAP to OMAP
+  objects has been disabled.  Before upgrading, make sure that any
+  buckets created on pre-argonaut releases have been modified (e.g.,
+  by PUTing and then DELETEing an object from each bucket).  Any
+  cluster created with argonaut (v0.48) or a later release or not
+  using radosgw never relied on the automatic conversion and is not
+  affected by this change.
+
+* Any direct users of the 'tmap' portion of the librados API should be
+  aware that the automatic tmap -> omap conversion functionality has
+  been removed.
+
+* Most output that used K or KB (e.g., for kilobyte) now uses a
+  lower-case k to match the official SI convention.  Any scripts that
+  parse output and check for an upper-case K will need to be modified.
+
+* librados::Rados::pool_create_async() and librados::Rados::pool_delete_async()
+  don't drop a reference to the completion object on error, caller needs to take
+  care of that. This has never really worked correctly and we were leaking an
+  object
+
+* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
+  specified location, as that's a job for 'ceph osd crush add'.  It will
+  however continue to work just the same as long as the osd already exists
+  in the crush map.
+
+* The OSD now enforces that class write methods cannot both mutate an
+  object and return data.  The rbd.assign_bid method, the lone
+  offender, has been removed.  This breaks compatibility with
+  pre-bobtail librbd clients by preventing them from creating new
+  images.
+
+* librados now returns on commit instead of ack for synchronous calls.
+  This is a bit safer in the case where both OSDs and the client crash, and
+  is probably how it should have been acting from the beginning. Users are
+  unlikely to notice but it could result in lower performance in some
+  circumstances. Those who care should switch to using the async interfaces,
+  which let you specify safety semantics precisely.
+
+* The C++ librados AioComplete::get_version() method was incorrectly
+  returning an int (usually 32-bits).  To avoid breaking library
+  compatibility, a get_version64() method is added that returns the
+  full-width value.  The old method is deprecated and will be removed
+  in a future release.  Users of the C++ librados API that make use of
+  the get_version() method should modify their code to avoid getting a
+  value that is truncated from 64 to to 32 bits.
+
+
+Notable changes since v0.79
+---------------------------
+
+* ceph-fuse, libcephfs: fix several caching bugs (Yan, Zheng)
+* ceph-fuse: trim inodes in response to mds memory pressure (Yan, Zheng)
+* librados: fix inconsistencies in API error values (David Zafman)
+* librados: fix watch operations with cache pools (Sage Weil)
+* librados: new snap rollback operation (David Zafman)
+* mds: fix respawn (John Spray)
+* mds: misc bugs (Yan, Zheng)
+* mds: misc multi-mds fixes (Yan, Zheng)
+* mds: use shared_ptr for requests (Greg Farnum)
+* mon: fix peer feature checks (Sage Weil)
+* mon: require 'x' mon caps for auth operations (Joao Luis)
+* mon: shutdown when removed from mon cluster (Joao Luis)
+* msgr: fix locking bug in authentication (Josh Durgin)
+* osd: fix bug in journal replay/restart (Sage Weil)
+* osd: many many many bug fixes with cache tiering (Samuel Just)
+* osd: track omap and hit_set objects in pg stats (Samuel Just)
+* osd: warn if agent cannot enable due to invalid (post-split) stats (Sage Weil)
+* rados bench: track metadata for multiple runs separately (Guang Yang)
+* rgw: fixed subuser modify (Yehuda Sadeh)
+* rpm: fix redhat-lsb dependency (Sage Weil, Alfredo Deza)
+
+
+Notable changes since v0.72 Emperor
+-----------------------------------
+
+* buffer: some zero-copy groundwork (Josh Durgin)
+* build: misc improvements (Ken Dreyer)
+* ceph-conf: stop creating bogus log files (Josh Durgin, Sage Weil)
+* ceph-crush-location: new hook for setting CRUSH location of osd daemons on start)
+* ceph-disk: avoid fd0 (Loic Dachary)
+* ceph-disk: generalize path names, add tests (Loic Dachary)
+* ceph-disk: misc improvements for puppet (Loic Dachary)
+* ceph-disk: several bug fixes (Loic Dachary)
+* ceph-fuse: fix race for sync reads (Sage Weil)
+* ceph-fuse, libcephfs: fix several caching bugs (Yan, Zheng)
+* ceph-fuse: trim inodes in response to mds memory pressure (Yan, Zheng)
+* ceph-kvstore-tool: expanded command set and capabilities (Joao Eduardo Luis)
+* ceph.spec: fix build dependency (Loic Dachary)
+* common: bloom filter improvements (Sage Weil)
+* common: check preexisting admin socket for active daemon before removing (Loic Dachary)
+* common: fix aligned buffer allocation (Loic Dachary)
+* common: fix authentication on big-endian architectures (Dan Mick)
+* common: fix config variable substitution (Loic Dachary)
+* common: portability changes to support libc++ (Noah Watkins)
+* common: switch to unordered_map from hash_map (Noah Watkins)
+* config: recursive metavariable expansion (Loic Dachary)
+* crush: default to bobtail tunables (Sage Weil)
+* crush: fix off-by-one error in recent refactor (Sage Weil)
+* crush: many additional tests (Loic Dachary)
+* crush: misc fixes, cleanups (Loic Dachary)
+* crush: new rule steps to adjust retry attempts (Sage Weil)
+* crush, osd: s/rep/replicated/ for less confusion (Loic Dachary)
+* crush: refactor descend_once behavior; support set_choose*_tries for replicated rules (Sage Weil)
+* crush: usability and test improvements (Loic Dachary)
+* debian: change directory ownership between ceph and ceph-common (Sage Weil)
+* debian: integrate misc fixes from downstream packaging (James Page)
+* doc: big update to install docs (John Wilkins)
+* doc: many many install doc improvements (John Wilkins)
+* doc: many many updates (John Wilkins)
+* doc: misc fixes (David Moreau Simard, Kun Huang)
+* erasure-code: improve buffer alignment (Loic Dachary)
+* erasure-code: rewrite region-xor using vector operations (Andreas Peters)
+* init: fix startup ordering/timeout problem with OSDs (Dmitry Smirnov)
+* libcephfs: fix resource leak (Zheng Yan)
+* librados: add C API coverage for atomic write operations (Christian Marie)
+* librados: fix inconsistencies in API error values (David Zafman)
+* librados: fix throttle leak (and eventual deadlock) (Josh Durgin)
+* librados: fix watch operations with cache pools (Sage Weil)
+* librados: new snap rollback operation (David Zafman)
+* librados, osd: new TMAP2OMAP operation (Yan, Zheng)
+* librados: read directly into user buffer (Rutger ter Borg)
+* librbd: fix use-after-free aio completion bug #5426 (Josh Durgin)
+* librbd: localize/distribute parent reads (Sage Weil)
+* librbd: skip zeroes/holes when copying sparse images (Josh Durgin)
+* mailmap: affiliation updates (Loic Dachary)
+* mailmap updates (Loic Dachary)
+* many portability improvements (Noah Watkins)
+* many unit test improvements (Loic Dachary)
+* mds: always store backtrace in default pool (Yan, Zheng)
+* mds: cope with MDS failure during creation (John Spray)
+* mds: fix cap migration behavior (Yan, Zheng)
+* mds: fix client session flushing (Yan, Zheng)
+* mds: fix crash from client sleep/resume (Zheng Yan)
+* mds: fix many many multi-mds bugs (Yan, Zheng)
+* mds: fix readdir end check (Zheng Yan)
+* mds: fix Resetter locking (Alexandre Oliva)
+* mds: fix respawn (John Spray)
+* mds: inline data support (Li Wang, Yunchuan Wen)
+* mds: misc bugs (Yan, Zheng)
+* mds: misc fixes for directory fragments (Zheng Yan)
+* mds: misc fixes for larger directories (Zheng Yan)
+* mds: misc fixes for multiple MDSs (Zheng Yan)
+* mds: misc multi-mds fixes (Yan, Zheng)
+* mds: remove .ceph directory (John Spray)
+* mds: store directories in omap instead of tmap (Yan, Zheng)
+* mds: update old-format backtraces opportunistically (Zheng Yan)
+* mds: use shared_ptr for requests (Greg Farnum)
+* misc cleanups from coverity (Xing Lin)
+* misc coverity fixes, cleanups (Danny Al-Gaaf)
+* misc coverity fixes (Xing Lin, Li Wang, Danny Al-Gaaf)
+* misc portability fixes (Noah Watkins, Alan Somers)
+* misc portability fixes (Noah Watkins, Christophe Courtaut, Alan Somers, huanjun)
+* misc portability work (Noah Watkins)
+* mon: add erasure profiles and improve erasure pool creation (Loic Dachary)
+* mon: add 'mon getmap EPOCH' (Joao Eduardo Luis)
+* mon: allow adjustment of cephfs max file size via 'ceph mds set max_file_size' (Sage Weil)
+* mon: allow debug quorum_{enter,exit} commands via admin socket
+* mon: 'ceph osd pg-temp ...' and primary-temp commands (Ilya Dryomov)
+* mon: change mds allow_new_snaps syntax to be more consistent (Sage Weil)
+* mon: clean up initial crush rule creation (Loic Dachary)
+* mon: collect misc metadata about osd (os, kernel, etc.), new 'osd metadata' command (Sage Weil)
+* mon: do not create erasure rules by default (Sage Weil)
+* mon: do not generate spurious MDSMaps in certain cases (Sage Weil)
+* mon: do not use keyring if auth = none (Loic Dachary)
+* mon: fix peer feature checks (Sage Weil)
+* mon: fix pg_temp leaks (Joao Eduardo Luis)
+* mon: fix pool count in 'ceph -s' output (Sage Weil)
+* mon: handle more whitespace (newline, tab) in mon capabilities (Sage Weil)
+* mon: improve (replicate or erasure) pool creation UX (Loic Dachary)
+* mon: infrastructure to handle mixed-version mon cluster and cli/rest API (Greg Farnum)
+* mon: MForward tests (Loic Dachary)
+* mon: mkfs now idempotent (Loic Dachary)
+* mon: only seed new osdmaps to current OSDs (Sage Weil)
+* mon, osd: create erasure style crush rules (Loic Dachary, Sage Weil)
+* mon: 'osd crush show-tunables' (Sage Weil)
+* mon: 'osd dump' dumps pool snaps as array, not object (Dan Mick)
+* mon, osd: new 'erasure' pool type (still not fully supported)
+* mon: persist quorum features to disk (Greg Farnum)
+* mon: prevent extreme changes in pool pg_num (Greg Farnum)
+* mon: require 'x' mon caps for auth operations (Joao Luis)
+* mon: shutdown when removed from mon cluster (Joao Luis)
+* mon: take 'osd pool set ...' value as an int, not string (Joao Eduardo Luis)
+* mon: track osd features in OSDMap (Joao Luis, David Zafman)
+* mon: trim MDSMaps (Joao Eduardo Luis)
+* mon: warn if crush has non-optimal tunables (Sage Weil)
+* mount.ceph: add -n for autofs support (Steve Stock)
+* msgr: fix locking bug in authentication (Josh Durgin)
+* msgr: fix messenger restart race (Xihui He)
+* msgr: improve connection error detection between clients and monitors (Greg Farnum, Sage Weil)
+* osd: add/fix CPU feature detection for jerasure (Loic Dachary)
+* osd: add HitSet tracking for read ops (Sage Weil, Greg Farnum)
+* osd: avoid touching leveldb for some xattrs (Haomai Wang, Sage Weil)
+* osd: backfill to multiple targets (David Zafman)
+* osd: backfill to osds not in acting set (David Zafman)
+* osd: cache pool support for snapshots (Sage Weil)
+* osd: client IO path changes for EC (Samuel Just)
+* osd: default to 3x replication
+* osd: do not include backfill targets in acting set (David Zafman)
+* osd: enable new hashpspool layout by default (Sage Weil)
+* osd: erasure plugin benchmarking tool (Loic Dachary)
+* osd: fix and cleanup misc backfill issues (David Zafman)
+* osd: fix bug in journal replay/restart (Sage Weil)
+* osd: fix copy-get omap bug (Sage Weil)
+* osd: fix linux kernel version detection (Ilya Dryomov)
+* osd: fix memstore segv (Haomai Wang)
+* osd: fix object_info_t encoding bug from emperor (Sam Just)
+* osd: fix omap_clear operation to not zap xattrs (Sam Just, Yan, Zheng)
+* osd: fix several bugs with tier infrastructure
+* osd: fix throttle thread (Haomai Wang)
+* osd: fix XFS detection (Greg Farnum, Sushma Gurram)
+* osd: generalize scrubbing infrastructure to allow EC (David Zafman)
+* osd: handle more whitespace (newline, tab) in osd capabilities (Sage Weil)
+* osd: ignore num_objects_dirty on scrub for old pools (Sage Weil)
+* osd: improved scrub checks on clones (Sage Weil, Sam Just)
+* osd: improve locking in fd lookup cache (Samuel Just, Greg Farnum)
+* osd: include more info in pg query result (Sage Weil)
+* osd, librados: fix full cluster handling (Josh Durgin)
+* osd: many erasure fixes (Sam Just)
+* osd: many many many bug fixes with cache tiering (Samuel Just)
+* osd: move to jerasure2 library (Loic Dachary)
+* osd: new 'chassis' type in default crush hierarchy (Sage Weil)
+* osd: new keyvaluestore-dev backend based on leveldb (Haomai Wang)
+* osd: new OSDMap encoding (Greg Farnum)
+* osd: new tests for erasure pools (David Zafman)
+* osd: preliminary cache pool support (no snaps) (Greg Farnum, Sage Weil)
+* osd: reduce scrub lock contention (Guang Yang)
+* osd: requery unfound on stray notify (#6909) (Samuel Just)
+* osd: some PGBackend infrastructure (Samuel Just)
+* osd: support for new 'memstore' (memory-backed) backend (Sage Weil)
+* osd: track erasure compatibility (David Zafman)
+* osd: track omap and hit_set objects in pg stats (Samuel Just)
+* osd: warn if agent cannot enable due to invalid (post-split) stats (Sage Weil)
+* rados: add 'crush location', smart replica selection/balancing (Sage Weil)
+* rados bench: track metadata for multiple runs separately (Guang Yang)
+* rados: some performance optimizations (Yehuda Sadeh)
+* rados tool: fix listomapvals (Josh Durgin)
+* rbd: add 'rbdmap' init script for mapping rbd images on book (Adam Twardowski)
+* rbd: add rbdmap support for upstart (Laurent Barbe)
+* rbd: expose kernel rbd client options via 'rbd map' (Ilya Dryomov)
+* rbd: fix bench-write command (Hoamai Wang)
+* rbd: make 'rbd list' return empty list and success on empty pool (Josh Durgin)
+* rbd: prevent deletion of images with watchers (Ilya Dryomov)
+* rbd: support for 4096 mapped devices, up from ~250 (Ilya Dryomov)
+* rest-api: do not fail when no OSDs yet exist (Dan Mick)
+* rgw: add 'status' command to sysvinit script (David Moreau Simard)
+* rgw: allow multiple frontends (Yehuda Sadeh)
+* rgw: allow use of an erasure data pool (Yehuda Sadeh)
+* rgw: convert bucket info to new format on demand (Yehuda Sadeh)
+* rgw: fixed subuser modify (Yehuda Sadeh)
+* rgw: fix error setting empty owner on ACLs (Yehuda Sadeh)
+* rgw: fix fastcgi deadlock (do not return data from librados callback) (Yehuda Sadeh)
+* rgw: fix many-part multipart uploads (Yehuda Sadeh)
+* rgw: fix misc CORS bugs (Robin H. Johnson)
+* rgw: fix object placement read op (Yehuda Sadeh)
+* rgw: fix reading bucket policy (#6940)
+* rgw: fix read_user_buckets 'max' behavior (Yehuda Sadeh)
+* rgw: fix several CORS bugs (Robin H. Johnson)
+* rgw: fix use-after-free when releasing completion handle (Yehuda Sadeh)
+* rgw: improve swift temp URL support (Yehuda Sadeh)
+* rgw: make multi-object delete idempotent (Yehuda Sadeh)
+* rgw: optionally defer to bucket ACLs instead of object ACLs (Liam Monahan)
+* rgw: prototype mongoose frontend (Yehuda Sadeh)
+* rgw: several doc fixes (Alexandre Marangone)
+* rgw: support for password (instead of admin token) for keystone authentication (Christophe Courtaut)
+* rgw: switch from mongoose to civetweb (Yehuda Sadeh)
+* rgw: user quotas (Yehuda Sadeh)
+* rpm: fix redhat-lsb dependency (Sage Weil, Alfredo Deza)
+* specfile: fix RPM build on RHEL6 (Ken Dreyer, Derek Yarnell)
+* specfile: ship libdir/ceph (Key Dreyer)
+* sysvinit, upstart: prevent both init systems from starting the same daemons (Josh Durgin)
+
+
+Notable changes since v0.67 Dumpling
+------------------------------------
+
+* build cleanly under clang (Christophe Courtaut)
+* build: Makefile refactor (Roald J. van Loon)
+* build: fix [/usr]/sbin locations (Alan Somers)
+* ceph-disk: fix journal preallocation
+* ceph-fuse, radosgw: enable admin socket and logging by default
+* ceph-fuse: fix problem with readahead vs truncate race (Yan, Zheng)
+* ceph-fuse: trim deleted inodes from cache (Yan, Zheng)
+* ceph-fuse: use newer fuse api (Jianpeng Ma)
+* ceph-kvstore-tool: new tool for working with leveldb (copy, crc) (Joao Luis)
+* ceph-post-file: new command to easily share logs or other files with ceph devs
+* ceph: improve parsing of CEPH_ARGS (Benoit Knecht)
+* ceph: make -h behave when monitors are down
+* ceph: parse CEPH_ARGS env variable
+* common: bloom_filter improvements, cleanups
+* common: cache crc32c values where possible
+* common: correct SI is kB not KB (Dan Mick)
+* common: fix looping on BSD (Alan Somers)
+* common: migrate SharedPtrRegistry to use boost::shared_ptr<> (Loic Dachary)
+* common: misc portability fixes (Noah Watkins)
+* crc32c: fix optimized crc32c code (it now detects arch support properly)
+* crc32c: improved intel-optimized crc32c support (~8x faster on my laptop!)
+* crush: fix name caching
+* doc: erasure coding design notes (Loic Dachary)
+* hadoop: removed old version of shim to avoid confusing users (Noah Watkins)
+* librados, mon: ability to query/ping out-of-quorum monitor status (Joao Luis)
+* librados: fix async aio completion wakeup
+* librados: fix installed header #includes (Dan Mick)
+* librados: get_version64() method for C++ API
+* librados: hello_world example (Greg Farnum)
+* librados: sync calls now return on commit (instead of ack) (Greg Farnum)
+* librbd python bindings: fix parent image name limit (Josh Durgin)
+* librbd, ceph-fuse: avoid some sources of ceph-fuse, rbd cache stalls
+* mds: avoid leaking objects when deleting truncated files (Yan, Zheng)
+* mds: fix F_GETLK (Yan, Zheng)
+* mds: fix LOOKUPSNAP bug
+* mds: fix heap profiler commands (Joao Luis)
+* mds: fix locking deadlock (David Disseldorp)
+* mds: fix many bugs with stray (unlinked) inodes (Yan, Zheng)
+* mds: fix many directory fragmentation bugs (Yan, Zheng)
+* mds: fix mds rejoin with legacy parent backpointer xattrs (Alexandre Oliva)
+* mds: fix rare restart/failure race during fs creation
+* mds: fix standby-replay when we fall behind (Yan, Zheng)
+* mds: fix stray directory purging (Yan, Zheng)
+* mds: notify clients about deleted files (so they can release from their cache) (Yan, Zheng)
+* mds: several bug fixes with clustered mds (Yan, Zheng)
+* mon, osd: improve osdmap trimming logic (Samuel Just)
+* mon, osd: initial CLI for configuring tiering
+* mon: a few 'ceph mon add' races fixed (command is now idempotent) (Joao Luis)
+* mon: allow (un)setting HASHPSPOOL flag on existing pools (Joao Luis)
+* mon: allow cap strings with . to be unquoted
+* mon: allow logging level of cluster log (/var/log/ceph/ceph.log) to be adjusted
+* mon: avoid rewriting full osdmaps on restart (Joao Luis)
+* mon: continue to discover peer addr info during election phase
+* mon: disallow CephFS snapshots until 'ceph mds set allow_new_snaps' (Greg Farnum)
+* mon: do not expose uncommitted state from 'osd crush {add,set} ...' (Joao Luis)
+* mon: fix 'ceph osd crush reweight ...' (Joao Luis)
+* mon: fix 'osd crush move ...' command for buckets (Joao Luis)
+* mon: fix byte counts (off by factor of 4) (Dan Mick, Joao Luis)
+* mon: fix paxos corner case
+* mon: kv properties for pools to support EC (Loic Dachary)
+* mon: make 'osd pool rename' idempotent (Joao Luis)
+* mon: modify 'auth add' semantics to make a bit more sense (Joao Luis)
+* mon: new 'osd perf' command to dump recent performance information (Samuel Just)
+* mon: new and improved 'ceph -s' or 'ceph status' command (more info, easier to read)
+* mon: some auth check cleanups (Joao Luis)
+* mon: track per-pool stats (Joao Luis)
+* mon: warn about pools with bad pg_num
+* mon: warn when mon data stores grow very large (Joao Luis)
+* monc: fix small memory leak
+* new wireshark patches pulled into the tree (Kevin Jones)
+* objecter, librados: redirect requests based on cache tier config
+* objecter: fix possible hang when cluster is unpaused (Josh Durgin)
+* osd, librados: add new COPY_FROM rados operation
+* osd, librados: add new COPY_GET rados operations (used by COPY_FROM)
+* osd: 'osd recover clone overlap limit' option to limit cloning during recovery (Samuel Just)
+* osd: COPY_GET on-wire encoding improvements (Greg Farnum)
+* osd: add 'osd heartbeat min healthy ratio' configurable (was hard-coded at 33%)
+* osd: add option to disable pg log debug code (which burns CPU)
+* osd: allow cap strings with . to be unquoted
+* osd: automatically detect proper xattr limits (David Zafman)
+* osd: avoid extra copy in erasure coding reference implementation (Loic Dachary)
+* osd: basic cache pool redirects (Greg Farnum)
+* osd: basic whiteout, dirty flag support (not yet used)
+* osd: bloom_filter encodability, fixes, cleanups (Loic Dachary, Sage Weil)
+* osd: clean up and generalize copy-from code (Greg Farnum)
+* osd: cls_hello OSD class example
+* osd: erasure coding doc updates (Loic Dachary)
+* osd: erasure coding plugin infrastructure, tests (Loic Dachary)
+* osd: experiemental support for ZFS (zfsonlinux.org) (Yan, Zheng)
+* osd: fix RWORDER flags
+* osd: fix exponential backoff of slow request warnings (Loic Dachary)
+* osd: fix handling of racing read vs write (Samuel Just)
+* osd: fix version value returned by various operations (Greg Farnum)
+* osd: generalized temp object infrastructure
+* osd: ghobject_t infrastructure for EC (David Zafman)
+* osd: improvements for compatset support and storage (David Zafman)
+* osd: infrastructure to copy objects from other OSDs
+* osd: instrument peering states (David Zafman)
+* osd: misc copy-from improvements
+* osd: opportunistic crc checking on stored data (off by default)
+* osd: properly enforce RD/WR flags for rados classes
+* osd: reduce blocking on backing fs (Samuel Just)
+* osd: refactor recovery using PGBackend (Samuel Just)
+* osd: remove old magical tmap->omap conversion
+* osd: remove old pg log on upgrade (Samuel Just)
+* osd: revert xattr size limit (fixes large rgw uploads)
+* osd: use fdatasync(2) instead of fsync(2) to improve performance (Sam Just)
+* pybind: fix blacklisting nonce (Loic Dachary)
+* radosgw-agent: multi-region replication/DR
+* rgw: complete in-progress requests before shutting down
+* rgw: default log level is now more reasonable (Yehuda Sadeh)
+* rgw: fix S3 auth with response-* query string params (Sylvain Munaut, Yehuda Sadeh)
+* rgw: fix a few minor memory leaks (Yehuda Sadeh)
+* rgw: fix acl group check (Yehuda Sadeh)
+* rgw: fix inefficient use of std::list::size() (Yehuda Sadeh)
+* rgw: fix major CPU utilization bug with internal caching (Yehuda Sadeh, Mark Nelson)
+* rgw: fix ordering of write operations (preventing data loss on crash) (Yehuda Sadeh)
+* rgw: fix ordering of writes for mulitpart upload (Yehuda Sadeh)
+* rgw: fix various CORS bugs (Yehuda Sadeh)
+* rgw: fix/improve swift COPY support (Yehuda Sadeh)
+* rgw: improve help output (Christophe Courtaut)
+* rgw: misc fixes to support DR (Josh Durgin, Yehuda Sadeh)
+* rgw: per-bucket quota (Yehuda Sadeh)
+* rgw: validate S3 tokens against keystone (Roald J. van Loon)
+* rgw: wildcard support for keystone roles (Christophe Courtaut)
+* rpm: fix junit dependencies (Alan Grosskurth)
+* sysvinit radosgw: fix status return code (Danny Al-Gaaf)
+* sysvinit rbdmap: fix error 'service rbdmap stop' (Laurent Barbe)
+* sysvinit: add condrestart command (Dan van der Ster)
+* sysvinit: fix shutdown order (mons last) (Alfredo Deza)
+
+
+v0.79
+=====
+
+This release is intended to serve as a release candidate for firefly,
+which will hopefully be v0.80.  No changes are being made to the code
+base at this point except those that fix bugs.  Please test this
+release if you intend to make use of the new erasure-coded pools or
+cache tiers in firefly.
+
+This release fixes a range of bugs found in v0.78 and streamlines the
+user experience when creating erasure-coded pools.  There is also a
+raft of fixes for the MDS (multi-mds, directory fragmentation, and
+large directories).  The main notable new piece of functionality is a
+small change to allow radosgw to use an erasure-coded pool for object
+data.
+
+
+Upgrading
+---------
+* Erasure pools created with v0.78 will no longer function with v0.79.  You
+  will need to delete the old pool and create a new one.
+
+* A bug was fixed in the authentication handshake with big-endian
+  architectures that prevent authentication between big- and
+  little-endian machines in the same cluster.  If you have a cluster
+  that consists entirely of big-endian machines, you will need to
+  upgrade all daemons and clients and restart.
+
+* The 'ceph.file.layout' and 'ceph.dir.layout' extended attributes are
+  no longer included in the listxattr(2) results to prevent problems with
+  'cp -a' and similar tools.
+
+* Monitor 'auth' read-only commands now expect the user to have 'rx' caps.
+  This is the same behavior that was present in dumpling, but in emperor
+  and more recent development releases the 'r' cap was sufficient.  The
+  affected commands are::
+
+    ceph auth export
+    ceph auth get
+    ceph auth get-key
+    ceph auth print-key
+    ceph auth list
+
+Notable Changes
+---------------
+* ceph-conf: stop creating bogus log files (Josh Durgin, Sage Weil)
+* common: fix authentication on big-endian architectures (Dan Mick)
+* debian: change directory ownership between ceph and ceph-common (Sage Weil)
+* init: fix startup ordering/timeout problem with OSDs (Dmitry Smirnov)
+* librbd: skip zeroes/holes when copying sparse images (Josh Durgin)
+* mds: cope with MDS failure during creation (John Spray)
+* mds: fix crash from client sleep/resume (Zheng Yan)
+* mds: misc fixes for directory fragments (Zheng Yan)
+* mds: misc fixes for larger directories (Zheng Yan)
+* mds: misc fixes for multiple MDSs (Zheng Yan)
+* mds: remove .ceph directory (John Spray)
+* misc coverity fixes, cleanups (Danny Al-Gaaf)
+* mon: add erasure profiles and improve erasure pool creation (Loic Dachary)
+* mon: 'ceph osd pg-temp ...' and primary-temp commands (Ilya Dryomov)
+* mon: fix pool count in 'ceph -s' output (Sage Weil)
+* msgr: improve connection error detection between clients and monitors (Greg Farnum, Sage Weil)
+* osd: add/fix CPU feature detection for jerasure (Loic Dachary)
+* osd: improved scrub checks on clones (Sage Weil, Sam Just)
+* osd: many erasure fixes (Sam Just)
+* osd: move to jerasure2 library (Loic Dachary)
+* osd: new tests for erasure pools (David Zafman)
+* osd: reduce scrub lock contention (Guang Yang)
+* rgw: allow use of an erasure data pool (Yehuda Sadeh)
+
+
+v0.78
+=====
+
+This development release includes two key features: erasure coding and
+cache tiering.  A huge amount of code was merged for this release and
+several additional weeks were spent stabilizing the code base, and it
+is now in a state where it is ready to be tested by a broader user
+base.
+
+This is *not* the firefly release.  Firefly will be delayed for at
+least another sprint so that we can get some operational experience
+with the new code and do some additional testing before committing to
+long term support.
+
+.. note:: Please note that while it is possible to create and test
+          erasure coded pools in this release, the pools will not be
+          usable when you upgrade to v0.79 as the OSDMap encoding will
+          subtlely change.  Please do not populate your test pools
+          with important data that can't be reloaded.
+
+Upgrading
+---------
+
+* Upgrade daemons in the following order:
+
+    #. Monitors
+    #. OSDs
+    #. MDSs and/or radosgw
+
+  If the ceph-mds daemon is restarted first, it will wait until all
+  OSDs have been upgraded before finishing its startup sequence.  If
+  the ceph-mon daemons are not restarted prior to the ceph-osd
+  daemons, they will not correctly register their new capabilities
+  with the cluster and new features may not be usable until they are
+  restarted a second time.
+
+* Upgrade radosgw daemons together.  There is a subtle change in behavior
+  for multipart uploads that prevents a multipart request that was initiated
+  with a new radosgw from being completed by an old radosgw.
+
+* CephFS recently added support for a new 'backtrace' attribute on
+  file data objects that is used for lookup by inode number (i.e., NFS
+  reexport and hard links), and will later be used by fsck repair.
+  This replaces the existing anchor table mechanism that is used for
+  hard link resolution.  In order to completely phase that out, any
+  inode that has an outdated backtrace attribute will get updated when
+  the inode itself is modified.  This will result in some extra workload
+  after a legacy CephFS file system is upgraded.
+
+* The per-op return code in librados' ObjectWriteOperation interface
+  is now filled in.
+
+* The librados cmpxattr operation now handles xattrs containing null bytes as
+  data rather than null-terminated strings.
+
+* Compound operations in librados that create and then delete the same object
+  are now explicitly disallowed (they fail with -EINVAL).
+
+* The default leveldb cache size for the ceph-osd daemon has been
+  increased from 4 MB to 128 MB.  This will increase the memory
+  footprint of that process but tends to increase performance of omap
+  (key/value) objects (used for CephFS and the radosgw).  If memory in your
+  deployment is tight, you can preserve the old behavio by adding::
+
+    leveldb write buffer size = 0
+    leveldb cache size = 0
+
+  to your ceph.conf to get back the (leveldb) defaults.
+
+Notable Changes
+---------------
+* ceph-brag: new client and server tools (Sebastien Han, Babu Shanmugam)
+* ceph-disk: use partx on RHEL or CentOS instead of partprobe (Alfredo Deza)
+* ceph: fix combination of 'tell' and interactive mode (Joao Eduardo Luis)
+* ceph-fuse: fix bugs with inline data and multiple MDSs (Zheng Yan)
+* client: fix getcwd() to use new LOOKUPPARENT operation (Zheng Yan)
+* common: fall back to json-pretty for admin socket (Loic Dachary)
+* common: fix 'config dump' debug prefix (Danny Al-Gaaf)
+* common: misc coverity fixes (Danny Al-Gaaf)
+* common: throtller, shared_cache performance improvements, TrackedOp (Greg Farnum, Samuel Just)
+* crush: fix JSON schema for dump (John Spray)
+* crush: misc cleanups, tests (Loic Dachary)
+* crush: new vary_r tunable (Sage Weil)
+* crush: prevent invalid buckets of type 0 (Sage Weil)
+* keyvaluestore: add perfcounters, misc bug fixes (Haomai Wang)
+* keyvaluestore: portability improvements (Noah Watkins)
+* libcephfs: API changes to better support NFS reexport via Ganesha (Matt Benjamin, Adam Emerson, Andrey Kuznetsov, Casey Bodley, David Zafman)
+* librados: API documentation improvements (John Wilkins, Josh Durgin)
+* librados: fix object enumeration bugs; allow iterator assignment (Josh Durgin)
+* librados: streamline tests (Josh Durgin)
+* librados: support for atomic read and omap operations for C API (Josh Durgin)
+* librados: support for osd and mon command timeouts (Josh Durgin)
+* librbd: pass allocation hints to OSD (Ilya Dryomov)
+* logrotate: fix bug that prevented rotation for some daemons (Loic Dachary)
+* mds: avoid duplicated discovers during recovery (Zheng Yan)
+* mds: fix file lock owner checks (Zheng Yan)
+* mds: fix LOOKUPPARENT, new LOOKUPNAME ops for reliable NFS reexport (Zheng Yan)
+* mds: fix xattr handling on setxattr (Zheng Yan)
+* mds: fix xattrs in getattr replies (Sage Weil)
+* mds: force backtrace updates for old inodes on update (Zheng Yan)
+* mds: several multi-mds and dirfrag bug fixes (Zheng Yan)
+* mon: encode erasure stripe width in pool metadata (Loic Dachary)
+* mon: erasure code crush rule creation (Loic Dachary)
+* mon: erasure code plugin support (Loic Dachary)
+* mon: fix bugs in initial post-mkfs quorum creation (Sage Weil)
+* mon: fix error output to terminal during startup (Joao Eduardo Luis)
+* mon: fix legacy CRUSH tunables warning (Sage Weil)
+* mon: fix osd_epochs lower bound tracking for map trimming (Sage Weil)
+* mon: fix OSDMap encoding features (Sage Weil, Aaron Ten Clay)
+* mon: fix 'pg dump' JSON output (John Spray)
+* mon: include dirty stats in 'ceph df detail' (Sage Weil)
+* mon: list quorum member names in quorum order (Sage Weil)
+* mon: prevent addition of non-empty cache tier (Sage Weil)
+* mon: prevent deletion of CephFS pools (John Spray)
+* mon: warn when cache tier approaches 'full' (Sage Weil)
+* osd: allocation hint, with XFS support (Ilya Dryomov)
+* osd: erasure coded pool support (Samuel Just)
+* osd: fix bug causing slow/stalled recovery (#7706) (Samuel Just)
+* osd: fix bugs in log merging (Samuel Just)
+* osd: fix/clarify end-of-object handling on read (Loic Dachary)
+* osd: fix impolite mon session backoff, reconnect behavior (Greg Farnum)
+* osd: fix SnapContext cache id bug (Samuel Just)
+* osd: increase default leveldb cache size and write buffer (Sage Weil, Dmitry Smirnov)
+* osd: limit size of 'osd bench ...' arguments (Joao Eduardo Luis)
+* osdmaptool: new --test-map-pgs mode (Sage Weil, Ilya Dryomov)
+* osd, mon: add primary-affinity to adjust selection of primaries (Sage Weil)
+* osd: new 'status' admin socket command (Sage Weil)
+* osd: simple tiering agent (Sage Weil)
+* osd: store checksums for erasure coded object stripes (Samuel Just)
+* osd: tests for objectstore backends (Haomai Wang)
+* osd: various refactoring and bug fixes (Samuel Just, David Zafman)
+* rados: add 'set-alloc-hint' command (Ilya Dryomov)
+* rbd-fuse: fix enumerate_images overflow, memory leak (Ilya Dryomov)
+* rbdmap: fix upstart script (Stephan Renatus)
+* rgw: avoid logging system events to usage log (Yehuda Sadeh)
+* rgw: fix Swift range reponse (Yehuda Sadeh)
+* rgw: improve scalability for manifest objects (Yehuda Sadeh)
+* rgw: misc fixes for multipart objects, policies (Yehuda Sadeh)
+* rgw: support non-standard MultipartUpload command (Yehuda Sadeh)
+
+
+
+v0.77
+=====
+
+This is the final development release before the Firefly feature
+freeze.  The main items in this release include some additional
+refactoring work in the OSD IO path (include some locking
+improvements), per-user quotas for the radosgw, a switch to civetweb
+from mongoose for the prototype radosgw standalone mode, and a
+prototype leveldb-based backend for the OSD.  The C librados API also
+got support for atomic write operations (read side transactions will
+appear in v0.78).
+
+Upgrading
+---------
+
+* The 'ceph -s' or 'ceph status' command's 'num_in_osds' field in the
+  JSON and XML output has been changed from a string to an int.
+
+* The recently added 'ceph mds set allow_new_snaps' command's syntax
+  has changed slightly; it is now 'ceph mds set allow_new_snaps true'.
+  The 'unset' command has been removed; instead, set the value to
+  'false'.
+
+* The syntax for allowing snapshots is now 'mds set allow_new_snaps
+  <true|false>' instead of 'mds <set,unset> allow_new_snaps'.
+
+Notable Changes
+---------------
+
+* osd: client IO path changes for EC (Samuel Just)
+* common: portability changes to support libc++ (Noah Watkins)
+* common: switch to unordered_map from hash_map (Noah Watkins)
+* rgw: switch from mongoose to civetweb (Yehuda Sadeh)
+* osd: improve locking in fd lookup cache (Samuel Just, Greg Farnum)
+* doc: many many updates (John Wilkins)
+* rgw: user quotas (Yehuda Sadeh)
+* mon: persist quorum features to disk (Greg Farnum)
+* mon: MForward tests (Loic Dachary)
+* mds: inline data support (Li Wang, Yunchuan Wen)
+* rgw: fix many-part multipart uploads (Yehuda Sadeh)
+* osd: new keyvaluestore-dev backend based on leveldb (Haomai Wang)
+* rbd: prevent deletion of images with watchers (Ilya Dryomov)
+* osd: avoid touching leveldb for some xattrs (Haomai Wang, Sage Weil)
+* mailmap: affiliation updates (Loic Dachary)
+* osd: new OSDMap encoding (Greg Farnum)
+* osd: generalize scrubbing infrastructure to allow EC (David Zafman)
+* rgw: several doc fixes (Alexandre Marangone)
+* librados: add C API coverage for atomic write operations (Christian Marie)
+* rgw: improve swift temp URL support (Yehuda Sadeh)
+* rest-api: do not fail when no OSDs yet exist (Dan Mick)
+* common: check preexisting admin socket for active daemon before removing (Loic Dachary)
+* osd: handle more whitespace (newline, tab) in osd capabilities (Sage Weil)
+* mon: handle more whitespace (newline, tab) in mon capabilities (Sage Weil)
+* rgw: make multi-object delete idempotent (Yehuda Sadeh)
+* crush: fix off-by-one error in recent refactor (Sage Weil)
+* rgw: fix read_user_buckets 'max' behavior (Yehuda Sadeh)
+* mon: change mds allow_new_snaps syntax to be more consistent (Sage Weil)
+
+
+v0.76
+=====
+
+This release includes another batch of updates for firefly
+functionality.  Most notably, the cache pool infrastructure now
+support snapshots, the OSD backfill functionality has been generalized
+to include multiple targets (necessary for the coming erasure pools),
+and there were performance improvements to the erasure code plugin on
+capable processors.  The MDS now properly utilizes (and seamlessly
+migrates to) the OSD key/value interface (aka omap) for storing directory
+objects.  There continue to be many other fixes and improvements for
+usability and code portability across the tree.
+
+Upgrading
+---------
+
+* 'rbd ls' on a pool which never held rbd images now exits with code
+  0. It outputs nothing in plain format, or an empty list in
+  non-plain format. This is consistent with the behavior for a pool
+  which used to hold images, but contains none. Scripts relying on
+  this behavior should be updated.
+
+* The MDS requires a new OSD operation TMAP2OMAP, added in this release.  When
+  upgrading, be sure to upgrade and restart the ceph-osd daemons before the
+  ceph-mds daemon.  The MDS will refuse to start if any up OSDs do not support
+  the new feature.
+
+* The 'ceph mds set_max_mds N' command is now deprecated in favor of
+  'ceph mds set max_mds N'.
+
+Notable Changes
+---------------
+
+* build: misc improvements (Ken Dreyer)
+* ceph-disk: generalize path names, add tests (Loic Dachary)
+* ceph-disk: misc improvements for puppet (Loic Dachary)
+* ceph-disk: several bug fixes (Loic Dachary)
+* ceph-fuse: fix race for sync reads (Sage Weil)
+* config: recursive metavariable expansion (Loic Dachary)
+* crush: usability and test improvements (Loic Dachary)
+* doc: misc fixes (David Moreau Simard, Kun Huang)
+* erasure-code: improve buffer alignment (Loic Dachary)
+* erasure-code: rewrite region-xor using vector operations (Andreas Peters)
+* librados, osd: new TMAP2OMAP operation (Yan, Zheng)
+* mailmap updates (Loic Dachary)
+* many portability improvements (Noah Watkins)
+* many unit test improvements (Loic Dachary)
+* mds: always store backtrace in default pool (Yan, Zheng)
+* mds: store directories in omap instead of tmap (Yan, Zheng)
+* mon: allow adjustment of cephfs max file size via 'ceph mds set max_file_size' (Sage Weil)
+* mon: do not create erasure rules by default (Sage Weil)
+* mon: do not generate spurious MDSMaps in certain cases (Sage Weil)
+* mon: do not use keyring if auth = none (Loic Dachary)
+* mon: fix pg_temp leaks (Joao Eduardo Luis)
+* osd: backfill to multiple targets (David Zafman)
+* osd: cache pool support for snapshots (Sage Weil)
+* osd: fix and cleanup misc backfill issues (David Zafman)
+* osd: fix omap_clear operation to not zap xattrs (Sam Just, Yan, Zheng)
+* osd: ignore num_objects_dirty on scrub for old pools (Sage Weil)
+* osd: include more info in pg query result (Sage Weil)
+* osd: track erasure compatibility (David Zafman)
+* rbd: make 'rbd list' return empty list and success on empty pool (Josh Durgin)
+* rgw: fix object placement read op (Yehuda Sadeh)
+* rgw: fix several CORS bugs (Robin H. Johnson)
+* specfile: fix RPM build on RHEL6 (Ken Dreyer, Derek Yarnell)
+* specfile: ship libdir/ceph (Key Dreyer)
+
+
+v0.75
+=====
+
+This is a big release, with lots of infrastructure going in for
+firefly.  The big items include a prototype standalone frontend for
+radosgw (which does not require apache or fastcgi), tracking for read
+activity on the osds (to inform tiering decisions), preliminary cache
+pool support (no snapshots yet), and lots of bug fixes and other work
+across the tree to get ready for the next batch of erasure coding
+patches.
+
+For comparison, here are the diff stats for the last few versions::
+
+ v0.75 291 files changed, 82713 insertions(+), 33495 deletions(-)
+ v0.74 192 files changed, 17980 insertions(+), 1062 deletions(-)
+ v0.73 148 files changed, 4464 insertions(+), 2129 deletions(-)
+
+Upgrading
+---------
+
+- The 'osd pool create ...' syntax has changed for erasure pools.
+
+- The default CRUSH rules and layouts are now using the latest and
+  greatest tunables and defaults.  Clusters using the old values will
+  now present with a health WARN state.  This can be disabled by
+  adding 'mon warn on legacy crush tunables = false' to ceph.conf.
+
+
+Notable Changes
+---------------
+
+* common: bloom filter improvements (Sage Weil)
+* common: fix config variable substitution (Loic Dachary)
+* crush, osd: s/rep/replicated/ for less confusion (Loic Dachary)
+* crush: refactor descend_once behavior; support set_choose*_tries for replicated rules (Sage Weil)
+* librados: fix throttle leak (and eventual deadlock) (Josh Durgin)
+* librados: read directly into user buffer (Rutger ter Borg)
+* librbd: fix use-after-free aio completion bug #5426 (Josh Durgin)
+* librbd: localize/distribute parent reads (Sage Weil)
+* mds: fix Resetter locking (Alexandre Oliva)
+* mds: fix cap migration behavior (Yan, Zheng)
+* mds: fix client session flushing (Yan, Zheng)
+* mds: fix many many multi-mds bugs (Yan, Zheng)
+* misc portability work (Noah Watkins)
+* mon, osd: create erasure style crush rules (Loic Dachary, Sage Weil)
+* mon: 'osd crush show-tunables' (Sage Weil)
+* mon: clean up initial crush rule creation (Loic Dachary)
+* mon: improve (replicate or erasure) pool creation UX (Loic Dachary)
+* mon: infrastructure to handle mixed-version mon cluster and cli/rest API (Greg Farnum)
+* mon: mkfs now idempotent (Loic Dachary)
+* mon: only seed new osdmaps to current OSDs (Sage Weil)
+* mon: track osd features in OSDMap (Joao Luis, David Zafman)
+* mon: warn if crush has non-optimal tunables (Sage Weil)
+* mount.ceph: add -n for autofs support (Steve Stock)
+* msgr: fix messenger restart race (Xihui He)
+* osd, librados: fix full cluster handling (Josh Durgin)
+* osd: add HitSet tracking for read ops (Sage Weil, Greg Farnum)
+* osd: backfill to osds not in acting set (David Zafman)
+* osd: enable new hashpspool layout by default (Sage Weil)
+* osd: erasure plugin benchmarking tool (Loic Dachary)
+* osd: fix XFS detection (Greg Farnum, Sushma Gurram)
+* osd: fix copy-get omap bug (Sage Weil)
+* osd: fix linux kernel version detection (Ilya Dryomov)
+* osd: fix memstore segv (Haomai Wang)
+* osd: fix several bugs with tier infrastructure
+* osd: fix throttle thread (Haomai Wang)
+* osd: preliminary cache pool support (no snaps) (Greg Farnum, Sage Weil)
+* rados tool: fix listomapvals (Josh Durgin)
+* rados: add 'crush location', smart replica selection/balancing (Sage Weil)
+* rados: some performance optimizations (Yehuda Sadeh)
+* rbd: add rbdmap support for upstart (Laurent Barbe)
+* rbd: expose kernel rbd client options via 'rbd map' (Ilya Dryomov)
+* rbd: fix bench-write command (Hoamai Wang)
+* rbd: support for 4096 mapped devices, up from ~250 (Ilya Dryomov)
+* rgw: allow multiple frontends (Yehuda Sadeh)
+* rgw: convert bucket info to new format on demand (Yehuda Sadeh)
+* rgw: fix misc CORS bugs (Robin H. Johnson)
+* rgw: prototype mongoose frontend (Yehuda Sadeh)
+
+
+
+v0.74
+=====
+
+This release includes a few substantial pieces for Firefly, including
+a long-overdue switch to 3x replication by default and a switch to the
+"new" CRUSH tunables by default (supported since bobtail).  There is
+also a fix for a long-standing radosgw bug (stalled GET) that has
+already been backported to emperor and dumpling.
+
+Upgrading
+---------
+
+* We now default to the 'bobtail' CRUSH tunable values that are first supported
+  by Ceph clients in bobtail (v0.56) and Linux kernel version v3.9.  If you
+  plan to access a newly created Ceph cluster with an older kernel client, you
+  should use 'ceph osd crush tunables legacy' to switch back to the legacy
+  behavior.  Note that making that change will likely result in some data
+  movement in the system, so adjust the setting before populating the new
+  cluster with data.
+
+* We now set the HASHPSPOOL flag on newly created pools (and new
+  clusters) by default.  Support for this flag first appeared in
+  v0.64; v0.67 Dumpling is the first major release that supports it.
+  It is first supported by the Linux kernel version v3.9.  If you plan
+  to access a newly created Ceph cluster with an older kernel or
+  clients (e.g, librados, librbd) from a pre-dumpling Ceph release,
+  you should add 'osd pool default flag hashpspool = false' to the
+  '[global]' section of your 'ceph.conf' prior to creating your
+  monitors (e.g., after 'ceph-deploy new' but before 'ceph-deploy mon
+  create ...').
+
+* The configuration option 'osd pool default crush rule' is deprecated
+  and replaced with 'osd pool default crush replicated ruleset'. 'osd
+  pool default crush rule' takes precedence for backward compatibility
+  and a deprecation warning is displayed when it is used.
+
+Notable Changes
+---------------
+
+* buffer: some zero-copy groundwork (Josh Durgin)
+* ceph-disk: avoid fd0 (Loic Dachary)
+* crush: default to bobtail tunables (Sage Weil)
+* crush: many additional tests (Loic Dachary)
+* crush: misc fixes, cleanups (Loic Dachary)
+* crush: new rule steps to adjust retry attempts (Sage Weil)
+* debian: integrate misc fixes from downstream packaging (James Page)
+* doc: big update to install docs (John Wilkins)
+* libcephfs: fix resource leak (Zheng Yan)
+* misc coverity fixes (Xing Lin, Li Wang, Danny Al-Gaaf)
+* misc portability fixes (Noah Watkins, Alan Somers)
+* mon, osd: new 'erasure' pool type (still not fully supported)
+* mon: add 'mon getmap EPOCH' (Joao Eduardo Luis)
+* mon: collect misc metadata about osd (os, kernel, etc.), new 'osd metadata' command (Sage Weil)
+* osd: default to 3x replication
+* osd: do not include backfill targets in acting set (David Zafman)
+* osd: new 'chassis' type in default crush hierarchy (Sage Weil)
+* osd: requery unfound on stray notify (#6909) (Samuel Just)
+* osd: some PGBackend infrastructure (Samuel Just)
+* osd: support for new 'memstore' (memory-backed) backend (Sage Weil)
+* rgw: fix fastcgi deadlock (do not return data from librados callback) (Yehuda Sadeh)
+* rgw: fix reading bucket policy (#6940)
+* rgw: fix use-after-free when releasing completion handle (Yehuda Sadeh)
+
+
+v0.73
+=====
+
+This release, the first development release after emperor, includes
+many bug fixes and a few additional pieces of functionality.  The
+first batch of larger changes will be landing in the next version,
+v0.74.
+
+Upgrading
+---------
+
+- As part of fix for #6796, 'ceph osd pool set <pool> <var> <arg>' now
+  receives <arg> as an integer instead of a string.  This affects how
+  'hashpspool' flag is set/unset: instead of 'true' or 'false', it now
+  must be '0' or '1'.
+
+- The behavior of the CRUSH 'indep' choose mode has been changed.  No
+  ceph cluster should have been using this behavior unless someone has
+  manually extracted a crush map, modified a CRUSH rule to replace
+  'firstn' with 'indep', recompiled, and reinjected the new map into
+  the cluster.  If the 'indep' mode is currently in use on a cluster,
+  the rule should be modified to use 'firstn' instead, and the
+  administrator should wait until any data movement completes before
+  upgrading.
+
+- The 'osd dump' command now dumps pool snaps as an array instead of an
+  object.
+
+- The radosgw init script (sysvinit) how requires that the 'host = ...' line in
+  ceph.conf, if present, match the short hostname (the output of 'hostname -s'),
+  not the fully qualified hostname or the (occasionally non-short) output of
+  'hostname'.  Failure to adjust this when upgrading from emperor or dumpling
+  may prevent the radosgw daemon from starting.
+
+
+Notable Changes
+---------------
+
+* ceph-crush-location: new hook for setting CRUSH location of osd daemons on start
+* ceph-kvstore-tool: expanded command set and capabilities (Joao Eduardo Luis)
+* ceph.spec: fix build dependency (Loic Dachary)
+* common: fix aligned buffer allocation (Loic Dachary)
+* doc: many many install doc improvements (John Wilkins)
+* mds: fix readdir end check (Zheng Yan)
+* mds: update old-format backtraces opportunistically (Zheng Yan)
+* misc cleanups from coverity (Xing Lin)
+* misc portability fixes (Noah Watkins, Christophe Courtaut, Alan Somers, huanjun)
+* mon: 'osd dump' dumps pool snaps as array, not object (Dan Mick)
+* mon: allow debug quorum_{enter,exit} commands via admin socket
+* mon: prevent extreme changes in pool pg_num (Greg Farnum)
+* mon: take 'osd pool set ...' value as an int, not string (Joao Eduardo Luis)
+* mon: trim MDSMaps (Joao Eduardo Luis)
+* osd: fix object_info_t encoding bug from emperor (Sam Just)
+* rbd: add 'rbdmap' init script for mapping rbd images on book (Adam Twardowski)
+* rgw: add 'status' command to sysvinit script (David Moreau Simard)
+* rgw: fix error setting empty owner on ACLs (Yehuda Sadeh)
+* rgw: optionally defer to bucket ACLs instead of object ACLs (Liam Monahan)
+* rgw: support for password (instead of admin token) for keystone authentication (Christophe Courtaut)
+* sysvinit, upstart: prevent both init systems from starting the same daemons (Josh Durgin)
+
+v0.72.3 Emperor (pending release)
+=================================
+
+Upgrading
+---------
+
+* Monitor 'auth' read-only commands now expect the user to have 'rx' caps.
+  This is the same behavior that was present in dumpling, but in emperor
+  and more recent development releases the 'r' cap was sufficient.  Note that
+  this backported security fix will break mon keys that are using the following
+  commands but do not have the 'x' bit in the mon capability::
+
+    ceph auth export
+    ceph auth get
+    ceph auth get-key
+    ceph auth print-key
+    ceph auth list
+
+
+v0.72.2 Emperor
+===============
+
+This is the second bugfix release for the v0.72.x Emperor series.  We
+have fixed a hang in radosgw, and fixed (again) a problem with monitor
+CLI compatiblity with mixed version monitors.  (In the future this
+will no longer be a problem.)
+
+Upgrading
+---------
+
+* The JSON schema for the 'osd pool set ...' command changed slightly.  Please
+  avoid issuing this particular command via the CLI while there is a mix of
+  v0.72.1 and v0.72.2 monitor daemons running.
+
+* As part of fix for #6796, 'ceph osd pool set <pool> <var> <arg>' now
+  receives <arg> as an integer instead of a string.  This affects how
+  'hashpspool' flag is set/unset: instead of 'true' or 'false', it now
+  must be '0' or '1'.
+
+
+Changes
+-------
+
+* mon: 'osd pool set ...' syntax change
+* osd: added test for missing on-disk HEAD object
+* osd: fix osd bench block size argument
+* rgw: fix hang on large object GET
+* rgw: fix rare use-after-free
+* rgw: various DR bug fixes
+* rgw: do not return error on empty owner when setting ACL
+* sysvinit, upstart: prevent starting daemons using both init systems
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.72.2.txt>`.
+
+v0.72.1 Emperor
+===============
+
+Important Note
+--------------
+
+When you are upgrading from Dumpling to Emperor, do not run any of the
+"ceph osd pool set" commands while your monitors are running separate versions.
+Doing so could result in inadvertently changing cluster configuration settings
+that exhaust compute resources in your OSDs.
+
+Changes
+-------
+
+* osd: fix upgrade bug #6761
+* ceph_filestore_tool: introduced tool to repair errors caused by #6761
+
+This release addresses issue #6761.  Upgrading to Emperor can cause
+reads to begin returning ENFILE (too many open files).  v0.72.1 fixes
+that upgrade issue and adds a tool ceph_filestore_tool to repair osd
+stores affected by this bug.
+
+To repair a cluster affected by this bug:
+
+#. Upgrade all osd machines to v0.72.1
+#. Install the ceph-test package on each osd machine to get ceph_filestore_tool
+#. Stop all osd processes
+#. To see all lost objects, run the following on each osd with the osd stopped and
+   the osd data directory mounted::
+
+     ceph_filestore_tool --list-lost-objects=true --filestore-path=<path-to-osd-filestore> --journal-path=<path-to-osd-journal>
+
+#. To fix all lost objects, run the following on each osd with the
+   osd stopped and the osd data directory mounted::
+
+     ceph_filestore_tool --fix-lost-objects=true --list-lost-objects=true --filestore-path=<path-to-osd-filestore> --journal-path=<path-to-osd-journal>
+
+#. Once lost objects have been repaired on each osd, you can restart
+   the cluster.
+
+Note, the ceph_filestore_tool performs a scan of all objects on the
+osd and may take some time.
+
+
+v0.72 Emperor
+=============
+
+This is the fifth major release of Ceph, the fourth since adopting a
+3-month development cycle.  This release brings several new features,
+including multi-datacenter replication for the radosgw, improved
+usability, and lands a lot of incremental performance and internal
+refactoring work to support upcoming features in Firefly.
+
+Important Note
+--------------
+
+When you are upgrading from Dumpling to Emperor, do not run any of the
+"ceph osd pool set" commands while your monitors are running separate versions.
+Doing so could result in inadvertently changing cluster configuration settings
+that exhaust compute resources in your OSDs.
+
+Highlights
+----------
+
+* common: improved crc32c performance
+* librados: new example client and class code
+* mds: many bug fixes and stability improvements
+* mon: health warnings when pool pg_num values are not reasonable
+* mon: per-pool performance stats
+* osd, librados: new object copy primitives
+* osd: improved interaction with backend file system to reduce latency
+* osd: much internal refactoring to support ongoing erasure coding and tiering support
+* rgw: bucket quotas
+* rgw: improved CORS support
+* rgw: performance improvements
+* rgw: validate S3 tokens against Keystone
+
+Coincident with core Ceph, the Emperor release also brings:
+
+* radosgw-agent: support for multi-datacenter replication for disaster recovery
+* tgt: improved support for iSCSI via upstream tgt
+
+Packages for both are available on ceph.com.
+
+Upgrade sequencing
+------------------
+
+There are no specific upgrade restrictions on the order or sequence of
+upgrading from 0.67.x Dumpling. However, you cannot run any of the
+"ceph osd pool set" commands while your monitors are running separate versions.
+Doing so could result in inadvertently changing cluster configuration settings
+and exhausting compute resources in your OSDs.
+
+It is also possible to do a rolling upgrade from 0.61.x Cuttlefish,
+but there are ordering restrictions.  (This is the same set of
+restrictions for Cuttlefish to Dumpling.)
+
+#. Upgrade ceph-common on all nodes that will use the command line 'ceph' utility.
+#. Upgrade all monitors (upgrade ceph package, restart ceph-mon
+   daemons).  This can happen one daemon or host at a time.  Note that
+   because cuttlefish and dumpling monitors can't talk to each other,
+   all monitors should be upgraded in relatively short succession to
+   minimize the risk that an a untimely failure will reduce
+   availability.
+#. Upgrade all osds (upgrade ceph package, restart ceph-osd daemons).
+   This can happen one daemon or host at a time.
+#. Upgrade radosgw (upgrade radosgw package, restart radosgw daemons).
+
+
+Upgrading from v0.71
+--------------------
+
+* ceph-fuse and radosgw now use the same default values for the admin
+  socket and log file paths that the other daemons (ceph-osd,
+  ceph-mon, etc.) do.  If you run these daemons as non-root, you may
+  need to adjust your ceph.conf to disable these options or to adjust
+  the permissions on /var/run/ceph and /var/log/ceph.
+
+Upgrading from v0.67 Dumpling
+-----------------------------
+
+* ceph-fuse and radosgw now use the same default values for the admin
+  socket and log file paths that the other daemons (ceph-osd,
+  ceph-mon, etc.) do.  If you run these daemons as non-root, you may
+  need to adjust your ceph.conf to disable these options or to adjust
+  the permissions on /var/run/ceph and /var/log/ceph.
+
+* The MDS now disallows snapshots by default as they are not
+  considered stable.  The command 'ceph mds set allow_snaps' will
+  enable them.
+
+* For clusters that were created before v0.44 (pre-argonaut, Spring
+  2012) and store radosgw data, the auto-upgrade from TMAP to OMAP
+  objects has been disabled.  Before upgrading, make sure that any
+  buckets created on pre-argonaut releases have been modified (e.g.,
+  by PUTing and then DELETEing an object from each bucket).  Any
+  cluster created with argonaut (v0.48) or a later release or not
+  using radosgw never relied on the automatic conversion and is not
+  affected by this change.
+
+* Any direct users of the 'tmap' portion of the librados API should be
+  aware that the automatic tmap -> omap conversion functionality has
+  been removed.
+
+* Most output that used K or KB (e.g., for kilobyte) now uses a
+  lower-case k to match the official SI convention.  Any scripts that
+  parse output and check for an upper-case K will need to be modified.
+
+* librados::Rados::pool_create_async() and librados::Rados::pool_delete_async()
+  don't drop a reference to the completion object on error, caller needs to take
+  care of that. This has never really worked correctly and we were leaking an
+  object
+
+* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
+  specified location, as that's a job for 'ceph osd crush add'.  It will
+  however continue to work just the same as long as the osd already exists
+  in the crush map.
+
+* The OSD now enforces that class write methods cannot both mutate an
+  object and return data.  The rbd.assign_bid method, the lone
+  offender, has been removed.  This breaks compatibility with
+  pre-bobtail librbd clients by preventing them from creating new
+  images.
+
+* librados now returns on commit instead of ack for synchronous calls.
+  This is a bit safer in the case where both OSDs and the client crash, and
+  is probably how it should have been acting from the beginning. Users are
+  unlikely to notice but it could result in lower performance in some
+  circumstances. Those who care should switch to using the async interfaces,
+  which let you specify safety semantics precisely.
+
+* The C++ librados AioComplete::get_version() method was incorrectly
+  returning an int (usually 32-bits).  To avoid breaking library
+  compatibility, a get_version64() method is added that returns the
+  full-width value.  The old method is deprecated and will be removed
+  in a future release.  Users of the C++ librados API that make use of
+  the get_version() method should modify their code to avoid getting a
+  value that is truncated from 64 to to 32 bits.
+
+
+Notable Changes since v0.71
+---------------------------
+
+* build: fix [/usr]/sbin locations (Alan Somers)
+* ceph-fuse, radosgw: enable admin socket and logging by default
+* ceph: make -h behave when monitors are down
+* common: cache crc32c values where possible
+* common: fix looping on BSD (Alan Somers)
+* librados, mon: ability to query/ping out-of-quorum monitor status (Joao Luis)
+* librbd python bindings: fix parent image name limit (Josh Durgin)
+* mds: avoid leaking objects when deleting truncated files (Yan, Zheng)
+* mds: fix F_GETLK (Yan, Zheng)
+* mds: fix many bugs with stray (unlinked) inodes (Yan, Zheng)
+* mds: fix many directory fragmentation bugs (Yan, Zheng)
+* mon: allow (un)setting HASHPSPOOL flag on existing pools (Joao Luis)
+* mon: make 'osd pool rename' idempotent (Joao Luis)
+* osd: COPY_GET on-wire encoding improvements (Greg Farnum)
+* osd: bloom_filter encodability, fixes, cleanups (Loic Dachary, Sage Weil)
+* osd: fix handling of racing read vs write (Samuel Just)
+* osd: reduce blocking on backing fs (Samuel Just)
+* radosgw-agent: multi-region replication/DR
+* rgw: fix/improve swift COPY support (Yehuda Sadeh)
+* rgw: misc fixes to support DR (Josh Durgin, Yehuda Sadeh)
+* rgw: per-bucket quota (Yehuda Sadeh)
+* rpm: fix junit dependencies (Alan Grosskurth)
+
+Notable Changes since v0.67 Dumpling
+------------------------------------
+
+* build cleanly under clang (Christophe Courtaut)
+* build: Makefile refactor (Roald J. van Loon)
+* build: fix [/usr]/sbin locations (Alan Somers)
+* ceph-disk: fix journal preallocation
+* ceph-fuse, radosgw: enable admin socket and logging by default
+* ceph-fuse: fix problem with readahead vs truncate race (Yan, Zheng)
+* ceph-fuse: trim deleted inodes from cache (Yan, Zheng)
+* ceph-fuse: use newer fuse api (Jianpeng Ma)
+* ceph-kvstore-tool: new tool for working with leveldb (copy, crc) (Joao Luis)
+* ceph-post-file: new command to easily share logs or other files with ceph devs
+* ceph: improve parsing of CEPH_ARGS (Benoit Knecht)
+* ceph: make -h behave when monitors are down
+* ceph: parse CEPH_ARGS env variable
+* common: bloom_filter improvements, cleanups
+* common: cache crc32c values where possible
+* common: correct SI is kB not KB (Dan Mick)
+* common: fix looping on BSD (Alan Somers)
+* common: migrate SharedPtrRegistry to use boost::shared_ptr<> (Loic Dachary)
+* common: misc portability fixes (Noah Watkins)
+* crc32c: fix optimized crc32c code (it now detects arch support properly)
+* crc32c: improved intel-optimized crc32c support (~8x faster on my laptop!)
+* crush: fix name caching
+* doc: erasure coding design notes (Loic Dachary)
+* hadoop: removed old version of shim to avoid confusing users (Noah Watkins)
+* librados, mon: ability to query/ping out-of-quorum monitor status (Joao Luis)
+* librados: fix async aio completion wakeup
+* librados: fix installed header #includes (Dan Mick)
+* librados: get_version64() method for C++ API
+* librados: hello_world example (Greg Farnum)
+* librados: sync calls now return on commit (instead of ack) (Greg Farnum)
+* librbd python bindings: fix parent image name limit (Josh Durgin)
+* librbd, ceph-fuse: avoid some sources of ceph-fuse, rbd cache stalls
+* mds: avoid leaking objects when deleting truncated files (Yan, Zheng)
+* mds: fix F_GETLK (Yan, Zheng)
+* mds: fix LOOKUPSNAP bug
+* mds: fix heap profiler commands (Joao Luis)
+* mds: fix locking deadlock (David Disseldorp)
+* mds: fix many bugs with stray (unlinked) inodes (Yan, Zheng)
+* mds: fix many directory fragmentation bugs (Yan, Zheng)
+* mds: fix mds rejoin with legacy parent backpointer xattrs (Alexandre Oliva)
+* mds: fix rare restart/failure race during fs creation
+* mds: fix standby-replay when we fall behind (Yan, Zheng)
+* mds: fix stray directory purging (Yan, Zheng)
+* mds: notify clients about deleted files (so they can release from their cache) (Yan, Zheng)
+* mds: several bug fixes with clustered mds (Yan, Zheng)
+* mon, osd: improve osdmap trimming logic (Samuel Just)
+* mon, osd: initial CLI for configuring tiering
+* mon: a few 'ceph mon add' races fixed (command is now idempotent) (Joao Luis)
+* mon: allow (un)setting HASHPSPOOL flag on existing pools (Joao Luis)
+* mon: allow cap strings with . to be unquoted
+* mon: allow logging level of cluster log (/var/log/ceph/ceph.log) to be adjusted
+* mon: avoid rewriting full osdmaps on restart (Joao Luis)
+* mon: continue to discover peer addr info during election phase
+* mon: disallow CephFS snapshots until 'ceph mds set allow_new_snaps' (Greg Farnum)
+* mon: do not expose uncommitted state from 'osd crush {add,set} ...' (Joao Luis)
+* mon: fix 'ceph osd crush reweight ...' (Joao Luis)
+* mon: fix 'osd crush move ...' command for buckets (Joao Luis)
+* mon: fix byte counts (off by factor of 4) (Dan Mick, Joao Luis)
+* mon: fix paxos corner case
+* mon: kv properties for pools to support EC (Loic Dachary)
+* mon: make 'osd pool rename' idempotent (Joao Luis)
+* mon: modify 'auth add' semantics to make a bit more sense (Joao Luis)
+* mon: new 'osd perf' command to dump recent performance information (Samuel Just)
+* mon: new and improved 'ceph -s' or 'ceph status' command (more info, easier to read)
+* mon: some auth check cleanups (Joao Luis)
+* mon: track per-pool stats (Joao Luis)
+* mon: warn about pools with bad pg_num
+* mon: warn when mon data stores grow very large (Joao Luis)
+* monc: fix small memory leak
+* new wireshark patches pulled into the tree (Kevin Jones)
+* objecter, librados: redirect requests based on cache tier config
+* objecter: fix possible hang when cluster is unpaused (Josh Durgin)
+* osd, librados: add new COPY_FROM rados operation
+* osd, librados: add new COPY_GET rados operations (used by COPY_FROM)
+* osd: 'osd recover clone overlap limit' option to limit cloning during recovery (Samuel Just)
+* osd: COPY_GET on-wire encoding improvements (Greg Farnum)
+* osd: add 'osd heartbeat min healthy ratio' configurable (was hard-coded at 33%)
+* osd: add option to disable pg log debug code (which burns CPU)
+* osd: allow cap strings with . to be unquoted
+* osd: automatically detect proper xattr limits (David Zafman)
+* osd: avoid extra copy in erasure coding reference implementation (Loic Dachary)
+* osd: basic cache pool redirects (Greg Farnum)
+* osd: basic whiteout, dirty flag support (not yet used)
+* osd: bloom_filter encodability, fixes, cleanups (Loic Dachary, Sage Weil)
+* osd: clean up and generalize copy-from code (Greg Farnum)
+* osd: cls_hello OSD class example
+* osd: erasure coding doc updates (Loic Dachary)
+* osd: erasure coding plugin infrastructure, tests (Loic Dachary)
+* osd: experiemental support for ZFS (zfsonlinux.org) (Yan, Zheng)
+* osd: fix RWORDER flags
+* osd: fix exponential backoff of slow request warnings (Loic Dachary)
+* osd: fix handling of racing read vs write (Samuel Just)
+* osd: fix version value returned by various operations (Greg Farnum)
+* osd: generalized temp object infrastructure
+* osd: ghobject_t infrastructure for EC (David Zafman)
+* osd: improvements for compatset support and storage (David Zafman)
+* osd: infrastructure to copy objects from other OSDs
+* osd: instrument peering states (David Zafman)
+* osd: misc copy-from improvements
+* osd: opportunistic crc checking on stored data (off by default)
+* osd: properly enforce RD/WR flags for rados classes
+* osd: reduce blocking on backing fs (Samuel Just)
+* osd: refactor recovery using PGBackend (Samuel Just)
+* osd: remove old magical tmap->omap conversion
+* osd: remove old pg log on upgrade (Samuel Just)
+* osd: revert xattr size limit (fixes large rgw uploads)
+* osd: use fdatasync(2) instead of fsync(2) to improve performance (Sam Just)
+* pybind: fix blacklisting nonce (Loic Dachary)
+* radosgw-agent: multi-region replication/DR
+* rgw: complete in-progress requests before shutting down
+* rgw: default log level is now more reasonable (Yehuda Sadeh)
+* rgw: fix S3 auth with response-* query string params (Sylvain Munaut, Yehuda Sadeh)
+* rgw: fix a few minor memory leaks (Yehuda Sadeh)
+* rgw: fix acl group check (Yehuda Sadeh)
+* rgw: fix inefficient use of std::list::size() (Yehuda Sadeh)
+* rgw: fix major CPU utilization bug with internal caching (Yehuda Sadeh, Mark Nelson)
+* rgw: fix ordering of write operations (preventing data loss on crash) (Yehuda Sadeh)
+* rgw: fix ordering of writes for mulitpart upload (Yehuda Sadeh)
+* rgw: fix various CORS bugs (Yehuda Sadeh)
+* rgw: fix/improve swift COPY support (Yehuda Sadeh)
+* rgw: improve help output (Christophe Courtaut)
+* rgw: misc fixes to support DR (Josh Durgin, Yehuda Sadeh)
+* rgw: per-bucket quota (Yehuda Sadeh)
+* rgw: validate S3 tokens against keystone (Roald J. van Loon)
+* rgw: wildcard support for keystone roles (Christophe Courtaut)
+* rpm: fix junit dependencies (Alan Grosskurth)
+* sysvinit radosgw: fix status return code (Danny Al-Gaaf)
+* sysvinit rbdmap: fix error 'service rbdmap stop' (Laurent Barbe)
+* sysvinit: add condrestart command (Dan van der Ster)
+* sysvinit: fix shutdown order (mons last) (Alfredo Deza)
+
+
+
+v0.71
+=====
+
+This development release includes a significant amount of new code and
+refactoring, as well as a lot of preliminary functionality that will be needed
+for erasure coding and tiering support.  There are also several significant
+patch sets improving this with the MDS.
+
+Upgrading
+---------
+
+* The MDS now disallows snapshots by default as they are not
+  considered stable.  The command 'ceph mds set allow_snaps' will
+  enable them.
+
+* For clusters that were created before v0.44 (pre-argonaut, Spring
+  2012) and store radosgw data, the auto-upgrade from TMAP to OMAP
+  objects has been disabled.  Before upgrading, make sure that any
+  buckets created on pre-argonaut releases have been modified (e.g.,
+  by PUTing and then DELETEing an object from each bucket).  Any
+  cluster created with argonaut (v0.48) or a later release or not
+  using radosgw never relied on the automatic conversion and is not
+  affected by this change.
+
+* Any direct users of the 'tmap' portion of the librados API should be
+  aware that the automatic tmap -> omap conversion functionality has
+  been removed.
+
+* Most output that used K or KB (e.g., for kilobyte) now uses a
+  lower-case k to match the official SI convention.  Any scripts that
+  parse output and check for an upper-case K will need to be modified.
+
+Notable Changes
+---------------
+
+* build: Makefile refactor (Roald J. van Loon)
+* ceph-disk: fix journal preallocation
+* ceph-fuse: trim deleted inodes from cache (Yan, Zheng)
+* ceph-fuse: use newer fuse api (Jianpeng Ma)
+* ceph-kvstore-tool: new tool for working with leveldb (copy, crc) (Joao Luis)
+* common: bloom_filter improvements, cleanups
+* common: correct SI is kB not KB (Dan Mick)
+* common: misc portability fixes (Noah Watkins)
+* hadoop: removed old version of shim to avoid confusing users (Noah Watkins)
+* librados: fix installed header #includes (Dan Mick)
+* librbd, ceph-fuse: avoid some sources of ceph-fuse, rbd cache stalls
+* mds: fix LOOKUPSNAP bug
+* mds: fix standby-replay when we fall behind (Yan, Zheng)
+* mds: fix stray directory purging (Yan, Zheng)
+* mon: disallow CephFS snapshots until 'ceph mds set allow_new_snaps' (Greg Farnum)
+* mon, osd: improve osdmap trimming logic (Samuel Just)
+* mon: kv properties for pools to support EC (Loic Dachary)
+* mon: some auth check cleanups (Joao Luis)
+* mon: track per-pool stats (Joao Luis)
+* mon: warn about pools with bad pg_num
+* osd: automatically detect proper xattr limits (David Zafman)
+* osd: avoid extra copy in erasure coding reference implementation (Loic Dachary)
+* osd: basic cache pool redirects (Greg Farnum)
+* osd: basic whiteout, dirty flag support (not yet used)
+* osd: clean up and generalize copy-from code (Greg Farnum)
+* osd: erasure coding doc updates (Loic Dachary)
+* osd: erasure coding plugin infrastructure, tests (Loic Dachary)
+* osd: fix RWORDER flags
+* osd: fix exponential backoff of slow request warnings (Loic Dachary)
+* osd: generalized temp object infrastructure
+* osd: ghobject_t infrastructure for EC (David Zafman)
+* osd: improvements for compatset support and storage (David Zafman)
+* osd: misc copy-from improvements
+* osd: opportunistic crc checking on stored data (off by default)
+* osd: refactor recovery using PGBackend (Samuel Just)
+* osd: remove old magical tmap->omap conversion
+* pybind: fix blacklisting nonce (Loic Dachary)
+* rgw: default log level is now more reasonable (Yehuda Sadeh)
+* rgw: fix acl group check (Yehuda Sadeh)
+* sysvinit: fix shutdown order (mons last) (Alfredo Deza)
+
+v0.70
+=====
+
+Upgrading
+---------
+
+* librados::Rados::pool_create_async() and librados::Rados::pool_delete_async()
+  don't drop a reference to the completion object on error, caller needs to take
+  care of that. This has never really worked correctly and we were leaking an
+  object
+
+* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
+  specified location, as that's a job for 'ceph osd crush add'.  It will
+  however continue to work just the same as long as the osd already exists
+  in the crush map.
+
+Notable Changes
+---------------
+
+* mon: a few 'ceph mon add' races fixed (command is now idempotent) (Joao Luis)
+* crush: fix name caching
+* rgw: fix a few minor memory leaks (Yehuda Sadeh)
+* ceph: improve parsing of CEPH_ARGS (Benoit Knecht)
+* mon: avoid rewriting full osdmaps on restart (Joao Luis)
+* crc32c: fix optimized crc32c code (it now detects arch support properly)
+* mon: fix 'ceph osd crush reweight ...' (Joao Luis)
+* osd: revert xattr size limit (fixes large rgw uploads)
+* mds: fix heap profiler commands (Joao Luis)
+* rgw: fix inefficient use of std::list::size() (Yehuda Sadeh)
+
+
+v0.69
+=====
+
+Upgrading
+---------
+
+* The sysvinit /etc/init.d/ceph script will, by default, update the
+  CRUSH location of an OSD when it starts.  Previously, if the
+  monitors were not available, this command would hang indefinitely.
+  Now, that step will time out after 10 seconds and the ceph-osd daemon
+  will not be started.
+
+* Users of the librados C++ API should replace users of get_version()
+  with get_version64() as the old method only returns a 32-bit value
+  for a 64-bit field.  The existing 32-bit get_version() method is now
+  deprecated.
+
+* The OSDs are now more picky that request payload match their
+  declared size.  A write operation across N bytes that includes M
+  bytes of data will now be rejected.  No known clients do this, but
+  the because the server-side behavior has changed it is possible that
+  an application misusing the interface may now get errors.
+
+* The OSD now enforces that class write methods cannot both mutate an
+  object and return data.  The rbd.assign_bid method, the lone
+  offender, has been removed.  This breaks compatibility with
+  pre-bobtail librbd clients by preventing them from creating new
+  images.
+
+* librados now returns on commit instead of ack for synchronous calls.
+  This is a bit safer in the case where both OSDs and the client crash, and
+  is probably how it should have been acting from the beginning. Users are
+  unlikely to notice but it could result in lower performance in some
+  circumstances. Those who care should switch to using the async interfaces,
+  which let you specify safety semantics precisely.
+
+* The C++ librados AioComplete::get_version() method was incorrectly
+  returning an int (usually 32-bits).  To avoid breaking library
+  compatibility, a get_version64() method is added that returns the
+  full-width value.  The old method is deprecated and will be removed
+  in a future release.  Users of the C++ librados API that make use of
+  the get_version() method should modify their code to avoid getting a
+  value that is truncated from 64 to to 32 bits.
+
+
+Notable Changes
+---------------
+
+* build cleanly under clang (Christophe Courtaut)
+* common: migrate SharedPtrRegistry to use boost::shared_ptr<> (Loic Dachary)
+* doc: erasure coding design notes (Loic Dachary)
+* improved intel-optimized crc32c support (~8x faster on my laptop!)
+* librados: get_version64() method for C++ API
+* mds: fix locking deadlock (David Disseldorp)
+* mon, osd: initial CLI for configuring tiering
+* mon: allow cap strings with . to be unquoted
+* mon: continue to discover peer addr info during election phase
+* mon: fix 'osd crush move ...' command for buckets (Joao Luis)
+* mon: warn when mon data stores grow very large (Joao Luis)
+* objecter, librados: redirect requests based on cache tier config
+* osd, librados: add new COPY_FROM rados operation
+* osd, librados: add new COPY_GET rados operations (used by COPY_FROM)
+* osd: add 'osd heartbeat min healthy ratio' configurable (was hard-coded at 33%)
+* osd: add option to disable pg log debug code (which burns CPU)
+* osd: allow cap strings with . to be unquoted
+* osd: fix version value returned by various operations (Greg Farnum)
+* osd: infrastructure to copy objects from other OSDs
+* osd: use fdatasync(2) instead of fsync(2) to improve performance (Sam Just)
+* rgw: fix major CPU utilization bug with internal caching (Yehuda Sadeh, Mark Nelson)
+* rgw: fix ordering of write operations (preventing data loss on crash) (Yehuda Sadeh)
+* rgw: fix ordering of writes for mulitpart upload (Yehuda Sadeh)
+* rgw: fix various CORS bugs (Yehuda Sadeh)
+* rgw: improve help output (Christophe Courtaut)
+* rgw: validate S3 tokens against keystone (Roald J. van Loon)
+* rgw: wildcard support for keystone roles (Christophe Courtaut)
+* sysvinit radosgw: fix status return code (Danny Al-Gaaf)
+* sysvinit rbdmap: fix error 'service rbdmap stop' (Laurent Barbe)
+
+v0.68
+=====
+
+Upgrading
+---------
+
+* 'ceph osd crush set <id> <weight> <loc..>' no longer adds the osd to the
+  specified location, as that's a job for 'ceph osd crush add'.  It will
+  however continue to work just the same as long as the osd already exists
+  in the crush map.
+
+* The OSD now enforces that class write methods cannot both mutate an
+  object and return data.  The rbd.assign_bid method, the lone
+  offender, has been removed.  This breaks compatibility with
+  pre-bobtail librbd clients by preventing them from creating new
+  images.
+
+* librados now returns on commit instead of ack for synchronous calls.
+  This is a bit safer in the case where both OSDs and the client crash, and
+  is probably how it should have been acting from the beginning. Users are
+  unlikely to notice but it could result in lower performance in some
+  circumstances. Those who care should switch to using the async interfaces,
+  which let you specify safety semantics precisely.
+
+* The C++ librados AioComplete::get_version() method was incorrectly
+  returning an int (usually 32-bits).  To avoid breaking library
+  compatibility, a get_version64() method is added that returns the
+  full-width value.  The old method is deprecated and will be removed
+  in a future release.  Users of the C++ librados API that make use of
+  the get_version() method should modify their code to avoid getting a
+  value that is truncated from 64 to to 32 bits.
+
+
+
+Notable Changes
+---------------
+
+* ceph-fuse: fix problem with readahead vs truncate race (Yan, Zheng)
+* ceph-post-file: new command to easily share logs or other files with ceph devs
+* ceph: parse CEPH_ARGS env variable
+* librados: fix async aio completion wakeup
+* librados: hello_world example (Greg Farnum)
+* librados: sync calls now return on commit (instead of ack) (Greg Farnum)
+* mds: fix mds rejoin with legacy parent backpointer xattrs (Alexandre Oliva)
+* mds: fix rare restart/failure race during fs creation
+* mds: notify clients about deleted files (so they can release from their cache) (Yan, Zheng)
+* mds: several bug fixes with clustered mds (Yan, Zheng)
+* mon: allow logging level of cluster log (/var/log/ceph/ceph.log) to be adjusted
+* mon: do not expose uncommitted state from 'osd crush {add,set} ...' (Joao Luis)
+* mon: fix byte counts (off by factor of 4) (Dan Mick, Joao Luis)
+* mon: fix paxos corner case
+* mon: modify 'auth add' semantics to make a bit more sense (Joao Luis)
+* mon: new 'osd perf' command to dump recent performance information (Samuel Just)
+* mon: new and improved 'ceph -s' or 'ceph status' command (more info, easier to read)
+* monc: fix small memory leak
+* new wireshark patches pulled into the tree (Kevin Jones)
+* objecter: fix possible hang when cluster is unpaused (Josh Durgin)
+* osd: 'osd recover clone overlap limit' option to limit cloning during recovery (Samuel Just)
+* osd: cls_hello OSD class example
+* osd: experiemental support for ZFS (zfsonlinux.org) (Yan, Zheng)
+* osd: instrument peering states (David Zafman)
+* osd: properly enforce RD/WR flags for rados classes
+* osd: remove old pg log on upgrade (Samuel Just)
+* rgw: complete in-progress requests before shutting down
+* rgw: fix S3 auth with response-* query string params (Sylvain Munaut, Yehuda Sadeh)
+* sysvinit: add condrestart command (Dan van der Ster)
+
+
+v0.67.12 "Dumpling" (draft)
+===========================
+
+This stable update for Dumpling fixes a few longstanding issues with
+backfill in the OSD that can lead to stalled IOs.  There is also a fix
+for memory utilization for reads in librbd when caching is enabled,
+and then several other small fixes across the rest of the system.
+
+Dumpling users who have encountered IO stalls during backfill and who
+do not expect to upgrade to Firefly soon should upgrade.  Everyone
+else should upgrade to Firefly already.  This is likely to be the last stable
+release for the 0.67.x Dumpling series.
+
+
+Notable Changes
+---------------
+
+* buffer: fix buffer rebuild alignment corner case (#6614 #6003 Loic Dachary, Samuel Just)
+* ceph-disk: reprobe partitions after zap (#9665 #9721 Loic Dachary)
+* ceph-disk: use partx instead of partprobe when appropriate (Loic Dachary)
+* common: add $cctid meta variable (#6228 Adam Crume)
+* crush: fix get_full_location_ordered (Sage Weil)
+* crush: pick ruleset id that matches rule_id (#9675 Xiaoxi Chen)
+* libcephfs: fix tid wrap bug (#9869 Greg Farnum)
+* libcephfs: get osd location on -1 should return EINVAL (Sage Weil)
+* librados: fix race condition with C API and op timeouts (#9582 Sage Weil)
+* librbd: constrain max number of in-flight read requests (#9854 Jason Dillaman)
+* librbd: enforce cache size on read requests (Jason Dillaman)
+* librbd: fix invalid close in image open failure path (#10030 Jason Dillaman)
+* librbd: fix read hang on sparse files (Jason Dillaman)
+* librbd: gracefully handle deleted/renamed pools (#10270 #10122 Jason Dillaman)
+* librbd: protect list_children from invalid child pool ioctxs (#10123 Jason Dillaman)
+* mds: fix ctime updates from clients without dirty caps (#9514 Greg Farnum)
+* mds: fix rare NULL dereference in cap update path (Greg Farnum)
+* mds: fix assertion caused by system clock backwards (#11053 Yan, Zheng)
+* mds: store backtrace on straydir (Yan, Zheng)
+* osd: fix journal committed_thru update after replay (#6756 Samuel Just)
+* osd: fix memory leak, busy loop on snap trim (#9113 Samuel Just)
+* osd: fix misc peering, recovery bugs (#10168 Samuel Just)
+* osd: fix purged_snap field on backfill start (#9487 Sage Weil, Samuel Just)
+* osd: handle no-op write with snapshot corner case (#10262 Sage Weil, Loic Dachary)
+* osd: respect RWORDERED rados flag (Sage Weil)
+* osd: several backfill fixes and refactors (Samuel Just, David Zafman)
+* rgw: send http status reason explicitly in fastcgi (Yehuda Sadeh)
+
+v0.67.11 "Dumpling"
+===================
+
+This stable update for Dumpling fixes several important bugs that
+affect a small set of users.
+
+We recommend that all Dumpling users upgrade at their convenience.  If
+none of these issues are affecting your deployment there is no
+urgency.
+
+
+Notable Changes
+---------------
+
+* common: fix sending dup cluster log items (#9080 Sage Weil)
+* doc: several doc updates (Alfredo Deza)
+* libcephfs-java: fix build against older JNI headesr (Greg Farnum)
+* librados: fix crash in op timeout path (#9362 Matthias Kiefer, Sage Weil)
+* librbd: fix crash using clone of flattened image (#8845 Josh Durgin)
+* librbd: fix error path cleanup when failing to open image (#8912 Josh Durgin)
+* mon: fix crash when adjusting pg_num before any OSDs are added (#9052 Sage Weil)
+* mon: reduce log noise from paxos (Aanchal Agrawal, Sage Weil)
+* osd: allow scrub and snap trim thread pool IO priority to be adjusted (Sage Weil)
+* osd: fix mount/remount sync race (#9144 Sage Weil)
+
+
+v0.67.10 "Dumpling"
+===================
+
+This stable update release for Dumpling includes primarily fixes for
+RGW, including several issues with bucket listings and a potential
+data corruption problem when multiple multi-part uploads race.  There is also
+some throttling capability added in the OSD for scrub that can mitigate the
+performance impact on production clusters.
+
+We recommend that all Dumpling users upgrade at their convenience.
+
+Notable Changes
+---------------
+
+* ceph-disk: partprobe befoere settle, fixing dm-crypt (#6966, Eric Eastman)
+* librbd: add invalidate cache interface (Josh Durgin)
+* librbd: close image if remove_child fails (Ilya Dryomov)
+* librbd: fix potential null pointer dereference (Danny Al-Gaaf)
+* librbd: improve writeback checks, performance (Haomai Wang)
+* librbd: skip zeroes when copying image (#6257, Josh Durgin)
+* mon: fix rule(set) check on 'ceph pool set ... crush_ruleset ...' (#8599, John Spray)
+* mon: shut down if mon is removed from cluster (#6789, Joao Eduardo Luis)
+* osd: fix filestore perf reports to mon (Sage Weil)
+* osd: force any new or updated xattr into leveldb if E2BIG from XFS (#7779, Sage Weil)
+* osd: lock snapdir object during write to fix race with backfill (Samuel Just)
+* osd: option sleep during scrub (Sage Weil)
+* osd: set io priority on scrub and snap trim threads (Sage Weil)
+* osd: 'status' admin socket command (Sage Weil)
+* rbd: tolerate missing NULL terminator on block_name_prefix (#7577, Dan Mick)
+* rgw: calculate user manifest (#8169, Yehuda Sadeh)
+* rgw: fix abort on chunk read error, avoid using extra memory (#8289, Yehuda Sadeh)
+* rgw: fix buffer overflow on bucket instance id (#8608, Yehuda Sadeh)
+* rgw: fix crash in swift CORS preflight request (#8586, Yehuda Sadeh)
+* rgw: fix implicit removal of old objects on object creation (#8972, Patrycja Szablowska, Yehuda Sadeh)
+* rgw: fix MaxKeys in bucket listing (Yehuda Sadeh)
+* rgw: fix race with multiple updates to a single multipart object (#8269, Yehuda Sadeh)
+* rgw: improve bucket listing with delimiter (Yehuda Sadeh)
+* rgw: include NextMarker in bucket listing (#8858, Yehuda Sadeh)
+* rgw: return error early on non-existent bucket (#7064, Yehuda Sadeh)
+* rgw: set truncation flag correctly in bucket listing (Yehuda Sadeh)
+* sysvinit: continue starting daemons after pre-mount error (#8554, Sage Weil)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.10.txt>`.
+
+
+v0.67.9 "Dumpling"
+==================
+
+This Dumpling point release fixes several minor bugs. The most
+prevalent in the field is one that occasionally prevents OSDs from
+starting on recently created clusters.
+
+We recommend that all Dumpling users upgrade at their convenience.
+
+Notable Changes
+---------------
+
+* ceph-fuse, libcephfs: client admin socket command to kick and inspect MDS sessions (#8021, Zheng Yan)
+* monclient: fix failure detection during mon handshake (#8278, Sage Weil)
+* mon: set tid on no-op PGStatsAck messages (#8280, Sage Weil)
+* msgr: fix a rare bug with connection negotiation between OSDs (Guang Yang)
+* osd: allow snap trim throttling with simple delay (#6278, Sage Weil)
+* osd: check for splitting when processing recover/backfill reservations (#6565, Samuel Just)
+* osd: fix backfill position tracking (#8162, Samuel Just)
+* osd: fix bug in backfill stats (Samuel Just)
+* osd: fix bug preventing OSD startup for infant clusters (#8162, Greg Farnum)
+* osd: fix rare PG resurrection race causing an incomplete PG (#7740, Samuel Just)
+* osd: only complete replicas count toward min_size (#7805, Samuel Just)
+* rgw: allow setting ACLs with empty owner (#6892, Yehuda Sadeh)
+* rgw: send user manifest header field (#8170, Yehuda Sadeh)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.9.txt>`.
+
+
+v0.67.8 "Dumpling"
+==================
+
+This Dumpling point release fixes several non-critical issues since
+v0.67.7.  The most notable bug fixes are an auth fix in librbd
+(observed as an occasional crash from KVM), an improvement in the
+network failure detection with the monitor, and several hard to hit
+OSD crashes or hangs.
+
+We recommend that all users upgrade at their convenience.
+
+Upgrading
+---------
+
+* The 'rbd ls' function now returns success and returns an empty when a pool
+  does not store any rbd images.  Previously it would return an ENOENT error.
+
+* Ceph will now issue a health warning if the 'mon osd down out
+  interval' config option is set to zero.  This warning can be
+  disabled by adding 'mon warn on osd down out interval zero = false'
+  to ceph.conf.
+
+Notable Changes
+---------------
+
+* all: improve keepalive detection of failed monitor connections (#7888, Sage Weil)
+* ceph-fuse, libcephfs: pin inodes during readahead, fixing rare crash (#7867, Sage Weil)
+* librbd: make cache writeback a bit less aggressive (Sage Weil)
+* librbd: make symlink for qemu to detect librbd in RPM (#7293, Josh Durgin)
+* mon: allow 'hashpspool' pool flag to be set and unset (Loic Dachary)
+* mon: commit paxos state only after entire quorum acks, fixing rare race where prior round state is readable (#7736, Sage Weil)
+* mon: make elections and timeouts a bit more robust (#7212, Sage Weil)
+* mon: prevent extreme pool split operations (Greg Farnum)
+* mon: wait for quorum for get_version requests to close rare pool creation race (#7997, Sage Weil)
+* mon: warn on 'mon osd down out interval = 0' (#7784, Joao Luis)
+* msgr: fix byte-order for auth challenge, fixing auth errors on big-endian clients (#7977, Dan Mick)
+* msgr: fix occasional crash in authentication code (usually triggered by librbd) (#6840, Josh Durgin)
+* msgr: fix rebind() race (#6992, Xihui He)
+* osd: avoid timeouts during slow PG deletion (#6528, Samuel Just)
+* osd: fix bug in pool listing during recovery (#6633, Samuel Just)
+* osd: fix queue limits, fixing recovery stalls (#7706, Samuel Just)
+* osd: fix rare peering crashes (#6722, #6910, Samuel Just)
+* osd: fix rare recovery hang (#6681, Samuel Just)
+* osd: improve error handling on journal errors (#7738, Sage Weil)
+* osd: reduce load on the monitor from OSDMap subscriptions (Greg Farnum)
+* osd: rery GetLog on peer osd startup, fixing some rare peering stalls (#6909, Samuel Just)
+* osd: reset journal state on remount to fix occasional crash on OSD startup (#8019, Sage Weil)
+* osd: share maps with peers more aggressively (Greg Farnum)
+* rbd: make it harder to delete an rbd image that is currently in use (#7076, Ilya Drymov)
+* rgw: deny writes to secondary zone by non-system users (#6678, Yehuda Sadeh)
+* rgw: do'nt log system requests in usage log (#6889, Yehuda Sadeh)
+* rgw: fix bucket recreation (#6951, Yehuda Sadeh)
+* rgw: fix Swift range response (#7099, Julien Calvet, Yehuda Sadeh)
+* rgw: fix URL escaping (#8202, Yehuda Sadeh)
+* rgw: fix whitespace trimming in http headers (#7543, Yehuda Sadeh)
+* rgw: make multi-object deletion idempotent (#7346, Yehuda Sadeh)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.8.txt>`.
+
+v0.67.7 "Dumpling"
+==================
+
+This Dumpling point release fixes a few critical issues in v0.67.6.
+
+All v0.67.6 users are urgently encouraged to upgrade.  We also
+recommend that all v0.67.5 (or older) users upgrade.
+
+Upgrading
+---------
+
+* Once you have upgraded a radosgw instance or OSD to v0.67.7, you should not
+  downgrade to a previous version.
+
+Notable Changes
+---------------
+
+* ceph-disk: additional unit tests
+* librbd: revert caching behavior change in v0.67.6
+* osd: fix problem reading xattrs due to incomplete backport in v0.67.6
+* radosgw-admin: fix reading object policy
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.7.txt>`.
+
+
+v0.67.6 "Dumpling"
+==================
+
+.. note: This release contains a librbd bug that is fixed in v0.67.7.  Please upgrade to v0.67.7 and do not use v0.67.6.
+
+This Dumpling point release contains a number of important fixed for
+the OSD, monitor, and radosgw.  Most significantly, a change that
+forces large object attributes to spill over into leveldb has been
+backported that can prevent objects and the cluster from being damaged
+by large attributes (which can be induced via the radosgw).  There is
+also a set of fixes that improves data safety and RADOS semantics when
+the cluster becomes full and then non-full.
+
+We recommend that all 0.67.x Dumpling users skip this release and upgrade to v0.67.7.
+
+Upgrading
+---------
+
+* The OSD has long contained a feature that allows large xattrs to
+  spill over into the leveldb backing store in situations where not
+  all local file systems are able to store them reliably.  This option
+  is now enabled unconditionally in order to avoid rare cases where
+  storing large xattrs renders the object unreadable. This is known to
+  be triggered by very large multipart objects, but could be caused by
+  other workloads as well.  Although there is some small risk that
+  performance for certain workloads will degrade, it is more important
+  that data be retrievable.  Note that newer versions of Ceph (e.g.,
+  firefly) do some additional work to avoid the potential performance
+  regression in this case, but that is current considered too complex
+  for backport to the Dumpling stable series.
+
+* It is very dangerous to downgrade from v0.67.6 to a prior version of
+  Dumpling.  If the old version does not have 'filestore xattr use
+  omap = true' it may not be able to read all xattrs for an object and
+  can cause undefined behavior.
+
+Notable changes
+---------------
+
+* ceph-disk: misc bug fixes, particularly on RHEL (Loic Dachary, Alfredo Deza, various)
+* ceph-fuse, libcephfs: fix crash from read over certain sparseness patterns (Sage Weil)
+* ceph-fuse, libcephfs: fix integer overflow for sync reads racing with appends (Sage Weil)
+* ceph.spec: fix udev rule when building RPM under RHEL (Derek Yarnell)
+* common: fix crash from bad format from admin socket (Loic Dachary)
+* librados: add optional timeouts (Josh Durgin)
+* librados: do not leak budget when resending localized or redirected ops (Josh Durgin)
+* librados, osd: fix and improve full cluster handling (Josh Durgin)
+* librbd: fix use-after-free when updating perfcounters during image close (Josh Durgin)
+* librbd: remove limit on objects in cache (Josh Durgin)
+* mon: avoid on-disk full OSDMap corruption from pg_temp removal (Sage Weil)
+* mon: avoid stray pg_temp entries from pool deletion race (Joao Eduardo Luis)
+* mon: do not generate spurious MDSMaps from laggy daemons (Joao Eduardo Luis)
+* mon: fix error code from 'osd rm|down|out|in ...' commands (Loic Dachary)
+* mon: include all health items in summary output (John Spray)
+* osd: fix occasional race/crash during startup (Sage Weil)
+* osd: ignore stray OSDMap messages during init (Sage Weil)
+* osd: unconditionally let xattrs overflow into leveldb (David Zafman)
+* rados: fix a few error checks for the CLI (Josh Durgin)
+* rgw: convert legacy bucket info objects on demand (Yehuda Sadeh)
+* rgw: fix bug causing system users to lose privileges (Yehuda Sadeh)
+* rgw: fix CORS bugs related to headers and case sensitivity (Robin H. Johnson)
+* rgw: fix multipart object listing (Yehuda Sadeh)
+* rgw: fix racing object creations (Yehuda Sadeh)
+* rgw: fix racing object put and delete (Yehuda Sadeh)
+* rgw: fix S3 auth when using response-* query string params (Sylvain Munaut)
+* rgw: use correct secret key for POST authentication (Robin H. Johnson)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.6.txt>`.
+
+
+v0.67.5 "Dumpling"
+==================
+
+This release includes a few critical bug fixes for the radosgw, 
+including a fix for hanging operations on large objects.  There are also
+several bug fixes for radosgw multi-site replications, and a few 
+backported features.  Also, notably, the 'osd perf' command (which dumps
+recent performance information about active OSDs) has been backported.
+
+We recommend that all 0.67.x Dumpling users upgrade.
+
+Notable changes
+---------------
+
+* ceph-fuse: fix crash in caching code
+* mds: fix looping in populate_mydir()
+* mds: fix standby-replay race
+* mon: accept 'osd pool set ...' as string
+* mon: backport: 'osd perf' command to dump recent OSD performance stats
+* osd: add feature compat check for upcoming object sharding
+* osd: fix osd bench block size argument
+* rbd.py: increase parent name size limit
+* rgw: backport: allow wildcard in supported keystone roles
+* rgw: backport: improve swift COPY behavior
+* rgw: backport: log and open admin socket by default
+* rgw: backport: validate S3 tokens against keystone
+* rgw: fix bucket removal
+* rgw: fix client error code for chunked PUT failure
+* rgw: fix hang on large object GET
+* rgw: fix rare use-after-free
+* rgw: various DR bug fixes
+* sysvinit, upstart: prevent starting daemons using both init systems
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.5.txt>`.
+
+
+v0.67.4 "Dumpling"
+==================
+
+This point release fixes an important performance issue with radosgw,
+keystone authentication token caching, and CORS.  All users
+(especially those of rgw) are encouraged to upgrade.
+
+Notable changes
+---------------
+
+* crush: fix invalidation of cached names
+* crushtool: do not crash on non-unique bucket ids
+* mds: be more careful when decoding LogEvents
+* mds: fix heap check debugging commands
+* mon: avoid rebuilding old full osdmaps
+* mon: fix 'ceph crush move ...'
+* mon: fix 'ceph osd crush reweight ...'
+* mon: fix writeout of full osdmaps during trim
+* mon: limit size of transactions
+* mon: prevent both unmanaged and pool snaps
+* osd: disable xattr size limit (prevents upload of large rgw objects)
+* osd: fix recovery op throttling
+* osd: fix throttling of log messages for very slow requests
+* rgw: drain pending requests before completing write
+* rgw: fix CORS
+* rgw: fix inefficient list::size() usage
+* rgw: fix keystone token expiration
+* rgw: fix minor memory leaks
+* rgw: fix null termination of buffer
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.4.txt>`.
+
+
+v0.67.3 "Dumpling"
+==================
+
+This point release fixes a few important performance regressions with
+the OSD (both with CPU and disk utilization), as well as several other
+important but less common problems.  We recommend that all production users
+upgrade.
+
+Notable Changes
+---------------
+
+* ceph-disk: partprobe after creation journal partition
+* ceph-disk: specify fs type when mounting
+* ceph-post-file: new utility to help share logs and other files with ceph developers
+* libcephfs: fix truncate vs readahead race (crash)
+* mds: fix flock/fcntl lock deadlock
+* mds: fix rejoin loop when encountering pre-dumpling backpointers
+* mon: allow name and addr discovery during election stage
+* mon: always refresh after Paxos store_state (fixes recovery corner case)
+* mon: fix off-by-4x bug with osd byte counts
+* osd: add and disable 'pg log keys debug' by default
+* osd: add option to disable throttling
+* osd: avoid leveldb iterators for pg log append and trim
+* osd: fix readdir_r invocations
+* osd: use fdatasync instead of sync
+* radosgw: fix sysvinit script return status
+* rbd: relicense as LGPL2
+* rgw: flush pending data on multipart upload
+* rgw: recheck object name during S3 POST
+* rgw: reorder init/startup
+* rpm: fix debuginfo package build
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.3.txt>`.
+
+
+v0.67.2 "Dumpling"
+==================
+
+This is an imporant point release for Dumpling.  Most notably, it
+fixes a problem when upgrading directly from v0.56.x Bobtail to
+v0.67.x Dumpling (without stopping at v0.61.x Cuttlefish along the
+way).  It also fixes a problem with the CLI parsing of the CEPH_ARGS
+environment variable, high CPU utilization by the ceph-osd daemons,
+and cleans up the radosgw shutdown sequence.
+
+Notable Changes
+---------------
+
+* objecter: resend linger requests when cluster goes from full to non-full
+* ceph: parse CEPH_ARGS environment variable
+* librados: fix small memory leak
+* osd: remove old log objects on upgrade (fixes bobtail -> dumpling jump)
+* osd: disable PGLog::check() via config option (fixes CPU burn)
+* rgw: drain requests on shutdown
+* rgw: misc memory leaks on shutdown
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.2.txt>`.
+
+
+v0.67.1 "Dumpling"
+==================
+
+This is a minor point release for Dumpling that fixes problems with
+OpenStack and librbd hangs when caching is disabled.
+
+Notable changes
+---------------
+
+* librados, librbd: fix constructor for python bindings with certain
+  usages (in particular, that used by OpenStack)
+* librados, librbd: fix aio_flush wakeup when cache is disabled
+* librados: fix locking for aio completion refcounting
+* fixes 'ceph --admin-daemon ...' command error code on error
+* fixes 'ceph daemon ... config set ...' command for boolean config
+  options.
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.67.1.txt>`.
+
+v0.67 "Dumpling"
+================
+
+This is the fourth major release of Ceph, code-named "Dumpling."  The
+headline features for this release include:
+
+* Multi-site support for radosgw.  This includes the ability to set up
+  separate "regions" in the same or different Ceph clusters that share
+  a single S3/Swift bucket/container namespace.
+
+* RESTful API endpoint for Ceph cluster administration.
+  ceph-rest-api, a wrapper around ceph_rest_api.py, can be used to
+  start up a test single-threaded HTTP server that provides access to
+  cluster information and administration in very similar ways to the
+  ceph commandline tool.  ceph_rest_api.py can be used as a WSGI
+  application for deployment in a more-capable web server.  See
+  ceph-rest-api.8 for more.
+
+* Object namespaces in librados.
+
+
+.. _Dumpling upgrade:
+
+Upgrade Sequencing
+------------------
+
+It is possible to do a rolling upgrade from Cuttlefish to Dumpling.
+
+#. Upgrade ceph-common on all nodes that will use the command line
+   'ceph' utility.
+#. Upgrade all monitors (upgrade ceph package, restart ceph-mon
+   daemons).  This can happen one daemon or host at a time.  Note that
+   because cuttlefish and dumpling monitors can't talk to each other,
+   all monitors should be upgraded in relatively short succession to
+   minimize the risk that an a untimely failure will reduce
+   availability.
+#. Upgrade all osds (upgrade ceph package, restart ceph-osd daemons).
+   This can happen one daemon or host at a time.
+#. Upgrade radosgw (upgrade radosgw package, restart radosgw daemons).
+
+
+Upgrading from v0.66
+--------------------
+
+* There is monitor internal protocol change, which means that v0.67
+  ceph-mon daemons cannot talk to v0.66 or older daemons.  We
+  recommend upgrading all monitors at once (or in relatively quick
+  succession) to minimize the possibility of downtime.
+
+* The output of 'ceph status --format=json' or 'ceph -s --format=json'
+  has changed to return status information in a more structured and
+  usable format.
+
+* The 'ceph pg dump_stuck [threshold]' command used to require a
+  --threshold or -t prefix to the threshold argument, but now does
+  not.
+
+* Many more ceph commands now output formatted information; select
+  with '--format=<format>', where <format> can be 'json', 'json-pretty',
+  'xml', or 'xml-pretty'.
+
+* The 'ceph pg <pgid> ...' commands (like 'ceph pg <pgid> query') are
+  deprecated in favor of 'ceph tell <pgid> ...'.  This makes the
+  distinction between 'ceph pg <command> <pgid>' and 'ceph pg <pgid>
+  <command>' less awkward by making it clearer that the 'tell'
+  commands are talking to the OSD serving the placement group, not the
+  monitor.
+
+* The 'ceph --admin-daemon <path> <command ...>' used to accept the
+  command and arguments as either a single string or as separate
+  arguments.  It will now only accept the command spread across
+  multiple arguments.  This means that any script which does something
+  like::
+
+    ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok 'config set debug_ms 1'
+
+  needs to remove the quotes.  Also, note that the above can now be
+  shortened to::
+
+    ceph daemon osd.0 config set debug_ms 1
+
+* The radosgw caps were inconsistently documented to be either 'mon =
+  allow r' or 'mon = allow rw'.  The 'mon = allow rw' is required for
+  radosgw to create its own pools.  All documentation has been updated
+  accordingly.
+
+* The radosgw copy object operation may return extra progress info
+  during the operation. At this point it will only happen when doing
+  cross zone copy operations. The S3 response will now return extra
+  <Progress> field under the <CopyResult> container. The Swift
+  response will now send the progress as a json array.
+
+* In v0.66 and v0.65 the HASHPSPOOL pool flag was enabled by default
+  for new pools, but has been disabled again until Linux kernel client
+  support reaches more distributions and users.
+
+* ceph-osd now requires a max file descriptor limit (e.g., ``ulimit -n
+  ...``) of at least
+  filestore_wbthrottle_(xfs|btrfs)_inodes_hard_limit (5000 by default)
+  in order to accomodate the new write back throttle system.  On
+  Ubuntu, upstart now sets the fd limit to 32k.  On other platforms,
+  the sysvinit script will set it to 32k by default (still
+  overrideable via max_open_files).  If this field has been customized
+  in ceph.conf it should likely be adjusted upwards.
+
+Upgrading from v0.61 "Cuttlefish"
+---------------------------------
+
+In addition to the above notes about upgrading from v0.66:
+
+* There has been a huge revamp of the 'ceph' command-line interface
+  implementation.  The ``ceph-common`` client library needs to be
+  upgrade before ``ceph-mon`` is restarted in order to avoid problems
+  using the CLI (the old ``ceph`` client utility cannot talk to the
+  new ``ceph-mon``).
+
+* The CLI is now very careful about sending the 'status' one-liner
+  output to stderr and command output to stdout.  Scripts relying on
+  output should take care.
+
+* The 'ceph osd tell ...' and 'ceph mon tell ...' commands are no
+  longer supported.  Any callers should use::
+
+	ceph tell osd.<id or *> ...
+	ceph tell mon.<id or name or *> ...
+
+  The 'ceph mds tell ...' command is still there, but will soon also
+  transition to 'ceph tell mds.<id or name or \*> ...'
+
+* The 'ceph osd crush add ...' command used to take one of two forms::
+
+    ceph osd crush add 123 osd.123 <weight> <location ...>
+    ceph osd crush add osd.123 <weight> <location ...>
+
+  This is because the id and crush name are redundant.  Now only the
+  simple form is supported, where the osd name/id can either be a bare
+  id (integer) or name (osd.<id>)::
+
+    ceph osd crush add osd.123 <weight> <location ...>
+    ceph osd crush add 123 <weight> <location ...>
+
+* There is now a maximum RADOS object size, configurable via 'osd max
+  object size', defaulting to 100 GB.  Note that this has no effect on
+  RBD, CephFS, or radosgw, which all stripe over objects. If you are
+  using librados and storing objects larger than that, you will need
+  to adjust 'osd max object size', and should consider using smaller
+  objects instead.
+
+* The 'osd min down {reporters|reports}' config options have been
+  renamed to 'mon osd min down {reporters|reports}', and the
+  documentation has been updated to reflect that these options apply
+  to the monitors (who process failure reports) and not OSDs.  If you
+  have adjusted these settings, please update your ``ceph.conf``
+  accordingly.
+
+
+Notable changes since v0.66
+---------------------------
+
+* mon: sync improvements (performance and robustness)
+* mon: many bug fixes (paxos and services)
+* mon: fixed bugs in recovery and io rate reporting (negative/large values)
+* mon: collect metadata on osd performance
+* mon: generate health warnings from slow or stuck requests
+* mon: expanded --format=<json|xml|...> support for monitor commands
+* mon: scrub function for verifying data integrity
+* mon, osd: fix old osdmap trimming logic
+* mon: enable leveldb caching by default
+* mon: more efficient storage of PG metadata
+* ceph-rest-api: RESTful endpoint for administer cluster (mirrors CLI)
+* rgw: multi-region support
+* rgw: infrastructure to support georeplication of bucket and user metadata
+* rgw: infrastructure to support georeplication of bucket data
+* rgw: COPY object support between regions
+* rbd: /etc/ceph/rbdmap file for mapping rbd images on startup
+* osd: many bug fixes
+* osd: limit number of incremental osdmaps sent to peers (could cause osds to be wrongly marked down)
+* osd: more efficient small object recovery
+* osd, librados: support for object namespaces
+* osd: automatically enable xattrs on leveldb as necessary
+* mds: fix bug in LOOKUPINO (used by nfs reexport)
+* mds: fix O_TRUNC locking
+* msgr: fixed race condition in inter-osd network communication
+* msgr: fixed various memory leaks related to network sessions
+* ceph-disk: fixes for unusual device names, partition detection
+* hypertable: fixes for hypertable CephBroker bindings
+* use SSE4.2 crc32c instruction if present
+
+
+Notable changes since v0.61 "Cuttlefish"
+----------------------------------------
+
+* add 'config get' admin socket command
+* ceph-conf: --show-config-value now reflects daemon defaults
+* ceph-disk: add '[un]suppress-active DEV' command
+* ceph-disk: avoid mounting over an existing osd in /var/lib/ceph/osd/*
+* ceph-disk: fixes for unusual device names, partition detection
+* ceph-disk: improved handling of odd device names
+* ceph-disk: many fixes for RHEL/CentOS, Fedora, wheezy
+* ceph-disk: simpler, more robust locking
+* ceph-fuse, libcephfs: fix a few caps revocation bugs
+* ceph-fuse, libcephfs: fix read zeroing at EOF
+* ceph-fuse, libcephfs: fix request refcounting bug (hang on shutdown)
+* ceph-fuse, libcephfs: fix truncatation bug on >4MB files (Yan, Zheng)
+* ceph-fuse, libcephfs: fix for cap release/hang
+* ceph-fuse: add ioctl support
+* ceph-fuse: fixed long-standing O_NOATIME vs O_LAZY bug
+* ceph-rest-api: RESTful endpoint for administer cluster (mirrors CLI)
+* ceph, librados: fix resending of commands on mon reconnect
+* daemons: create /var/run/ceph as needed
+* debian wheezy: fix udev rules
+* debian, specfile: packaging cleanups
+* debian: fix upstart behavior with upgrades
+* debian: rgw: stop daemon on uninstall
+* debian: stop daemons on uninstall; fix dependencies
+* hypertable: fixes for hypertable CephBroker bindings
+* librados python binding cleanups
+* librados python: fix xattrs > 4KB (Josh Durgin)
+* librados: configurable max object size (default 100 GB)
+* librados: new calls to administer the cluster
+* librbd: ability to read from local replicas
+* librbd: locking tests (Josh Durgin)
+* librbd: make default options/features for newly created images (e.g., via qemu-img) configurable
+* librbd: parallelize delete, rollback, flatten, copy, resize
+* many many fixes from static code analysis (Danny Al-Gaaf)
+* mds: fix O_TRUNC locking
+* mds: fix bug in LOOKUPINO (used by nfs reexport)
+* mds: fix rare hang after client restart
+* mds: fix several bugs (Yan, Zheng)
+* mds: many backpointer improvements (Yan, Zheng)
+* mds: many fixes for mds clustering
+* mds: misc stability fixes (Yan, Zheng, Greg Farnum)
+* mds: new robust open-by-ino support (Yan, Zheng)
+* mds: support robust lookup by ino number (good for NFS) (Yan, Zheng)
+* mon, ceph: huge revamp of CLI and internal admin API. (Dan Mick)
+* mon, osd: fix old osdmap trimming logic
+* mon, osd: many memory leaks fixed
+* mon: better trim/compaction behavior
+* mon: collect metadata on osd performance
+* mon: enable leveldb caching by default
+* mon: expanded --format=<json|xml|...> support for monitor commands
+* mon: fix election timeout
+* mon: fix leveldb compression, trimming
+* mon: fix start fork behavior
+* mon: fix units in 'ceph df' output
+* mon: fix validation of mds ids from CLI commands
+* mon: fixed bugs in recovery and io rate reporting (negative/large values)
+* mon: generate health warnings from slow or stuck requests
+* mon: many bug fixes (paxos and services, sync)
+* mon: many stability fixes (Joao Luis)
+* mon: more efficient storage of PG metadata
+* mon: new --extract-monmap to aid disaster recovery
+* mon: new capability syntax
+* mon: scrub function for verifying data integrity
+* mon: simplify PaxosService vs Paxos interaction, fix readable/writeable checks
+* mon: sync improvements (performance and robustness)
+* mon: tuning, performance improvements
+* msgr: fix various memory leaks
+* msgr: fixed race condition in inter-osd network communication
+* msgr: fixed various memory leaks related to network sessions
+* osd, librados: support for object namespaces
+* osd, mon: optionally dump leveldb transactions to a log
+* osd: automatically enable xattrs on leveldb as necessary
+* osd: avoid osd flapping from asymmetric network failure
+* osd: break blacklisted client watches (David Zafman)
+* osd: close narrow journal race
+* osd: do not use fadvise(DONTNEED) on XFS (data corruption on power cycle)
+* osd: fix for an op ordering bug
+* osd: fix handling for split after upgrade from bobtail
+* osd: fix incorrect mark-down of osds
+* osd: fix internal heartbeart timeouts when scrubbing very large objects
+* osd: fix memory/network inefficiency during deep scrub
+* osd: fixed problem with front-side heartbeats and mixed clusters (David Zafman)
+* osd: limit number of incremental osdmaps sent to peers (could cause osds to be wrongly marked down)
+* osd: many bug fixes
+* osd: monitor both front and back interfaces
+* osd: more efficient small object recovery
+* osd: new writeback throttling (for less bursty write performance) (Sam Just)
+* osd: pg log (re)writes are now vastly more efficient (faster peering) (Sam Just)
+* osd: ping/heartbeat on public and private interfaces
+* osd: prioritize recovery for degraded PGs
+* osd: re-use partially deleted PG contents when present (Sam Just)
+* osd: recovery and peering performance improvements
+* osd: resurrect partially deleted PGs
+* osd: verify both front and back network are working before rejoining cluster
+* rados: clonedata command for cli
+* radosgw-admin: create keys for new users by default
+* rbd: /etc/ceph/rbdmap file for mapping rbd images on startup
+* rgw: COPY object support between regions
+* rgw: fix CORS bugs
+* rgw: fix locking issue, user operation mask,
+* rgw: fix radosgw-admin buckets list (Yehuda Sadeh)
+* rgw: fix usage log scanning for large, untrimmed logs
+* rgw: handle deep uri resources
+* rgw: infrastructure to support georeplication of bucket and user metadata
+* rgw: infrastructure to support georeplication of bucket data
+* rgw: multi-region support
+* sysvinit: fix enumeration of local daemons
+* sysvinit: fix osd crush weight calculation when using -a
+* sysvinit: handle symlinks in /var/lib/ceph/osd/*
+* use SSE4.2 crc32c instruction if present
+
+
+v0.66
+=====
+
+Upgrading
+---------
+
+* There is now a configurable maximum rados object size, defaulting to 100 GB.  If you
+  are using librados and storing objects larger than that, you will need to adjust
+  'osd max object size', and should consider using smaller objects instead.
+
+Notable changes
+---------------
+
+* osd: pg log (re)writes are now vastly more efficient (faster peering) (Sam Just)
+* osd: fixed problem with front-side heartbeats and mixed clusters (David Zafman)
+* mon: tuning, performance improvements
+* mon: simplify PaxosService vs Paxos interaction, fix readable/writeable checks
+* rgw: fix radosgw-admin buckets list (Yehuda Sadeh)
+* mds: support robust lookup by ino number (good for NFS) (Yan, Zheng)
+* mds: fix several bugs (Yan, Zheng)
+* ceph-fuse, libcephfs: fix truncatation bug on >4MB files (Yan, Zheng)
+* ceph/librados: fix resending of commands on mon reconnect
+* librados python: fix xattrs > 4KB (Josh Durgin)
+* librados: configurable max object size (default 100 GB)
+* msgr: fix various memory leaks
+* ceph-fuse: fixed long-standing O_NOATIME vs O_LAZY bug
+* ceph-fuse, libcephfs: fix request refcounting bug (hang on shutdown)
+* ceph-fuse, libcephfs: fix read zeroing at EOF
+* ceph-conf: --show-config-value now reflects daemon defaults
+* ceph-disk: simpler, more robust locking
+* ceph-disk: avoid mounting over an existing osd in /var/lib/ceph/osd/*
+* sysvinit: handle symlinks in /var/lib/ceph/osd/*
+
+
+v0.65
+=====
+
+Upgrading
+---------
+
+* Huge revamp of the 'ceph' command-line interface implementation.
+  The ``ceph-common`` client library needs to be upgrade before
+  ``ceph-mon`` is restarted in order to avoid problems using the CLI
+  (the old ``ceph`` client utility cannot talk to the new
+  ``ceph-mon``).
+
+* The CLI is now very careful about sending the 'status' one-liner
+  output to stderr and command output to stdout.  Scripts relying on
+  output should take care.
+
+* The 'ceph osd tell ...' and 'ceph mon tell ...' commands are no
+  longer supported.  Any callers should use::
+
+	ceph tell osd.<id or *> ...
+	ceph tell mon.<id or name or *> ...
+
+  The 'ceph mds tell ...' command is still there, but will soon also
+  transition to 'ceph tell mds.<id or name or \*> ...'
+
+* The 'ceph osd crush add ...' command used to take one of two forms::
+
+    ceph osd crush add 123 osd.123 <weight> <location ...>
+    ceph osd crush add osd.123 <weight> <location ...>
+
+  This is because the id and crush name are redundant.  Now only the
+  simple form is supported, where the osd name/id can either be a bare
+  id (integer) or name (osd.<id>)::
+
+    ceph osd crush add osd.123 <weight> <location ...>
+    ceph osd crush add 123 <weight> <location ...>
+
+* There is now a maximum RADOS object size, configurable via 'osd max
+  object size', defaulting to 100 GB.  Note that this has no effect on
+  RBD, CephFS, or radosgw, which all stripe over objects.
+
+
+Notable changes
+---------------
+
+* mon, ceph: huge revamp of CLI and internal admin API. (Dan Mick)
+* mon: new capability syntax
+* osd: do not use fadvise(DONTNEED) on XFS (data corruption on power cycle)
+* osd: recovery and peering performance improvements
+* osd: new writeback throttling (for less bursty write performance) (Sam Just)
+* osd: ping/heartbeat on public and private interfaces
+* osd: avoid osd flapping from asymmetric network failure
+* osd: re-use partially deleted PG contents when present (Sam Just)
+* osd: break blacklisted client watches (David Zafman)
+* mon: many stability fixes (Joao Luis)
+* mon, osd: many memory leaks fixed
+* mds: misc stability fixes (Yan, Zheng, Greg Farnum)
+* mds: many backpointer improvements (Yan, Zheng)
+* mds: new robust open-by-ino support (Yan, Zheng)
+* ceph-fuse, libcephfs: fix a few caps revocation bugs
+* librados: new calls to administer the cluster
+* librbd: locking tests (Josh Durgin)
+* ceph-disk: improved handling of odd device names
+* ceph-disk: many fixes for RHEL/CentOS, Fedora, wheezy
+* many many fixes from static code analysis (Danny Al-Gaaf)
+* daemons: create /var/run/ceph as needed
+
+
+v0.64
+=====
+
+Upgrading
+---------
+
+* New pools now have the HASHPSPOOL flag set by default to provide
+  better distribution over OSDs.  Support for this feature was
+  introduced in v0.59 and Linux kernel version v3.9.  If you wish to
+  access the cluster from an older kernel, set the 'osd pool default
+  flag hashpspool = false' option in your ceph.conf prior to creating
+  the cluster or creating new pools.  Note that the presense of any
+  pool in the cluster with the flag enabled will make the OSD require
+  support from all clients.
+
+Notable changes
+---------------
+
+* osd: monitor both front and back interfaces
+* osd: verify both front and back network are working before rejoining cluster
+* osd: fix memory/network inefficiency during deep scrub
+* osd: fix incorrect mark-down of osds
+* mon: fix start fork behavior
+* mon: fix election timeout
+* mon: better trim/compaction behavior
+* mon: fix units in 'ceph df' output
+* mon, osd: misc memory leaks
+* librbd: make default options/features for newly created images (e.g., via qemu-img) configurable
+* mds: many fixes for mds clustering
+* mds: fix rare hang after client restart
+* ceph-fuse: add ioctl support
+* ceph-fuse/libcephfs: fix for cap release/hang
+* rgw: handle deep uri resources
+* rgw: fix CORS bugs
+* ceph-disk: add '[un]suppress-active DEV' command
+* debian: rgw: stop daemon on uninstall
+* debian: fix upstart behavior with upgrades
+
+
+v0.63
+=====
+
+Upgrading
+---------
+
+* The 'osd min down {reporters|reports}' config options have been
+  renamed to 'mon osd min down {reporters|reports}', and the
+  documentation has been updated to reflect that these options apply
+  to the monitors (who process failure reports) and not OSDs.  If you
+  have adjusted these settings, please update your ``ceph.conf``
+  accordingly.
+
+Notable Changes
+---------------
+
+* librbd: parallelize delete, rollback, flatten, copy, resize
+* librbd: ability to read from local replicas
+* osd: resurrect partially deleted PGs
+* osd: prioritize recovery for degraded PGs
+* osd: fix internal heartbeart timeouts when scrubbing very large objects
+* osd: close narrow journal race
+* rgw: fix usage log scanning for large, untrimmed logs
+* rgw: fix locking issue, user operation mask,
+* initscript: fix osd crush weight calculation when using -a
+* initscript: fix enumeration of local daemons
+* mon: several fixes to paxos, sync
+* mon: new --extract-monmap to aid disaster recovery
+* mon: fix leveldb compression, trimming
+* add 'config get' admin socket command
+* rados: clonedata command for cli
+* debian: stop daemons on uninstall; fix dependencies
+* debian wheezy: fix udev rules
+* many many small fixes from coverity scan
+
+
+v0.62
+=====
+
+Notable Changes
+---------------
+
+* mon: fix validation of mds ids from CLI commands
+* osd: fix for an op ordering bug
+* osd, mon: optionally dump leveldb transactions to a log
+* osd: fix handling for split after upgrade from bobtail
+* debian, specfile: packaging cleanups
+* radosgw-admin: create keys for new users by default
+* librados python binding cleanups
+* misc code cleanups
+
+
+
+
+v0.61.9 "Cuttlefish"
+====================
+
+This point release resolves several low to medium-impact bugs across
+the code base, and fixes a performance problem (CPU utilization) with
+radosgw.  We recommend that all production cuttlefish users upgrade.
+
+Notable Changes
+---------------
+
+* ceph, ceph-authtool: fix help (Danny Al-Gaaf)
+* ceph-disk: partprobe after creating journal partition
+* ceph-disk: specific fs type when mounting (Alfredo Deza)
+* ceph-fuse: fix bug when compiled against old versions
+* ceph-fuse: fix use-after-free in caching code (Yan, Zheng)
+* ceph-fuse: misc caching bugs
+* ceph.spec: remove incorrect mod_fcgi dependency (Gary Lowell)
+* crush: fix name caching
+* librbd: fix bug when unpausing cluster (Josh Durgin)
+* mds: fix LAZYIO lock hang
+* mds: fix bug in file size recovery (after client crash)
+* mon: fix paxos recovery corner case
+* osd: fix exponential backoff for slow request warnings (Loic Dachary)
+* osd: fix readdir_r usage
+* osd: fix startup for long-stopped OSDs
+* rgw: avoid std::list::size() to avoid wasting CPU cycles (Yehuda Sadeh)
+* rgw: drain pending requests during write (fixes data safety issue) (Yehuda Sadeh)
+* rgw: fix authenticated users group ACL check (Yehuda Sadeh)
+* rgw: fix bug in POST (Yehuda Sadeh)
+* rgw: fix sysvinit script 'status' command, return value (Danny Al-Gaaf)
+* rgw: reduce default log level (Yehuda Sadeh)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.9.txt>`.
+
+v0.61.8 "Cuttlefish"
+====================
+
+This release includes a number of important issues, including rare
+race conditions in the OSD, a few monitor bugs, and fixes for RBD
+flush behavior.  We recommend that production users upgrade at their
+convenience.
+
+Notable Changes
+---------------
+
+* librados: fix async aio completion wakeup
+* librados: fix aio completion locking
+* librados: fix rare deadlock during shutdown
+* osd: fix race when queueing recovery operations
+* osd: fix possible race during recovery
+* osd: optionally preload rados classes on startup (disabled by default)
+* osd: fix journal replay corner condition
+* osd: limit size of peering work queue batch (to speed up peering)
+* mon: fix paxos recovery corner case
+* mon: fix rare hang when monmap updates during an election
+* mon: make 'osd pool mksnap ...' avoid exposing uncommitted state
+* mon: make 'osd pool rmsnap ...' not racy, avoid exposing uncommitted state
+* mon: fix bug during mon cluster expansion
+* rgw: fix crash during multi delete operation
+* msgr: fix race conditions during osd network reinitialization
+* ceph-disk: apply mount options when remounting
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.8.txt>`.
+
+
+v0.61.7 "Cuttlefish"
+====================
+
+This release fixes another regression preventing monitors to start after
+undergoing certain upgrade sequences, as well as some corner cases with
+Paxos and support for unusual device names in ceph-disk/ceph-deploy.
+
+Notable Changes
+---------------
+
+* mon: fix regression in latest full osdmap retrieval
+* mon: fix a long-standing bug in a paxos corner case
+* ceph-disk: improved support for unusual device names (e.g., /dev/cciss/c0d0)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.7.txt>`.
+
+
+v0.61.6 "Cuttlefish"
+====================
+
+This release fixes a regression in v0.61.5 that could prevent monitors
+from restarting.  This affects any cluster that was upgraded from a
+previous version of Ceph (and not freshly created with v0.61.5).
+
+All users are strongly recommended to upgrade.
+
+Notable Changes
+---------------
+
+* mon: record latest full osdmap
+* mon: work around previous bug in which latest full osdmap is not recorded
+* mon: avoid scrub while updating
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.6.txt>`.
+
+
+v0.61.5 "Cuttlefish"
+====================
+
+This release most improves stability of the monitor and fixes a few
+bugs with the ceph-disk utility (used by ceph-deploy).  We recommand
+that all v0.61.x users upgrade.
+
+Upgrading
+---------
+
+* This release fixes a 32-bit vs 64-bit arithmetic bug with the
+  feature bits.  An unfortunate consequence of the fix is that 0.61.4
+  (or earlier) ceph-mon daemons can't form a quorum with 0.61.5 (or
+  later) monitors.  To avoid the possibility of service disruption, we
+  recommend you upgrade all monitors at once.
+
+Notable Changes
+---------------
+
+* mon: misc sync improvements (faster, more reliable, better tuning)
+* mon: enable leveldb cache by default (big performance improvement)
+* mon: new scrub feature (primarily for diagnostic, testing purposes)
+* mon: fix occasional leveldb assertion on startup
+* mon: prevent reads until initial state is committed
+* mon: improved logic for trimming old osdmaps
+* mon: fix pick_addresses bug when expanding mon cluster
+* mon: several small paxos fixes, improvements
+* mon: fix bug osdmap trim behavior
+* osd: fix several bugs with PG stat reporting
+* osd: limit number of maps shared with peers (which could cause domino failures)
+* rgw: fix radosgw-admin buckets list (for all buckets)
+* mds: fix occasional client failure to reconnect
+* mds: fix bad list traversal after unlink
+* mds: fix underwater dentry cleanup (occasional crash after mds restart)
+* libcephfs, ceph-fuse: fix occasional hangs on umount
+* libcephfs, ceph-fuse: fix old bug with O_LAZY vs O_NOATIME confusion
+* ceph-disk: more robust journal device detection on RHEL/CentOS
+* ceph-disk: better, simpler locking
+* ceph-disk: do not inadvertantely mount over existing osd mounts
+* ceph-disk: better handling for unusual device names
+* sysvinit, upstart: handle symlinks in /var/lib/ceph/*
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.5.txt>`.
+
+
+v0.61.4 "Cuttlefish"
+====================
+
+This release resolves a possible data corruption on power-cycle when
+using XFS, a few outstanding problems with monitor sync, several
+problems with ceph-disk and ceph-deploy operation, and a problem with
+OSD memory usage during scrub.
+
+Upgrading
+---------
+
+* No issues.
+
+Notable Changes
+---------------
+
+* mon: fix daemon exit behavior when error is encountered on startup
+* mon: more robust sync behavior
+* osd: do not use sync_file_range(2), posix_fadvise(...DONTNEED) (can cause data corruption on power loss on XFS)
+* osd: avoid unnecessary log rewrite (improves peering speed)
+* osd: fix scrub efficiency bug (problematic on old clusters)
+* rgw: fix listing objects that start with underscore
+* rgw: fix deep URI resource, CORS bugs
+* librados python binding: fix truncate on 32-bit architectures
+* ceph-disk: fix udev rules
+* rpm: install sysvinit script on package install
+* ceph-disk: fix OSD start on machine reboot on Debian wheezy
+* ceph-disk: activate OSD when journal device appears second
+* ceph-disk: fix various bugs on RHEL/CentOS 6.3
+* ceph-disk: add 'zap' command
+* ceph-disk: add '[un]suppress-activate' command for preparing spare disks
+* upstart: start on runlevel [2345] (instead of after the first network interface starts)
+* ceph-fuse, libcephfs: handle mds session reset during session open
+* ceph-fuse, libcephfs: fix two capability revocation bugs
+* ceph-fuse: fix thread creation on startup
+* all daemons: create /var/run/ceph directory on startup if missing
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.4.txt>`.
+
+
+v0.61.3 "Cuttlefish"
+====================
+
+This release resolves a number of problems with the monitors and leveldb that users have
+been seeing.  Please upgrade.
+
+Upgrading
+---------
+
+* There is one known problem with mon upgrades from bobtail.  If the
+  ceph-mon conversion on startup is aborted or fails for some reason, we
+  do not correctly error out, but instead continue with (in certain cases)
+  odd results.  Please be careful if you have to restart the mons during
+  the upgrade.  A 0.61.4 release with a fix will be out shortly.
+
+* In the meantime, for current cuttlefish users, v0.61.3 is safe to use.
+
+
+Notable Changes
+---------------
+
+* mon: paxos state trimming fix (resolves runaway disk usage)
+* mon: finer-grained compaction on trim
+* mon: discard messages from disconnected clients (lowers load)
+* mon: leveldb compaction and other stats available via admin socket
+* mon: async compaction (lower overhead)
+* mon: fix bug incorrectly marking osds down with insufficient failure reports
+* osd: fixed small bug in pg request map
+* osd: avoid rewriting pg info on every osdmap
+* osd: avoid internal heartbeta timeouts when scrubbing very large objects
+* osd: fix narrow race with journal replay
+* mon: fixed narrow pg split race
+* rgw: fix leaked space when copying object
+* rgw: fix iteration over large/untrimmed usage logs
+* rgw: fix locking issue with ops log socket
+* rgw: require matching version of librados
+* librbd: make image creation defaults configurable (e.g., create format 2 images via qemu-img)
+* fix units in 'ceph df' output
+* debian: fix prerm/postinst hooks to start/stop daemons appropriately
+* upstart: allow uppercase daemons names (and thus hostnames)
+* sysvinit: fix enumeration of local daemons by type
+* sysvinit: fix osd weight calcuation when using -a
+* fix build on unsigned char platforms (e.g., arm)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.3.txt>`.
+
+
+v0.61.2 "Cuttlefish"
+====================
+
+This release disables a monitor debug log that consumes disk space and
+fixes a bug when upgrade some monitors from bobtail to cuttlefish.
+
+Notable Changes
+---------------
+
+* mon: fix conversion of stores with duplicated GV values
+* mon: disable 'mon debug dump transactions' by default
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.2.txt>`.
+
+
+v0.61.1 "Cuttlefish"
+====================
+
+This release fixes a problem when upgrading a bobtail cluster that had
+snapshots to cuttlefish.
+
+Notable Changes
+---------------
+
+* osd: handle upgrade when legacy snap collections are present; repair from previous failed restart
+* ceph-create-keys: fix race with ceph-mon startup (which broke 'ceph-deploy gatherkeys ...')
+* ceph-create-keys: gracefully handle bad response from ceph-osd
+* sysvinit: do not assume default osd_data when automatically weighting OSD
+* osd: avoid crash from ill-behaved classes using getomapvals
+* debian: fix squeeze dependency
+* mon: debug options to log or dump leveldb transactions
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.61.1.txt>`.
+
+v0.61 "Cuttlefish"
+==================
+
+Upgrading from v0.60
+--------------------
+
+* The ceph-deploy tool is now the preferred method of provisioning
+  new clusters.  For existing clusters created via mkcephfs that
+  would like to transition to the new tool, there is a migration
+  path, documented at `Transitioning to ceph-deploy`_.
+
+
+* The sysvinit script (/etc/init.d/ceph) will now verify (and, if
+  necessary, update) the OSD's position in the CRUSH map on startup.
+  (The upstart script has always worked this way.) By default, this
+  ensures that the OSD is under a 'host' with a name that matches the
+  hostname (``hostname -s``).  Legacy clusters create with mkcephfs do
+  this by default, so this should not cause any problems, but legacy
+  clusters with customized CRUSH maps with an alternate structure
+  should set ``osd crush update on start = false``.
+
+* radosgw-admin now uses the term zone instead of cluster to describe
+  each instance of the radosgw data store (and corresponding
+  collection of radosgw daemons).  The usage for the radosgw-admin
+  command and the 'rgw zone root pool' config options have changed
+  accordingly.
+
+* rbd progress indicators now go to standard error instead of standard
+  out.  (You can disable progress with --no-progress.)
+
+* The 'rbd resize ...' command now requires the --allow-shrink option
+  when resizing to a smaller size.  Expanding images to a larger size
+  is unchanged.
+
+* Please review the changes going back to 0.56.4 if you are upgrading
+  all the way from bobtail.
+
+* The old 'ceph stop_cluster' command has been removed.
+
+* The sysvinit script now uses the ceph.conf file on the remote host
+  when starting remote daemons via the '-a' option.  Note that if '-a'
+  is used in conjunction with '-c path', the path must also be present
+  on the remote host (it is not copied to a temporary file, as it was
+  previously).
+
+
+Upgrading from v0.56.4 "Bobtail"
+--------------------------------
+
+Please see `Upgrading from Bobtail to Cuttlefish`_ for details.
+
+.. _Upgrading from Bobtail to Cuttlefish: ../install/upgrading-ceph/#upgrading-from-bobtail-to-cuttlefish
+
+* The ceph-deploy tool is now the preferred method of provisioning
+  new clusters.  For existing clusters created via mkcephfs that
+  would like to transition to the new tool, there is a migration
+  path, documented at `Transitioning to ceph-deploy`_.
+
+.. _Transitioning to ceph-deploy: ../rados/deployment/ceph-deploy-transition
+
+* The sysvinit script (/etc/init.d/ceph) will now verify (and, if
+  necessary, update) the OSD's position in the CRUSH map on startup.
+  (The upstart script has always worked this way.) By default, this
+  ensures that the OSD is under a 'host' with a name that matches the
+  hostname (``hostname -s``).  Legacy clusters create with mkcephfs do
+  this by default, so this should not cause any problems, but legacy
+  clusters with customized CRUSH maps with an alternate structure
+  should set ``osd crush update on start = false``.
+
+* radosgw-admin now uses the term zone instead of cluster to describe
+  each instance of the radosgw data store (and corresponding
+  collection of radosgw daemons).  The usage for the radosgw-admin
+  command and the 'rgw zone root pool' config optoins have changed
+  accordingly.
+
+* rbd progress indicators now go to standard error instead of standard
+  out.  (You can disable progress with --no-progress.)
+
+* The 'rbd resize ...' command now requires the --allow-shrink option
+  when resizing to a smaller size.  Expanding images to a larger size
+  is unchanged.
+
+* Please review the changes going back to 0.56.4 if you are upgrading
+  all the way from bobtail.
+
+* The old 'ceph stop_cluster' command has been removed.
+
+* The sysvinit script now uses the ceph.conf file on the remote host
+  when starting remote daemons via the '-a' option.  Note that if '-a'
+  is used in conjuction with '-c path', the path must also be present
+  on the remote host (it is not copied to a temporary file, as it was
+  previously).
+
+* The monitor is using a completely new storage strategy and
+  intra-cluster protocol.  This means that cuttlefish and bobtail
+  monitors do not talk to each other.  When you upgrade each one, it
+  will convert its local data store to the new format.  Once you
+  upgrade a majority, the quorum will be formed using the new protocol
+  and the old monitors will be blocked out until they too get
+  upgraded.  For this reason, we recommend not running a mixed-version
+  cluster for very long.
+
+* ceph-mon now requires the creation of its data directory prior to
+  --mkfs, similarly to what happens on ceph-osd.  This directory is no
+  longer automatically created, and custom scripts should be adjusted to
+  reflect just that.
+
+* The monitor now enforces that MDS names be unique.  If you have
+  multiple daemons start with with the same id (e.g., ``mds.a``) the
+  second one will implicitly mark the first as failed.  This makes
+  things less confusing and makes a daemon restart faster (we no
+  longer wait for the stopped daemon to time out) but existing
+  multi-mds configurations may need to be adjusted accordingly to give
+  daemons unique names.
+
+* The 'ceph osd pool delete <poolname>' and 'rados rmpool <poolname>'
+  now have safety interlocks with loud warnings that make you confirm
+  pool removal.  Any scripts curenty rely on these functions zapping
+  data without confirmation need to be adjusted accordingly.
+
+
+Notable Changes from v0.60
+--------------------------
+
+* rbd: incremental backups
+* rbd: only set STRIPINGV2 feature if striping parameters are incompatible with old versions
+* rbd: require --allow-shrink for resizing images down
+* librbd: many bug fixes
+* rgw: management REST API
+* rgw: fix object corruption on COPY to self
+* rgw: new sysvinit script for rpm-based systems
+* rgw: allow buckets with '_'
+* rgw: CORS support
+* mon: many fixes
+* mon: improved trimming behavior
+* mon: fix data conversion/upgrade problem (from bobtail)
+* mon: ability to tune leveldb
+* mon: config-keys service to store arbitrary data on monitor
+* mon: 'osd crush add|link|unlink|add-bucket ...' commands
+* mon: trigger leveldb compaction on trim
+* osd: per-rados pool quotas (objects, bytes)
+* osd: tool to export, import, and delete PGs from an individual OSD data store
+* osd: notify mon on clean shutdown to avoid IO stall
+* osd: improved detection of corrupted journals
+* osd: ability to tune leveldb
+* osd: improve client request throttling
+* osd, librados: fixes to the LIST_SNAPS operation
+* osd: improvements to scrub error repair
+* osd: better prevention of wedging OSDs with ENOSPC 
+* osd: many small fixes
+* mds: fix xattr handling on root inode
+* mds: fixed bugs in journal replay
+* mds: many fixes
+* librados: clean up snapshot constant definitions
+* libcephfs: calls to query CRUSH topology (used by Hadoop)
+* ceph-fuse, libcephfs: misc fixes to mds session management
+* ceph-fuse: disabled cache invalidation (again) due to potential deadlock with kernel
+* sysvinit: try to start all daemons despite early failures
+* ceph-disk: new 'list' command
+* ceph-disk: hotplug fixes for RHEL/CentOS
+* ceph-disk: fix creation of OSD data partitions on >2TB disks
+* osd: fix udev rules for RHEL/CentOS systems
+* fix daemon logging during initial startup
+
+Notable changes from v0.56 "Bobtail"
+------------------------------------
+* always use installed system leveldb (Gary Lowell)
+* auth: ability to require new cephx signatures on messages (still off by default)
+* buffer unit testing (Loic Dachary)
+* ceph tool: some CLI interface cleanups
+* ceph-disk: improve multicluster support, error handling (Sage Weil)
+* ceph-disk: support for dm-crypt (Alexandre Marangone)
+* ceph-disk: support for sysvinit, directories or partitions (not full disks)
+* ceph-disk: fix mkfs args on old distros (Alexandre Marangone)
+* ceph-disk: fix creation of OSD data partitions on >2TB disks
+* ceph-disk: hotplug fixes for RHEL/CentOS
+* ceph-disk: new 'list' command
+* ceph-fuse, libcephfs: misc fixes to mds session management
+* ceph-fuse: disabled cache invalidation (again) due to potential deadlock with kernel
+* ceph-fuse: enable kernel cache invalidation (Sam Lang)
+* ceph-fuse: fix statfs(2) reporting
+* ceph-fuse: session handling cleanup, bug fixes (Sage Weil)
+* crush: ability to create, remove rules via CLI
+* crush: update weights for all instances of an item, not just the first (Sage Weil)
+* fix daemon logging during initial startup
+* fixed log rotation (Gary Lowell)
+* init-ceph, mkcephfs: close a few security holes with -a  (Sage Weil)
+* libcephfs: calls to query CRUSH topology (used by Hadoop)
+* libcephfs: many fixes, cleanups with the Java bindings
+* libcephfs: new topo API requests for Hadoop (Noah Watkins)
+* librados: clean up snapshot constant definitions
+* librados: fix linger bugs (Josh Durgin)
+* librbd: fixed flatten deadlock (Josh Durgin)
+* librbd: fixed some locking issues with flatten (Josh Durgin)
+* librbd: many bug fixes
+* librbd: optionally wait for flush before enabling writeback (Josh Durgin)
+* many many cleanups (Danny Al-Gaaf)
+* mds, ceph-fuse: fix bugs with replayed requests after MDS restart (Sage Weil)
+* mds, ceph-fuse: manage layouts via xattrs
+* mds: allow xattrs on root
+* mds: fast failover between MDSs (enforce unique mds names)
+* mds: fix xattr handling on root inode
+* mds: fixed bugs in journal replay
+* mds: improve session cleanup (Sage Weil)
+* mds: many fixes (Yan Zheng)
+* mds: misc bug fixes with clustered MDSs and failure recovery
+* mds: misc bug fixes with readdir
+* mds: new encoding for all data types (to allow forward/backward compatbility) (Greg Farnum)
+* mds: store and update backpointers/traces on directory, file objects (Sam Lang)
+* mon: 'osd crush add|link|unlink|add-bucket ...' commands
+* mon: ability to tune leveldb
+* mon: approximate recovery, IO workload stats
+* mon: avoid marking entire CRUSH subtrees out (e.g., if an entire rack goes offline)
+* mon: config-keys service to store arbitrary data on monitor
+* mon: easy adjustment of crush tunables via 'ceph osd crush tunables ...'
+* mon: easy creation of crush rules vai 'ceph osd rule ...'
+* mon: fix data conversion/upgrade problem (from bobtail)
+* mon: improved trimming behavior
+* mon: many fixes
+* mon: new 'ceph df [detail]' command
+* mon: new checks for identifying and reporting clock drift
+* mon: rearchitected to utilize single instance of paxos and a key/value store (Joao Luis)
+* mon: safety check for pool deletion
+* mon: shut down safely if disk approaches full (Joao Luis)
+* mon: trigger leveldb compaction on trim
+* msgr: fix comparison of IPv6 addresses (fixes monitor bringup via ceph-deploy, chef)
+* msgr: fixed race in connection reset
+* msgr: optionally tune TCP buffer size to avoid throughput collapse (Jim Schutt)
+* much code cleanup and optimization (Danny Al-Gaaf)
+* osd, librados: ability to list watchers (David Zafman)
+* osd, librados: fixes to the LIST_SNAPS operation
+* osd, librados: new listsnaps command (David Zafman)
+* osd: a few journaling bug fixes
+* osd: ability to tune leveldb
+* osd: add 'noscrub', 'nodeepscrub' osdmap flags (David Zafman)
+* osd: better prevention of wedging OSDs with ENOSPC
+* osd: ceph-filestore-dump tool for debugging
+* osd: connection handling bug fixes
+* osd: deep-scrub omap keys/values
+* osd: default to libaio for the journal (some performance boost)
+* osd: fix hang in 'journal aio = true' mode (Sage Weil)
+* osd: fix pg log trimming (avoids memory bloat on degraded clusters)
+* osd: fix udev rules for RHEL/CentOS systems
+* osd: fixed bug in journal checksums (Sam Just)
+* osd: improved client request throttling
+* osd: improved handling when disk fills up (David Zafman)
+* osd: improved journal corruption detection (Sam Just)
+* osd: improved detection of corrupted journals
+* osd: improvements to scrub error repair
+* osd: make tracking of object snapshot metadata more efficient (Sam Just)
+* osd: many small fixes
+* osd: misc fixes to PG split (Sam Just)
+* osd: move pg info, log into leveldb (== better performance) (David Zafman)
+* osd: notify mon on clean shutdown to avoid IO stall
+* osd: per-rados pool quotas (objects, bytes)
+* osd: refactored watch/notify infrastructure (fixes protocol, removes many bugs) (Sam Just)
+* osd: support for improved hashing of PGs across OSDs via HASHPSPOOL pool flag and feature
+* osd: tool to export, import, and delete PGs from an individual OSD data store
+* osd: trim log more aggressively, avoid appearance of leak memory
+* osd: validate snap collections on startup
+* osd: verify snap collections on startup (Sam Just)
+* radosgw: ACL grants in headers (Caleb Miles)
+* radosgw: ability to listen to fastcgi via a port (Guilhem Lettron)
+* radosgw: fix object copy onto self (Yehuda Sadeh)
+* radosgw: misc fixes
+* rbd-fuse: new tool, package
+* rbd: avoid FIEMAP when importing from file (it can be buggy)
+* rbd: incremental backups
+* rbd: only set STRIPINGV2 feature if striping parameters are incompatible with old versions
+* rbd: require --allow-shrink for resizing images down
+* rbd: udevadm settle on map/unmap to avoid various races (Dan Mick)
+* rbd: wait for udev to settle in strategic places (avoid spurious errors, failures)
+* rgw: CORS support
+* rgw: allow buckets with '_'
+* rgw: fix Content-Length on 32-bit machines (Jan Harkes)
+* rgw: fix log rotation
+* rgw: fix object corruption on COPY to self
+* rgw: fixed >4MB range requests (Jan Harkes)
+* rgw: new sysvinit script for rpm-based systems
+* rpm/deb: do not remove /var/lib/ceph on purge (v0.59 was the only release to do so)
+* sysvinit: try to start all daemons despite early failures
+* upstart: automatically set osd weight based on df (Guilhem Lettron)
+* use less memory for logging by default
+
+
+v0.60
+=====
+
+Upgrading
+---------
+
+* Please note that the recently added librados 'list_snaps' function
+  call is in a state of flux and is changing slightly in v0.61.  You
+  are advised not to make use of it in v0.59 or v0.60.
+
+Notable Changes
+---------------
+
+* osd: make tracking of object snapshot metadata more efficient (Sam Just)
+* osd: misc fixes to PG split (Sam Just)
+* osd: improve journal corruption detection (Sam Just)
+* osd: improve handling when disk fills up (David Zafman)
+* osd: add 'noscrub', 'nodeepscrub' osdmap flags (David Zafman)
+* osd: fix hang in 'journal aio = true' mode (Sage Weil)
+* ceph-disk-prepare: fix mkfs args on old distros (Alexandre Marangone)
+* ceph-disk-activate: improve multicluster support, error handling (Sage Weil)
+* librbd: optionally wait for flush before enabling writeback (Josh Durgin)
+* crush: update weights for all instances of an item, not just the first (Sage Weil)
+* mon: shut down safely if disk approaches full (Joao Luis)
+* rgw: fix Content-Length on 32-bit machines (Jan Harkes)
+* mds: store and update backpointers/traces on directory, file objects (Sam Lang)
+* mds: improve session cleanup (Sage Weil)
+* mds, ceph-fuse: fix bugs with replayed requests after MDS restart (Sage Weil)
+* ceph-fuse: enable kernel cache invalidation (Sam Lang)
+* libcephfs: new topo API requests for Hadoop (Noah Watkins)
+* ceph-fuse: session handling cleanup, bug fixes (Sage Weil)
+* much code cleanup and optimization (Danny Al-Gaaf)
+* use less memory for logging by default
+* upstart: automatically set osd weight based on df (Guilhem Lettron)
+* init-ceph, mkcephfs: close a few security holes with -a  (Sage Weil)
+* rpm/deb: do not remove /var/lib/ceph on purge (v0.59 was the only release to do so)
+
+
+v0.59
+=====
+
+Upgrading
+---------
+
+* The monitor is using a completely new storage strategy and
+  intra-cluster protocol.  This means that v0.59 and pre-v0.59
+  monitors do not talk to each other.  When you upgrade each one, it
+  will convert its local data store to the new format.  Once you
+  upgrade a majority, the quorum will be formed using the new protocol
+  and the old monitors will be blocked out until they too get
+  upgraded.  For this reason, we recommend not running a mixed-version
+  cluster for very long.
+
+* ceph-mon now requires the creation of its data directory prior to
+  --mkfs, similarly to what happens on ceph-osd.  This directory is no
+  longer automatically created, and custom scripts should be adjusted to
+  reflect just that.
+
+
+Notable Changes
+---------------
+
+ * mon: rearchitected to utilize single instance of paxos and a key/value store (Joao Luis)
+ * mon: new 'ceph df [detail]' command
+ * osd: support for improved hashing of PGs across OSDs via HASHPSPOOL pool flag and feature
+ * osd: refactored watch/notify infrastructure (fixes protocol, removes many bugs) (Sam Just) 
+ * osd, librados: ability to list watchers (David Zafman)
+ * osd, librados: new listsnaps command (David Zafman)
+ * osd: trim log more aggressively, avoid appearance of leak memory
+ * osd: misc split fixes
+ * osd: a few journaling bug fixes
+ * osd: connection handling bug fixes
+ * rbd: avoid FIEMAP when importing from file (it can be buggy)
+ * librados: fix linger bugs (Josh Durgin)
+ * librbd: fixed flatten deadlock (Josh Durgin)
+ * rgw: fixed >4MB range requests (Jan Harkes)
+ * rgw: fix log rotation
+ * mds: allow xattrs on root
+ * ceph-fuse: fix statfs(2) reporting
+ * msgr: optionally tune TCP buffer size to avoid throughput collapse (Jim Schutt)
+ * consume less memory for logging by default
+ * always use system leveldb (Gary Lowell)
+
+
+
+v0.58
+=====
+
+Upgrading
+---------
+
+* The monitor now enforces that MDS names be unique.  If you have
+  multiple daemons start with with the same id (e.g., ``mds.a``) the
+  second one will implicitly mark the first as failed.  This makes
+  things less confusing and makes a daemon restart faster (we no
+  longer wait for the stopped daemon to time out) but existing
+  multi-mds configurations may need to be adjusted accordingly to give
+  daemons unique names.
+
+Notable Changes
+---------------
+
+ * librbd: fixed some locking issues with flatten (Josh Durgin)
+ * rbd: udevadm settle on map/unmap to avoid various races (Dan Mick)
+ * osd: move pg info, log into leveldb (== better performance) (David Zafman)
+ * osd: fix pg log trimming (avoids memory bloat on degraded clusters)
+ * osd: fixed bug in journal checksums (Sam Just)
+ * osd: verify snap collections on startup (Sam Just)
+ * ceph-disk-prepare/activate: support for dm-crypt (Alexandre Marangone)
+ * ceph-disk-prepare/activate: support for sysvinit, directories or partitions (not full disks)
+ * msgr: fixed race in connection reset
+ * msgr: fix comparison of IPv6 addresses (fixes monitor bringup via ceph-deploy, chef)
+ * radosgw: fix object copy onto self (Yehuda Sadeh)
+ * radosgw: ACL grants in headers (Caleb Miles)
+ * radosgw: ability to listen to fastcgi via a port (Guilhem Lettron)
+ * mds: new encoding for all data types (to allow forward/backward compatbility) (Greg Farnum)
+ * mds: fast failover between MDSs (enforce unique mds names)
+ * crush: ability to create, remove rules via CLI
+ * many many cleanups (Danny Al-Gaaf)
+ * buffer unit testing (Loic Dachary)
+ * fixed log rotation (Gary Lowell)
+
+v0.57
+=====
+
+This development release has a lot of additional functionality
+accumulated over the last couple months.  Most of the bug fixes (with
+the notable exception of the MDS related work) has already been
+backported to v0.56.x, and is not mentioned here.
+
+Upgrading
+---------
+
+* The 'ceph osd pool delete <poolname>' and 'rados rmpool <poolname>'
+  now have safety interlocks with loud warnings that make you confirm
+  pool removal.  Any scripts curenty rely on these functions zapping
+  data without confirmation need to be adjusted accordingly.
+
+Notable Changes
+---------------
+
+* osd: default to libaio for the journal (some performance boost)
+* osd: validate snap collections on startup
+* osd: ceph-filestore-dump tool for debugging
+* osd: deep-scrub omap keys/values
+* ceph tool: some CLI interface cleanups
+* mon: easy adjustment of crush tunables via 'ceph osd crush tunables ...'
+* mon: easy creation of crush rules vai 'ceph osd rule ...'
+* mon: approximate recovery, IO workload stats
+* mon: avoid marking entire CRUSH subtrees out (e.g., if an entire rack goes offline)
+* mon: safety check for pool deletion
+* mon: new checks for identifying and reporting clock drift
+* radosgw: misc fixes
+* rbd: wait for udev to settle in strategic places (avoid spurious errors, failures)
+* rbd-fuse: new tool, package
+* mds, ceph-fuse: manage layouts via xattrs
+* mds: misc bug fixes with clustered MDSs and failure recovery
+* mds: misc bug fixes with readdir
+* libcephfs: many fixes, cleanups with the Java bindings
+* auth: ability to require new cephx signatures on messages (still off by default)
+
+
+
+v0.56.7 "bobtail"
+=================
+
+This bobtail update fixes a range of radosgw bugs (including an easily
+triggered crash from multi-delete), a possible data corruption issue
+with power failure on XFS, and several OSD problems, including a
+memory "leak" that will affect aged clusters.
+
+Notable changes
+---------------
+
+* ceph-fuse: create finisher flags after fork()
+* debian: fix prerm/postinst hooks; do not restart daemons on upgrade
+* librados: fix async aio completion wakeup (manifests as rbd hang)
+* librados: fix hang when osd becomes full and then not full
+* librados: fix locking for aio completion refcounting
+* librbd python bindings: fix stripe_unit, stripe_count
+* librbd: make image creation default configurable
+* mon: fix validation of mds ids in mon commands
+* osd: avoid excessive disk updates during peering
+* osd: avoid excessive memory usage on scrub
+* osd: avoid heartbeat failure/suicide when scrubbing
+* osd: misc minor bug fixes
+* osd: use fdatasync instead of sync_file_range (may avoid xfs power-loss corruption)
+* rgw: escape prefix correctly when listing objects
+* rgw: fix copy attrs
+* rgw: fix crash on multi delete
+* rgw: fix locking/crash when using ops log socket
+* rgw: fix usage logging
+* rgw: handle deep uri resources
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.7.txt>`.
+
+
+v0.56.6 "bobtail"
+=================
+
+Notable changes
+---------------
+
+* rgw: fix garbage collection
+* rpm: fix package dependencies
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.6.txt>`.
+
+
+v0.56.5 "bobtail"
+=================
+
+Upgrading
+---------
+
+* ceph-disk[-prepare,-activate] behavior has changed in various ways.
+  There should not be any compatibility issues, but chef users should
+  be aware.
+
+Notable changes
+---------------
+
+* mon: fix recording of quorum feature set (important for argonaut -> bobtail -> cuttlefish mon upgrades)
+* osd: minor peering bug fixes
+* osd: fix a few bugs when pools are renamed
+* osd: fix occasionally corrupted pg stats
+* osd: fix behavior when broken v0.56[.0] clients connect
+* rbd: avoid FIEMAP ioctl on import (it is broken on some kernels)
+* librbd: fixes for several request/reply ordering bugs
+* librbd: only set STRIPINGV2 feature on new images when needed
+* librbd: new async flush method to resolve qemu hangs (requires Qemu update as well)
+* librbd: a few fixes to flatten
+* ceph-disk: support for dm-crypt
+* ceph-disk: many backports to allow bobtail deployments with ceph-deploy, chef
+* sysvinit: do not stop starting daemons on first failure
+* udev: fixed rules for redhat-based distros
+* build fixes for raring
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.5.txt>`.
+
+v0.56.4 "bobtail"
+=================
+
+Upgrading
+---------
+
+* There is a fix in the syntax for the output of 'ceph osd tree --format=json'.
+
+* The MDS disk format has changed from prior releases *and* from v0.57.  In particular,
+  upgrades to v0.56.4 are safe, but you cannot move from v0.56.4 to v0.57 if you are using
+  the MDS for CephFS; you must upgrade directly to v0.58 (or later) instead.
+
+Notable changes
+---------------
+
+* mon: fix bug in bringup with IPv6
+* reduce default memory utilization by internal logging (all daemons)
+* rgw: fix for bucket removal
+* rgw: reopen logs after log rotation
+* rgw: fix multipat upload listing
+* rgw: don't copy object when copied onto self
+* osd: fix caps parsing for pools with - or _
+* osd: allow pg log trimming when degraded, scrubbing, recoverying (reducing memory consumption)
+* osd: fix potential deadlock when 'journal aio = true'
+* osd: various fixes for collection creation/removal, rename, temp collections
+* osd: various fixes for PG split
+* osd: deep-scrub omap key/value data
+* osd: fix rare bug in journal replay
+* osd: misc fixes for snapshot tracking
+* osd: fix leak in recovery reservations on pool deletion
+* osd: fix bug in connection management
+* osd: fix for op ordering when rebalancing
+* ceph-fuse: report file system size with correct units
+* mds: get and set directory layout policies via virtual xattrs
+* mds: on-disk format revision (see upgrading note above)
+* mkcephfs, init-ceph: close potential security issues with predictable filenames
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.4.txt>`.
+
+v0.56.3 "bobtail"
+=================
+
+This release has several bug fixes surrounding OSD stability.  Most
+significantly, an issue with OSDs being unresponsive shortly after
+startup (and occasionally crashing due to an internal heartbeat check)
+is resolved.  Please upgrade.
+
+Upgrading
+---------
+
+* A bug was fixed in which the OSDMap epoch for PGs without any IO
+  requests was not recorded.  If there are pools in the cluster that
+  are completely idle (for example, the ``data`` and ``metadata``
+  pools normally used by CephFS), and a large number of OSDMap epochs
+  have elapsed since the ``ceph-osd`` daemon was last restarted, those
+  maps will get reprocessed when the daemon restarts.  This process
+  can take a while if there are a lot of maps.  A workaround is to
+  'touch' any idle pools with IO prior to restarting the daemons after
+  packages are upgraded::
+
+   rados bench 10 write -t 1 -b 4096 -p {POOLNAME}
+
+  This will typically generate enough IO to touch every PG in the pool
+  without generating significant cluster load, and also cleans up any
+  temporary objects it creates.
+
+Notable changes
+---------------
+
+* osd: flush peering work queue prior to start
+* osd: persist osdmap epoch for idle PGs
+* osd: fix and simplify connection handling for heartbeats
+* osd: avoid crash on invalid admin command
+* mon: fix rare races with monitor elections and commands
+* mon: enforce that OSD reweights be between 0 and 1 (NOTE: not CRUSH weights)
+* mon: approximate client, recovery bandwidth logging
+* radosgw: fixed some XML formatting to conform to Swift API inconsistency
+* radosgw: fix usage accounting bug; add repair tool
+* radosgw: make fallback URI configurable (necessary on some web servers)
+* librbd: fix handling for interrupted 'unprotect' operations
+* mds, ceph-fuse: allow file and directory layouts to be modified via virtual xattrs
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.3.txt>`.
+
+
+v0.56.2 "bobtail"
+=================
+
+This release has a wide range of bug fixes, stability improvements, and some performance improvements.  Please upgrade.
+
+Upgrading
+---------
+
+* The meaning of the 'osd scrub min interval' and 'osd scrub max
+  interval' has changed slightly.  The min interval used to be
+  meaningless, while the max interval would only trigger a scrub if
+  the load was sufficiently low.  Now, the min interval option works
+  the way the old max interval did (it will trigger a scrub after this
+  amount of time if the load is low), while the max interval will
+  force a scrub regardless of load.  The default options have been
+  adjusted accordingly.  If you have customized these in ceph.conf,
+  please review their values when upgrading.
+
+* CRUSH maps that are generated by default when calling ``ceph-mon
+  --mkfs`` directly now distribute replicas across hosts instead of
+  across OSDs.  Any provisioning tools that are being used by Ceph may
+  be affected, although probably for the better, as distributing across
+  hosts is a much more commonly sought behavior.  If you use
+  ``mkcephfs`` to create the cluster, the default CRUSH rule is still
+  inferred by the number of hosts and/or racks in the initial ceph.conf.
+
+Notable changes
+---------------
+
+* osd: snapshot trimming fixes
+* osd: scrub snapshot metadata
+* osd: fix osdmap trimming
+* osd: misc peering fixes
+* osd: stop heartbeating with peers if internal threads are stuck/hung
+* osd: PG removal is friendlier to other workloads
+* osd: fix recovery start delay (was causing very slow recovery)
+* osd: fix scheduling of explicitly requested scrubs
+* osd: fix scrub interval config options
+* osd: improve recovery vs client io tuning
+* osd: improve 'slow request' warning detail for better diagnosis
+* osd: default CRUSH map now distributes across hosts, not OSDs
+* osd: fix crash on 32-bit hosts triggered by librbd clients
+* librbd: fix error handling when talking to older OSDs
+* mon: fix a few rare crashes
+* ceph command: ability to easily adjust CRUSH tunables
+* radosgw: object copy does not copy source ACLs
+* rados command: fix omap command usage
+* sysvinit script: set ulimit -n properly on remote hosts
+* msgr: fix narrow race with message queuing
+* fixed compilation on some old distros (e.g., RHEL 5.x)
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.2.txt>`.
+
+
+v0.56.1 "bobtail"
+=================
+
+This release has two critical fixes.  Please upgrade.
+
+Upgrading
+---------
+
+* There is a protocol compatibility problem between v0.56 and any
+  other version that is now fixed.  If your radosgw or RBD clients are
+  running v0.56, they will need to be upgraded too.  If they are
+  running a version prior to v0.56, they can be left as is.
+
+Notable changes
+---------------
+* osd: fix commit sequence for XFS, ext4 (or any other non-btrfs) to prevent data loss on power cycle or kernel panic
+* osd: fix compatibility for CALL operation
+* osd: process old osdmaps prior to joining cluster (fixes slow startup)
+* osd: fix a couple of recovery-related crashes
+* osd: fix large io requests when journal is in (non-default) aio mode
+* log: fix possible deadlock in logging code
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.56.1.txt>`.
+
+v0.56 "bobtail"
+===============
+
+Bobtail is the second stable release of Ceph, named in honor of the
+`Bobtail Squid`: http://en.wikipedia.org/wiki/Bobtail_squid.
+
+Key features since v0.48 "argonaut"
+-----------------------------------
+
+* Object Storage Daemon (OSD): improved threading, small-io performance, and performance during recovery
+* Object Storage Daemon (OSD): regular "deep" scrubbing of all stored data to detect latent disk errors
+* RADOS Block Device (RBD): support for copy-on-write clones of images.
+* RADOS Block Device (RBD): better client-side caching.
+* RADOS Block Device (RBD): advisory image locking
+* Rados Gateway (RGW): support for efficient usage logging/scraping (for billing purposes)
+* Rados Gateway (RGW): expanded S3 and Swift API coverage (e.g., POST, multi-object delete)
+* Rados Gateway (RGW): improved striping for large objects
+* Rados Gateway (RGW): OpenStack Keystone integration
+* RPM packages for Fedora, RHEL/CentOS, OpenSUSE, and SLES
+* mkcephfs: support for automatically formatting and mounting XFS and ext4 (in addition to btrfs)
+
+Upgrading
+---------
+
+Please refer to the document `Upgrading from Argonaut to Bobtail`_ for details.
+
+.. _Upgrading from Argonaut to Bobtail: ../install/upgrading-ceph/#upgrading-from-argonaut-to-bobtail
+
+* Cephx authentication is now enabled by default (since v0.55).
+  Upgrading a cluster without adjusting the Ceph configuration will
+  likely prevent the system from starting up on its own.  We recommend
+  first modifying the configuration to indicate that authentication is
+  disabled, and only then upgrading to the latest version.::
+
+     auth client required = none
+     auth service required = none
+     auth cluster required = none
+
+* Ceph daemons can be upgraded one-by-one while the cluster is online
+  and in service.
+
+* The ``ceph-osd`` daemons must be upgraded and restarted *before* any
+  ``radosgw`` daemons are restarted, as they depend on some new
+  ceph-osd functionality.  (The ``ceph-mon``, ``ceph-osd``, and
+  ``ceph-mds`` daemons can be upgraded and restarted in any order.)
+
+* Once each individual daemon has been upgraded and restarted, it
+  cannot be downgraded.
+
+* The cluster of ``ceph-mon`` daemons will migrate to a new internal
+  on-wire protocol once all daemons in the quorum have been upgraded.
+  Upgrading only a majority of the nodes (e.g., two out of three) may
+  expose the cluster to a situation where a single additional failure
+  may compromise availability (because the non-upgraded daemon cannot
+  participate in the new protocol).  We recommend not waiting for an
+  extended period of time between ``ceph-mon`` upgrades.
+
+* The ops log and usage log for radosgw are now off by default.  If
+  you need these logs (e.g., for billing purposes), you must enable
+  them explicitly.  For logging of all operations to objects in the
+  ``.log`` pool (see ``radosgw-admin log ...``)::
+
+    rgw enable ops log = true
+
+  For usage logging of aggregated bandwidth usage (see ``radosgw-admin
+  usage ...``)::
+
+    rgw enable usage log = true
+
+* You should not create or use "format 2" RBD images until after all
+  ``ceph-osd`` daemons have been upgraded.  Note that "format 1" is
+  still the default.  You can use the new ``ceph osd ls`` and
+  ``ceph tell osd.N version`` commands to doublecheck your cluster.
+  ``ceph osd ls`` will give a list of all OSD IDs that are part of the
+  cluster, and you can use that to write a simple shell loop to display
+  all the OSD version strings: ::
+
+      for i in $(ceph osd ls); do
+          ceph tell osd.${i} version
+      done
+
+
+Compatibility changes
+---------------------
+
+* The 'ceph osd create [<uuid>]' command now rejects an argument that
+  is not a UUID.  (Previously it would take take an optional integer
+  OSD id.)  This correct syntax has been 'ceph osd create [<uuid>]'
+  since v0.47, but the older calling convention was being silently
+  ignored.
+
+* The CRUSH map root nodes now have type ``root`` instead of type
+  ``pool``.  This avoids confusion with RADOS pools, which are not
+  directly related.  Any scripts or tools that use the ``ceph osd
+  crush ...`` commands may need to be adjusted accordingly.
+
+* The ``ceph osd pool create <poolname> <pgnum>`` command now requires
+  the ``pgnum`` argument. Previously this was optional, and would
+  default to 8, which was almost never a good number.
+
+* Degraded mode (when there fewer than the desired number of replicas)
+  is now more configurable on a per-pool basis, with the min_size
+  parameter. By default, with min_size 0, this allows I/O to objects
+  with N - floor(N/2) replicas, where N is the total number of
+  expected copies. Argonaut behavior was equivalent to having min_size
+  = 1, so I/O would always be possible if any completely up to date
+  copy remained. min_size = 1 could result in lower overall
+  availability in certain cases, such as flapping network partitions.
+
+* The sysvinit start/stop script now defaults to adjusting the max
+  open files ulimit to 16384.  On most systems the default is 1024, so
+  this is an increase and won't break anything.  If some system has a
+  higher initial value, however, this change will lower the limit.
+  The value can be adjusted explicitly by adding an entry to the
+  ``ceph.conf`` file in the appropriate section.  For example::
+
+     [global]
+             max open files = 32768
+
+* 'rbd lock list' and 'rbd showmapped' no longer use tabs as
+  separators in their output.
+
+* There is configurable limit on the number of PGs when creating a new
+  pool, to prevent a user from accidentally specifying a ridiculous
+  number for pg_num.  It can be adjusted via the 'mon max pool pg num'
+  option on the monitor, and defaults to 65536 (the current max
+  supported by the Linux kernel client).
+
+* The osd capabilities associated with a rados user have changed
+  syntax since 0.48 argonaut. The new format is mostly backwards
+  compatible, but there are two backwards-incompatible changes:
+
+  * specifying a list of pools in one grant, i.e.
+    'allow r pool=foo,bar' is now done in separate grants, i.e.
+    'allow r pool=foo, allow r pool=bar'.
+
+  * restricting pool access by pool owner ('allow r uid=foo') is
+    removed. This feature was not very useful and unused in practice.
+
+  The new format is documented in the ceph-authtool man page.
+
+* 'rbd cp' and 'rbd rename' use rbd as the default destination pool,
+  regardless of what pool the source image is in. Previously they
+  would default to the same pool as the source image.
+
+* 'rbd export' no longer prints a message for each object written. It
+  just reports percent complete like other long-lasting operations.
+
+* 'ceph osd tree' now uses 4 decimal places for weight so output is
+  nicer for humans
+
+* Several monitor operations are now idempotent:
+
+  * ceph osd pool create
+  * ceph osd pool delete
+  * ceph osd pool mksnap
+  * ceph osd rm
+  * ceph pg <pgid> revert
+
+Notable changes
+---------------
+
+* auth: enable cephx by default
+* auth: expanded authentication settings for greater flexibility
+* auth: sign messages when using cephx
+* build fixes for Fedora 18, CentOS/RHEL 6
+* ceph: new 'osd ls' and 'osd tell <osd.N> version' commands
+* ceph-debugpack: misc improvements
+* ceph-disk-prepare: creates and labels GPT partitions
+* ceph-disk-prepare: support for external journals, default mount/mkfs options, etc.
+* ceph-fuse/libcephfs: many misc fixes, admin socket debugging
+* ceph-fuse: fix handling for .. in root directory
+* ceph-fuse: many fixes (including memory leaks, hangs)
+* ceph-fuse: mount helper (mount.fuse.ceph) for use with /etc/fstab
+* ceph.spec: misc packaging fixes
+* common: thread pool sizes can now be adjusted at runtime
+* config: $pid is now available as a metavariable
+* crush: default root of tree type is now 'root' instead of 'pool' (to avoid confusiong wrt rados pools)
+* crush: fixed retry behavior with chooseleaf via tunable
+* crush: tunables documented; feature bit now present and enforced
+* libcephfs: java wrapper
+* librados: several bug fixes (rare races, locking errors)
+* librados: some locking fixes
+* librados: watch/notify fixes, misc memory leaks
+* librbd: a few fixes to 'discard' support
+* librbd: fine-grained striping feature
+* librbd: fixed memory leaks
+* librbd: fully functional and documented image cloning
+* librbd: image (advisory) locking
+* librbd: improved caching (of object non-existence)
+* librbd: 'flatten' command to sever clone parent relationship
+* librbd: 'protect'/'unprotect' commands to prevent clone parent from being deleted
+* librbd: clip requests past end-of-image.
+* librbd: fixes an issue with some windows guests running in qemu (remove floating point usage)
+* log: fix in-memory buffering behavior (to only write log messages on crash)
+* mds: fix ino release on abort session close, relative getattr path, mds shutdown, other misc items
+* mds: misc fixes
+* mkcephfs: fix for default keyring, osd data/journal locations
+* mkcephfs: support for formatting xfs, ext4 (as well as btrfs)
+* init: support for automatically mounting xfs and ext4 osd data directories
+* mon, radosgw, ceph-fuse: fixed memory leaks
+* mon: improved ENOSPC, fs error checking
+* mon: less-destructive ceph-mon --mkfs behavior
+* mon: misc fixes
+* mon: more informative info about stuck PGs in 'health detail'
+* mon: information about recovery and backfill in 'pg <pgid> query'
+* mon: new 'osd crush create-or-move ...' command
+* mon: new 'osd crush move ...' command lets you rearrange your CRUSH hierarchy
+* mon: optionally dump 'osd tree' in json
+* mon: configurable cap on maximum osd number (mon max osd)
+* mon: many bug fixes (various races causing ceph-mon crashes)
+* mon: new on-disk metadata to facilitate future mon changes (post-bobtail)
+* mon: election bug fixes
+* mon: throttle client messages (limit memory consumption)
+* mon: throttle osd flapping based on osd history (limits osdmap ΄thrashing' on overloaded or unhappy clusters)
+* mon: 'report' command for dumping detailed cluster status (e.g., for use when reporting bugs)
+* mon: osdmap flags like noup, noin now cause a health warning
+* msgr: improved failure handling code
+* msgr: many bug fixes
+* osd, mon: honor new 'nobackfill' and 'norecover' osdmap flags
+* osd, mon: use feature bits to lock out clients lacking CRUSH tunables when they are in use
+* osd: backfill reservation framework (to avoid flooding new osds with backfill data)
+* osd: backfill target reservations (improve performance during recovery)
+* osd: better tracking of recent slow operations
+* osd: capability grammar improvements, bug fixes
+* osd: client vs recovery io prioritization
+* osd: crush performance improvements
+* osd: default journal size to 5 GB
+* osd: experimental support for PG "splitting" (pg_num adjustment for existing pools)
+* osd: fix memory leak on certain error paths
+* osd: fixed detection of EIO errors from fs on read
+* osd: major refactor of PG peering and threading
+* osd: many bug fixes
+* osd: more/better dump info about in-progress operations
+* osd: new caps structure (see compatibility notes)
+* osd: new 'deep scrub' will compare object content across replicas (once per week by default)
+* osd: new 'lock' rados class for generic object locking
+* osd: optional 'min' pg size
+* osd: recovery reservations
+* osd: scrub efficiency improvement
+* osd: several out of order reply bug fixes
+* osd: several rare peering cases fixed
+* osd: some performance improvements related to request queuing
+* osd: use entire device if journal is a block device
+* osd: use syncfs(2) when kernel supports it, even if glibc does not
+* osd: various fixes for out-of-order op replies
+* rados: ability to copy, rename pools
+* rados: bench command now cleans up after itself
+* rados: 'cppool' command to copy rados pools
+* rados: 'rm' now accepts a list of objects to be removed
+* radosgw: POST support
+* radosgw: REST API for managing usage stats
+* radosgw: fix bug in bucket stat updates
+* radosgw: fix copy-object vs attributes
+* radosgw: fix range header for large objects, ETag quoting, GMT dates, other compatibility fixes
+* radosgw: improved garbage collection framework
+* radosgw: many small fixes, cleanups
+* radosgw: openstack keystone integration
+* radosgw: stripe large (non-multipart) objects
+* radosgw: support for multi-object deletes
+* radosgw: support for swift manifest objects
+* radosgw: vanity bucket dns names
+* radosgw: various API compatibility fixes
+* rbd: import from stdin, export to stdout
+* rbd: new 'ls -l' option to view images with metadata
+* rbd: use generic id and keyring options for 'rbd map'
+* rbd: don't issue usage on errors
+* udev: fix symlink creation for rbd images containing partitions
+* upstart: job files for all daemon types (not enabled by default)
+* wireshark: ceph protocol dissector patch updated
+
+
+v0.54
+=====
+
+Upgrading
+---------
+
+* The osd capabilities associated with a rados user have changed
+  syntax since 0.48 argonaut. The new format is mostly backwards
+  compatible, but there are two backwards-incompatible changes:
+
+  * specifying a list of pools in one grant, i.e.
+    'allow r pool=foo,bar' is now done in separate grants, i.e.
+    'allow r pool=foo, allow r pool=bar'.
+
+  * restricting pool access by pool owner ('allow r uid=foo') is
+    removed. This feature was not very useful and unused in practice.
+
+  The new format is documented in the ceph-authtool man page.
+
+* Bug fixes to the new osd capability format parsing properly validate
+  the allowed operations. If an existing rados user gets permissions
+  errors after upgrading, its capabilities were probably
+  misconfigured. See the ceph-authtool man page for details on osd
+  capabilities.
+
+* 'rbd lock list' and 'rbd showmapped' no longer use tabs as
+  separators in their output.
+
+
+v0.48.3 "argonaut"
+==================
+
+This release contains a critical fix that can prevent data loss or
+corruption after a power loss or kernel panic event.  Please upgrade
+immediately.
+
+Upgrading
+---------
+
+* If you are using the undocumented ``ceph-disk-prepare`` and
+  ``ceph-disk-activate`` tools, they have several new features and
+  some additional functionality.  Please review the changes in
+  behavior carefully before upgrading.
+* The .deb packages now require xfsprogs.
+
+Notable changes
+---------------
+
+* filestore: fix op_seq write order (fixes journal replay after power loss)
+* osd: fix occasional indefinitely hung "slow" request
+* osd: fix encoding for pool_snap_info_t when talking to pre-v0.48 clients
+* osd: fix heartbeat check
+* osd: reduce log noise about rbd watch
+* log: fixes for deadlocks in the internal logging code
+* log: make log buffer size adjustable
+* init script: fix for 'ceph status' across machines
+* radosgw: fix swift error handling
+* radosgw: fix swift authentication concurrency bug
+* radosgw: don't cache large objects
+* radosgw: fix some memory leaks
+* radosgw: fix timezone conversion on read
+* radosgw: relax date format restrictions
+* radosgw: fix multipart overwrite
+* radosgw: stop processing requests on client disconnect
+* radosgw: avoid adding port to url that already has a port
+* radosgw: fix copy to not override ETAG
+* common: make parsing of ip address lists more forgiving
+* common: fix admin socket compatibility with old protocol (for collectd plugin)
+* mon: drop dup commands on paxos reset
+* mds: fix loner selection for multiclient workloads
+* mds: fix compat bit checks
+* ceph-fuse: fix segfault on startup when keyring is missing
+* ceph-authtool: fix usage
+* ceph-disk-activate: misc backports
+* ceph-disk-prepare: misc backports
+* debian: depend on xfsprogs (we use xfs by default)
+* rpm: build rpms, some related Makefile changes
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.48.3argonaut.txt>`.
+
+v0.48.2 "argonaut"
+==================
+
+Upgrading
+---------
+
+* The default search path for keyring files now includes /etc/ceph/ceph.$name.keyring.  If such files are present on your cluster, be aware that by default they may now be used.
+
+* There are several changes to the upstart init files.  These have not been previously documented or recommended.  Any existing users should review the changes before upgrading.
+
+* The ceph-disk-prepare and ceph-disk-active scripts have been updated significantly.  These have not been previously documented or recommended.  Any existing users should review the changes before upgrading.
+
+Notable changes
+---------------
+
+* mkcephfs: fix keyring generation for mds, osd when default paths are used
+* radosgw: fix bug causing occasional corruption of per-bucket stats
+* radosgw: workaround to avoid previously corrupted stats from going negative
+* radosgw: fix bug in usage stats reporting on busy buckets
+* radosgw: fix Content-Range: header for objects bigger than 2 GB.
+* rbd: avoid leaving watch acting when command line tool errors out (avoids 30s delay on subsequent operations)
+* rbd: friendlier use of --pool/--image options for import (old calling convention still works)
+* librbd: fix rare snapshot creation race (could "lose" a snap when creation is concurrent)
+* librbd: fix discard handling when spanning holes
+* librbd: fix memory leak on discard when caching is enabled
+* objecter: misc fixes for op reordering
+* objecter: fix for rare startup-time deadlock waiting for osdmap
+* ceph: fix usage
+* mon: reduce log noise about "check_sub"
+* ceph-disk-activate: misc fixes, improvements
+* ceph-disk-prepare: partition and format osd disks automatically
+* upstart: start everyone on a reboot
+* upstart: always update the osd crush location on start if specified in the config
+* config: add /etc/ceph/ceph.$name.keyring to default keyring search path
+* ceph.spec: don't package crush headers
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.48.2argonaut.txt>`.
+
+v0.48.1 "argonaut"
+==================
+
+Upgrading
+---------
+
+* The radosgw usage trim function was effectively broken in v0.48.  Earlier it would remove more usage data than what was requested.  This is fixed in v0.48.1, but the fix is incompatible.  The v0.48 radosgw-admin tool cannot be used to initiate the trimming; please use the v0.48.1 version.
+
+* v0.48.1 now explicitly indicates support for the CRUSH_TUNABLES feature.  No other version of Ceph requires this, yet, but future versions will when the tunables are adjusted from their historical defaults.
+
+* There are no other compatibility changes between v0.48.1 and v0.48.
+
+Notable changes
+---------------
+
+* mkcephfs: use default 'keyring', 'osd data', 'osd journal' paths when not specified in conf
+* msgr: various fixes to socket error handling
+* osd: reduce scrub overhead
+* osd: misc peering fixes (past_interval sharing, pgs stuck in 'peering' states)
+* osd: fail on EIO in read path (do not silently ignore read errors from failing disks)
+* osd: avoid internal heartbeat errors by breaking some large transactions into pieces
+* osd: fix osdmap catch-up during startup (catch up and then add daemon to osdmap)
+* osd: fix spurious 'misdirected op' messages
+* osd: report scrub status via 'pg ... query'
+* rbd: fix race when watch registrations are resent
+* rbd: fix rbd image id assignment scheme (new image data objects have slightly different names)
+* rbd: fix perf stats for cache hit rate
+* rbd tool: fix off-by-one in key name (crash when empty key specified)
+* rbd: more robust udev rules
+* rados tool: copy object, pool commands
+* radosgw: fix in usage stats trimming
+* radosgw: misc API compatibility fixes (date strings, ETag quoting, swift headers, etc.)
+* ceph-fuse: fix locking in read/write paths
+* mon: fix rare race corrupting on-disk data
+* config: fix admin socket 'config set' command
+* log: fix in-memory log event gathering
+* debian: remove crush headers, include librados-config
+* rpm: add ceph-disk-{activate, prepare}
+
+For more detailed information, see :download:`the complete changelog <changelog/v0.48.1argonaut.txt>`.
+
+v0.48 "argonaut"
+================
+
+Upgrading
+---------
+
+* This release includes a disk format upgrade.  Each ceph-osd daemon, upon startup, will migrate its locally stored data to the new format.  This process can take a while (for large object counts, even hours), especially on non-btrfs file systems.  
+
+* To keep the cluster available while the upgrade is in progress, we recommend you upgrade a storage node or rack at a time, and wait for the cluster to recover each time.  To prevent the cluster from moving data around in response to the OSD daemons being down for minutes or hours, you may want to::
+
+    ceph osd set noout
+
+  This will prevent the cluster from marking down OSDs as "out" and re-replicating the data elsewhere. If you do this, be sure to clear the flag when the upgrade is complete::
+
+    ceph osd unset noout
+
+* There is a encoding format change internal to the monitor cluster. The monitor daemons are careful to switch to the new format only when all members of the quorum support it.  However, that means that a partial quorum with new code may move to the new format, and a recovering monitor running old code will be unable to join (it will crash).  If this occurs, simply upgrading the remaining monitor will resolve the problem.
+
+* The ceph tool's -s and -w commands from previous versions are incompatible with this version. Upgrade your client tools at the same time you upgrade the monitors if you rely on those commands.
+
+* It is not possible to downgrade from v0.48 to a previous version.
+
+Notable changes
+---------------
+
+* osd: stability improvements
+* osd: capability model simplification
+* osd: simpler/safer --mkfs (no longer removes all files; safe to re-run on active osd)
+* osd: potentially buggy FIEMAP behavior disabled by default
+* rbd: caching improvements
+* rbd: improved instrumentation
+* rbd: bug fixes
+* radosgw: new, scalable usage logging infrastructure
+* radosgw: per-user bucket limits
+* mon: streamlined process for setting up authentication keys
+* mon: stability improvements
+* mon: log message throttling
+* doc: improved documentation (ceph, rbd, radosgw, chef, etc.)
+* config: new default locations for daemon keyrings
+* config: arbitrary variable substitutions
+* improved 'admin socket' daemon admin interface (ceph --admin-daemon ...)
+* chef: support for multiple monitor clusters
+* upstart: basic support for monitors, mds, radosgw; osd support still a work in progress.
+
+The new default keyring locations mean that when enabling authentication (``auth supported = cephx``), keyring locations do not need to be specified if the keyring file is located inside the daemon's data directory (``/var/lib/ceph/$type/ceph-$id`` by default).
+
+There is also a lot of librbd code in this release that is laying the groundwork for the upcoming layering functionality, but is not actually used. Likewise, the upstart support is still incomplete and not recommended; we will backport that functionality later if it turns out to be non-disruptive.
+
+
+
+
diff --git a/doc/releases.rst b/doc/releases.rst
new file mode 100644
index 0000000..9f1d2c0
--- /dev/null
+++ b/doc/releases.rst
@@ -0,0 +1,299 @@
+=============
+Ceph Releases
+=============
+
+Timeline
+--------
+
++----------------------------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                            |`Dumpling`_|`Emperor`_ |`Firefly`_ |`Giant`_   |`Hammer`_  |`Infernalis`_ |
+|                            |LTS        |Stable     |LTS        |Stable     |LTS        |Stable        |
++----------------------------+-----------+-----------+-----------+-----------+-----------+--------------+
+|     First release          | August    | November  | May       | October   | April     | November     |
+|                            | 2013      | 2013      | 2014      | 2014      | 2015      | 2015         |
++----------------------------+-----------+-----------+-----------+-----------+-----------+--------------+
+|  Estimated retirement      | March     |           | January   |           | November  | June 2016    |
+|                            | 2015      |           | 2016      |           | 2016      |              |
++----------------------------+-----------+-----------+-----------+-----------+-----------+--------------+
+|    Actual retirement       | May       | May       | December  | April     |           |              |
+|                            | 2015      | 2014      | 2015      | 2015      |           |              |
++----------------------------+-----------+-----------+-----------+-----------+-----------+--------------+
+
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |Development|`Dumpling`_|`Emperor`_ |`Firefly`_ |`Giant`_   |`Hammer`_  |`Infernalis`_ |
+|                |Testing    |LTS        |Stable     |LTS        |Stable     |LTS        |Stable        |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| April     2016 |`10.1.2`_  |           |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`10.1.1`_  |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| March     2016 |`10.1.0`_  |           |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`10.0.5`_  |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| February  2016 |`10.0.3`_  |           |           |           |           |`0.94.6`_  |`9.2.1`_      |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| January   2016 |`10.0.2`_  |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| December  2015 |`10.0.1`_  |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| November  2015 |`10.0.0`_  |           |           |`0.80.11`_ |           |           |`9.2.0`_      |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| October   2015 |`9.1.0`_   |           |           |           |           |`0.94.5`_  |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |           |           |           |`0.94.4`_  |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| August    2015 |`9.0.3`_   |           |           |           |           |`0.94.3`_  |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| July      2015 |`9.0.2`_   |           |           |`0.80.10`_ |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| June      2015 |`9.0.1`_   |           |           |           |           |`0.94.2`_  |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| May       2015 |`9.0.0`_   |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| April     2015 |           |           |           |           |`0.87.2`_  |`0.94.1`_  |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |           |           |           |`0.94`_    |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| March     2015 |           |           |           |`0.80.9`_  |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| February  2015 |`0.93`_    |           |           |           |`0.87.1`_  |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.92`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| January   2015 |`0.91`_    |           |           |`0.80.8`_  |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| December  2014 |`0.90`_    |           |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.89`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| November  2014 |`0.88`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| October   2014 |`0.86`_    |           |           |`0.80.7`_  |`0.87`_    |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |           |`0.80.6`_  |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| September 2014 |`0.85`_    |`0.67.11`_ |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| August    2014 |`0.84`_    |`0.67.10`_ |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| July      2014 |`0.83`_    |           |           |`0.80.5`_  |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |           |`0.80.4`_  |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |           |`0.80.3`_  |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |           |`0.80.2`_  |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| June      2014 |`0.82`_    |           |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.81`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| May       2014 |           |`0.67.9`_  |           |`0.80.1`_  |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |`0.67.8`_  |           |`0.80`_    |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| April     2014 |`0.79`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| March     2014 |`0.78`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| February  2014 |`0.77`_    |`0.67.7`_  |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |`0.67.6`_  |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| January   2014 |`0.76`_    |           |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.75`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| December  2013 |`0.74`_    |`0.67.5`_  |`0.72.2`_  |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.73`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| November  2013 |           |           |`0.72.1`_  |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |           |`0.72`_    |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| October   2013 |`0.71`_    |`0.67.4`_  |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.70`_    |           |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| September 2013 |`0.69`_    |           |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |`0.68`_    |`0.67.3`_  |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+| August    2013 |           |`0.67.2`_  |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |`0.67.1`_  |           |           |           |           |              |
+|                +-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+|                |           |`0.67`_    |           |           |           |           |              |
++----------------+-----------+-----------+-----------+-----------+-----------+-----------+--------------+
+
+.. _10.1.2: ../release-notes#v10-1-2
+.. _10.1.1: ../release-notes#v10-1-1
+.. _10.1.0: ../release-notes#v10-1-0-jewel-release-candidate
+.. _10.0.5: ../release-notes#v10-0-5
+.. _10.0.3: ../release-notes#v10-0-3
+.. _10.0.2: ../release-notes#v10-0-2
+.. _10.0.1: ../release-notes#v10-0-1
+.. _10.0.0: ../release-notes#v10-0-0
+
+.. _9.2.1: ../release-notes#v9-2-1-infernalis
+.. _9.2.0: ../release-notes#v9-2-0-infernalis
+.. _Infernalis: ../release-notes#v9.2.0-infernalis
+
+.. _9.1.0: ../release-notes#v9-1-0
+.. _9.0.3: ../release-notes#v9-0-3
+.. _9.0.2: ../release-notes#v9-0-2
+.. _9.0.1: ../release-notes#v9-0-1
+.. _9.0.0: ../release-notes#v9-0-0
+
+.. _0.94.6: ../release-notes#v0-94-6-hammer
+.. _0.94.5: ../release-notes#v0-94-5-hammer
+.. _0.94.4: ../release-notes#v0-94-4-hammer
+.. _0.94.3: ../release-notes#v0-94-3-hammer
+.. _0.94.2: ../release-notes#v0-94-2-hammer
+.. _0.94.1: ../release-notes#v0-94-1-hammer
+.. _0.94: ../release-notes#v0-94-hammer
+.. _Hammer: ../release-notes#v0-94-hammer
+
+.. _0.93: ../release-notes#v0-93
+.. _0.92: ../release-notes#v0-92
+.. _0.91: ../release-notes#v0-91
+.. _0.90: ../release-notes#v0-90
+.. _0.89: ../release-notes#v0-89
+.. _0.88: ../release-notes#v0-88
+
+.. _0.87.2: ../release-notes#v0-87-2-giant
+.. _0.87.1: ../release-notes#v0-87-1-giant
+.. _0.87: ../release-notes#v0-87-giant
+.. _Giant: ../release-notes#v0-87-giant
+
+.. _0.86: ../release-notes#v0-86
+.. _0.85: ../release-notes#v0-85
+.. _0.84: ../release-notes#v0-84
+.. _0.83: ../release-notes#v0-83
+.. _0.82: ../release-notes#v0-82
+.. _0.81: ../release-notes#v0-81
+
+.. _0.80.11: ../release-notes#v0-80-11-firefly
+.. _0.80.10: ../release-notes#v0-80-10-firefly
+.. _0.80.9: ../release-notes#v0-80-9-firefly
+.. _0.80.8: ../release-notes#v0-80-8-firefly
+.. _0.80.7: ../release-notes#v0-80-7-firefly
+.. _0.80.6: ../release-notes#v0-80-6-firefly
+.. _0.80.5: ../release-notes#v0-80-5-firefly
+.. _0.80.4: ../release-notes#v0-80-4-firefly
+.. _0.80.3: ../release-notes#v0-80-3-firefly
+.. _0.80.2: ../release-notes#v0-80-2-firefly
+.. _0.80.1: ../release-notes#v0-80-1-firefly
+.. _0.80: ../release-notes#v0-80-firefly
+.. _Firefly: ../release-notes#v0-80-firefly
+
+.. _0.79: ../release-notes#v0-79
+.. _0.78: ../release-notes#v0-78
+.. _0.77: ../release-notes#v0-77
+.. _0.76: ../release-notes#v0-76
+.. _0.75: ../release-notes#v0-75
+.. _0.74: ../release-notes#v0-74
+.. _0.73: ../release-notes#v0-73
+
+.. _0.72.2: ../release-notes#v0-72-2-emperor
+.. _0.72.1: ../release-notes#v0-72-1-emperor
+.. _0.72: ../release-notes#v0-72-emperor
+.. _Emperor: ../release-notes#v0-72-emperor
+
+.. _0.71: ../release-notes#v0-71
+.. _0.70: ../release-notes#v0-70
+.. _0.69: ../release-notes#v0-69
+.. _0.68: ../release-notes#v0-68
+
+.. _0.67.11: ../release-notes#v0-67-11-dumpling
+.. _0.67.10: ../release-notes#v0-67-10-dumpling
+.. _0.67.9: ../release-notes#v0-67-9-dumpling
+.. _0.67.8: ../release-notes#v0-67-8-dumpling
+.. _0.67.7: ../release-notes#v0-67-7-dumpling
+.. _0.67.6: ../release-notes#v0-67-6-dumpling
+.. _0.67.5: ../release-notes#v0-67-5-dumpling
+.. _0.67.4: ../release-notes#v0-67-4-dumpling
+.. _0.67.3: ../release-notes#v0-67-3-dumpling
+.. _0.67.2: ../release-notes#v0-67-2-dumpling
+.. _0.67.1: ../release-notes#v0-67-1-dumpling
+.. _0.67: ../release-notes#v0-67-dumpling
+.. _Dumpling:  ../release-notes#v0-67-dumpling
+
+Understanding the release cycle
+-------------------------------
+
+The development release cycle is two to four weeks long.  Each cycle
+freezes the master development branch and applies `integration and
+upgrade tests <https://github.com/ceph/ceph-qa-suite>`_ for the
+duration of one cycle before it is released and the next release's
+code is frozen for testing.  Once released, there is no effort to
+backport fixes; developer focus in on the next development release
+which is usually only a few weeks away.
+
+There are three to four stable releases a year.  Each stable release
+will receive a name (e.g., 'Jewel') and bug fix backports at least
+until the next stable release is out.
+
+Every other stable releases is a LTS (Long Term Stable) and will
+receive updates until two LTS are published. For instance Dumpling is
+retired when Hammer is published, Firefly is retired when Jewel is
+published etc. The rationale is that backports to a LTS (Firefly for
+instance) are expected to happen until the next LTS is published
+(Jewel is the LTS following Hammer), to fix bugs and possibly
+backport important features. After the next LTS is published,
+backports are still expected to fix bugs with a focus on whatever can
+prevent upgrades to the next LTS (in our example, fixes to Dumpling
+were published after Firefly was released and until Hammer was
+published, primarily to ensure Dumpling cluster can smoothly migrate
+to Firefly).
+
+* Long Term Stable : until the next two LTS are published
+* Stable release : until the next stable release is published
+* Development / testing release : no backports
+
+For each stable release:
+
+* `Integration and upgrade tests
+  <https://github.com/ceph/ceph-qa-suite>`_ are run on a regular basis
+  and `their results <http://pulpito.ceph.com/>`_ analyzed by Ceph
+  developers.
+* `Issues <http://tracker.ceph.com/projects/ceph/issues?query_id=27>`_
+  fixed in the development branch (master) are scheduled to be backported.
+* When an issue found in the stable release is `reported
+  <http://tracker.ceph.com/projects/ceph/issues/new>`_, it is
+  triaged by Ceph developers.
+* The `stable releases and backport team <http://tracker.ceph.com/projects/ceph-releases>`_
+  publishes ``point releases`` including fixes that have been backported to the stable release.
+
+In the timeline, the life time of a LTS is calculated to be
+approximately 18 months after the month of the first release. For
+instance, Dumpling is published August 2013 and 18 months starting
+September 2013 is February 2015, therefore by March 2015 Dumpling
+should be retired. The lifetime of a release may vary because it
+depend on how quickly the stable releases are published. For instance
+although Dumpling theoritical retirement was March 2015, it was
+extended to May 2015.
+
+Release numbers conventions
+---------------------------
+
+The first Ceph release back in Jan of 2008 was 0.1.  That made sense at
+the time.  The versioning scheme did not change until April 2015,
+when 0.94.1 (the first Hammer point release) was published.  To avoid reaching
+0.99 (and 0.100 or 1.00?) we have a new strategy.
+
+* x.0.z - development releases (for early testers and the brave at heart)
+* x.1.z - release candidates (for test clusters, brave users)
+* x.2.z - stable/bugfix releases (for users)
+
+``x`` will start at 9 for Infernalis (``I`` is the 9th letter), making
+our first development release of the 9th release cycle 9.0.0.
+Subsequent development releases will be 9.0.1, 9.0.2, etc.
+
+After a couple months we'll have a 9.1.0 (and maybe 9.1.1) release candidate.
+
+A few weeks after that we'll have the Infernalis release 9.2.0, followed
+by stable bug fix updates 9.2.1, 9.2.2, etc., and then begin work on the
+Jewel (10.y.z) release.
diff --git a/doc/scripts/gen_state_diagram.py b/doc/scripts/gen_state_diagram.py
new file mode 100755
index 0000000..a183082
--- /dev/null
+++ b/doc/scripts/gen_state_diagram.py
@@ -0,0 +1,201 @@
+#!/usr/bin/env python
+import re
+import sys
+
+def do_filter(generator):
+    return acc_lines(remove_multiline_comments(to_char(remove_single_line_comments(generator))))
+
+def acc_lines(generator):
+    current = ""
+    for i in generator:
+        current += i
+        if i == ';' or \
+            i == '{' or \
+            i == '}':
+            yield current.lstrip("\n")
+            current = ""
+
+def to_char(generator):
+    for line in generator:
+        for char in line:
+            if char is not '\n':
+                yield char
+            else:
+                yield ' '
+
+def remove_single_line_comments(generator):
+    for i in generator:
+        if len(i) and i[0] == '#':
+            continue
+        yield re.sub(r'//.*', '', i)
+
+def remove_multiline_comments(generator):
+    saw = ""
+    in_comment = False
+    for char in generator:
+        if in_comment:
+            if saw is "*":
+                if char is "/":
+                    in_comment = False
+                saw = ""
+            if char is "*":
+                saw = "*"
+            continue
+        if saw is "/":
+            if char is '*':
+                in_comment = True
+                saw = ""
+                continue
+            else:
+                yield saw
+                saw = ""
+        if char is '/':
+            saw = "/"
+            continue
+        yield char
+
+class StateMachineRenderer(object):
+    def __init__(self):
+        self.states = {} # state -> parent
+        self.machines = {} # state-> initial
+        self.edges = {} # event -> [(state, state)]
+
+        self.context = [] # [(context, depth_encountered)]
+        self.context_depth = 0
+        self.state_contents = {}
+        self.subgraphnum = 0
+        self.clusterlabel = {}
+
+    def __str__(self):
+        return "-------------------\n\nstates: %s\n\n machines: %s\n\n edges: %s\n\n context %s\n\n state_contents %s\n\n--------------------" % (
+            self.states,
+            self.machines,
+            self.edges,
+            self.context,
+            self.state_contents
+            )
+
+    def read_input(self, input_lines):
+        for line in input_lines:
+            self.get_state(line)
+            self.get_event(line)
+            self.get_context(line)
+
+    def get_context(self, line):
+        match = re.search(r"(\w+::)*::(?P<tag>\w+)::\w+\(const (?P<event>\w+)",
+                          line)
+        if match is not None:
+            self.context.append((match.group('tag'), self.context_depth, match.group('event')))
+        if '{' in line:
+            self.context_depth += 1
+        if '}' in line:
+            self.context_depth -= 1
+            while len(self.context) and self.context[-1][1] == self.context_depth:
+                self.context.pop()
+
+    def get_state(self, line):
+        if "boost::statechart::state_machine" in line:
+            tokens = re.search(
+                r"boost::statechart::state_machine<\s*(\w*),\s*(\w*)\s*>", 
+                line)
+            if tokens is None:
+                raise "Error: malformed state_machine line: " + line
+            self.machines[tokens.group(1)] = tokens.group(2)
+            self.context.append((tokens.group(1), self.context_depth, ""))
+            return
+        if "boost::statechart::state" in line:
+            tokens = re.search(
+                r"boost::statechart::state<\s*(\w*),\s*(\w*)\s*,?\s*(\w*)\s*>",
+                line)
+            if tokens is None:
+                raise "Error: malformed state line: " + line
+            self.states[tokens.group(1)] = tokens.group(2)
+            if tokens.group(2) not in self.state_contents.keys():
+                self.state_contents[tokens.group(2)] = []
+            self.state_contents[tokens.group(2)].append(tokens.group(1))
+            if tokens.group(3) is not "":
+                self.machines[tokens.group(1)] = tokens.group(3)
+            self.context.append((tokens.group(1), self.context_depth, ""))
+            return
+
+    def get_event(self, line):
+        if "boost::statechart::transition" in line:
+            for i in re.finditer(r'boost::statechart::transition<\s*([\w:]*)\s*,\s*(\w*)\s*>',
+                                 line):
+                if i.group(1) not in self.edges.keys():
+                    self.edges[i.group(1)] = []
+                if len(self.context) is 0:
+                    raise "no context at line: " + line
+                self.edges[i.group(1)].append((self.context[-1][0], i.group(2)))
+        i = re.search("return\s+transit<\s*(\w*)\s*>()", line)
+        if i is not None:
+            if len(self.context) is 0:
+                raise "no context at line: " + line
+            if self.context[-1][2] is "":
+                raise "no event in context at line: " + line
+            if self.context[-1][2] not in self.edges.keys():
+                self.edges[self.context[-1][2]] = []
+            self.edges[self.context[-1][2]].append((self.context[-1][0], i.group(1)))
+
+    def emit_dot(self):
+        top_level = []
+        for state in self.machines.keys():
+            if state not in self.states.keys():
+                top_level.append(state)
+        print >> sys.stderr, "Top Level States: ", str(top_level)
+        print """digraph G {"""
+        print '\tsize="7,7"'
+        print """\tcompound=true;"""
+        for i in self.emit_state(top_level[0]):
+            print '\t' + i
+        for i in self.edges.keys():
+            for j in self.emit_event(i):
+                print j
+        print """}"""
+
+    def emit_state(self, state):
+        if state in self.state_contents.keys():
+            self.clusterlabel[state] = "cluster%s" % (str(self.subgraphnum),)
+            yield "subgraph cluster%s {" % (str(self.subgraphnum),)
+            self.subgraphnum += 1
+            yield """\tlabel = "%s";""" % (state,)
+            yield """\tcolor = "blue";"""
+            for j in self.state_contents[state]:
+                for i in self.emit_state(j):
+                    yield "\t"+i
+            yield "}"
+        else:
+            found = False
+            for (k, v) in self.machines.items():
+                if v == state:
+                    yield state+"[shape=Mdiamond];"
+                    found = True
+                    break
+            if not found:
+                yield state+";"
+
+    def emit_event(self, event):
+        def append(app):
+            retval = "["
+            for i in app:
+                retval += (i + ",")
+            retval += "]"
+            return retval
+        for (fro, to) in self.edges[event]:
+            appendix = ['label="%s"' % (event,)]
+            if fro in self.machines.keys():
+                appendix.append("ltail=%s" % (self.clusterlabel[fro],))
+                while fro in self.machines.keys():
+                    fro = self.machines[fro]
+            if to in self.machines.keys():
+                appendix.append("lhead=%s" % (self.clusterlabel[to],))
+                while to in self.machines.keys():
+                    to = self.machines[to]
+            yield("%s -> %s %s;" % (fro, to, append(appendix)))
+
+
+
+INPUT_GENERATOR = do_filter(sys.stdin.xreadlines())
+RENDERER = StateMachineRenderer()
+RENDERER.read_input(INPUT_GENERATOR)
+RENDERER.emit_dot()
diff --git a/doc/start/ceph.conf b/doc/start/ceph.conf
new file mode 100644
index 0000000..e2057ca
--- /dev/null
+++ b/doc/start/ceph.conf
@@ -0,0 +1,41 @@
+[global]
+
+	# For version 0.55 and beyond, you must explicitly enable 
+	# or disable authentication with "auth" entries in [global].
+	
+	auth cluster required = cephx
+	auth service required = cephx
+	auth client required = cephx
+
+[osd]
+	osd journal size = 1000
+	
+	# For ceph-deploy, you can control what type of file system
+	# is created via these options.
+
+	#osd mkfs type = {fs-type}
+	#osd mkfs options {fs-type} = {mkfs options}   # default for xfs is "-f"	
+	#osd mount options {fs-type} = {mount options} # default mount option is "rw,noatime"
+
+	# For example, for xfs, the mount option might look like this:
+	
+	#osd mkfs options xfs = inode64,rw,noatime
+
+	# Execute $ hostname to retrieve the name of your host,
+	# and replace {hostname} with the name of your host.
+	# For the monitor, replace {ip-address} with the IP
+	# address of your host.
+
+[mon.a]
+
+	host = {hostname}
+	mon addr = {ip-address}:6789
+
+[osd.0]
+	host = {hostname}
+	
+[osd.1]
+	host = {hostname}
+
+[mds.a]
+	host = {hostname}
diff --git a/doc/start/documenting-ceph.rst b/doc/start/documenting-ceph.rst
new file mode 100644
index 0000000..2d09db3
--- /dev/null
+++ b/doc/start/documenting-ceph.rst
@@ -0,0 +1,605 @@
+==================
+ Documenting Ceph
+==================
+
+The **easiest way** to help the Ceph project is to contribute to the
+documentation. As the Ceph user base grows and the development pace quickens, an
+increasing number of people are updating the documentation and adding new
+information. Even small contributions like fixing spelling errors or clarifying
+instructions will help the Ceph project immensely.
+
+The Ceph documentation source resides in the ``ceph/doc`` directory of the Ceph
+repository, and Python Sphinx renders the source into HTML and manpages. The
+http://ceph.com/docs link currenly displays the  ``master`` branch by default,
+but you may view documentation for older branches (e.g., ``argonaut``) or future
+branches (e.g., ``next``) as well as work-in-progress branches by substituting
+``master`` with the branch name you prefer.
+
+
+Making Contributions
+====================
+
+Making a documentation contribution generally involves the same procedural
+sequence as making a code contribution, except that you must build documentation
+source instead of compiling program source. The sequence includes the following
+steps:
+
+#. `Get the Source`_
+#. `Select a Branch`_
+#. `Make a Change`_
+#. `Build the Source`_
+#. `Commit the Change`_
+#. `Push the Change`_
+#. `Make a Pull Request`_
+#. `Notify the Relevant Person`_
+
+Get the Source
+--------------
+
+Ceph documentation lives in the Ceph repository right alongside the Ceph source
+code under the ``ceph/doc`` directory. For details on github and Ceph,
+see :ref:`Get Involved`.
+
+The most common way to make contributions is to use the `Fork and Pull`_
+approach. You must:
+
+#. Install git locally. For Debian/Ubuntu, execute::
+
+	sudo apt-get install git
+
+   For Fedora, execute::
+
+	sudo yum install git
+
+   For CentOS/RHEL, execute::
+
+	sudo yum install git
+
+#. Ensure your ``.gitconfig`` file has your name and email address. ::
+
+	[user]
+	   email = {your-email-address}
+	   name = {your-name}
+
+   For example::
+
+	git config --global user.name "John Doe"
+	git config --global user.email johndoe at example.com
+
+
+#. Create a  `github`_ account (if you don't have one).
+
+#. Fork the Ceph project. See https://github.com/ceph/ceph.
+
+#. Clone your fork of the Ceph project to your local host.
+
+
+Ceph organizes documentation into an information architecture primarily by its
+main components.
+
+- **Ceph Storage Cluster:** The Ceph Storage Cluster documentation resides
+  under the ``doc/rados`` directory.
+  
+- **Ceph Block Device:** The Ceph Block Device documentation resides under
+  the ``doc/rbd`` directory.
+  
+- **Ceph Object Storage:** The Ceph Object Storage documentation resides under
+  the ``doc/radosgw`` directory.
+
+- **Ceph Filesystem:** The Ceph Filesystem documentation resides under the 
+  ``doc/cephfs`` directory.
+  
+- **Installation (Quick):** Quick start documentation resides under the
+  ``doc/start`` directory.
+  
+- **Installation (Manual):** Manual installation documentation resides under
+  the ``doc/install`` directory.
+  
+- **Manpage:** Manpage source resides under the ``doc/man`` directory.
+
+- **Developer:** Developer documentation resides under the ``doc/dev`` 
+  directory.
+
+- **Images:** If you include images such as JPEG or PNG files, you should 
+  store them under the ``doc/images`` directory.
+
+
+Select a Branch
+---------------
+
+When you make small changes to the documentation, such as fixing typographical
+errors or clarifying explanations, use the ``master`` branch (default). You
+should also use the ``master`` branch when making contributions to features that
+are in the current release. ``master`` is the most commonly used branch. ::
+
+	git checkout master
+
+When you make changes to documentation that affect an upcoming release, use 
+the ``next`` branch. ``next`` is the second most commonly used branch. ::
+
+	git checkout next
+
+When you are making substantial contributions such as new features that are not
+yet in the current release; if your contribution is related to an issue with a
+tracker ID; or, if you want to see your documentation rendered on the Ceph.com
+website before it gets merged into the ``master`` branch, you should create a
+branch. To distinguish branches that include only documentation updates, we
+prepend them with ``wip-doc`` by convention, following the form
+``wip-doc-{your-branch-name}``. If the branch relates to an issue filed in
+http://tracker.ceph.com/issues, the branch name incorporates the issue number.
+For example, if a documentation branch is a fix for issue #4000, the branch name
+should be ``wip-doc-4000`` by convention and the relevant tracker URL will be
+http://tracker.ceph.com/issues/4000.
+
+.. note:: Please do not mingle documentation contributions and source code
+   contributions in a single pull request. Editors review the documentation
+   and engineers review source code changes. When you keep documentation 
+   pull requests separate from source code pull requests, it simplifies the 
+   process and we won't have to ask you to resubmit the requests separately.
+
+Before you create your branch name, ensure that it doesn't already exist in the
+local or remote repository. ::
+
+	git branch -a | grep wip-doc-{your-branch-name}
+
+If it doesn't exist, create your branch::
+
+	git checkout -b wip-doc-{your-branch-name}
+
+
+Make a Change
+-------------
+
+Modifying a document involves opening a restructuredText file, changing
+its contents, and saving the changes. See `Documentation Style Guide`_ for
+details on syntax requirements.
+
+Adding a document involves creating a new restructuredText file under the
+``doc`` directory or its subdirectories and saving the file with a ``*.rst``
+file extension. You must also include a reference to the  document: a hyperlink
+or a table of contents entry. The ``index.rst`` file of a top-level directory
+usually contains a TOC, where you can add the new file name. All documents must
+have a title. See `Headings`_ for details.
+
+Your new document doesn't get tracked by ``git`` automatically. When you want 
+to add the document to the repository,  you must use ``git add 
+{path-to-filename}``. For example, from the top level  directory of the
+repository, adding an ``example.rst`` file to the ``rados`` subdirectory would
+look like this::
+
+	git add doc/rados/example.rst
+
+Deleting a document involves removing it from the repository with ``git rm
+{path-to-filename}``. For example:: 
+
+	git rm doc/rados/example.rst
+
+You must also remove any reference to a deleted document from other documents.
+
+
+Build the Source
+----------------
+
+To build the documentation, navigate to the ``ceph`` repository directory::
+
+	cd ceph
+
+To build the documentation on Debian/Ubuntu, execute::
+
+	admin/build-doc
+
+To build the documentation on Fedora, execute::
+
+	admin/build-doc
+
+To build the documentation on CentOS/RHEL, execute::
+
+	admin/build-doc
+
+Executing ``admin/build-doc`` will create a ``build-doc`` directory under ``ceph``.
+You may need to create a directory under ``ceph/build-doc`` for output of Javadoc
+files. ::
+
+	mkdir -p output/html/api/libcephfs-java/javadoc
+
+The build script ``build-doc`` will produce an output of errors and warnings.
+You MUST fix errors in documents you modified before committing a change, and you
+SHOULD fix warnings that are related to syntax you modified.
+
+.. important:: You must validate ALL HYPERLINKS. If a hyperlink is broken,
+   it automatically breaks the build!
+
+Once you build the documentation set, you may navigate to the source directory
+to view it::
+
+	cd build-doc/output
+
+There should be an ``html`` directory and a ``man`` directory containing
+documentation in HTML and manpage formats respectively.
+
+Build the Source (First Time)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Ceph uses Python Sphinx, which is generally distribution agnostic. The first
+time you build Ceph documentation, it will generate a doxygen XML tree, which
+is a bit time consuming.
+
+Python Sphinx does have some dependencies that vary across distributions. The
+first time you build the documentation, the script will notify you if you do not
+have the dependencies installed. To run Sphinx and build documentation successfully,
+the following packages are required:
+
+.. raw:: html
+
+	<style type="text/css">div.body h3{margin:5px 0px 0px 0px;}</style>
+	<table cellpadding="10"><colgroup><col width="30%"><col width="30%"><col width="30%"></colgroup><tbody valign="top"><tr><td><h3>Debian/Ubuntu</h3>
+
+- gcc
+- python-dev
+- python-pip
+- python-virtualenv
+- python-sphinx
+- libxml2-dev
+- libxslt1-dev
+- doxygen
+- graphviz
+- ant
+- ditaa
+
+.. raw:: html
+
+	</td><td><h3>Fedora</h3>
+
+- gcc
+- python-devel
+- python-pip
+- python-virtualenv
+- python-docutils
+- python-jinja2
+- python-pygments
+- python-sphinx
+- libxml2-devel
+- libxslt1-devel
+- doxygen
+- graphviz
+- ant
+- ditaa
+
+.. raw:: html
+
+	</td><td><h3>CentOS/RHEL</h3>
+
+- gcc
+- python-devel
+- python-pip
+- python-virtualenv
+- python-docutils
+- python-jinja2
+- python-pygments
+- python-sphinx
+- libxml2-dev
+- libxslt1-dev
+- doxygen
+- graphviz
+- ant
+
+.. raw:: html
+
+	</td></tr></tbody></table>
+
+
+Install each dependency that isn't installed on your host. For Debian/Ubuntu
+distributions, execute the following::
+
+	sudo apt-get install gcc python-dev python-pip python-virtualenv libxml2-dev libxslt-dev doxygen graphviz ant ditaa
+	sudo apt-get install python-sphinx
+
+For Fedora distributions, execute the following::
+
+   sudo yum install gcc python-devel python-pip python-virtualenv libxml2-devel libxslt-devel doxygen graphviz ant
+   sudo pip install html2text
+   sudo yum install python-jinja2 python-pygments python-docutils python-sphinx
+   sudo yum install jericho-html ditaa
+
+For CentOS/RHEL distributions, it is recommended to have ``epel`` (Extra
+Packages for Enterprise Linux) repository as it provides some extra packages
+which are not available in the default repository. To install ``epel``, execute
+the following::
+
+	wget http://ftp.riken.jp/Linux/fedora/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
+	sudo yum install epel-release-7-2.noarch.rpm
+
+For CentOS/RHEL distributions, execute the following::
+
+	sudo yum install gcc python-devel python-pip python-virtualenv libxml2-devel libxslt-devel doxygen graphviz ant
+	sudo pip install html2text
+
+For CentOS/RHEL distributions, the remaining python packages are not available in
+the default and ``epel`` repositories. So, use http://rpmfind.net/ to find the
+packages. Then, download them from a mirror and install them. For example::
+
+	wget ftp://rpmfind.net/linux/centos/7.0.1406/os/x86_64/Packages/python-jinja2-2.7.2-2.el7.noarch.rpm
+	sudo yum install python-jinja2-2.7.2-2.el7.noarch.rpm
+	wget ftp://rpmfind.net/linux/centos/7.0.1406/os/x86_64/Packages/python-pygments-1.4-9.el7.noarch.rpm
+	sudo yum install python-pygments-1.4-9.el7.noarch.rpm
+	wget ftp://rpmfind.net/linux/centos/7.0.1406/os/x86_64/Packages/python-docutils-0.11-0.2.20130715svn7687.el7.noarch.rpm
+	sudo yum install python-docutils-0.11-0.2.20130715svn7687.el7.noarch.rpm
+	wget ftp://rpmfind.net/linux/centos/7.0.1406/os/x86_64/Packages/python-sphinx-1.1.3-8.el7.noarch.rpm
+	sudo yum install python-sphinx-1.1.3-8.el7.noarch.rpm
+
+Ceph documentation makes extensive use of `ditaa`_, which isn't presently built
+for CentOS/RHEL7. You must install ``ditaa`` if you are making changes to
+``ditaa`` diagrams so that you can verify that they render properly before you
+commit new or modified ``ditaa`` diagrams. You may retrieve compatible required
+packages for CentOS/RHEL distributions and install them manually. To run ``ditaa``
+on CentOS/RHEL7, following dependencies are required:
+
+- jericho-html
+- jai-imageio-core
+- batik
+
+Use http://rpmfind.net/ to find compatible ``ditaa`` and the dependencies.
+Then, download them from a mirror and install them. For example::
+
+	wget ftp://rpmfind.net/linux/fedora/linux/releases/20/Everything/x86_64/os/Packages/j/jericho-html-3.2-6.fc20.noarch.rpm
+	sudo yum install jericho-html-3.2-6.fc20.noarch.rpm
+	wget ftp://rpmfind.net/linux/centos/7.0.1406/os/x86_64/Packages/jai-imageio-core-1.2-0.14.20100217cvs.el7.noarch.rpm
+	sudo yum install jai-imageio-core-1.2-0.14.20100217cvs.el7.noarch.rpm
+	wget ftp://rpmfind.net/linux/centos/7.0.1406/os/x86_64/Packages/batik-1.8-0.12.svn1230816.el7.noarch.rpm
+	sudo yum install batik-1.8-0.12.svn1230816.el7.noarch.rpm
+	wget ftp://rpmfind.net/linux/fedora/linux/releases/20/Everything/x86_64/os/Packages/d/ditaa-0.9-10.r74.fc20.noarch.rpm
+	sudo yum install ditaa-0.9-10.r74.fc20.noarch.rpm
+
+.. important:: Do not install the ``fc21`` rpm for ``ditaa`` as it uses a ``JRE``
+	newer than the default installed in CentOS/RHEL7 which causes a conflict, throws
+	an ``Exception`` and doesn't allow the application to run.
+
+Once you have installed all these packages, build the documentation by following
+the steps given in ``Build the Source``.
+
+Commit the Change
+-----------------
+
+Ceph documentation commits are simple, but follow a strict convention:
+
+- A commit SHOULD have 1 file per commit (it simplifies rollback). You MAY
+  commit multiple files with related changes. Unrelated changes SHOULD NOT
+  be put into the same commit.
+- A commit MUST have a comment.
+- A commit comment MUST be prepended with ``doc:``. (strict)
+- The comment summary MUST be one line only. (strict)
+- Additional comments MAY follow a blank line after the summary, 
+  but should be terse.
+- A commit MAY include ``Fixes: #{bug number}``.
+- Commits MUST include ``Signed-off-by: Firstname Lastname <email>``. (strict)
+
+.. tip:: Follow the foregoing convention particularly where it says 
+   ``(strict)`` or you will be asked to modify your commit to comply with 
+   this convention.
+
+The following is a common commit comment (preferred):: 
+
+	doc: Fixes a spelling error and a broken hyperlink.
+	
+	Signed-off-by: John Doe <john.doe at gmail.com>
+
+
+The following comment includes a reference to a bug. :: 
+
+	doc: Fixes a spelling error and a broken hyperlink.
+
+	Fixes: #1234
+	
+	Signed-off-by: John Doe <john.doe at gmail.com>
+
+
+The following comment includes a terse sentence following the comment summary.
+There is a carriage return between the summary line and the description:: 
+
+	doc: Added mon setting to monitor config reference
+	
+	Describes 'mon setting', which is a new setting added
+	to config_opts.h.
+	
+	Signed-off-by: John Doe <john.doe at gmail.com>
+
+
+To commit changes, execute the following:: 
+
+	git commit -a
+	
+
+An easy way to manage your documentation commits is to use visual tools for
+``git``. For example, ``gitk`` provides a graphical interface for viewing the
+repository history, and ``git-gui`` provides a graphical interface for viewing
+your uncommitted changes, staging them for commit, committing the changes and
+pushing them to your forked Ceph repository.
+
+
+For Debian/Ubuntu, execute::
+
+	sudo apt-get install gitk git-gui
+
+For Fedora/CentOS/RHEL, execute::
+
+	sudo yum install gitk git-gui
+
+Then, execute::
+
+	cd {git-ceph-repo-path}
+	gitk
+	
+Finally, select **File->Start git gui** to activate the graphical user interface.
+
+
+Push the Change
+---------------
+
+Once you have one or more commits, you must push them from the local copy of the
+repository to ``github``. A graphical tool like ``git-gui`` provides a user
+interface for pushing to the repository. If you created a branch previously::
+
+	git push origin wip-doc-{your-branch-name}
+
+Otherwise::
+
+	git push
+
+
+Make a Pull Request
+-------------------
+
+As noted earlier, you can make documentation contributions using the `Fork and
+Pull`_ approach.
+
+
+
+Notify the Relevant Person
+--------------------------
+
+After you make a pull request, notify the relevant person. For general
+documentation pull requests, notify `John Wilkins`_.
+
+
+
+Documentation Style Guide
+=========================
+
+One objective of the Ceph documentation project is to ensure the readability of
+the documentation in both native restructuredText format and its rendered
+formats such as HTML. Navigate to your Ceph repository and view a document in
+its native format. You may notice that it is generally as legible in a terminal
+as it is in its rendered HTML format. Additionally, you may also notice that
+diagrams in ``ditaa`` format also render reasonably well in text mode. ::
+
+	cat doc/architecture.rst | less
+
+Review the following style guides to maintain this consistency.
+
+
+Headings
+--------
+
+#. **Document Titles:** Document titles use the ``=`` character overline and 
+   underline with a leading and trailing space on the title text line. 
+   See `Document Title`_ for details.
+
+#. **Section Titles:** Section tiles use the ``=`` character underline with no
+   leading or trailing spaces for text. Two carriage returns should precede a 
+   section title (unless an inline reference precedes it). See `Sections`_ for
+   details.
+
+#. **Subsection Titles:** Subsection titles use the ``_`` character underline 
+   with no leading or trailing spaces for text.  Two carriage returns should 
+   precede a subsection title (unless an inline reference precedes it).
+
+
+Text Body
+---------
+
+As a general rule, we prefer text to wrap at column 80 so that it is legible in
+a command line interface without leading or trailing white space. Where
+possible, we prefer to maintain this convention with text, lists, literal text
+(exceptions allowed), tables, and ``ditaa`` graphics.
+
+#. **Paragraphs**: Paragraphs have a leading and a trailing carriage return, 
+   and should be 80 characters wide or less so that the documentation can be 
+   read in native format in a command line terminal.
+
+#. **Literal Text:** To create an example of literal text (e.g., command line
+   usage), terminate the preceding paragraph with ``::`` or enter a carriage
+   return to create an empty line after the preceding paragraph; then, enter
+   ``::`` on a separate line followed by another empty line. Then, begin the
+   literal text with tab indentation (preferred) or space indentation of 3 
+   characters.
+
+#. **Indented Text:** Indented text such as bullet points 
+   (e.g., ``- some text``) may span multiple lines. The text of subsequent
+   lines should begin at the same character position as the text of the
+   indented text (less numbers, bullets, etc.).
+
+   Indented text may include literal text examples. Whereas, text indentation
+   should be done with spaces, literal text examples should be indented with
+   tabs. This convention enables you to add an additional indented paragraph
+   following a literal example by leaving a blank line and beginning the
+   subsequent paragraph with space indentation.
+
+#. **Numbered Lists:** Numbered lists should use autonumbering by starting
+   a numbered indent with ``#.`` instead of the actual number so that
+   numbered paragraphs can be repositioned without requiring manual 
+   renumbering.
+
+#. **Code Examples:** Ceph supports the use of the 
+   ``.. code-block::<language>`` role, so that you can add highlighting to 
+   source examples. This is preferred for source code. However, use of this 
+   tag will cause autonumbering to restart at 1 if it is used as an example 
+   within a numbered list. See `Showing code examples`_ for details.
+
+
+Paragraph Level Markup
+----------------------
+
+The Ceph project uses `paragraph level markup`_ to highlight points.
+
+#. **Tip:** Use the ``.. tip::`` directive to provide additional information
+   that assists the reader or steers the reader away from trouble.
+
+#. **Note**: Use the ``.. note::`` directive to highlight an important point.
+
+#. **Important:** Use the ``.. important::`` directive to highlight important
+   requirements or caveats (e.g., anything that could lead to data loss). Use
+   this directive sparingly, because it renders in red.
+
+#. **Version Added:** Use the ``.. versionadded::`` directive for new features
+   or configuration settings so that users know the minimum release for using
+   a feature.
+   
+#. **Version Changed:** Use the ``.. versionchanged::`` directive for changes
+   in usage or configuration settings.
+
+#. **Deprecated:** Use the ``.. deprecated::`` directive when CLI usage, 
+   a feature or a configuration setting is no longer preferred or will be 
+   discontinued.
+
+#. **Topic:** Use the ``.. topic::`` directive to encapsulate text that is
+   outside the main flow of the document. See the `topic directive`_ for
+   additional details.
+
+
+TOC and Hyperlinks
+------------------
+
+All documents must be linked from another document or a table of contents,
+otherwise you will receive a warning when building the documentation.
+
+The Ceph project uses the ``.. toctree::`` directive. See `The TOC tree`_
+for details. When rendering a TOC, consider specifying the ``:maxdepth:`` 
+parameter so the rendered TOC is reasonably terse.
+
+Document authors should prefer to use the ``:ref:`` syntax where a link target
+contains a specific unique identifier (e.g., ``.. _unique-target-id:``), and  a
+reference to the target specifically references the target  (e.g.,
+``:ref:`unique-target-id```) so that if source files are moved or the
+information architecture changes, the links will still work. See
+`Cross referencing arbitrary locations`_ for details.
+
+Ceph documentation also uses the backtick (accent grave) character followed by
+the link text, another backtick and an underscore. Sphinx allows you to
+incorporate the link destination inline; however, we prefer to use the use the
+``.. _Link Text: ../path`` convention at the bottom of the document, because it
+improves the readability of the document in a command line interface.
+
+
+.. _Python Sphinx: http://sphinx-doc.org
+.. _resturcturedText: http://docutils.sourceforge.net/rst.html
+.. _Fork and Pull: https://help.github.com/articles/using-pull-requests
+.. _github: http://github.com
+.. _ditaa: http://ditaa.sourceforge.net/
+.. _Document Title: http://docutils.sourceforge.net/docs/user/rst/quickstart.html#document-title-subtitle
+.. _Sections: http://docutils.sourceforge.net/docs/user/rst/quickstart.html#sections
+.. _Cross referencing arbitrary locations: http://sphinx-doc.org/markup/inline.html#ref-role
+.. _The TOC tree: http://sphinx-doc.org/markup/toctree.html
+.. _Showing code examples: http://sphinx-doc.org/markup/code.html
+.. _paragraph level markup: http://sphinx-doc.org/markup/para.html
+.. _topic directive: http://docutils.sourceforge.net/docs/ref/rst/directives.html#topic
+.. _John Wilkins: mailto:jowilkin at redhat.com
diff --git a/doc/start/get-involved.rst b/doc/start/get-involved.rst
new file mode 100644
index 0000000..cfe3f4d
--- /dev/null
+++ b/doc/start/get-involved.rst
@@ -0,0 +1,91 @@
+.. _Get Involved:
+
+=====================================
+ Get Involved in the Ceph Community!
+=====================================
+
+These are exciting times in the Ceph community! Get involved!
+
++----------------------+-------------------------------------------------+-----------------------------------------------+
+|Channel               | Description                                     | Contact Info                                  |
++======================+=================================================+===============================================+
+| **Blog**             | Check the Ceph Blog_ periodically to keep track | http://ceph.com/community/blog/               |
+|                      | of Ceph progress and important announcements.   |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Planet Ceph**      | Check the blog aggregation on Planet Ceph for   | http://ceph.com/community/planet-ceph/        |
+|                      | interesting stories, information and            |                                               |
+|                      | experiences from the community.                 |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Wiki**             | Check the Ceph Wiki is a source for more        | https://wiki.ceph.com/                        |
+|                      | community and development related topics. You   |                                               |
+|                      | can find there information about blueprints,    |                                               |
+|                      | meetups, the Ceph Developer Summits and more.   |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **IRC**              | As you delve into Ceph, you may have questions  |                                               |
+|                      | or feedback for the Ceph development team. Ceph | - **Domain:** ``irc.oftc.net``                |
+|                      | developers are often available on the ``#ceph`` | - **Channels:** ``#ceph`` and ``#ceph-devel`` |
+|                      | IRC channel particularly during daytime hours   |                                               |
+|                      | in the US Pacific Standard Time zone.           |                                               |
+|                      | While ``#ceph`` is a good starting point for    |                                               |
+|                      | cluster operators and users, there is also      |                                               |
+|                      | ``#ceph-devel`` dedicated for Ceph developers.  |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **User List**        | Ask and answer user-related questions by        |                                               |
+|                      | subscribing to the email list at                | - `User Subscribe`_                           |
+|                      | ceph-users at ceph.com. You can opt out of         | - `User Unsubscribe`_                         |
+|                      | the email list at any time by unsubscribing.    | - `Gmane for Users`_                          |
+|                      | A simple email is all it takes! If you would    |                                               |
+|                      | like to view the archives, go to Gmane.         |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Devel List**       | Keep in touch with developer activity by        |                                               |
+|                      | subscribing to the email list at                | - `Devel Subscribe`_                          |
+|                      | ceph-devel at vger.kernel.org. You can opt out of  | - `Devel Unsubscribe`_                        |
+|                      | the email list at any time by unsubscribing.    | - `Gmane for Developers`_                     |
+|                      | A simple email is all it takes! If you would    |                                               |
+|                      | like to view the archives, go to Gmane.         |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Commit List**      | Subscribe to ceph-commit at ceph.com to get        |                                               |
+|                      | commit notifications via email. You can opt out | - `Commit Subscribe`_                         |
+|                      | of the email list at any time by unsubscribing. | - `Commit Unsubscribe`_                       |
+|                      | A simple email is all it takes!                 | - `Mailing list archives`_                    |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **QA List**          | For Quality Assurance (QA) related activities   |                                               |
+|                      | subscribe to this list. You can opt out         | - `QA Subscribe`_                             |
+|                      | of the email list at any time by unsubscribing. | - `QA Unsubscribe`_                           |
+|                      | A simple email is all it takes!                 | - `Mailing list archives`_                    |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Community List**   | For all discussions related to the Ceph User    |                                               |
+|                      | Committee and other community topics. You can   | - `Community Subscribe`_                      |
+|                      | opt out of the email list at any time by        | - `Community Unsubscribe`_                    |
+|                      | unsubscribing. A simple email is all it takes!  | - `Mailing list archives`_                    |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Bug Tracker**      | You can help keep Ceph production worthy by     | http://tracker.ceph.com/projects/ceph         |
+|                      | filing and tracking bugs, and providing feature |                                               |
+|                      | requests using the Bug Tracker_.                |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+| **Source Code**      | If you would like to participate in             |                                               |
+|                      | development, bug fixing, or if you just want    | - http://github.com/ceph/ceph                 |
+|                      | the very latest code for Ceph, you can get it   | - http://ceph.com/download                    |
+|                      | at http://github.com. See `Ceph Source Code`_   |                                               |
+|                      | for details on cloning from github.             |                                               |
++----------------------+-------------------------------------------------+-----------------------------------------------+
+
+
+
+.. _Devel Subscribe: mailto:majordomo at vger.kernel.org?body=subscribe+ceph-devel
+.. _Devel Unsubscribe: mailto:majordomo at vger.kernel.org?body=unsubscribe+ceph-devel
+.. _User Subscribe: mailto:ceph-users-join at lists.ceph.com
+.. _User Unsubscribe: mailto:ceph-users-leave at lists.ceph.com
+.. _Community Subscribe: mailto:ceph-community-join at lists.ceph.com
+.. _Community Unsubscribe: mailto:ceph-community-leave at lists.ceph.com
+.. _Commit Subscribe: mailto:ceph-commit-join at lists.ceph.com
+.. _Commit Unsubscribe: mailto:ceph-commit-leave at lists.ceph.com
+.. _QA Subscribe: mailto:ceph-qa-join at lists.ceph.com
+.. _QA Unsubscribe: mailto:ceph-qa-leave at lists.ceph.com
+.. _Gmane for Developers: http://news.gmane.org/gmane.comp.file-systems.ceph.devel
+.. _Gmane for Users: http://news.gmane.org/gmane.comp.file-systems.ceph.user
+.. _Mailing list archives: http://lists.ceph.com/
+.. _Blog: http://ceph.com/community/blog/
+.. _Tracker: http://tracker.ceph.com/
+.. _Ceph Source Code: http://github.com/ceph/ceph
+
diff --git a/doc/start/hardware-recommendations.rst b/doc/start/hardware-recommendations.rst
new file mode 100644
index 0000000..7772020
--- /dev/null
+++ b/doc/start/hardware-recommendations.rst
@@ -0,0 +1,357 @@
+==========================
+ Hardware Recommendations
+==========================
+
+Ceph was designed to run on commodity hardware, which makes building and
+maintaining petabyte-scale data clusters economically feasible. 
+When planning out your cluster hardware, you will need to balance a number 
+of considerations, including failure domains and potential performance
+issues. Hardware planning should include distributing Ceph daemons and 
+other processes that use Ceph across many hosts. Generally, we recommend 
+running Ceph daemons of a specific type on a host configured for that type 
+of daemon. We recommend using other hosts for processes that utilize your 
+data cluster (e.g., OpenStack, CloudStack, etc).
+
+
+.. tip:: Check out the Ceph blog too. Articles like `Ceph Write Throughput 1`_,
+   `Ceph Write Throughput 2`_, `Argonaut v. Bobtail Performance Preview`_, 
+   `Bobtail Performance - I/O Scheduler Comparison`_ and others are an
+   excellent source of information. 
+
+
+CPU
+===
+
+Ceph metadata servers dynamically redistribute their load, which is CPU
+intensive. So your metadata servers should have significant processing power
+(e.g., quad core or better CPUs). Ceph OSDs run the :term:`RADOS` service, calculate
+data placement with :term:`CRUSH`, replicate data, and maintain their own copy of the
+cluster map. Therefore, OSDs should have a reasonable amount of processing power
+(e.g., dual core processors). Monitors simply maintain a master copy of the
+cluster map, so they are not CPU intensive. You must also consider whether the
+host machine will run CPU-intensive processes in addition to Ceph daemons. For
+example, if your hosts will run computing VMs (e.g., OpenStack Nova), you will
+need to ensure that these other processes leave sufficient processing power for
+Ceph daemons. We recommend running additional CPU-intensive processes on
+separate hosts.
+
+
+RAM
+===
+
+Metadata servers and monitors must be capable of serving their data quickly, so
+they should have plenty of RAM (e.g., 1GB of RAM per daemon instance). OSDs do
+not require as much RAM for regular operations (e.g., 500MB of RAM per daemon
+instance); however, during recovery they need significantly more RAM (e.g., ~1GB
+per 1TB of storage per daemon). Generally, more RAM is better.
+
+
+Data Storage
+============
+
+Plan your data storage configuration carefully. There are significant cost and
+performance tradeoffs to consider when planning for data storage. Simultaneous
+OS operations, and simultaneous request for read and write operations from
+multiple daemons against a single drive can slow performance considerably. There
+are also file system limitations to consider: btrfs is not quite stable enough
+for production, but it has the ability to journal and write data simultaneously,
+whereas XFS does not.
+
+.. important:: Since Ceph has to write all data to the journal before it can 
+   send an ACK (for XFS at least), having the journal and OSD 
+   performance in balance is really important!
+
+
+Hard Disk Drives
+----------------
+
+OSDs should have plenty of hard disk drive space for object data. We recommend a
+minimum hard disk drive size of 1 terabyte. Consider the cost-per-gigabyte
+advantage of larger disks. We recommend dividing the price of the hard disk
+drive by the number of gigabytes to arrive at a cost per gigabyte, because
+larger drives may have a significant impact on the cost-per-gigabyte. For
+example, a 1 terabyte hard disk priced at $75.00 has a cost of $0.07 per
+gigabyte (i.e., $75 / 1024 = 0.0732). By contrast, a 3 terabyte hard disk priced
+at $150.00 has a cost of $0.05 per gigabyte (i.e., $150 / 3072 = 0.0488). In the
+foregoing example, using the 1 terabyte disks would generally increase the cost
+per gigabyte by 40%--rendering your cluster substantially less cost efficient.
+Also, the larger the storage drive capacity, the more memory per Ceph OSD Daemon
+you will need, especially during rebalancing, backfilling and recovery. A 
+general rule of thumb is ~1GB of RAM for 1TB of storage space. 
+
+.. tip:: Running multiple OSDs on a single disk--irrespective of partitions--is 
+   **NOT** a good idea.
+
+.. tip:: Running an OSD and a monitor or a metadata server on a single 
+   disk--irrespective of partitions--is **NOT** a good idea either.
+
+Storage drives are subject to limitations on seek time, access time, read and
+write times, as well as total throughput. These physical limitations affect
+overall system performance--especially during recovery. We recommend using a
+dedicated drive for the operating system and software, and one drive for each
+Ceph OSD Daemon you run on the host. Most "slow OSD" issues arise due to running
+an operating system, multiple OSDs, and/or multiple journals on the same drive.
+Since the cost of troubleshooting performance issues on a small cluster likely
+exceeds the cost of the extra disk drives, you can accelerate your cluster
+design planning by avoiding the temptation to overtax the OSD storage drives.
+
+You may run multiple Ceph OSD Daemons per hard disk drive, but this will likely
+lead to resource contention and diminish the overall throughput. You may store a
+journal and object data on the same drive, but this may increase the time it
+takes to journal a write and ACK to the client. Ceph must write to the journal
+before it can ACK the write. The btrfs filesystem can write journal data and
+object data simultaneously, whereas XFS cannot.
+
+Ceph best practices dictate that you should run operating systems, OSD data and
+OSD journals on separate drives.
+
+
+Solid State Drives
+------------------
+
+One opportunity for performance improvement is to use solid-state drives (SSDs)
+to reduce random access time and read latency while accelerating throughput.
+SSDs often cost more than 10x as much per gigabyte when compared to a hard disk
+drive, but SSDs often exhibit access times that are at least 100x faster than a
+hard disk drive.
+
+SSDs do not have moving mechanical parts so they aren't necessarily subject to
+the same types of limitations as hard disk drives. SSDs do have significant
+limitations though. When evaluating SSDs, it is important to consider the
+performance of sequential reads and writes. An SSD that has 400MB/s sequential
+write throughput may have much better performance than an SSD with 120MB/s of
+sequential write throughput when storing multiple journals for multiple OSDs.
+
+.. important:: We recommend exploring the use of SSDs to improve performance. 
+   However, before making a significant investment in SSDs, we **strongly
+   recommend** both reviewing the performance metrics of an SSD and testing the
+   SSD in a test configuration to gauge performance. 
+
+Since SSDs have no moving mechanical parts, it makes sense to use them in the
+areas of Ceph that do not use a lot of storage space (e.g., journals).
+Relatively inexpensive SSDs may appeal to your sense of economy. Use caution.
+Acceptable IOPS are not enough when selecting an SSD for use with Ceph. There
+are a few important performance considerations for journals and SSDs:
+
+- **Write-intensive semantics:** Journaling involves write-intensive semantics, 
+  so you should ensure that the SSD you choose to deploy will perform equal to
+  or better than a hard disk drive when writing data. Inexpensive SSDs may 
+  introduce write latency even as they accelerate access time, because 
+  sometimes high performance hard drives can write as fast or faster than 
+  some of the more economical SSDs available on the market!
+  
+- **Sequential Writes:** When you store multiple journals on an SSD you must 
+  consider the sequential write limitations of the SSD too, since they may be 
+  handling requests to write to multiple OSD journals simultaneously.
+
+- **Partition Alignment:** A common problem with SSD performance is that 
+  people like to partition drives as a best practice, but they often overlook
+  proper partition alignment with SSDs, which can cause SSDs to transfer data 
+  much more slowly. Ensure that SSD partitions are properly aligned.
+
+While SSDs are cost prohibitive for object storage, OSDs may see a significant
+performance improvement by storing an OSD's journal on an SSD and the OSD's
+object data on a separate hard disk drive. The ``osd journal`` configuration
+setting defaults to ``/var/lib/ceph/osd/$cluster-$id/journal``. You can mount
+this path to an SSD or to an SSD partition so that it is not merely a file on
+the same disk as the object data.
+
+One way Ceph accelerates CephFS filesystem performance is to segregate the
+storage of CephFS metadata from the storage of the CephFS file contents. Ceph
+provides a default ``metadata`` pool for CephFS metadata. You will never have to
+create a pool for CephFS metadata, but you can create a CRUSH map hierarchy for
+your CephFS metadata pool that points only to a host's SSD storage media. See
+`Mapping Pools to Different Types of OSDs`_ for details.
+
+
+Controllers
+-----------
+
+Disk controllers also have a significant impact on write throughput. Carefully,
+consider your selection of disk controllers to ensure that they do not create
+a performance bottleneck.
+
+.. tip:: The Ceph blog is often an excellent source of information on Ceph
+   performance issues. See `Ceph Write Throughput 1`_ and `Ceph Write 
+   Throughput 2`_ for additional details.
+
+
+Additional Considerations
+-------------------------
+
+You may run multiple OSDs per host, but you should ensure that the sum of the
+total throughput of your OSD hard disks doesn't exceed the network bandwidth
+required to service a client's need to read or write data. You should also
+consider what percentage of the overall data the cluster stores on each host. If
+the percentage on a particular host is large and the host fails, it can lead to
+problems such as exceeding the ``full ratio``,  which causes Ceph to halt
+operations as a safety precaution that prevents data loss.
+
+When you run multiple OSDs per host, you also need to ensure that the kernel
+is up to date. See `OS Recommendations`_ for notes on ``glibc`` and
+``syncfs(2)`` to ensure that your hardware performs as expected when running
+multiple OSDs per host.
+
+Hosts with high numbers of OSDs (e.g., > 20) may spawn a lot of threads, 
+especially during recovery and rebalancing. Many Linux kernels default to 
+a relatively small maximum number of threads (e.g., 32k). If you encounter
+problems starting up OSDs on hosts with a high number of OSDs, consider
+setting ``kernel.pid_max`` to a higher number of threads. The theoretical
+maximum is 4,194,303 threads. For example, you could add the following to
+the ``/etc/sysctl.conf`` file:: 
+
+	kernel.pid_max = 4194303
+
+
+Networks
+========
+
+We recommend that each host have at least two 1Gbps network interface
+controllers (NICs). Since most commodity hard disk drives have a throughput of
+approximately 100MB/second, your NICs should be able to handle the traffic for
+the OSD disks on your host. We recommend a minimum of two NICs to account for a
+public (front-side) network and a cluster (back-side) network. A cluster network
+(preferably not connected to the internet) handles the additional load for data
+replication and helps stop denial of service attacks that prevent the cluster
+from achieving ``active + clean`` states for placement groups as OSDs replicate
+data across the cluster. Consider starting with a 10Gbps network in your racks.
+Replicating 1TB of data across a 1Gbps network takes 3 hours, and 3TBs (a
+typical drive configuration) takes 9 hours. By contrast, with a 10Gbps network,
+the  replication times would be 20 minutes and 1 hour respectively. In a
+petabyte-scale cluster, failure of an OSD disk should be an expectation, not an
+exception. System administrators will appreciate PGs recovering from a
+``degraded`` state to an ``active + clean`` state as rapidly as possible, with
+price / performance tradeoffs taken into consideration. Additionally, some
+deployment tools  (e.g., Dell's Crowbar) deploy with five different networks,
+but employ VLANs to make hardware and network cabling more manageable. VLANs
+using 802.1q protocol require VLAN-capable NICs and Switches. The added hardware
+expense may be offset by the operational cost savings for network setup and
+maintenance. When using VLANs to handle VM traffic between between the cluster
+and compute stacks (e.g., OpenStack, CloudStack, etc.), it is also worth
+considering using 10G Ethernet. Top-of-rack routers for each network also need
+to be able to communicate with spine routers that have even faster
+throughput--e.g.,  40Gbps to 100Gbps.
+
+Your server hardware should have a Baseboard Management Controller (BMC).
+Administration and deployment tools may also use BMCs extensively, so consider
+the cost/benefit tradeoff of an out-of-band network for administration.
+Hypervisor SSH access, VM image uploads, OS image installs, management sockets,
+etc. can impose significant loads on a network.  Running three networks may seem
+like overkill, but each traffic path represents a potential capacity, throughput
+and/or performance bottleneck that you should carefully consider before
+deploying a large scale data cluster.
+ 
+
+Failure Domains
+===============
+
+A failure domain is any failure that prevents access to one or more OSDs. That
+could be a stopped daemon on a host; a hard disk failure,  an OS crash, a
+malfunctioning NIC, a failed power supply, a network outage, a power outage, and
+so forth. When planning out your hardware needs, you must balance the
+temptation to reduce costs by placing too many responsibilities into too few
+failure domains, and the added costs of isolating every potential failure
+domain.
+
+
+Minimum Hardware Recommendations
+================================
+
+Ceph can run on inexpensive commodity hardware. Small production clusters
+and development clusters can run successfully with modest hardware.
+
++--------------+----------------+-----------------------------------------+
+|  Process     | Criteria       | Minimum Recommended                     |
++==============+================+=========================================+
+| ``ceph-osd`` | Processor      | - 1x 64-bit AMD-64                      |
+|              |                | - 1x 32-bit ARM dual-core or better     |
+|              |                | - 1x i386 dual-core                     |
+|              +----------------+-----------------------------------------+
+|              | RAM            |  ~1GB for 1TB of storage per daemon     |
+|              +----------------+-----------------------------------------+
+|              | Volume Storage |  1x storage drive per daemon            |
+|              +----------------+-----------------------------------------+
+|              | Journal        |  1x SSD partition per daemon (optional) |
+|              +----------------+-----------------------------------------+
+|              | Network        |  2x 1GB Ethernet NICs                   |
++--------------+----------------+-----------------------------------------+
+| ``ceph-mon`` | Processor      | - 1x 64-bit AMD-64/i386                 |
+|              |                | - 1x 32-bit ARM dual-core or better     |
+|              |                | - 1x i386 dual-core                     |
+|              +----------------+-----------------------------------------+
+|              | RAM            |  1 GB per daemon                        |
+|              +----------------+-----------------------------------------+
+|              | Disk Space     |  10 GB per daemon                       |
+|              +----------------+-----------------------------------------+
+|              | Network        |  2x 1GB Ethernet NICs                   |
++--------------+----------------+-----------------------------------------+
+| ``ceph-mds`` | Processor      | - 1x 64-bit AMD-64 quad-core            |
+|              |                | - 1x 32-bit ARM quad-core               |
+|              |                | - 1x i386 quad-core                     |
+|              +----------------+-----------------------------------------+
+|              | RAM            |  1 GB minimum per daemon                |
+|              +----------------+-----------------------------------------+
+|              | Disk Space     |  1 MB per daemon                        |
+|              +----------------+-----------------------------------------+
+|              | Network        |  2x 1GB Ethernet NICs                   |
++--------------+----------------+-----------------------------------------+
+
+.. tip:: If you are running an OSD with a single disk, create a
+   partition for your volume storage that is separate from the partition
+   containing the OS. Generally, we recommend separate disks for the
+   OS and the volume storage.
+
+
+Production Cluster Examples
+===========================
+
+Production clusters for petabyte scale data storage may also use commodity
+hardware, but should have considerably more memory, processing power and data
+storage to account for heavy traffic loads.
+
+Dell Example
+------------
+
+A recent (2012) Ceph cluster project is using two fairly robust hardware
+configurations for Ceph OSDs, and a lighter configuration for monitors.
+
++----------------+----------------+------------------------------------+
+|  Configuration | Criteria       | Minimum Recommended                |
++================+================+====================================+
+| Dell PE R510   | Processor      |  2x 64-bit quad-core Xeon CPUs     |
+|                +----------------+------------------------------------+
+|                | RAM            |  16 GB                             |
+|                +----------------+------------------------------------+
+|                | Volume Storage |  8x 2TB drives. 1 OS, 7 Storage    |
+|                +----------------+------------------------------------+
+|                | Client Network |  2x 1GB Ethernet NICs              |
+|                +----------------+------------------------------------+
+|                | OSD Network    |  2x 1GB Ethernet NICs              |
+|                +----------------+------------------------------------+
+|                | Mgmt. Network  |  2x 1GB Ethernet NICs              |
++----------------+----------------+------------------------------------+
+| Dell PE R515   | Processor      |  1x hex-core Opteron CPU           |
+|                +----------------+------------------------------------+
+|                | RAM            |  16 GB                             |
+|                +----------------+------------------------------------+
+|                | Volume Storage |  12x 3TB drives. Storage           |
+|                +----------------+------------------------------------+
+|                | OS Storage     |  1x 500GB drive. Operating System. |
+|                +----------------+------------------------------------+
+|                | Client Network |  2x 1GB Ethernet NICs              |
+|                +----------------+------------------------------------+
+|                | OSD Network    |  2x 1GB Ethernet NICs              |
+|                +----------------+------------------------------------+
+|                | Mgmt. Network  |  2x 1GB Ethernet NICs              |
++----------------+----------------+------------------------------------+
+
+
+
+
+
+.. _Ceph Write Throughput 1: http://ceph.com/community/ceph-performance-part-1-disk-controller-write-throughput/
+.. _Ceph Write Throughput 2: http://ceph.com/community/ceph-performance-part-2-write-throughput-without-ssd-journals/
+.. _Argonaut v. Bobtail Performance Preview: http://ceph.com/uncategorized/argonaut-vs-bobtail-performance-preview/
+.. _Bobtail Performance - I/O Scheduler Comparison: http://ceph.com/community/ceph-bobtail-performance-io-scheduler-comparison/ 
+.. _Mapping Pools to Different Types of OSDs: http://ceph.com/docs/master/rados/operations/crush-map/#placing-different-pools-on-different-osds
+.. _OS Recommendations: ../os-recommendations
diff --git a/doc/start/index.rst b/doc/start/index.rst
new file mode 100644
index 0000000..f0e80b0
--- /dev/null
+++ b/doc/start/index.rst
@@ -0,0 +1,47 @@
+======================
+ Installation (Quick)
+======================
+
+.. raw:: html
+
+	<style type="text/css">div.body h3{margin:5px 0px 0px 0px;}</style>
+	<table cellpadding="10"><colgroup><col width="33%"><col width="33%"><col width="33%"></colgroup><tbody valign="top"><tr><td><h3>Step 1: Preflight</h3>
+
+A :term:`Ceph Client` and a :term:`Ceph Node` may require some basic
+configuration  work prior to deploying a Ceph Storage Cluster. You can also
+avail yourself of help by getting involved in the Ceph community.
+
+.. toctree::
+
+   Preflight <quick-start-preflight>
+
+.. raw:: html 
+
+	</td><td><h3>Step 2: Storage Cluster</h3>
+	
+Once you've completed your preflight checklist, you should be able to begin
+deploying a Ceph Storage Cluster.
+
+.. toctree::
+
+	Storage Cluster Quick Start <quick-ceph-deploy>
+
+
+.. raw:: html 
+
+	</td><td><h3>Step 3: Ceph Client(s)</h3>
+	
+Most Ceph users don't store objects directly in the Ceph Storage Cluster. They typically use at least one of
+Ceph Block Devices, the Ceph Filesystem, and Ceph Object Storage.
+
+.. toctree::
+	
+   Block Device Quick Start <quick-rbd>
+   Filesystem Quick Start <quick-cephfs>
+   Object Storage Quick Start <quick-rgw>
+
+.. raw:: html
+
+	</td></tr></tbody></table>
+
+
diff --git a/doc/start/intro.rst b/doc/start/intro.rst
new file mode 100644
index 0000000..688a6c5
--- /dev/null
+++ b/doc/start/intro.rst
@@ -0,0 +1,72 @@
+===============
+ Intro to Ceph
+===============
+
+Whether you want to provide :term:`Ceph Object Storage` and/or :term:`Ceph Block
+Device` services to :term:`Cloud Platforms`, deploy a :term:`Ceph Filesystem` or
+use Ceph for another purpose, all :term:`Ceph Storage Cluster` deployments begin
+with setting up each :term:`Ceph Node`, your network and the Ceph Storage
+Cluster. A Ceph Storage Cluster requires at least one Ceph Monitor and at least
+two Ceph OSD Daemons. The Ceph Metadata Server is essential when running Ceph
+Filesystem clients.
+
+.. ditaa::  +---------------+ +---------------+ +---------------+
+            |      OSDs     | |    Monitor    | |      MDS      |
+            +---------------+ +---------------+ +---------------+
+
+- **Ceph OSDs**: A :term:`Ceph OSD Daemon` (Ceph OSD) stores data, handles data
+  replication, recovery, backfilling, rebalancing, and provides some monitoring
+  information to Ceph Monitors by checking other Ceph OSD Daemons for a 
+  heartbeat. A Ceph Storage Cluster requires at least two Ceph OSD Daemons to 
+  achieve an ``active + clean`` state when the cluster makes two copies of your
+  data (Ceph makes 3 copies by default, but you can adjust it).
+  
+- **Monitors**: A :term:`Ceph Monitor` maintains maps of the cluster state, 
+  including the monitor map, the OSD map, the Placement Group (PG) map, and the
+  CRUSH map. Ceph maintains a history (called an "epoch") of each state change 
+  in the Ceph Monitors, Ceph OSD Daemons, and PGs.
+
+- **MDSs**: A :term:`Ceph Metadata Server` (MDS) stores metadata on behalf of 
+  the :term:`Ceph Filesystem` (i.e., Ceph Block Devices and Ceph Object Storage
+  do not use MDS). Ceph Metadata Servers make it feasible for POSIX file system 
+  users to execute basic commands like ``ls``, ``find``, etc. without placing 
+  an enormous burden on the Ceph Storage Cluster.
+
+Ceph stores a client's data as objects within storage pools. Using the CRUSH 
+algorithm, Ceph calculates which placement group should contain the object, 
+and further calculates which Ceph OSD Daemon should store the placement group.
+The CRUSH algorithm enables the Ceph Storage Cluster to scale, rebalance, and
+recover dynamically.
+
+
+.. raw:: html
+
+	<style type="text/css">div.body h3{margin:5px 0px 0px 0px;}</style>
+	<table cellpadding="10"><colgroup><col width="50%"><col width="50%"></colgroup><tbody valign="top"><tr><td><h3>Recommendations</h3>
+	
+To begin using Ceph in production, you should review our hardware
+recommendations and operating system recommendations. 
+
+.. toctree::
+   :maxdepth: 2
+
+   Hardware Recommendations <hardware-recommendations>
+   OS Recommendations <os-recommendations>
+
+
+.. raw:: html 
+
+	</td><td><h3>Get Involved</h3>
+
+   You can avail yourself of help or contribute documentation, source 
+   code or bugs by getting involved in the Ceph community.
+
+.. toctree::
+   :maxdepth: 2
+
+   get-involved
+   documenting-ceph
+
+.. raw:: html
+
+	</td></tr></tbody></table>
diff --git a/doc/start/os-recommendations.rst b/doc/start/os-recommendations.rst
new file mode 100644
index 0000000..40b5ff6
--- /dev/null
+++ b/doc/start/os-recommendations.rst
@@ -0,0 +1,128 @@
+====================
+ OS Recommendations
+====================
+
+Ceph Dependencies
+=================
+
+As a general rule, we recommend deploying Ceph on newer releases of Linux. 
+We also recommend deploying on releases with long-term support.
+
+Linux Kernel
+------------
+
+- **Ceph Kernel Client**
+
+  We currently recommend:
+
+  - 4.1.4 or later
+  - 3.16.3 or later (rbd deadlock regression in 3.16.[0-2])
+  - *NOT* 3.15.* (rbd deadlock regression)
+  - 3.14.*
+
+  These are considered pretty old, but if you must:
+
+  - 3.10.*
+
+  Firefly (CRUSH_TUNABLES3) tunables are supported starting with 3.15.
+  See `CRUSH Tunables`_ for more details.
+
+- **B-tree File System (Btrfs)**
+
+  If you use the ``btrfs`` file system with Ceph, we recommend using a
+  recent Linux kernel (3.14 or later).
+
+Platforms
+=========
+
+The charts below show how Ceph's requirements map onto various Linux
+platforms.  Generally speaking, there is very little dependence on
+specific distributions aside from the kernel and system initialization
+package (i.e., sysvinit, upstart, systemd).
+
+Infernalis (9.1.0)
+------------------
+
++----------+----------+--------------------+--------------+---------+------------+
+| Distro   | Release  | Code Name          | Kernel       | Notes   | Testing    | 
++==========+==========+====================+==============+=========+============+
+| CentOS   | 7        | N/A                | linux-3.10.0 |         | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+| Debian   | 8.0      | Jessie             | linux-3.16.0 | 1, 2    | B, I       |
++----------+----------+--------------------+--------------+---------+------------+
+| Fedora   | 22       | N/A                | linux-3.14.0 |         | B, I       |
++----------+----------+--------------------+--------------+---------+------------+
+| RHEL     | 7        | Maipo              | linux-3.10.0 |         | B, I       |
++----------+----------+--------------------+--------------+---------+------------+
+| Ubuntu   | 14.04    | Trusty Tahr        | linux-3.13.0 |         | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+
+Hammer (0.94)
+-------------
+
++----------+----------+--------------------+--------------+---------+------------+
+| Distro   | Release  | Code Name          | Kernel       | Notes   | Testing    | 
++==========+==========+====================+==============+=========+============+
+| CentOS   | 6        | N/A                | linux-2.6.32 | 1, 2    |            |
++----------+----------+--------------------+--------------+---------+------------+
+| CentOS   | 7        | N/A                | linux-3.10.0 |         | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+| Debian   | 7.0      | Wheezy             | linux-3.2.0  | 1, 2    |            |
++----------+----------+--------------------+--------------+---------+------------+
+| Ubuntu   | 12.04    | Precise Pangolin   | linux-3.2.0  | 1, 2    |            |
++----------+----------+--------------------+--------------+---------+------------+
+| Ubuntu   | 14.04    | Trusty Tahr        | linux-3.13.0 |         | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+
+Firefly (0.80)
+--------------
+
++----------+----------+--------------------+--------------+---------+------------+
+| Distro   | Release  | Code Name          | Kernel       | Notes   | Testing    | 
++==========+==========+====================+==============+=========+============+
+| CentOS   | 6        | N/A                | linux-2.6.32 | 1, 2    | B, I       |
++----------+----------+--------------------+--------------+---------+------------+
+| CentOS   | 7        | N/A                | linux-3.10.0 |         | B          |
++----------+----------+--------------------+--------------+---------+------------+
+| Debian   | 7.0      | Wheezy             | linux-3.2.0  | 1, 2    | B          |
++----------+----------+--------------------+--------------+---------+------------+
+| Fedora   | 19       | Schrödinger's Cat  | linux-3.10.0 |         | B          |
++----------+----------+--------------------+--------------+---------+------------+
+| Fedora   | 20       | Heisenbug          | linux-3.14.0 |         | B          |
++----------+----------+--------------------+--------------+---------+------------+
+| RHEL     | 6        | Santiago           | linux-2.6.32 | 1, 2    | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+| RHEL     | 7        | Maipo              | linux-3.10.0 |         | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+| Ubuntu   | 12.04    | Precise Pangolin   | linux-3.2.0  | 1, 2    | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+| Ubuntu   | 14.04    | Trusty Tahr        | linux-3.13.0 |         | B, I, C    |
++----------+----------+--------------------+--------------+---------+------------+
+
+Notes
+-----
+
+- **1**: The default kernel has an older version of ``btrfs`` that we do not
+  recommend for ``ceph-osd`` storage nodes.  Upgrade to a recommended
+  kernel or use ``XFS``.
+
+- **2**: The default kernel has an old Ceph client that we do not recommend
+  for kernel client (kernel RBD or the Ceph file system).  Upgrade to a
+  recommended kernel.
+
+
+Testing
+-------
+
+- **B**: We build release packages for this platform. For some of these
+  platforms, we may also continuously build all ceph branches and exercise
+  basic unit tests.
+
+- **I**: We do basic installation and functionality tests of releases on this
+  platform.
+
+- **C**: We run a comprehensive functional, regression, and stress test suite
+  on this platform on a continuous basis. This includes development branches,
+  pre-release, and released code.
+
+.. _CRUSH Tunables: ../../rados/operations/crush-map#tunables
diff --git a/doc/start/quick-ceph-deploy.rst b/doc/start/quick-ceph-deploy.rst
new file mode 100644
index 0000000..335b450
--- /dev/null
+++ b/doc/start/quick-ceph-deploy.rst
@@ -0,0 +1,401 @@
+=============================
+ Storage Cluster Quick Start
+=============================
+
+If you haven't completed your `Preflight Checklist`_, do that first. This
+**Quick Start** sets up a :term:`Ceph Storage Cluster` using ``ceph-deploy``
+on your admin node. Create a three Ceph Node cluster so you can
+explore Ceph functionality.
+
+.. include:: quick-common.rst
+
+As a first exercise, create a Ceph Storage Cluster with one Ceph Monitor and two
+Ceph OSD Daemons. Once the cluster reaches a ``active + clean`` state, expand it
+by adding a third Ceph OSD Daemon, a Metadata Server and two more Ceph Monitors.
+For best results, create a directory on your admin node node for maintaining the
+configuration files and keys that ``ceph-deploy`` generates for your cluster. ::
+
+	mkdir my-cluster
+	cd my-cluster
+
+The ``ceph-deploy`` utility will output files to the current directory. Ensure you
+are in this directory when executing ``ceph-deploy``.
+
+.. important:: Do not call ``ceph-deploy`` with ``sudo`` or run it as ``root``
+   if you are logged in as a different user, because it will not issue ``sudo``
+   commands needed on the remote host.
+
+.. topic:: Disable ``requiretty``
+
+   On some distributions (e.g., CentOS), you may receive an error while trying
+   to execute ``ceph-deploy`` commands. If ``requiretty`` is set
+   by default, disable it by executing ``sudo visudo`` and locate the
+   ``Defaults requiretty`` setting. Change it to ``Defaults:ceph !requiretty`` to
+   ensure that ``ceph-deploy`` can connect using the ``ceph`` user and execute
+   commands with ``sudo``.
+
+Create a Cluster
+================
+
+If at any point you run into trouble and you want to start over, execute
+the following to purge the configuration::
+
+	ceph-deploy purgedata {ceph-node} [{ceph-node}]
+	ceph-deploy forgetkeys
+
+To purge the Ceph packages too, you may also execute::
+
+	ceph-deploy purge {ceph-node} [{ceph-node}]
+
+If you execute ``purge``, you must re-install Ceph.
+
+On your admin node from the directory you created for holding your
+configuration details, perform the following steps using ``ceph-deploy``.
+
+#. Create the cluster. ::
+
+	ceph-deploy new {initial-monitor-node(s)}
+
+   For example::
+
+	ceph-deploy new node1
+
+   Check the output of ``ceph-deploy`` with ``ls`` and ``cat`` in the current
+   directory. You should see a Ceph configuration file, a monitor secret
+   keyring, and a log file for the new cluster.  See `ceph-deploy new -h`_
+   for additional details.
+
+#. Change the default number of replicas in the Ceph configuration file from
+   ``3`` to ``2`` so that Ceph can achieve an ``active + clean`` state with
+   just two Ceph OSDs. Add the following line under the ``[global]`` section::
+
+	osd pool default size = 2
+
+#. If you have more than one network interface, add the ``public network``
+   setting under the ``[global]`` section of your Ceph configuration file.
+   See the `Network Configuration Reference`_ for details. ::
+
+	public network = {ip-address}/{netmask}
+
+#. Install Ceph. ::
+
+	ceph-deploy install {ceph-node}[{ceph-node} ...]
+
+   For example::
+
+	ceph-deploy install admin-node node1 node2 node3
+
+   The ``ceph-deploy`` utility will install Ceph on each node.
+   **NOTE**: If you use ``ceph-deploy purge``, you must re-execute this step
+   to re-install Ceph.
+
+
+#. Add the initial monitor(s) and gather the keys::
+
+	ceph-deploy mon create-initial
+
+   Once you complete the process, your local directory should have the following
+   keyrings:
+
+   - ``{cluster-name}.client.admin.keyring``
+   - ``{cluster-name}.bootstrap-osd.keyring``
+   - ``{cluster-name}.bootstrap-mds.keyring``
+   - ``{cluster-name}.bootstrap-rgw.keyring``
+
+.. note:: The bootstrap-rgw keyring is only created during installation of clusters
+   running Hammer or newer
+
+
+#. Add two OSDs. For fast setup, this quick start uses a directory rather
+   than an entire disk per Ceph OSD Daemon. See `ceph-deploy osd`_ for
+   details on using separate disks/partitions for OSDs and journals.
+   Login to the Ceph Nodes and create a directory for
+   the Ceph OSD Daemon. ::
+
+	ssh node2
+	sudo mkdir /var/local/osd0
+	exit
+
+	ssh node3
+	sudo mkdir /var/local/osd1
+	exit
+
+   Then, from your admin node, use ``ceph-deploy`` to prepare the OSDs. ::
+
+	ceph-deploy osd prepare {ceph-node}:/path/to/directory
+
+   For example::
+
+	ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
+
+   Finally, activate the OSDs. ::
+
+	ceph-deploy osd activate {ceph-node}:/path/to/directory
+
+   For example::
+
+	ceph-deploy osd activate node2:/var/local/osd0 node3:/var/local/osd1
+
+
+#. Use ``ceph-deploy`` to copy the configuration file and admin key to
+   your admin node and your Ceph Nodes so that you can use the ``ceph``
+   CLI without having to specify the monitor address and
+   ``ceph.client.admin.keyring`` each time you execute a command. ::
+
+	ceph-deploy admin {admin-node} {ceph-node}
+
+   For example::
+
+	ceph-deploy admin admin-node node1 node2 node3
+
+
+   When ``ceph-deploy`` is talking to the local admin host (``admin-node``),
+   it must be reachable by its hostname. If necessary, modify ``/etc/hosts``
+   to add the name of the admin host.
+
+#. Ensure that you have the correct permissions for the
+   ``ceph.client.admin.keyring``. ::
+
+	sudo chmod +r /etc/ceph/ceph.client.admin.keyring
+
+#. Check your cluster's health. ::
+
+	ceph health
+
+   Your cluster should return an ``active + clean`` state when it
+   has finished peering.
+
+
+Operating Your Cluster
+======================
+
+Deploying a Ceph cluster with ``ceph-deploy`` automatically starts the cluster.
+To operate the cluster daemons with Debian/Ubuntu distributions, see
+`Running Ceph with Upstart`_.  To operate the cluster daemons with CentOS,
+Red Hat, Fedora, and SLES distributions, see `Running Ceph with sysvinit`_.
+
+To learn more about peering and cluster health, see `Monitoring a Cluster`_.
+To learn more about Ceph OSD Daemon and placement group health, see
+`Monitoring OSDs and PGs`_. To learn more about managing users, see
+`User Management`_.
+
+Once you deploy a Ceph cluster, you can try out some of the administration
+functionality, the ``rados`` object store command line, and then proceed to
+Quick Start guides for Ceph Block Device, Ceph Filesystem, and the Ceph Object
+Gateway.
+
+
+Expanding Your Cluster
+======================
+
+Once you have a basic cluster up and running, the next step is to expand
+cluster. Add a Ceph OSD Daemon and a Ceph Metadata Server to ``node1``.
+Then add a Ceph Monitor to ``node2`` and  ``node3`` to establish a
+quorum of Ceph Monitors.
+
+.. ditaa::
+           /------------------\         /----------------\
+           |    ceph–deploy   |         |     node1      |
+           |    Admin Node    |         | cCCC           |
+           |                  +-------->+   mon.node1    |
+           |                  |         |     osd.2      |
+           |                  |         |   mds.node1    |
+           \---------+--------/         \----------------/
+                     |
+                     |                  /----------------\
+                     |                  |     node2      |
+                     |                  | cCCC           |
+                     +----------------->+                |
+                     |                  |     osd.0      |
+                     |                  |   mon.node2    |
+                     |                  \----------------/
+                     |
+                     |                  /----------------\
+                     |                  |     node3      |
+                     |                  | cCCC           |
+                     +----------------->+                |
+                                        |     osd.1      |
+                                        |   mon.node3    |
+                                        \----------------/
+
+Adding an OSD
+-------------
+
+Since you are running a 3-node cluster for demonstration purposes, add the OSD
+to the monitor node. ::
+
+	ssh node1
+	sudo mkdir /var/local/osd2
+	exit
+
+Then, from your ``ceph-deploy`` node, prepare the OSD. ::
+
+	ceph-deploy osd prepare {ceph-node}:/path/to/directory
+
+For example::
+
+	ceph-deploy osd prepare node1:/var/local/osd2
+
+Finally, activate the OSDs. ::
+
+	ceph-deploy osd activate {ceph-node}:/path/to/directory
+
+For example::
+
+	ceph-deploy osd activate node1:/var/local/osd2
+
+
+Once you have added your new OSD, Ceph will begin rebalancing the cluster by
+migrating placement groups to your new OSD. You can observe this process with
+the ``ceph`` CLI. ::
+
+	ceph -w
+
+You should see the placement group states change from ``active+clean`` to active
+with some degraded objects, and finally ``active+clean`` when migration
+completes. (Control-c to exit.)
+
+
+Add a Metadata Server
+---------------------
+
+To use CephFS, you need at least one metadata server. Execute the following to
+create a metadata server::
+
+	ceph-deploy mds create {ceph-node}
+
+For example::
+
+	ceph-deploy mds create node1
+
+
+.. note:: Currently Ceph runs in production with one metadata server only. You
+   may use more, but there is currently no commercial support for a cluster
+   with multiple metadata servers.
+
+
+Add an RGW Instance
+-------------------
+
+To use the :term:`Ceph Object Gateway` component of Ceph, you must deploy an
+instance of :term:`RGW`.  Execute the following to create an new instance of
+RGW::
+
+    ceph-deploy rgw create {gateway-node}
+
+For example::
+
+    ceph-deploy rgw create node1
+
+.. note:: This functionality is new with the **Hammer** release, and also with
+   ``ceph-deploy`` v1.5.23.
+
+By default, the :term:`RGW` instance will listen on port 7480. This can be
+changed by editing ceph.conf on the node running the :term:`RGW` as follows:
+
+.. code-block:: ini
+
+    [client]
+    rgw frontends = civetweb port=80
+
+To use an IPv6 address, use:
+
+.. code-block:: ini
+
+    [client]
+    rgw frontends = civetweb port=[::]:80
+
+
+Adding Monitors
+---------------
+
+A Ceph Storage Cluster requires at least one Ceph Monitor to run. For high
+availability, Ceph Storage Clusters typically run multiple Ceph
+Monitors so that the failure of a single Ceph Monitor will not bring down the
+Ceph Storage Cluster. Ceph uses the Paxos algorithm, which requires a majority
+of monitors (i.e., 1, 2:3, 3:4, 3:5, 4:6, etc.) to form a quorum.
+
+Add two Ceph Monitors to your cluster. ::
+
+	ceph-deploy mon add {ceph-node}
+
+For example::
+
+	ceph-deploy mon add node2 node3
+
+Once you have added your new Ceph Monitors, Ceph will begin synchronizing
+the monitors and form a quorum. You can check the quorum status by executing
+the following::
+
+	ceph quorum_status --format json-pretty
+
+
+.. tip:: When you run Ceph with multiple monitors, you SHOULD install and
+         configure NTP on each monitor host. Ensure that the
+         monitors are NTP peers.
+
+
+Storing/Retrieving Object Data
+==============================
+
+To store object data in the Ceph Storage Cluster, a Ceph client must:
+
+#. Set an object name
+#. Specify a `pool`_
+
+The Ceph Client retrieves the latest cluster map and the CRUSH algorithm
+calculates how to map the object to a `placement group`_, and then calculates
+how to assign the placement group to a Ceph OSD Daemon dynamically. To find the
+object location, all you need is the object name and the pool name. For
+example::
+
+	ceph osd map {poolname} {object-name}
+
+.. topic:: Exercise: Locate an Object
+
+	As an exercise, lets create an object. Specify an object name, a path to
+	a test file containing some object data and a pool name using the
+	``rados put`` command on the command line. For example::
+
+		echo {Test-data} > testfile.txt
+		rados put {object-name} {file-path} --pool=data
+		rados put test-object-1 testfile.txt --pool=data
+
+	To verify that the Ceph Storage Cluster stored the object, execute
+	the following::
+
+		rados -p data ls
+
+	Now, identify the object location::
+
+		ceph osd map {pool-name} {object-name}
+		ceph osd map data test-object-1
+
+	Ceph should output the object's location. For example::
+
+		osdmap e537 pool 'data' (0) object 'test-object-1' -> pg 0.d1743484 (0.4) -> up [1,0] acting [1,0]
+
+	To remove the test object, simply delete it using the ``rados rm``
+	command.	For example::
+
+		rados rm test-object-1 --pool=data
+
+As the cluster evolves, the object location may change dynamically. One benefit
+of Ceph's dynamic rebalancing is that Ceph relieves you from having to perform
+the migration manually.
+
+
+.. _Preflight Checklist: ../quick-start-preflight
+.. _Ceph Deploy: ../../rados/deployment
+.. _ceph-deploy install -h: ../../rados/deployment/ceph-deploy-install
+.. _ceph-deploy new -h: ../../rados/deployment/ceph-deploy-new
+.. _ceph-deploy osd: ../../rados/deployment/ceph-deploy-osd
+.. _Running Ceph with Upstart: ../../rados/operations/operating#running-ceph-with-upstart
+.. _Running Ceph with sysvinit: ../../rados/operations/operating#running-ceph-with-sysvinit
+.. _CRUSH Map: ../../rados/operations/crush-map
+.. _pool: ../../rados/operations/pools
+.. _placement group: ../../rados/operations/placement-groups
+.. _Monitoring a Cluster: ../../rados/operations/monitoring
+.. _Monitoring OSDs and PGs: ../../rados/operations/monitoring-osd-pg
+.. _Network Configuration Reference: ../../rados/configuration/network-config-ref
+.. _User Management: ../../rados/operations/user-management
diff --git a/doc/start/quick-cephfs.rst b/doc/start/quick-cephfs.rst
new file mode 100644
index 0000000..9943d40
--- /dev/null
+++ b/doc/start/quick-cephfs.rst
@@ -0,0 +1,119 @@
+=====================
+ Ceph FS Quick Start
+=====================
+
+To use the :term:`Ceph FS` Quick Start guide, you must have executed the
+procedures in the `Storage Cluster Quick Start`_ guide first. Execute this quick
+start on the Admin Host.
+
+Prerequisites
+=============
+
+#. Verify that you have an appropriate version of the Linux kernel. 
+   See `OS Recommendations`_ for details. ::
+   
+	lsb_release -a
+	uname -r
+
+#. On the admin node, use ``ceph-deploy`` to install Ceph on your 
+   ``ceph-client`` node. ::
+
+	ceph-deploy install ceph-client
+
+
+#. Ensure that the :term:`Ceph Storage Cluster` is running and in an ``active +
+   clean``  state. Also, ensure that you have at least one :term:`Ceph Metadata
+   Server` running. :: 
+
+	ceph -s [-m {monitor-ip-address}] [-k {path/to/ceph.client.admin.keyring}]
+
+
+Create a Filesystem
+===================
+
+You have already created an MDS (`Storage Cluster Quick Start`_) but it will not
+become active until you create some pools and a filesystem.  See :doc:`/cephfs/createfs`.
+
+::
+
+    ceph osd pool create cephfs_data <pg_num>
+    ceph osd pool create cephfs_metadata <pg_num>
+    ceph fs new <fs_name> cephfs_metadata cephfs_data
+
+
+Create a Secret File
+====================
+
+The Ceph Storage Cluster runs with authentication turned on by default. 
+You should have a file containing the secret key (i.e., not the keyring 
+itself). To obtain the secret key for a particular user, perform the 
+following procedure: 
+
+#. Identify a key for a user within a keyring file. For example:: 
+
+	cat ceph.client.admin.keyring
+
+#. Copy the key of the user who will be using the mounted Ceph FS filesystem.
+   It should look something like this:: 
+	
+	[client.admin]
+	   key = AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==
+
+#. Open a text editor. 
+
+#. Paste the key into an empty file. It should look something like this::
+
+	AQCj2YpRiAe6CxAA7/ETt7Hcl9IyxyYciVs47w==
+
+#. Save the file with the user ``name`` as an attribute 
+   (e.g., ``admin.secret``).
+
+#. Ensure the file permissions are appropriate for the user, but not
+   visible to other users. 
+
+
+Kernel Driver
+=============
+
+Mount Ceph FS as a kernel driver. :: 
+
+	sudo mkdir /mnt/mycephfs
+	sudo mount -t ceph {ip-address-of-monitor}:6789:/ /mnt/mycephfs
+
+The Ceph Storage Cluster uses authentication by default. Specify a user ``name``
+and the ``secretfile`` you created  in the `Create a Secret File`_ section. For
+example::
+
+	sudo mount -t ceph 192.168.0.1:6789:/ /mnt/mycephfs -o name=admin,secretfile=admin.secret
+
+
+.. note:: Mount the Ceph FS filesystem on the admin node,
+   not the server node. See `FAQ`_ for details.
+
+
+Filesystem in User Space (FUSE)
+===============================
+
+Mount Ceph FS as a Filesystem in User Space (FUSE). ::
+
+	sudo mkdir ~/mycephfs
+	sudo ceph-fuse -m {ip-address-of-monitor}:6789 ~/mycephfs
+
+The Ceph Storage Cluster uses authentication by default. Specify a keyring if it
+is not in the default location (i.e., ``/etc/ceph``)::
+
+	sudo ceph-fuse -k ./ceph.client.admin.keyring -m 192.168.0.1:6789 ~/mycephfs
+
+
+Additional Information
+======================
+
+See `Ceph FS`_ for additional information. Ceph FS is not quite as stable
+as the Ceph Block Device and Ceph Object Storage. See `Troubleshooting`_
+if you encounter trouble. 
+
+.. _Storage Cluster Quick Start: ../quick-ceph-deploy
+.. _Ceph FS: ../../cephfs/
+.. _FAQ: http://wiki.ceph.com/03FAQs/01General_FAQ#How_Can_I_Give_Ceph_a_Try.3F
+.. _Troubleshooting: ../../cephfs/troubleshooting
+.. _OS Recommendations: ../os-recommendations
diff --git a/doc/start/quick-common.rst b/doc/start/quick-common.rst
new file mode 100644
index 0000000..a2afa13
--- /dev/null
+++ b/doc/start/quick-common.rst
@@ -0,0 +1,19 @@
+.. ditaa:: 
+           /------------------\         /----------------\
+           |    admin-node    |         |      node1     |
+           |                  +-------->+ cCCC           |
+           |    ceph-deploy   |         |    mon.node1   |
+           \---------+--------/         \----------------/
+                     |
+                     |                  /----------------\
+                     |                  |      node2     |
+                     +----------------->+ cCCC           |
+                     |                  |     osd.0      |
+                     |                  \----------------/
+                     |
+                     |                  /----------------\
+                     |                  |      node3     |
+                     +----------------->| cCCC           |
+                                        |     osd.1      |
+                                        \----------------/
+
diff --git a/doc/start/quick-rbd.rst b/doc/start/quick-rbd.rst
new file mode 100644
index 0000000..a7fb0d9
--- /dev/null
+++ b/doc/start/quick-rbd.rst
@@ -0,0 +1,81 @@
+==========================
+ Block Device Quick Start
+==========================
+
+To use this guide, you must have executed the procedures in the `Storage
+Cluster Quick Start`_ guide first. Ensure your :term:`Ceph Storage Cluster` is
+in an ``active + clean`` state before working with the :term:`Ceph Block
+Device`. 
+
+.. note:: The Ceph Block Device is also known as :term:`RBD` or :term:`RADOS`
+   Block Device.
+
+
+.. ditaa:: 
+           /------------------\         /----------------\
+           |    Admin Node    |         |   ceph–client  |
+           |                  +-------->+ cCCC           |
+           |    ceph–deploy   |         |      ceph      |
+           \------------------/         \----------------/
+
+
+You may use a virtual machine for your ``ceph-client`` node, but do not 
+execute the following procedures on the same physical node as your Ceph 
+Storage Cluster nodes (unless you use a VM). See `FAQ`_ for details.
+
+
+Install Ceph
+============
+
+#. Verify that you have an appropriate version of the Linux kernel. 
+   See `OS Recommendations`_ for details. ::
+   
+	lsb_release -a
+	uname -r
+
+#. On the admin node, use ``ceph-deploy`` to install Ceph on your 
+   ``ceph-client`` node. ::
+
+	ceph-deploy install ceph-client
+	
+#. On the admin node, use ``ceph-deploy`` to copy the Ceph configuration file
+   and the ``ceph.client.admin.keyring`` to the ``ceph-client``. :: 
+
+	ceph-deploy admin ceph-client
+
+   The ``ceph-deploy`` utility copies the keyring to the ``/etc/ceph`` 
+   directory. Ensure that the keyring file has appropriate read permissions 
+   (e.g., ``sudo chmod +r /etc/ceph/ceph.client.admin.keyring``).
+
+
+Configure a Block Device
+========================
+
+#. On the ``ceph-client`` node, create a block device image. :: 
+
+	rbd create foo --size 4096 [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring]
+
+#. On the ``ceph-client`` node, map the image to a block device. :: 
+
+	sudo rbd map foo --name client.admin [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring]
+	
+#. Use the block device by creating a file system on the ``ceph-client`` 
+   node. :: 
+
+	sudo mkfs.ext4 -m0 /dev/rbd/rbd/foo
+	
+	This may take a few moments.
+	
+#. Mount the file system on the ``ceph-client`` node. ::
+
+	sudo mkdir /mnt/ceph-block-device
+	sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device
+	cd /mnt/ceph-block-device
+
+
+See `block devices`_ for additional details.
+
+.. _Storage Cluster Quick Start: ../quick-ceph-deploy
+.. _block devices: ../../rbd/rbd
+.. _FAQ: http://wiki.ceph.com/FAQs/How_Can_I_Give_Ceph_a_Try%3F
+.. _OS Recommendations: ../os-recommendations
diff --git a/doc/start/quick-rgw-old.rst b/doc/start/quick-rgw-old.rst
new file mode 100644
index 0000000..5f9cfc1
--- /dev/null
+++ b/doc/start/quick-rgw-old.rst
@@ -0,0 +1,28 @@
+===========================
+ Quick Ceph Object Storage
+===========================
+
+To use the :term:`Ceph Object Storage` Quick Start guide, you must have executed the
+procedures in the `Storage Cluster Quick Start`_ guide first. Make sure that you
+have at least one :term:`RGW` instance running.
+
+Configure new RGW instance
+==========================
+
+The :term:`RGW` instance created by the `Storage Cluster Quick Start`_ will run using
+the embedded CivetWeb webserver. ``ceph-deploy`` will create the instance and start
+it automatically with default parameters.
+
+To administer the :term:`RGW` instance, see details in the the
+`RGW Admin Guide`_.
+
+Additional details may be found in the `Configuring Ceph Object Gateway`_ guide, but
+the steps specific to Apache are no longer needed.
+
+.. note:: Deploying RGW using ``ceph-deploy`` and using the CivetWeb webserver instead
+   of Apache is new functionality as of **Hammer** release.
+
+
+.. _Storage Cluster Quick Start: ../quick-ceph-deploy
+.. _RGW Admin Guide: ../../radosgw/admin
+.. _Configuring Ceph Object Gateway: ../../radosgw/config
diff --git a/doc/start/quick-rgw.rst b/doc/start/quick-rgw.rst
new file mode 100644
index 0000000..41c98f1
--- /dev/null
+++ b/doc/start/quick-rgw.rst
@@ -0,0 +1,101 @@
+===============================
+Ceph Object Gateway Quick Start
+===============================
+
+As of `firefly` (v0.80), Ceph Storage dramatically simplifies installing and
+configuring a Ceph Object Gateway. The Gateway daemon embeds Civetweb, so you
+do not have to install a web server or configure FastCGI. Additionally,
+``ceph-deploy`` can install the gateway package, generate a key, configure a
+data directory and create a gateway instance for you.
+
+.. tip:: Civetweb uses port ``7480`` by default. You must either open port
+   ``7480``, or set the port to a preferred port (e.g., port ``80``) in your Ceph
+   configuration file.
+
+To start a Ceph Object Gateway, follow the steps below:
+
+Installing Ceph Object Gateway
+==============================
+
+#. Execute the pre-installation steps on your ``client-node``. If you intend to
+   use Civetweb's default port ``7480``, you must open it using either
+   ``firewall-cmd`` or ``iptables``. See `Preflight Checklist`_ for more
+   information.
+
+#. From the working directory of your administration server, install the Ceph
+   Object Gateway package on the ``client-node`` node. For example::
+
+    ceph-deploy install --rgw <client-node> [<client-node> ...]
+
+Creating the Ceph Object Gateway Instance
+=========================================
+
+From the working directory of your administration server, create an instance of
+the Ceph Object Gateway on the ``client-node``. For example::
+
+    ceph-deploy rgw create
+
+Once the gateway is running, you should be able to access it on port ``7480``.
+(e.g., ``http://client-node:7480``).
+
+Configuring the Ceph Object Gateway Instance
+============================================
+
+#. To change the default port (e.g,. to port ``80``), modify your Ceph
+   configuration file. Add a section entitled ``[client.rgw.<client-node>]``,
+   replacing ``<client-node>`` with the short node name of your Ceph client
+   node (i.e., ``hostname -s``). For example, if your node name is
+   ``client-node``, add a section like this after the ``[global]`` section::
+
+    [client.rgw.client-node]
+    rgw_frontends = "civetweb port=80"
+
+   .. note:: Ensure that you leave no whitespace between ``port=<port-number>``
+      in the ``rgw_frontends`` key/value pair.
+
+   .. important:: If you intend to use port 80, make sure that the Apache
+      server is not running otherwise it will conflict with Civetweb. We recommend
+      to remove Apache in this case.
+
+#. To make the new port setting take effect, restart the Ceph Object Gateway.
+   On Red Hat Enterprise Linux 7 and Fedora, run the following command::
+
+    sudo systemctl restart ceph-radosgw.service
+
+   On Red Hat Enterprise Linux 6 and Ubuntu, run the following command::
+
+    sudo service radosgw restart id=rgw.<short-hostname>
+
+#. Finally, check to ensure that the port you selected is open on the node's
+   firewall (e.g., port ``80``). If it is not open, add the port and reload the
+   firewall configuration. For example::
+
+    sudo firewall-cmd --list-all sudo firewall-cmd --zone=public --add-port
+    80/tcp --permanent
+    sudo firewall-cmd --reload
+
+   See `Preflight Checklist`_ for more information on configuring firewall with
+   ``firewall-cmd`` or ``iptables``.
+
+   You should be able to make an unauthenticated request, and receive a
+   response. For example, a request with no parameters like this::
+
+    http://<client-node>:80
+
+   Should result in a response like this::
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+      <Owner>
+        <ID>anonymous</ID>
+        <DisplayName></DisplayName>
+      </Owner>
+    	<Buckets>
+      </Buckets>
+    </ListAllMyBucketsResult>
+
+See the `Configuring Ceph Object Gateway`_ guide for additional administration
+and API details.
+
+.. _Configuring Ceph Object Gateway: ../../radosgw/config
+.. _Preflight Checklist: ../quick-start-preflight
diff --git a/doc/start/quick-start-preflight.rst b/doc/start/quick-start-preflight.rst
new file mode 100644
index 0000000..79fb84a
--- /dev/null
+++ b/doc/start/quick-start-preflight.rst
@@ -0,0 +1,340 @@
+=====================
+ Preflight Checklist
+=====================
+
+.. versionadded:: 0.60
+
+Thank you for trying Ceph! We recommend setting up a ``ceph-deploy`` admin
+:term:`node` and a 3-node :term:`Ceph Storage Cluster` to explore the basics of
+Ceph. This **Preflight Checklist** will help you prepare a ``ceph-deploy``
+admin node and three Ceph Nodes (or virtual machines) that will host your Ceph
+Storage Cluster. Before proceeding any further, see `OS Recommendations`_ to
+verify that you have a supported distribution and version of Linux. When
+you use a single Linux distribution and version across the cluster, it will
+make it easier for you to troubleshoot issues that arise in production.
+
+In the descriptions below, :term:`Node` refers to a single machine.
+
+.. include:: quick-common.rst
+
+
+Ceph Deploy Setup
+=================
+
+Add Ceph repositories to the ``ceph-deploy`` admin node. Then, install
+``ceph-deploy``.
+
+Advanced Package Tool (APT)
+---------------------------
+
+For Debian and Ubuntu distributions, perform the following steps:
+
+#. Add the release key::
+
+	wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
+
+#. Add the Ceph packages to your repository. Replace ``{ceph-stable-release}``
+   with a stable Ceph release (e.g., ``cuttlefish``, ``dumpling``,
+   ``emperor``, ``firefly``, etc.).
+   For example::
+
+	echo deb http://download.ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list
+
+#. Update your repository and install ``ceph-deploy``::
+
+	sudo apt-get update && sudo apt-get install ceph-deploy
+
+.. note:: You can also use the EU mirror eu.ceph.com for downloading your packages.
+   Simply replace ``http://ceph.com/`` by ``http://eu.ceph.com/``
+
+
+Red Hat Package Manager (RPM)
+-----------------------------
+
+For Red Hat(rhel6, rhel7), CentOS (el6, el7), and Fedora 19-20 (f19-f20) perform the
+following steps:
+
+#. On Red Hat Enterprise Linux 7, register the target machine with ``subscription-manager``, verify your subscriptions, and enable the "Extras" repoistory for package dependencies. For example::
+
+        sudo subscription-manager repos --enable=rhel-7-server-extras-rpms
+
+#. On Red Hat Enterprise Linux 6, install and enable the Extra Packages for Enterprise Linux (EPEL) repository. Please see the `EPEL wiki`_ page for more information.
+
+#. On CentOS, you can execute the following command chain::
+
+        sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*
+
+#. Add the package to your repository. Open a text editor and create a
+   Yellowdog Updater, Modified (YUM) entry. Use the file path
+   ``/etc/yum.repos.d/ceph.repo``. For example::
+
+	sudo vim /etc/yum.repos.d/ceph.repo
+
+   Paste the following example code. Replace ``{ceph-release}`` with
+   the recent major release of Ceph (e.g., ``firefly``). Replace ``{distro}``
+   with your Linux distribution (e.g., ``el6`` for CentOS 6,
+   ``el7`` for CentOS 7, ``rhel6`` for
+   Red Hat 6.5, ``rhel7`` for Red Hat 7, and ``fc19`` or ``fc20`` for Fedora 19
+   or Fedora 20. Finally, save the contents to the
+   ``/etc/yum.repos.d/ceph.repo`` file. ::
+
+	[ceph-noarch]
+	name=Ceph noarch packages
+	baseurl=http://download.ceph.com/rpm-{ceph-release}/{distro}/noarch
+	enabled=1
+	gpgcheck=1
+	type=rpm-md
+	gpgkey=https://download.ceph.com/keys/release.asc
+
+
+#. Update your repository and install ``ceph-deploy``::
+
+	sudo yum update && sudo yum install ceph-deploy
+
+
+.. note:: You can also use the EU mirror eu.ceph.com for downloading your packages.
+   Simply replace ``http://ceph.com/`` by ``http://eu.ceph.com/``
+
+
+Ceph Node Setup
+===============
+
+The admin node must be have password-less SSH access to Ceph nodes.
+When ceph-deploy logs in to a Ceph node as a user, that particular
+user must have passwordless ``sudo`` privileges.
+
+
+Install NTP
+-----------
+
+We recommend installing NTP on Ceph nodes (especially on Ceph Monitor nodes) to
+prevent issues arising from clock drift. See `Clock`_ for details.
+
+On CentOS / RHEL, execute::
+
+	sudo yum install ntp ntpdate ntp-doc
+
+On Debian / Ubuntu, execute::
+
+	sudo apt-get install ntp
+
+Ensure that you enable the NTP service. Ensure that each Ceph Node uses the
+same NTP time server. See `NTP`_ for details.
+
+
+Install SSH Server
+------------------
+
+For **ALL** Ceph Nodes perform the following steps:
+
+#. Install an SSH server (if necessary) on each Ceph Node::
+
+	sudo apt-get install openssh-server
+
+   or::
+
+	sudo yum install openssh-server
+
+
+#. Ensure the SSH server is running on **ALL** Ceph Nodes.
+
+
+Create a Ceph Deploy User
+-------------------------
+
+The ``ceph-deploy`` utility must login to a Ceph node as a user
+that has passwordless ``sudo`` privileges, because it needs to install
+software and configuration files without prompting for passwords.
+
+Recent versions of ``ceph-deploy`` support a ``--username`` option so you can
+specify any user that has password-less ``sudo`` (including ``root``, although
+this is **NOT** recommended). To use ``ceph-deploy --username {username}``, the
+user you specify must have password-less SSH access to the Ceph node, as
+``ceph-deploy`` will not prompt you for a password.
+
+We recommend creating a specific user for ``ceph-deploy`` on **ALL** Ceph nodes
+in the cluster. Please do **NOT** use "ceph" as the user name. A uniform user
+name across the cluster may improve ease of use (not required), but you should
+avoid obvious user names, because hackers typically use them with brute force
+hacks (e.g., ``root``,  ``admin``, ``{productname}``). The following procedure,
+substituting  ``{username}`` for the user name you define, describes how to
+create a user with passwordless ``sudo``.
+
+.. note:: Starting with the `Infernalis release`_ the "ceph" user name is reserved
+   for the Ceph daemons. If the "ceph" user already exists on the Ceph nodes,
+   removing the user must be done before attempting an upgrade.
+
+#. Create a new user on each Ceph Node. ::
+
+	ssh user at ceph-server
+	sudo useradd -d /home/{username} -m {username}
+	sudo passwd {username}
+
+#. For the new user you added to each Ceph node, ensure that the user has
+   ``sudo`` privileges. ::
+
+	echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
+	sudo chmod 0440 /etc/sudoers.d/{username}
+
+
+Enable Password-less SSH
+------------------------
+
+Since ``ceph-deploy`` will not prompt for a password, you must generate
+SSH keys on the admin node and distribute the public key to each Ceph
+node. ``ceph-deploy`` will attempt to generate the SSH keys for initial
+monitors.
+
+#. Generate the SSH keys, but do not use ``sudo`` or the
+   ``root`` user. Leave the passphrase empty::
+
+	ssh-keygen
+
+	Generating public/private key pair.
+	Enter file in which to save the key (/ceph-admin/.ssh/id_rsa):
+	Enter passphrase (empty for no passphrase):
+	Enter same passphrase again:
+	Your identification has been saved in /ceph-admin/.ssh/id_rsa.
+	Your public key has been saved in /ceph-admin/.ssh/id_rsa.pub.
+
+#. Copy the key to each Ceph Node, replacing ``{username}`` with the user name
+   you created with `Create a Ceph Deploy User`_. ::
+
+	ssh-copy-id {username}@node1
+	ssh-copy-id {username}@node2
+	ssh-copy-id {username}@node3
+
+#. (Recommended) Modify the ``~/.ssh/config`` file of your ``ceph-deploy``
+   admin node so that ``ceph-deploy`` can log in to Ceph nodes as the user you
+   created without requiring you to specify ``--username {username}`` each
+   time you execute ``ceph-deploy``. This has the added benefit of streamlining
+   ``ssh`` and ``scp`` usage. Replace ``{username}`` with the user name you
+   created::
+
+	Host node1
+	   Hostname node1
+	   User {username}
+	Host node2
+	   Hostname node2
+	   User {username}
+	Host node3
+	   Hostname node3
+	   User {username}
+
+
+Enable Networking On Bootup
+---------------------------
+
+Ceph OSDs peer with each other and report to Ceph Monitors over the network.
+If networking is ``off`` by default, the Ceph cluster cannot come online
+during bootup until you enable networking.
+
+The default configuration on some distributions (e.g., CentOS) has the
+networking interface(s) off by default. Ensure that, during boot up, your
+network interface(s) turn(s) on so that your Ceph daemons can communicate over
+the network. For example, on Red Hat and CentOS, navigate to
+``/etc/sysconfig/network-scripts`` and ensure that the  ``ifcfg-{iface}`` file
+has ``ONBOOT`` set to ``yes``.
+
+
+Ensure Connectivity
+-------------------
+
+Ensure connectivity using ``ping`` with short hostnames (``hostname -s``).
+Address hostname resolution issues as necessary.
+
+.. note:: Hostnames should resolve to a network IP address, not to the
+   loopback IP address (e.g., hostnames should resolve to an IP address other
+   than ``127.0.0.1``). If you use your admin node as a Ceph node, you
+   should also ensure that it resolves to its hostname and IP address
+   (i.e., not its loopback IP address).
+
+
+Open Required Ports
+-------------------
+
+Ceph Monitors communicate using port ``6789`` by default. Ceph OSDs communicate
+in a port range of ``6800:7300`` by default. See the `Network Configuration
+Reference`_ for details. Ceph OSDs can use multiple network connections to
+communicate with clients, monitors, other OSDs for replication, and other OSDs
+for heartbeats.
+
+On some distributions (e.g., RHEL), the default firewall configuration is fairly
+strict. You may need to adjust your firewall settings allow inbound requests so
+that clients in your network can communicate with daemons on your Ceph nodes.
+
+For ``firewalld`` on RHEL 7, add port ``6789`` for Ceph Monitor nodes and ports
+``6800:7300`` for Ceph OSDs to the public zone and ensure that you make the
+setting permanent so that it is enabled on reboot. For example::
+
+	sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent
+
+For ``iptables``, add port ``6789`` for Ceph Monitors and ports ``6800:7300``
+for Ceph OSDs. For example::
+
+	sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
+
+Once you have finished configuring ``iptables``, ensure that you make the
+changes persistent on each node so that they will be in effect when your nodes
+reboot. For example::
+
+	/sbin/service iptables save
+
+TTY
+---
+
+On CentOS and RHEL, you may receive an error while trying to execute
+``ceph-deploy`` commands. If ``requiretty`` is set by default on your Ceph
+nodes, disable it by executing ``sudo visudo`` and locate the ``Defaults
+requiretty`` setting. Change it to ``Defaults:ceph !requiretty`` or comment it
+out to ensure that ``ceph-deploy`` can connect using the user you created with
+`Create a Ceph Deploy User`_.
+
+.. note:: If editing, ``/etc/sudoers``, ensure that you use
+   ``sudo visudo`` rather than a text editor.
+
+
+SELinux
+-------
+
+On CentOS and RHEL, SELinux is set to ``Enforcing`` by default. To streamline your
+installation, we recommend setting SELinux to ``Permissive`` or disabling it
+entirely and ensuring that your installation and cluster are working properly
+before hardening your configuration. To set SELinux to ``Permissive``, execute the
+following::
+
+	sudo setenforce 0
+
+To configure SELinux persistently (recommended if SELinux is an issue), modify
+the configuration file at  ``/etc/selinux/config``.
+
+
+Priorities/Preferences
+----------------------
+
+Ensure that your package manager has priority/preferences packages installed and
+enabled. On CentOS, you may need to install EPEL. On RHEL, you may need to
+enable optional repositories. ::
+
+	sudo yum install yum-plugin-priorities
+
+For example, on RHEL 7 server, execute the following to install
+``yum-plugin-priorities`` and enable the  ``rhel-7-server-optional-rpms``
+repository::
+
+	sudo yum install yum-plugin-priorities --enablerepo=rhel-7-server-optional-rpms
+
+
+Summary
+=======
+
+This completes the Quick Start Preflight. Proceed to the `Storage Cluster
+Quick Start`_.
+
+.. _Storage Cluster Quick Start: ../quick-ceph-deploy
+.. _OS Recommendations: ../os-recommendations
+.. _Network Configuration Reference: ../../rados/configuration/network-config-ref
+.. _Clock: ../../rados/configuration/mon-config-ref#clock
+.. _NTP: http://www.ntp.org/
+.. _Infernalis release: ../../release-notes/#v9-1-0-infernalis-release-candidate
+.. _EPEL wiki: https://fedoraproject.org/wiki/EPEL
diff --git a/doc/start/rgw.conf b/doc/start/rgw.conf
new file mode 100644
index 0000000..e1bee99
--- /dev/null
+++ b/doc/start/rgw.conf
@@ -0,0 +1,30 @@
+FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock
+
+
+<VirtualHost *:80>
+
+	ServerName {fqdn}
+	<!--Remove the comment. Add a server alias with *.{fqdn} for S3 subdomains-->
+	<!--ServerAlias *.{fqdn}-->
+	ServerAdmin {email.address}
+	DocumentRoot /var/www
+	RewriteEngine On
+	RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=$1&params=$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+	<IfModule mod_fastcgi.c>
+   	<Directory /var/www>
+			Options +ExecCGI
+			AllowOverride All
+			SetHandler fastcgi-script
+			Order allow,deny
+			Allow from all
+			AuthBasicAuthoritative Off
+		</Directory>
+	</IfModule>
+
+	AllowEncodedSlashes On
+	ErrorLog /var/log/apache2/error.log
+	CustomLog /var/log/apache2/access.log combined
+	ServerSignature Off
+
+</VirtualHost>
\ No newline at end of file
diff --git a/install-sh b/install-sh
index 377bb86..59990a1 100755
--- a/install-sh
+++ b/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2011-11-20.07; # UTC
+scriptversion=2014-09-12.12; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='	'
 nl='
 '
-IFS=" ""	$nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,46 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-	shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-	shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-	# Protect names problematic for 'test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)	shift
-	break;;
+    --) shift
+        break;;
 
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -208,6 +204,15 @@ if test $# -eq 0; then
 fi
 
 if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
   do_exit='(exit $ret); exit $ret'
   trap "ret=129; $do_exit" 1
   trap "ret=130; $do_exit" 2
@@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -269,41 +274,15 @@ do
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -314,74 +293,81 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -391,53 +377,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -472,15 +456,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -493,24 +474,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
diff --git a/ltmain.sh b/ltmain.sh
index a356aca..147d758 100644
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,9 +1,12 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
 
-# libtool (GNU libtool) 2.4.2
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
@@ -23,881 +26,2112 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1"
-TIMESTAMP=""
-package_revision=1.3337
+VERSION="2.4.6 Debian-2.4.6-0.1"
+package_revision=2.4.6
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
 fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
 
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
 do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
 	fi"
 done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
 
-$lt_unset CDPATH
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
 
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
 
 
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
 
 : ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
 
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
 
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
 
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
 
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
 
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
 
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
 
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
 
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
 
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
 
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
 
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
 
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
 
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
 
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
 
-# Make sure we have an absolute path for reexecution:
+# Make sure we have an absolute progpath for reexecution:
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
-     progdir=$func_dirname_result
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
      progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
   *)
-     save_IFS="$IFS"
+     _G_IFS=$IFS
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
-       IFS="$save_IFS"
+       IFS=$_G_IFS
        test -x "$progdir/$progname" && break
      done
-     IFS="$save_IFS"
+     IFS=$_G_IFS
      test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
 
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
 
-# Standard options:
 opt_dry_run=false
-opt_help=false
 opt_quiet=false
 opt_verbose=false
-opt_warning=:
 
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
 
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
 
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
 
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
 
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
 
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
 
-    # bash bug again:
-    :
-}
 
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
 {
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset=''
+        tc_bold='';   tc_standout=''
+        tc_red='';   tc_green=''
+        tc_blue='';  tc_cyan=''
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
 
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
+    require_term_colors=:
 }
-help="Try \`$progname --help' for more information."  ## default
 
 
-# func_grep expression filename
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
+    $debug_cmd
+
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
-# func_mkdir_p directory-path
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
-    my_directory_path="$1"
-    my_dir_list=
+    $debug_cmd
 
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+    _G_directory_path=$1
+    _G_dir_list=
 
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
       esac
 
       # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
+      while test ! -d "$_G_directory_path"; do
         # ...make a list in topmost first order.  Use a colon delimited
 	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
+        _G_dir_list=$_G_directory_path:$_G_dir_list
 
         # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
+        case $_G_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
       done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
 
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
+        $MKDIR "$_G_dir" 2>/dev/null || :
       done
-      IFS="$save_mkdir_p_IFS"
+      IFS=$func_mkdir_p_IFS
 
       # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
     fi
 }
 
 
-# func_mktempdir [string]
+# func_mktempdir [BASENAME]
+# -------------------------
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
+# given, BASENAME is the basename for that directory.
 func_mktempdir ()
 {
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
 
-    if test "$opt_dry_run" = ":"; then
+    if test : = "$opt_dry_run"; then
       # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
+      _G_tmpdir=$_G_template-$$
     else
 
       # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
 
-      if test ! -d "$my_tmpdir"; then
+      if test ! -d "$_G_tmpdir"; then
         # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
 
-        save_mktempdir_umask=`umask`
+        func_mktempdir_umask=`umask`
         umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
     fi
 
-    $ECHO "$my_tmpdir"
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
+
+    case $1 in
+      *[\\\`\"]*)
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    esac
+
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        _G_arg=\"$_G_arg\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+    $debug_cmd
+
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
 }
 
 
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
 {
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
+    $debug_cmd
 
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
+
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
 }
 
 
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
 {
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
+    $debug_cmd
 
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
+    func_parse_options_result=
 
-    func_quote_for_expand_result="$my_arg"
-}
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
 
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
 
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
 }
 
 
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
 {
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+    $debug_cmd
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
+    func_run_hooks func_validate_options ${1+"$@"}
 
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
 }
 
 
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $opt_debug
 
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# / /
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
 
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
 {
-    $opt_debug
+    $debug_cmd
 
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
 }
 
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
 func_help ()
 {
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-	:print
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-	p
-	d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
 }
 
-# func_missing_arg argname
+
+# func_missing_arg ARGNAME
+# ------------------------
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
-    $opt_debug
+    $debug_cmd
 
-    func_error "missing argument for $1."
+    func_error "Missing argument for '$1'."
     exit_cmd=exit
 }
 
 
-# func_split_short_opt shortopt
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
 {
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+    $debug_cmd
 
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
 
 
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
 {
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
+    $debug_cmd
 
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
 
-exit_cmd=:
 
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
 
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
 
+    exit $?
+}
 
 
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
 
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
 
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
 {
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
+    $debug_cmd
 
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
+    _G_message=$*
 
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
 
-# func_arith arithmetic-term...
-func_arith ()
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
 {
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
+    $debug_cmd
 
+    $warning_func ${1+"$@"}
+}
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
 
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
 
-# func_lo2o object
-func_lo2o ()
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
 {
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname (GNU libtool) 2.4.6
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool at gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
 
 
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
 
 
-# func_fatal_configuration arg...
+# func_fatal_configuration ARG...
+# -------------------------------
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
 }
 
 
 # func_config
+# -----------
 # Display the configuration for all the tags in this script.
 func_config ()
 {
@@ -915,17 +2149,19 @@ func_config ()
     exit $?
 }
 
+
 # func_features
+# -------------
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       echo "enable static libraries"
     else
       echo "disable static libraries"
@@ -934,314 +2170,350 @@ func_features ()
     exit $?
 }
 
-# func_enable_tag tagname
+
+# func_enable_tag TAGNAME
+# -----------------------
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
-  # Global variable:
-  tagname="$1"
+    # Global variable:
+    tagname=$1
 
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
 
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
 
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
     *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
 }
 
+
 # func_check_version_match
+# ------------------------
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      else
-        cat >&2 <<_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
-    fi
+      fi
 
-    exit $EXIT_MISMATCH
-  fi
+      exit $EXIT_MISMATCH
+    fi
 }
 
 
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
 
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
 
+    nonopt=
+    preserve_args=
 
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
 
 
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
 {
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)	opt_debug='set -x'
-			func_echo "enabling shell trace mode"
-			$opt_debug
-			;;
-      --dry-run|--dryrun|-n)
-			opt_dry_run=:
-			;;
-      --config)
-			opt_config=:
-func_config
-			;;
-      --dlopen|-dlopen)
-			optarg="$1"
-			opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-			shift
-			;;
-      --preserve-dup-deps)
-			opt_preserve_dup_deps=:
-			;;
-      --features)
-			opt_features=:
-func_features
-			;;
-      --finish)
-			opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-			;;
-      --help)
-			opt_help=:
-			;;
-      --help-all)
-			opt_help_all=:
-opt_help=': help-all'
-			;;
-      --mode)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-			shift
-			;;
-      --no-silent|--no-quiet)
-			opt_silent=false
-func_append preserve_args " $opt"
-			;;
-      --no-warning|--no-warn)
-			opt_warning=false
-func_append preserve_args " $opt"
-			;;
-      --no-verbose)
-			opt_verbose=false
-func_append preserve_args " $opt"
-			;;
-      --silent|--quiet)
-			opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-			;;
-      --verbose|-v)
-			opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-			;;
-      --tag)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-			shift
-			;;
-
-      -\?|-h)		func_usage				;;
-      --help)		func_help				;;
-      --version)	func_version				;;
-
-      # Separate optargs to long options:
-      --*=*)
-			func_split_long_opt "$opt"
-			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-			func_split_short_opt "$opt"
-			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      --)		break					;;
-      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
-      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
-    esac
-  done
+    $debug_cmd
 
-  # Validate options:
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
 
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
 
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
 
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
 
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
 
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
     fi
 
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
 
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
 
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
 
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
 
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
 }
+func_add_hook func_validate_options libtool_validate_options
 
 
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
 
 
 ## ----------- ##
 ##    Main.    ##
 ## ----------- ##
 
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
 # func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
+# fatal anyway.  Works if 'file' does not exist.
 func_lalib_unsafe_p ()
 {
     lalib_p=no
@@ -1249,13 +2521,13 @@ func_lalib_unsafe_p ()
 	for lalib_p_l in 1 2 3 4
 	do
 	    read lalib_p_line
-	    case "$lalib_p_line" in
+	    case $lalib_p_line in
 		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
 	    esac
 	done
 	exec 0<&5 5<&-
     fi
-    test "$lalib_p" = yes
+    test yes = "$lalib_p"
 }
 
 # func_ltwrapper_script_p file
@@ -1264,7 +2536,8 @@ func_lalib_unsafe_p ()
 # determined imposters.
 func_ltwrapper_script_p ()
 {
-    func_lalib_p "$1"
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_ltwrapper_executable_p file
@@ -1289,7 +2562,7 @@ func_ltwrapper_scriptname ()
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
 }
 
 # func_ltwrapper_p file
@@ -1308,11 +2581,13 @@ func_ltwrapper_p ()
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
-    $opt_debug
+    $debug_cmd
+
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
-      IFS=$save_ifs
+      IFS=$sp$nl
       eval cmd=\"$cmd\"
+      IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
@@ -1324,10 +2599,11 @@ func_execute_cmds ()
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
+# 'FILE.' does not work on cygwin managed mounts.
 func_source ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $1 in
     */* | *\\*)	. "$1" ;;
     *)		. "./$1" ;;
@@ -1354,10 +2630,10 @@ func_resolve_sysroot ()
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
-  case "$lt_sysroot:$1" in
+  case $lt_sysroot:$1 in
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
+    func_replace_sysroot_result='='$func_stripname_result
     ;;
   *)
     # Including no sysroot.
@@ -1374,7 +2650,8 @@ func_replace_sysroot ()
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
-    $opt_debug
+    $debug_cmd
+
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
@@ -1393,7 +2670,7 @@ func_infer_tag ()
 	for z in $available_tags; do
 	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
 	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
 	    CC_quoted=
 	    for arg in $CC; do
 	      # Double-quote args containing other shell metacharacters.
@@ -1418,7 +2695,7 @@ func_infer_tag ()
 	# line option must be used.
 	if test -z "$tagname"; then
 	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
+	  func_fatal_error "specify a tag with '--tag'"
 #	else
 #	  func_verbose "using $tagname tagged configuration"
 	fi
@@ -1434,15 +2711,15 @@ func_infer_tag ()
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
     else
       write_lobj=none
     fi
 
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
     else
       write_oldobj=none
     fi
@@ -1450,7 +2727,7 @@ func_write_libtool_object ()
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -1462,7 +2739,7 @@ pic_object=$write_lobj
 non_pic_object=$write_oldobj
 
 EOF
-      $MV "${write_libobj}T" "${write_libobj}"
+      $MV "${write_libobj}T" "$write_libobj"
     }
 }
 
@@ -1482,8 +2759,9 @@ EOF
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
@@ -1491,9 +2769,9 @@ func_convert_core_file_wine_to_w32 ()
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
+        $SED -e "$sed_naive_backslashify"`
     else
       func_convert_core_file_wine_to_w32_result=
     fi
@@ -1514,18 +2792,19 @@ func_convert_core_file_wine_to_w32 ()
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
+  func_convert_core_path_wine_to_w32_result=
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
@@ -1554,7 +2833,8 @@ func_convert_core_path_wine_to_w32 ()
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
@@ -1563,7 +2843,7 @@ func_cygpath ()
     fi
   else
     func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
   fi
 }
 #end: func_cygpath
@@ -1574,10 +2854,11 @@ func_cygpath ()
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
 }
 #end: func_convert_core_msys_to_w32
 
@@ -1588,13 +2869,14 @@ func_convert_core_msys_to_w32 ()
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
     func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
+    func_error "  '$1'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
-    func_to_host_file_result="$1"
+    func_to_host_file_result=$1
   fi
 }
 # end func_convert_file_check
@@ -1606,10 +2888,11 @@ func_convert_file_check ()
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
+    func_error "  '$3'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
@@ -1618,7 +2901,7 @@ func_convert_path_check ()
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
-      func_to_host_path_result="$3"
+      func_to_host_path_result=$3
     fi
   fi
 }
@@ -1630,9 +2913,10 @@ func_convert_path_check ()
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
-  $opt_debug
+  $debug_cmd
+
   case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
     ;;
   esac
   case $4 in
@@ -1646,7 +2930,7 @@ func_convert_path_front_back_pathsep ()
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
-# invoked via `$to_host_file_cmd ARG'
+# invoked via '$to_host_file_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
@@ -1657,7 +2941,8 @@ func_convert_path_front_back_pathsep ()
 # in func_to_host_file_result.
 func_to_host_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
@@ -1669,7 +2954,8 @@ func_to_host_file ()
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
@@ -1687,7 +2973,7 @@ func_to_tool_file ()
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
-  func_to_host_file_result="$1"
+  func_to_host_file_result=$1
 }
 # end func_convert_file_noop
 
@@ -1698,11 +2984,12 @@ func_convert_file_noop ()
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1714,8 +3001,9 @@ func_convert_file_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
@@ -1731,11 +3019,12 @@ func_convert_file_cygwin_to_w32 ()
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1747,12 +3036,13 @@ func_convert_file_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1765,13 +3055,14 @@ func_convert_file_msys_to_cygwin ()
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1781,7 +3072,7 @@ func_convert_file_nix_to_cygwin ()
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
-# invoked via `$to_host_path_cmd ARG'
+# invoked via '$to_host_path_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
@@ -1805,10 +3096,11 @@ func_convert_file_nix_to_cygwin ()
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
   fi
 }
 
@@ -1818,7 +3110,8 @@ func_init_to_host_path_cmd ()
 # in func_to_host_path_result.
 func_to_host_path ()
 {
-  $opt_debug
+  $debug_cmd
+
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
@@ -1829,7 +3122,7 @@ func_to_host_path ()
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
-  func_to_host_path_result="$1"
+  func_to_host_path_result=$1
 }
 # end func_convert_path_noop
 
@@ -1840,8 +3133,9 @@ func_convert_path_noop ()
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
@@ -1849,7 +3143,7 @@ func_convert_path_msys_to_w32 ()
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1863,8 +3157,9 @@ func_convert_path_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
@@ -1883,14 +3178,15 @@ func_convert_path_cygwin_to_w32 ()
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1904,15 +3200,16 @@ func_convert_path_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1927,8 +3224,9 @@ func_convert_path_msys_to_cygwin ()
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
@@ -1937,7 +3235,7 @@ func_convert_path_nix_to_cygwin ()
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1946,13 +3244,31 @@ func_convert_path_nix_to_cygwin ()
 # end func_convert_path_nix_to_cygwin
 
 
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
 # func_mode_compile arg...
 func_mode_compile ()
 {
-    $opt_debug
+    $debug_cmd
+
     # Get the compilation command and the source file.
     base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
@@ -1965,12 +3281,12 @@ func_mode_compile ()
       case $arg_mode in
       arg  )
 	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
+	lastarg=$arg
 	arg_mode=normal
 	;;
 
       target )
-	libobj="$arg"
+	libobj=$arg
 	arg_mode=normal
 	continue
 	;;
@@ -1980,7 +3296,7 @@ func_mode_compile ()
 	case $arg in
 	-o)
 	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
+	    func_fatal_error "you cannot specify '-o' more than once"
 	  arg_mode=target
 	  continue
 	  ;;
@@ -2009,12 +3325,12 @@ func_mode_compile ()
 	  func_stripname '-Wc,' '' "$arg"
 	  args=$func_stripname_result
 	  lastarg=
-	  save_ifs="$IFS"; IFS=','
+	  save_ifs=$IFS; IFS=,
 	  for arg in $args; do
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 	    func_append_quoted lastarg "$arg"
 	  done
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
 	  func_stripname ' ' '' "$lastarg"
 	  lastarg=$func_stripname_result
 
@@ -2027,8 +3343,8 @@ func_mode_compile ()
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
+	  lastarg=$srcfile
+	  srcfile=$arg
 	  ;;
 	esac  #  case $arg
 	;;
@@ -2043,13 +3359,13 @@ func_mode_compile ()
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      func_fatal_error "you must specify a target with \`-o'"
+      func_fatal_error "you must specify a target with '-o'"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
 	func_basename "$srcfile"
-	libobj="$func_basename_result"
+	libobj=$func_basename_result
       }
       ;;
     esac
@@ -2069,7 +3385,7 @@ func_mode_compile ()
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      func_fatal_error "cannot determine name of library object from '$libobj'"
       ;;
     esac
 
@@ -2078,8 +3394,8 @@ func_mode_compile ()
     for arg in $later; do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	continue
 	;;
@@ -2105,17 +3421,17 @@ func_mode_compile ()
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
@@ -2127,16 +3443,16 @@ func_mode_compile ()
       pic_mode=default
       ;;
     esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
     else
       output_obj=
       need_locks=no
@@ -2145,12 +3461,12 @@ func_mode_compile ()
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
+    if test yes = "$need_locks"; then
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
-    elif test "$need_locks" = warn; then
+    elif test warn = "$need_locks"; then
       if test -f "$lockfile"; then
 	$ECHO "\
 *** ERROR, $lockfile exists and contains:
@@ -2158,7 +3474,7 @@ func_mode_compile ()
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2180,11 +3496,11 @@ compiler."
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
-      if test "$pic_mode" != no; then
+      if test no != "$pic_mode"; then
 	command="$base_compile $qsrcfile $pic_flag"
       else
 	# Don't build PIC code
@@ -2201,7 +3517,7 @@ compiler."
       func_show_eval_locale "$command"	\
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2212,7 +3528,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2228,20 +3544,20 @@ compiler."
       fi
 
       # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
+      if test yes = "$suppress_opt"; then
 	suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
 	# Don't build PIC code
 	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
-      if test "$compiler_c_o" = yes; then
+      if test yes = "$compiler_c_o"; then
 	func_append command " -o $obj"
       fi
 
@@ -2250,7 +3566,7 @@ compiler."
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2261,7 +3577,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2281,7 +3597,7 @@ compiler."
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
+      if test no != "$need_locks"; then
 	removelist=$lockfile
         $RM "$lockfile"
       fi
@@ -2291,7 +3607,7 @@ compiler."
 }
 
 $opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
@@ -2311,7 +3627,7 @@ func_mode_help ()
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
@@ -2330,16 +3646,16 @@ This mode accepts the following additional options:
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
   -Wc,FLAG          pass FLAG directly to the compiler
 
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
         ;;
 
       execute)
@@ -2352,7 +3668,7 @@ This mode accepts the following additional options:
 
   -dlopen FILE      add the directory containing FILE to the library path
 
-This mode sets the library path environment variable according to \`-dlopen'
+This mode sets the library path environment variable according to '-dlopen'
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
@@ -2371,7 +3687,7 @@ Complete the installation of libtool libraries.
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
+the '--dry-run' option if you just want to see what would be executed."
         ;;
 
       install)
@@ -2381,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed."
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
+either the 'install' or 'cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
@@ -2407,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially:
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
@@ -2421,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially:
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
@@ -2441,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially:
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
-All other options (arguments beginning with \`-') are ignored.
+All other options (arguments beginning with '-') are ignored.
 
-Every other argument is treated as a filename.  Files ending in \`.la' are
+Every other argument is treated as a filename.  Files ending in '.la' are
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
 required, except when creating a convenience library.
 
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
 
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
 is created, otherwise an executable program is created."
         ;;
 
@@ -2465,7 +3782,7 @@ is created, otherwise an executable program is created."
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
@@ -2473,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
+        func_fatal_help "invalid operation mode '$opt_mode'"
         ;;
     esac
 
     echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
+    $ECHO "Try '$progname --help' for more information about other modes."
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
-  if test "$opt_help" = :; then
+  if test : = "$opt_help"; then
     func_mode_help
   else
     {
@@ -2491,7 +3808,7 @@ if $opt_help; then
       for opt_mode in compile link execute install finish uninstall clean; do
 	func_mode_help
       done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
@@ -2499,7 +3816,7 @@ if $opt_help; then
 	func_mode_help
       done
     } |
-    sed '1d
+    $SED '1d
       /^When reporting/,/^Report/{
 	H
 	d
@@ -2516,16 +3833,17 @@ fi
 # func_mode_execute arg...
 func_mode_execute ()
 {
-    $opt_debug
+    $debug_cmd
+
     # The first argument is the command name.
-    cmd="$nonopt"
+    cmd=$nonopt
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
+	|| func_fatal_help "'$file' is not a file"
 
       dir=
       case $file in
@@ -2535,7 +3853,7 @@ func_mode_execute ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
 
 	# Read the libtool library.
 	dlname=
@@ -2546,18 +3864,18 @@ func_mode_execute ()
 	if test -z "$dlname"; then
 	  # Warn if it was a shared library.
 	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	    func_warning "'$file' was not linked with '-export-dynamic'"
 	  continue
 	fi
 
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 
 	if test -f "$dir/$objdir/$dlname"; then
 	  func_append dir "/$objdir"
 	else
 	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
 	  fi
 	fi
 	;;
@@ -2565,18 +3883,18 @@ func_mode_execute ()
       *.lo)
 	# Just add the directory containing the .lo file.
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	;;
 
       *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+      test -n "$absdir" && dir=$absdir
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
@@ -2588,7 +3906,7 @@ func_mode_execute ()
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
-    libtool_execute_magic="$magic"
+    libtool_execute_magic=$magic
 
     # Check if any of the arguments is a wrapper script.
     args=
@@ -2601,12 +3919,12 @@ func_mode_execute ()
 	if func_ltwrapper_script_p "$file"; then
 	  func_source "$file"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	elif func_ltwrapper_executable_p "$file"; then
 	  func_ltwrapper_scriptname "$file"
 	  func_source "$func_ltwrapper_scriptname_result"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	fi
 	;;
       esac
@@ -2614,7 +3932,15 @@ func_mode_execute ()
       func_append_quoted args "$file"
     done
 
-    if test "X$opt_dry_run" = Xfalse; then
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
       if test -n "$shlibpath_var"; then
 	# Export the shlibpath_var.
 	eval "export $shlibpath_var"
@@ -2631,25 +3957,18 @@ func_mode_execute ()
       done
 
       # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
+      exec_cmd=\$cmd$args
     fi
 }
 
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
-    $opt_debug
+    $debug_cmd
+
     libs=
     libdirs=
     admincmds=
@@ -2663,11 +3982,11 @@ func_mode_finish ()
 	if func_lalib_unsafe_p "$opt"; then
 	  func_append libs " $opt"
 	else
-	  func_warning "\`$opt' is not a valid libtool archive"
+	  func_warning "'$opt' is not a valid libtool archive"
 	fi
 
       else
-	func_fatal_error "invalid argument \`$opt'"
+	func_fatal_error "invalid argument '$opt'"
       fi
     done
 
@@ -2682,12 +4001,12 @@ func_mode_finish ()
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
-	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
 	    > $tmpdir/tmp-la
 	  mv -f $tmpdir/tmp-la $lib
 	done
@@ -2712,7 +4031,7 @@ func_mode_finish ()
     fi
 
     # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
+    $opt_quiet && exit $EXIT_SUCCESS
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
@@ -2723,27 +4042,27 @@ func_mode_finish ()
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
-	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
 	echo "     during execution"
       fi
       if test -n "$runpath_var"; then
-	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
 	echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
 	libdir=LIBDIR
 	eval flag=\"$hardcode_libdir_flag_spec\"
 
-	$ECHO "   - use the \`$flag' linker flag"
+	$ECHO "   - use the '$flag' linker flag"
       fi
       if test -n "$admincmds"; then
 	$ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
-	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
       fi
       echo
 
@@ -2762,18 +4081,20 @@ func_mode_finish ()
     exit $EXIT_SUCCESS
 }
 
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
-    $opt_debug
+    $debug_cmd
+
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
        # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
@@ -2800,7 +4121,7 @@ func_mode_install ()
     opts=
     prev=
     install_type=
-    isdir=no
+    isdir=false
     stripme=
     no_mode=:
     for arg
@@ -2813,7 +4134,7 @@ func_mode_install ()
       fi
 
       case $arg in
-      -d) isdir=yes ;;
+      -d) isdir=: ;;
       -f)
 	if $install_cp; then :; else
 	  prev=$arg
@@ -2831,7 +4152,7 @@ func_mode_install ()
       *)
 	# If the previous option needed an argument, then skip it.
 	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
 	    arg2=$install_override_mode
 	    no_mode=false
 	  fi
@@ -2856,7 +4177,7 @@ func_mode_install ()
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
+      func_fatal_help "the '$prev' option requires an argument"
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
@@ -2878,19 +4199,19 @@ func_mode_install ()
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
+      destdir=$func_dirname_result
+      destname=$func_basename_result
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
+	func_fatal_help "'$dest' is not a directory"
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -2899,7 +4220,7 @@ func_mode_install ()
 	case $file in
 	*.lo) ;;
 	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  func_fatal_help "'$destdir' must be an absolute directory name"
 	  ;;
 	esac
       done
@@ -2908,7 +4229,7 @@ func_mode_install ()
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     staticlibs=
     future_libdirs=
@@ -2928,7 +4249,7 @@ func_mode_install ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
+	  || func_fatal_help "'$file' is not a valid libtool archive"
 
 	library_names=
 	old_library=
@@ -2950,7 +4271,7 @@ func_mode_install ()
 	fi
 
 	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	func_append dir "$objdir"
 
 	if test -n "$relink_command"; then
@@ -2964,7 +4285,7 @@ func_mode_install ()
 	  # are installed into $libdir/../bin (currently, that works fine)
 	  # but it's something to keep an eye on.
 	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
 
 	  if test -n "$inst_prefix_dir"; then
 	    # Stick the inst_prefix_dir data into the link command.
@@ -2973,29 +4294,36 @@ func_mode_install ()
 	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
 	  fi
 
-	  func_warning "relinking \`$file'"
+	  func_warning "relinking '$file'"
 	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
 	fi
 
 	# See the names of the shared library.
 	set dummy $library_names; shift
 	if test -n "$1"; then
-	  realname="$1"
+	  realname=$1
 	  shift
 
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
 
 	  # Install the shared library and build the symlinks.
 	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
 	      'exit $?'
-	  tstripme="$stripme"
+	  tstripme=$stripme
 	  case $host_os in
 	  cygwin* | mingw* | pw32* | cegcc*)
 	    case $realname in
 	    *.dll.a)
-	      tstripme=""
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
 	      ;;
 	    esac
 	    ;;
@@ -3006,7 +4334,7 @@ func_mode_install ()
 
 	  if test "$#" -gt 0; then
 	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
 	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
 	    # so we also need to try rm && ln -s.
 	    for linkname
@@ -3017,14 +4345,14 @@ func_mode_install ()
 	  fi
 
 	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
+	  lib=$destdir/$realname
 	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
 	# Install the pseudo-library for information purposes.
 	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
+	name=$func_basename_result
+	instname=$dir/${name}i
 	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
 	# Maybe install the static library, too.
@@ -3036,11 +4364,11 @@ func_mode_install ()
 
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# Deduce the name of the destination old-style object file.
@@ -3050,11 +4378,11 @@ func_mode_install ()
 	  staticdest=$func_lo2o_result
 	  ;;
 	*.$objext)
-	  staticdest="$destfile"
+	  staticdest=$destfile
 	  destfile=
 	  ;;
 	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
 	  ;;
 	esac
 
@@ -3063,7 +4391,7 @@ func_mode_install ()
 	  func_show_eval "$install_prog $file $destfile" 'exit $?'
 
 	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
+	if test yes = "$build_old_libs"; then
 	  # Deduce the name of the old-style object file.
 	  func_lo2o "$file"
 	  staticobj=$func_lo2o_result
@@ -3075,23 +4403,23 @@ func_mode_install ()
       *)
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# If the file is missing, and there is a .exe on the end, strip it
 	# because it is most likely a libtool script we actually want to
 	# install
-	stripped_ext=""
+	stripped_ext=
 	case $file in
 	  *.exe)
 	    if test ! -f "$file"; then
 	      func_stripname '' '.exe' "$file"
 	      file=$func_stripname_result
-	      stripped_ext=".exe"
+	      stripped_ext=.exe
 	    fi
 	    ;;
 	esac
@@ -3119,19 +4447,19 @@ func_mode_install ()
 
 	  # Check the variables that should have been set.
 	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
 
-	  finalize=yes
+	  finalize=:
 	  for lib in $notinst_deplibs; do
 	    # Check to see that each library is installed.
 	    libdir=
 	    if test -f "$lib"; then
 	      func_source "$lib"
 	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
 	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
 	    fi
 	  done
 
@@ -3139,29 +4467,29 @@ func_mode_install ()
 	  func_source "$wrapper"
 
 	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
+	  if test no = "$fast_install" && test -n "$relink_command"; then
 	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
+	      if $finalize; then
 	        tmpdir=`func_mktempdir`
 		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
 	        # Replace the output file specification.
 	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
-	        $opt_silent || {
+	        $opt_quiet || {
 	          func_quote_for_expand "$relink_command"
 		  eval "func_echo $func_quote_for_expand_result"
 	        }
 	        if eval "$relink_command"; then :
 	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
+		  func_error "error: relink '$file' with the above command before installing it"
 		  $opt_dry_run || ${RM}r "$tmpdir"
 		  continue
 	        fi
-	        file="$outputname"
+	        file=$outputname
 	      else
-	        func_warning "cannot relink \`$file'"
+	        func_warning "cannot relink '$file'"
 	      fi
 	    }
 	  else
@@ -3198,10 +4526,10 @@ func_mode_install ()
 
     for file in $staticlibs; do
       func_basename "$file"
-      name="$func_basename_result"
+      name=$func_basename_result
 
       # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      oldlib=$destdir/$name
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
@@ -3216,18 +4544,18 @@ func_mode_install ()
     done
 
     test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
+      func_warning "remember to run '$progname --finish$future_libdirs'"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
     else
       exit $EXIT_SUCCESS
     fi
 }
 
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
@@ -3235,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"}
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
     my_dlsyms=
 
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
+	my_dlsyms=${my_outputname}S.c
       else
 	func_error "not configured to extract global symbols from dlpreopened files"
       fi
@@ -3255,7 +4584,7 @@ func_generate_dlsyms ()
       "") ;;
       *.c)
 	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
+	nlist=$output_objdir/$my_outputname.nm
 
 	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
@@ -3263,34 +4592,36 @@ func_generate_dlsyms ()
 	func_verbose "creating $output_objdir/$my_dlsyms"
 
 	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* External symbol declarations for the compiler. */\
 "
 
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
 
 	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
@@ -3298,7 +4629,7 @@ extern \"C\" {
 	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	  for progfile in $progfiles; do
 	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
 	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
 	  done
 
@@ -3318,10 +4649,10 @@ extern \"C\" {
 
 	  # Prepare the list of exported symbols
 	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
+	    export_symbols=$output_objdir/$outputname.exp
 	    $opt_dry_run || {
 	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
 	      case $host in
 	      *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
@@ -3331,7 +4662,7 @@ extern \"C\" {
 	    }
 	  else
 	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
 	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	      case $host in
@@ -3345,22 +4676,22 @@ extern \"C\" {
 	fi
 
 	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_verbose "extracting global C symbols from '$dlprefile'"
 	  func_basename "$dlprefile"
-	  name="$func_basename_result"
+	  name=$func_basename_result
           case $host in
 	    *cygwin* | *mingw* | *cegcc* )
 	      # if an import library, we need to obtain dlname
 	      if func_win32_import_lib_p "$dlprefile"; then
 	        func_tr_sh "$dlprefile"
 	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
-	        dlprefile_dlbasename=""
+	        dlprefile_dlbasename=
 	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
 	          # Use subshell, to avoid clobbering current variable values
 	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-	          if test -n "$dlprefile_dlname" ; then
+	          if test -n "$dlprefile_dlname"; then
 	            func_basename "$dlprefile_dlname"
-	            dlprefile_dlbasename="$func_basename_result"
+	            dlprefile_dlbasename=$func_basename_result
 	          else
 	            # no lafile. user explicitly requested -dlpreopen <import library>.
 	            $sharedlib_from_linklib_cmd "$dlprefile"
@@ -3368,7 +4699,7 @@ extern \"C\" {
 	          fi
 	        fi
 	        $opt_dry_run || {
-	          if test -n "$dlprefile_dlbasename" ; then
+	          if test -n "$dlprefile_dlbasename"; then
 	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
 	          else
 	            func_warning "Could not compute DLL name from $name"
@@ -3424,6 +4755,11 @@ extern \"C\" {
 	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
 
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
 	  echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
@@ -3432,11 +4768,30 @@ typedef struct {
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
 
 	  case $need_lib_prefix in
 	  no)
@@ -3478,9 +4833,7 @@ static const void *lt_preloaded_setup() {
 	  *-*-hpux*)
 	    pic_flag_for_symtable=" $pic_flag"  ;;
 	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
 	    ;;
 	  esac
 	  ;;
@@ -3497,10 +4850,10 @@ static const void *lt_preloaded_setup() {
 	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
 	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
 
 	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	symfileobj=$output_objdir/${my_outputname}S.$objext
 	case $host in
 	*cygwin* | *mingw* | *cegcc* )
 	  if test -f "$output_objdir/$my_outputname.def"; then
@@ -3518,7 +4871,7 @@ static const void *lt_preloaded_setup() {
 	esac
 	;;
       *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
 	;;
       esac
     else
@@ -3532,6 +4885,32 @@ static const void *lt_preloaded_setup() {
     fi
 }
 
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
@@ -3541,8 +4920,9 @@ static const void *lt_preloaded_setup() {
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
-  $opt_debug
-  win32_libid_type="unknown"
+  $debug_cmd
+
+  win32_libid_type=unknown
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
@@ -3552,16 +4932,29 @@ func_win32_libid ()
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-	$SED -n -e '
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
 	    1,100{
 		/ I /{
-		    s,.*,import,
+		    s|.*|import|
 		    p
 		    q
 		}
 	    }'`
+	;;
+      esac
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
@@ -3593,7 +4986,8 @@ func_win32_libid ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
-  $opt_debug
+  $debug_cmd
+
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
@@ -3610,7 +5004,8 @@ func_cygming_dll_for_implib ()
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
-  $opt_debug
+  $debug_cmd
+
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
@@ -3646,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core ()
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
@@ -3658,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core ()
     $SED -e '/^\./d;/^.\./d;q'
 }
 
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
@@ -3695,16 +5066,17 @@ func_cygming_ms_implib_p ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
+  elif func_cygming_ms_implib_p "$1"; then
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
-    sharedlib_from_linklib_result=""
+    sharedlib_from_linklib_result=
   fi
 }
 
@@ -3712,10 +5084,11 @@ func_cygming_dll_for_implib_fallback ()
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
@@ -3724,7 +5097,7 @@ func_extract_an_archive ()
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
 		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
+    if test yes = "$lock_old_archive_extraction"; then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
@@ -3738,22 +5111,23 @@ func_extract_an_archive ()
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
-    $opt_debug
-    my_gentop="$1"; shift
+    $debug_cmd
+
+    my_gentop=$1; shift
     my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
 	*) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
+      my_xlib=$func_basename_result
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
@@ -3765,7 +5139,7 @@ func_extract_archives ()
 	esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
 
       func_mkdir_p "$my_xdir"
 
@@ -3778,22 +5152,23 @@ func_extract_archives ()
 	  cd $my_xdir || exit $?
 	  darwin_archive=$my_xabs
 	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
 	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
 	  if test -n "$darwin_arches"; then
 	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
 	    darwin_arch=
 	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
 	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
 	    done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
 	    darwin_file=
 	    darwin_files=
 	    for darwin_file in $darwin_filelist; do
@@ -3815,7 +5190,7 @@ func_extract_archives ()
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
-    func_extract_archives_result="$my_oldobjs"
+    func_extract_archives_result=$my_oldobjs
 }
 
 
@@ -3830,7 +5205,7 @@ func_extract_archives ()
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
+# will assume that the directory where it is stored is
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
@@ -3841,7 +5216,7 @@ func_emit_wrapper ()
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
@@ -3898,9 +5273,9 @@ _LTECHO_EOF'
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
+# /script/ and the wrapper /executable/ that is used only on
 # windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
+# (application programs are unlikely to have options that match
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
@@ -3933,7 +5308,7 @@ func_parse_lt_options ()
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
   fi
 }
 
@@ -3944,7 +5319,7 @@ func_lt_dump_args ()
   lt_dump_args_N=1;
   for lt_arg
   do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
@@ -3958,7 +5333,7 @@ func_exec_program_core ()
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
@@ -3968,7 +5343,7 @@ func_exec_program_core ()
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
@@ -4043,13 +5418,13 @@ func_exec_program ()
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
-	if test "$fast_install" = yes; then
+	if test yes = "$fast_install"; then
 	  $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
@@ -4066,7 +5441,7 @@ func_exec_program ()
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
-	$ECHO \"\$relink_command_output\" >&2
+	\$ECHO \"\$relink_command_output\" >&2
 	$RM \"\$progdir/\$file\"
 	exit 1
       fi
@@ -4101,7 +5476,7 @@ func_exec_program ()
 	fi
 
 	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
 	  $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
@@ -4121,7 +5496,7 @@ func_exec_program ()
     fi
   else
     # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
@@ -4140,7 +5515,7 @@ func_emit_cwrapperexe_src ()
 	cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
@@ -4175,47 +5550,45 @@ EOF
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
+#if defined __MINGW32__
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
-/* #elif defined (other platforms) ... */
+/* #elif defined other_platform || defined ... */
 #endif
 
 /* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
+#if defined _MSC_VER
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
+#elif defined __MINGW32__
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
+/* #elif defined other platforms ... */
 #endif
 
-#if defined(PATH_MAX)
+#if defined PATH_MAX
 # define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
+#elif defined MAXPATHLEN
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
@@ -4234,8 +5607,8 @@ int setenv (const char *, const char *, int);
 # define PATH_SEPARATOR ':'
 #endif
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
@@ -4268,10 +5641,10 @@ int setenv (const char *, const char *, int);
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
+  if (stale) { free (stale); stale = 0; } \
 } while (0)
 
-#if defined(LT_DEBUGWRAPPER)
+#if defined LT_DEBUGWRAPPER
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
@@ -4300,11 +5673,16 @@ void lt_dump_script (FILE *f);
 EOF
 
 	    cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
               func_to_host_path "$temp_rpath"
 	      cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
@@ -4328,7 +5706,7 @@ const char * EXE_PATH_VALUE   = "";
 EOF
 	    fi
 
-	    if test "$fast_install" = yes; then
+	    if test yes = "$fast_install"; then
 	      cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
@@ -4357,12 +5735,12 @@ main (int argc, char *argv[])
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
-  intptr_t rval = 127;
+  int rval = 127;
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
+  newargz = XMALLOC (char *, (size_t) argc + 1);
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
@@ -4371,10 +5749,10 @@ main (int argc, char *argv[])
   newargc=0;
   for (i = 1; i < argc; i++)
     {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
+      if (STREQ (argv[i], dumpscript_opt))
 	{
 EOF
-	    case "$host" in
+	    case $host in
 	      *mingw* | *cygwin* )
 		# make stdout use "unix" line endings
 		echo "          setmode(1,_O_BINARY);"
@@ -4385,12 +5763,12 @@ EOF
 	  lt_dump_script (stdout);
 	  return 0;
 	}
-      if (strcmp (argv[i], debug_opt) == 0)
+      if (STREQ (argv[i], debug_opt))
 	{
           lt_debug = 1;
           continue;
 	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+      if (STREQ (argv[i], ltwrapper_option_prefix))
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
@@ -4413,7 +5791,7 @@ EOF
 EOF
 	    cat <<EOF
   /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
 EOF
 	    cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
@@ -4524,7 +5902,7 @@ EOF
 		cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
@@ -4569,7 +5947,7 @@ base_name (const char *name)
 {
   const char *base;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
@@ -4628,7 +6006,7 @@ find_executable (const char *wrapper)
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
-  int tmp_len;
+  size_t tmp_len;
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
@@ -4638,7 +6016,7 @@ find_executable (const char *wrapper)
     return NULL;
 
   /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
@@ -4656,7 +6034,7 @@ find_executable (const char *wrapper)
 	    return concat_name;
 	  XFREE (concat_name);
 	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
     }
 #endif
 
@@ -4679,7 +6057,7 @@ find_executable (const char *wrapper)
 	      for (q = p; *q; q++)
 		if (IS_PATH_SEPARATOR (*q))
 		  break;
-	      p_len = q - p;
+	      p_len = (size_t) (q - p);
 	      p_next = (*q == '\0' ? q : q + 1);
 	      if (p_len == 0)
 		{
@@ -4798,7 +6176,7 @@ strendzap (char *str, const char *pat)
   if (patlen <= len)
     {
       str += len - patlen;
-      if (strcmp (str, pat) == 0)
+      if (STREQ (str, pat))
 	*str = '\0';
     }
   return str;
@@ -4863,7 +6241,7 @@ lt_setenv (const char *name, const char *value)
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
-    int len = strlen (name) + 1 + strlen (value) + 1;
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
@@ -4880,8 +6258,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
   char *new_value;
   if (orig_value && *orig_value)
     {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
@@ -4912,10 +6290,10 @@ lt_update_exe_path (const char *name, const char *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
         {
-          new_value[len-1] = '\0';
+          new_value[--len] = '\0';
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
@@ -5082,27 +6460,47 @@ EOF
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
-    $opt_debug
+    $debug_cmd
+
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
 # func_mode_link arg...
 func_mode_link ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
+      # what system we are compiling for in order to pass an extra
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
+      # to make a dll that has undefined symbols, in which case not
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
@@ -5146,10 +6544,11 @@ func_mode_link ()
     module=no
     no_install=no
     objs=
+    os2dllname=
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
-    preload=no
+    preload=false
     prev=
     prevarg=
     release=
@@ -5161,7 +6560,7 @@ func_mode_link ()
     vinfo=
     vinfo_number=no
     weak_libs=
-    single_module="${wl}-single_module"
+    single_module=$wl-single_module
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
@@ -5169,15 +6568,15 @@ func_mode_link ()
     do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	break
 	;;
       -all-static | -static | -static-libtool-libs)
 	case $arg in
 	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
 	    func_warning "complete static linking is impossible in this configuration"
 	  fi
 	  if test -n "$link_static_flag"; then
@@ -5210,7 +6609,7 @@ func_mode_link ()
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
-      arg="$1"
+      arg=$1
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
@@ -5227,21 +6626,21 @@ func_mode_link ()
 
 	case $prev in
 	bindir)
-	  bindir="$arg"
+	  bindir=$arg
 	  prev=
 	  continue
 	  ;;
 	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
+	  $preload || {
 	    # Add the symbol object into the linking commands.
 	    func_append compile_command " @SYMFILE@"
 	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
+	    preload=:
+	  }
 	  case $arg in
 	  *.la | *.lo) ;;  # We handle these cases below.
 	  force)
-	    if test "$dlself" = no; then
+	    if test no = "$dlself"; then
 	      dlself=needless
 	      export_dynamic=yes
 	    fi
@@ -5249,9 +6648,9 @@ func_mode_link ()
 	    continue
 	    ;;
 	  self)
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
 	      dlself=yes
 	    else
 	      dlself=needless
@@ -5261,7 +6660,7 @@ func_mode_link ()
 	    continue
 	    ;;
 	  *)
-	    if test "$prev" = dlfiles; then
+	    if test dlfiles = "$prev"; then
 	      func_append dlfiles " $arg"
 	    else
 	      func_append dlprefiles " $arg"
@@ -5272,14 +6671,14 @@ func_mode_link ()
 	  esac
 	  ;;
 	expsyms)
-	  export_symbols="$arg"
+	  export_symbols=$arg
 	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
+	    || func_fatal_error "symbol file '$arg' does not exist"
 	  prev=
 	  continue
 	  ;;
 	expsyms_regex)
-	  export_symbols_regex="$arg"
+	  export_symbols_regex=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5297,7 +6696,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	inst_prefix)
-	  inst_prefix_dir="$arg"
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
 	  prev=
 	  continue
 	  ;;
@@ -5321,21 +6726,21 @@ func_mode_link ()
 
 		if test -z "$pic_object" ||
 		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
 		fi
 
 		# Extract subdirectory from the argument.
 		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
+		xdir=$func_dirname_result
 
-		if test "$pic_object" != none; then
+		if test none != "$pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
+		  pic_object=$xdir$pic_object
 
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		      func_append dlfiles " $pic_object"
 		      prev=
 		      continue
@@ -5346,7 +6751,7 @@ func_mode_link ()
 		  fi
 
 		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
+		  if test dlprefiles = "$prev"; then
 		    # Preload the old-style object.
 		    func_append dlprefiles " $pic_object"
 		    prev=
@@ -5354,23 +6759,23 @@ func_mode_link ()
 
 		  # A PIC object.
 		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
+		  arg=$pic_object
 		fi
 
 		# Non-PIC object.
-		if test "$non_pic_object" != none; then
+		if test none != "$non_pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
+		  non_pic_object=$xdir$non_pic_object
 
 		  # A standard non-PIC object
 		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
 		  fi
 		else
 		  # If the PIC object exists, use it instead.
 		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
+		  non_pic_object=$pic_object
 		  func_append non_pic_objects " $non_pic_object"
 		fi
 	      else
@@ -5378,7 +6783,7 @@ func_mode_link ()
 		if $opt_dry_run; then
 		  # Extract subdirectory from the argument.
 		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
+		  xdir=$func_dirname_result
 
 		  func_lo2o "$arg"
 		  pic_object=$xdir$objdir/$func_lo2o_result
@@ -5386,24 +6791,29 @@ func_mode_link ()
 		  func_append libobjs " $pic_object"
 		  func_append non_pic_objects " $non_pic_object"
 	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
+		  func_fatal_error "'$arg' is not a valid libtool object"
 		fi
 	      fi
 	    done
 	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
+	    func_fatal_error "link input file '$arg' does not exist"
 	  fi
 	  arg=$save_arg
 	  prev=
 	  continue
 	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
 	precious_regex)
-	  precious_files_regex="$arg"
+	  precious_files_regex=$arg
 	  prev=
 	  continue
 	  ;;
 	release)
-	  release="-$arg"
+	  release=-$arg
 	  prev=
 	  continue
 	  ;;
@@ -5415,7 +6825,7 @@ func_mode_link ()
 	    func_fatal_error "only absolute run-paths are allowed"
 	    ;;
 	  esac
-	  if test "$prev" = rpath; then
+	  if test rpath = "$prev"; then
 	    case "$rpath " in
 	    *" $arg "*) ;;
 	    *) func_append rpath " $arg" ;;
@@ -5430,7 +6840,7 @@ func_mode_link ()
 	  continue
 	  ;;
 	shrext)
-	  shrext_cmds="$arg"
+	  shrext_cmds=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5470,7 +6880,7 @@ func_mode_link ()
 	esac
       fi # test -n "$prev"
 
-      prevarg="$arg"
+      prevarg=$arg
 
       case $arg in
       -all-static)
@@ -5484,7 +6894,7 @@ func_mode_link ()
 
       -allow-undefined)
 	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
 	;;
 
       -avoid-version)
@@ -5516,7 +6926,7 @@ func_mode_link ()
 	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
 	  func_fatal_error "more than one -exported-symbols argument is not allowed"
 	fi
-	if test "X$arg" = "X-export-symbols"; then
+	if test X-export-symbols = "X$arg"; then
 	  prev=expsyms
 	else
 	  prev=expsyms_regex
@@ -5550,9 +6960,9 @@ func_mode_link ()
 	func_stripname "-L" '' "$arg"
 	if test -z "$func_stripname_result"; then
 	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
+	    func_fatal_error "require no space between '-L' and '$1'"
 	  else
-	    func_fatal_error "need path for \`-L' option"
+	    func_fatal_error "need path for '-L' option"
 	  fi
 	fi
 	func_resolve_sysroot "$func_stripname_result"
@@ -5563,8 +6973,8 @@ func_mode_link ()
 	*)
 	  absdir=`cd "$dir" && pwd`
 	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
 	  ;;
 	esac
 	case "$deplibs " in
@@ -5599,7 +7009,7 @@ func_mode_link ()
 	;;
 
       -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
 	    # These systems don't actually have a C or math library (as such)
@@ -5607,11 +7017,11 @@ func_mode_link ()
 	    ;;
 	  *-*-os2*)
 	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
 	    # Rhapsody C and math libraries are in the System framework
@@ -5620,16 +7030,16 @@ func_mode_link ()
 	    ;;
 	  *-*-sco3.2v5* | *-*-sco5v6*)
 	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
 	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  esac
-	elif test "X$arg" = "X-lc_r"; then
+	elif test X-lc_r = "X$arg"; then
 	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	   # Do not include libc_r directly, use -pthread flag.
 	   continue
 	   ;;
@@ -5639,6 +7049,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
       -module)
 	module=yes
 	continue
@@ -5668,7 +7083,7 @@ func_mode_link ()
 	;;
 
       -multi_module)
-	single_module="${wl}-multi_module"
+	single_module=$wl-multi_module
 	continue
 	;;
 
@@ -5682,8 +7097,8 @@ func_mode_link ()
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
 	  # The PATH hackery in wrapper scripts is required on Windows
 	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
 	  fast_install=no
 	  ;;
 	*) no_install=yes ;;
@@ -5701,6 +7116,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
       -o) prev=output ;;
 
       -precious-files-regex)
@@ -5788,14 +7208,14 @@ func_mode_link ()
 	func_stripname '-Wc,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $func_quote_for_eval_result"
 	  func_append compiler_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5804,15 +7224,15 @@ func_mode_link ()
 	func_stripname '-Wl,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $wl$func_quote_for_eval_result"
 	  func_append compiler_flags " $wl$func_quote_for_eval_result"
 	  func_append linker_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5835,7 +7255,7 @@ func_mode_link ()
       # -msg_* for osf cc
       -msg_*)
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -5847,25 +7267,49 @@ func_mode_link ()
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       *.$objext)
@@ -5886,21 +7330,21 @@ func_mode_link ()
 
 	  if test -z "$pic_object" ||
 	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
 	  fi
 
 	  # Extract subdirectory from the argument.
 	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
+	  xdir=$func_dirname_result
 
-	  if test "$pic_object" != none; then
+	  test none = "$pic_object" || {
 	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
+	    pic_object=$xdir$pic_object
 
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		func_append dlfiles " $pic_object"
 		prev=
 		continue
@@ -5911,7 +7355,7 @@ func_mode_link ()
 	    fi
 
 	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      # Preload the old-style object.
 	      func_append dlprefiles " $pic_object"
 	      prev=
@@ -5919,23 +7363,23 @@ func_mode_link ()
 
 	    # A PIC object.
 	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
+	    arg=$pic_object
+	  }
 
 	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
+	  if test none != "$non_pic_object"; then
 	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
+	    non_pic_object=$xdir$non_pic_object
 
 	    # A standard non-PIC object
 	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
 	    fi
 	  else
 	    # If the PIC object exists, use it instead.
 	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
+	    non_pic_object=$pic_object
 	    func_append non_pic_objects " $non_pic_object"
 	  fi
 	else
@@ -5943,7 +7387,7 @@ func_mode_link ()
 	  if $opt_dry_run; then
 	    # Extract subdirectory from the argument.
 	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
+	    xdir=$func_dirname_result
 
 	    func_lo2o "$arg"
 	    pic_object=$xdir$objdir/$func_lo2o_result
@@ -5951,7 +7395,7 @@ func_mode_link ()
 	    func_append libobjs " $pic_object"
 	    func_append non_pic_objects " $non_pic_object"
 	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
+	    func_fatal_error "'$arg' is not a valid libtool object"
 	  fi
 	fi
 	;;
@@ -5967,11 +7411,11 @@ func_mode_link ()
 	# A libtool-controlled library.
 
 	func_resolve_sysroot "$arg"
-	if test "$prev" = dlfiles; then
+	if test dlfiles = "$prev"; then
 	  # This library was specified with -dlopen.
 	  func_append dlfiles " $func_resolve_sysroot_result"
 	  prev=
-	elif test "$prev" = dlprefiles; then
+	elif test dlprefiles = "$prev"; then
 	  # The library was specified with -dlpreopen.
 	  func_append dlprefiles " $func_resolve_sysroot_result"
 	  prev=
@@ -5986,7 +7430,7 @@ func_mode_link ()
 	# Unknown arguments in both finalize_command and compile_command need
 	# to be aesthetically quoted because they are evaled later.
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
       esac # arg
 
@@ -5998,9 +7442,9 @@ func_mode_link ()
     done # argument parsing loop
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
+      func_fatal_help "the '$prevarg' option requires an argument"
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
@@ -6009,20 +7453,23 @@ func_mode_link ()
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
     func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
+    output_objdir=$func_dirname_result$objdir
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
@@ -6045,7 +7492,7 @@ func_mode_link ()
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
+      if $opt_preserve_dup_deps; then
 	case "$libs " in
 	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	esac
@@ -6053,7 +7500,7 @@ func_mode_link ()
       func_append libs " $deplib"
     done
 
-    if test "$linkmode" = lib; then
+    if test lib = "$linkmode"; then
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
@@ -6085,7 +7532,7 @@ func_mode_link ()
 	  case $file in
 	  *.la) ;;
 	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
 	    ;;
 	  esac
 	done
@@ -6093,7 +7540,7 @@ func_mode_link ()
     prog)
 	compile_deplibs=
 	finalize_deplibs=
-	alldeplibs=no
+	alldeplibs=false
 	newdlfiles=
 	newdlprefiles=
 	passes="conv scan dlopen dlpreopen link"
@@ -6105,32 +7552,32 @@ func_mode_link ()
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
+      if test lib,link = "$linkmode,$pass"; then
 	## FIXME: Find the place where the list is rebuilt in the wrong
 	##        order, and fix it there properly
         tmp_deplibs=
 	for deplib in $deplibs; do
 	  tmp_deplibs="$deplib $tmp_deplibs"
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
       fi
 
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
 	deplibs=
       fi
-      if test "$linkmode" = prog; then
+      if test prog = "$linkmode"; then
 	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
 	link)
 	  libs="$deplibs %DEPLIBS%"
 	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
 	  ;;
 	esac
       fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+      if test lib,dlpreopen = "$linkmode,$pass"; then
 	# Collect and forward deplibs of preopened libtool libs
 	for lib in $dlprefiles; do
 	  # Ignore non-libtool-libs
@@ -6151,26 +7598,26 @@ func_mode_link ()
 	    esac
 	  done
 	done
-	libs="$dlprefiles"
+	libs=$dlprefiles
       fi
-      if test "$pass" = dlopen; then
+      if test dlopen = "$pass"; then
 	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
+	save_deplibs=$deplibs
 	deplibs=
       fi
 
       for deplib in $libs; do
 	lib=
-	found=no
+	found=false
 	case $deplib in
 	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    func_append compiler_flags " $deplib"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6180,13 +7627,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
 	    continue
 	  fi
 	  func_stripname '-l' '' "$deplib"
 	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
 	  else
 	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
@@ -6194,31 +7641,22 @@ func_mode_link ()
 	  for searchdir in $searchdirs; do
 	    for search_ext in .la $std_shrext .so .a; do
 	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
+	      lib=$searchdir/lib$name$search_ext
 	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
+		if test .la = "$search_ext"; then
+		  found=:
 		else
-		  found=no
+		  found=false
 		fi
 		break 2
 	      fi
 	    done
 	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
+	  if $found; then
+	    # deplib is a libtool library
 	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
 	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 	      case " $predeps $postdeps " in
 	      *" $deplib "*)
 		if func_lalib_p "$lib"; then
@@ -6226,19 +7664,19 @@ func_mode_link ()
 		  old_library=
 		  func_source "$lib"
 		  for l in $old_library $library_names; do
-		    ll="$l"
+		    ll=$l
 		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
 		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
+		    ladir=$func_dirname_result
 		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
+		    if test prog,link = "$linkmode,$pass"; then
 		      compile_deplibs="$deplib $compile_deplibs"
 		      finalize_deplibs="$deplib $finalize_deplibs"
 		    else
 		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
 		    fi
 		    continue
 		  fi
@@ -6247,15 +7685,25 @@ func_mode_link ()
 	      *) ;;
 	      esac
 	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
 	  fi
 	  ;; # -l
 	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6268,18 +7716,18 @@ func_mode_link ()
 	  case $linkmode in
 	  lib)
 	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
+	    test conv = "$pass" && continue
 	    newdependency_libs="$deplib $newdependency_libs"
 	    func_stripname '-L' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  prog)
-	    if test "$pass" = conv; then
+	    if test conv = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	      continue
 	    fi
-	    if test "$pass" = scan; then
+	    if test scan = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6290,13 +7738,13 @@ func_mode_link ()
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
+	    func_warning "'-L' is ignored for archives/objects"
 	    ;;
 	  esac # linkmode
 	  continue
 	  ;; # -L
 	-R*)
-	  if test "$pass" = link; then
+	  if test link = "$pass"; then
 	    func_stripname '-R' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    dir=$func_resolve_sysroot_result
@@ -6314,7 +7762,7 @@ func_mode_link ()
 	  lib=$func_resolve_sysroot_result
 	  ;;
 	*.$libext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
 	    continue
 	  fi
@@ -6325,21 +7773,26 @@ func_mode_link ()
 	    case " $dlpreconveniencelibs " in
 	    *" $deplib "*) ;;
 	    *)
-	      valid_a_lib=no
+	      valid_a_lib=false
 	      case $deplibs_check_method in
 		match_pattern*)
 		  set dummy $deplibs_check_method; shift
 		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
 		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
+		    valid_a_lib=:
 		  fi
 		;;
 		pass_all)
-		  valid_a_lib=yes
+		  valid_a_lib=:
 		;;
 	      esac
-	      if test "$valid_a_lib" != yes; then
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
 		echo
 		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
 		echo "*** I have the capability to make that library automatically link in when"
@@ -6347,18 +7800,13 @@ func_mode_link ()
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because the file extensions .$libext of this argument makes me believe"
 		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
 	      fi
 	      ;;
 	    esac
 	    continue
 	    ;;
 	  prog)
-	    if test "$pass" != link; then
+	    if test link != "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6369,10 +7817,10 @@ func_mode_link ()
 	  esac # linkmode
 	  ;; # *.$libext
 	*.lo | *.$objext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
 	      # If there is no dlopen support or we're linking statically,
 	      # we need to preload.
 	      func_append newdlprefiles " $deplib"
@@ -6385,22 +7833,20 @@ func_mode_link ()
 	  continue
 	  ;;
 	%DEPLIBS%)
-	  alldeplibs=yes
+	  alldeplibs=:
 	  continue
 	  ;;
 	esac # case $deplib
 
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
 
 	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
+	ladir=$func_dirname_result
 
 	dlname=
 	dlopen=
@@ -6430,19 +7876,19 @@ func_mode_link ()
 	  done
 	fi
 	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
 	  test -n "$dlopen" && func_append dlfiles " $dlopen"
 	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
 	fi
 
-	if test "$pass" = conv; then
+	if test conv = "$pass"; then
 	  # Only check for convenience libraries
 	  deplibs="$lib $deplibs"
 	  if test -z "$libdir"; then
 	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
+	      func_fatal_error "cannot find name of link library for '$lib'"
 	    fi
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
@@ -6450,15 +7896,15 @@ func_mode_link ()
 	    tmp_libs=
 	    for deplib in $dependency_libs; do
 	      deplibs="$deplib $deplibs"
-	      if $opt_preserve_dup_deps ; then
+	      if $opt_preserve_dup_deps; then
 		case "$tmp_libs " in
 		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 		esac
 	      fi
 	      func_append tmp_libs " $deplib"
 	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
 	  fi
 	  continue
 	fi # $pass = conv
@@ -6467,26 +7913,26 @@ func_mode_link ()
 	# Get the name of the library we link against.
 	linklib=
 	if test -n "$old_library" &&
-	   { test "$prefer_static_libs" = yes ||
-	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
 	  linklib=$old_library
 	else
 	  for l in $old_library $library_names; do
-	    linklib="$l"
+	    linklib=$l
 	  done
 	fi
 	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
+	  func_fatal_error "cannot find name of link library for '$lib'"
 	fi
 
 	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
 	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
 	    # If there is no dlname, no dlopen support or we're linking
 	    # statically, we need to preload.  We also need to preload any
 	    # dependent libraries so libltdl's deplib preloader doesn't
@@ -6500,40 +7946,40 @@ func_mode_link ()
 
 	# We need an absolute path.
 	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
 	*)
 	  abs_ladir=`cd "$ladir" && pwd`
 	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "cannot determine absolute directory name of '$ladir'"
 	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
+	    abs_ladir=$ladir
 	  fi
 	  ;;
 	esac
 	func_basename "$lib"
-	laname="$func_basename_result"
+	laname=$func_basename_result
 
 	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
+	if test yes = "$installed"; then
 	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
 	  else
-	    dir="$lt_sysroot$libdir"
-	    absdir="$lt_sysroot$libdir"
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
 	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
 	else
 	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
+	    dir=$ladir
+	    absdir=$abs_ladir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  fi
@@ -6542,11 +7988,11 @@ func_mode_link ()
 	name=$func_stripname_result
 
 	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
 	  fi
-	  case "$host" in
+	  case $host in
 	    # special handling for platforms with PE-DLLs.
 	    *cygwin* | *mingw* | *cegcc* )
 	      # Linker will automatically link against shared library if both
@@ -6590,9 +8036,9 @@ func_mode_link ()
 
 	if test -z "$libdir"; then
 	  # Link the convenience library
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
+	  elif test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$dir/$old_library $compile_deplibs"
 	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
 	  else
@@ -6602,14 +8048,14 @@ func_mode_link ()
 	fi
 
 
-	if test "$linkmode" = prog && test "$pass" != link; then
+	if test prog = "$linkmode" && test link != "$pass"; then
 	  func_append newlib_search_path " $ladir"
 	  deplibs="$lib $deplibs"
 
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
 	  fi
 
 	  tmp_libs=
@@ -6621,14 +8067,14 @@ func_mode_link ()
 		 ;;
 	    esac
 	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
+	    if $linkalldeplibs; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      # Need to hardcode shared library paths
 	      # or/and link against static libraries
 	      newdependency_libs="$deplib $newdependency_libs"
 	    fi
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	      esac
@@ -6638,15 +8084,15 @@ func_mode_link ()
 	  continue
 	fi # $linkmode = prog...
 
-	if test "$linkmode,$pass" = "prog,link"; then
+	if test prog,link = "$linkmode,$pass"; then
 	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
 	       test -z "$old_library"; }; then
 	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
 	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
+	      case $temp_rpath: in
 	      *"$absdir:"*) ;;
 	      *) func_append temp_rpath "$absdir:" ;;
 	      esac
@@ -6675,9 +8121,9 @@ func_mode_link ()
 	    esac
 	  fi # $linkmode,$pass = prog,link...
 
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
 		 test -n "$library_names"; }; }; then
 	    # We only need to search for static libraries
 	    continue
@@ -6686,19 +8132,19 @@ func_mode_link ()
 
 	link_static=no # Whether the deplib will be linked statically
 	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
+	if test built = "$use_static_libs" && test yes = "$installed"; then
 	  use_static_libs=no
 	fi
 	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
 	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
 	      # No point in relinking DLLs because paths are not encoded
 	      func_append notinst_deplibs " $lib"
 	      need_relink=no
 	    ;;
 	  *)
-	    if test "$installed" = no; then
+	    if test no = "$installed"; then
 	      func_append notinst_deplibs " $lib"
 	      need_relink=yes
 	    fi
@@ -6708,24 +8154,24 @@ func_mode_link ()
 
 	  # Warn about portability, can't link against -module's on some
 	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
+	  dlopenmodule=
 	  for dlpremoduletest in $dlprefiles; do
 	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
+	      dlopenmodule=$dlpremoduletest
 	      break
 	    fi
 	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
 	    echo
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
 	    else
 	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
 	    fi
 	    $ECHO "*** $linklib is not portable!"
 	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
 	    # Hardcode the library path.
 	    # Skip directories that are in the system default run-time
 	    # search path.
@@ -6753,43 +8199,43 @@ func_mode_link ()
 	    # figure out the soname
 	    set dummy $library_names
 	    shift
-	    realname="$1"
+	    realname=$1
 	    shift
 	    libname=`eval "\\$ECHO \"$libname_spec\""`
 	    # use dlname if we got it. it's perfectly good, no?
 	    if test -n "$dlname"; then
-	      soname="$dlname"
+	      soname=$dlname
 	    elif test -n "$soname_spec"; then
 	      # bleh windows
 	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
+	      *cygwin* | mingw* | *cegcc* | *os2*)
 	        func_arith $current - $age
 		major=$func_arith_result
-		versuffix="-$major"
+		versuffix=-$major
 		;;
 	      esac
 	      eval soname=\"$soname_spec\"
 	    else
-	      soname="$realname"
+	      soname=$realname
 	    fi
 
 	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
+	    soroot=$soname
 	    func_basename "$soroot"
-	    soname="$func_basename_result"
+	    soname=$func_basename_result
 	    func_stripname 'lib' '.dll' "$soname"
 	    newlib=libimp-$func_stripname_result.a
 
 	    # If the library has no export list, then create one now
 	    if test -f "$output_objdir/$soname-def"; then :
 	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_verbose "extracting exported symbol list from '$soname'"
 	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
 	    fi
 
 	    # Create $newlib
 	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
+	      func_verbose "generating import library for '$soname'"
 	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
 	    fi
 	    # make sure the library variables are pointing to the new library
@@ -6797,58 +8243,58 @@ func_mode_link ()
 	    linklib=$newlib
 	  fi # test -n "$old_archive_from_expsyms_cmds"
 
-	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    lib_linked=yes
 	    case $hardcode_action in
 	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
 		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
 		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
+		    *-*-unixware7*) add_dir=-L$dir ;;
 		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
+		    # if the lib is a (non-dlopened) module then we cannot
 		    # link against it, someone is ignoring the earlier warnings
 		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
+			 $GREP ": [^:]* bundle" >/dev/null; then
 		      if test "X$dlopenmodule" != "X$lib"; then
 			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
+			if test -z "$old_library"; then
 			  echo
 			  echo "*** And there doesn't seem to be a static archive available"
 			  echo "*** The link will probably fail, sorry"
 			else
-			  add="$dir/$old_library"
+			  add=$dir/$old_library
 			fi
 		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
+			add=$dir/$old_library
 		      fi
 		    fi
 		esac
-	      elif test "$hardcode_minus_L" = no; then
+	      elif test no = "$hardcode_minus_L"; then
 		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
+		*-*-sunos*) add_shlibpath=$dir ;;
 		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
 	      ;;
 	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
 		# Try looking first in the location we're being installed to.
 		if test -n "$inst_prefix_dir"; then
 		  case $libdir in
@@ -6857,10 +8303,10 @@ func_mode_link ()
 		      ;;
 		  esac
 		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
@@ -6868,7 +8314,7 @@ func_mode_link ()
 	    *) lib_linked=no ;;
 	    esac
 
-	    if test "$lib_linked" != yes; then
+	    if test yes != "$lib_linked"; then
 	      func_fatal_configuration "unsupported hardcode properties"
 	    fi
 
@@ -6878,15 +8324,15 @@ func_mode_link ()
 	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
 	      esac
 	    fi
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
 	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
 	    else
 	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
 	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
 		case :$finalize_shlibpath: in
 		*":$libdir:"*) ;;
 		*) func_append finalize_shlibpath "$libdir:" ;;
@@ -6895,33 +8341,33 @@ func_mode_link ()
 	    fi
 	  fi
 
-	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
 	      case :$finalize_shlibpath: in
 	      *":$libdir:"*) ;;
 	      *) func_append finalize_shlibpath "$libdir:" ;;
 	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
 	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
 	      else
-		add="$libdir/$linklib"
+		add=$libdir/$linklib
 	      fi
 	    else
 	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
+	      add_dir=-L$libdir
 	      # Try looking first in the location we're being installed to.
 	      if test -n "$inst_prefix_dir"; then
 		case $libdir in
@@ -6930,10 +8376,10 @@ func_mode_link ()
 		    ;;
 		esac
 	      fi
-	      add="-l$name"
+	      add=-l$name
 	    fi
 
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
 	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
 	    else
@@ -6941,43 +8387,43 @@ func_mode_link ()
 	      test -n "$add" && deplibs="$add $deplibs"
 	    fi
 	  fi
-	elif test "$linkmode" = prog; then
+	elif test prog = "$linkmode"; then
 	  # Here we assume that one of hardcode_direct or hardcode_minus_L
 	  # is not unsupported.  This is valid on all known static and
 	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
 	    compile_deplibs="$dir/$linklib $compile_deplibs"
 	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
 	  else
 	    compile_deplibs="-l$name -L$dir $compile_deplibs"
 	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
 	  fi
-	elif test "$build_libtool_libs" = yes; then
+	elif test yes = "$build_libtool_libs"; then
 	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
+	  if test pass_all != "$deplibs_check_method"; then
 	    # We're trying link a shared library against a static one
 	    # but the system doesn't support it.
 
 	    # Just print a warning and add the library to dependency_libs so
 	    # that the program can be linked against the static library.
 	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
 	    echo "*** I have the capability to make that library automatically link in when"
 	    echo "*** you link to this library.  But I can only do this if you have a"
 	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
+	    if test yes = "$module"; then
 	      echo "*** But as you try to build a module library, libtool will still create "
 	      echo "*** a static module, that should work as long as the dlopening application"
 	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
 	      if test -z "$global_symbol_pipe"; then
 		echo
 		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	      fi
-	      if test "$build_old_libs" = no; then
+	      if test no = "$build_old_libs"; then
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -6990,11 +8436,11 @@ func_mode_link ()
 	  fi
 	fi # link shared/static library?
 
-	if test "$linkmode" = lib; then
+	if test lib = "$linkmode"; then
 	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
 	    # Extract -R from dependency_libs
 	    temp_deplibs=
 	    for libdir in $dependency_libs; do
@@ -7008,12 +8454,12 @@ func_mode_link ()
 	      *) func_append temp_deplibs " $libdir";;
 	      esac
 	    done
-	    dependency_libs="$temp_deplibs"
+	    dependency_libs=$temp_deplibs
 	  fi
 
 	  func_append newlib_search_path " $absdir"
 	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
 	  # ... and its dependency_libs
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
@@ -7023,7 +8469,7 @@ func_mode_link ()
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
@@ -7032,12 +8478,12 @@ func_mode_link ()
 	    func_append tmp_libs " $func_resolve_sysroot_result"
 	  done
 
-	  if test "$link_all_deplibs" != no; then
+	  if test no != "$link_all_deplibs"; then
 	    # Add the search paths of all dependency libraries
 	    for deplib in $dependency_libs; do
 	      path=
 	      case $deplib in
-	      -L*) path="$deplib" ;;
+	      -L*) path=$deplib ;;
 	      *.la)
 	        func_resolve_sysroot "$deplib"
 	        deplib=$func_resolve_sysroot_result
@@ -7045,12 +8491,12 @@ func_mode_link ()
 		dir=$func_dirname_result
 		# We need an absolute path.
 		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
 		*)
 		  absdir=`cd "$dir" && pwd`
 		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
 		  fi
 		  ;;
 		esac
@@ -7058,35 +8504,35 @@ func_mode_link ()
 		case $host in
 		*-*-darwin*)
 		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
 		      depdepl=$tmp
 		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                       if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
-		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
 		      path=
 		    fi
 		  fi
 		  ;;
 		*)
-		  path="-L$absdir/$objdir"
+		  path=-L$absdir/$objdir
 		  ;;
 		esac
 		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
 		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
 		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
+		    func_warning "'$deplib' seems to be moved"
 
-		  path="-L$absdir"
+		  path=-L$absdir
 		fi
 		;;
 	      esac
@@ -7098,23 +8544,23 @@ func_mode_link ()
 	  fi # link_all_deplibs != no
 	fi # linkmode = lib
       done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
 	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
 	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
 	else
 	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	fi
       fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
 	# Link the dlpreopened libraries before other libraries
 	for deplib in $save_deplibs; do
 	  deplibs="$deplib $deplibs"
 	done
       fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
 	  # Make sure lib_search_path contains only unique directories.
 	  lib_search_path=
 	  for dir in $newlib_search_path; do
@@ -7124,12 +8570,12 @@ func_mode_link ()
 	    esac
 	  done
 	  newlib_search_path=
-	fi
+	}
 
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
+	if test prog,link = "$linkmode,$pass"; then
 	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
 	fi
 	for var in $vars dependency_libs; do
 	  # Add libraries to $var in reverse order
@@ -7187,62 +8633,93 @@ func_mode_link ()
 	  eval $var=\"$tmp_libs\"
 	done # for var
       fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
-      for i in $dependency_libs ; do
+      for i in $dependency_libs; do
 	case " $predeps $postdeps $compiler_lib_search_path " in
 	*" $i "*)
-	  i=""
+	  i=
 	  ;;
 	esac
-	if test -n "$i" ; then
+	if test -n "$i"; then
 	  func_append tmp_libs " $i"
 	fi
       done
       dependency_libs=$tmp_libs
     done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
     fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
     fi
 
     case $linkmode in
     oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+	func_warning "'-l' and '-L' are ignored for archives" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
+	func_warning "'-rpath' is ignored for archives"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
+	func_warning "'-R' is ignored for archives"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
+	func_warning "'-version-info/-version-number' is ignored for archives"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
+	func_warning "'-release' is ignored for archives"
 
       test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
+	func_warning "'-export-symbols' is ignored for archives"
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
-      oldlibs="$output"
+      oldlibs=$output
       func_append objs "$old_deplibs"
       ;;
 
     lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
+      # Make sure we only generate libraries of the form 'libNAME.la'.
       case $outputname in
       lib*)
 	func_stripname 'lib' '.la' "$outputname"
@@ -7251,10 +8728,10 @@ func_mode_link ()
 	eval libname=\"$libname_spec\"
 	;;
       *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
 
-	if test "$need_lib_prefix" != no; then
+	if test no != "$need_lib_prefix"; then
 	  # Add the "lib" prefix for modules if required
 	  func_stripname '' '.la' "$outputname"
 	  name=$func_stripname_result
@@ -7268,8 +8745,8 @@ func_mode_link ()
       esac
 
       if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
 	else
 	  echo
 	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
@@ -7278,21 +8755,21 @@ func_mode_link ()
 	fi
       fi
 
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
 
       set dummy $rpath
       shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
 
-      install_libdir="$1"
+      install_libdir=$1
 
       oldlibs=
       if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
+	if test yes = "$build_libtool_libs"; then
 	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
+	  # Some compilers have problems with a '.al' extension so
 	  # convenience libraries should have the same extension an
 	  # archive normally would.
 	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
@@ -7301,20 +8778,20 @@ func_mode_link ()
 	fi
 
 	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
 
 	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
+	  func_warning "'-release' is ignored for convenience libraries"
       else
 
 	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
+	save_ifs=$IFS; IFS=:
 	set dummy $vinfo 0 0 0
 	shift
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
+	  func_fatal_help "too many parameters to '-version-info'"
 
 	# convert absolute version numbers to libtool ages
 	# this retains compatibility with .la files and attempts
@@ -7322,45 +8799,45 @@ func_mode_link ()
 
 	case $vinfo_number in
 	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
 	  #
 	  # There are really only two kinds -- those that
 	  # use the current revision as the major version
 	  # and those that subtract age and use age as
 	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
+	  # that has an extra 1 added just for fun
 	  #
 	  case $version_type in
 	  # correct linux to gnu/linux during the next big refactor
-	  darwin|linux|osf|windows|none)
+	  darwin|freebsd-elf|linux|osf|windows|none)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
+	    age=$number_minor
+	    revision=$number_revision
 	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
 	    ;;
 	  irix|nonstopux)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
+	    age=$number_minor
+	    revision=$number_minor
 	    lt_irix_increment=no
 	    ;;
 	  *)
-	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    func_fatal_configuration "$modename: unknown library version type '$version_type'"
 	    ;;
 	  esac
 	  ;;
 	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
+	  current=$1
+	  revision=$2
+	  age=$3
 	  ;;
 	esac
 
@@ -7368,30 +8845,30 @@ func_mode_link ()
 	case $current in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $revision in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $age in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	fi
 
 	# Calculate the version variables.
@@ -7406,26 +8883,36 @@ func_mode_link ()
 	  # verstring for coding it into the library header
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  # Darwin ld doesn't like 0 for these options...
 	  func_arith $current + 1
 	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
 	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
 	  ;;
 
 	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
+	  if test no = "$lt_irix_increment"; then
 	    func_arith $current - $age
 	  else
 	    func_arith $current - $age + 1
@@ -7436,69 +8923,74 @@ func_mode_link ()
 	    nonstopux) verstring_prefix=nonstopux ;;
 	    *)         verstring_prefix=sgi ;;
 	  esac
-	  verstring="$verstring_prefix$major.$revision"
+	  verstring=$verstring_prefix$major.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$revision
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $revision - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
+	    verstring=$verstring_prefix$major.$iface:$verstring
 	  done
 
-	  # Before this point, $major must not contain `.'.
+	  # Before this point, $major must not contain '.'.
 	  major=.$major
-	  versuffix="$major.$revision"
+	  versuffix=$major.$revision
 	  ;;
 
 	linux) # correct to gnu/linux during the next big refactor
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	osf)
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$age
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $current - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
+	    verstring=$verstring:$iface.0
 	  done
 
 	  # Make executables depend on our current version.
-	  func_append verstring ":${current}.0"
+	  func_append verstring ":$current.0"
 	  ;;
 
 	qnx)
-	  major=".$current"
-	  versuffix=".$current"
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
 	  ;;
 
 	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	windows)
 	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
+	  # extension on DOS 8.3 file systems.
 	  func_arith $current - $age
 	  major=$func_arith_result
-	  versuffix="-$major"
+	  versuffix=-$major
 	  ;;
 
 	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  func_fatal_configuration "unknown library version type '$version_type'"
 	  ;;
 	esac
 
@@ -7512,42 +9004,45 @@ func_mode_link ()
 	    verstring=
 	    ;;
 	  *)
-	    verstring="0.0"
+	    verstring=0.0
 	    ;;
 	  esac
-	  if test "$need_version" = no; then
+	  if test no = "$need_version"; then
 	    versuffix=
 	  else
-	    versuffix=".0.0"
+	    versuffix=.0.0
 	  fi
 	fi
 
 	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
+	if test yes,no = "$avoid_version,$need_version"; then
 	  major=
 	  versuffix=
-	  verstring=""
+	  verstring=
 	fi
 
 	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
 	  fi
 	else
 	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
+	  allow_undefined_flag=$no_undefined_flag
 	fi
 
       fi
 
-      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_generate_dlsyms "$libname" "$libname" :
       func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
+      test " " = "$libobjs" && libobjs=
 
-      if test "$opt_mode" != relink; then
+      if test relink != "$opt_mode"; then
 	# Remove our outputs, but don't remove object files since they
 	# may have been created when compiling PIC objects.
 	removelist=
@@ -7556,8 +9051,8 @@ func_mode_link ()
 	  case $p in
 	    *.$objext | *.gcno)
 	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
 		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
 		 then
 		   continue
@@ -7573,11 +9068,11 @@ func_mode_link ()
       fi
 
       # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
 	func_append oldlibs " $output_objdir/$libname.$libext"
 
 	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
@@ -7598,13 +9093,13 @@ func_mode_link ()
 	  *) func_append finalize_rpath " $libdir" ;;
 	  esac
 	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
 	  dependency_libs="$temp_xrpath $dependency_libs"
 	fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
+      old_dlfiles=$dlfiles
       dlfiles=
       for lib in $old_dlfiles; do
 	case " $dlprefiles $dlfiles " in
@@ -7614,7 +9109,7 @@ func_mode_link ()
       done
 
       # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
+      old_dlprefiles=$dlprefiles
       dlprefiles=
       for lib in $old_dlprefiles; do
 	case "$dlprefiles " in
@@ -7623,7 +9118,7 @@ func_mode_link ()
 	esac
       done
 
-      if test "$build_libtool_libs" = yes; then
+      if test yes = "$build_libtool_libs"; then
 	if test -n "$rpath"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
@@ -7647,7 +9142,7 @@ func_mode_link ()
 	    ;;
 	  *)
 	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
+	    if test yes = "$build_libtool_need_lc"; then
 	      func_append deplibs " -lc"
 	    fi
 	    ;;
@@ -7663,9 +9158,9 @@ func_mode_link ()
 	# I'm not sure if I'm treating the release correctly.  I think
 	# release should show up in the -l (ie -lgmp5) so we don't want to
 	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
+	release=
+	versuffix=
+	major=
 	newdeplibs=
 	droppeddeps=no
 	case $deplibs_check_method in
@@ -7694,20 +9189,20 @@ EOF
 	      -l*)
 		func_stripname -l '' "$i"
 		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		  case " $predeps $postdeps " in
 		  *" $i "*)
 		    func_append newdeplibs " $i"
-		    i=""
+		    i=
 		    ;;
 		  esac
 		fi
-		if test -n "$i" ; then
+		if test -n "$i"; then
 		  libname=`eval "\\$ECHO \"$libname_spec\""`
 		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		  set dummy $deplib_matches; shift
 		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		    func_append newdeplibs " $i"
 		  else
 		    droppeddeps=yes
@@ -7737,20 +9232,20 @@ EOF
 		$opt_dry_run || $RM conftest
 		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
 		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		    case " $predeps $postdeps " in
 		    *" $i "*)
 		      func_append newdeplibs " $i"
-		      i=""
+		      i=
 		      ;;
 		    esac
 		  fi
-		  if test -n "$i" ; then
+		  if test -n "$i"; then
 		    libname=`eval "\\$ECHO \"$libname_spec\""`
 		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		    set dummy $deplib_matches; shift
 		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		      func_append newdeplibs " $i"
 		    else
 		      droppeddeps=yes
@@ -7787,24 +9282,24 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		if test -n "$file_magic_glob"; then
 		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
 		else
 		  libnameglob=$libname
 		fi
-		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  if test "$want_nocaseglob" = yes; then
+		  if test yes = "$want_nocaseglob"; then
 		    shopt -s nocaseglob
 		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
 		    $nocaseglob
@@ -7822,25 +9317,25 @@ EOF
 		      # We might still enter an endless loop, since a link
 		      # loop can be closed while we follow links,
 		      # but so what?
-		      potlib="$potent_lib"
+		      potlib=$potent_lib
 		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
 			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
 			esac
 		      done
 		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
 			 $SED -e 10q |
 			 $EGREP "$file_magic_regex" > /dev/null; then
 			func_append newdeplibs " $a_deplib"
-			a_deplib=""
+			a_deplib=
 			break 2
 		      fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7848,7 +9343,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7871,30 +9366,30 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
 		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    potlib=$potent_lib # see symlink-check above in file_magic test
 		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
 		       $EGREP "$match_pattern_regex" > /dev/null; then
 		      func_append newdeplibs " $a_deplib"
-		      a_deplib=""
+		      a_deplib=
 		      break 2
 		    fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7902,7 +9397,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7918,18 +9413,18 @@ EOF
 	  done # Gone through all deplibs.
 	  ;;
 	none | unknown | *)
-	  newdeplibs=""
+	  newdeplibs=
 	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
 	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
 	    done
 	  fi
 	  case $tmp_deplibs in
 	  *[!\	\ ]*)
 	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
+	    if test none = "$deplibs_check_method"; then
 	      echo "*** Warning: inter-library dependencies are not supported in this platform."
 	    else
 	      echo "*** Warning: inter-library dependencies are not known to be supported."
@@ -7953,8 +9448,8 @@ EOF
 	  ;;
 	esac
 
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
 	    echo
 	    echo "*** Warning: libtool could not satisfy all declared inter-library"
 	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
@@ -7963,12 +9458,12 @@ EOF
 	    if test -z "$global_symbol_pipe"; then
 	      echo
 	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
 	      build_libtool_libs=module
 	      build_old_libs=yes
 	    else
@@ -7979,14 +9474,14 @@ EOF
 	    echo "*** automatically added whenever a program is linked with this library"
 	    echo "*** or is declared to -dlopen it."
 
-	    if test "$allow_undefined" = no; then
+	    if test no = "$allow_undefined"; then
 	      echo
 	      echo "*** Since this library must not contain undefined symbols,"
 	      echo "*** because either the platform does not support them or"
 	      echo "*** it was explicitly requested with -no-undefined,"
 	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -8032,7 +9527,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      deplibs="$new_libs"
+      deplibs=$new_libs
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
@@ -8040,25 +9535,25 @@ EOF
       dlname=
 
       # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	# Remove ${wl} instances when linking with ld.
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
 	# FIXME: should test the right _cmds variable.
 	case $archive_cmds in
 	  *\$LD\ *) wl= ;;
         esac
-	if test "$hardcode_into_libs" = yes; then
+	if test yes = "$hardcode_into_libs"; then
 	  # Hardcode the library paths
 	  hardcode_libdirs=
 	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
 	  for libdir in $rpath; do
 	    if test -n "$hardcode_libdir_flag_spec"; then
 	      if test -n "$hardcode_libdir_separator"; then
 		func_replace_sysroot "$libdir"
 		libdir=$func_replace_sysroot_result
 		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
+		  hardcode_libdirs=$libdir
 		else
 		  # Just accumulate the unique libdirs.
 		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8083,7 +9578,7 @@ EOF
 	  # Substitute the hardcoded libdirs into the rpath.
 	  if test -n "$hardcode_libdir_separator" &&
 	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
+	    libdir=$hardcode_libdirs
 	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
 	  fi
 	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
@@ -8097,8 +9592,8 @@ EOF
 	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
 	fi
 
-	shlibpath="$finalize_shlibpath"
-	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
 	if test -n "$shlibpath"; then
 	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
 	fi
@@ -8108,19 +9603,19 @@ EOF
 	eval library_names=\"$library_names_spec\"
 	set dummy $library_names
 	shift
-	realname="$1"
+	realname=$1
 	shift
 
 	if test -n "$soname_spec"; then
 	  eval soname=\"$soname_spec\"
 	else
-	  soname="$realname"
+	  soname=$realname
 	fi
 	if test -z "$dlname"; then
 	  dlname=$soname
 	fi
 
-	lib="$output_objdir/$realname"
+	lib=$output_objdir/$realname
 	linknames=
 	for link
 	do
@@ -8134,7 +9629,7 @@ EOF
 	delfiles=
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
 	  func_append delfiles " $export_symbols"
 	fi
 
@@ -8143,31 +9638,31 @@ EOF
 	cygwin* | mingw* | cegcc*)
 	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
 	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	    func_dll_def_p "$export_symbols" || {
 	      # and it's NOT already a .def file. Must figure out
 	      # which of the given symbols are data symbols and tag
 	      # them as such. So, trigger use of export_symbols_cmds.
 	      # export_symbols gets reassigned inside the "prepare
 	      # the list of exported symbols" if statement, so the
 	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
+	      orig_export_symbols=$export_symbols
 	      export_symbols=
 	      always_export_symbols=yes
-	    fi
+	    }
 	  fi
 	  ;;
 	esac
 
 	# Prepare the list of exported symbols
 	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
 	    $opt_dry_run || $RM $export_symbols
 	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd1 in $cmds; do
-	      IFS="$save_ifs"
+	      IFS=$save_ifs
 	      # Take the normal branch if the nm_file_list_spec branch
 	      # doesn't work or if tool conversion is not needed.
 	      case $nm_file_list_spec~$to_tool_file_cmd in
@@ -8181,7 +9676,7 @@ EOF
 		  try_normal_branch=no
 		  ;;
 	      esac
-	      if test "$try_normal_branch" = yes \
+	      if test yes = "$try_normal_branch" \
 		 && { test "$len" -lt "$max_cmd_len" \
 		      || test "$max_cmd_len" -le -1; }
 	      then
@@ -8192,7 +9687,7 @@ EOF
 		output_la=$func_basename_result
 		save_libobjs=$libobjs
 		save_output=$output
-		output=${output_objdir}/${output_la}.nm
+		output=$output_objdir/$output_la.nm
 		func_to_tool_file "$output"
 		libobjs=$nm_file_list_spec$func_to_tool_file_result
 		func_append delfiles " $output"
@@ -8215,8 +9710,8 @@ EOF
 		break
 	      fi
 	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
@@ -8224,16 +9719,16 @@ EOF
 	fi
 
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	fi
 
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
 	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
 	  # though. Also, the filter scales superlinearly with the number of
 	  # global variables. join(1) would be nice here, but unfortunately
 	  # isn't a blessed tool.
@@ -8252,11 +9747,11 @@ EOF
 	    ;;
 	  esac
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
 
 	if test -n "$convenience"; then
 	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
+	    test yes = "$compiler_needs_object" &&
 	    test -z "$libobjs"; then
 	    # extract the archives, so we have objects to list.
 	    # TODO: could optimize this to just extract one archive.
@@ -8267,7 +9762,7 @@ EOF
 	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
 	    test "X$libobjs" = "X " && libobjs=
 	  else
-	    gentop="$output_objdir/${outputname}x"
+	    gentop=$output_objdir/${outputname}x
 	    func_append generated " $gentop"
 
 	    func_extract_archives $gentop $convenience
@@ -8276,18 +9771,18 @@ EOF
 	  fi
 	fi
 
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
 	  eval flag=\"$thread_safe_flag_spec\"
 	  func_append linker_flags " $flag"
 	fi
 
 	# Make a backup of the uninstalled library when relinking
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
 	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
+	if test yes = "$module" && test -n "$module_cmds"; then
 	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	    eval test_cmds=\"$module_expsym_cmds\"
 	    cmds=$module_expsym_cmds
@@ -8305,7 +9800,7 @@ EOF
 	  fi
 	fi
 
-	if test "X$skipped_export" != "X:" &&
+	if test : != "$skipped_export" &&
 	   func_len " $test_cmds" &&
 	   len=$func_len_result &&
 	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
@@ -8338,8 +9833,8 @@ EOF
 	  last_robj=
 	  k=1
 
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
 	    func_verbose "creating GNU ld script: $output"
 	    echo 'INPUT (' > $output
 	    for obj in $save_libobjs
@@ -8351,14 +9846,14 @@ EOF
 	    func_append delfiles " $output"
 	    func_to_tool_file "$output"
 	    output=$func_to_tool_file_result
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
 	    func_verbose "creating linker input file list: $output"
 	    : > $output
 	    set x $save_libobjs
 	    shift
 	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
+	    if test yes = "$compiler_needs_object"; then
 	      firstobj="$1 "
 	      shift
 	    fi
@@ -8373,7 +9868,7 @@ EOF
 	  else
 	    if test -n "$save_libobjs"; then
 	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
+	      output=$output_objdir/$output_la-$k.$objext
 	      eval test_cmds=\"$reload_cmds\"
 	      func_len " $test_cmds"
 	      len0=$func_len_result
@@ -8385,13 +9880,13 @@ EOF
 		func_len " $obj"
 		func_arith $len + $func_len_result
 		len=$func_arith_result
-		if test "X$objlist" = X ||
+		if test -z "$objlist" ||
 		   test "$len" -lt "$max_cmd_len"; then
 		  func_append objlist " $obj"
 		else
 		  # The command $test_cmds is almost too long, add a
 		  # command to the queue.
-		  if test "$k" -eq 1 ; then
+		  if test 1 -eq "$k"; then
 		    # The first file doesn't have a previous command to add.
 		    reload_objs=$objlist
 		    eval concat_cmds=\"$reload_cmds\"
@@ -8401,10 +9896,10 @@ EOF
 		    reload_objs="$objlist $last_robj"
 		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
 		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  last_robj=$output_objdir/$output_la-$k.$objext
 		  func_arith $k + 1
 		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
+		  output=$output_objdir/$output_la-$k.$objext
 		  objlist=" $obj"
 		  func_len " $last_robj"
 		  func_arith $len0 + $func_len_result
@@ -8416,9 +9911,9 @@ EOF
 	      # files will link in the last one created.
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
 	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
 	      func_append delfiles " $output"
 
@@ -8426,9 +9921,9 @@ EOF
 	      output=
 	    fi
 
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
 	      $opt_dry_run || $RM $export_symbols
 	      libobjs=$output
 	      # Append the command to create the export file.
@@ -8437,16 +9932,16 @@ EOF
 	      if test -n "$last_robj"; then
 		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
-	    fi
+	    }
 
 	    test -n "$save_libobjs" &&
 	      func_verbose "creating a temporary reloadable object file: $output"
 
 	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
+	      IFS=$save_ifs
+	      $opt_quiet || {
 		  func_quote_for_expand "$cmd"
 		  eval "func_echo $func_quote_for_expand_result"
 	      }
@@ -8454,7 +9949,7 @@ EOF
 		lt_exit=$?
 
 		# Restore the uninstalled library and exit
-		if test "$opt_mode" = relink; then
+		if test relink = "$opt_mode"; then
 		  ( cd "$output_objdir" && \
 		    $RM "${realname}T" && \
 		    $MV "${realname}U" "$realname" )
@@ -8463,7 +9958,7 @@ EOF
 		exit $lt_exit
 	      }
 	    done
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 
 	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
@@ -8471,18 +9966,18 @@ EOF
 	    fi
 	  fi
 
-          if ${skipped_export-false}; then
+          ${skipped_export-false} && {
 	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	    fi
 
 	    if test -n "$orig_export_symbols"; then
 	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
 	      # though. Also, the filter scales superlinearly with the number of
 	      # global variables. join(1) would be nice here, but unfortunately
 	      # isn't a blessed tool.
@@ -8491,7 +9986,7 @@ EOF
 	      export_symbols=$output_objdir/$libname.def
 	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	    fi
-	  fi
+	  }
 
 	  libobjs=$output
 	  # Restore the value of output.
@@ -8505,7 +10000,7 @@ EOF
 	  # value of $libobjs for piecewise linking.
 
 	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test yes = "$module" && test -n "$module_cmds"; then
 	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	      cmds=$module_expsym_cmds
 	    else
@@ -8527,7 +10022,7 @@ EOF
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -8535,11 +10030,12 @@ EOF
 	  test "X$libobjs" = "X " && libobjs=
 	fi
 
-	save_ifs="$IFS"; IFS='~'
+	save_ifs=$IFS; IFS='~'
 	for cmd in $cmds; do
-	  IFS="$save_ifs"
+	  IFS=$sp$nl
 	  eval cmd=\"$cmd\"
-	  $opt_silent || {
+	  IFS=$save_ifs
+	  $opt_quiet || {
 	    func_quote_for_expand "$cmd"
 	    eval "func_echo $func_quote_for_expand_result"
 	  }
@@ -8547,7 +10043,7 @@ EOF
 	    lt_exit=$?
 
 	    # Restore the uninstalled library and exit
-	    if test "$opt_mode" = relink; then
+	    if test relink = "$opt_mode"; then
 	      ( cd "$output_objdir" && \
 	        $RM "${realname}T" && \
 		$MV "${realname}U" "$realname" )
@@ -8556,10 +10052,10 @@ EOF
 	    exit $lt_exit
 	  }
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	# Restore the uninstalled library and exit
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
 	  if test -n "$convenience"; then
@@ -8579,39 +10075,39 @@ EOF
 	done
 
 	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
+	if test yes = "$module" || test yes = "$export_dynamic"; then
 	  # On all known operating systems, these are identical.
-	  dlname="$soname"
+	  dlname=$soname
 	fi
       fi
       ;;
 
     obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+	func_warning "'-l' and '-L' are ignored for objects" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
+	func_warning "'-rpath' is ignored for objects"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
+	func_warning "'-R' is ignored for objects"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
+	func_warning "'-version-info' is ignored for objects"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
+	func_warning "'-release' is ignored for objects"
 
       case $output in
       *.lo)
 	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
 
 	libobj=$output
 	func_lo2o "$libobj"
@@ -8619,7 +10115,7 @@ EOF
 	;;
       *)
 	libobj=
-	obj="$output"
+	obj=$output
 	;;
       esac
 
@@ -8632,17 +10128,19 @@ EOF
       # the extraction.
       reload_conv_objs=
       gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
       if test -n "$convenience"; then
 	if test -n "$whole_archive_flag_spec"; then
 	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
 	else
-	  gentop="$output_objdir/${obj}x"
+	  gentop=$output_objdir/${obj}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $convenience
@@ -8651,12 +10149,12 @@ EOF
       fi
 
       # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
 
       # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
 
-      output="$obj"
+      output=$obj
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
@@ -8668,7 +10166,7 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$build_libtool_libs" != yes; then
+      test yes = "$build_libtool_libs" || {
 	if test -n "$gentop"; then
 	  func_show_eval '${RM}r "$gentop"'
 	fi
@@ -8678,12 +10176,12 @@ EOF
 	# $show "echo timestamp > $libobj"
 	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
 	exit $EXIT_SUCCESS
-      fi
+      }
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
 	# Only do commands if we really have different PIC objects.
 	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
+	output=$libobj
 	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
@@ -8700,16 +10198,14 @@ EOF
 	          output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
+	func_warning "'-version-info' is ignored for programs"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
+	func_warning "'-release' is ignored for programs"
 
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
@@ -8723,11 +10219,11 @@ EOF
       *-*-darwin*)
 	# Don't allow lazy linking, it breaks C++ global constructors
 	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
+	if test CXX = "$tagname"; then
 	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
 	    10.[0123])
-	      func_append compile_command " ${wl}-bind_at_load"
-	      func_append finalize_command " ${wl}-bind_at_load"
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
 	    ;;
 	  esac
 	fi
@@ -8763,7 +10259,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      compile_deplibs="$new_libs"
+      compile_deplibs=$new_libs
 
 
       func_append compile_command " $compile_deplibs"
@@ -8787,7 +10283,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8810,7 +10306,7 @@ EOF
 	fi
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$libdir:"*) ;;
 	  ::) dllsearchpath=$libdir;;
@@ -8827,10 +10323,10 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      compile_rpath="$rpath"
+      compile_rpath=$rpath
 
       rpath=
       hardcode_libdirs=
@@ -8838,7 +10334,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8863,45 +10359,43 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      finalize_rpath="$rpath"
+      finalize_rpath=$rpath
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
 	# Transform all the library objects into standard objects.
 	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
 	func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
-      wrappers_required=yes
+      wrappers_required=:
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
+        wrappers_required=false
         ;;
       *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
+        test yes = "$build_libtool_libs" || wrappers_required=false
         ;;
       *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
         fi
         ;;
       esac
-      if test "$wrappers_required" = no; then
+      $wrappers_required || {
 	# Replace the output file specification.
 	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
+	link_command=$compile_command$compile_rpath
 
 	# We have no uninstalled library dependencies, so finalize right now.
 	exit_status=0
@@ -8914,12 +10408,12 @@ EOF
 	fi
 
 	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
 	fi
 
 	exit $exit_status
-      fi
+      }
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
 	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
@@ -8949,9 +10443,9 @@ EOF
 	fi
       fi
 
-      if test "$no_install" = yes; then
+      if test yes = "$no_install"; then
 	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
+	link_command=$compile_var$compile_command$compile_rpath
 	# Replace the output file specification.
 	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
 	# Delete the old output file.
@@ -8968,27 +10462,28 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
 
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
@@ -9045,8 +10540,8 @@ EOF
 	    func_dirname_and_basename "$output" "" "."
 	    output_name=$func_basename_result
 	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
 	    $RM $cwrappersource $cwrapper
 	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
@@ -9067,7 +10562,7 @@ EOF
 	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
 	    $opt_dry_run || {
 	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
+	      if test "x$build" = "x$host"; then
 		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
 		func_emit_wrapper no > $func_ltwrapper_scriptname_result
@@ -9090,25 +10585,27 @@ EOF
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
 	  build_libtool_libs=no
-	else
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
 	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    func_append oldobjs " $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
 
       if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
+	gentop=$output_objdir/${outputname}x
 	func_append generated " $gentop"
 
 	func_extract_archives $gentop $addlibs
@@ -9116,13 +10613,13 @@ EOF
       fi
 
       # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
 	cmds=$old_archive_from_new_cmds
       else
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -9143,7 +10640,7 @@ EOF
 	  :
 	else
 	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 	  func_mkdir_p "$gentop"
 	  save_oldobjs=$oldobjs
@@ -9152,7 +10649,7 @@ EOF
 	  for obj in $save_oldobjs
 	  do
 	    func_basename "$obj"
-	    objbase="$func_basename_result"
+	    objbase=$func_basename_result
 	    case " $oldobjs " in
 	    " ") oldobjs=$obj ;;
 	    *[\ /]"$objbase "*)
@@ -9221,18 +10718,18 @@ EOF
 	    else
 	      # the above command should be used before it gets too long
 	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
+	      if test "$obj" = "$last_oldobj"; then
 		RANLIB=$save_RANLIB
 	      fi
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
 	      objlist=
 	      len=$len0
 	    fi
 	  done
 	  RANLIB=$save_RANLIB
 	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
+	  if test -z "$oldobjs"; then
 	    eval cmds=\"\$concat_cmds\"
 	  else
 	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
@@ -9249,7 +10746,7 @@ EOF
     case $output in
     *.la)
       old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      test yes = "$build_old_libs" && old_library=$libname.$libext
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
@@ -9264,31 +10761,31 @@ EOF
 	fi
       done
       # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
+      if test yes = "$hardcode_automatic"; then
 	relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
 	for installed in no yes; do
-	  if test "$installed" = yes; then
+	  if test yes = "$installed"; then
 	    if test -z "$install_libdir"; then
 	      break
 	    fi
-	    output="$output_objdir/$outputname"i
+	    output=$output_objdir/${outputname}i
 	    # Replace all uninstalled libtool libraries with the installed ones
 	    newdependency_libs=
 	    for deplib in $dependency_libs; do
 	      case $deplib in
 	      *.la)
 		func_basename "$deplib"
-		name="$func_basename_result"
+		name=$func_basename_result
 		func_resolve_sysroot "$deplib"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
 		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      -L*)
@@ -9304,23 +10801,23 @@ EOF
 	      *) func_append newdependency_libs " $deplib" ;;
 	      esac
 	    done
-	    dependency_libs="$newdependency_libs"
+	    dependency_libs=$newdependency_libs
 	    newdlfiles=
 
 	    for lib in $dlfiles; do
 	      case $lib in
 	      *.la)
 	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      *) func_append newdlfiles " $lib" ;;
 	      esac
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
@@ -9330,34 +10827,34 @@ EOF
 		# didn't already link the preopened objects directly into
 		# the library:
 		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      esac
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  else
 	    newdlfiles=
 	    for lib in $dlfiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlfiles " $abs"
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlprefiles " $abs"
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  fi
 	  $RM $output
 	  # place dlname in correct position for cygwin
@@ -9373,10 +10870,9 @@ EOF
 	  case $host,$output,$installed,$module,$dlname in
 	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
 	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
+	      if test -n "$bindir"; then
 		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
+		tdlname=$func_relative_path_result/$dlname
 	      else
 		# Otherwise fall back on heuristic.
 		tdlname=../bin/$dlname
@@ -9385,7 +10881,7 @@ EOF
 	  esac
 	  $ECHO > $output "\
 # $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -9399,7 +10895,7 @@ library_names='$library_names'
 # The name of the static archive.
 old_library='$old_library'
 
-# Linker flags that can not go in dependency_libs.
+# Linker flags that cannot go in dependency_libs.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
@@ -9425,7 +10921,7 @@ dlpreopen='$dlprefiles'
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
+	  if test no,yes = "$installed,$need_relink"; then
 	    $ECHO >> $output "\
 relink_command=\"$relink_command\""
 	  fi
@@ -9440,27 +10936,29 @@ relink_command=\"$relink_command\""
     exit $EXIT_SUCCESS
 }
 
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
-    $opt_debug
-    RM="$nonopt"
+    $debug_cmd
+
+    RM=$nonopt
     files=
-    rmforce=
+    rmforce=false
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     for arg
     do
       case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
+      -f) func_append RM " $arg"; rmforce=: ;;
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
@@ -9473,18 +10971,18 @@ func_mode_uninstall ()
 
     for file in $files; do
       func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	odir="$objdir"
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
       else
-	odir="$dir/$objdir"
+	odir=$dir/$objdir
       fi
       func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
 
       # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
+      if test clean = "$opt_mode"; then
 	case " $rmdirs " in
 	  *" $odir "*) ;;
 	  *) func_append rmdirs " $odir" ;;
@@ -9499,11 +10997,11 @@ func_mode_uninstall ()
       elif test -d "$file"; then
 	exit_status=1
 	continue
-      elif test "$rmforce" = yes; then
+      elif $rmforce; then
 	continue
       fi
 
-      rmfiles="$file"
+      rmfiles=$file
 
       case $name in
       *.la)
@@ -9517,7 +11015,7 @@ func_mode_uninstall ()
 	  done
 	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
-	  case "$opt_mode" in
+	  case $opt_mode in
 	  clean)
 	    case " $library_names " in
 	    *" $dlname "*) ;;
@@ -9528,12 +11026,12 @@ func_mode_uninstall ()
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
@@ -9549,21 +11047,19 @@ func_mode_uninstall ()
 	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
+	  if test -n "$pic_object" && test none != "$pic_object"; then
 	    func_append rmfiles " $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
 	    func_append rmfiles " $dir/$non_pic_object"
 	  fi
 	fi
 	;;
 
       *)
-	if test "$opt_mode" = clean ; then
+	if test clean = "$opt_mode"; then
 	  noexename=$name
 	  case $file in
 	  *.exe)
@@ -9590,12 +11086,12 @@ func_mode_uninstall ()
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
-	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
 	      func_append rmfiles " $odir/lt-$name"
 	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
 	    fi
 	  fi
 	fi
@@ -9604,7 +11100,7 @@ func_mode_uninstall ()
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
-    # Try to remove the ${objdir}s in the directories where we deleted files
+    # Try to remove the $objdir's in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
 	func_show_eval "rmdir $dir >/dev/null 2>&1"
@@ -9614,16 +11110,17 @@ func_mode_uninstall ()
     exit $exit_status
 }
 
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
 
 test -z "$opt_mode" && {
-  help="$generic_help"
+  help=$generic_help
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
+  func_fatal_help "invalid operation mode '$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
@@ -9634,7 +11131,7 @@ exit $exit_status
 
 
 # The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
+# where we disable both kinds of libraries.  Given conflicting
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
@@ -9657,5 +11154,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # mode:shell-script
 # sh-indentation:2
 # End:
-# vi:sw=2
-
diff --git a/m4/ax_arm.m4 b/m4/ax_arm.m4
index 37ea0aa..26b5258 100644
--- a/m4/ax_arm.m4
+++ b/m4/ax_arm.m4
@@ -26,12 +26,19 @@ AC_DEFUN([AX_ARM_FEATURES],
         AC_DEFINE(HAVE_NEON,,[Support NEON instructions])
         AC_SUBST(ARM_NEON_FLAGS)
       fi
-      AX_CHECK_COMPILE_FLAG(-march=armv8-a+crc, ax_cv_support_crc_ext=yes, [])
+
+      AC_LANG_SAVE
+      AC_LANG_CPLUSPLUS
+      AC_CACHE_CHECK(whether the assembler supports crc extensions,
+                     ax_cv_support_crc_ext, AC_TRY_COMPILE([
+          #define CRC32CX(crc, value) __asm__("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value))
+          asm(".arch_extension crc");
+          unsigned int foo(unsigned int ret) {
+              CRC32CX(ret, 0);
+              return ret;
+          }],[ foo(0); ], ax_cv_support_crc_ext=yes, []))
       if test x"$ax_cv_support_crc_ext" = x"yes"; then
-        ARM_ARCH_FLAGS="$ARM_ARCH_FLAGS+crc"
-        ARM_CRC_FLAGS="-march=armv8-a+crc -DARCH_AARCH64"
         AC_DEFINE(HAVE_ARMV8_CRC,,[Support ARMv8 CRC instructions])
-        AC_SUBST(ARM_CRC_FLAGS)
       fi
         ARM_FLAGS="$ARM_ARCH_FLAGS $ARM_DEFINE_FLAGS"
     ;;
diff --git a/m4/libtool.m4 b/m4/libtool.m4
index d7c043f..10ab284 100644
--- a/m4/libtool.m4
+++ b/m4/libtool.m4
@@ -1,8 +1,6 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -10,36 +8,30 @@
 # modifications, as long as this notice is preserved.
 
 m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ])
 
-# serial 57 LT_INIT
+# serial 58 LT_INIT
 
 
 # LT_PREREQ(VERSION)
@@ -67,7 +59,7 @@ esac
 # LT_INIT([OPTIONS])
 # ------------------
 AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -91,7 +83,7 @@ dnl Parse OPTIONS
 _LT_SET_OPTIONS([$0], [$1])
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -111,26 +103,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
 dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
 
 
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
 # _LT_CC_BASENAME(CC)
 # -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
 m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
 ])
 
 
 # _LT_FILEUTILS_DEFAULTS
 # ----------------------
 # It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
 m4_defun([_LT_FILEUTILS_DEFAULTS],
 [: ${CP="cp -f"}
 : ${MV="mv -f"}
@@ -177,15 +186,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
 m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
 
 _LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 ])
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -198,7 +208,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -209,14 +219,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -269,14 +279,14 @@ no_glob_subst='s/\*/\\\*/g'
 
 # _LT_PROG_LTMAIN
 # ---------------
-# Note that this code is called both from `configure', and `config.status'
+# Note that this code is called both from 'configure', and 'config.status'
 # now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
 # so we pass a copy along to make sure it has a sensible value anyway.
 m4_defun([_LT_PROG_LTMAIN],
 [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
 _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 ])# _LT_PROG_LTMAIN
 
 
@@ -286,7 +296,7 @@ ltmain="$ac_aux_dir/ltmain.sh"
 
 # So that we can recreate a full libtool script including additional
 # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
+# in macros and then make a single call at the end using the 'libtool'
 # label.
 
 
@@ -421,8 +431,8 @@ m4_define([_lt_decl_all_varnames],
 
 # _LT_CONFIG_STATUS_DECLARE([VARNAME])
 # ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
 [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
@@ -446,7 +456,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
 # Output comment and list of tags supported by the script
 m4_defun([_LT_LIBTOOL_TAGS],
 [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
+available_tags='_LT_TAGS'dnl
 ])
 
 
@@ -474,7 +484,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
 # _LT_LIBTOOL_CONFIG_VARS
 # -----------------------
 # Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
 # script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
 # section) are produced by _LT_LIBTOOL_TAG_VARS.
 m4_defun([_LT_LIBTOOL_CONFIG_VARS],
@@ -500,8 +510,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
 # Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
 # variables for single and double quote escaping we saved from calls
 # to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
 # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
 m4_defun([_LT_CONFIG_COMMANDS],
 [AC_PROVIDE_IFELSE([LT_OUTPUT],
@@ -547,7 +557,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_quote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -560,7 +570,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_dquote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -576,7 +586,7 @@ _LT_OUTPUT_LIBTOOL_INIT
 # Generate a child script FILE with all initialization necessary to
 # reuse the environment learned by the parent script, and make the
 # file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
+# '#!' sequence but before initialization text begins.  After this
 # macro, additional text can be appended to FILE to form the body of
 # the child script.  The macro ends with non-zero status if the
 # file could not be fully written (such as if the disk is full).
@@ -598,7 +608,7 @@ AS_SHELL_SANITIZE
 _AS_PREPARE
 exec AS_MESSAGE_FD>&1
 _ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
 m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
@@ -621,7 +631,7 @@ exec AS_MESSAGE_LOG_FD>>config.log
 } >&AS_MESSAGE_LOG_FD
 
 lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
 for use in further configure time tests before the real libtool is
 generated.
 
@@ -643,7 +653,7 @@ Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
-while test $[#] != 0
+while test 0 != $[#]
 do
   case $[1] in
     --version | --v* | -V )
@@ -656,10 +666,10 @@ do
       lt_cl_silent=: ;;
 
     -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
 
     *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
   esac
   shift
 done
@@ -685,7 +695,7 @@ chmod +x "$CONFIG_LT"
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec AS_MESSAGE_LOG_FD>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -705,27 +715,31 @@ m4_defun([_LT_CONFIG],
 _LT_CONFIG_SAVE_COMMANDS([
   m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
   m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
 _LT_COPYING
 _LT_LIBTOOL_TAGS
 
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
 # ### BEGIN LIBTOOL CONFIG
 _LT_LIBTOOL_CONFIG_VARS
 _LT_LIBTOOL_TAG_VARS
@@ -733,13 +747,24 @@ _LT_LIBTOOL_TAG_VARS
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -756,8 +781,6 @@ _LT_EOF
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  _LT_PROG_REPLACE_SHELLFNS
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -775,7 +798,6 @@ _LT_EOF
 [m4_if([$1], [], [
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'], [])
 ])dnl /_LT_CONFIG_SAVE_COMMANDS
@@ -974,7 +996,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 
     AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -992,7 +1014,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1010,7 +1032,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
       AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
 	[lt_cv_ld_exported_symbols_list=yes],
 	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
     ])
 
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
@@ -1032,7 +1054,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1042,32 +1064,32 @@ _LT_EOF
     ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -1087,29 +1109,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
     m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                   [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
     m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 ],[])
   else
@@ -1129,7 +1151,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
 # Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
+if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
@@ -1147,7 +1169,7 @@ else
     _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
   fi],[])
   if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
   fi
   ])
   aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
@@ -1167,8 +1189,8 @@ m4_define([_LT_SHELL_INIT],
 # -----------------------
 # Find how we can fake an echo command that does not interpret backslash.
 # In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
 [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
@@ -1196,10 +1218,10 @@ fi
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
-    $ECHO "$*" 
+    $ECHO "$*"
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) AC_MSG_RESULT([printf]) ;;
   print*) AC_MSG_RESULT([print -r]) ;;
   *) AC_MSG_RESULT([cat]) ;;
@@ -1225,16 +1247,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
 AC_DEFUN([_LT_WITH_SYSROOT],
 [AC_MSG_CHECKING([for sysroot])
 AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
 [], [with_sysroot=no])
 
 dnl lt_sysroot will always be passed unquoted.  We quote it here
 dnl in case the user passed a directory name.
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -1244,14 +1267,14 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_RESULT([$with_sysroot])
    AC_MSG_ERROR([The sysroot must be an absolute path.])
    ;;
 esac
 
  AC_MSG_RESULT([${lt_sysroot:-no}])
 _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
+[dependent libraries, and where our libraries should be installed.])])
 
 # _LT_ENABLE_LOCK
 # ---------------
@@ -1259,31 +1282,33 @@ m4_defun([_LT_ENABLE_LOCK],
 [AC_ARG_ENABLE([libtool-lock],
   [AS_HELP_STRING([--disable-libtool-lock],
     [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -1312,9 +1337,46 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1333,10 +1395,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 		;;
 	    esac
 	    ;;
-	  powerpc64le-*)
+	  powerpc64le-*linux*)
 	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  powerpc64-*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -1355,10 +1417,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  powerpcle-*)
+	  powerpcle-*linux*)
 	    LD="${LD-ld} -m elf64lppc"
 	    ;;
-	  powerpc-*)
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -1376,19 +1438,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
     [AC_LANG_PUSH(C)
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
      AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1396,7 +1459,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -1405,7 +1468,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -1421,7 +1484,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 ])# _LT_ENABLE_LOCK
 
 
@@ -1440,11 +1503,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      [echo conftest.$ac_objext > conftest.lst
       lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -1452,7 +1515,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      ])
   ])
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -1483,7 +1546,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -1519,7 +1582,7 @@ AC_CACHE_CHECK([$1], [$2],
   [$2=no
    m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -1546,7 +1609,7 @@ AC_CACHE_CHECK([$1], [$2],
    $RM conftest*
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$5], , :, [$5])
 else
     m4_if([$6], , :, [$6])
@@ -1568,7 +1631,7 @@ AC_DEFUN([_LT_LINKER_OPTION],
 m4_require([_LT_DECL_SED])dnl
 AC_CACHE_CHECK([$1], [$2],
   [$2=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $3"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -1587,10 +1650,10 @@ AC_CACHE_CHECK([$1], [$2],
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$4], , :, [$4])
 else
     m4_if([$5], , :, [$5])
@@ -1611,7 +1674,7 @@ AC_DEFUN([LT_CMD_MAX_LEN],
 AC_MSG_CHECKING([the maximum length of command line arguments])
 AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -1651,7 +1714,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1702,22 +1765,22 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-	test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -1733,7 +1796,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   esac
 ])
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
 else
   AC_MSG_RESULT(none)
@@ -1761,7 +1824,7 @@ m4_defun([_LT_HEADER_DLFCN],
 # ----------------------------------------------------------------
 m4_defun([_LT_TRY_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
+if test yes = "$cross_compiling"; then :
   [$4]
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -1808,9 +1871,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -1836,7 +1899,7 @@ int main ()
   return status;
 }]
 _LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -1857,7 +1920,7 @@ rm -fr conftest*
 # ------------------
 AC_DEFUN([LT_SYS_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
+if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -1867,44 +1930,52 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ])
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
+	  [lt_cv_dlopen=shl_load],
       [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
 	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
+	      [lt_cv_dlopen=dlopen],
 	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
 	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
 	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
 	      ])
 	    ])
 	  ])
@@ -1913,21 +1984,21 @@ else
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     AC_CACHE_CHECK([whether a program can dlopen itself],
@@ -1937,7 +2008,7 @@ else
 	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
     ])
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
 	  lt_cv_dlopen_self_static, [dnl
@@ -1947,9 +2018,9 @@ else
       ])
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -2041,8 +2112,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS],
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 _LT_COMPILER_C_O([$1])
 
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   AC_MSG_CHECKING([if we can lock with hard links])
   hard_links=yes
@@ -2052,8 +2123,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" !=
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
     need_locks=warn
   fi
 else
@@ -2080,8 +2151,8 @@ objdir=$lt_cv_objdir
 _LT_DECL([], [objdir], [0],
          [The name of the directory that contains temporary libtool files])dnl
 m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
 ])# _LT_CHECK_OBJDIR
 
 
@@ -2093,15 +2164,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
 _LT_TAGVAR(hardcode_action, $1)=
 if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
    test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
 
   # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
     # Linking always hardcodes the temporary library directory.
     _LT_TAGVAR(hardcode_action, $1)=relink
   else
@@ -2115,12 +2186,12 @@ else
 fi
 AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
 
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -2144,7 +2215,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
@@ -2162,6 +2233,47 @@ _LT_DECL([], [striplib], [1])
 ])# _LT_CMD_STRIPLIB
 
 
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x at S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
 # _LT_SYS_DYNAMIC_LINKER([TAG])
 # -----------------------------
 # PORTME Fill in your ld.so characteristics
@@ -2172,17 +2284,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
 	[], [
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -2198,28 +2311,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -2233,7 +2353,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -2242,7 +2362,7 @@ fi])
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -2259,14 +2379,17 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[[4-9]]*)
@@ -2274,41 +2397,91 @@ aix[[4-9]]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[[01]] | aix4.[[01]].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -2318,18 +2491,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -2337,8 +2510,8 @@ beos*)
 bsdi[[45]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -2350,7 +2523,7 @@ bsdi[[45]]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -2359,8 +2532,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -2376,17 +2549,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
 m4_if([$1], [],[
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -2395,8 +2568,8 @@ m4_if([$1], [],[
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -2423,7 +2596,7 @@ m4_if([$1], [],[
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -2436,8 +2609,8 @@ m4_if([$1], [],[
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -2450,7 +2623,7 @@ m4_if([$1], [],[
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -2463,8 +2636,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -2477,8 +2650,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2496,12 +2669,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -2531,10 +2705,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -2552,14 +2726,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -2567,8 +2742,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -2577,8 +2752,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -2591,8 +2766,8 @@ interix[[3-9]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2603,7 +2778,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -2611,8 +2786,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -2631,8 +2806,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -2641,13 +2816,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2672,7 +2867,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -2704,12 +2904,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -2719,7 +2919,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -2728,58 +2928,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -2790,8 +3000,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -2801,11 +3011,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -2813,8 +3023,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -2835,24 +3045,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -2870,7 +3080,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -2878,8 +3088,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2888,20 +3098,30 @@ uts4*)
   ;;
 esac
 AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
 _LT_DECL([], [variables_saved_for_relink], [1],
     [Variables whose values should be saved in libtool wrapper scripts and
     restored at link time])
@@ -2934,39 +3154,41 @@ _LT_DECL([], [hardcode_into_libs], [0],
     [Whether we should hardcode library paths into libraries])
 _LT_DECL([], [sys_lib_search_path_spec], [2],
     [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
 ])# _LT_SYS_DYNAMIC_LINKER
 
 
 # _LT_PATH_TOOL_PREFIX(TOOL)
 # --------------------------
-# find a file program which can recognize shared library
+# find a file program that can recognize shared library
 AC_DEFUN([_LT_PATH_TOOL_PREFIX],
 [m4_require([_LT_DECL_EGREP])dnl
 AC_MSG_CHECKING([for $1])
 AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
 [case $MAGIC_CMD in
 [[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
 dnl $ac_dummy forces splitting on constant user-supplied paths.
 dnl POSIX.2 word splitting is done only on the output of word expansions,
 dnl not every word.  This closes a longstanding sh security hole.
   ac_dummy="m4_if([$2], , $PATH, [$2])"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -2989,11 +3211,11 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   AC_MSG_RESULT($MAGIC_CMD)
 else
@@ -3011,7 +3233,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
 
 # _LT_PATH_MAGIC
 # --------------
-# find a file program which can recognize a shared library
+# find a file program that can recognize a shared library
 m4_defun([_LT_PATH_MAGIC],
 [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
 if test -z "$lt_cv_path_MAGIC_CMD"; then
@@ -3038,16 +3260,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
 	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
+    [test no = "$withval" || with_gnu_ld=yes],
     [with_gnu_ld=no])dnl
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by $CC])
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -3061,7 +3283,7 @@ if test "$GCC" = yes; then
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -3072,37 +3294,37 @@ if test "$GCC" = yes; then
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   AC_MSG_CHECKING([for GNU ld])
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
 AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi])
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
@@ -3156,13 +3378,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -3173,6 +3395,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
 ])# _LT_CMD_RELOAD
 
 
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
 # _LT_CHECK_MAGIC_METHOD
 # ----------------------
 # how to check for library dependencies
@@ -3188,13 +3447,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[[4-9]]*)
@@ -3221,8 +3480,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -3318,8 +3576,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
@@ -3372,6 +3630,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 ])
 
@@ -3412,33 +3673,38 @@ AC_DEFUN([LT_PATH_NM],
 AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -3449,21 +3715,21 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
     # Let the user override the test.
   else
     AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -3471,8 +3737,8 @@ else
     esac
   fi
   AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -3518,8 +3784,8 @@ lt_cv_sharedlib_from_linklib_cmd,
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -3531,7 +3797,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 ])
@@ -3558,13 +3824,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool
     lt_cv_path_mainfest_tool=yes
   fi
   rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
 ])# _LT_PATH_MANIFEST_TOOL
 
 
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
 # LT_LIB_M
 # --------
 # check for math library
@@ -3576,11 +3857,11 @@ case $host in
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
   AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
   ;;
 *)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
   ;;
 esac
 AC_SUBST([LIBM])
@@ -3599,7 +3880,7 @@ m4_defun([_LT_COMPILER_NO_RTTI],
 
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
@@ -3651,7 +3932,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[[ABCDGISTW]]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[[ABCDEGRST]]'
   fi
   ;;
@@ -3684,14 +3965,44 @@ case `$NM -V 2>&1` in
   symcode='[[ABCDGIRSTW]]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -3709,21 +4020,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx]"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -3763,11 +4077,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT@&t at _DLSYM_CONST
 #else
@@ -3793,7 +4107,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -3813,9 +4127,9 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -3836,7 +4150,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -3863,12 +4177,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
     [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
 _LT_DECL([global_symbol_to_c_name_address],
     [lt_cv_sys_global_symbol_to_c_name_address], [1],
     [Transform the output of nm in a C name address pair])
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
 _LT_DECL([], [nm_file_list_spec], [1],
     [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3884,17 +4202,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)=
 
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -3905,8 +4224,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -3922,6 +4241,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -3971,7 +4295,7 @@ m4_if([$1], [CXX], [
     case $host_os in
       aix[[4-9]]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	else
@@ -4012,14 +4336,14 @@ m4_if([$1], [CXX], [
 	case $cc_basename in
 	  CC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -4056,7 +4380,7 @@ m4_if([$1], [CXX], [
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
 	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
@@ -4201,17 +4525,18 @@ m4_if([$1], [CXX], [
   fi
 ],
 [
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -4222,8 +4547,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -4240,6 +4565,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -4310,7 +4640,7 @@ m4_if([$1], [CXX], [
     case $host_os in
     aix*)
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       else
@@ -4318,11 +4648,30 @@ m4_if([$1], [CXX], [
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -4338,7 +4687,7 @@ m4_if([$1], [CXX], [
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -4349,7 +4698,7 @@ m4_if([$1], [CXX], [
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4374,6 +4723,12 @@ m4_if([$1], [CXX], [
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -4471,7 +4826,7 @@ m4_if([$1], [CXX], [
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
@@ -4500,7 +4855,7 @@ m4_if([$1], [CXX], [
   fi
 ])
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     _LT_TAGVAR(lt_prog_compiler_pic, $1)=
     ;;
@@ -4566,17 +4921,21 @@ m4_if([$1], [CXX], [
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -4625,9 +4984,9 @@ m4_if([$1], [CXX], [
   # included in the symbol list
   _LT_TAGVAR(include_expsyms, $1)=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -4643,7 +5002,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -4651,7 +5010,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -4664,7 +5023,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -4686,24 +5045,24 @@ dnl Note also adjust exclude_expsyms for C++ above.
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       _LT_TAGVAR(whole_archive_flag_spec, $1)=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -4716,7 +5075,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     case $host_os in
     aix[[3-9]]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
@@ -4735,7 +5094,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -4751,7 +5110,7 @@ _LT_EOF
 	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4761,7 +5120,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -4769,61 +5128,89 @@ _LT_EOF
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
 
     haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -4834,42 +5221,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -4883,8 +5275,8 @@ _LT_EOF
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -4902,8 +5294,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4915,7 +5307,7 @@ _LT_EOF
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -4930,9 +5322,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -4949,15 +5341,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
     esac
 
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
       runpath_var=
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
       _LT_TAGVAR(export_dynamic_flag_spec, $1)=
@@ -4973,7 +5365,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	_LT_TAGVAR(hardcode_direct, $1)=unsupported
@@ -4981,34 +5373,57 @@ _LT_EOF
       ;;
 
     aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -5027,13 +5442,21 @@ _LT_EOF
       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[[012]]|aix4.[[012]].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -5052,62 +5475,80 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
-	_LT_TAGVAR(link_all_deplibs, $1)=no
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
 	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	  fi
 	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 3 [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -5116,7 +5557,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -5146,16 +5587,17 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -5164,18 +5606,18 @@ _LT_EOF
 	# Don't use ranlib
 	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -5184,7 +5626,7 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -5234,33 +5676,33 @@ _LT_EOF
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_direct, $1)=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5268,25 +5710,25 @@ _LT_EOF
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 	m4_if($1, [], [
@@ -5294,14 +5736,14 @@ _LT_EOF
 	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
 	  _LT_LINKER_OPTION([if $CC understands -b],
 	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
 	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	case $host_cpu in
@@ -5312,7 +5754,7 @@ _LT_EOF
 	*)
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -5323,16 +5765,16 @@ _LT_EOF
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
 	# This should be the same for all languages, so no per-tag cache variable.
 	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
 	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   AC_LINK_IFELSE(
 	     [AC_LANG_SOURCE(
 	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
@@ -5345,21 +5787,32 @@ _LT_EOF
       end]])])],
 	      [lt_cv_irix_exported_symbol=yes],
 	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(inherit_rpath, $1)=yes
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -5374,7 +5827,7 @@ _LT_EOF
     newsos6)
       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
@@ -5382,27 +5835,19 @@ _LT_EOF
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	fi
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5413,33 +5858,53 @@ _LT_EOF
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -5450,24 +5915,24 @@ _LT_EOF
 
     solaris*)
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -5477,11 +5942,11 @@ _LT_EOF
       solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	fi
@@ -5491,10 +5956,10 @@ _LT_EOF
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -5543,43 +6008,43 @@ _LT_EOF
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -5594,17 +6059,17 @@ _LT_EOF
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
 	;;
       esac
     fi
   fi
 ])
 AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
 _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
 
@@ -5621,7 +6086,7 @@ x|xyes)
   # Assume -lc should be added
   _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $_LT_TAGVAR(archive_cmds, $1) in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -5701,12 +6166,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary])
 _LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
     library is relocated])
 _LT_TAGDECL([], [hardcode_minus_L], [0],
     [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -5747,10 +6212,10 @@ dnl    [Compiler flag to generate thread safe objects])
 # ------------------------
 # Ensure that the configuration variables for a C compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_C_CONFIG],
 [m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
+lt_save_CC=$CC
 AC_LANG_PUSH(C)
 
 # Source file extension for C test sources.
@@ -5790,18 +6255,18 @@ if test -n "$compiler"; then
   LT_SYS_DLOPEN_SELF
   _LT_CMD_STRIPLIB
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   AC_MSG_CHECKING([if libtool supports shared libraries])
   AC_MSG_RESULT([$can_build_shared])
 
   AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -5809,8 +6274,12 @@ if test -n "$compiler"; then
     ;;
 
   aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -5818,13 +6287,13 @@ if test -n "$compiler"; then
 
   AC_MSG_CHECKING([whether to build static libraries])
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   AC_MSG_RESULT([$enable_static])
 
   _LT_CONFIG($1)
 fi
 AC_LANG_POP
-CC="$lt_save_CC"
+CC=$lt_save_CC
 ])# _LT_LANG_C_CONFIG
 
 
@@ -5832,14 +6301,14 @@ CC="$lt_save_CC"
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_CXX_CONFIG],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   AC_PROG_CXXCPP
 else
   _lt_caught_CXX_error=yes
@@ -5881,7 +6350,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -5923,35 +6392,35 @@ if test "$_lt_caught_CXX_error" != yes; then
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
     else
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
       LT_PATH_LD
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           _LT_TAGVAR(whole_archive_flag_spec, $1)=
         fi
@@ -5987,18 +6456,30 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=no
         ;;
       aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -6008,6 +6489,13 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -6026,13 +6514,21 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
         _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[[012]]|aix4.[[012]].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -6050,64 +6546,84 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
           _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
 	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	    fi
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -6117,7 +6633,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  _LT_TAGVAR(ld_shlibs, $1)=no
 	fi
@@ -6145,57 +6661,58 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 	  # Don't use ranlib
 	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  _LT_TAGVAR(always_export_symbols, $1)=no
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -6206,6 +6723,34 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_DARWIN_LINKER_FEATURES($1)
 	;;
 
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -6241,14 +6786,14 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         ;;
 
       hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
         _LT_TAGVAR(hardcode_direct, $1)=yes
         _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
 				             # but as the default
@@ -6260,7 +6805,7 @@ if test "$_lt_caught_CXX_error" != yes; then
             _LT_TAGVAR(ld_shlibs, $1)=no
             ;;
           aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -6269,11 +6814,11 @@ if test "$_lt_caught_CXX_error" != yes; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
@@ -6283,15 +6828,15 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
               ;;
           esac
         fi
@@ -6317,13 +6862,13 @@ if test "$_lt_caught_CXX_error" != yes; then
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -6334,20 +6879,20 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -6362,22 +6907,22 @@ if test "$_lt_caught_CXX_error" != yes; then
       interix[[3-9]]*)
 	_LT_TAGVAR(hardcode_direct, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -6386,17 +6931,17 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    _LT_TAGVAR(link_all_deplibs, $1)=yes
 	    ;;
         esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
@@ -6409,8 +6954,8 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -6419,10 +6964,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -6436,59 +6981,59 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
 	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -6502,18 +7047,18 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -6521,10 +7066,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      _LT_TAGVAR(compiler_needs_object, $1)=yes
 
 	      # Not sure whether something based on
@@ -6582,22 +7127,17 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -6613,9 +7153,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	    # Archives containing C++ object files must be created using
@@ -6633,17 +7173,17 @@ if test "$_lt_caught_CXX_error" != yes; then
           cxx*)
 	    case $host in
 	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
 		;;
 	    esac
@@ -6658,21 +7198,21 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -6718,9 +7258,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
 	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
 	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -6728,7 +7268,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -6745,30 +7285,30 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -6776,11 +7316,11 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -6789,52 +7329,52 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
 	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
 	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
 	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
+              '"$_LT_TAGVAR(reload_cmds, $1)"
 	    ;;
 	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -6865,10 +7405,10 @@ if test "$_lt_caught_CXX_error" != yes; then
     esac
 
     AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -6895,7 +7435,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
@@ -6917,13 +7457,14 @@ AC_REQUIRE([_LT_DECL_SED])
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
   esac
 } # func_stripname_cnf
 ])# _LT_FUNC_STRIPNAME_CNF
 
+
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
@@ -7007,13 +7548,13 @@ if AC_TRY_EVAL(ac_compile); then
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -7029,16 +7570,16 @@ if AC_TRY_EVAL(ac_compile); then
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
 	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -7046,9 +7587,9 @@ if AC_TRY_EVAL(ac_compile); then
 	 esac
        else
 	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
 	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
 	 fi
        fi
        prev=
@@ -7063,15 +7604,15 @@ if AC_TRY_EVAL(ac_compile); then
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
+	   _LT_TAGVAR(predep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
 	 fi
        else
 	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	   _LT_TAGVAR(postdep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
 	 fi
@@ -7102,51 +7643,6 @@ interix[[3-9]]*)
   _LT_TAGVAR(postdep_objects,$1)=
   _LT_TAGVAR(postdeps,$1)=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 ])
 
@@ -7155,7 +7651,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in
 esac
  _LT_TAGVAR(compiler_lib_search_dirs, $1)=
 if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 _LT_TAGDECL([], [compiler_lib_search_dirs], [1],
     [The directories searched by this compiler when creating a shared library])
@@ -7175,10 +7671,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_F77_CONFIG],
 [AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
+if test -z "$F77" || test no = "$F77"; then
   _lt_disable_F77=yes
 fi
 
@@ -7215,7 +7711,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the F77 compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
+if test yes != "$_lt_disable_F77"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7237,7 +7733,7 @@ if test "$_lt_disable_F77" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
@@ -7251,21 +7747,25 @@ if test "$_lt_disable_F77" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7273,11 +7773,11 @@ if test "$_lt_disable_F77" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7294,9 +7794,9 @@ if test "$_lt_disable_F77" != yes; then
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
@@ -7306,11 +7806,11 @@ AC_LANG_POP
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_FC_CONFIG],
 [AC_LANG_PUSH(Fortran)
 
-if test -z "$FC" || test "X$FC" = "Xno"; then
+if test -z "$FC" || test no = "$FC"; then
   _lt_disable_FC=yes
 fi
 
@@ -7347,7 +7847,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the FC compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
+if test yes != "$_lt_disable_FC"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7369,7 +7869,7 @@ if test "$_lt_disable_FC" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
@@ -7385,21 +7885,25 @@ if test "$_lt_disable_FC" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7407,11 +7911,11 @@ if test "$_lt_disable_FC" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7431,7 +7935,7 @@ if test "$_lt_disable_FC" != yes; then
   GCC=$lt_save_GCC
   CC=$lt_save_CC
   CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
+fi # test yes != "$_lt_disable_FC"
 
 AC_LANG_POP
 ])# _LT_LANG_FC_CONFIG
@@ -7441,7 +7945,7 @@ AC_LANG_POP
 # --------------------------
 # Ensure that the configuration variables for the GNU Java Compiler compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GCJ_CONFIG],
 [AC_REQUIRE([LT_PROG_GCJ])dnl
 AC_LANG_SAVE
@@ -7475,7 +7979,7 @@ CC=${GCJ-"gcj"}
 CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # GCJ did not exist at the time GCC didn't implicitly link libc in.
@@ -7512,7 +8016,7 @@ CFLAGS=$lt_save_CFLAGS
 # --------------------------
 # Ensure that the configuration variables for the GNU Go compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GO_CONFIG],
 [AC_REQUIRE([LT_PROG_GO])dnl
 AC_LANG_SAVE
@@ -7546,7 +8050,7 @@ CC=${GOC-"gccgo"}
 CFLAGS=$GOFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # Go did not exist at the time GCC didn't implicitly link libc in.
@@ -7583,7 +8087,7 @@ CFLAGS=$lt_save_CFLAGS
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_RC_CONFIG],
 [AC_REQUIRE([LT_PROG_RC])dnl
 AC_LANG_SAVE
@@ -7599,7 +8103,7 @@ _LT_TAGVAR(objext, $1)=$objext
 lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
 
 # Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+lt_simple_link_test_code=$lt_simple_compile_test_code
 
 # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 _LT_TAG_COMPILER
@@ -7609,7 +8113,7 @@ _LT_COMPILER_BOILERPLATE
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
 lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
@@ -7638,7 +8142,7 @@ AC_DEFUN([LT_PROG_GCJ],
 [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
   [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
     [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
       AC_SUBST(GCJFLAGS)])])[]dnl
 ])
 
@@ -7749,7 +8253,7 @@ lt_ac_count=0
 # Add /usr/xpg4/bin/sed as it is typically found on Solaris
 # along with /bin/sed that truncates output.
 for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
+  test ! -f "$lt_ac_sed" && continue
   cat /dev/null > conftest.in
   lt_ac_count=0
   echo $ECHO_N "0123456789$ECHO_C" >conftest.in
@@ -7766,9 +8270,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
     $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
     cmp -s conftest.out conftest.nl || break
     # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
+    test 10 -lt "$lt_ac_count" && break
     lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
       lt_ac_max=$lt_ac_count
       lt_cv_path_SED=$lt_ac_sed
     fi
@@ -7792,27 +8296,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], [])
 # Find out whether the shell is Bourne or XSI compatible,
 # or has some other useful features.
 m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
   lt_unset=false
@@ -7836,102 +8320,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
 ])# _LT_CHECK_SHELL_FEATURES
 
 
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
 # _LT_PATH_CONVERSION_FUNCTIONS
 # -----------------------------
-# Determine which file name conversion functions should be used by
+# Determine what file name conversion functions should be used by
 # func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
 # for certain cross-compile configurations and native mingw.
 m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
index 5d9acd8..94b0829 100644
--- a/m4/ltoptions.m4
+++ b/m4/ltoptions.m4
@@ -1,14 +1,14 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 7 ltoptions.m4
+# serial 8 ltoptions.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -29,7 +29,7 @@ m4_define([_LT_SET_OPTION],
 [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
 m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
         _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
 ])
 
 
@@ -75,13 +75,15 @@ m4_if([$1],[LT_INIT],[
   dnl
   dnl If no reference was made to various pairs of opposing options, then
   dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
   dnl archives by default:
   _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
   _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
   ])
 ])# _LT_SET_OPTIONS
 
@@ -112,7 +114,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
 [_LT_SET_OPTION([LT_INIT], [dlopen])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
+put the 'dlopen' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -148,7 +150,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
 _LT_SET_OPTION([LT_INIT], [win32-dll])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
+put the 'win32-dll' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -157,9 +159,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
 
 # _LT_ENABLE_SHARED([DEFAULT])
 # ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_SHARED],
 [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([shared],
@@ -172,14 +174,14 @@ AC_ARG_ENABLE([shared],
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
@@ -211,9 +213,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
 
 # _LT_ENABLE_STATIC([DEFAULT])
 # ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_STATIC],
 [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([static],
@@ -226,14 +228,14 @@ AC_ARG_ENABLE([static],
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
@@ -265,9 +267,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
 
 # _LT_ENABLE_FAST_INSTALL([DEFAULT])
 # ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_FAST_INSTALL],
 [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([fast-install],
@@ -280,14 +282,14 @@ AC_ARG_ENABLE([fast-install],
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
@@ -304,14 +306,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
+the 'fast-install' option into LT_INIT's first parameter.])
 ])
 
 AU_DEFUN([AC_DISABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
+the 'disable-fast-install' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -319,11 +321,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
 dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 
 
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
 # _LT_WITH_PIC([MODE])
 # --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
 # LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
     [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
@@ -334,19 +389,17 @@ m4_define([_LT_WITH_PIC],
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+    [pic_mode=m4_default([$1], [default])])
 
 _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
 ])# _LT_WITH_PIC
@@ -359,7 +412,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
 [_LT_SET_OPTION([LT_INIT], [pic-only])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
+put the 'pic-only' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
index 9000a05..48bc934 100644
--- a/m4/ltsugar.m4
+++ b/m4/ltsugar.m4
@@ -1,6 +1,7 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -33,7 +34,7 @@ m4_define([_lt_join],
 # ------------
 # Manipulate m4 lists.
 # These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
+# Autoconf-2.59, which quotes differently.
 m4_define([lt_car], [[$1]])
 m4_define([lt_cdr],
 [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
@@ -44,7 +45,7 @@ m4_define([lt_unquote], $1)
 
 # lt_append(MACRO-NAME, STRING, [SEPARATOR])
 # ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
 # Note that neither SEPARATOR nor STRING are expanded; they are appended
 # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
 # No SEPARATOR is output if MACRO-NAME was previously undefined (different
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
index 07a8602..fa04b52 100644
--- a/m4/ltversion.m4
+++ b/m4/ltversion.m4
@@ -1,6 +1,6 @@
 # ltversion.m4 -- version numbers			-*- Autoconf -*-
 #
-#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -9,15 +9,15 @@
 
 # @configure_input@
 
-# serial 3337 ltversion.m4
+# serial 4179 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
index c573da9..c6b26f8 100644
--- a/m4/lt~obsolete.m4
+++ b/m4/lt~obsolete.m4
@@ -1,6 +1,7 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
@@ -11,7 +12,7 @@
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
 # which have later been changed to m4_define as they aren't part of the
 # exported API, or moved to Autoconf or Automake where they belong.
 #
@@ -25,7 +26,7 @@
 # included after everything else.  This provides aclocal with the
 # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
 # because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
 #
 # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
 # Yes, that means every name once taken will need to remain here until
diff --git a/m4/pkg.m4 b/m4/pkg.m4
index 9a71878..82bea96 100644
--- a/m4/pkg.m4
+++ b/m4/pkg.m4
@@ -1,29 +1,60 @@
-# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
-# serial 1 (pkg-config-0.24)
-# 
-# Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# PKG_PROG_PKG_CONFIG([MIN-VERSION])
-# ----------------------------------
+dnl pkg.m4 - Macros to locate and utilise pkg-config.   -*- Autoconf -*-
+dnl serial 11 (pkg-config-0.29.1)
+dnl
+dnl Copyright © 2004 Scott James Remnant <scott at netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists at gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl     [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.1])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+    [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
 AC_DEFUN([PKG_PROG_PKG_CONFIG],
 [m4_pattern_forbid([^_?PKG_[A-Z_]+$])
 m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
@@ -45,18 +76,19 @@ if test -n "$PKG_CONFIG"; then
 		PKG_CONFIG=""
 	fi
 fi[]dnl
-])# PKG_PROG_PKG_CONFIG
-
-# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# Check to see whether a particular set of modules exists.  Similar
-# to PKG_CHECK_MODULES(), but does not set variables or print errors.
-#
-# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-# only at the first occurence in configure.ac, so if the first place
-# it's called might be skipped (such as if it is within an "if", you
-# have to call PKG_CHECK_EXISTS manually
-# --------------------------------------------------------------
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
 AC_DEFUN([PKG_CHECK_EXISTS],
 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
 if test -n "$PKG_CONFIG" && \
@@ -66,8 +98,10 @@ m4_ifvaln([$3], [else
   $3])dnl
 fi])
 
-# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
-# ---------------------------------------------
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
 m4_define([_PKG_CONFIG],
 [if test -n "$$1"; then
     pkg_cv_[]$1="$$1"
@@ -79,10 +113,11 @@ m4_define([_PKG_CONFIG],
  else
     pkg_failed=untried
 fi[]dnl
-])# _PKG_CONFIG
+])dnl _PKG_CONFIG
 
-# _PKG_SHORT_ERRORS_SUPPORTED
-# -----------------------------
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
 AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])
 if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -90,19 +125,17 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
 else
         _pkg_short_errors_supported=no
 fi[]dnl
-])# _PKG_SHORT_ERRORS_SUPPORTED
-
-
-# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
-# [ACTION-IF-NOT-FOUND])
-#
-#
-# Note that if there is a possibility the first call to
-# PKG_CHECK_MODULES might not happen, you should be sure to include an
-# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
-#
-#
-# --------------------------------------------------------------
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
 AC_DEFUN([PKG_CHECK_MODULES],
 [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
 AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
@@ -156,4 +189,87 @@ else
         AC_MSG_RESULT([yes])
 	$3
 fi[]dnl
-])# PKG_CHECK_MODULES
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl   [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+    [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+    [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt
new file mode 100644
index 0000000..59e197c
--- /dev/null
+++ b/man/CMakeLists.txt
@@ -0,0 +1,43 @@
+install(FILES
+	ceph-osd.8
+	ceph-mds.8
+	ceph-mon.8
+	ceph-syn.8
+	crushtool.8
+	osdmaptool.8
+	monmaptool.8
+	ceph-conf.8
+	ceph-run.8
+	ceph.8
+	mount.ceph.8
+	ceph-create-keys.8
+	radosgw.8
+	radosgw-admin.8
+	ceph-authtool.8
+	rados.8
+	librados-config.8
+	ceph-clsinfo.8
+	ceph-debugpack.8
+	cephfs.8
+	ceph-dencoder.8
+	ceph-rest-api.8
+	ceph-post-file.8
+  DESTINATION ${CEPH_MAN_DIR}/man8)
+
+if(HAVE_LIBFUSE)
+  install(FILES
+	ceph-fuse.8
+	rbd-fuse.8
+	DESTINATION ${CEPH_MAN_DIR}/man8)
+endif()
+
+if(WITH_RBD)
+  install(FILES
+	ceph-rbdnamer.8
+	rbd-nbd.8
+	rbd-replay-prep.8
+	rbd-replay.8
+	rbdmap.8
+	rbd.8
+	DESTINATION ${CEPH_MAN_DIR}/man8)
+endif()
diff --git a/man/Makefile.am b/man/Makefile.am
index 40506ba..0dcf038 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -1,6 +1,6 @@
 AUTOMAKE_OPTIONS = gnu
 
-EXTRA_DIST = conf.py ceph_selinux.8
+EXTRA_DIST = conf.py ceph_selinux.8 CMakeLists.txt
 
 dist_man_MANS = 
 
diff --git a/man/Makefile.in b/man/Makefile.in
index 6a80e84..c8d587c 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,7 +14,17 @@
 
 @SET_MAKE@
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -78,9 +88,6 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
-DIST_COMMON = $(srcdir)/Makefile-client.am \
-	$(srcdir)/Makefile-server.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(dist_man_MANS)
 @ENABLE_CLIENT_TRUE@@WITH_MAN_PAGES_TRUE at am__append_1 = \
 @ENABLE_CLIENT_TRUE@@WITH_MAN_PAGES_TRUE@	ceph-syn.8 \
 @ENABLE_CLIENT_TRUE@@WITH_MAN_PAGES_TRUE@	ceph-conf.8 \
@@ -159,6 +166,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/acconfig.h
 CONFIG_CLEAN_FILES =
@@ -214,13 +222,14 @@ am__installdirs = "$(DESTDIR)$(man8dir)"
 NROFF = nroff
 MANS = $(dist_man_MANS)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile-client.am \
+	$(srcdir)/Makefile-server.am $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -306,6 +315,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -404,6 +414,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -419,7 +430,7 @@ top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = gnu
-EXTRA_DIST = conf.py ceph_selinux.8
+EXTRA_DIST = conf.py ceph_selinux.8 CMakeLists.txt
 dist_man_MANS = $(am__append_1) $(am__append_2) $(am__append_3) \
 	$(am__append_4) $(am__append_5) $(am__append_6) \
 	$(am__append_7) $(am__append_8) $(am__append_9) \
@@ -440,7 +451,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile-client.am $(src
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --gnu man/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -449,7 +459,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(srcdir)/Makefile-client.am $(srcdir)/Makefile-server.am:
+$(srcdir)/Makefile-client.am $(srcdir)/Makefile-server.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -667,6 +677,8 @@ uninstall-man: uninstall-man8
 	ps ps-am tags-am uninstall uninstall-am uninstall-man \
 	uninstall-man8
 
+.PRECIOUS: Makefile
+
 
 # prevent `make` from running in parallel, sphinx runs better in batch mode.
 @WITH_MAN_PAGES_TRUE at .PHONY: sphinx-build.stamp
diff --git a/man/ceph-authtool.8 b/man/ceph-authtool.8
index 953ba14..8c5f657 100644
--- a/man/ceph-authtool.8
+++ b/man/ceph-authtool.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-AUTHTOOL" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-AUTHTOOL" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-authtool \- ceph keyring manipulation tool
 .
diff --git a/man/ceph-clsinfo.8 b/man/ceph-clsinfo.8
index bb62ace..68742f6 100644
--- a/man/ceph-clsinfo.8
+++ b/man/ceph-clsinfo.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-CLSINFO" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-CLSINFO" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-clsinfo \- show class object information
 .
diff --git a/man/ceph-conf.8 b/man/ceph-conf.8
index 761b750..525ac6f 100644
--- a/man/ceph-conf.8
+++ b/man/ceph-conf.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-CONF" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-CONF" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-conf \- ceph conf file tool
 .
diff --git a/man/ceph-create-keys.8 b/man/ceph-create-keys.8
index b97c967..f289ddd 100644
--- a/man/ceph-create-keys.8
+++ b/man/ceph-create-keys.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-CREATE-KEYS" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-CREATE-KEYS" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-create-keys \- ceph keyring generate tool
 .
diff --git a/man/ceph-debugpack.8 b/man/ceph-debugpack.8
index daa4466..9b835ab 100644
--- a/man/ceph-debugpack.8
+++ b/man/ceph-debugpack.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-DEBUGPACK" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-DEBUGPACK" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-debugpack \- ceph debug packer utility
 .
diff --git a/man/ceph-dencoder.8 b/man/ceph-dencoder.8
index 7b46673..310e724 100644
--- a/man/ceph-dencoder.8
+++ b/man/ceph-dencoder.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-DENCODER" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-DENCODER" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-dencoder \- ceph encoder/decoder utility
 .
diff --git a/man/ceph-deploy.8 b/man/ceph-deploy.8
index 5dadae7..75bacf8 100644
--- a/man/ceph-deploy.8
+++ b/man/ceph-deploy.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-DEPLOY" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-DEPLOY" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-deploy \- Ceph deployment tool
 .
@@ -233,7 +233,7 @@ were created then a concatenated keyring is used for deployment of monitors. In
 this process a keyring parser is used which looks for \fB[entity]\fP sections in
 monitor keyrings and returns a list of those sections. A helper is then used to
 collect all keyrings into a single blob that will be used to inject it to monitors
-with \fI\-\-mkfs\fP on remote nodes. All keyring files are concatenated to be
+with \fB\-\-mkfs\fP on remote nodes. All keyring files are concatenated to be
 in a directory ending with \fB\&.keyring\fP\&. During this process the helper uses list
 of sections returned by keyring parser to check if an entity is already present
 in a keyring and if not, adds it. The concatenated keyring is used for deployment
diff --git a/man/ceph-detect-init.8 b/man/ceph-detect-init.8
index cebd66b..e740ae5 100644
--- a/man/ceph-detect-init.8
+++ b/man/ceph-detect-init.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-DETECT-INIT" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-DETECT-INIT" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-detect-init \- display the init system Ceph should use
 .
diff --git a/man/ceph-disk.8 b/man/ceph-disk.8
index 5c9c9f6..835959a 100644
--- a/man/ceph-disk.8
+++ b/man/ceph-disk.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-DISK" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-DISK" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-disk \- Ceph disk utility for OSD
 .
diff --git a/man/ceph-fuse.8 b/man/ceph-fuse.8
index f421ba5..181905b 100644
--- a/man/ceph-fuse.8
+++ b/man/ceph-fuse.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-FUSE" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-FUSE" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-fuse \- FUSE-based client for ceph
 .
diff --git a/man/ceph-mds.8 b/man/ceph-mds.8
index 99fd9fa..fc2ca71 100644
--- a/man/ceph-mds.8
+++ b/man/ceph-mds.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-MDS" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-MDS" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-mds \- ceph metadata server daemon
 .
diff --git a/man/ceph-mon.8 b/man/ceph-mon.8
index ecd39b7..4f0755b 100644
--- a/man/ceph-mon.8
+++ b/man/ceph-mon.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-MON" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-MON" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-mon \- ceph monitor daemon
 .
diff --git a/man/ceph-osd.8 b/man/ceph-osd.8
index bb7ecda..3e7f87f 100644
--- a/man/ceph-osd.8
+++ b/man/ceph-osd.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-OSD" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-OSD" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-osd \- ceph object storage daemon
 .
diff --git a/man/ceph-post-file.8 b/man/ceph-post-file.8
index 81c8ecf..4a8c103 100644
--- a/man/ceph-post-file.8
+++ b/man/ceph-post-file.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-POST-FILE" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-POST-FILE" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-post-file \- post files for ceph developers
 .
diff --git a/man/ceph-rbdnamer.8 b/man/ceph-rbdnamer.8
index 1aa3adb..91e8117 100644
--- a/man/ceph-rbdnamer.8
+++ b/man/ceph-rbdnamer.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-RBDNAMER" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-RBDNAMER" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-rbdnamer \- udev helper to name RBD devices
 .
diff --git a/man/ceph-rest-api.8 b/man/ceph-rest-api.8
index 159e89b..b0c642c 100644
--- a/man/ceph-rest-api.8
+++ b/man/ceph-rest-api.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-REST-API" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-REST-API" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-rest-api \- ceph RESTlike administration server
 .
diff --git a/man/ceph-run.8 b/man/ceph-run.8
index 4f01ddd..f847d7e 100644
--- a/man/ceph-run.8
+++ b/man/ceph-run.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-RUN" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-RUN" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-run \- restart daemon on core dump
 .
diff --git a/man/ceph-syn.8 b/man/ceph-syn.8
index f97049f..133ba78 100644
--- a/man/ceph-syn.8
+++ b/man/ceph-syn.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH-SYN" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH-SYN" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph-syn \- ceph synthetic workload generator
 .
diff --git a/man/ceph.8 b/man/ceph.8
index d57535f..73a1cfd 100644
--- a/man/ceph.8
+++ b/man/ceph.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPH" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPH" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 ceph \- ceph administration tool
 .
diff --git a/man/cephfs.8 b/man/cephfs.8
index 60f8d34..2285e8a 100644
--- a/man/cephfs.8
+++ b/man/cephfs.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CEPHFS" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CEPHFS" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 cephfs \- ceph file system options utility
 .
diff --git a/man/crushtool.8 b/man/crushtool.8
index 1101e25..6759926 100644
--- a/man/crushtool.8
+++ b/man/crushtool.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "CRUSHTOOL" "8" "September 21, 2016" "dev" "Ceph"
+.TH "CRUSHTOOL" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 crushtool \- CRUSH map manipulation tool
 .
diff --git a/man/librados-config.8 b/man/librados-config.8
index 311d954..ee67304 100644
--- a/man/librados-config.8
+++ b/man/librados-config.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "LIBRADOS-CONFIG" "8" "September 21, 2016" "dev" "Ceph"
+.TH "LIBRADOS-CONFIG" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 librados-config \- display information about librados
 .
diff --git a/man/monmaptool.8 b/man/monmaptool.8
index a4896d2..ecde0b0 100644
--- a/man/monmaptool.8
+++ b/man/monmaptool.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "MONMAPTOOL" "8" "September 21, 2016" "dev" "Ceph"
+.TH "MONMAPTOOL" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 monmaptool \- ceph monitor cluster map manipulation tool
 .
diff --git a/man/mount.ceph.8 b/man/mount.ceph.8
index 45e3217..05e91d8 100644
--- a/man/mount.ceph.8
+++ b/man/mount.ceph.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "MOUNT.CEPH" "8" "September 21, 2016" "dev" "Ceph"
+.TH "MOUNT.CEPH" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 mount.ceph \- mount a ceph file system
 .
@@ -74,12 +74,15 @@ passed only after these fixed arguments.
 .INDENT 0.0
 .TP
 .B \fBwsize\fP
-int, max write size. Default: none (writeback uses smaller of wsize
+int (bytes), max write size. Default: none (writeback uses smaller of wsize
 and stripe unit)
 .TP
 .B \fBrsize\fP
-int (bytes), max readahead, multiple of 1024, Default: 524288
-(512*1024)
+int (bytes), max read size. Default: none
+.TP
+.B \fBrasize\fP
+int (bytes), max readahead, multiple of 1024, Default: 8388608
+(8192*1024)
 .TP
 .B \fBosdtimeout\fP
 int (seconds), Default: 60
diff --git a/man/osdmaptool.8 b/man/osdmaptool.8
index 383ae44..39a203f 100644
--- a/man/osdmaptool.8
+++ b/man/osdmaptool.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "OSDMAPTOOL" "8" "September 21, 2016" "dev" "Ceph"
+.TH "OSDMAPTOOL" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 osdmaptool \- ceph osd cluster map manipulation tool
 .
diff --git a/man/rados.8 b/man/rados.8
index ecc5bb4..aba8f80 100644
--- a/man/rados.8
+++ b/man/rados.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RADOS" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RADOS" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rados \- rados object storage utility
 .
diff --git a/man/radosgw-admin.8 b/man/radosgw-admin.8
index 45da485..ed1e0a2 100644
--- a/man/radosgw-admin.8
+++ b/man/radosgw-admin.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RADOSGW-ADMIN" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RADOSGW-ADMIN" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 radosgw-admin \- rados REST gateway user administration utility
 .
@@ -469,6 +469,23 @@ Data pool to scan for leaked rados objects
 .B \-\-num\-shards
 Number of shards to use for keeping the temporary scan info
 .UNINDENT
+.INDENT 0.0
+.TP
+.B \-\-orphan\-stale\-secs
+Number of seconds to wait before declaring an object to be an orphan.
+Default is 86400 (24 hours).
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-\-job\-id
+Set the job id (for orphans find)
+.UNINDENT
+.INDENT 0.0
+.TP
+.B \-\-max\-concurrent\-ios
+Maximum concurrent ios for orphans find.
+Default is 32.
+.UNINDENT
 .SH EXAMPLES
 .sp
 Generate a new user:
diff --git a/man/radosgw.8 b/man/radosgw.8
index 1825139..69a7204 100644
--- a/man/radosgw.8
+++ b/man/radosgw.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RADOSGW" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RADOSGW" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 radosgw \- rados REST gateway
 .
diff --git a/man/rbd-fuse.8 b/man/rbd-fuse.8
index 57399f1..a96a8de 100644
--- a/man/rbd-fuse.8
+++ b/man/rbd-fuse.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-FUSE" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD-FUSE" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd-fuse \- expose rbd images as files
 .
diff --git a/man/rbd-mirror.8 b/man/rbd-mirror.8
index c3c9d10..80d1d44 100644
--- a/man/rbd-mirror.8
+++ b/man/rbd-mirror.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-MIRROR" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD-MIRROR" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd-mirror \- Ceph daemon for mirroring RBD images
 .
diff --git a/man/rbd-nbd.8 b/man/rbd-nbd.8
index aa816f5..04e1d53 100644
--- a/man/rbd-nbd.8
+++ b/man/rbd-nbd.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-NBD" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD-NBD" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd-nbd \- map rbd images to nbd device
 .
diff --git a/man/rbd-replay-many.8 b/man/rbd-replay-many.8
index f0bed2c..23e15a2 100644
--- a/man/rbd-replay-many.8
+++ b/man/rbd-replay-many.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-REPLAY-MANY" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD-REPLAY-MANY" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd-replay-many \- replay a rados block device (RBD) workload on several clients
 .
diff --git a/man/rbd-replay-prep.8 b/man/rbd-replay-prep.8
index 36982cb..d80da65 100644
--- a/man/rbd-replay-prep.8
+++ b/man/rbd-replay-prep.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-REPLAY-PREP" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD-REPLAY-PREP" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd-replay-prep \- prepare captured rados block device (RBD) workloads for replay
 .
diff --git a/man/rbd-replay.8 b/man/rbd-replay.8
index 60c8786..4b43301 100644
--- a/man/rbd-replay.8
+++ b/man/rbd-replay.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD-REPLAY" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD-REPLAY" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd-replay \- replay rados block device (RBD) workloads
 .
diff --git a/man/rbd.8 b/man/rbd.8
index e1aa861..2ac572b 100644
--- a/man/rbd.8
+++ b/man/rbd.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBD" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBD" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbd \- manage rados block device (RBD) images
 .
@@ -33,7 +33,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .SH SYNOPSIS
 .nf
 \fBrbd\fP [ \-c \fIceph.conf\fP ] [ \-m \fImonaddr\fP ] [\-\-cluster \fIcluster name\fP]
-[ \-p | \-\-pool \fIpool\fP ] [\-\-size \fIsize\fP ] [ \-\-object\-size \fIB/K/M\fP ] [ \fIcommand\fP ... ]
+[ \-p | \-\-pool \fIpool\fP ] [ \fIcommand\fP ... ]
 .fi
 .sp
 .SH DESCRIPTION
@@ -90,19 +90,22 @@ features in the future.
 .UNINDENT
 .INDENT 0.0
 .TP
-.B \-\-size size\-in\-M/G/T
-Specifies the size (in M/G/T) of the new rbd image.
+.B \-s size\-in\-M/G/T, \-\-size size\-in\-M/G/T
+Specifies the size of the new rbd image or the new size of the existing rbd
+image in M/G/T.  If no suffix is given, unit M is assumed.
 .UNINDENT
 .INDENT 0.0
 .TP
-.B \-\-object\-size B/K/M
-Specifies the object size in B/K/M, it will be rounded up the nearest power of two.
-The default object size is 4 MB, smallest is 4K and maximum is 32M.
+.B \-\-object\-size size\-in\-B/K/M
+Specifies the object size in B/K/M.  Object size will be rounded up the
+nearest power of two; if no suffix is given, unit B is assumed.  The default
+object size is 4M, smallest is 4K and maximum is 32M.
 .UNINDENT
 .INDENT 0.0
 .TP
 .B \-\-stripe\-unit size\-in\-B/K/M
-Specifies the stripe unit size in B/K/M.  See striping section (below) for more details.
+Specifies the stripe unit size in B/K/M.  If no suffix is given, unit B is
+assumed.  See striping section (below) for more details.
 .UNINDENT
 .INDENT 0.0
 .TP
@@ -155,10 +158,11 @@ Make json or xml formatted output more human\-readable.
 .UNINDENT
 .INDENT 0.0
 .TP
-.B \-o map\-options, \-\-options map\-options
-Specifies which options to use when mapping an image.  map\-options is
-a comma\-separated string of options (similar to mount(8) mount options).
-See map options section below for more details.
+.B \-o krbd\-options, \-\-options krbd\-options
+Specifies which options to use when mapping or unmapping an image via the
+rbd kernel driver.  krbd\-options is a comma\-separated list of options
+(similar to mount(8) mount options).  See kernel rbd (krbd) options section
+below for more details.
 .UNINDENT
 .INDENT 0.0
 .TP
@@ -226,11 +230,11 @@ Will dump information (such as size and object size) about a specific rbd image.
 If image is a clone, information about its parent is also displayed.
 If a snapshot is specified, whether it is protected is shown as well.
 .TP
-.B \fBcreate\fP (\-s | \-\-size \fIsize\-in\-M/G/T\fP) [\-\-image\-format \fIformat\-id\fP] [\-\-object\-size \fIB/K/M\fP] [\-\-stripe\-unit \fIsize\-in\-B/K/M\fP \-\-stripe\-count \fInum\fP] [\-\-image\-feature \fIfeature\-name\fP]... [\-\-image\-shared] \fIimage\-spec\fP
+.B \fBcreate\fP (\-s | \-\-size \fIsize\-in\-M/G/T\fP) [\-\-image\-format \fIformat\-id\fP] [\-\-object\-size \fIsize\-in\-B/K/M\fP] [\-\-stripe\-unit \fIsize\-in\-B/K/M\fP \-\-stripe\-count \fInum\fP] [\-\-image\-feature \fIfeature\-name\fP]... [\-\-image\-shared] \fIimage\-spec\fP
 Will create a new rbd image. You must also specify the size via \-\-size.  The
 \-\-stripe\-unit and \-\-stripe\-count arguments are optional, but must be used together.
 .TP
-.B \fBclone\fP [\-\-object\-size \fIB/K/M\fP] [\-\-stripe\-unit \fIsize\-in\-B/K/M\fP \-\-stripe\-count \fInum\fP] [\-\-image\-feature \fIfeature\-name\fP] [\-\-image\-shared] \fIparent\-snap\-spec\fP \fIchild\-image\-spec\fP
+.B \fBclone\fP [\-\-object\-size \fIsize\-in\-B/K/M\fP] [\-\-stripe\-unit \fIsize\-in\-B/K/M\fP \-\-stripe\-count \fInum\fP] [\-\-image\-feature \fIfeature\-name\fP] [\-\-image\-shared] \fIparent\-snap\-spec\fP \fIchild\-image\-spec\fP
 Will create a clone (copy\-on\-write child) of the parent snapshot.
 Object size will be identical to that of the parent image unless
 specified. Size will be the same as the parent snapshot. The \-\-stripe\-unit
@@ -264,7 +268,7 @@ snapshots, this fails and nothing is deleted.
 .B \fBexport\fP (\fIimage\-spec\fP | \fIsnap\-spec\fP) [\fIdest\-path\fP]
 Exports image to dest path (use \- for stdout).
 .TP
-.B \fBimport\fP [\-\-image\-format \fIformat\-id\fP] [\-\-object\-size \fIB/K/M\fP] [\-\-stripe\-unit \fIsize\-in\-B/K/M\fP \-\-stripe\-count \fInum\fP] [\-\-image\-feature \fIfeature\-name\fP]... [\-\-image\-shared] \fIsrc\-path\fP [\fIimage\-spec\fP]
+.B \fBimport\fP [\-\-image\-format \fIformat\-id\fP] [\-\-object\-size \fIsize\-in\-B/K/M\fP] [\-\-stripe\-unit \fIsize\-in\-B/K/M\fP \-\-stripe\-count \fInum\fP] [\-\-image\-feature \fIfeature\-name\fP]... [\-\-image\-shared] \fIsrc\-path\fP [\fIimage\-spec\fP]
 Creates a new image and imports its data from path (use \- for
 stdin).  The import operation will try to create sparse rbd images
 if possible.  For import from stdin, the sparsification unit is
@@ -357,10 +361,10 @@ in different pools than the parent snapshot.)
 .sp
 This requires image format 2.
 .TP
-.B \fBmap\fP [\-o | \-\-options \fImap\-options\fP ] [\-\-read\-only] \fIimage\-spec\fP | \fIsnap\-spec\fP
+.B \fBmap\fP [\-o | \-\-options \fIkrbd\-options\fP ] [\-\-read\-only] \fIimage\-spec\fP | \fIsnap\-spec\fP
 Maps the specified image to a block device via the rbd kernel module.
 .TP
-.B \fBunmap\fP \fIimage\-spec\fP | \fIsnap\-spec\fP | \fIdevice\-path\fP
+.B \fBunmap\fP [\-o | \-\-options \fIkrbd\-options\fP ] \fIimage\-spec\fP | \fIsnap\-spec\fP | \fIdevice\-path\fP
 Unmaps the block device that was mapped via the rbd kernel module.
 .TP
 .B \fBshowmapped\fP
@@ -402,9 +406,10 @@ protect an image from being deleted.
 Release a lock on an image. The lock id and locker are
 as output by lock ls.
 .TP
-.B \fBbench\-write\fP [\-\-io\-size \fIsize\-in\-B/K/M/G/T\fP] [\-\-io\-threads \fInum\-ios\-in\-flight\fP] [\-\-io\-total \fItotal\-size\-to\-write\-in\-B/K/M/G/T\fP] [\-\-io\-pattern seq | rand] \fIimage\-spec\fP
+.B \fBbench\-write\fP [\-\-io\-size \fIsize\-in\-B/K/M/G/T\fP] [\-\-io\-threads \fInum\-ios\-in\-flight\fP] [\-\-io\-total \fIsize\-in\-B/K/M/G/T\fP] [\-\-io\-pattern seq | rand] \fIimage\-spec\fP
 Generate a series of writes to the image and measure the write throughput and
-latency.  Defaults are: \-\-io\-size 4096, \-\-io\-threads 16, \-\-io\-total 1G,
+latency.  If no suffix is given, unit B is assumed for both \-\-io\-size and
+\-\-io\-total.  Defaults are: \-\-io\-size 4096, \-\-io\-threads 16, \-\-io\-total 1G,
 \-\-io\-pattern seq.
 .UNINDENT
 .SH IMAGE AND SNAP SPECS
@@ -451,13 +456,13 @@ we move on to the next [\fIstripe_count\fP] objects.
 By default, [\fIstripe_unit\fP] is the same as the object size and [\fIstripe_count\fP] is 1.  Specifying a different
 [\fIstripe_unit\fP] requires that the STRIPINGV2 feature be supported (added in Ceph v0.53) and format 2 images be
 used.
-.SH MAP OPTIONS
+.SH KERNEL RBD (KRBD) OPTIONS
 .sp
 Most of these options are useful mainly for debugging and benchmarking.  The
 default values are set in the kernel and may therefore depend on the version of
 the running kernel.
 .sp
-libceph (per client instance) options:
+Per client instance \fIrbd map\fP options:
 .INDENT 0.0
 .IP \(bu 2
 fsid=aaaaaaaa\-bbbb\-cccc\-dddd\-eeeeeeeeeeee \- FSID that should be assumed by
@@ -498,7 +503,7 @@ osdkeepalive=x \- OSD keepalive timeout (default is 5 seconds).
 osd_idle_ttl=x \- OSD idle TTL (default is 60 seconds).
 .UNINDENT
 .sp
-Mapping (per block device) options:
+Per mapping (block device) \fIrbd map\fP options:
 .INDENT 0.0
 .IP \(bu 2
 rw \- Map the image read\-write (default).
@@ -506,6 +511,17 @@ rw \- Map the image read\-write (default).
 ro \- Map the image read\-only.  Equivalent to \-\-read\-only.
 .IP \(bu 2
 queue_depth=x \- queue depth (since 4.2, default is 128 requests).
+.IP \(bu 2
+lock_on_read \- Acquire exclusive lock on reads, in addition to writes and
+discards (since 4.9).
+.UNINDENT
+.sp
+\fIrbd unmap\fP options:
+.INDENT 0.0
+.IP \(bu 2
+force \- Force the unmapping of a block device that is open (since 4.9).  The
+driver will wait for running requests to complete and then unmap; requests
+sent to the driver after initiating the unmap will be failed.
 .UNINDENT
 .SH EXAMPLES
 .sp
diff --git a/man/rbdmap.8 b/man/rbdmap.8
index 10a098f..346b357 100644
--- a/man/rbdmap.8
+++ b/man/rbdmap.8
@@ -1,6 +1,6 @@
 .\" Man page generated from reStructuredText.
 .
-.TH "RBDMAP" "8" "September 21, 2016" "dev" "Ceph"
+.TH "RBDMAP" "8" "December 09, 2016" "dev" "Ceph"
 .SH NAME
 rbdmap \- map RBD devices at boot time
 .
diff --git a/missing b/missing
index db98974..f62bbae 100755
--- a/missing
+++ b/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/py-compile b/py-compile
index 46ea866..bc20391 100755
--- a/py-compile
+++ b/py-compile
@@ -3,7 +3,7 @@
 
 scriptversion=2011-06-08.12; # UTC
 
-# Copyright (C) 2000-2013 Free Software Foundation, Inc.
+# Copyright (C) 2000-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/qa/Makefile b/qa/Makefile
new file mode 100644
index 0000000..ad655b7
--- /dev/null
+++ b/qa/Makefile
@@ -0,0 +1,4 @@
+DIRS= workunits btrfs
+
+all:
+	for d in $(DIRS) ; do ( cd $$d ; $(MAKE) all ) ; done
diff --git a/qa/btrfs/.gitignore b/qa/btrfs/.gitignore
new file mode 100644
index 0000000..530c1b5
--- /dev/null
+++ b/qa/btrfs/.gitignore
@@ -0,0 +1,3 @@
+/clone_range
+/test_async_snap
+/create_async_snap
diff --git a/qa/btrfs/Makefile b/qa/btrfs/Makefile
new file mode 100644
index 0000000..be95ecf
--- /dev/null
+++ b/qa/btrfs/Makefile
@@ -0,0 +1,11 @@
+CFLAGS = -Wall -Wextra -D_GNU_SOURCE
+
+TARGETS = clone_range test_async_snap create_async_snap
+
+.c:
+	$(CC) $(CFLAGS) $@.c -o $@
+
+all:	$(TARGETS)
+
+clean:
+	rm $(TARGETS)
diff --git a/qa/btrfs/clone_range.c b/qa/btrfs/clone_range.c
new file mode 100644
index 0000000..0a88e16
--- /dev/null
+++ b/qa/btrfs/clone_range.c
@@ -0,0 +1,35 @@
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <string.h>
+
+#include <linux/types.h>
+#include "../../src/os/btrfs_ioctl.h"
+#include <stdio.h>
+#include <errno.h>
+
+int main(int argc, char **argv)
+{
+        struct btrfs_ioctl_clone_range_args ca;
+        int dfd;
+        int r;
+
+	if (argc < 6) {
+		printf("usage: %s <srcfn> <srcoffset> <srclen> <destfn> <destoffset>\n", argv[0]);
+		exit(1);
+	}
+
+        ca.src_fd = open(argv[1], O_RDONLY);
+        ca.src_offset = atoi(argv[2]);
+        ca.src_length = atoi(argv[3]);
+        dfd = open(argv[4], O_WRONLY|O_CREAT);
+        ca.dest_offset = atoi(argv[5]);
+
+        r = ioctl(dfd, BTRFS_IOC_CLONE_RANGE, &ca);
+        printf("clone_range %s %lld %lld~%lld to %s %d %lld = %d %s\n",
+               argv[1], ca.src_fd,
+	       ca.src_offset, ca.src_length,
+	       argv[4], dfd,
+               ca.dest_offset, r, strerror(errno));
+        return r;
+}
diff --git a/qa/btrfs/create_async_snap.c b/qa/btrfs/create_async_snap.c
new file mode 100644
index 0000000..2ef22af
--- /dev/null
+++ b/qa/btrfs/create_async_snap.c
@@ -0,0 +1,34 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <string.h>
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+#include "../../src/os/btrfs_ioctl.h"
+
+struct btrfs_ioctl_vol_args_v2 va;
+
+int main(int argc, char **argv)
+{
+	int fd;
+	int r;
+
+	if (argc != 3) {
+		printf("usage: %s <source subvol> <name>\n", argv[0]);
+		return 1;
+	}
+	printf("creating snap ./%s from %s\n", argv[2], argv[1]);
+	fd = open(".", O_RDONLY);
+	va.fd = open(argv[1], O_RDONLY);
+	va.flags = BTRFS_SUBVOL_CREATE_ASYNC;
+	strcpy(va.name, argv[2]);
+	r = ioctl(fd, BTRFS_IOC_SNAP_CREATE_V2, (unsigned long long)&va);
+	printf("result %d\n", r ? -errno:0);
+	return r;
+}
diff --git a/qa/btrfs/test_async_snap.c b/qa/btrfs/test_async_snap.c
new file mode 100644
index 0000000..211be95
--- /dev/null
+++ b/qa/btrfs/test_async_snap.c
@@ -0,0 +1,83 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <string.h>
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+#include "../../src/os/btrfs_ioctl.h"
+
+struct btrfs_ioctl_vol_args_v2 va;
+struct btrfs_ioctl_vol_args vold;
+int max = 4;
+
+void check_return(int r)
+{
+	if (r < 0) {
+		printf("********* failed with %d %s ********\n", errno, strerror(errno));
+		exit(1);
+	}
+}
+
+int main(int argc, char **argv)
+{
+	int num = 1000;
+
+	if (argc > 1)
+		num = atoi(argv[1]);
+	printf("will do %d iterations\n", num);
+
+        int cwd = open(".", O_RDONLY);
+        printf("cwd = %d\n", cwd);
+        while (num-- > 0) {
+		if (rand() % 10 == 0) {
+			__u64 transid;
+			int r;
+			printf("sync starting\n");
+			r = ioctl(cwd, BTRFS_IOC_START_SYNC, &transid);
+			check_return(r);
+			printf("sync started, transid %lld, waiting\n", transid);
+			r = ioctl(cwd, BTRFS_IOC_WAIT_SYNC, &transid);
+			check_return(r);
+			printf("sync finished\n");	
+		}
+
+                int i = rand() % max;
+                struct stat st;
+                va.fd = cwd;
+                sprintf(va.name, "test.%d", i);
+                va.transid = 0;
+                int r = stat(va.name, &st);
+                if (r < 0) {
+			if (rand() % 3 == 0) {
+				printf("snap create (sync) %s\n", va.name);
+				va.flags = 0;
+				r = ioctl(cwd, BTRFS_IOC_SNAP_CREATE_V2, &va);
+				check_return(r);
+			} else {
+				printf("snap create (async) %s\n", va.name);
+				va.flags = BTRFS_SUBVOL_CREATE_ASYNC;
+				r = ioctl(cwd, BTRFS_IOC_SNAP_CREATE_V2, &va);
+				check_return(r);
+				printf("snap created, transid %lld\n", va.transid);
+				if (rand() % 2 == 0) {
+					printf("waiting for async snap create\n");
+					r = ioctl(cwd, BTRFS_IOC_WAIT_SYNC, &va.transid);
+					check_return(r);
+				}
+                        }
+                } else {
+                        printf("snap remove %s\n", va.name);
+			vold.fd = va.fd;
+			strcpy(vold.name, va.name);
+                        r = ioctl(cwd, BTRFS_IOC_SNAP_DESTROY, &vold);
+			check_return(r);
+                }
+        }
+	return 0;
+}
diff --git a/qa/btrfs/test_rmdir_async_snap b/qa/btrfs/test_rmdir_async_snap
new file mode 100755
index 0000000..f128a6b
Binary files /dev/null and b/qa/btrfs/test_rmdir_async_snap differ
diff --git a/qa/btrfs/test_rmdir_async_snap.c b/qa/btrfs/test_rmdir_async_snap.c
new file mode 100644
index 0000000..5dafaac
--- /dev/null
+++ b/qa/btrfs/test_rmdir_async_snap.c
@@ -0,0 +1,62 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <string.h>
+
+#include <linux/ioctl.h>
+#include <linux/types.h>
+#include "../../src/os/btrfs_ioctl.h"
+
+struct btrfs_ioctl_vol_args_v2 va;
+struct btrfs_ioctl_vol_args vold;
+
+int main(int argc, char **argv)
+{
+	int num = 1000;
+	int i, r, fd;
+	char buf[30];
+
+	if (argc > 1)
+		num = atoi(argv[1]);
+	printf("will do %d iterations\n", num);
+	
+	fd = open(".", O_RDONLY);
+	vold.fd = 0;
+	strcpy(vold.name, "current");
+	r = ioctl(fd, BTRFS_IOC_SUBVOL_CREATE, (unsigned long int)&vold);
+	printf("create current ioctl got %d\n", r ? errno:0);
+	if (r)
+		return 1;
+
+	for (i=0; i<num; i++) {
+		sprintf(buf, "current/dir.%d", i);
+		r = mkdir(buf, 0755);
+		printf("mkdir got %d\n", r ? errno:0);
+		if (r)
+			return 1;
+	}
+
+	va.fd = open("current", O_RDONLY);
+	va.flags = BTRFS_SUBVOL_CREATE_ASYNC;
+	for (i=0; i<num; i++) {
+		system("/bin/cp /boot/vmlinuz-3.2.0-ceph-00142-g9e98323 current/foo");
+		sprintf(buf, "current/dir.%d", i);
+		r = rmdir(buf);
+		printf("rmdir got %d\n", r ? errno:0);
+		if (r)
+			return 1;
+
+		if (i % 10) continue;
+		sprintf(va.name, "snap.%d", i);
+		r = ioctl(fd, BTRFS_IOC_SNAP_CREATE_V2, (unsigned long long)&va);
+		printf("ioctl got %d\n", r ? errno:0);
+		if (r)
+			return 1;
+	}
+	return 0;
+}
diff --git a/qa/client/30_subdir_mount.sh b/qa/client/30_subdir_mount.sh
new file mode 100755
index 0000000..00f4f02
--- /dev/null
+++ b/qa/client/30_subdir_mount.sh
@@ -0,0 +1,22 @@
+#!/bin/bash -x
+
+basedir=`echo $0 | sed 's/[^/]*$//g'`.
+. $basedir/common.sh
+
+client_mount
+mkdir -p $mnt/sub
+echo sub > $mnt/sub/file
+client_umount
+
+mkdir -p $mnt/1
+mkdir -p $mnt/2
+/bin/mount -t ceph $monhost:/sub $mnt/1
+grep sub $mnt/1/file
+
+/bin/mount -t ceph $monhost:/ $mnt/2
+grep sub $mnt/2/sub/file
+
+/bin/umount $mnt/1
+grep sub $mnt/2/sub/file
+
+/bin/umount $mnt/2
diff --git a/qa/client/common.sh b/qa/client/common.sh
new file mode 100644
index 0000000..d06368e
--- /dev/null
+++ b/qa/client/common.sh
@@ -0,0 +1,58 @@
+
+# defaults
+[ -z "$bindir" ] && bindir=$PWD       # location of init-ceph
+[ -z "$conf" ] && conf="$basedir/ceph.conf"
+[ -z "$mnt" ] && mnt="/c"
+[ -z "$monhost" ] && monhost="cosd0"
+
+set -e
+
+mydir=`hostname`_`echo $0 | sed 's/\//_/g'`
+
+client_mount()
+{
+    /bin/mount -t ceph $monhost:/ $mnt
+}
+
+client_umount()
+{
+    /bin/umount $mnt
+    # look for VFS complaints
+    if dmesg | tail -n 50 | grep -c "VFS: Busy inodes" ; then
+	echo "looks like we left inodes pinned"
+	exit 1
+    fi
+}
+
+ceph_start()
+{
+    $bindir/init-ceph -c $conf start ${1}
+}
+
+ceph_stop()
+{
+    $bindir/init-ceph -c $conf stop ${1}
+}
+
+ceph_restart()
+{
+    $bindir/init-ceph -c $conf restart ${1}
+}
+
+ceph_command()
+{
+    $bindir/ceph -c $conf $*
+}
+
+client_enter_mydir()
+{
+    pushd .
+    test -d $mnt/$mydir && rm -r $mnt/$mydir
+    mkdir $mnt/$mydir
+    cd $mnt/$mydir
+}
+
+client_leave_mydir()
+{
+    popd
+}
diff --git a/qa/client/gen-1774.sh b/qa/client/gen-1774.sh
new file mode 100644
index 0000000..ab59266
--- /dev/null
+++ b/qa/client/gen-1774.sh
@@ -0,0 +1,2067 @@
+#! /bin/bash -e
+
+mount () { :; }
+umount () { :; }
+
+list="\
+abiword.control
+abiword.list
+abiword-plugin-latex.control
+abiword-plugin-latex.list
+abiword-plugin-opendocument.control
+abiword-plugin-opendocument.list
+abiword-plugin-openxml.control
+abiword-plugin-openxml.list
+abiword-plugin-pdf.control
+abiword-plugin-pdf.list
+abiword-plugin-wikipedia.control
+abiword-plugin-wikipedia.list
+abiword.postinst
+aceofpenguins.control
+aceofpenguins-launcher.control
+aceofpenguins-launcher.list
+aceofpenguins.list
+aceofpenguins.postinst
+alsa-conf-base.control
+alsa-conf-base.list
+alsa-scenarii-shr.conffiles
+alsa-scenarii-shr.control
+alsa-scenarii-shr.list
+alsa-utils-alsactl.control
+alsa-utils-alsactl.list
+alsa-utils-alsamixer.control
+alsa-utils-alsamixer.list
+alsa-utils-amixer.control
+alsa-utils-amixer.list
+alsa-utils-aplay.control
+alsa-utils-aplay.list
+angstrom-libc-fixup-hack.control
+angstrom-libc-fixup-hack.list
+angstrom-libc-fixup-hack.postinst
+apmd.control
+apmd.list
+apmd.postinst
+apmd.postrm
+apmd.prerm
+aspell.control
+aspell.list
+atd-over-fso.control
+atd-over-fso.list
+atd-over-fso.postinst
+atd-over-fso.postrm
+atd-over-fso.prerm
+base-files.conffiles
+base-files.control
+base-files.list
+base-passwd.control
+base-passwd.list
+base-passwd.postinst
+bash.control
+bash.list
+bash.postinst
+bluez4.control
+bluez4.list
+bluez4.postinst
+bluez4.postrm
+bluez4.prerm
+boost-signals.control
+boost-signals.list
+boost-signals.postinst
+busybox.control
+busybox.list
+busybox-mountall.control
+busybox-mountall.list
+busybox-mountall.postinst
+busybox-mountall.prerm
+busybox.postinst
+busybox.prerm
+busybox-syslog.conffiles
+busybox-syslog.control
+busybox-syslog.list
+busybox-syslog.postinst
+busybox-syslog.postrm
+busybox-syslog.prerm
+ca-certificates.conffiles
+ca-certificates.control
+ca-certificates.list
+ca-certificates.postinst
+calc.control
+calc.list
+connman.control
+connman.list
+connman-plugin-udhcp.control
+connman-plugin-udhcp.list
+connman-plugin-wifi.control
+connman-plugin-wifi.list
+connman.postinst
+connman.postrm
+connman.prerm
+connman-scripts.control
+connman-scripts.list
+cpio.control
+cpio.list
+cpio.postinst
+cpio.prerm
+cpp.control
+cpp.list
+cpp-symlinks.control
+cpp-symlinks.list
+cron.control
+cron.list
+cron.postinst
+cron.postrm
+cron.prerm
+curl.control
+curl.list
+dbus.conffiles
+dbus.control
+dbus-daemon-proxy.control
+dbus-daemon-proxy.list
+dbus-hlid.control
+dbus-hlid.list
+dbus.list
+dbus.postinst
+dbus.postrm
+dbus.prerm
+dbus-x11.control
+dbus-x11.list
+devmem2.control
+devmem2.list
+distro-feed-configs.conffiles
+distro-feed-configs.control
+distro-feed-configs.list
+dosfstools.control
+dosfstools.list
+e2fsprogs-badblocks.control
+e2fsprogs-badblocks.list
+e2fsprogs.control
+e2fsprogs-e2fsck.control
+e2fsprogs-e2fsck.list
+e2fsprogs-e2fsck.postinst
+e2fsprogs-e2fsck.prerm
+e2fsprogs.list
+e2fsprogs-mke2fs.control
+e2fsprogs-mke2fs.list
+e2fsprogs-mke2fs.postinst
+e2fsprogs-mke2fs.prerm
+e2fsprogs.postinst
+e2fsprogs.prerm
+ecore-con.control
+ecore-con.list
+ecore-con.postinst
+ecore.control
+ecore-evas.control
+ecore-evas.list
+ecore-evas.postinst
+ecore-fb.control
+ecore-fb.list
+ecore-fb.postinst
+ecore-file.control
+ecore-file.list
+ecore-file.postinst
+ecore-imf.control
+ecore-imf-evas.control
+ecore-imf-evas.list
+ecore-imf-evas.postinst
+ecore-imf.list
+ecore-imf.postinst
+ecore-input.control
+ecore-input.list
+ecore-input.postinst
+ecore-ipc.control
+ecore-ipc.list
+ecore-ipc.postinst
+ecore.list
+ecore.postinst
+ecore-x.control
+ecore-x.list
+ecore-x.postinst
+edbus.control
+edbus.list
+edbus.postinst
+edje.control
+edje.list
+edje.postinst
+edje-utils.control
+edje-utils.list
+efreet.control
+efreet.list
+efreet.postinst
+eggdbus.control
+eggdbus.list
+eggdbus.postinst
+eglibc-binary-localedata-en-us.control
+eglibc-binary-localedata-en-us.list
+eglibc-charmap-utf-8.control
+eglibc-charmap-utf-8.list
+eglibc-gconv.control
+eglibc-gconv-cp1252.control
+eglibc-gconv-cp1252.list
+eglibc-gconv-ibm850.control
+eglibc-gconv-ibm850.list
+eglibc-gconv-iso8859-15.control
+eglibc-gconv-iso8859-15.list
+eglibc-gconv-iso8859-1.control
+eglibc-gconv-iso8859-1.list
+eglibc-gconv.list
+eglibc-localedata-i18n.control
+eglibc-localedata-i18n.list
+eglibc-localedata-iso14651-t1-common.control
+eglibc-localedata-iso14651-t1-common.list
+eglibc-localedata-iso14651-t1.control
+eglibc-localedata-iso14651-t1.list
+eglibc-localedata-translit-circle.control
+eglibc-localedata-translit-circle.list
+eglibc-localedata-translit-cjk-compat.control
+eglibc-localedata-translit-cjk-compat.list
+eglibc-localedata-translit-compat.control
+eglibc-localedata-translit-compat.list
+eglibc-localedata-translit-font.control
+eglibc-localedata-translit-font.list
+eglibc-localedata-translit-fraction.control
+eglibc-localedata-translit-fraction.list
+eglibc-localedata-translit-narrow.control
+eglibc-localedata-translit-narrow.list
+eglibc-localedata-translit-neutral.control
+eglibc-localedata-translit-neutral.list
+eglibc-localedata-translit-small.control
+eglibc-localedata-translit-small.list
+eglibc-localedata-translit-wide.control
+eglibc-localedata-translit-wide.list
+eglibc-utils.control
+eglibc-utils.list
+eina.control
+eina.list
+eina.postinst
+eject.control
+eject.list
+elementary-theme-gry.control
+elementary-theme-gry.list
+emacs-x11.control
+emacs-x11.list
+embryo.control
+embryo.list
+embryo.postinst
+embryo-tests.control
+embryo-tests.list
+enchant.control
+enchant.list
+enchant.postinst
+epdfview.control
+epdfview.list
+espeak.control
+espeak.list
+espeak.postinst
+evas.control
+evas-engine-buffer.control
+evas-engine-buffer.list
+evas-engine-fb.control
+evas-engine-fb.list
+evas-engine-software-16.control
+evas-engine-software-16.list
+evas-engine-software-16-x11.control
+evas-engine-software-16-x11.list
+evas-engine-software-generic.control
+evas-engine-software-generic.list
+evas-engine-software-x11.control
+evas-engine-software-x11.list
+evas-engine-xrender-x11.control
+evas-engine-xrender-x11.list
+evas.list
+evas-loader-eet.control
+evas-loader-eet.list
+evas-loader-jpeg.control
+evas-loader-jpeg.list
+evas-loader-png.control
+evas-loader-png.list
+evas.postinst
+evas-saver-eet.control
+evas-saver-eet.list
+evas-saver-jpeg.control
+evas-saver-jpeg.list
+evas-saver-png.control
+evas-saver-png.list
+evtest.control
+evtest.list
+e-wm-config-default.control
+e-wm-config-default.list
+e-wm-config-illume2-shr.control
+e-wm-config-illume2-shr.list
+e-wm-config-illume-shr.control
+e-wm-config-illume-shr.list
+e-wm.control
+e-wm-icons.control
+e-wm-icons.list
+e-wm-images.control
+e-wm-images.list
+e-wm-input-methods.control
+e-wm-input-methods.list
+e-wm.list
+e-wm-menu-shr.control
+e-wm-menu-shr.list
+e-wm-other.control
+e-wm-other.list
+e-wm.postinst
+e-wm.postrm
+e-wm-sysactions-shr.control
+e-wm-sysactions-shr.list
+e-wm-theme-default.control
+e-wm-theme-default.list
+e-wm-theme-illume-gry.control
+e-wm-theme-illume-gry.list
+e-wm-theme-illume-shr.control
+e-wm-theme-illume-shr.list
+e-wm-utils.control
+e-wm-utils.list
+fbreader.control
+fbreader.list
+fbreader.postinst
+fbset.control
+fbset.list
+fbset-modes.conffiles
+fbset-modes.control
+fbset-modes.list
+fbset.postinst
+fbset.postrm
+ffalarms.control
+ffalarms.list
+file.control
+file.list
+file.postinst
+findutils.control
+findutils.list
+findutils.postinst
+findutils.prerm
+flac.control
+flac.list
+flite.control
+flite.list
+fontconfig-utils.control
+fontconfig-utils.list
+font-update-common.control
+font-update-common.list
+frameworkd-config-shr.conffiles
+frameworkd-config-shr.control
+frameworkd-config-shr.list
+frameworkd.control
+frameworkd.list
+frameworkd.postinst
+frameworkd.postrm
+frameworkd.prerm
+fso-abyss-config.conffiles
+fso-abyss-config.control
+fso-abyss-config.list
+fso-abyss.control
+fso-abyss.list
+fso-apm.control
+fso-apm.list
+fsodatad.control
+fsodatad.list
+fsodatad.postinst
+fsodeviced.control
+fsodeviced.list
+fsodeviced.postinst
+fsodeviced.postrm
+fsodeviced.prerm
+fso-gpsd.control
+fso-gpsd.list
+fso-gpsd.postinst
+fso-gpsd.postrm
+fso-gpsd.prerm
+fsogsmd.control
+fsogsmd.list
+fsogsmd.postinst
+fsonetworkd.control
+fsonetworkd.list
+fsonetworkd.postinst
+fsoraw.control
+fsoraw.list
+fsotdld.control
+fsotdld.list
+fsotdld.postinst
+fsousaged.control
+fsousaged.list
+fsousaged.postinst
+gcc.control
+gcc.list
+gconf.control
+gconf.list
+gconf.postinst
+g++.control
+gdb.control
+gdb.list
+gdk-pixbuf-loader-gif.control
+gdk-pixbuf-loader-gif.list
+gdk-pixbuf-loader-gif.postinst
+gdk-pixbuf-loader-jpeg.control
+gdk-pixbuf-loader-jpeg.list
+gdk-pixbuf-loader-jpeg.postinst
+gdk-pixbuf-loader-png.control
+gdk-pixbuf-loader-png.list
+gdk-pixbuf-loader-png.postinst
+gdk-pixbuf-loader-xpm.control
+gdk-pixbuf-loader-xpm.list
+gdk-pixbuf-loader-xpm.postinst
+git.control
+git.list
+g++.list
+gnome-pty-helper.control
+gnome-pty-helper.list
+gnome-vfs.control
+gnome-vfs.list
+gnome-vfs-plugin-file.control
+gnome-vfs-plugin-file.list
+gnome-vfs.postinst
+gnome-vfs.prerm
+gnupg.control
+gnupg.list
+gpe-icons.control
+gpe-icons.list
+gpe-icons.postinst
+gpe-icons.postrm
+gpe-scap.control
+gpe-scap.list
+gpe-sketchbook.control
+gpe-sketchbook.list
+gpgv.control
+gpgv.list
+gridpad.control
+gridpad.list
+gst-plugin-alsa.control
+gst-plugin-alsa.list
+gst-plugin-audioconvert.control
+gst-plugin-audioconvert.list
+gst-plugin-autodetect.control
+gst-plugin-autodetect.list
+gst-plugin-gconfelements.control
+gst-plugin-gconfelements.list
+gst-plugin-gconfelements.postinst
+gst-plugin-gconfelements.prerm
+gst-plugin-mad.control
+gst-plugin-mad.list
+gstreamer.control
+gstreamer.list
+gstreamer.postinst
+gtk+.control
+gtk+.list
+gtk+.postinst
+hal.control
+hal-info.control
+hal-info.list
+hal.list
+hal.postinst
+hal.postrm
+hdparm.control
+hdparm.list
+hdparm.postinst
+hdparm.prerm
+hicolor-icon-theme.control
+hicolor-icon-theme.list
+hicolor-icon-theme.postinst
+hicolor-icon-theme.postrm
+htop.control
+htop.list
+i2c-tools.control
+i2c-tools.list
+id3lib.control
+id3lib.list
+id3lib.postinst
+iliwi.control
+iliwi.list
+illume-keyboard-default-alpha.control
+illume-keyboard-default-alpha.list
+illume-keyboard-default-terminal.control
+illume-keyboard-default-terminal.list
+illume-keyboard-numeric-alt.control
+illume-keyboard-numeric-alt.list
+imagemagick.control
+imagemagick.list
+imagemagick.postinst
+initscripts-shr.control
+initscripts-shr.list
+intone.control
+intone.list
+iptables.control
+iptables.list
+iptables.postinst
+kernel-2.6.29-rc3.control
+kernel-2.6.29-rc3.list
+kernel.control
+kernel-image-2.6.29-rc3.control
+kernel-image-2.6.29-rc3.list
+kernel-image-2.6.29-rc3.postinst
+kernel.list
+kernel-module-ar6000.control
+kernel-module-ar6000.list
+kernel-module-ar6000.postinst
+kernel-module-ar6000.postrm
+kernel-module-arc4.control
+kernel-module-arc4.list
+kernel-module-arc4.postinst
+kernel-module-arc4.postrm
+kernel-module-asix.control
+kernel-module-asix.list
+kernel-module-asix.postinst
+kernel-module-asix.postrm
+kernel-module-bluetooth.control
+kernel-module-bluetooth.list
+kernel-module-bluetooth.postinst
+kernel-module-bluetooth.postrm
+kernel-module-bnep.control
+kernel-module-bnep.list
+kernel-module-bnep.postinst
+kernel-module-bnep.postrm
+kernel-module-btusb.control
+kernel-module-btusb.list
+kernel-module-btusb.postinst
+kernel-module-btusb.postrm
+kernel-module-crc-ccitt.control
+kernel-module-crc-ccitt.list
+kernel-module-crc-ccitt.postinst
+kernel-module-crc-ccitt.postrm
+kernel-module-ecb.control
+kernel-module-ecb.list
+kernel-module-ecb.postinst
+kernel-module-ecb.postrm
+kernel-module-exportfs.control
+kernel-module-exportfs.list
+kernel-module-exportfs.postinst
+kernel-module-exportfs.postrm
+kernel-module-gadgetfs.control
+kernel-module-gadgetfs.list
+kernel-module-gadgetfs.postinst
+kernel-module-gadgetfs.postrm
+kernel-module-g-ether.control
+kernel-module-g-ether.list
+kernel-module-g-ether.postinst
+kernel-module-g-ether.postrm
+kernel-module-g-file-storage.control
+kernel-module-g-file-storage.list
+kernel-module-g-file-storage.postinst
+kernel-module-g-file-storage.postrm
+kernel-module-g-serial.control
+kernel-module-g-serial.list
+kernel-module-g-serial.postinst
+kernel-module-g-serial.postrm
+kernel-module-hidp.control
+kernel-module-hidp.list
+kernel-module-hidp.postinst
+kernel-module-hidp.postrm
+kernel-module-iptable-filter.control
+kernel-module-iptable-filter.list
+kernel-module-iptable-filter.postinst
+kernel-module-iptable-filter.postrm
+kernel-module-iptable-nat.control
+kernel-module-iptable-nat.list
+kernel-module-iptable-nat.postinst
+kernel-module-iptable-nat.postrm
+kernel-module-ip-tables.control
+kernel-module-ip-tables.list
+kernel-module-ip-tables.postinst
+kernel-module-ip-tables.postrm
+kernel-module-ipt-masquerade.control
+kernel-module-ipt-masquerade.list
+kernel-module-ipt-masquerade.postinst
+kernel-module-ipt-masquerade.postrm
+kernel-module-l2cap.control
+kernel-module-l2cap.list
+kernel-module-l2cap.postinst
+kernel-module-l2cap.postrm
+kernel-module-lockd.control
+kernel-module-lockd.list
+kernel-module-lockd.postinst
+kernel-module-lockd.postrm
+kernel-module-michael-mic.control
+kernel-module-michael-mic.list
+kernel-module-michael-mic.postinst
+kernel-module-michael-mic.postrm
+kernel-module-nf-conntrack.control
+kernel-module-nf-conntrack-ipv4.control
+kernel-module-nf-conntrack-ipv4.list
+kernel-module-nf-conntrack-ipv4.postinst
+kernel-module-nf-conntrack-ipv4.postrm
+kernel-module-nf-conntrack.list
+kernel-module-nf-conntrack.postinst
+kernel-module-nf-conntrack.postrm
+kernel-module-nf-defrag-ipv4.control
+kernel-module-nf-defrag-ipv4.list
+kernel-module-nf-defrag-ipv4.postinst
+kernel-module-nf-defrag-ipv4.postrm
+kernel-module-nf-nat.control
+kernel-module-nf-nat.list
+kernel-module-nf-nat.postinst
+kernel-module-nf-nat.postrm
+kernel-module-nfs-acl.control
+kernel-module-nfs-acl.list
+kernel-module-nfs-acl.postinst
+kernel-module-nfs-acl.postrm
+kernel-module-nfsd.control
+kernel-module-nfsd.list
+kernel-module-nfsd.postinst
+kernel-module-nfsd.postrm
+kernel-module-nls-utf8.control
+kernel-module-nls-utf8.list
+kernel-module-nls-utf8.postinst
+kernel-module-nls-utf8.postrm
+kernel-module-ohci-hcd.control
+kernel-module-ohci-hcd.list
+kernel-module-ohci-hcd.postinst
+kernel-module-ohci-hcd.postrm
+kernel-module-pegasus.control
+kernel-module-pegasus.list
+kernel-module-pegasus.postinst
+kernel-module-pegasus.postrm
+kernel-module-ppp-async.control
+kernel-module-ppp-async.list
+kernel-module-ppp-async.postinst
+kernel-module-ppp-async.postrm
+kernel-module-ppp-deflate.control
+kernel-module-ppp-deflate.list
+kernel-module-ppp-deflate.postinst
+kernel-module-ppp-deflate.postrm
+kernel-module-ppp-generic.control
+kernel-module-ppp-generic.list
+kernel-module-ppp-generic.postinst
+kernel-module-ppp-generic.postrm
+kernel-module-ppp-mppe.control
+kernel-module-ppp-mppe.list
+kernel-module-ppp-mppe.postinst
+kernel-module-ppp-mppe.postrm
+kernel-module-rfcomm.control
+kernel-module-rfcomm.list
+kernel-module-rfcomm.postinst
+kernel-module-rfcomm.postrm
+kernel-module-s3cmci.control
+kernel-module-s3cmci.list
+kernel-module-s3cmci.postinst
+kernel-module-s3cmci.postrm
+kernel-module-sco.control
+kernel-module-sco.list
+kernel-module-sco.postinst
+kernel-module-sco.postrm
+kernel-module-scsi-mod.control
+kernel-module-scsi-mod.list
+kernel-module-scsi-mod.postinst
+kernel-module-scsi-mod.postrm
+kernel-module-sd-mod.control
+kernel-module-sd-mod.list
+kernel-module-sd-mod.postinst
+kernel-module-sd-mod.postrm
+kernel-module-slhc.control
+kernel-module-slhc.list
+kernel-module-slhc.postinst
+kernel-module-slhc.postrm
+kernel-module-snd.control
+kernel-module-snd.list
+kernel-module-snd-page-alloc.control
+kernel-module-snd-page-alloc.list
+kernel-module-snd-page-alloc.postinst
+kernel-module-snd-page-alloc.postrm
+kernel-module-snd-pcm.control
+kernel-module-snd-pcm.list
+kernel-module-snd-pcm.postinst
+kernel-module-snd-pcm.postrm
+kernel-module-snd.postinst
+kernel-module-snd.postrm
+kernel-module-snd-soc-core.control
+kernel-module-snd-soc-core.list
+kernel-module-snd-soc-core.postinst
+kernel-module-snd-soc-core.postrm
+kernel-module-snd-soc-neo1973-gta02-wm8753.control
+kernel-module-snd-soc-neo1973-gta02-wm8753.list
+kernel-module-snd-soc-neo1973-gta02-wm8753.postinst
+kernel-module-snd-soc-neo1973-gta02-wm8753.postrm
+kernel-module-snd-soc-s3c24xx.control
+kernel-module-snd-soc-s3c24xx-i2s.control
+kernel-module-snd-soc-s3c24xx-i2s.list
+kernel-module-snd-soc-s3c24xx-i2s.postinst
+kernel-module-snd-soc-s3c24xx-i2s.postrm
+kernel-module-snd-soc-s3c24xx.list
+kernel-module-snd-soc-s3c24xx.postinst
+kernel-module-snd-soc-s3c24xx.postrm
+kernel-module-snd-soc-wm8753.control
+kernel-module-snd-soc-wm8753.list
+kernel-module-snd-soc-wm8753.postinst
+kernel-module-snd-soc-wm8753.postrm
+kernel-module-snd-timer.control
+kernel-module-snd-timer.list
+kernel-module-snd-timer.postinst
+kernel-module-snd-timer.postrm
+kernel-module-sunrpc.control
+kernel-module-sunrpc.list
+kernel-module-sunrpc.postinst
+kernel-module-sunrpc.postrm
+kernel-module-tun.control
+kernel-module-tun.list
+kernel-module-tun.postinst
+kernel-module-tun.postrm
+kernel-module-uinput.control
+kernel-module-uinput.list
+kernel-module-uinput.postinst
+kernel-module-uinput.postrm
+kernel-module-usbserial.control
+kernel-module-usbserial.list
+kernel-module-usbserial.postinst
+kernel-module-usbserial.postrm
+kernel-module-usb-storage.control
+kernel-module-usb-storage.list
+kernel-module-usb-storage.postinst
+kernel-module-usb-storage.postrm
+kernel-module-x-tables.control
+kernel-module-x-tables.list
+kernel-module-x-tables.postinst
+kernel-module-x-tables.postrm
+kernel.postinst
+kernel.postrm
+lame.control
+lame.list
+liba52-0.control
+liba52-0.list
+liba52-0.postinst
+libacl1.control
+libacl1.list
+libacl1.postinst
+libapm1.control
+libapm1.list
+libapm1.postinst
+libasound2.control
+libasound2.list
+libasound2.postinst
+libaspell15.control
+libaspell15.list
+libaspell15.postinst
+libatk-1.0-0.control
+libatk-1.0-0.list
+libatk-1.0-0.postinst
+libattr1.control
+libattr1.list
+libattr1.postinst
+libavahi-client3.control
+libavahi-client3.list
+libavahi-client3.postinst
+libavahi-common3.control
+libavahi-common3.list
+libavahi-common3.postinst
+libavahi-glib1.control
+libavahi-glib1.list
+libavahi-glib1.postinst
+libavcodec52.control
+libavcodec52.list
+libavcodec52.postinst
+libavformat52.control
+libavformat52.list
+libavformat52.postinst
+libavutil50.control
+libavutil50.list
+libavutil50.postinst
+libblkid1.control
+libblkid1.list
+libblkid1.postinst
+libbz2-1.control
+libbz2-1.list
+libbz2-1.postinst
+libc6.control
+libc6.list
+libc6.postinst
+libcairo2.control
+libcairo2.list
+libcairo2.postinst
+libcanberra0.control
+libcanberra0.list
+libcanberra0.postinst
+libcanberra-alsa.control
+libcanberra-alsa.list
+libcom-err2.control
+libcom-err2.list
+libcom-err2.postinst
+libcroco.control
+libcroco.list
+libcroco.postinst
+libcrypto0.9.8.control
+libcrypto0.9.8.list
+libcrypto0.9.8.postinst
+libcups2.control
+libcups2.list
+libcups2.postinst
+libcurl4.control
+libcurl4.list
+libcurl4.postinst
+libdbus-1-3.control
+libdbus-1-3.list
+libdbus-1-3.postinst
+libdbus-glib-1-2.control
+libdbus-glib-1-2.list
+libdbus-glib-1-2.postinst
+libdmx1.control
+libdmx1.list
+libdmx1.postinst
+libdrm.control
+libdrm.list
+libdrm.postinst
+libdvdcss2.control
+libdvdcss2.list
+libdvdcss2.postinst
+libdvdread3.control
+libdvdread3.list
+libdvdread3.postinst
+libeet1.control
+libeet1.list
+libeet1.postinst
+libelementary-ver-pre-svn-05-0.control
+libelementary-ver-pre-svn-05-0.list
+libelementary-ver-pre-svn-05-0.postinst
+libelementary-ver-pre-svn-05-themes.control
+libelementary-ver-pre-svn-05-themes.list
+libelf0.control
+libelf0.list
+libelf0.postinst
+libewebkit0.control
+libewebkit0.list
+libewebkit0.postinst
+libexif12.control
+libexif12.list
+libexif12.postinst
+libexosip2.control
+libexosip2.list
+libexosip2.postinst
+libexpat1.control
+libexpat1.list
+libexpat1.postinst
+libfaac0.control
+libfaac0.list
+libfaac0.postinst
+libfakekey0.control
+libfakekey0.list
+libfakekey0.postinst
+libffi5.control
+libffi5.list
+libffi5.postinst
+libflac8.control
+libflac8.list
+libflac8.postinst
+libfontconfig1.control
+libfontconfig1.list
+libfontconfig1.postinst
+libfontenc1.control
+libfontenc1.list
+libfontenc1.postinst
+libframeworkd-glib0.control
+libframeworkd-glib0.list
+libframeworkd-glib0.postinst
+libfreetype6.control
+libfreetype6.list
+libfreetype6.postinst
+libfribidi0.control
+libfribidi0.list
+libfribidi0.postinst
+libfsobasics0.control
+libfsobasics0.list
+libfsobasics0.postinst
+libfsoframework0.control
+libfsoframework0.list
+libfsoframework0.postinst
+libfso-glib0.control
+libfso-glib0.list
+libfso-glib0.postinst
+libfsoresource0.control
+libfsoresource0.list
+libfsoresource0.postinst
+libfsotransport0.control
+libfsotransport0.list
+libfsotransport0.postinst
+libgcc1.control
+libgcc1.list
+libgcc1.postinst
+libgcrypt11.control
+libgcrypt11.list
+libgcrypt11.postinst
+libgee2.control
+libgee2.list
+libgee2.postinst
+libgio-2.0-0.control
+libgio-2.0-0.list
+libgio-2.0-0.postinst
+libgl1.control
+libgl1.list
+libgl1.postinst
+libglade-2.0-0.control
+libglade-2.0-0.list
+libglade-2.0-0.postinst
+libglib-2.0-0.control
+libglib-2.0-0.list
+libglib-2.0-0.postinst
+libglu1.control
+libglu1.list
+libglu1.postinst
+libgmodule-2.0-0.control
+libgmodule-2.0-0.list
+libgmodule-2.0-0.postinst
+libgmp3.control
+libgmp3.list
+libgmp3.postinst
+libgnt0.control
+libgnt0.list
+libgnt0.postinst
+libgnutls26.control
+libgnutls26.list
+libgnutls26.postinst
+libgnutls-extra26.control
+libgnutls-extra26.list
+libgnutls-extra26.postinst
+libgobject-2.0-0.control
+libgobject-2.0-0.list
+libgobject-2.0-0.postinst
+libgoffice-0.8-8.control
+libgoffice-0.8-8.list
+libgoffice-0.8-8.postinst
+libgoffice-0.8-plugin-plot-barcol.control
+libgoffice-0.8-plugin-plot-barcol.list
+libgoffice-0.8-plugin-plot-distrib.control
+libgoffice-0.8-plugin-plot-distrib.list
+libgoffice-0.8-plugin-plot-pie.control
+libgoffice-0.8-plugin-plot-pie.list
+libgoffice-0.8-plugin-plot-radar.control
+libgoffice-0.8-plugin-plot-radar.list
+libgoffice-0.8-plugin-plot-surface.control
+libgoffice-0.8-plugin-plot-surface.list
+libgoffice-0.8-plugin-plot-xy.control
+libgoffice-0.8-plugin-plot-xy.list
+libgoffice-0.8-plugin-reg-linear.control
+libgoffice-0.8-plugin-reg-linear.list
+libgoffice-0.8-plugin-reg-logfit.control
+libgoffice-0.8-plugin-reg-logfit.list
+libgoffice-0.8-plugin-smoothing.control
+libgoffice-0.8-plugin-smoothing.list
+libgpewidget1.control
+libgpewidget1.list
+libgpewidget1.postinst
+libgpg-error0.control
+libgpg-error0.list
+libgpg-error0.postinst
+libgpgme11.control
+libgpgme11.list
+libgpgme11.postinst
+libgsf.control
+libgsf.list
+libgsf.postinst
+libgsf.prerm
+libgsm0710-0.control
+libgsm0710-0.list
+libgsm0710-0.postinst
+libgsm0710mux0.control
+libgsm0710mux0.list
+libgsm0710mux0.postinst
+libgsm1.control
+libgsm1.list
+libgsm1.postinst
+libgstaudio-0.10-0.control
+libgstaudio-0.10-0.list
+libgstaudio-0.10-0.postinst
+libgstfarsight-0.10-0.control
+libgstfarsight-0.10-0.list
+libgstfarsight-0.10-0.postinst
+libgstinterfaces-0.10-0.control
+libgstinterfaces-0.10-0.list
+libgstinterfaces-0.10-0.postinst
+libgstnetbuffer-0.10-0.control
+libgstnetbuffer-0.10-0.list
+libgstnetbuffer-0.10-0.postinst
+libgstpbutils-0.10-0.control
+libgstpbutils-0.10-0.list
+libgstpbutils-0.10-0.postinst
+libgstrtp-0.10-0.control
+libgstrtp-0.10-0.list
+libgstrtp-0.10-0.postinst
+libgsttag-0.10-0.control
+libgsttag-0.10-0.list
+libgsttag-0.10-0.postinst
+libgstvideo-0.10-0.control
+libgstvideo-0.10-0.list
+libgstvideo-0.10-0.postinst
+libgthread-2.0-0.control
+libgthread-2.0-0.list
+libgthread-2.0-0.postinst
+libgypsy0.control
+libgypsy0.list
+libgypsy0.postinst
+libical.control
+libical.list
+libical.postinst
+libice6.control
+libice6.list
+libice6.postinst
+libicudata36.control
+libicudata36.list
+libicudata36.postinst
+libicui18n36.control
+libicui18n36.list
+libicui18n36.postinst
+libicuuc36.control
+libicuuc36.list
+libicuuc36.postinst
+libid3tag0.control
+libid3tag0.list
+libid3tag0.postinst
+libidl-2-0.control
+libidl-2-0.list
+libidl-2-0.postinst
+libidn.control
+libidn.list
+libidn.postinst
+libimlib2-1.control
+libimlib2-1.list
+libimlib2-1.postinst
+libjasper1.control
+libjasper1.list
+libjasper1.postinst
+libjpeg62.control
+libjpeg62.list
+libjpeg62.postinst
+liblinebreak1.control
+liblinebreak1.list
+liblinebreak1.postinst
+liblinphone3.control
+liblinphone3.list
+liblinphone3.postinst
+liblockfile.control
+liblockfile.list
+liblockfile.postinst
+libltdl7.control
+libltdl7.list
+libltdl7.postinst
+liblzo1.control
+liblzo1.list
+liblzo1.postinst
+libmad0.control
+libmad0.list
+libmad0.postinst
+libmediastreamer0.control
+libmediastreamer0.list
+libmediastreamer0.postinst
+libmp3lame0.control
+libmp3lame0.list
+libmp3lame0.postinst
+libmpfr1.control
+libmpfr1.list
+libmpfr1.postinst
+libnice.control
+libnice.list
+libnice.postinst
+libnl2.control
+libnl2.list
+libnl2.postinst
+libnl-genl2.control
+libnl-genl2.list
+libnl-genl2.postinst
+libnl-nf2.control
+libnl-nf2.list
+libnl-nf2.postinst
+libnl-route2.control
+libnl-route2.list
+libnl-route2.postinst
+libode0.control
+libode0.list
+libode0.postinst
+libogg0.control
+libogg0.list
+libogg0.postinst
+liboil.control
+liboil.list
+liboil.postinst
+libopkg0.control
+libopkg0.list
+libopkg0.postinst
+libortp8.control
+libortp8.list
+libortp8.postinst
+libosip2-3.control
+libosip2-3.list
+libosip2-3.postinst
+libpam-base-files.control
+libpam-base-files.list
+libpam.control
+libpam.list
+libpam-meta.control
+libpam-meta.list
+libpam.postinst
+libpcap.control
+libpcap.list
+libpcap.postinst
+libpciaccess0.control
+libpciaccess0.list
+libpciaccess0.postinst
+libperl5.control
+libperl5.list
+libperl5.postinst
+libphone-ui0.conffiles
+libphone-ui0.control
+libphone-ui0.list
+libphone-ui0.postinst
+libphone-ui-shr.control
+libphone-ui-shr.list
+libphone-utils0.conffiles
+libphone-utils0.control
+libphone-utils0.list
+libphone-utils0.postinst
+libpixman-1-0.control
+libpixman-1-0.list
+libpixman-1-0.postinst
+libpng12-0.control
+libpng12-0.list
+libpng12-0.postinst
+libpng.control
+libpng.list
+libpoppler5.control
+libpoppler5.list
+libpoppler5.postinst
+libpoppler-glib4.control
+libpoppler-glib4.list
+libpoppler-glib4.postinst
+libpopt0.control
+libpopt0.list
+libpopt0.postinst
+libportaudio2.control
+libportaudio2.list
+libportaudio2.postinst
+libpostproc51.control
+libpostproc51.list
+libpostproc51.postinst
+libpthread-stubs0.control
+libpthread-stubs0.list
+libpthread-stubs0.postinst
+libpurple.control
+libpurple.list
+libpurple-plugin-ssl.control
+libpurple-plugin-ssl-gnutls.control
+libpurple-plugin-ssl-gnutls.list
+libpurple-plugin-ssl.list
+libpurple.postinst
+libpurple.prerm
+libpurple-protocol-icq.control
+libpurple-protocol-icq.list
+libpurple-protocol-irc.control
+libpurple-protocol-irc.list
+libpurple-protocol-msn.control
+libpurple-protocol-msn.list
+libpurple-protocol-xmpp.control
+libpurple-protocol-xmpp.list
+libpyglib-2.0-python0.control
+libpyglib-2.0-python0.list
+libpyglib-2.0-python0.postinst
+libpython2.6-1.0.control
+libpython2.6-1.0.list
+libpython2.6-1.0.postinst
+libreadline5.control
+libreadline5.list
+libreadline5.postinst
+librsvg-2-2.control
+librsvg-2-2.list
+librsvg-2-2.postinst
+librsvg-2-gtk.control
+librsvg-2-gtk.list
+librsvg-2-gtk.postinst
+libschroedinger-1.0-0.control
+libschroedinger-1.0-0.list
+libschroedinger-1.0-0.postinst
+libsdl-1.2-0.control
+libsdl-1.2-0.list
+libsdl-1.2-0.postinst
+libsdl-image-1.2-0.control
+libsdl-image-1.2-0.list
+libsdl-image-1.2-0.postinst
+libsdl-mixer-1.2-0.control
+libsdl-mixer-1.2-0.list
+libsdl-mixer-1.2-0.postinst
+libsdl-ttf-2.0-0.control
+libsdl-ttf-2.0-0.list
+libsdl-ttf-2.0-0.postinst
+libsm6.control
+libsm6.list
+libsm6.postinst
+libsoup-2.2-8.control
+libsoup-2.2-8.list
+libsoup-2.2-8.postinst
+libsoup-2.4-1.control
+libsoup-2.4-1.list
+libsoup-2.4-1.postinst
+libspeex1.control
+libspeex1.list
+libspeex1.postinst
+libspeexdsp1.control
+libspeexdsp1.list
+libspeexdsp1.postinst
+libsqlite0.control
+libsqlite0.list
+libsqlite0.postinst
+libsqlite3-0.control
+libsqlite3-0.list
+libsqlite3-0.postinst
+libss2.control
+libss2.list
+libss2.postinst
+libssl0.9.8.control
+libssl0.9.8.list
+libssl0.9.8.postinst
+libstartup-notification-1-0.control
+libstartup-notification-1-0.list
+libstartup-notification-1-0.postinst
+libstdc++6.control
+libstdc++6.list
+libstdc++6.postinst
+libswscale0.control
+libswscale0.list
+libswscale0.postinst
+libsysfs2.control
+libsysfs2.list
+libsysfs2.postinst
+libtheora0.control
+libtheora0.list
+libtheora0.postinst
+libthread-db1.control
+libthread-db1.list
+libthread-db1.postinst
+libtiff5.control
+libtiff5.list
+libtiff5.postinst
+libts-1.0-0.control
+libts-1.0-0.list
+libts-1.0-0.postinst
+libungif4.control
+libungif4.list
+libungif4.postinst
+libusb-0.1-4.control
+libusb-0.1-4.list
+libusb-0.1-4.postinst
+libuuid1.control
+libuuid1.list
+libuuid1.postinst
+libvorbis0.control
+libvorbis0.list
+libvorbis0.postinst
+libvte9.control
+libvte9.list
+libvte9.postinst
+libwebkit-1.0-2.control
+libwebkit-1.0-2.list
+libwebkit-1.0-2.postinst
+libwrap0.control
+libwrap0.list
+libwrap0.postinst
+libx11-6.control
+libx11-6.list
+libx11-6.postinst
+libx11-locale.control
+libx11-locale.list
+libxau6.control
+libxau6.list
+libxau6.postinst
+libxaw7-7.control
+libxaw7-7.list
+libxaw7-7.postinst
+libxcalibrate0.control
+libxcalibrate0.list
+libxcalibrate0.postinst
+libxcomposite1.control
+libxcomposite1.list
+libxcomposite1.postinst
+libxcursor1.control
+libxcursor1.list
+libxcursor1.postinst
+libxdamage1.control
+libxdamage1.list
+libxdamage1.postinst
+libxdmcp6.control
+libxdmcp6.list
+libxdmcp6.postinst
+libxext6.control
+libxext6.list
+libxext6.postinst
+libxfixes3.control
+libxfixes3.list
+libxfixes3.postinst
+libxfont1.control
+libxfont1.list
+libxfont1.postinst
+libxfontcache1.control
+libxfontcache1.list
+libxfontcache1.postinst
+libxft2.control
+libxft2.list
+libxft2.postinst
+libxi6.control
+libxi6.list
+libxi6.postinst
+libxinerama1.control
+libxinerama1.list
+libxinerama1.postinst
+libxkbfile1.control
+libxkbfile1.list
+libxkbfile1.postinst
+libxml2.control
+libxml2.list
+libxml2.postinst
+libxmu6.control
+libxmu6.list
+libxmu6.postinst
+libxmuu1.control
+libxmuu1.list
+libxmuu1.postinst
+libxp6.control
+libxp6.list
+libxp6.postinst
+libxpm4.control
+libxpm4.list
+libxpm4.postinst
+libxrandr2.control
+libxrandr2.list
+libxrandr2.postinst
+libxrender1.control
+libxrender1.list
+libxrender1.postinst
+libxslt.control
+libxslt.list
+libxslt.postinst
+libxss1.control
+libxss1.list
+libxss1.postinst
+libxt6.control
+libxt6.list
+libxt6.postinst
+libxtst6.control
+libxtst6.list
+libxtst6.postinst
+libxv1.control
+libxv1.list
+libxv1.postinst
+libxxf86dga1.control
+libxxf86dga1.list
+libxxf86dga1.postinst
+libxxf86misc1.control
+libxxf86misc1.list
+libxxf86misc1.postinst
+libxxf86vm1.control
+libxxf86vm1.list
+libxxf86vm1.postinst
+libyaml-0-2.control
+libyaml-0-2.list
+libyaml-0-2.postinst
+libz1.control
+libz1.list
+libz1.postinst
+linphone.control
+linphone.list
+locale-base-en-us.control
+locale-base-en-us.list
+logrotate.conffiles
+logrotate.control
+logrotate.list
+logrotate.postinst
+logrotate.postrm
+lsof.control
+lsof.list
+ltrace.control
+ltrace.list
+make.control
+make.list
+matchbox-keyboard-im.control
+matchbox-keyboard-im.list
+matchbox-keyboard-im.postinst
+matchbox-keyboard-im.postrm
+mbuffer.control
+mbuffer.list
+mdbus2.control
+mdbus2.list
+mesa-dri.control
+mesa-dri.list
+mesa-dri.postinst
+mime-support.control
+mime-support.list
+mioctl.control
+mioctl.list
+mkdump.control
+mkdump.list
+mobile-broadband-provider-info.control
+mobile-broadband-provider-info.list
+module-init-tools.control
+module-init-tools-depmod.control
+module-init-tools-depmod.list
+module-init-tools-depmod.postinst
+module-init-tools-depmod.prerm
+module-init-tools.list
+module-init-tools.postinst
+module-init-tools.prerm
+modutils-initscripts.control
+modutils-initscripts.list
+modutils-initscripts.postinst
+modutils-initscripts.postrm
+modutils-initscripts.prerm
+mokomaze.control
+mokomaze.list
+mplayer-common.control
+mplayer-common.list
+mplayer.conffiles
+mplayer.control
+mplayer.list
+mtd-utils.control
+mtd-utils.list
+mterm2.control
+mterm2.list
+nano.control
+nano.list
+navit.conffiles
+navit.control
+navit-icons.control
+navit-icons.list
+navit.list
+ncurses.control
+ncurses.list
+ncurses.postinst
+netbase.conffiles
+netbase.control
+netbase.list
+netbase.postinst
+netbase.postrm
+netbase.prerm
+nfs-utils-client.control
+nfs-utils-client.list
+nmon.control
+nmon.list
+numptyphysics.control
+numptyphysics.list
+openssh.control
+openssh-keygen.control
+openssh-keygen.list
+openssh.list
+openssh-scp.control
+openssh-scp.list
+openssh-scp.postinst
+openssh-scp.postrm
+openssh-sftp-server.control
+openssh-sftp-server.list
+openssh-ssh.conffiles
+openssh-ssh.control
+openssh-sshd.conffiles
+openssh-sshd.control
+openssh-sshd.list
+openssh-sshd.postinst
+openssh-sshd.postrm
+openssh-ssh.list
+openssh-ssh.postinst
+openssh-ssh.postrm
+openssl.control
+openssl.list
+openvpn.control
+openvpn.list
+opimd-utils-cli.control
+opimd-utils-cli.list
+opimd-utils-data.control
+opimd-utils-data.list
+opimd-utils-notes.control
+opimd-utils-notes.list
+opkg-collateral.conffiles
+opkg-collateral.control
+opkg-collateral.list
+opkg.control
+opkg.list
+opkg.postinst
+opkg.postrm
+orbit2.control
+orbit2.list
+orbit2.postinst
+pam-plugin-access.control
+pam-plugin-access.list
+pam-plugin-debug.control
+pam-plugin-debug.list
+pam-plugin-deny.control
+pam-plugin-deny.list
+pam-plugin-echo.control
+pam-plugin-echo.list
+pam-plugin-env.control
+pam-plugin-env.list
+pam-plugin-exec.control
+pam-plugin-exec.list
+pam-plugin-faildelay.control
+pam-plugin-faildelay.list
+pam-plugin-filter.control
+pam-plugin-filter.list
+pam-plugin-ftp.control
+pam-plugin-ftp.list
+pam-plugin-group.control
+pam-plugin-group.list
+pam-plugin-issue.control
+pam-plugin-issue.list
+pam-plugin-keyinit.control
+pam-plugin-keyinit.list
+pam-plugin-lastlog.control
+pam-plugin-lastlog.list
+pam-plugin-limits.control
+pam-plugin-limits.list
+pam-plugin-listfile.control
+pam-plugin-listfile.list
+pam-plugin-localuser.control
+pam-plugin-localuser.list
+pam-plugin-loginuid.control
+pam-plugin-loginuid.list
+pam-plugin-mail.control
+pam-plugin-mail.list
+pam-plugin-mkhomedir.control
+pam-plugin-mkhomedir.list
+pam-plugin-motd.control
+pam-plugin-motd.list
+pam-plugin-namespace.control
+pam-plugin-namespace.list
+pam-plugin-nologin.control
+pam-plugin-nologin.list
+pam-plugin-permit.control
+pam-plugin-permit.list
+pam-plugin-pwhistory.control
+pam-plugin-pwhistory.list
+pam-plugin-rhosts.control
+pam-plugin-rhosts.list
+pam-plugin-rootok.control
+pam-plugin-rootok.list
+pam-plugin-securetty.control
+pam-plugin-securetty.list
+pam-plugin-shells.control
+pam-plugin-shells.list
+pam-plugin-stress.control
+pam-plugin-stress.list
+pam-plugin-succeed-if.control
+pam-plugin-succeed-if.list
+pam-plugin-tally2.control
+pam-plugin-tally2.list
+pam-plugin-tally.control
+pam-plugin-tally.list
+pam-plugin-time.control
+pam-plugin-time.list
+pam-plugin-timestamp.control
+pam-plugin-timestamp.list
+pam-plugin-umask.control
+pam-plugin-umask.list
+pam-plugin-unix.control
+pam-plugin-unix.list
+pam-plugin-warn.control
+pam-plugin-warn.list
+pam-plugin-wheel.control
+pam-plugin-wheel.list
+pam-plugin-xauth.control
+pam-plugin-xauth.list
+pango.control
+pango.list
+pango-module-basic-fc.control
+pango-module-basic-fc.list
+pango-module-basic-fc.postinst
+pango-module-basic-x.control
+pango-module-basic-x.list
+pango-module-basic-x.postinst
+pango.postinst
+perl.control
+perl.list
+perl-module-carp.control
+perl-module-carp.list
+perl-module-exporter.control
+perl-module-exporter.list
+perl-module-file-basename.control
+perl-module-file-basename.list
+perl-module-file-path.control
+perl-module-file-path.list
+perl-module-strict.control
+perl-module-strict.list
+perl-module-warnings.control
+perl-module-warnings.list
+phonefsod.conffiles
+phonefsod.control
+phonefsod.list
+phonefsod.postinst
+phonefsod.postrm
+phonefsod.prerm
+phoneui-apps-contacts.control
+phoneui-apps-contacts.list
+phoneui-apps-dialer.control
+phoneui-apps-dialer.list
+phoneui-apps-messages.control
+phoneui-apps-messages.list
+phoneui-apps-quick-settings.control
+phoneui-apps-quick-settings.list
+phoneuid.conffiles
+phoneuid.control
+phoneuid.list
+pidgin.control
+pidgin-data.control
+pidgin-data.list
+pidgin.list
+pingus.control
+pingus.list
+pointercal.control
+pointercal.list
+policykit.control
+policykit.list
+policykit.postinst
+policykit.postrm
+poppler-data.control
+poppler-data.list
+portmap.control
+portmap.list
+portmap.postinst
+portmap.postrm
+portmap.prerm
+powertop.control
+powertop.list
+ppp.conffiles
+ppp.control
+ppp-dialin.control
+ppp-dialin.list
+ppp-dialin.postinst
+ppp-dialin.postrm
+ppp.list
+ppp.postinst
+procps.conffiles
+procps.control
+procps.list
+procps.postinst
+procps.postrm
+procps.prerm
+pth.control
+pth.list
+pth.postinst
+pxaregs.control
+pxaregs.list
+pyefl-sudoku.control
+pyefl-sudoku.list
+pyphonelog.control
+pyphonelog.list
+python-codecs.control
+python-codecs.list
+python-core.control
+python-core.list
+python-crypt.control
+python-crypt.list
+python-ctypes.control
+python-ctypes.list
+python-datetime.control
+python-datetime.list
+python-dateutil.control
+python-dateutil.list
+python-dbus.control
+python-dbus.list
+python-difflib.control
+python-difflib.list
+python-ecore.control
+python-ecore.list
+python-edbus.control
+python-edbus.list
+python-edje.control
+python-edje.list
+python-elementary.control
+python-elementary.list
+python-evas.control
+python-evas.list
+python-fcntl.control
+python-fcntl.list
+python-gst.control
+python-gst.list
+python-io.control
+python-io.list
+python-lang.control
+python-lang.list
+python-logging.control
+python-logging.list
+python-math.control
+python-math.list
+python-multiprocessing.control
+python-multiprocessing.list
+python-pexpect.control
+python-pexpect.list
+python-phoneutils.control
+python-phoneutils.list
+python-pickle.control
+python-pickle.list
+python-pprint.control
+python-pprint.list
+python-pyalsaaudio.control
+python-pyalsaaudio.list
+python-pycairo.control
+python-pycairo.list
+python-pygobject.control
+python-pygobject.list
+python-pygtk.control
+python-pygtk.list
+python-pyrtc.control
+python-pyrtc.list
+python-pyserial.control
+python-pyserial.list
+python-pyyaml.control
+python-pyyaml.list
+python-readline.control
+python-readline.list
+python-re.control
+python-re.list
+python-resource.control
+python-resource.list
+python-shell.control
+python-shell.list
+python-sqlite3.control
+python-sqlite3.list
+python-stringold.control
+python-stringold.list
+python-subprocess.control
+python-subprocess.list
+python-syslog.control
+python-syslog.list
+python-terminal.control
+python-terminal.list
+python-textutils.control
+python-textutils.list
+python-threading.control
+python-threading.list
+python-vobject.control
+python-vobject.list
+python-xml.control
+python-xml.list
+python-zlib.control
+python-zlib.list
+rgb.control
+rgb.list
+rsync.control
+rsync.list
+s3c24xx-gpio.control
+s3c24xx-gpio.list
+s3c64xx-gpio.control
+s3c64xx-gpio.list
+screen.control
+screen.list
+sed.control
+sed.list
+sed.postinst
+sed.prerm
+serial-forward.control
+serial-forward.list
+shared-mime-info.control
+shared-mime-info.list
+shr-settings-addons-illume.control
+shr-settings-addons-illume.list
+shr-settings-backup-configuration.conffiles
+shr-settings-backup-configuration.control
+shr-settings-backup-configuration.list
+shr-settings.control
+shr-settings.list
+shr-splash.control
+shr-splash.list
+shr-splash.postinst
+shr-splash.postrm
+shr-splash.prerm
+shr-splash-theme-simple.control
+shr-splash-theme-simple.list
+shr-splash-theme-simple.postinst
+shr-splash-theme-simple.postrm
+shr-theme.control
+shr-theme-gry.control
+shr-theme-gry.list
+shr-theme-gtk-e17lookalike.control
+shr-theme-gtk-e17lookalike.list
+shr-theme-gtk-e17lookalike.postinst
+shr-theme-gtk-e17lookalike.postrm
+shr-theme.list
+shr-wizard.control
+shr-wizard.list
+socat.control
+socat.list
+strace.control
+strace.list
+synergy.control
+synergy.list
+sysfsutils.control
+sysfsutils.list
+sysstat.control
+sysstat.list
+sysvinit.control
+sysvinit-inittab.conffiles
+sysvinit-inittab.control
+sysvinit-inittab.list
+sysvinit.list
+sysvinit-pidof.control
+sysvinit-pidof.list
+sysvinit-pidof.postinst
+sysvinit-pidof.prerm
+sysvinit.postinst
+sysvinit.postrm
+sysvinit.prerm
+sysvinit-utils.control
+sysvinit-utils.list
+sysvinit-utils.postinst
+sysvinit-utils.prerm
+tangogps.control
+tangogps.list
+task-base-apm.control
+task-base-apm.list
+task-base-bluetooth.control
+task-base-bluetooth.list
+task-base.control
+task-base-ext2.control
+task-base-ext2.list
+task-base-kernel26.control
+task-base-kernel26.list
+task-base.list
+task-base-ppp.control
+task-base-ppp.list
+task-base-usbgadget.control
+task-base-usbgadget.list
+task-base-usbhost.control
+task-base-usbhost.list
+task-base-vfat.control
+task-base-vfat.list
+task-base-wifi.control
+task-base-wifi.list
+task-boot.control
+task-boot.list
+task-cli-tools.control
+task-cli-tools-debug.control
+task-cli-tools-debug.list
+task-cli-tools.list
+task-distro-base.control
+task-distro-base.list
+task-fonts-truetype-core.control
+task-fonts-truetype-core.list
+task-fso2-compliance.control
+task-fso2-compliance.list
+task-machine-base.control
+task-machine-base.list
+task-shr-apps.control
+task-shr-apps.list
+task-shr-cli.control
+task-shr-cli.list
+task-shr-games.control
+task-shr-games.list
+task-shr-gtk.control
+task-shr-gtk.list
+task-shr-minimal-apps.control
+task-shr-minimal-apps.list
+task-shr-minimal-audio.control
+task-shr-minimal-audio.list
+task-shr-minimal-base.control
+task-shr-minimal-base.list
+task-shr-minimal-cli.control
+task-shr-minimal-cli.list
+task-shr-minimal-fso.control
+task-shr-minimal-fso.list
+task-shr-minimal-gtk.control
+task-shr-minimal-gtk.list
+task-shr-minimal-x.control
+task-shr-minimal-x.list
+task-x11-illume.control
+task-x11-illume.list
+task-x11-server.control
+task-x11-server.list
+task-x11-utils.control
+task-x11-utils.list
+tcpdump.control
+tcpdump.list
+tinylogin.control
+tinylogin.list
+tinylogin.postinst
+tinylogin.prerm
+tslib-calibrate.control
+tslib-calibrate.list
+tslib-conf.control
+tslib-conf.list
+ttf-dejavu-common.control
+ttf-dejavu-common.list
+ttf-dejavu-common.postinst
+ttf-dejavu-common.postrm
+ttf-dejavu-sans.control
+ttf-dejavu-sans.list
+ttf-dejavu-sans-mono.control
+ttf-dejavu-sans-mono.list
+ttf-dejavu-sans-mono.postinst
+ttf-dejavu-sans-mono.postrm
+ttf-dejavu-sans.postinst
+ttf-dejavu-sans.postrm
+ttf-liberation-mono.control
+ttf-liberation-mono.list
+ttf-liberation-mono.postinst
+ttf-liberation-mono.postrm
+tzdata-africa.control
+tzdata-africa.list
+tzdata-americas.control
+tzdata-americas.list
+tzdata-asia.control
+tzdata-asia.list
+tzdata-australia.control
+tzdata-australia.list
+tzdata.conffiles
+tzdata.control
+tzdata-europe.control
+tzdata-europe.list
+tzdata.list
+udev.control
+udev.list
+udev.postinst
+udev.postrm
+udev.prerm
+udev-utils.control
+udev-utils.list
+update-modules.control
+update-modules.list
+update-modules.postinst
+update-rc.d.control
+update-rc.d.list
+usb-gadget-mode.control
+usb-gadget-mode.list
+usb-gadget-mode.postinst
+usb-gadget-mode.postrm
+usbutils.control
+usbutils.list
+util-linux-ng-blkid.control
+util-linux-ng-blkid.list
+util-linux-ng-blkid.postinst
+util-linux-ng-blkid.prerm
+util-linux-ng-cfdisk.control
+util-linux-ng-cfdisk.list
+util-linux-ng.control
+util-linux-ng-fdisk.control
+util-linux-ng-fdisk.list
+util-linux-ng-fdisk.postinst
+util-linux-ng-fdisk.prerm
+util-linux-ng-fsck.control
+util-linux-ng-fsck.list
+util-linux-ng-fsck.postinst
+util-linux-ng-fsck.prerm
+util-linux-ng.list
+util-linux-ng-losetup.control
+util-linux-ng-losetup.list
+util-linux-ng-losetup.postinst
+util-linux-ng-losetup.prerm
+util-linux-ng-mountall.control
+util-linux-ng-mountall.list
+util-linux-ng-mountall.postinst
+util-linux-ng-mountall.prerm
+util-linux-ng-mount.control
+util-linux-ng-mount.list
+util-linux-ng-mount.postinst
+util-linux-ng-mount.prerm
+util-linux-ng.postinst
+util-linux-ng.prerm
+util-linux-ng-readprofile.control
+util-linux-ng-readprofile.list
+util-linux-ng-readprofile.postinst
+util-linux-ng-readprofile.prerm
+util-linux-ng-sfdisk.control
+util-linux-ng-sfdisk.list
+util-linux-ng-swaponoff.control
+util-linux-ng-swaponoff.list
+util-linux-ng-swaponoff.postinst
+util-linux-ng-swaponoff.prerm
+util-linux-ng-umount.control
+util-linux-ng-umount.list
+util-linux-ng-umount.postinst
+util-linux-ng-umount.prerm
+vagalume.control
+vagalume.list
+vala-terminal.control
+vala-terminal.list
+ventura.control
+ventura.list
+vnc.control
+vnc.list
+vpnc.conffiles
+vpnc.control
+vpnc.list
+vte-termcap.control
+vte-termcap.list
+wireless-tools.control
+wireless-tools.list
+wmiconfig.control
+wmiconfig.list
+wpa-supplicant.control
+wpa-supplicant.list
+wpa-supplicant-passphrase.control
+wpa-supplicant-passphrase.list
+wv.control
+wv.list
+wv.postinst
+x11vnc.control
+x11vnc.list
+xauth.control
+xauth.list
+xcursor-transparent-theme.control
+xcursor-transparent-theme.list
+xdpyinfo.control
+xdpyinfo.list
+xf86-input-evdev.control
+xf86-input-evdev.list
+xf86-input-keyboard.control
+xf86-input-keyboard.list
+xf86-input-mouse.control
+xf86-input-mouse.list
+xf86-input-tslib.control
+xf86-input-tslib.list
+xf86-video-glamo.control
+xf86-video-glamo.list
+xhost.control
+xhost.list
+xinit.control
+xinit.list
+xinput-calibrator.control
+xinput-calibrator.list
+xinput.control
+xinput.list
+xkbcomp.control
+xkbcomp.list
+xkeyboard-config.control
+xkeyboard-config.list
+xmodmap.control
+xmodmap.list
+xorg-minimal-fonts.control
+xorg-minimal-fonts.list
+xrandr.control
+xrandr.list
+xserver-kdrive-common.control
+xserver-kdrive-common.list
+xserver-nodm-init.control
+xserver-nodm-init.list
+xserver-nodm-init.postinst
+xserver-nodm-init.postrm
+xserver-nodm-init.prerm
+xserver-xorg-conf.conffiles
+xserver-xorg-conf.control
+xserver-xorg-conf.list
+xserver-xorg.control
+xserver-xorg-extension-dri2.control
+xserver-xorg-extension-dri2.list
+xserver-xorg-extension-dri.control
+xserver-xorg-extension-dri.list
+xserver-xorg-extension-glx.control
+xserver-xorg-extension-glx.list
+xserver-xorg.list
+xset.control
+xset.list
+xtscal.control
+xtscal.list"
+
+mount /mnt/ceph-fuse
+: cd /mnt/ceph-fuse
+
+mkdir test-1774
+cd test-1774
+for f in $list; do
+  touch $f
+done
+
+cd
+umount /mnt/ceph-fuse
+mount /mnt/ceph-fuse
+cd -
+
+# this worked before the 1774 fix
+diff <(ls) <(echo "$list")
+
+# but this failed, because we cached the dirlist wrong
+# update-modules.postinst used to be the missing file,
+# the last one in the first dirent set passed to ceph-fuse
+diff <(ls) <(echo "$list")
+
+cd ..
+rm -rf test-1774
+
+cd
+umount /mnt/ceph-fuse
diff --git a/qa/fs/.gitignore b/qa/fs/.gitignore
new file mode 100644
index 0000000..a2d280e
--- /dev/null
+++ b/qa/fs/.gitignore
@@ -0,0 +1 @@
+/test_o_trunc
diff --git a/qa/libceph/Makefile b/qa/libceph/Makefile
new file mode 100644
index 0000000..05a0696
--- /dev/null
+++ b/qa/libceph/Makefile
@@ -0,0 +1,11 @@
+CFLAGS = -Wall -Wextra -D_GNU_SOURCE -lcephfs -L../../src/.libs
+
+TARGETS = trivial_libceph 
+
+.c:
+	$(CC) $(CFLAGS) $@.c -o $@
+
+all:	$(TARGETS)
+
+clean:
+	rm $(TARGETS)
diff --git a/qa/libceph/trivial_libceph.c b/qa/libceph/trivial_libceph.c
new file mode 100644
index 0000000..9093e97
--- /dev/null
+++ b/qa/libceph/trivial_libceph.c
@@ -0,0 +1,69 @@
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/statvfs.h>
+#include "../../src/include/cephfs/libcephfs.h"
+
+#define MB64 (1<<26)
+
+int main(int argc, const char **argv)
+{
+        struct ceph_mount_info *cmount;
+        int ret, fd, len;
+        char buf[1024];
+
+        if (argc < 3) {
+                fprintf(stderr, "usage: ./%s <conf> <file>\n", argv[0]);
+                exit(1);
+        }
+
+        ret = ceph_create(&cmount, NULL);
+        if (ret) {
+                fprintf(stderr, "ceph_create=%d\n", ret);
+                exit(1);
+        }
+
+        ret = ceph_conf_read_file(cmount, argv[1]);
+        if (ret) {
+                fprintf(stderr, "ceph_conf_read_file=%d\n", ret);
+                exit(1);
+        }
+
+        ret = ceph_conf_parse_argv(cmount, argc, argv);
+        if (ret) {
+                fprintf(stderr, "ceph_conf_parse_argv=%d\n", ret);
+                exit(1);
+        }
+
+        ret = ceph_mount(cmount, NULL);
+        if (ret) {
+                fprintf(stderr, "ceph_mount=%d\n", ret);
+                exit(1);
+        }
+
+        ret = ceph_chdir(cmount, "/");
+        if (ret) {
+                fprintf(stderr, "ceph_chdir=%d\n", ret);
+                exit(1);
+        }
+
+        fd = ceph_open(cmount, argv[2], O_CREAT|O_TRUNC|O_RDWR, 0777); 
+        if (fd < 0) {
+                fprintf(stderr, "ceph_open=%d\n", fd);
+                exit(1);
+        }
+
+        memset(buf, 'a', sizeof(buf));
+
+        len = ceph_write(cmount, fd, buf, sizeof(buf), 0);
+
+        fprintf(stdout, "wrote %d bytes\n", len);
+
+        ceph_shutdown(cmount);
+
+        return 0;
+}
diff --git a/qa/loopall.sh b/qa/loopall.sh
new file mode 100755
index 0000000..edc14a0
--- /dev/null
+++ b/qa/loopall.sh
@@ -0,0 +1,28 @@
+#!/bin/bash -x
+
+set -e
+
+basedir=`echo $0 | sed 's/[^/]*$//g'`.
+testdir="$1"
+[ -n "$2" ] && logdir=$2 || logdir=$1
+
+[ ${basedir:0:1} == "." ] && basedir=`pwd`/${basedir:1}
+
+PATH="$basedir/src:$PATH"
+
+[ -z "$testdir" ] || [ ! -d "$testdir" ] && echo "specify test dir" && exit 1
+cd $testdir
+
+while true
+do
+    for test in `cd $basedir/workunits && find . -executable -type f | $basedir/../src/script/permute`
+    do
+	echo "------ running test $test ------"
+	pwd
+	[ -d $test ] && rm -r $test
+	mkdir -p $test
+	mkdir -p `dirname $logdir/$test.log`
+	test -e $logdir/$test.log && rm $logdir/$test.log
+	sh -c "cd $test && $basedir/workunits/$test" 2>&1 | tee $logdir/$test.log
+    done
+done
diff --git a/qa/mds/test_anchortable.sh b/qa/mds/test_anchortable.sh
new file mode 100755
index 0000000..56be0fb
--- /dev/null
+++ b/qa/mds/test_anchortable.sh
@@ -0,0 +1,26 @@
+#!/bin/bash -x
+
+mkdir links
+for f in `seq 1 8`
+do
+    mkdir $f
+    for g in `seq 1 20`
+    do
+	touch $f/$g
+	ln $f/$g links/$f.$g
+    done
+done
+
+for f in `seq 1 8`
+do
+    echo testing failure point $f
+    bash -c "pushd . ; cd $bindir ; sleep 10; ./ceph -c $conf mds tell \* injectargs \"--mds_kill_mdstable_at $f\" ; popd" &
+    bash -c "pushd . ; cd $bindir ; sleep 11 ; ./init-ceph -c $conf start mds ; popd" &
+    for g in `seq 1 20`
+    do
+	rm $f/$g
+	rm links/$f.$g
+	sleep 1
+    done
+done
+
diff --git a/qa/mds/test_mdstable_failures.sh b/qa/mds/test_mdstable_failures.sh
new file mode 100755
index 0000000..b5f8079
--- /dev/null
+++ b/qa/mds/test_mdstable_failures.sh
@@ -0,0 +1,13 @@
+#!/bin/bash -x
+
+for f in `seq 1 8`
+do
+    echo testing failure point $f
+    pushd . ; cd $bindir ; ./ceph -c $conf mds tell \* injectargs "--mds_kill_mdstable_at $f" ; popd
+    sleep 1  # wait for mds command to go thru
+    bash -c "pushd . ; cd $bindir ; sleep 10 ; ./init-ceph -c $conf start mds ; popd" &
+    touch $f
+    ln $f $f.link
+    sleep 10
+done
+
diff --git a/qa/mon/bootstrap/host.sh b/qa/mon/bootstrap/host.sh
new file mode 100755
index 0000000..ad4e327
--- /dev/null
+++ b/qa/mon/bootstrap/host.sh
@@ -0,0 +1,29 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[global]
+mon host = 127.0.0.1:6789
+
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+EOF
+
+rm -f mm
+fsid=`uuidgen`
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --fsid $fsid --mon-data mon.a -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+
+ceph -c conf -k keyring health
+
+killall ceph-mon
+echo OK
\ No newline at end of file
diff --git a/qa/mon/bootstrap/initial_members.sh b/qa/mon/bootstrap/initial_members.sh
new file mode 100755
index 0000000..2dfa9e9
--- /dev/null
+++ b/qa/mon/bootstrap/initial_members.sh
@@ -0,0 +1,39 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+mon initial members = a,b,d
+EOF
+
+rm -f mm
+monmaptool --create mm \
+    --add a 127.0.0.1:6789 \
+    --add b 127.0.0.1:6790 \
+    --add c 127.0.0.1:6791
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --monmap mm --mon-data $cwd/mon.a -k keyring
+ceph-mon -c conf -i b --mkfs --monmap mm --mon-data $cwd/mon.b -k keyring
+ceph-mon -c conf -i c --mkfs --monmap mm --mon-data $cwd/mon.c -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+ceph-mon -c conf -i c --mon-data $cwd/mon.b
+ceph-mon -c conf -i b --mon-data $cwd/mon.c
+
+ceph -c conf -k keyring --monmap mm health
+
+ceph -c conf -k keyring --monmap mm health
+if ceph -c conf -k keyring --monmap mm mon stat | grep a= | grep b= | grep c= ; then
+    break
+fi
+
+killall ceph-mon
+echo OK
diff --git a/qa/mon/bootstrap/initial_members_asok.sh b/qa/mon/bootstrap/initial_members_asok.sh
new file mode 100755
index 0000000..618f4c5
--- /dev/null
+++ b/qa/mon/bootstrap/initial_members_asok.sh
@@ -0,0 +1,66 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+debug asok = 20
+mon initial members = a,b,d
+admin socket = $cwd/\$name.asok
+EOF
+
+rm -f mm
+fsid=`uuidgen`
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --fsid $fsid --mon-data $cwd/mon.a -k keyring
+ceph-mon -c conf -i b --mkfs --fsid $fsid --mon-data $cwd/mon.b -k keyring
+ceph-mon -c conf -i c --mkfs --fsid $fsid --mon-data $cwd/mon.c -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a --public-addr 127.0.0.1:6789
+ceph-mon -c conf -i b --mon-data $cwd/mon.c --public-addr 127.0.0.1:6790
+ceph-mon -c conf -i c --mon-data $cwd/mon.b --public-addr 127.0.0.1:6791
+
+sleep 1
+
+if timeout 5 ceph -c conf -k keyring -m localhost mon stat | grep "a,b,c" ; then
+    echo WTF
+    exit 1
+fi
+
+ceph --admin-daemon mon.a.asok add_bootstrap_peer_hint 127.0.0.1:6790
+
+while true; do
+    if ceph -c conf -k keyring -m 127.0.0.1 mon stat | grep 'a,b'; then
+	break
+    fi
+    sleep 1
+done
+
+ceph --admin-daemon mon.c.asok add_bootstrap_peer_hint 127.0.0.1:6790
+
+while true; do
+    if ceph -c conf -k keyring -m 127.0.0.1 mon stat | grep 'a,b,c'; then
+	break
+    fi
+    sleep 1
+done
+
+ceph-mon -c conf -i d --mkfs --fsid $fsid --mon-data $cwd/mon.d -k keyring
+ceph-mon -c conf -i d --mon-data $cwd/mon.d --public-addr 127.0.0.1:6792
+ceph --admin-daemon mon.d.asok add_bootstrap_peer_hint 127.0.0.1:6790
+
+while true; do
+    if ceph -c conf -k keyring -m 127.0.0.1 mon stat | grep 'a,b,c,d'; then
+	break
+    fi
+    sleep 1
+done
+
+killall ceph-mon
+echo OK
diff --git a/qa/mon/bootstrap/simple.sh b/qa/mon/bootstrap/simple.sh
new file mode 100755
index 0000000..2121301
--- /dev/null
+++ b/qa/mon/bootstrap/simple.sh
@@ -0,0 +1,36 @@
+#!/bin/sh -e
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+admin socket = 
+EOF
+
+rm -f mm
+monmaptool --create mm \
+    --add a 127.0.0.1:6789 \
+    --add b 127.0.0.1:6790 \
+    --add c 127.0.0.1:6791
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --monmap mm --mon-data $cwd/mon.a -k keyring
+ceph-mon -c conf -i b --mkfs --monmap mm --mon-data $cwd/mon.b -k keyring
+ceph-mon -c conf -i c --mkfs --monmap mm --mon-data $cwd/mon.c -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+ceph-mon -c conf -i c --mon-data $cwd/mon.b
+ceph-mon -c conf -i b --mon-data $cwd/mon.c
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep 'quorum 0,1,2'; then
+	break
+    fi
+    sleep 1
+done
+
+killall ceph-mon
+echo OK
diff --git a/qa/mon/bootstrap/simple_expand.sh b/qa/mon/bootstrap/simple_expand.sh
new file mode 100755
index 0000000..519d8ae
--- /dev/null
+++ b/qa/mon/bootstrap/simple_expand.sh
@@ -0,0 +1,60 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+EOF
+
+rm -f mm
+monmaptool --create mm \
+    --add a 127.0.0.1:6789 \
+    --add b 127.0.0.1:6790 \
+    --add c 127.0.0.1:6791
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --monmap mm --mon-data $cwd/mon.a -k keyring
+ceph-mon -c conf -i b --mkfs --monmap mm --mon-data $cwd/mon.b -k keyring
+ceph-mon -c conf -i c --mkfs --monmap mm --mon-data $cwd/mon.c -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+ceph-mon -c conf -i c --mon-data $cwd/mon.b
+ceph-mon -c conf -i b --mon-data $cwd/mon.c
+
+ceph -c conf -k keyring --monmap mm health
+
+## expand via a kludged monmap
+monmaptool mm --add d 127.0.0.1:6792
+ceph-mon -c conf -i d --mkfs --monmap mm --mon-data $cwd/mon.d -k keyring
+ceph-mon -c conf -i d --mon-data $cwd/mon.d
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep 'quorum 0,1,2,3'; then
+	break
+    fi
+    sleep 1
+done
+
+# again
+monmaptool mm --add e 127.0.0.1:6793
+ceph-mon -c conf -i e --mkfs --monmap mm --mon-data $cwd/mon.e -k keyring
+ceph-mon -c conf -i e --mon-data $cwd/mon.e
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep 'quorum 0,1,2,3,4'; then
+	break
+    fi
+    sleep 1
+done
+
+
+killall ceph-mon
+echo OK
diff --git a/qa/mon/bootstrap/simple_expand_monmap.sh b/qa/mon/bootstrap/simple_expand_monmap.sh
new file mode 100755
index 0000000..da24c02
--- /dev/null
+++ b/qa/mon/bootstrap/simple_expand_monmap.sh
@@ -0,0 +1,44 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+admin socket = 
+EOF
+
+rm -f mm
+monmaptool --create mm \
+    --add a 127.0.0.1:6789 \
+    --add b 127.0.0.1:6790 \
+    --add c 127.0.0.1:6791
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --monmap mm --mon-data $cwd/mon.a -k keyring
+ceph-mon -c conf -i b --mkfs --monmap mm --mon-data $cwd/mon.b -k keyring
+ceph-mon -c conf -i c --mkfs --monmap mm --mon-data $cwd/mon.c -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+ceph-mon -c conf -i c --mon-data $cwd/mon.b
+ceph-mon -c conf -i b --mon-data $cwd/mon.c
+
+ceph -c conf -k keyring --monmap mm health
+
+## expand via a kludged monmap
+monmaptool mm --add d 127.0.0.1:6792
+ceph-mon -c conf -i d --mkfs --monmap mm --mon-data $cwd/mon.d -k keyring
+ceph-mon -c conf -i d --mon-data $cwd/mon.d
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep d=; then
+	break
+    fi
+    sleep 1
+done
+
+killall ceph-mon
+
+echo OK
diff --git a/qa/mon/bootstrap/simple_single_expand.sh b/qa/mon/bootstrap/simple_single_expand.sh
new file mode 100755
index 0000000..99fe564
--- /dev/null
+++ b/qa/mon/bootstrap/simple_single_expand.sh
@@ -0,0 +1,54 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+EOF
+
+rm -f mm
+monmaptool --create mm \
+    --add a 127.0.0.1:6789
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --monmap mm --mon-data $cwd/mon.a -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+
+ceph -c conf -k keyring --monmap mm health
+
+## expand via a kludged monmap
+monmaptool mm --add d 127.0.0.1:6702
+ceph-mon -c conf -i d --mkfs --monmap mm --mon-data $cwd/mon.d -k keyring
+ceph-mon -c conf -i d --mon-data $cwd/mon.d
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep 'quorum 0,1'; then
+	break
+    fi
+    sleep 1
+done
+
+# again
+monmaptool mm --add e 127.0.0.1:6793
+ceph-mon -c conf -i e --mkfs --monmap mm --mon-data $cwd/mon.e -k keyring
+ceph-mon -c conf -i e --mon-data $cwd/mon.e
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep 'quorum 0,1,2'; then
+	break
+    fi
+    sleep 1
+done
+
+
+killall ceph-mon
+echo OK
diff --git a/qa/mon/bootstrap/simple_single_expand2.sh b/qa/mon/bootstrap/simple_single_expand2.sh
new file mode 100755
index 0000000..28d0c56
--- /dev/null
+++ b/qa/mon/bootstrap/simple_single_expand2.sh
@@ -0,0 +1,40 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+EOF
+
+rm -f mm
+ip=`host \`hostname\` | awk '{print $4}'`
+monmaptool --create mm \
+    --add a $ip:6779
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --monmap mm --mon-data $cwd/mon.a -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+
+ceph -c conf -k keyring --monmap mm health
+
+## expand via a local_network
+ceph-mon -c conf -i d --mkfs --monmap mm --mon-data $cwd/mon.d -k keyring
+ceph-mon -c conf -i d --mon-data $cwd/mon.d --public-network 127.0.0.1/32
+
+while true; do
+    ceph -c conf -k keyring --monmap mm health
+    if ceph -c conf -k keyring --monmap mm mon stat | grep 'quorum 0,1'; then
+	break
+    fi
+    sleep 1
+done
+
+killall ceph-mon
+echo OK
diff --git a/qa/mon/bootstrap/single_host.sh b/qa/mon/bootstrap/single_host.sh
new file mode 100755
index 0000000..c40b561
--- /dev/null
+++ b/qa/mon/bootstrap/single_host.sh
@@ -0,0 +1,29 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[global]
+mon host = 127.0.0.1:6789
+
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+EOF
+
+rm -f mm
+fsid=`uuidgen`
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --fsid $fsid --mon-data $cwd/mon.a -k keyring
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+
+ceph -c conf -k keyring health
+
+killall ceph-mon
+echo OK
\ No newline at end of file
diff --git a/qa/mon/bootstrap/single_host_multi.sh b/qa/mon/bootstrap/single_host_multi.sh
new file mode 100755
index 0000000..864f3b1
--- /dev/null
+++ b/qa/mon/bootstrap/single_host_multi.sh
@@ -0,0 +1,39 @@
+#!/bin/sh -ex
+
+cwd=`pwd`
+cat > conf <<EOF
+[global]
+
+[mon]
+admin socket = 
+log file = $cwd/\$name.log
+debug mon = 20
+debug ms = 1
+mon host = 127.0.0.1:6789 127.0.0.1:6790 127.0.0.1:6791
+EOF
+
+rm -f mm
+fsid=`uuidgen`
+
+rm -f keyring
+ceph-authtool --create-keyring keyring --gen-key -n client.admin
+ceph-authtool keyring --gen-key -n mon.
+
+ceph-mon -c conf -i a --mkfs --fsid $fsid --mon-data $cwd/mon.a -k keyring --public-addr 127.0.0.1:6789
+ceph-mon -c conf -i b --mkfs --fsid $fsid --mon-data $cwd/mon.b -k keyring --public-addr 127.0.0.1:6790
+ceph-mon -c conf -i c --mkfs --fsid $fsid --mon-data $cwd/mon.c -k keyring --public-addr 127.0.0.1:6791
+
+ceph-mon -c conf -i a --mon-data $cwd/mon.a
+ceph-mon -c conf -i b --mon-data $cwd/mon.b
+ceph-mon -c conf -i c --mon-data $cwd/mon.c
+
+ceph -c conf -k keyring health -m 127.0.0.1
+while true; do
+    if ceph -c conf -k keyring -m 127.0.0.1 mon stat | grep 'a,b,c'; then
+	break
+    fi
+    sleep 1
+done
+
+killall ceph-mon
+echo OK
\ No newline at end of file
diff --git a/qa/qa_scripts/RbdLib.pm b/qa/qa_scripts/RbdLib.pm
new file mode 100755
index 0000000..83a506e
--- /dev/null
+++ b/qa/qa_scripts/RbdLib.pm
@@ -0,0 +1,530 @@
+#! /usr/bin/perl
+=head1 NAME
+
+RbdLib.pm - Perl Module that contains the functions used by CLI script for testing RBD.
+
+=cut
+
+package RbdLib;
+use Cwd;
+use Exporter;
+ at ISA = 'Exporter';
+ at EXPORT_OK = qw(perform_action create_image resize_image rename_image copy_image list_image info_image export_image import_image remove_image create_snapshots protect_snapshot clone_image unprotect_snapshot rollback_snapshots purge_snapshots list_snapshots remove_snapshot rbd_map rbd_unmap rbd_showmapped display_result _pre_clean_up _post_clean_up _create_rados_pool display_ceph_os_info $RADOS_LS $RADOS_MKPOOL $RADOS_RMPOOL $RBD_CREATE $RBD_RESIZE $RBD_INFO $RBD_REMOVE $RBD_RENAME $RBD_M [...]
+use Pod::Usage();
+use Getopt::Long();
+
+use strict;
+use warnings;
+
+$|=1;
+
+# variables
+our $TC_CNT         = " ";
+our $PASS_CNT       = 0;
+our $TPASS_CNT       = 0;
+our $FAIL_CNT       = 0;
+our $TFAIL_CNT       = 0;
+our $RADOS_MKPOOL   = "rados mkpool";
+our $RADOS_RMPOOL   = "rados rmpool";
+our $RBD_CREATE     = "rbd create";
+our $RBD_RESIZE     = "rbd resize";
+our $RBD_INFO       = "rbd info";
+our $RBD_REMOVE     = "rbd rm";
+our $RBD_RENAME     = "rbd rename";
+our $RBD_MV         = "rbd mv";
+our $RBD_LS         = "rbd ls";
+our $RBD_LIST       = "rbd list";
+our $RBD_CLONE      = "rbd clone";
+our $RBD_EXPORT     = "rbd export";
+our $RBD_IMPORT     = "rbd import";
+our $RBD_COPY       = "rbd copy";
+our $RBD_CP         = "rbd cp";
+our $SNAP_CREATE    = "rbd snap create";
+our $SNAP_LIST      = "rbd snap list";
+our $SNAP_LS        = "rbd snap ls";
+our $SNAP_ROLLBACK  = "rbd snap rollback";
+our $SNAP_REMOVE    = "rbd snap rm";
+our $SNAP_PURGE     = "rbd snap purge";
+our $RBD_WATCH      = "rbd watch";
+our $RBD_MAP        = "sudo rbd map";
+our $RBD_UNMAP      = "sudo rbd unmap";
+our $RBD_SHOWMAPPED = "rbd showmapped";
+our $RADOS_LS       = "rados ls";
+our $SNAP_PROTECT   = "rbd snap protect";
+our $SNAP_UNPROTECT = "rbd snap unprotect";
+our $RBD_CHILDREN   = "rbd children"; 
+our $RBD_FLATTEN    = "rbd flatten"; 
+
+#====Error messages========================
+
+our $RBD_CREATE_ERR    = "size must be >= 0"; 
+our $RBD_EXTRA_ERR     = "extraneous parameter"; 
+our $RBD_REQ_ERR       = "expected integer";
+our $RBD_RM_ERROR      = "image name was not specified";
+our $SNAP_LS_ERROR     = "snap name was not specified";
+our $SNAP_RM_ERROR     = "remove failed";
+our $SNAP_ROLLBACK_ERR = "rollback failed";
+our $RBD_CP_ERROR      = "error: destination image name";
+our $RBD_EXISTS_ERR    = "exists";
+our $RBD_RENAME_ERROR  = "rename error";
+our $RBD_DELETE_ERROR  = "delete error";
+our $RBD_NO_IMAGE      = "error opening image";
+our $RBD_POOL_ERROR    = "error opening pool";
+our $RBD_INT_ERR       = "expected integer";
+our $RBD_ARG_ERR       = "requires an argument";
+our $RBD_EXP_ERR       = "export error";
+our $RBD_IMP_ERR       = "import failed";
+our $RBD_MAP_ERR       = "add failed";
+our $RBD_UNMAP_ERR     = "remove failed";
+our $RBD_INFO_SNAP_ERR = "error setting snapshot context";
+our $SNAP_PROTECT_ERR = "Device or resource busy";
+our $SNAP_PROTECT_RM_ERR = "protected from removal";
+our $SNAP_PROTECT_ERR1 = "No such file or directory";
+our $SNAP_UNPROT_ERR   = "snap_unprotect: image must support layering";
+our $SNAP_UNPROT_ERR1   = "snap_unprotect: snapshot is already unprotected";
+our $SNAP_PROT_ERR     = "snap_protect: image must support layering";
+our $CLONE_UNPROTECT_ERR = "parent snapshot must be protected";
+our $CLONE_ARG_ERR     = "destination image name was not specified";
+our $CLONE_PARENT_ERR  = "error opening parent image";
+our $CLONE_PF_ERR      = "parent image must be in new format";
+our $FLATTEN_ERR       = "librbd: parent snapshot must be protected";
+our $FLATTEN_IMG_ERR   = "librbd: image has no parent"; 
+ 
+#=======Success messages=======================
+
+our $POOL_MK_SUCCESS       = "successfully created pool";
+our $POOL_RM_SUCCESS       = "successfully deleted pool";
+our $RBD_RM_SUCCESS        = "Removing image: 100%";
+our $RBD_CP_SUCCESS        = "Image copy: 100%";
+our $RBD_RESIZE_SUCCESS    = "Resizing image: 100%";
+our $RBD_EXP_SUCCESS       = "Exporting image: 100%";
+our $RBD_IMP_SUCCESS       = "Importing image: 100%";
+our $SNAP_ROLLBACK_SUCCESS = "Rolling back to snapshot: 100%";
+our $SNAP_PURGE_SUCCESS    = "Removing all snapshots: 100%";
+our $RBD_FLATTEN_SUCCESS     = "Image flatten: 100% complete";
+
+#===========Variables used in the script========
+
+our $test_log      = "logfile.txt";
+our $success_file  = "test_completed.txt";
+our $log_file     = "log.txt";
+our $exec_cmd;
+our $PASS_FLAG = "FALSE";
+our $TPASS_FLAG = "FALSE";
+our $MSG;
+our $rbd_imp_file     = "test_file";
+our $exp_file         = "rbd_test_file1";
+our $exp_file1        = "rbd_test_file2";
+our $rbd_imp_test     = "new_test_file";
+our $img_name         = "test_img";
+our $pool_name;
+our $rc = " ";
+our $CLI_FLAG;
+
+sub _post_clean_up {
+    my $exec_cmd = get_command_output(
+"rm -rf $img_name $rbd_imp_file $rbd_imp_test $exp_file $exp_file1"
+    );
+}
+
+sub _pre_clean_up {
+    my $exec_cmd = get_command_output(
+"rm -rf logfile.txt log.txt test_completed.txt"
+    );
+}
+ 
+sub perform_action {
+    my ( $action, $cmd_args, $option ) = @_;
+    my $command = frame_command( $action, $cmd_args, $option );
+    my $cmd_op = get_command_output($command);
+    my $rc = validate_cmd_output( $cmd_op, $action, $cmd_args, $option );
+    return $rc;	
+}
+
+sub verify_action {
+    my ( $action, $cmd_args, $option ) = @_;
+    my $command = frame_command( $action, $cmd_args, $option );
+    my $cmd_op = get_command_output($command);
+    return $cmd_op;
+}
+
+sub pass {
+    my ($comment) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border2();
+    print "Test case: $TC_CNT PASSED - $comment \n";
+    print_border2();
+    $PASS_CNT++;
+    $PASS_FLAG = "TRUE";
+    $MSG = "$comment";
+    log_cli_results();
+}
+
+sub tpass {
+    my ($comment) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border4();
+    print "PASS: $comment \n";
+    print_border4();
+    $TPASS_CNT++;
+    $TPASS_FLAG = "TRUE";
+    $MSG = "$comment";
+    log_results();
+}
+
+sub fail {
+    my ($comment) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border2();
+    print "Test case: $TC_CNT FAILED - $comment \n";
+    print_border2();
+    $FAIL_CNT++;
+    $PASS_FLAG = "FALSE";
+    $MSG = "$comment";
+    log_cli_results();
+}
+
+sub tfail {
+    my ($comment) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border4();
+    print "FAIL: $comment \n";
+    print_border4();
+    $TFAIL_CNT++;
+    $TPASS_FLAG = "FALSE";
+    $MSG = "$comment";
+    log_results();
+}
+
+sub debug_msg {
+    my ($comment,$is_debug) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border3();
+    if (!$is_debug){
+         print "DEBUG: $comment \n";
+    } else {
+         print "$comment \n";
+    }
+    print_border3();
+}
+
+sub print_border {
+    print "=" x 90 . "\n";
+}
+
+sub print_border2 {
+    print "~" x 90 . "\n";
+}
+
+sub print_border3 {
+    print "+" x 90 . "\n";
+}
+
+sub print_border4 {
+    print "*" x 90 . "\n";
+}
+
+sub banner {
+    my ($string) = @_;
+    chomp $string;
+    print_border();
+    print $string, "\n";
+    print_border();
+}
+
+sub display_result {
+    banner("TEST RESULTS");
+    banner(
+"No. of test cases passed:$PASS_CNT\nNo. of test cases failed:$FAIL_CNT\n"
+    );
+}
+
+sub display_func_result {
+    banner("TEST RESULTS");
+    banner(
+"No. of test cases passed:$TPASS_CNT\nNo. of test cases failed:$TFAIL_CNT\n"
+    );
+}
+
+sub get_command_output {
+    my $cmd_output = shift;
+    open( FH, ">>$test_log" );
+    print FH "*" x 90 . "\n";
+    print FH "\"$cmd_output\"\n";
+    my $exec_cmd = `$cmd_output 2>&1`;
+    print FH "$exec_cmd\n";
+    print FH "*" x 90 . "\n";
+    close(FH);
+    return $exec_cmd;
+}
+
+sub frame_command {
+    my ( $action, $cmd_args, $option ) = @_;
+    my @command_set = split( /,/, $cmd_args );
+    my $command = join( ' --', @command_set );
+    $command = "$action $command";
+    return $command;
+}
+
+sub check_if_listed {
+    my ( $chk_cmd, $check_arg, $cmd, $args ) = @_;
+    my $check_op = get_command_output($chk_cmd);
+    if ( $check_op =~ /$check_arg/ ) {
+        pass("$cmd $args passed");
+        return 0;
+    }
+    else {
+        fail("$cmd $args failed");
+        return 1;
+    }
+}
+
+sub check_if_not_listed {
+    my ( $chk_cmd, $check_arg, $cmd, $args ) = @_;
+    my $check_op = get_command_output($chk_cmd);
+    if ( $check_op =~ /$check_arg/ ) {
+        fail("$cmd $args failed");
+        return 1;
+    } else {
+        pass("$cmd $args passed");
+        return 0;
+    }
+}
+
+sub validate_cmd_output {
+    $TC_CNT++ if ( $CLI_FLAG eq "TRUE" ) ;
+    $PASS_FLAG      = "FALSE";
+    $MSG            = " ";
+    my ( $arg, $snap, $arg1, $parg );
+    my $snaps;
+    my ( $cmd_op, $act, $args, $test_flag ) = @_;
+    if ( !$test_flag ) {
+        if ( ( $act =~ /$RBD_CREATE/ ) && ( !$cmd_op ) ) {
+            $arg = ( split /,/, $args )[0];
+            $parg = ( split /,/, $args )[1];
+            $pool_name = ( split / /, $parg )[1];
+            $rc = check_if_listed( "$RBD_LS $pool_name", $arg, $act , $args);
+	    return $rc;
+        }
+        elsif (( ( $act =~ /$RBD_RENAME/ ) || ( $act =~ /$RBD_MV/ ) )
+            && ( !$cmd_op ) )
+        {
+            $arg = ( split /\//, $args )[-1];
+            $pool_name = ( split /\//, $args )[0];
+            $rc = check_if_listed( "$RBD_LS $pool_name", $arg, $act, $args );
+	    return $rc;
+        }
+        elsif ( ( $act =~ /$SNAP_CREATE/ ) && ( !$cmd_op ) ) {
+            $snaps = ( split / /,  $args )[1];
+            $arg   = ( split / /, $args )[2];
+            $rc = check_if_listed( "$SNAP_LS $arg", $snaps, $act, $args );
+	    return $rc;
+        }
+        elsif ( ( $act =~ /$SNAP_REMOVE/ ) && ( !$cmd_op ) ) {
+            $snaps = ( split /\@/, $args )[-1];
+            $arg1  = ( split /\@/, $args )[-2];
+            $arg   = ( split /\//, $arg1 )[-1];
+	    $pool_name = ( split /\@/,$args )[0];
+            $rc = check_if_not_listed( "$SNAP_LS $pool_name", $snaps , $act, $args);
+	    return $rc;
+        }
+        elsif (( $act =~ /$SNAP_PURGE/ )
+            && ( $cmd_op =~ /$SNAP_PURGE_SUCCESS/ ) )
+        {
+            pass("$act $args passed");
+        }
+        elsif ( $act =~ /$RBD_INFO/ ) {
+            $arg = ( split /\//, $args )[-1];
+            my $rbd_img_quoted = "\'$arg\'";
+            pass("$act $args passed")
+              if ( $cmd_op =~ /rbd image $rbd_img_quoted/ );
+        }
+        elsif ( ( $act =~ /$RBD_REMOVE/ ) && ( $cmd_op =~ /$RBD_RM_SUCCESS/ ) )
+        {
+            $pool_name = ( split /\//, $args )[0];
+            my $img_name = ( split /\//, $args )[1];
+            $rc = check_if_not_listed( "$RBD_LS $pool_name",$img_name , $act, $args );
+	    return $rc;
+        }
+        elsif (( $act =~ /$RBD_RESIZE/ )
+            && ( $cmd_op =~ /$RBD_RESIZE_SUCCESS/ ) )
+        {
+            pass("$act $args passed");
+        }
+        elsif (( ( $act =~ /$RBD_COPY/ ) || ( $act =~ /$RBD_CP/ ) )
+            && ( $cmd_op =~ /$RBD_CP_SUCCESS/ ) )
+        {
+            pass("$act $args passed");
+        }
+        elsif (
+            ( $act =~ /$RBD_EXPORT/ )
+            && (   ( $cmd_op =~ /$RBD_EXP_SUCCESS/ )
+                || ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) )
+          )
+        {
+            pass("$act $args passed");
+        }
+        elsif (
+            ( $act =~ /$RBD_IMPORT/ )
+            && (   ( $cmd_op =~ /$RBD_IMP_SUCCESS/ )
+                || ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) )
+          )
+        {
+            pass("$act $args passed");
+        }
+        elsif (( $act =~ /$SNAP_ROLLBACK/ )
+            && ( $cmd_op =~ /$SNAP_ROLLBACK_SUCCESS/ ) )
+        {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$RBD_SHOWMAPPED/ ) && ( $cmd_op =~ /$img_name/ ) ) {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$RBD_MAP/ ) && ( $cmd_op !~ /./ ) ) {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$SNAP_PROTECT/ ) && ( $cmd_op !~ /./ ) ) {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$SNAP_UNPROTECT/ ) && ( $cmd_op !~ /./ ) ) {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$RBD_CLONE/ ) && ( $cmd_op !~ /./ ) ) {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$RBD_FLATTEN/ ) && ( $cmd_op =~ /$RBD_FLATTEN_SUCCESS/ ) ) {
+            pass("$act $args passed");
+        }
+        elsif ( ( $act =~ /$RBD_UNMAP/ ) && ( $cmd_op !~ /$RBD_UNMAP_ERR/ ) ) {
+            pass("$act $args passed");
+        }
+        else {
+            if ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) {
+                pass("$act $args $RBD_EXISTS_ERR");
+            }
+            else {
+                fail("$act $args failed");
+	    	return 1;
+            }
+        }
+        return 0;
+    }
+    elsif ( ( $test_flag == 1 ) && ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) ) {
+        pass("Already exists: $act $args passed");
+        return 0;
+    }
+    elsif (
+        ( $test_flag == 2 )
+        && (   ( $cmd_op =~ /$RBD_RENAME_ERROR/ )
+            || ( $cmd_op =~ /$RBD_DELETE_ERROR/ )
+            || ( $cmd_op =~ /$RBD_NO_IMAGE/ )
+            || ( $cmd_op =~ /$RBD_POOL_ERROR/ )
+            || ( $cmd_op =~ /$RBD_INT_ERR/ )
+            || ( $cmd_op =~ /$RBD_ARG_ERR/ )
+            || ( $cmd_op =~ /$RBD_RM_ERROR/ )
+            || ( $cmd_op =~ /$SNAP_LS_ERROR/ )
+            || ( $cmd_op =~ /$SNAP_RM_ERROR/ )
+            || ( $cmd_op =~ /$RBD_CP_ERROR/ )
+            || ( $cmd_op =~ /$RBD_EXP_ERR/ )
+            || ( $cmd_op =~ /$RBD_IMP_ERR/ )
+            || ( $cmd_op =~ /$SNAP_ROLLBACK_ERR/ )
+            || ( $cmd_op =~ /$RBD_MAP_ERR/ )
+            || ( $cmd_op =~ /$RBD_UNMAP_ERR/ )
+            || ( $cmd_op =~ /$RBD_CREATE_ERR/ )
+            || ( $cmd_op =~ /$RBD_EXTRA_ERR/ )
+            || ( $cmd_op =~ /$RBD_REQ_ERR/ )
+            || ( $cmd_op =~ /$SNAP_PROTECT_ERR/ )
+            || ( $cmd_op =~ /$SNAP_PROTECT_ERR1/ )
+            || ( $cmd_op =~ /$SNAP_PROTECT_RM_ERR/ )
+            || ( $cmd_op =~ /$SNAP_PROT_ERR/ )
+            || ( $cmd_op =~ /$SNAP_UNPROT_ERR/ )
+            || ( $cmd_op =~ /$SNAP_UNPROT_ERR1/ )
+            || ( $cmd_op =~ /$CLONE_UNPROTECT_ERR/ )
+            || ( $cmd_op =~ /$CLONE_ARG_ERR/ )
+            || ( $cmd_op =~ /$CLONE_PARENT_ERR/ )
+            || ( $cmd_op =~ /$CLONE_PF_ERR/ )
+            || ( $cmd_op =~ /$FLATTEN_ERR/ )
+            || ( $cmd_op =~ /$FLATTEN_IMG_ERR/ )
+            || ( $cmd_op =~ /$RBD_INFO_SNAP_ERR/ ) )
+      )
+    {
+        pass("negative case: $act $args passed");
+        return 0;
+    }
+    elsif ( ( $test_flag == 3 ) && ( $cmd_op =~ /usage/ ) ) {
+        pass("negative case: $act $args passed");
+        return 0;
+    }
+    else {
+        fail("negative case:$act $args failed");
+        return 1;
+    }
+}
+
+# Test Script execution results for Functional tests 
+sub log_results
+{
+	if ( $TPASS_FLAG eq "TRUE" ) {
+            open( TC, '>>test_completed.txt' );
+            close(TC);
+            open( TC, '>>log.txt' );
+	    print TC "[Success] $MSG\n";
+            close(TC);
+	}
+	else {
+            open( TC, '>>test_completed.txt' );
+            close(TC);
+            open( TC, '>>log.txt' );
+	    print TC "[Failure] $MSG\n";
+            close(TC);
+	}
+}
+
+# Test Script execution results for CLI tests
+sub log_cli_results
+{
+        if ($CLI_FLAG eq "TRUE") {
+        if ( $PASS_FLAG eq "TRUE" ) {
+            open( TC, '>>test_completed.txt' );
+            close(TC);
+            open( TC, '>>log.txt' );
+            print TC "[Success] TestCase $TC_CNT $MSG\n";
+            close(TC);
+        }
+        else {
+            open( TC, '>>test_completed.txt' );
+            close(TC);
+            open( TC, '>>log.txt' );
+            print TC "[Failure] TestCase $TC_CNT $MSG\n";
+            close(TC);
+        }
+	}
+}
+
+sub ceph_os_info
+{
+        my $ceph_v = get_command_output ( "ceph -v" );
+        my @ceph_arr = split(" ",$ceph_v);
+        $ceph_v = "Ceph Version:   $ceph_arr[2]";
+        my $os_distro = get_command_output ( "lsb_release -d" );
+        my @os_arr = split(":",$os_distro);
+        $os_distro = "Linux Flavor:$os_arr[1]";
+        return ($ceph_v, $os_distro);
+}
+
+sub display_ceph_os_info
+{
+	my ($vceph, $vos) = ceph_os_info();
+        my $dat = get_command_output ( "date" );
+        my $msg = "The Tests were executed on $dat";
+        debug_msg ( "$msg\n$vos$vceph\n",1 );
+	open( TC, '>>log.txt' );
+        print TC "[Log] $vceph\n";
+	close (TC);
+}
+1;
diff --git a/qa/qa_scripts/S3Lib.pm b/qa/qa_scripts/S3Lib.pm
new file mode 100644
index 0000000..c6527d0
--- /dev/null
+++ b/qa/qa_scripts/S3Lib.pm
@@ -0,0 +1,166 @@
+#! /usr/bin/perl
+=head1 NAME
+
+S3Lib.pm - Perl Module that contains the functions used by S3 test scripts for testing Rados gateway.
+
+=cut
+
+package S3Lib;
+use Cwd;
+use Exporter;
+ at ISA = 'Exporter';
+ at EXPORT_OK = qw(display_ceph_os_info get_timestamp get_hostname get_user_info $rgw_user delete_user _write_log_entry _exit_result get_status);
+
+#==variables ===
+my $rgw_user = "qa_user";
+my $sec;
+my $min;
+my $hour;
+my $mon;
+my $year;
+my $mday;
+my $wday;
+my $yday;
+my $isdst;
+
+# function to get the current time stamp from the test set up
+sub get_timestamp {
+   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+   if ($mon < 10) { $mon = "0$mon"; }
+   if ($hour < 10) { $hour = "0$hour"; }
+   if ($min < 10) { $min = "0$min"; }
+   if ($sec < 10) { $sec = "0$sec"; }
+   $year=$year+1900;
+   return $year . '_' . $mon . '_' . $mday . '__' . $hour . '_' . $min . '_' . $sec;
+}
+
+# Function to get the Ceph and distro info
+sub ceph_os_info
+{
+        my $ceph_v = get_command_output ( "ceph -v" );
+        my @ceph_arr = split(" ",$ceph_v);
+        $ceph_v = "Ceph Version:   $ceph_arr[2]";
+        my $os_distro = get_command_output ( "lsb_release -d" );
+        my @os_arr = split(":",$os_distro);
+        $os_distro = "Linux Flavor:$os_arr[1]";
+        return ($ceph_v, $os_distro);
+}
+
+# Function to log ceph info to log file
+sub display_ceph_os_info
+{
+        my ($vceph, $vos) = ceph_os_info();
+        my $msg = "The Tests are running on";
+        _write_log_entry ( "$msg\n$vos$vceph" );
+}
+
+# function to execute the command and return output
+sub get_cmd_op
+{
+    my $cmd = shift;
+    my $excmd = `$cmd`;
+    return $excmd;
+}
+
+# Function to check if radosgw is already running
+sub get_status {
+    my $service = "radosgw";
+    my $cmd = "ps -ef | grep $service | grep -v grep";
+    my $status = get_cmd_op($cmd);
+    if ($status =~ /client.radosgw.gateway/ ){
+        return 0;
+    }
+    return 1;
+}
+
+#Function that executes the CLI commands and returns the output of the command
+
+sub get_command_output {
+    my $cmd_output = shift;
+    open( FH, ">>$test_log" );
+    print FH "\"$cmd_output\"\n";
+    my $exec_cmd = `$cmd_output 2>&1`;
+    print FH "$exec_cmd\n";
+    close(FH);
+    return $exec_cmd;
+}
+
+# Function that enters the given msg to log.txt
+
+sub _write_log_entry {
+    my $logmsg = shift;
+    open(TC,'>>log.txt');
+    print TC "[Log] $logmsg\n";
+    close(TC);
+}
+
+# Function that creates the test_completed.txt and reports success/failure to log.txt as required by xstudio run at the end of the test
+
+sub _exit_result {
+    my $exit_status = shift;
+    my $REPORT_LOG = "SUCCESS";
+    open (TCOMP, '>>test_completed.txt');
+    close (TCOMP);
+    if ($exit_status != 0) {
+	$REPORT_LOG = "FAILURE";
+    }
+    open(TC,'>>log.txt');
+    print TC "[$REPORT_LOG]\n";
+    close(TC);
+    exit($exit_status);
+}
+
+# Function to create the user "qa_user" and extract the user access_key and secret_key of the user
+sub get_user_info
+{
+    my $cmd = "sudo radosgw-admin user create --uid=$rgw_user --display-name=$rgw_user";
+    my $cmd_op = get_command_output($cmd);
+    if ($cmd_op !~ /keys/){
+        _write_log_entry( "user $rgw_user NOT created" );
+        return (0,0);
+    }
+    _write_log_entry( "user $rgw_user created" );
+    my @get_user = (split/,/,$cmd_op);
+    foreach (@get_user) {
+        if ($_ =~ /access_key/ ){
+            $get_acc_key = $_;
+        } elsif ($_ =~ /secret_key/ ){
+            $get_sec_key = $_;
+        }
+    }
+    my $access_key = $get_acc_key;
+    my $acc_key = (split /:/, $access_key)[1];
+    $acc_key =~ s/\\//g;
+    $acc_key =~ s/ //g;
+    $acc_key =~ s/"//g;
+    my $secret_key = $get_sec_key;
+    my $sec_key = (split /:/, $secret_key)[1];
+    chop($sec_key);
+    chop($sec_key);
+    $sec_key =~ s/\\//g;
+    $sec_key =~ s/ //g;
+    $sec_key =~ s/"//g;
+    return ($acc_key, $sec_key);
+}
+
+# Function that deletes the user $rgw_user and write to logfile. 
+sub delete_user
+{
+    my $cmd = "sudo radosgw-admin user rm --uid=$rgw_user";
+    my $cmd_op = get_command_output($cmd); 	
+    if ($cmd_op !~ /aborting/){
+        _write_log_entry( "user $rgw_user deleted" );
+    } else {
+        _write_log_entry( "user $rgw_user NOT deleted" );
+    }
+}
+
+# Function to get the hostname
+sub get_hostname
+{
+    my $cmd = "hostname";
+    my $get_host = get_command_output($cmd);
+    chomp($get_host);
+    return($get_host);
+}
+1;
diff --git a/qa/qa_scripts/cephscrub.sh b/qa/qa_scripts/cephscrub.sh
new file mode 100755
index 0000000..7bd16fd
--- /dev/null
+++ b/qa/qa_scripts/cephscrub.sh
@@ -0,0 +1,32 @@
+# remove the ceph directories
+sudo rm -rf /var/log/ceph
+sudo rm -rf /var/lib/ceph
+sudo rm -rf /etc/ceph
+sudo rm -rf /var/run/ceph
+# remove the ceph packages
+sudo apt-get -y  purge ceph
+sudo apt-get -y  purge ceph-dbg
+sudo apt-get -y  purge ceph-mds
+sudo apt-get -y  purge ceph-mds-dbg
+sudo apt-get -y  purge ceph-fuse
+sudo apt-get -y  purge ceph-fuse-dbg
+sudo apt-get -y  purge ceph-common
+sudo apt-get -y  purge ceph-common-dbg
+sudo apt-get -y  purge ceph-fs-common
+sudo apt-get -y  purge ceph-fs-common-dbg
+sudo apt-get -y  purge ceph-resource-agents
+sudo apt-get -y  purge librados2
+sudo apt-get -y  purge librados2-dbg
+sudo apt-get -y  purge librados-dev
+sudo apt-get -y  purge librbd1
+sudo apt-get -y  purge librbd1-dbg
+sudo apt-get -y  purge librbd-dev
+sudo apt-get -y  purge libcephfs1
+sudo apt-get -y  purge libcephfs1-dbg
+sudo apt-get -y  purge libcephfs-dev
+sudo apt-get -y  purge radosgw
+sudo apt-get -y  purge radosgw-dbg
+sudo apt-get -y  purge obsync
+sudo apt-get -y  purge python-rados
+sudo apt-get -y  purge python-rbd
+sudo apt-get -y  purge python-cephfs
diff --git a/qa/qa_scripts/load-bucket-1000-obj.pl b/qa/qa_scripts/load-bucket-1000-obj.pl
new file mode 100755
index 0000000..51350ad
--- /dev/null
+++ b/qa/qa_scripts/load-bucket-1000-obj.pl
@@ -0,0 +1,171 @@
+#!/usr/bin/perl
+use Amazon::S3;
+use Data::Dumper;
+use strict;
+use IO::File;
+use Getopt::Long;
+use Digest::MD5;
+use S3Lib qw(get_hostname get_user_info $rgw_user delete_user _write_log_entry _exit_result);
+
+my $exit_status=0;
+my $tc;
+my $mytestfilename;
+my $logmsg;
+my $kruft;
+my $counter;
+my $fillfile;
+my $maxcount=1000;
+my $sec;
+my $min;
+my $hour;
+my $mon;
+my $year;
+my $mday;
+my $wday;
+my $yday;
+my $isdst;
+my $s3;
+my $domain = "front.sepia.ceph.com";
+my $host = get_hostname();
+chomp($host);
+my $hostname = "$host.$domain";
+
+
+sub _exit_result {
+ open (TCOMP, '>>test_completed.txt');
+        close (TCOMP);
+ exit($exit_status);
+}
+
+sub _write_log_entry {
+        open(TC,'>>log.txt');
+        print TC "[Log] $logmsg\n";
+        close(TC);
+}
+
+
+sub get_timestamp {
+   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+   if ($mon < 10) { $mon = "0$mon"; }
+   if ($hour < 10) { $hour = "0$hour"; }
+   if ($min < 10) { $min = "0$min"; }
+   if ($sec < 10) { $sec = "0$sec"; }
+   $year=$year+1900;
+
+   return $year . '_' . $mon . '_' . $mday . '__' . $hour . '_' . $min . '_' . $sec
+}
+
+#
+# one time write to log with ceph version
+#
+open (TC,'>>log.txt');
+print TC "[Log] ";
+system ("ceph -v >> log.txt");
+
+#**************************************************************************
+# Modify access keys to suit the target account
+
+my ($access_key, $secret_key) = get_user_info();
+if ( ($access_key) && ($secret_key) ) {
+
+# Make S3 connection
+# modify the host name if this test is run outside of QA.
+
+  $s3 = Amazon::S3->new(
+      {   aws_access_key_id     => $access_key,
+          aws_secret_access_key => $secret_key,
+          host                  => $hostname,
+          secure                => 0,
+          retry                 => 1,
+      }
+  );
+
+}
+#**************************************************************************
+ # List the existing buckets
+  my $response = $s3->buckets;
+  foreach my $bucket ( @{ $response->{buckets} } ) {
+      print "You have a bucket: " . $bucket->bucket . "\n";
+  }
+
+  # create a new bucket (the test bucket)
+    my $bucketname =  'kftestbucket' . get_timestamp();
+  print "Attempting to create bucket = $bucketname\n";
+
+  my $bucket = $s3->add_bucket( { bucket => $bucketname } )
+      or die $s3->err . $s3->errstr;
+  print "Bucket Created: $bucketname\n";
+  $logmsg =  "Bucket Created: $bucketname (add_bucket)";
+  _write_log_entry();
+
+
+  # create files  in the bucket
+
+print "Generating files....\n";
+for($counter = 1; $counter <= $maxcount; $counter++){
+  $fillfile = 'bogus'.$counter;
+  $bucket->add_key( $fillfile, 'this is file #$counter' )
+      or die $s3->err . ": " . $s3->errstr;
+  if ($counter%10 == 0){print "Created $counter files...\n"}
+}
+
+  $logmsg =  "$maxcount files created in bucket $bucketname (add_key)";
+  _write_log_entry();
+
+
+  # list files in the bucket and count them - must be = max count
+  print "Verifying correct number of files created....\n";
+  $counter=0;
+  $response = $bucket->list_all
+      or die $s3->err . ": " . $s3->errstr;
+  foreach my $key ( @{ $response->{keys} } ) {
+      my $key_name = $key->{key};
+      my $key_size = $key->{size};
+#      print "Bucket contains key '$key_name' of size $key_size\n";
+      $counter = $counter + 1;
+  }
+   $logmsg =  "list_all method successful";
+  _write_log_entry();
+  if ($counter==$maxcount) {
+     $logmsg = "File count verified = $maxcount - Pass";
+     _write_log_entry();
+  }
+  else {
+     $logmsg = "[Log] File count fail $counter vs $maxcount";
+     _write_log_entry();
+     $exit_status=3;
+  }
+
+ 
+  # delete files in the bucket
+  print "Deleting $maxcount files...\n";
+  $response = $bucket->list_all
+      or die $s3->err . ": " . $s3->errstr;
+  foreach my $key ( @{ $response->{keys} } ) {
+
+      my $key_name = $key->{key};
+      $bucket->delete_key($key_name) or die $s3->err . ": " . $s3->errstr;
+  }
+   $logmsg =  "$maxcount files deleted (delete_key)";
+  _write_log_entry();
+
+
+  # and finally delete the bucket
+  $bucket->delete_bucket or die $s3->err . ": " . $s3->errstr;
+   $logmsg =  "Test bucket deleted (delete_bucket)";
+  _write_log_entry();
+
+delete_user();
+
+if ($exit_status == 0){
+        open(TC,'>>log.txt');
+        print TC "[Success]\n";
+        close(TC);
+        _exit_result();
+} else {
+        open(TC,'>>log.txt');
+        print TC "[Failure]\n";
+        close(TC);
+        _exit_result();
+}
+
diff --git a/qa/qa_scripts/rbd_cli_tests.pl b/qa/qa_scripts/rbd_cli_tests.pl
new file mode 100755
index 0000000..4c8b5a9
--- /dev/null
+++ b/qa/qa_scripts/rbd_cli_tests.pl
@@ -0,0 +1,386 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+rbd_cli_tests.pl - Script to test the RBD CLI commands and report the  
+test results
+
+=head1 SYNOPSIS
+
+Use:
+        perl rbd_cli_tests.pl [--pool pool_name][--help]
+
+Examples:
+        perl rbd_cli_tests.pl --pool test_pool 
+	or
+	perl rbd_cli_tests.pl  --help
+
+=head1 DESCRIPTION
+
+This script intends to test the RBD CLI commands for the scenarios mentioned below
+and reports the test results
+
+Positive cases 
+Negative cases
+-- Boundary value testing
+-- Incorrect Parameter values/ Incorrect field values
+-- Insufficient parameters / Extra parameters    
+
+=head1 ARGUMENTS
+
+rbd_cli_tests.pl takes the following arguments:
+   --pool
+   (optional) If not specified, rbd pool is used. 
+   --help
+   (optional) Displays the usage message.
+
+If cephx is enabled, set 'export CEPH_ARGS="--keyring /etc/ceph/ceph.keyring --id <user>"' 
+and execute the script as root.
+
+For Example,for "nova" user, 'export CEPH_ARGS="--keyring /etc/ceph/ceph.keyring --id nova"'
+
+=cut
+
+use Cwd;
+use RbdLib qw(perform_action create_image resize_image rename_image copy_image list_image info_image export_image import_image remove_image create_snapshots protect_snapshot unprotect_snapshot clone_image rollback_snapshots purge_snapshots list_snapshots remove_snapshot rbd_map rbd_unmap rbd_showmapped display_result _pre_clean_up _post_clean_up _create_rados_pool display_ceph_os_info $RADOS_MKPOOL $RADOS_RMPOOL $RBD_CREATE $RBD_RESIZE $RBD_INFO $RBD_REMOVE $RBD_RENAME $RBD_MV $RBD_LS $R [...]
+
+use Pod::Usage();
+use Getopt::Long();
+
+use strict;
+my ( $help, $pool );
+
+Getopt::Long::GetOptions(
+    'pool=s' => \$pool,
+    'help'   => \$help
+);
+
+Pod::Usage::pod2usage( -verbose => 1 ) if ($help);
+
+our $pool_name = "rbd";
+$pool_name = $pool if ($pool);
+
+#===========Variables used in the script========
+
+our $img_name         = "test_img";
+our $snap_name        = "snap1";
+our $snap_name2       = "snap2";
+our $snap_name3       = "snap3";
+our $snap_name4       = "snap4";
+our $snap_name5       = "snap5";
+our $snap_new         = "snap_new";
+our $clone_new        = "clone_new";
+our $clone_new1        = "clone_new1";
+our $clone_new2        = "clone_new2";
+our $snap_test        = "snap_test";
+our $new_rbd_img      = "new_rbd_img";
+our $non_existing_img = "rbdimage";
+our $cp_new           = "newest";
+our $exp_file         = "rbd_test_file1";
+our $exp_file1        = "rbd_test_file2";
+our $exp_file2        = "rbd_test_file3";
+our $rbd_imp_file     = "test_file";
+our $rbd_imp_image    = "new_imp_img";
+our $content          = "This is a test file";
+our $rbd_snap_new     = "new";
+our $neg_img_name     = "neg_img";
+our $new_img_name     = "new_img";
+our $max_img_name     = "max_img";
+our $img_name1        = "testing_img1";
+our $rbd_imp_test     = "new_test_file";
+our $non_pool_name = "no_pool";
+our $no_snap       = "no_snap";
+our $img_name_mv   = "new_img_mv";
+our $test_log      = "logfile.txt";
+our $success       = "test_completed.txt";
+our $fail          = "log.txt";
+our $exec_cmd;
+our $MSG;
+our $pool_name;
+our $CLI_FLAG = "TRUE";
+
+# Tests for create image
+sub create_image {
+    perform_action ( $RBD_CREATE, "$img_name,pool $pool_name,size 1024", 0 );
+
+    perform_action( $RBD_CREATE, "$img_name_mv,pool $pool_name,size 1024", 0 );
+    perform_action( $RBD_CREATE, "$img_name_mv,pool $pool_name,size 0,order 22",
+        1 );
+    perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size 0",     0 );
+    perform_action( $RBD_CREATE, "$neg_img_name,pool $pool_name,size -1", 2 );
+    perform_action( $RBD_CREATE, "$img_name1 pool $pool_name",            2 );
+    perform_action( $RBD_CREATE, "--size 1024",                           2 );
+    perform_action( $RBD_CREATE,
+        "$max_img_name,pool $pool_name,size 1024000000000", 0 );
+    perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size 2048,order",
+        2 );
+    perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size,order 22",
+        2 );
+    perform_action( $RBD_CREATE,
+        "$new_img_name,pool $pool_name,size 1024,new-format", 0 );
+
+}
+
+# Tests to create snapshot
+sub create_snapshots {
+    perform_action( $SNAP_CREATE, "--snap $snap_name $pool_name\/$img_name",
+        0 );
+    perform_action( $SNAP_CREATE, "--snap $snap_name $pool_name\/$img_name",
+        1 );
+    perform_action( $SNAP_CREATE, "$snap_name", 2 );
+
+    perform_action($SNAP_CREATE,"--snap $snap_name2 $pool_name\/$img_name",0);
+    perform_action( $SNAP_CREATE, "--snap $snap_name3 $pool_name\/$img_name",
+        0 );
+    perform_action( $SNAP_CREATE, "--snap $snap_name4 $pool_name\/$img_name",
+        0 );
+    perform_action( $SNAP_CREATE, "--snap $snap_new $pool_name\/$new_img_name",
+        0 );
+}
+
+# Tests to protect snapshot
+sub protect_snapshot {
+    perform_action( $SNAP_PROTECT, "--snap $snap_new $pool_name\/$new_img_name",
+        0 );
+    perform_action( $SNAP_PROTECT, "--snap $snap_new $pool_name\/$new_img_name",
+        2 );
+    perform_action( $SNAP_PROTECT, "--snap $snap_name4 $pool_name\/$img_name",
+        2 );
+    perform_action( $SNAP_PROTECT, "--snap $snap_test $pool_name\/$img_name",
+        2 );
+}
+
+# Tests to unprotect snapshot
+sub unprotect_snapshot {
+    perform_action( $SNAP_UNPROTECT, "--snap $snap_new $pool_name\/$new_img_name",
+        0 );
+    perform_action( $SNAP_UNPROTECT, "--snap $snap_new $pool_name\/$new_img_name",
+        2 );
+    perform_action( $SNAP_UNPROTECT, "--snap $snap_name4 $pool_name\/$img_name",
+        2 );
+    perform_action( $SNAP_UNPROTECT, "--snap $snap_test $pool_name\/$img_name",
+        2 );
+}
+
+# clone protected snapshot
+sub clone_image {
+    perform_action( $RBD_CLONE, "$pool_name\/$new_img_name\@$snap_new $pool_name\/$clone_new",
+        0 );
+    perform_action( $RBD_CLONE, "$pool_name\/$new_img_name\@$snap_new $pool_name\/$clone_new",
+        1 );
+    perform_action( $RBD_CLONE, "$pool_name\/$new_img_name\@$snap_name5 $pool_name\/$clone_new1",
+        2 );
+    perform_action( $RBD_CLONE, "$pool_name\/$img_name\@$snap_test $pool_name\/$clone_new1",
+        2 );
+    perform_action( $RBD_CLONE, "$pool_name\/$img_name\@$snap_name5 $pool_name\/$clone_new2",
+        2 );
+    perform_action( $RBD_CLONE, "$pool_name\/$img_name\@$snap_new",
+        2 );
+    perform_action( $RBD_CLONE, "$pool_name\/$img_name",
+        2 );
+}
+
+#flatten image
+sub rbd_flatten {
+    perform_action( $RBD_FLATTEN, "$pool_name\/$clone_new", 0);
+    perform_action( $RBD_FLATTEN, "$pool_name\/$clone_new", 2);
+    perform_action( $RBD_FLATTEN, "$pool_name\/$clone_new2", 2);
+    perform_action( $RBD_FLATTEN, "$pool_name\/$new_img_name", 2);
+}
+
+# Tests to rollback snapshot
+sub rollback_snapshot {
+    perform_action( $SNAP_ROLLBACK, "--snap $snap_name2 $pool_name\/$img_name",
+        0 );
+    perform_action( $SNAP_ROLLBACK,
+        "--snap $rbd_snap_new $pool_name\/$img_name", 2 );
+    perform_action( $SNAP_ROLLBACK,
+        "--snap $snap_name $pool_name\/$new_rbd_img", 2 );
+}
+
+# Tests to purge snapshots
+sub purge_snapshots {
+    perform_action( $SNAP_PURGE, "$pool_name\/$img_name",    0 );
+    perform_action( $SNAP_PURGE, "$pool_name\/$new_rbd_img", 2 );
+    perform_action( $SNAP_PURGE, "$pool_name\/$new_img_name", 2 );
+}
+
+# Tests to list snapshots for an image
+sub list_snapshots {
+    perform_action( $SNAP_LIST, "$pool_name\/$non_existing_img", 2 );
+}
+
+# Tests for remove snapshots
+sub remove_snapshot {
+    perform_action( $SNAP_REMOVE, "$pool_name\/$img_name\@$snap_name",      0 );
+    perform_action( $SNAP_REMOVE, "$pool_name\/$new_img_name\@$snap_new",      2 );
+    perform_action( $SNAP_REMOVE, "$non_pool_name\/$img_name\@$snap_name3", 2 );
+    perform_action( $SNAP_REMOVE, "$pool_name\/$img_name\@$snap_name2",     0 );
+    perform_action( $SNAP_REMOVE, "$pool_name\/$non_existing_img",          2 );
+    perform_action( $SNAP_REMOVE, " ",                                      2 );
+}
+
+# Tests for resize image
+sub resize_image {
+    perform_action( $RBD_RESIZE, "$img_name,size 1024,pool $pool_name", 0 );
+    perform_action( $RBD_RESIZE, "$non_existing_img,size 1024,pool $pool_name",
+        2 );
+}
+
+# Tests for list rbd image
+sub list_image {
+    perform_action( $RBD_LIST, "$non_pool_name", 2 );
+}
+
+# Tests to copy rbd image
+sub copy_image {
+    perform_action( $RBD_CP, "$pool_name\/$img_name $pool_name\/$cp_new", 0 );
+    perform_action( $RBD_CP, "$pool_name\/$non_existing_img",             2 );
+}
+
+# Tests for rbd info
+sub info_image {
+    perform_action( $RBD_INFO, "$pool_name\/$img_name", 0 );
+    perform_action( $RBD_INFO, "--snap $snap_name $pool_name\/$img_name_mv",
+        2 );
+    perform_action( $RBD_INFO, "--snap $no_snap $pool_name\/$img_name", 2 );
+    perform_action( $RBD_INFO, "$pool_name\/$non_existing_img",         2 );
+}
+
+# Tests for rename image
+sub rename_image {
+    perform_action( $RBD_RENAME,
+        "$pool_name\/$img_name_mv $pool_name\/$new_rbd_img", 0 );
+    perform_action(  $RBD_MV,
+        "$pool_name\/$new_rbd_img $pool_name\/$img_name_mv", 0 );
+}
+
+# Tests for remove image
+sub remove_image {
+    perform_action( $RBD_REMOVE,"$pool_name\/$img_name",0);
+    perform_action( $RBD_REMOVE, "$pool_name\/$new_rbd_img", 2 );
+    perform_action( $RBD_REMOVE, "$pool_name\/$rbd_imp_image", 0 );
+    perform_action( $RBD_REMOVE, "$pool_name\/$cp_new",            0 );
+    perform_action( $RBD_REMOVE, " ",                                2 );
+}
+
+# Tests for export rbd image
+sub export_image {
+    perform_action( $RBD_EXPORT, "$pool_name\/$img_name $exp_file", 0 );
+    perform_action( $RBD_EXPORT, "$pool_name\/$img_name .",         2 );
+    perform_action( $RBD_EXPORT, "$pool_name\/$img_name",           0 );
+    perform_action( $RBD_EXPORT,
+        "--snap $snap_name $pool_name\/$img_name $exp_file1", 0 );
+    perform_action( $RBD_EXPORT,
+        "--snap $no_snap $pool_name\/$img_name $exp_file1", 2 );
+    perform_action( $RBD_EXPORT,
+        "--snap $snap_name $pool_name\/$non_existing_img $exp_file2", 2 );
+}
+
+# Tests for import file to rbd image
+sub import_image {
+    my $i = create_test_file( $rbd_imp_file, $content );
+    if ( $i == 0 ) {
+        perform_action( $RBD_IMPORT, "$rbd_imp_file $pool_name\/$rbd_imp_image", 0 );
+    }
+    create_test_file( "$rbd_imp_test", 0 );
+    perform_action( $RBD_IMPORT, "$rbd_imp_test $pool_name\/$rbd_imp_image", 2);
+    perform_action( $RBD_IMPORT, "$exp_file $pool_name\/$rbd_imp_image", 2 );
+}
+
+# To map rbd image to device
+sub rbd_map {
+
+    # Execute "modprobe rbd"
+    my $cmd = get_command_output("sudo modprobe rbd");
+    if ( !$cmd ) {
+        perform_action( $RBD_MAP, "$pool_name\/$img_name", 0 );
+        rbd_showmapped();
+        perform_action( $RBD_MAP, "$pool_name\/$non_existing_img", 2 );
+    }
+}
+
+# To list rbd map
+sub rbd_showmapped {
+    perform_action( $RBD_SHOWMAPPED, "", 0 );
+}
+
+# To unmap rbd device
+sub rbd_unmap {
+    perform_action( $RBD_UNMAP, "/dev/rbd0", 0 );
+    sleep(10);
+    perform_action( $RBD_UNMAP, "/dev/rbd10", 2 );
+}
+
+# To create a test file and write to it
+sub create_test_file {
+    my ( $test_arg, $content ) = @_;
+    my $command = "touch $test_arg";
+    my $cmd     = get_command_output($command);
+    if ( ( !$cmd ) && ($content) ) {
+        $command = "echo $content > $test_arg";
+        $cmd     = get_command_output($command);
+        if ( !$cmd ) {
+            my $cmd = get_command_output("ls -l $test_arg");
+        }
+        else {
+            return 1;
+        }
+    }
+    else {
+        return 1;
+    }
+    return 0;
+}
+
+# deletes and creates a given rados pool  
+sub _create_rados_pool {
+    $exec_cmd = get_command_output("$RADOS_RMPOOL $pool_name");
+    if (   ( $exec_cmd =~ /$POOL_RM_SUCCESS/ )
+        || ( $exec_cmd =~ /does not exist/ ) )
+    {
+        debug_msg("Pool $pool_name deleted");
+    }
+    $exec_cmd = get_command_output("$RADOS_MKPOOL $pool_name");
+    if (   ( $exec_cmd =~ /$POOL_MK_SUCCESS/ )
+        || ( $exec_cmd =~ /$RBD_EXISTS_ERR/ ) )
+    {
+        debug_msg("Pool $pool_name created");
+    }
+}
+
+sub _del_pool {
+    $exec_cmd = get_command_output("$RADOS_RMPOOL $pool_name");
+    if (   ( $exec_cmd =~ /$POOL_RM_SUCCESS/ )
+        || ( $exec_cmd =~ /does not exist/ ) )
+    {
+        debug_msg("Pool $pool_name deleted");
+    }
+}
+
+#== Main starts here===
+
+_pre_clean_up();
+display_ceph_os_info();
+_create_rados_pool();
+create_image();
+list_image();
+rename_image();
+resize_image();
+info_image();
+create_snapshots();
+protect_snapshot();
+export_image();
+import_image();
+list_snapshots();
+rollback_snapshot();
+remove_snapshot();
+purge_snapshots();
+clone_image();
+rbd_flatten();
+unprotect_snapshot();
+copy_image();
+remove_image();
+display_result();
+_post_clean_up();
+_del_pool();
diff --git a/qa/qa_scripts/rbd_functional_tests.pl b/qa/qa_scripts/rbd_functional_tests.pl
new file mode 100755
index 0000000..654caa1
--- /dev/null
+++ b/qa/qa_scripts/rbd_functional_tests.pl
@@ -0,0 +1,532 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+rbd_functional_tests.pl - Script to test the RBD functionality.  
+
+=head1 SYNOPSIS
+
+Use:
+        perl rbd_functional_tests.pl [--help]
+
+Examples:
+        perl rbd_functional_tests.pl  
+	or
+	perl rbd_functional_tests.pl  --help
+
+=head1 ARGUMENTS
+
+rbd_functional_tests.pl takes the following arguments:
+        --help
+        (optional) Displays the usage message.
+
+If cephx is enabled, set 'export CEPH_ARGS="--keyring /etc/ceph/ceph.keyring --id <user>"'
+and execute the script as root.
+
+For Example,for "nova" user, 'export CEPH_ARGS="--keyring /etc/ceph/ceph.keyring --id nova"'
+
+=cut
+
+use strict;
+use warnings;
+use Cwd;
+use RbdLib qw(perform_action log_results display_result _pre_clean_up _post_clean_up _create_rados_pool display_ceph_os_info $RADOS_MKPOOL $RADOS_RMPOOL $RBD_CREATE $RBD_RESIZE $RBD_INFO $RBD_REMOVE $RBD_RENAME $RBD_MV $RBD_LS $RBD_LIST $RBD_CLONE $RBD_EXPORT $RBD_IMPORT $RBD_CP $RBD_COPY $SNAP_CREATE $SNAP_LS $SNAP_LIST $SNAP_ROLLBACK $SNAP_PURGE $SNAP_REMOVE $POOL_RM_SUCCESS $POOL_MK_SUCCESS $RBD_EXISTS_ERR $RBD_WATCH $RBD_MAP $RBD_UNMAP $RBD_SHOWMAPPED $RADOS_LS get_command_output ver [...]
+
+use Pod::Usage();
+use Getopt::Long();
+
+my $help;
+
+Getopt::Long::GetOptions(
+    'help'   => \$help
+);
+
+Pod::Usage::pod2usage( -verbose => 1 ) if ($help);
+
+my $pool_name = "rbd";
+
+#===========Variables used in the script========
+
+my $img_name         = "test_img";
+my $snap_name        = "snap1";
+my $snap_name2       = "snap2";
+my $snap_name3       = "snap3";
+my $snap_name4       = "snap4";
+my $new_rbd_img      = "new_rbd_img";
+my $non_existing_img = "rbdimage";
+my $cp_new           = "new";
+my $exp_file         = "rbd_test_file1";
+my $exp_file1        = "rbd_test_file2";
+my $exp_file2        = "rbd_test_file3";
+my $rbd_imp_file     = "test_file";
+my $rbd_imp_image    = "new_imp_img";
+my $content          = "This is a test file";
+my $rbd_snap_new     = "new";
+my $neg_img_name     = "neg_img";
+my $max_img_name     = "max_img";
+my $img_name1        = "test_img1";
+my $rbd_imp_test     = "new_test_file";
+my $non_pool_name    = "no_pool";
+my $no_snap          = "no_snap";
+my $img_name_mv      = "new_img_mv";
+my $test_log         = "logfile.txt";
+my $success          = "test_completed.txt";
+my $fail             = "log.txt";
+my $obj_initial      = "000000000000";
+my $obj_second       = "000000000001";
+my $exec_cmd;
+our $MSG;
+our $CLI_FLAG = "FALSE";
+my $TC3_LOG = "verify import of file to rbd image and export the same image to file";
+my $TC5_LOG = "Export rbd image to already existing non-empty file";
+my $TC6_LOG = "Import file to an existing rbd image";
+my $TC7_LOG = "verify import of an empty local file to rbd image";  
+my $TC8_LOG = "verify import of nonexisting file to rbd image";
+my $TC9_LOG = "verify import of a directory to rbd image";
+my $TC11_LOG = "verify export from an non-existing rbd image"; 
+
+sub _create_pool {
+    $exec_cmd = get_command_output("$RADOS_RMPOOL $pool_name");
+    if (   ( $exec_cmd =~ /$POOL_RM_SUCCESS/ )
+        || ( $exec_cmd =~ /does not exist/ ) )
+    {
+        debug_msg ("Pool $pool_name deleted");
+    }
+    $exec_cmd = get_command_output("$RADOS_MKPOOL $pool_name");
+    if (   ( $exec_cmd =~ /$POOL_MK_SUCCESS/ )
+        || ( $exec_cmd =~ /RBD_EXISTS_ERR/ ) )
+    {
+        debug_msg ("Pool $pool_name created");
+    }
+}
+
+#To map rbd image to device
+sub rbd_mapp {
+    my $img_name = shift;
+
+    # Execute "modprobe rbd"
+    my $cmd = get_command_output("sudo modprobe rbd");
+    if ( !$cmd ) {
+        perform_action( $RBD_MAP, "$pool_name\/$img_name", 0 );
+        my $ret = rbd_showmapped1($img_name);
+        print "ret is $ret \n";
+        return $ret;
+
+        #perform_action( $RBD_MAP, "$pool_name\/$non_existing_img", 2 );
+    }
+}
+
+# To list rbd map
+sub rbd_showmapped1 {
+    my $img     = shift;
+    my $ret_map = get_command_output($RBD_SHOWMAPPED);
+    my @lines   = split( /\n/, $ret_map );
+    shift(@lines);
+    foreach (@lines) {
+        if ( $_ =~ /(\d+)\s+(\S+)\s+($img)\s+\-\s+(\S+)/ ) {
+            print "match $2 and $3  and $4 \n";
+            return $4;
+        }
+    }
+    return 0;
+}
+
+# To unmap rbd device
+sub rbd_unmap {
+    perform_action( $RBD_UNMAP, "/dev/rbd0", 0 );
+    sleep(10);
+    perform_action( $RBD_UNMAP, "/dev/rbd10", 2 );
+}
+
+# To unmap rbd device
+sub rbd_unmap_dev {
+    my $dev = shift;
+    my $rcode = perform_action( $RBD_UNMAP, $dev, 0 );
+    return $rcode;
+}
+
+# Delete the RBD image used by the client
+sub del_mapped_img {
+    debug_msg("start of test");
+    my $img = rand();
+    my $dev;
+    my $rc_create =
+      perform_action( $RBD_CREATE, "$img,pool $pool_name,size 100", 0 );
+    if ( !$rc_create ) {
+        $dev = rbd_mapp($img);
+        if ($dev) {
+            my $rc_del = perform_action( $RBD_REMOVE, "$pool_name\/$img", 0 );
+            if ($rc_del) {
+                tpass("TC22 - Delete mapped rbd img");
+                perform_action( $RBD_UNMAP, $dev, 0 );
+                perform_action( $RBD_REMOVE, "$pool_name\/$img", 0 );
+            }
+            else {
+                tfail("TC22 - Delete mapped rbd img");
+            }
+        }
+    }
+    debug_msg("end of test");
+    #log_results();
+}
+
+# To create a test file and write to it
+sub create_test_file {
+    my ( $test_file, $dd_ifile ) = @_;
+    print "dd is $dd_ifile \n";
+    my $command = "dd if=$dd_ifile of=$test_file bs=1024 count=5000";
+    my $cmd_op  = get_command_output($command);
+    if ( $cmd_op =~ /records/ ) {
+        my $csum = get_cksum($test_file);
+        return $csum;
+    }
+    else {
+        return -1;
+    }
+}
+
+# get cksum of given file
+sub get_cksum {
+    my ($t_file) = @_;
+    my $csum = get_command_output("cksum  $t_file");
+    my $cksum = ( split / /, $csum )[0];
+    return $cksum;
+}
+
+#import file to rbd image and verify if objects created
+sub import_verify_objs {
+    my ( $img, $file ) = @_;
+    my $rc = perform_action( $RBD_IMPORT, "$file $img", 0 );
+    if ( !$rc ) {
+        my $rc1 = check_rados_objs($img);
+        debug_msg("import $file $img passed") && return 0 if ( !$rc1 );
+    }
+    debug_msg("import $file $img failed");
+    return 1;
+}
+
+sub import_resize_checkobjs {
+    my $img         = "image1";
+    my $file        = "imp_file";
+    my $dd_if       = "/dev/zero";
+    my $exp_to_file = "/tmp/new";
+    my $rcc         = create_test_file( $file, $dd_if );
+    if ( $rcc != -1 ) {
+        my $rc1 = import_verify_objs( $img, $file );
+        if ( !$rc1 ) {
+            my $rc2 =
+              perform_action( $RBD_RESIZE, "$pool_name\/$img --size 0", 0 );
+            if ( !$rc2 ) {
+                my $rc3 = check_rados_objs($img);
+                if ($rc3) {
+                    tpass("TC2 passed: Import file to an image, resize image and verify");
+
+=head - this one hangs 	
+					my $rc2 = perform_action( $RBD_EXPORT,"$pool_name\/$img $exp_to_file",0);
+					if ($rc2) {
+						tpass( "TC12 Passed - Export image of size 0" );	
+					} else {
+						tfail( "TC12 Failed - Export image of size 0" );	
+					}
+=cut
+
+                }
+                else {
+                    tfail("TC2 failed: Import file to an image, resize and verify");
+                }
+            }
+        }
+    }
+    perform_action( $RBD_REMOVE, "$pool_name\/$img", 0 );
+    remove_test_files($file);
+    remove_test_files($exp_to_file);
+}
+
+sub remove_test_files {
+    my $file = shift;
+    my $cmd  = get_command_output("rm -rf $file");
+    if ( $cmd !~ /./ ) {
+        debug_msg("$file deleted");
+    }
+    else {
+        debug_msg("$file NOT deleted");
+    }
+}
+
+sub import_export {
+    my $new_img       = "testin";
+    my $imp_from_file = "/tmp/file1";
+    my $exp_to_file   = "/tmp/file2";
+    my ( $dd_ip_file, $tc, $tc_log ) = @_;
+    my $csum = create_test_file( $imp_from_file, $dd_ip_file );
+    if ( $csum != -1 ) {
+        my $rc1 = import_verify_objs( $new_img, $imp_from_file );
+        if ( !$rc1 ) {
+            my $rc2 = perform_action( $RBD_EXPORT, "$new_img $exp_to_file", 0 );
+            my $csum2 = get_cksum($exp_to_file);
+            if ( !$rc2 ) {
+                if   ( $csum == $csum2 ) { tpass("TC$tc passed: $tc_log"); }
+                else                     { tfail("TC$tc failed: $tc_log") }
+            }
+        }
+    }
+    #log_results();
+    my $a = perform_action( $RBD_REMOVE, "$pool_name\/$new_img", 0 );
+    remove_test_files($exp_to_file);
+    remove_test_files($imp_from_file);
+}
+
+sub import_rename_export {
+    my $new_img       = "testing_img1";
+    my $new1_img      = "testing_img2";
+    my $imp_from_file = "/tmp/file1";
+    my $dd_ifile      = "/dev/zero";
+    my $exp_to_file   = "/tmp/file2";
+    my $csum          = create_test_file( $imp_from_file, $dd_ifile );
+    if ( $csum != -1 ) {
+        my $rc1 = import_verify_objs( $new_img, $imp_from_file );
+        my $rc_mv =
+          perform_action( $RBD_RENAME,
+            "$pool_name/$new_img $pool_name/$new1_img", 0 )
+          if ( !$rc1 );
+        if ( !$rc_mv ) {
+            my $rc2 = perform_action( $RBD_EXPORT, "$new_img $exp_to_file", 0 );
+            if ($rc2) {
+                tpass("TC4 passed: verify import file to an image , rename image and export image");
+            }
+            else {
+                tfail("TC4 failed: verify import file to an image , rename image and export image");
+            }
+        }
+    }
+    #log_results();
+    perform_action( $RBD_REMOVE, "$pool_name\/$new1_img", 0 );
+    remove_test_files($imp_from_file);
+}
+
+sub imp_exp_existing {
+    my ( $cmd, $imgg, $file, $tc, $tc_log ) = @_;
+    my $dd_if = "/dev/zero";
+    my $rc2   = " ";
+    my $rc_create = perform_action( $RBD_CREATE, "$imgg, pool $pool_name, size 1024", 0 );
+    print ":rc is $rc_create \n";
+    if ( !$rc_create ) {
+        my $cksum = create_test_file( $file, $dd_if );
+        if ( $cksum != -1 ) {
+            $rc2 = perform_action( "$cmd", "$file $pool_name\/$imgg", 0 )
+              if ( $cmd eq 'rbd import' );
+            $rc2 = perform_action( "$cmd", "$pool_name\/$imgg $file", 0 )
+              if ( $cmd eq 'rbd export' );
+            if ($rc2) {
+                tpass("TC$tc passed: $tc_log");
+            }
+            else {
+                tfail("TC$tc failed: $tc_log");
+            }
+        }
+    }
+    perform_action( $RBD_REMOVE, "$pool_name\/$imgg", 0 );
+    remove_test_files( $file );
+}
+
+sub import_tcs {
+    my $new_img = rand();
+    my $rc1;
+    my ( $option, $tc, $tc_log ) = @_;
+    get_command_output("touch $option") if ( $tc == 7 );
+    get_command_output("mkdir $option") if ( $tc == 9 );
+    if ( ( $tc == 7 ) || ( $tc == 9 ) || ( $tc == 8 ) ) {
+        $rc1 = perform_action( $RBD_IMPORT, "$option $new_img", 0 );
+    }
+    elsif ( $tc == 11 ) {
+        $rc1 = perform_action( $RBD_EXPORT, "$new_img $option", 0 );
+    }
+    if ($rc1) {
+        tpass("TC$tc passed: $tc_log");
+    }
+    else {
+        tfail("TC$tc failed: $tc_log");
+    }
+    remove_test_files($option);
+    #log_results();
+}
+
+sub get_prefix_obj {
+    my $img          = shift;
+    my $rbd_info_op  = verify_action( $RBD_INFO, "$img", 0 );
+    my @get_prefix_l = split( "\n", $rbd_info_op );
+    my $get_prefix   = ( split /:/, $get_prefix_l[3] )[-1];
+    $get_prefix =~ s/^\s+//;
+    return $get_prefix;
+}
+
+sub get_img_size {
+    my $img         = shift;
+    my $rbd_info_op = verify_action( $RBD_INFO, "$img", 0 );
+    my @get_size_l  = split( "\n", $rbd_info_op );
+    my $get_size    = ( split / /, $get_size_l[1] )[1];
+    return $get_size;
+}
+
+sub check_rados_basic_ls {
+    my ($image) = @_;
+    my $rbd_image = "$image\.rbd";
+    my $cmd_output = verify_action( $RADOS_LS, "-p $pool_name", 0 );
+    if (   ( $cmd_output =~ /rbd_directory/ )
+        && ( $cmd_output =~ /$rbd_image/ ) )
+    {
+        return 0;
+    }
+    else {
+        return 1;
+    }
+}
+
+sub check_rados_objs {
+    my ($img)          = @_;
+    my $get_obj_prefix = get_prefix_obj($img);
+    my $obj1           = "$get_obj_prefix\.$obj_initial";
+    my $obj2           = "$get_obj_prefix\.$obj_second";
+    my @get_rados_objs = verify_action( $RADOS_LS, "-p $pool_name", 0 );
+    if (   ( grep /$obj1/, @get_rados_objs )
+        && ( grep /$obj2/, @get_rados_objs ) )
+    {
+        return 0;
+    }
+    return 1;
+}
+
+sub create_check_objs {
+    my $cmd_rc =
+      perform_action( $RBD_CREATE, "$img_name,pool $pool_name,size 1024", 0 );
+    my $rc = check_rados_basic_ls($img_name);
+    if ( !$rc ) {
+        tpass("TC1 passed: rados ls passed");
+    }
+    else {
+        tfail("TC1 failed: rados ls failed");
+    }
+    #log_results();
+}
+
+sub create_snap_resize_rollback {
+    my $img = rand();
+    my $snp = rand();
+    debug_msg("Start of Test");
+    my $rc_c = create_snapshot( $img, $snp );
+    if ( !$rc_c ) {
+        my $rc1 =
+          perform_action( $RBD_RESIZE, "$pool_name\/$img --size 50", 0 );
+        if ( !$rc1 ) {
+            my $rc_sr = rollback_snapshots( $img, $snp );
+            if ( !$rc_sr ) {
+                tpass("TC13 passed: create,resize and rollback");
+                perform_action( $SNAP_PURGE, "$pool_name\/$img", 0 );
+                perform_action( $RBD_REMOVE, "$pool_name\/$img", 0 );
+            }
+            else {
+                tfail("TC13 failed: create,resize and rollback");
+            }
+        }
+    }
+    debug_msg("End of the Test");
+    #log_results();
+}
+
+sub create_snap_rollback {
+    my $img = rand();
+    my $snp = rand();
+    debug_msg("Start of Test");
+    my $rc_c = create_snapshot( $img, $snp );
+    if ( !$rc_c ) {
+        my $rc_sr = rollback_snapshots( $img, $snp );
+        if ( !$rc_sr ) {
+            tpass("TC15 passed: create snapshot and rollback snapshot immediately");
+            perform_action( $SNAP_PURGE, "$pool_name\/$img", 0 );
+            perform_action( $RBD_REMOVE, "$pool_name\/$img", 0 );
+        }
+        else {
+            tfail("TC15 failed: create snapshot and rollback snapshot immediately");
+        }
+    }
+    debug_msg("End of the Test");
+    #log_results();
+}
+
+sub create_delete_rollback {
+    my $img = rand();
+    my $snp = rand();
+    debug_msg("Start of Test");
+    my $rc_c = create_snapshot( $img, $snp );
+    if ( !$rc_c ) {
+        my $rc1 = perform_action( $SNAP_REMOVE, "$pool_name\/$img\@$snp", 0 );
+        if ( !$rc1 ) {
+            my $rc_sr = rollback_snapshots( $img, $snp );
+            if ($rc_sr) {
+                tpass("TC16 passed: create,delete and rollback");
+                my $rc_srm =
+                  perform_action( $SNAP_PURGE, "$pool_name\/$img", 2 );
+                if ($rc_srm) {
+                    tpass("TC17 passed: snap purge on image with no snapshots");
+                }
+                else {
+                    tfail("TC17 passed: snap purge on image with no snapshot failed");
+                }
+            }
+            else {
+                tfail("TC16 failed: create,delete and rollback");
+            }
+        }
+    }
+    my $rc_rm = perform_action( $RBD_REMOVE, "$pool_name\/$img", 0 );
+    debug_msg("End of the Test");
+    #log_results();
+}
+
+sub create_snapshot {
+    my ( $image, $snap ) = @_;
+    my $rc_create =
+      perform_action( $RBD_CREATE, "$image,pool $pool_name,size 100", 0 );
+    if ( !$rc_create ) {
+        my $rc_snap =
+          perform_action( $SNAP_CREATE, "--snap $snap $pool_name\/$image", 0 );
+        return $rc_snap;
+    }
+}
+
+sub rollback_snapshots {
+    my ( $img, $snap ) = @_;
+    my $rc_sr =
+      perform_action( $SNAP_ROLLBACK, "--snap $snap $pool_name\/$img", 0 );
+    if ( !$rc_sr ) {
+        my $img_size1 = get_img_size($img);
+        if ( $img_size1 == 102400 ) {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+#===Main===
+
+my $test_img  = rand();
+my $test_file = rand();
+my $test_dir  = rand();
+_pre_clean_up();
+display_ceph_os_info();
+_create_pool();
+create_check_objs();
+import_resize_checkobjs();
+import_export( "/dev/zero", 3, $TC3_LOG );
+import_rename_export();
+imp_exp_existing( $RBD_EXPORT, $test_img, $test_file,  5 , $TC5_LOG);
+imp_exp_existing( $RBD_IMPORT, $test_img, $test_file, 6 , $TC6_LOG);
+import_tcs( $test_file, 7, $TC7_LOG );
+import_tcs( $test_file, 8 , $TC8_LOG);
+import_tcs( $test_dir,  9 , $TC9_LOG);
+import_tcs( $test_file, 11, $TC11_LOG );
+#del_mapped_img ()  dont execute this when cluster and client is on the same m/c
+create_snap_resize_rollback();
+create_snap_rollback();
+create_delete_rollback();
+display_func_result();
diff --git a/qa/qa_scripts/rgw_install_config.pl b/qa/qa_scripts/rgw_install_config.pl
new file mode 100755
index 0000000..1a715b5
--- /dev/null
+++ b/qa/qa_scripts/rgw_install_config.pl
@@ -0,0 +1,287 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+rgw_install_config.pl - Script to install and configure the rados gateway on client machine.
+
+=head1 SYNOPSIS
+
+Use:
+        perl rgw_install_config.pl [--help]
+
+Examples:
+        perl rgw_install_config.pl
+        or
+        perl rgw_install_config.pl  --help
+
+=head1 ARGUMENTS
+
+rgw_install_config.pl takes the following arguments:
+        --help
+        (optional) Displays the usage message.
+
+=cut
+
+use strict;
+use warnings;
+use Pod::Usage();
+use Getopt::Long();
+
+my $help;
+
+Getopt::Long::GetOptions(
+    'help'   => \$help
+);
+
+Pod::Usage::pod2usage( -verbose => 1 ) if ($help);
+
+# Function that enters the given msg to log.txt
+
+sub _write_log_entry {
+    my $logmsg = shift;
+    open(TC,'>>log.txt');
+    print TC "[Log] $logmsg\n";
+    close(TC);
+}
+
+# Function to get the hostname
+sub get_hostname
+{
+    my $cmd = "hostname";
+    my $get_host = `$cmd`;
+    chomp($get_host);
+    return($get_host);
+}
+
+# Function to execute the command and return the exit status
+sub exec_cmd
+{
+    my $cmd = shift;
+    my $excmd = system($cmd);
+    if ( $excmd == 0 ) {
+        _write_log_entry("$cmd successful");
+	return 0;
+    } else{ 
+        _write_log_entry("$cmd NOT successful");
+        return 1;
+    }	
+} 
+
+# function to execute the command and return output
+sub get_cmd_op
+{
+    my $cmd = shift;
+    my $excmd = `$cmd`;
+    _write_log_entry("$cmd \n $excmd");
+    return $excmd;
+}
+
+# Function to enable module for apache and fastcgi
+sub enmod
+{
+	if (!system("sudo a2enmod rewrite")){
+		if (!system("sudo a2enmod fastcgi")){
+		        _write_log_entry("a2enmod rewrite && a2enmod fastcgi successful"); 
+			return 0;
+		}	
+		write_log_entry("a2enmod fastcgi NOT successful"); 
+                return 1;
+	}	
+	write_log_entry("a2enmod rewrite NOT successful"); 
+        return 1;
+}
+
+# Function to create httpd.conf file
+sub set_httpconf
+{
+       my $hostname = shift;
+       my $http_conf = "/etc/apache2/httpd.conf";
+       my $file = "test_file";
+       open (FH, ">$file"); 
+       print FH "ServerName $hostname";
+       close FH;
+       my $get_op = "sudo sh -c \"cat $file >> $http_conf\"";        
+       my $exit_status = exec_cmd($get_op);	
+       exec_cmd("rm -f $file");
+       return $exit_status;
+}
+
+# To append ceph.conf file with radosgw info
+sub append_ceph_conf
+{
+        my $hostname = shift;
+	my $file = "/etc/ceph/ceph.conf";
+	my $file1 = "test_file1";
+	open (FH, ">$file1");
+	print FH "[client.radosgw.gateway]
+		  host = $hostname
+		  keyring = /etc/ceph/keyring.radosgw.gateway
+		  rgw socket path = /tmp/radosgw.sock
+		  log file = /var/log/ceph/radosgw.log \n";
+	close FH;
+	my $get_op = "sudo sh -c \"cat $file1 >> $file\""; 
+        my $exit_status = exec_cmd($get_op);	
+        exec_cmd("rm -f $file1");
+        return $exit_status;
+}
+
+# create s3gw.fcgi file and set execute permission for the file  
+sub create_fcgi
+{
+        my $file = "/var/www/s3gw.fcgi";
+        my $chmod_file = "sudo chmod +x /var/www/s3gw.fcgi";
+        my $exe_cmd = "exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway";
+        my $file1 = "test_file3";
+        open (FH, ">$file1");
+        print FH "#!/bin/sh \n $exe_cmd \n"; 
+        close FH;
+        my $get_op = "sudo sh -c \"cat $file1 >> $file\"" ;
+        my $exit_status = exec_cmd($get_op);
+        exec_cmd("rm -f $file1");
+        my $exit_status1 = exec_cmd($chmod_file) if (!$exit_status); 
+        return $exit_status1;
+}
+
+# To create rgw.conf
+sub create_rgw_conf {
+	my $content = "FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock
+<VirtualHost *:80>
+        ServerName rados.domain.com
+        ServerAdmin qa\@inktank.com
+        DocumentRoot /var/www
+
+        RewriteEngine On
+        RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=\$1&params=\$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
+
+        <IfModule mod_fastcgi.c>
+                <Directory /var/www>
+                        Options +ExecCGI
+                        AllowOverride All
+                        SetHandler fastcgi-script
+                        Order allow,deny
+                        Allow from all
+                        AuthBasicAuthoritative Off
+                </Directory>
+        </IfModule>
+        AllowEncodedSlashes On
+        ErrorLog /var/log/apache2/error.log
+        CustomLog /var/log/apache2/access.log combined
+        ServerSignature Off
+</VirtualHost>";
+
+	my $file = "/etc/apache2/sites-available/rgw.conf";
+        my $file1 = "test_file2";
+	open (FH, ">$file1");
+	print FH "$content";
+	close FH;
+	my $get_op = "sudo sh -c \"cat $file1 >> $file\""; 
+	my $exit_status = exec_cmd($get_op);	
+        exec_cmd("rm -f $file1");
+	return $exit_status;
+}
+
+# To generate keyring for rados gateway and add it to ceph keyring with required access
+sub generate_keyring_and_key
+{
+ 	my $cmd = "sudo ceph-authtool --create-keyring /etc/ceph/keyring.radosgw.gateway";
+        my $chmod_cmd = "sudo chmod +r /etc/ceph/keyring.radosgw.gateway";
+	my $cmd_key = "sudo ceph-authtool /etc/ceph/keyring.radosgw.gateway -n client.radosgw.gateway --gen-key";
+	my $chmod_cmd_key = "sudo ceph-authtool -n client.radosgw.gateway --cap osd \'allow rwx\' --cap mon \'allow r\' /etc/ceph/keyring.radosgw.gateway";
+  	my $exit_status = exec_cmd($cmd);
+	my $exit_status1 = exec_cmd($chmod_cmd) if(!$exit_status);
+        my $exit_status2 = exec_cmd($cmd_key) if(!$exit_status1);
+        my $exit_status3 = exec_cmd($chmod_cmd_key) if(!$exit_status2);
+	return($exit_status3);
+}
+
+# To create a rgw user
+sub create_user
+{
+	my $usr = shift;
+	my $cmd = "sudo radosgw-admin user create --uid=$usr --display-name=$usr";	
+	my $status = exec_cmd($cmd);
+	return($status);
+}
+
+#To start radosgw
+sub start_rgw
+{
+ 	my $cmd = "sudo /etc/init.d/radosgw start";
+	my $check_ps = "ps -ef | grep radosgw | grep -v grep"; 
+	my $status = get_cmd_op($cmd);
+	if (!$status) {  
+		my $ps = get_cmd_op($check_ps); 
+		if ($ps =~ /radosgw/) {
+			return 0;
+		}
+	}
+	return 1;
+}
+
+# To start the given service
+sub start_service
+{
+	my $input = shift;
+	my $status = exec_cmd ("sudo service $input restart");
+	if (!$status){
+		my $output = get_cmd_op("sudo service $input status");
+		if ($output =~ /running/ ){
+			if($input eq "apache2" ) {
+				return 0;
+			}elsif($input eq "ceph"){
+				my $count = get_cmd_op("sudo service ceph status | wc -l");
+				if ($count == 8 ){
+					return 0;
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+# To enable/disable site
+sub ensite_dissite
+{
+	my $a2ensite = "sudo a2ensite rgw.conf";
+	my $a2dissite = "sudo a2dissite default";
+	my $check_en = get_cmd_op($a2ensite); 
+	my $check_dis = get_cmd_op($a2dissite); 
+	if (($check_en =~ /nabl/) && ($check_dis =~ /isabl/)){
+		return 0;
+	}
+	return 1;
+}
+
+#====Main starts here ======
+
+my $domain = "front.sepia.ceph.com";
+my $host = get_hostname();
+my $hostname = "$host.$domain";
+my $run_update = "sudo apt-get update";  
+my $install_radosgw = "sudo apt-get install radosgw";
+my $mkdir_rgw = "sudo mkdir -p /var/lib/ceph/radosgw/ceph-radosgw.gateway";
+my $add_entry_ceph_keyring = "sudo ceph -k /etc/ceph/ceph.keyring auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway";
+my $start_rgw = "sudo /etc/init.d/radosgw start";
+my $user = "qa";
+my $install_ap_fcgi = "yes | sudo apt-get install apache2 libapache2-mod-fastcgi" if(!exec_cmd($run_update));
+my $check_en = enmod() if(!$install_ap_fcgi);
+my $check_http = set_httpconf($hostname) if (!$check_en); 
+my $check_apache = start_service("apache2") if (!$check_http) ;
+my $check_install = exec_cmd($install_radosgw) if(!$check_apache);		
+my $get_exit = append_ceph_conf($host) if(!$check_install);
+my $get_exec = exec_cmd($mkdir_rgw) if(!$get_exit);	
+my $get_status = create_rgw_conf() if (!$get_exec);
+my $get_enstatus = ensite_dissite() if (!$get_status);
+my $get_status1 = create_fcgi() if(!$get_enstatus);
+my $status = generate_keyring_and_key() if (!$get_status1);
+my $status_add = exec_cmd($add_entry_ceph_keyring) if(!$status);
+my $status_ceph = start_service("ceph") if (!$status_add);
+my $status_apache = start_service("apache2") if (!$status_ceph);
+my $status_rgw = start_rgw() if (!$status_apache);
+my $status_user = create_user($user) if (!$status_rgw);	
+_write_log_entry("RGW installation and configuration successful!") if (!$status_user);	
+
+
+
+
+
diff --git a/qa/qa_scripts/s3-file-test.pl b/qa/qa_scripts/s3-file-test.pl
new file mode 100755
index 0000000..cd6ee94
--- /dev/null
+++ b/qa/qa_scripts/s3-file-test.pl
@@ -0,0 +1,241 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+s3-file-test.pl - Script to test the S3 functionality
+
+=head1 SYNOPSIS
+
+Use:
+        perl s3-file-test.pl <test_id> [--help]
+
+Examples:
+        perl s3-file-test.pl <1|2|3|4|5>
+        or
+        perl s3-file-test.pl  --help
+
+=head1 DESCRIPTION
+
+This script intends to test the S3 functionality
+and reports the test results
+
+=head1 ARGUMENTS
+
+s3-file-test.pl takes the following arguments:
+   <test_id>
+   (mandatory) Specify the test case ID. It should be one of these values: 1|2|3|4|5
+   --help
+   (optional) Displays the usage message.
+
+=cut
+
+use Amazon::S3;
+use Data::Dumper;
+use strict;
+use IO::File;
+use Getopt::Long;
+use Digest::MD5;
+use S3Lib qw(display_ceph_os_info get_timestamp get_hostname get_user_info $rgw_user delete_user _write_log_entry _exit_result get_status);
+use Pod::Usage();
+
+my ( $help, $tc );
+
+Getopt::Long::GetOptions(
+    'help' => \$help
+);
+my $tc = $ARGV[0];
+Pod::Usage::pod2usage(-verbose => 1) && exit if (( @ARGV == 0 ) || ($help) );
+
+#== local variables ===
+my $exit_status = 0;
+my $mytestfilename;
+my $logmsg;
+my $kruft;
+my $s3;
+my $domain   = "front.sepia.ceph.com";
+my $host     = get_hostname();
+my $hostname = "$host.$domain";
+my $testfileloc;
+
+# Execute the test case based on the input to the script
+sub create_file {
+    if ( $tc == 1 ) {
+        system("dd if=/dev/zero of=/tmp/10MBfile bs=10485760 count=1");
+        $mytestfilename = '10MBfile';
+    }
+    elsif ( $tc == 2 ) {
+        system("dd if=/dev/zero of=/tmp/100MBfile bs=10485760 count=10");
+        $mytestfilename = '100MBfile';
+    }
+    elsif ( $tc == 3 ) {
+        system("dd if=/dev/zero of=/tmp/500MBfile bs=10485760 count=50");
+        $mytestfilename = '500MBfile';
+    }
+    elsif ( $tc == 4 ) {
+        system("dd if=/dev/zero of=/tmp/1GBfile bs=10485760 count=100");
+        $mytestfilename = '1GBfile';
+    }
+    elsif ( $tc == 5 ) {
+        system("dd if=/dev/zero of=/tmp/2GBfile bs=10485760 count=200");
+        $mytestfilename = '2GBfile';
+    } else {
+        $exit_status = 1;
+        _exit_result($exit_status);
+    }
+    return 0;
+}
+
+# Run tests for the S3 functionality
+sub run_tests {
+    # Modify access keys to suit the target account
+    my ( $access_key, $secret_key ) = get_user_info();
+    if ( ($access_key) && ($secret_key) ) {
+        $s3 = Amazon::S3->new(
+            {
+                aws_access_key_id     => $access_key,
+                aws_secret_access_key => $secret_key,
+                host                  => $hostname,
+                secure                => 0,
+                retry                 => 1,
+            }
+        );
+    }
+
+    # List the existing buckets
+    my $response = $s3->buckets;
+    foreach my $bucket ( @{ $response->{buckets} } ) {
+        print "You have a bucket: " . $bucket->bucket . "\n";
+    }
+
+    # create a new bucket (the test bucket)
+    my $bucketname = 'kftestbucket' . get_timestamp();
+    print "Attempting to create bucket = $bucketname\n";
+    my $bucket = $s3->add_bucket( { bucket => $bucketname } )
+      or die $s3->err . $s3->errstr;
+    print "Bucket Created: $bucketname\n";
+    $logmsg = "Bucket Created: $bucketname";
+    _write_log_entry($logmsg);
+
+    # upload a file to the bucket
+    print "adding file to bucket: $mytestfilename\n";
+    $bucket->add_key_filename( $mytestfilename, $testfileloc,
+        { content_type => 'text/plain', },
+    ) or die $s3->err . ": " . $s3->errstr;
+    $logmsg = "$mytestfilename uploaded";
+    _write_log_entry($logmsg);
+
+    # store a value in the bucket
+    $bucket->add_key( 'reminder.txt', 'this is text via add_key' )
+      or die $s3->err . ": " . $s3->errstr;
+    $logmsg = "Text value stored in file";
+    _write_log_entry($logmsg);
+
+    # list files in the bucket
+    $response = $bucket->list_all
+      or die $s3->err . ": " . $s3->errstr;
+    foreach my $key ( @{ $response->{keys} } ) {
+        my $key_name = $key->{key};
+        my $key_size = $key->{size};
+        print "Bucket contains key '$key_name' of size $key_size\n";
+    }
+
+    # fetch file from the bucket
+    print
+      "Downloading $mytestfilename to temp file: /tmp/downloadfilepurgeme...";
+    $response =
+      $bucket->get_key_filename( $mytestfilename, 'GET',
+        '/tmp/downloadfilepurgeme' )
+      or die $s3->err . ": " . $s3->errstr;
+    $logmsg = "file downloaded";
+    _write_log_entry($logmsg);
+
+    # fetch value from the bucket
+    $response = $bucket->get_key('reminder.txt')
+      or die $s3->err . ": " . $s3->errstr;
+    print "reminder.txt:\n";
+    print "  content length: " . $response->{content_length} . "\n";
+    print "    content type: " . $response->{content_type} . "\n";
+    print "            etag: " . $response->{content_type} . "\n";
+    print "         content: " . $response->{value} . "\n";
+
+    # check the original file against the downloaded file to see if the file has been
+    # corrupted.
+    my $md5    = Digest::MD5->new;
+    my $check  = 1;
+    my $File   = $testfileloc;
+    my $dlfile = "/tmp/downloadfilepurgeme";
+    open( FILE, $File )
+      or die "Error: Could not open $File for MD5 checksum...";
+    open( DLFILE, $dlfile )
+      or die "Error: Could not open $dlfile for MD5 checksum.";
+    binmode(FILE);
+    binmode(DLFILE);
+    my $md5sum   = $md5->addfile(*FILE)->hexdigest;
+    my $md5sumdl = $md5->addfile(*DLFILE)->hexdigest;
+    close FILE;
+    close DLFILE;
+
+    print "\n";
+    print "Finished MD5 Checksum for $File:\n";
+    print "$md5sum\n";
+    print "Finished MD5 Checksum for $dlfile:\n";
+    print "$md5sumdl\n";
+    print "\n";
+
+    # compare the checksums
+    if ( $md5sum eq $md5sumdl ) {
+        print "Checksums are equal\n";
+        $logmsg = "Checksums are equal";
+        _write_log_entry($logmsg);
+    }
+    else {
+        print "Checksums are not equal\n";
+        $exit_status = 2;
+        $logmsg      = "[Failure] Checksums are not equal";
+        _write_log_entry($logmsg);
+
+    }
+
+    # Negative test: try deleting the bucket which still contains objects
+    # the method should return false
+    if ( !$bucket->delete_bucket ) {
+        $logmsg = "Negative test - delete full bucket - Pass";
+    }
+    else {
+        $logmsg      = " Negative test - delete full bucket - Fail";
+        $exit_status = 3;
+    }
+    _write_log_entry($logmsg);
+
+    # delete keys
+    $bucket->delete_key('reminder.txt')  or die $s3->err . ": " . $s3->errstr;
+    $bucket->delete_key($mytestfilename) or die $s3->err . ": " . $s3->errstr;
+    $bucket->delete_key('bogusfile')     or die $s3->err . ": " . $s3->errstr;
+
+    # and finally delete the bucket
+    $bucket->delete_bucket or die $s3->err . ": " . $s3->errstr;
+}
+
+#== Main starts here===
+display_ceph_os_info();
+
+# check if service is already running
+sub check
+{
+    my $state = get_status();
+    if ($state) {
+        _write_log_entry("radosgw is NOT running. quitting");
+        $exit_status = 1;
+        _exit_result($exit_status);
+    }
+}
+check();
+my $flag = create_file();
+if (!$flag) {
+    $testfileloc = "/tmp/" . $mytestfilename;
+    print "Test file = $testfileloc\n";
+    run_tests();
+    delete_user();
+}
+_exit_result($exit_status);
+
diff --git a/qa/qa_scripts/sample.pl b/qa/qa_scripts/sample.pl
new file mode 100644
index 0000000..c861dad
--- /dev/null
+++ b/qa/qa_scripts/sample.pl
@@ -0,0 +1,108 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+#===Variable Declarations====
+
+my $home = "~teuthworker";
+my $teuthology = "~teuthology/teuthology/virtualenv/bin/teuthology";
+my $archivedir = "$home/qa/archive";
+my $config_yaml = "fixed-3.yaml";
+#my $test_name = qq/rbd_api_tests.pl/;
+my $test_name = qq/[% script %]/;
+my $get_script_name = &get_value($test_name,0,'\.');
+my $targetyaml = "$home/qa/targets.yaml";
+
+=head1
+************Function Definition************************************************************************* 
+Name of Function: get_value
+Description: get_value() function splits the given command output with the delimiter passed to it
+	     and returns the desired index of the array   
+Arguments: $cmd_output, $index, $delimiter
+Argument Description:  
+$cmd_output = String that holds the command output from which required value has to be extracted.
+$index = Index of the array  
+$delimiter = Delimiter used in split() 
+********************************************************************************************************
+=cut
+
+sub get_value
+{
+	my ($cmd_output, $index,$delimiter) = @_;
+	my $var = qq/$delimiter/;
+	my @split_cmd_output = split($var,$cmd_output);
+	my $return_val = $split_cmd_output[$index];
+	return $return_val;
+} 
+
+=head1
+************Function Definition************************************************************************* 
+Name of Function: locate_file 
+Description: locate_file() function locates the input file passed to it and passes the command 
+       	     output to get_value() file.    
+Arguments: $get_yaml 
+Argument Description:  
+$get_yaml = Name of yaml file to be located 
+********************************************************************************************************
+=cut
+
+sub locate_file
+{
+	my ($get_yaml) = @_;
+	my $loc_yaml = `locate $get_yaml`;
+	my $taskyaml = &get_value($loc_yaml,0,"\\n");
+	return $taskyaml;
+}
+
+
+=head1
+************Function Definition************************************************************************* 
+Name of Function: generate_logfile 
+Description: Generates a path for log file in the name of test with embedded time stamp under
+   	     archivedir.    
+Arguments: None 
+Argument Description: NA 
+********************************************************************************************************
+=cut
+
+sub generate_log_path
+{
+	my @time = split(/ /, localtime());
+	my $stamp = $time[1] . "-" . $time[2] . "-" . $time[4] . "-" . $time[3];
+	my $log_file = "$archivedir/$get_script_name-$stamp";
+	return $log_file;
+}
+
+# Main starts here
+
+my $task_yaml = "$get_script_name"."."."yaml";
+my $configyaml = &locate_file($config_yaml); 
+my $taskyaml = &locate_file($task_yaml);
+my $logfile_loc = &generate_log_path(); 
+my $tcommand = "$teuthology $configyaml $taskyaml $targetyaml --archive $logfile_loc";
+
+print "$tcommand\n";
+
+system ($tcommand);
+
+if ($? != 0) {
+        printf ("Failure  $?\n");
+        open (TCOMP, '>>test_completed.txt');
+        close (TCOMP);
+        open (TCOMP, '>>log.txt');
+
+        print TCOMP "[Failure]\n";
+        close (TCOMP);
+        exit 1;
+}  else      {
+        printf ("Success $?\n");
+
+        open (TCOMP, '>>test_completed.txt');
+        close (TCOMP);
+        open (TCOMP, '>>log.txt');
+        print TCOMP "[Success]\n";
+        close (TCOMP);
+	exit 0;
+}
+
diff --git a/qa/qa_scripts/script_gen.pl b/qa/qa_scripts/script_gen.pl
new file mode 100755
index 0000000..460d57b
--- /dev/null
+++ b/qa/qa_scripts/script_gen.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/perl
+
+=head1 NAME
+
+script_gen.pl - create a perl wrapper for the teuthology scripts  
+
+=head1 SYNOPSIS
+
+Use:
+	perl script_gen.pl --script_name <script_name> [--help] 
+
+Examples:
+	perl script_gen.pl --script_name abc.pl or 
+	perl script_gen.pl --help
+
+=head1 DESCRIPTION
+
+This script creates a perl wrapper in the name of script_name passed to it.
+The task yaml file name and log file name
+within the wrapper are modified accordingly.   
+
+=head1 ARGUMENTS
+
+script_gen.pl takes the following arguments:
+
+	--help
+	(optional.) Displays the usage message.
+
+	--script_name script_name 
+	(Required.) script name same as the name of the teuthology task for
+	which perl wrapper is needed.
+
+=cut
+
+use strict;
+use warnings;
+use Template;
+
+use Pod::Usage();
+use Getopt::Long();
+
+my ($help, $script_name);
+
+Getopt::Long::GetOptions(
+	'help' => \$help, 
+	'script_name=s' => \$script_name);
+
+	Pod::Usage::pod2usage( -verbose=>1 ) if ($help);
+
+unless (defined($script_name)){
+	Pod::Usage::pod2usage( -exitstatus =>2 );
+}
+my $sample_script = "sample.pl";
+my $template =  Template->new;
+my $variables = {
+        script => $script_name,
+};
+$template->process($sample_script,$variables,$script_name);
+
diff --git a/qa/rbd/common.sh b/qa/rbd/common.sh
new file mode 100644
index 0000000..e1926f7
--- /dev/null
+++ b/qa/rbd/common.sh
@@ -0,0 +1,103 @@
+#!/bin/bash
+
+die() {
+	echo "$*"
+	exit 1
+}
+
+cleanup() {
+    rm -rf $TDIR
+    TDIR=""
+}
+
+set_variables() {
+    # defaults
+    [ -z "$bindir" ] && bindir=$PWD       # location of init-ceph
+    if [ -z "$conf" ]; then
+        conf="$basedir/ceph.conf"
+        [ -e $conf ] || conf="/etc/ceph/ceph.conf"
+    fi
+    [ -e $conf ] || die "conf file not found"
+
+    CCONF="ceph-conf -c $conf"
+
+    [ -z "$mnt" ] && mnt="/c"
+    if [ -z "$monhost" ]; then
+        $CCONF -t mon -i 0 'mon addr' > $TDIR/cconf_mon
+        if [ $? -ne 0 ]; then
+            $CCONF -t mon.a -i 0 'mon addr' > $TDIR/cconf_mon
+            [ $? -ne 0 ] && die "can't figure out \$monhost"
+        fi
+        read monhost < $TDIR/cconf_mon
+    fi
+
+    [ -z "$imgsize" ] && imgsize=1024
+    [ -z "$user" ] && user=admin
+    [ -z "$keyring" ] && keyring="`$CCONF keyring`"
+    [ -z "$secret" ] && secret="`ceph-authtool $keyring -n client.$user -p`"
+
+    monip="`echo $monhost | sed 's/:/ /g' | awk '{print $1}'`"
+    monport="`echo $monhost | sed 's/:/ /g' | awk '{print $2}'`"
+
+    [ -z "$monip" ] && die "bad mon address"
+
+    [ -z "$monport" ] && monport=6789
+
+    set -e
+
+    mydir=`hostname`_`echo $0 | sed 's/\//_/g'`
+
+    img_name=test.`hostname`.$$
+}
+
+rbd_load() {
+	modprobe rbd
+}
+
+rbd_create_image() {
+	id=$1
+	rbd create $img_name.$id --size=$imgsize
+}
+
+rbd_add() {
+	id=$1
+	echo "$monip:$monport name=$user,secret=$secret rbd $img_name.$id" \
+	    > /sys/bus/rbd/add
+
+	pushd /sys/bus/rbd/devices &> /dev/null
+	[ $? -eq 0 ] || die "failed to cd"
+	devid=""
+	rm -f "$TDIR/rbd_devs"
+	for f in *; do echo $f >> "$TDIR/rbd_devs"; done
+	sort -nr "$TDIR/rbd_devs" > "$TDIR/rev_rbd_devs"
+	while read f < "$TDIR/rev_rbd_devs"; do
+	  read d_img_name < "$f/name"
+	  if [ "x$d_img_name" == "x$img_name.$id" ]; then
+	    devid=$f
+	    break
+	  fi
+	done
+	popd &> /dev/null
+
+	[ "x$devid" == "x" ] && die "failed to find $img_name.$id"
+
+	export rbd$id=$devid
+	while [ ! -e /dev/rbd$devid ]; do sleep 1; done
+}
+
+rbd_test_init() {
+	rbd_load
+}
+
+rbd_remove() {
+	echo $1 > /sys/bus/rbd/remove
+}
+
+rbd_rm_image() {
+	id=$1
+	rbd rm $imgname.$id
+}
+
+TDIR=`mktemp -d`
+trap cleanup INT TERM EXIT
+set_variables
diff --git a/qa/rbd/rbd.sh b/qa/rbd/rbd.sh
new file mode 100755
index 0000000..1ef67e6
--- /dev/null
+++ b/qa/rbd/rbd.sh
@@ -0,0 +1,49 @@
+#!/bin/bash -x
+
+basedir=`echo $0 | sed 's/[^/]*$//g'`.
+. $basedir/common.sh
+
+rbd_test_init
+
+
+create_multiple() {
+	for i in `seq 1 10`; do
+		rbd_create_image $i
+	done
+
+	for i in `seq 1 10`; do
+		rbd_add $i
+	done
+	for i in `seq 1 10`; do
+		devname=/dev/rbd`eval echo \\$rbd$i`
+		echo $devname
+	done
+	for i in `seq 1 10`; do
+		devid=`eval echo \\$rbd$i`
+		rbd_remove $devid
+	done
+	for i in `seq 1 10`; do
+		rbd_rm_image $i
+	done
+}
+
+test_dbench() {
+	rbd_create_image 0
+	rbd_add 0
+
+	devname=/dev/rbd$rbd0
+
+	mkfs -t ext3 $devname
+	mount -t ext3 $devname $mnt
+
+	dbench -D $mnt -t 30 5
+	sync
+
+	umount $mnt
+	rbd_remove $rbd0
+	rbd_rm_image 0
+}
+
+create_multiple
+test_dbench
+
diff --git a/qa/run_xfstests-obsolete.sh b/qa/run_xfstests-obsolete.sh
new file mode 100644
index 0000000..9845d08
--- /dev/null
+++ b/qa/run_xfstests-obsolete.sh
@@ -0,0 +1,458 @@
+#!/bin/bash
+
+# Copyright (C) 2012 Dreamhost, LLC
+#
+# This is free software; see the source for copying conditions.
+# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as
+# published by the Free Software Foundation version 2.
+
+# Usage:
+# run_xfs_tests -t /dev/<testdev> -s /dev/<scratchdev> -f <fstype> <tests>
+#   - test device and scratch device will both get trashed
+#   - fstypes can be xfs, ext4, or btrfs (xfs default)
+#   - tests can be listed individually or in ranges:  1 3-5 8
+#     tests can also be specified by group:           -g quick
+#
+# Exit status:
+#     0:  success
+#     1:  usage error
+#     2:  other runtime error
+#    99:  argument count error (programming error)
+#   100:  getopt error (internal error)
+
+# Alex Elder <elder at dreamhost.com>
+# April 13, 2012
+
+set -e
+
+PROGNAME=$(basename $0)
+
+# xfstests is downloaded from this git repository and then built.
+# XFSTESTS_REPO="git://oss.sgi.com/xfs/cmds/xfstests.git"
+XFSTESTS_REPO="git://git.ceph.com/xfstests.git"
+
+# Default command line option values
+COUNT="1"
+FS_TYPE="xfs"
+SCRATCH_DEV=""	# MUST BE SPECIFIED
+TEST_DEV=""	# MUST BE SPECIFIED
+TESTS="-g auto"	# The "auto" group is supposed to be "known good"
+
+# rbd presents geometry information that causes mkfs.xfs to
+# issue a warning.  This option avoids this class of problems.
+XFS_MKFS_OPTIONS="-l su=32k"
+
+# Override the default test list with a list of tests known to pass
+# until we can work through getting them all passing reliably.
+TESTS="1-7 9 11-15 17 19-21 26-29 31-34 41 46-48 50-54 56 61 63-67 69-70 74-76"
+TESTS="${TESTS} 78 79 84-89 91-92 100 103 105 108 110 116-121 124 126"
+TESTS="${TESTS} 129-135 137-141 164-167 182 184 187-190 192 194"
+TESTS="${TESTS} 196 199 201 203 214-216 220-227 234 236-238 241 243-249"
+TESTS="${TESTS} 253 257-259 261 262 269 273 275 277 278 280 285 286"
+# 275 was the highest available test as of 4/10/12.
+# 289 was the highest available test as of 11/15/12.
+
+######
+# Some explanation of why tests have been excluded above:
+#
+# Test 008 was pulled because it contained a race condition leading to
+#          spurious failures.
+#
+# Test 049 was pulled because it caused a kernel fault.
+#	http://tracker.newdream.net/issues/2260
+# Test 232 was pulled because it caused an XFS error
+#	http://tracker.newdream.net/issues/2302
+#
+# This test passes but takes a LONG time (1+ hours):  127
+#
+# These were not run for one (anticipated) reason or another:
+# 010 016 030 035 040 044 057 058-060 072 077 090 093-095 097-099 104
+# 112 113 122 123 125 128 142 147-163 168 175-178 180 185 191 193
+# 195 197 198 207-213 217 228 230-233 235 239 240 252 254 255 264-266
+# 270-272 276 278-279 281-284 288 289
+#
+# These tests all failed (produced output different from golden):
+# 042 073 083 096 109 169 170 200 202 204-206 218 229 240 242 250
+# 263 276 277 279 287
+#
+# The rest were not part of the "auto" group:
+# 018 022 023 024 025 036 037 038 039 043 055 071 080 081 082 101
+# 102 106 107 111 114 115 136 171 172 173 251 267 268
+######
+
+# print an error message and quit with non-zero status
+function err() {
+	if [ $# -gt 0 ]; then
+		echo "" >&2
+		echo "${PROGNAME}: ${FUNCNAME[1]}: $@" >&2
+	fi
+	exit 2
+}
+
+# routine used to validate argument counts to all shell functions
+function arg_count() {
+	local func
+	local want
+	local got
+
+	if [ $# -eq 2 ]; then
+		func="${FUNCNAME[1]}"	# calling function
+		want=$1
+		got=$2
+	else
+		func="${FUNCNAME[0]}"	# i.e., arg_count
+		want=2
+		got=$#
+	fi
+	[ "${want}" -eq "${got}" ] && return 0
+	echo "${PROGNAME}: ${func}: arg count bad (want ${want} got ${got})" >&2
+	exit 99
+}
+
+# validation function for repeat count argument
+function count_valid() {
+	arg_count 1 $#
+
+	test "$1" -gt 0	# 0 is pointless; negative is wrong
+}
+
+# validation function for filesystem type argument
+function fs_type_valid() {
+	arg_count 1 $#
+
+	case "$1" in
+		xfs|ext4|btrfs)	return 0 ;;
+		*)		return 1 ;;
+	esac
+}
+
+# validation function for device arguments
+function device_valid() {
+	arg_count 1 $#
+
+	# Very simple testing--really should try to be more careful...
+	test -b "$1"
+}
+
+# print a usage message and quit
+#
+# if a message is supplied, print that first, and then exit
+# with non-zero status
+function usage() {
+	if [ $# -gt 0 ]; then
+		echo "" >&2
+		echo "$@" >&2
+	fi
+
+	echo "" >&2
+	echo "Usage: ${PROGNAME} <options> <tests>" >&2
+	echo "" >&2
+	echo "    options:" >&2
+	echo "        -h or --help" >&2
+	echo "            show this message" >&2
+	echo "        -c or --count" >&2
+	echo "            iteration count (1 or more)" >&2
+	echo "        -f or --fs-type" >&2
+	echo "            one of: xfs, ext4, btrfs" >&2
+	echo "            (default fs-type: xfs)" >&2
+	echo "        -s or --scratch-dev     (REQUIRED)" >&2
+	echo "            name of device used for scratch filesystem" >&2
+	echo "        -t or --test-dev        (REQUIRED)" >&2
+	echo "            name of device used for test filesystem" >&2
+	echo "    tests:" >&2
+	echo "        list of test numbers or ranges, e.g.:" >&2
+	echo "            1-9 11-15 17 19-21 26-28 31-34 41" >&2
+	echo "        or possibly an xfstests test group, e.g.:" >&2
+	echo "            -g quick" >&2
+	echo "        (default tests: -g auto)" >&2
+	echo "" >&2
+
+	[ $# -gt 0 ] && exit 1
+
+	exit 0		# This is used for a --help
+}
+
+# parse command line arguments
+function parseargs() {
+	# Short option flags
+	SHORT_OPTS=""
+	SHORT_OPTS="${SHORT_OPTS},h"
+	SHORT_OPTS="${SHORT_OPTS},c:"
+	SHORT_OPTS="${SHORT_OPTS},f:"
+	SHORT_OPTS="${SHORT_OPTS},s:"
+	SHORT_OPTS="${SHORT_OPTS},t:"
+
+	# Short option flags
+	LONG_OPTS=""
+	LONG_OPTS="${LONG_OPTS},help"
+	LONG_OPTS="${LONG_OPTS},count:"
+	LONG_OPTS="${LONG_OPTS},fs-type:"
+	LONG_OPTS="${LONG_OPTS},scratch-dev:"
+	LONG_OPTS="${LONG_OPTS},test-dev:"
+
+	TEMP=$(getopt --name "${PROGNAME}" \
+		--options "${SHORT_OPTS}" \
+		--longoptions "${LONG_OPTS}" \
+		-- "$@")
+	eval set -- "$TEMP"
+
+	while [ "$1" != "--" ]; do
+		case "$1" in
+			-h|--help)
+				usage
+				;;
+			-c|--count)
+				count_valid "$2" ||
+					usage "invalid count '$2'"
+				COUNT="$2"
+				shift
+				;;
+			-f|--fs-type)
+				fs_type_valid "$2" ||
+					usage "invalid fs_type '$2'"
+				FS_TYPE="$2"
+				shift
+				;;
+			-s|--scratch-dev)
+				device_valid "$2" ||
+					usage "invalid scratch-dev '$2'"
+				SCRATCH_DEV="$2"
+				shift
+				;;
+			-t|--test-dev)
+				device_valid "$2" ||
+					usage "invalid test-dev '$2'"
+				TEST_DEV="$2"
+				shift
+				;;
+			*)
+				exit 100	# Internal error
+				;;
+		esac
+		shift
+	done
+	shift
+
+	[ -n "${TEST_DEV}" ] || usage "test-dev must be supplied"
+	[ -n "${SCRATCH_DEV}" ] || usage "scratch-dev must be supplied"
+
+	[ $# -eq 0 ] || TESTS="$@"
+}
+
+################################################################
+
+[ -z "$TESTDIR" ] && export TESTDIR="/tmp/cephtest"
+
+# Set up some environment for normal teuthology test setup.
+# This really should not be necessary but I found it was.
+export CEPH_ARGS="--conf ${TESTDIR}/ceph.conf"
+export CEPH_ARGS="${CEPH_ARGS} --keyring ${TESTDIR}/data/client.0.keyring"
+export CEPH_ARGS="${CEPH_ARGS} --name client.0"
+
+export LD_LIBRARY_PATH="${TESTDIR}/binary/usr/local/lib:${LD_LIBRARY_PATH}"
+export PATH="${TESTDIR}/binary/usr/local/bin:${PATH}"
+export PATH="${TESTDIR}/binary/usr/local/sbin:${PATH}"
+
+################################################################
+
+# Filesystem-specific mkfs options--set if not supplied
+export XFS_MKFS_OPTIONS="${XFS_MKFS_OPTIONS:--f -l su=65536}"
+export EXT4_MKFS_OPTIONS="${EXT4_MKFS_OPTIONS:--F}"
+export BTRFS_MKFS_OPTION	# No defaults
+
+XFSTESTS_DIR="/var/lib/xfstests"	# Where the tests live
+
+# download, build, and install xfstests
+function install_xfstests() {
+	arg_count 0 $#
+
+	local multiple=""
+	local ncpu
+
+	pushd "${TESTDIR}"
+
+	git clone "${XFSTESTS_REPO}"
+
+	cd xfstests
+
+	# FIXME: use an older version before the tests were rearranged!
+	git reset --hard e5f1a13792f20cfac097fef98007610b422f2cac
+
+	ncpu=$(getconf _NPROCESSORS_ONLN 2>&1)
+	[ -n "${ncpu}" -a "${ncpu}" -gt 1 ] && multiple="-j ${ncpu}"
+
+	make realclean
+	make ${multiple}
+	make -k install
+
+	popd
+}
+
+# remove previously-installed xfstests files
+function remove_xfstests() {
+	arg_count 0 $#
+
+	rm -rf "${TESTDIR}/xfstests"
+	rm -rf "${XFSTESTS_DIR}"
+}
+
+# create a host options file that uses the specified devices
+function setup_host_options() {
+	arg_count 0 $#
+
+	# Create mount points for the test and scratch filesystems
+	local test_dir="$(mktemp -d ${TESTDIR}/test_dir.XXXXXXXXXX)"
+	local scratch_dir="$(mktemp -d ${TESTDIR}/scratch_mnt.XXXXXXXXXX)"
+
+	# Write a host options file that uses these devices.
+	# xfstests uses the file defined by HOST_OPTIONS as the
+	# place to get configuration variables for its run, and
+	# all (or most) of the variables set here are required.
+	export HOST_OPTIONS="$(mktemp ${TESTDIR}/host_options.XXXXXXXXXX)"
+	cat > "${HOST_OPTIONS}" <<-!
+		# Created by ${PROGNAME} on $(date)
+		# HOST_OPTIONS="${HOST_OPTIONS}"
+		TEST_DEV="${TEST_DEV}"
+		SCRATCH_DEV="${SCRATCH_DEV}"
+		TEST_DIR="${test_dir}"
+		SCRATCH_MNT="${scratch_dir}"
+		FSTYP="${FS_TYPE}"
+		export TEST_DEV SCRATCH_DEV TEST_DIR SCRATCH_MNT FSTYP
+		#
+		export XFS_MKFS_OPTIONS="${XFS_MKFS_OPTIONS}"
+	!
+
+	# Now ensure we are using the same values
+	. "${HOST_OPTIONS}"
+}
+
+# remove the host options file, plus the directories it refers to
+function cleanup_host_options() {
+	arg_count 0 $#
+
+	rm -rf "${TEST_DIR}" "${SCRATCH_MNT}"
+	rm -f "${HOST_OPTIONS}"
+}
+
+# run mkfs on the given device using the specified filesystem type
+function do_mkfs() {
+	arg_count 1 $#
+
+	local dev="${1}"
+	local options
+
+	case "${FSTYP}" in
+		xfs)	options="${XFS_MKFS_OPTIONS}" ;;
+		ext4)	options="${EXT4_MKFS_OPTIONS}" ;;
+		btrfs)	options="${BTRFS_MKFS_OPTIONS}" ;;
+	esac
+
+	"mkfs.${FSTYP}" ${options} "${dev}" ||
+		err "unable to make ${FSTYP} file system on device \"${dev}\""
+}
+
+# mount the given device on the given mount point
+function do_mount() {
+	arg_count 2 $#
+
+	local dev="${1}"
+	local dir="${2}"
+
+	mount "${dev}" "${dir}" ||
+		err "unable to mount file system \"${dev}\" on \"${dir}\""
+}
+
+# unmount a previously-mounted device
+function do_umount() {
+	arg_count 1 $#
+
+	local dev="${1}"
+
+	if mount | grep "${dev}" > /dev/null; then
+		if ! umount "${dev}"; then
+			err "unable to unmount device \"${dev}\""
+		fi
+	else
+		# Report it but don't error out
+		echo "device \"${dev}\" was not mounted" >&2
+	fi
+}
+
+# do basic xfstests setup--make and mount the test and scratch filesystems
+function setup_xfstests() {
+	arg_count 0 $#
+
+	# TEST_DEV can persist across test runs, but for now we
+	# don't bother.   I believe xfstests prefers its devices to
+	# have been already been formatted for the desired
+	# filesystem type--it uses blkid to identify things or
+	# something.  So we mkfs both here for a fresh start.
+	do_mkfs "${TEST_DEV}"
+	do_mkfs "${SCRATCH_DEV}"
+
+	# I believe the test device is expected to be mounted; the
+	# scratch doesn't need to be (but it doesn't hurt).
+	do_mount "${TEST_DEV}" "${TEST_DIR}"
+	do_mount "${SCRATCH_DEV}" "${SCRATCH_MNT}"
+}
+
+# clean up changes made by setup_xfstests
+function cleanup_xfstests() {
+	arg_count 0 $#
+
+	# Unmount these in case a test left them mounted (plus
+	# the corresponding setup function mounted them...)
+	do_umount "${TEST_DEV}"
+	do_umount "${SCRATCH_DEV}"
+}
+
+# top-level setup routine
+function setup() {
+	arg_count 0 $#
+
+	setup_host_options
+	install_xfstests
+	setup_xfstests
+}
+
+# top-level (final) cleanup routine
+function cleanup() {
+	arg_count 0 $#
+
+	cd /
+	cleanup_xfstests
+	remove_xfstests
+	cleanup_host_options
+}
+trap cleanup EXIT ERR HUP INT QUIT
+
+# ################################################################
+
+start_date="$(date)"
+
+parseargs "$@"
+
+setup
+
+pushd "${XFSTESTS_DIR}"
+for (( i = 1 ; i <= "${COUNT}" ; i++ )); do
+	[ "${COUNT}" -gt 1 ] && echo "=== Iteration "$i" starting at:  $(date)"
+
+	./check ${TESTS}	# Here we actually run the tests
+	status=$?
+
+	[ "${COUNT}" -gt 1 ] && echo "=== Iteration "$i" complete at:  $(date)"
+done
+popd
+
+# cleanup is called via the trap call, above
+
+echo "This xfstests run started at:  ${start_date}"
+echo "xfstests run completed at:     $(date)"
+[ "${COUNT}" -gt 1 ] && echo "xfstests run consisted of ${COUNT} iterations"
+
+exit "${status}"
diff --git a/qa/run_xfstests.sh b/qa/run_xfstests.sh
new file mode 100644
index 0000000..4a782ba
--- /dev/null
+++ b/qa/run_xfstests.sh
@@ -0,0 +1,519 @@
+#!/bin/bash
+
+# Copyright (C) 2012 Dreamhost, LLC
+#
+# This is free software; see the source for copying conditions.
+# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as
+# published by the Free Software Foundation version 2.
+
+# Usage:
+# run_xfstests -t /dev/<testdev> -s /dev/<scratchdev> [-f <fstype>] -- <tests>
+#   - test device and scratch device will both get trashed
+#   - fstypes can be xfs, ext4, or btrfs (xfs default)
+#   - tests can be listed individually: generic/001 xfs/008 xfs/009
+#     tests can also be specified by group: -g quick
+#
+# Exit status:
+#     0:  success
+#     1:  usage error
+#     2:  other runtime error
+#    99:  argument count error (programming error)
+#   100:  getopt error (internal error)
+
+# Alex Elder <elder at dreamhost.com>
+# April 13, 2012
+
+set -e
+
+PROGNAME=$(basename $0)
+
+# xfstests is downloaded from this git repository and then built.
+# XFSTESTS_REPO="git://oss.sgi.com/xfs/cmds/xfstests.git"
+XFSTESTS_REPO="git://git.ceph.com/xfstests.git"
+XFSTESTS_VERSION="facff609afd6a2ca557c2b679e088982026aa188"
+XFSPROGS_REPO="git://oss.sgi.com/xfs/cmds/xfsprogs"
+XFSPROGS_VERSION="v3.2.2"
+XFSDUMP_REPO="git://oss.sgi.com/xfs/cmds/xfsdump"
+XFSDUMP_VERSION="v3.1.4"
+
+# Default command line option values
+COUNT="1"
+EXPUNGE_FILE=""
+DO_RANDOMIZE=""	# false
+FS_TYPE="xfs"
+SCRATCH_DEV=""	# MUST BE SPECIFIED
+TEST_DEV=""	# MUST BE SPECIFIED
+TESTS="-g auto"	# The "auto" group is supposed to be "known good"
+
+# We no longer need to set the stripe unit in XFS_MKFS_OPTIONS because recent
+# versions of mkfs.xfs autodetect it.
+
+# print an error message and quit with non-zero status
+function err() {
+	if [ $# -gt 0 ]; then
+		echo "" >&2
+		echo "${PROGNAME}: ${FUNCNAME[1]}: $@" >&2
+	fi
+	exit 2
+}
+
+# routine used to validate argument counts to all shell functions
+function arg_count() {
+	local func
+	local want
+	local got
+
+	if [ $# -eq 2 ]; then
+		func="${FUNCNAME[1]}"	# calling function
+		want=$1
+		got=$2
+	else
+		func="${FUNCNAME[0]}"	# i.e., arg_count
+		want=2
+		got=$#
+	fi
+	[ "${want}" -eq "${got}" ] && return 0
+	echo "${PROGNAME}: ${func}: arg count bad (want ${want} got ${got})" >&2
+	exit 99
+}
+
+# validation function for repeat count argument
+function count_valid() {
+	arg_count 1 $#
+
+	test "$1" -gt 0	# 0 is pointless; negative is wrong
+}
+
+# validation function for filesystem type argument
+function fs_type_valid() {
+	arg_count 1 $#
+
+	case "$1" in
+		xfs|ext4|btrfs)	return 0 ;;
+		*)		return 1 ;;
+	esac
+}
+
+# validation function for device arguments
+function device_valid() {
+	arg_count 1 $#
+
+	# Very simple testing--really should try to be more careful...
+	test -b "$1"
+}
+
+# validation function for expunge file argument
+function expunge_file_valid() {
+	arg_count 1 $#
+
+	test -s "$1"
+}
+
+# print a usage message and quit
+#
+# if a message is supplied, print that first, and then exit
+# with non-zero status
+function usage() {
+	if [ $# -gt 0 ]; then
+		echo "" >&2
+		echo "$@" >&2
+	fi
+
+	echo "" >&2
+	echo "Usage: ${PROGNAME} <options> -- <tests>" >&2
+	echo "" >&2
+	echo "    options:" >&2
+	echo "        -h or --help" >&2
+	echo "            show this message" >&2
+	echo "        -c or --count" >&2
+	echo "            iteration count (1 or more)" >&2
+	echo "        -f or --fs-type" >&2
+	echo "            one of: xfs, ext4, btrfs" >&2
+	echo "            (default fs-type: xfs)" >&2
+	echo "        -r or --randomize" >&2
+	echo "            randomize test order" >&2
+	echo "        -s or --scratch-dev     (REQUIRED)" >&2
+	echo "            name of device used for scratch filesystem" >&2
+	echo "        -t or --test-dev        (REQUIRED)" >&2
+	echo "            name of device used for test filesystem" >&2
+	echo "        -x or --expunge-file" >&2
+	echo "            name of file with list of tests to skip" >&2
+	echo "    tests:" >&2
+	echo "        list of test numbers, e.g.:" >&2
+	echo "            generic/001 xfs/008 shared/032 btrfs/009" >&2
+	echo "        or possibly an xfstests test group, e.g.:" >&2
+	echo "            -g quick" >&2
+	echo "        (default tests: -g auto)" >&2
+	echo "" >&2
+
+	[ $# -gt 0 ] && exit 1
+
+	exit 0		# This is used for a --help
+}
+
+# parse command line arguments
+function parseargs() {
+	# Short option flags
+	SHORT_OPTS=""
+	SHORT_OPTS="${SHORT_OPTS},h"
+	SHORT_OPTS="${SHORT_OPTS},c:"
+	SHORT_OPTS="${SHORT_OPTS},f:"
+	SHORT_OPTS="${SHORT_OPTS},r"
+	SHORT_OPTS="${SHORT_OPTS},s:"
+	SHORT_OPTS="${SHORT_OPTS},t:"
+	SHORT_OPTS="${SHORT_OPTS},x:"
+
+	# Long option flags
+	LONG_OPTS=""
+	LONG_OPTS="${LONG_OPTS},help"
+	LONG_OPTS="${LONG_OPTS},count:"
+	LONG_OPTS="${LONG_OPTS},fs-type:"
+	LONG_OPTS="${LONG_OPTS},randomize"
+	LONG_OPTS="${LONG_OPTS},scratch-dev:"
+	LONG_OPTS="${LONG_OPTS},test-dev:"
+	LONG_OPTS="${LONG_OPTS},expunge-file:"
+
+	TEMP=$(getopt --name "${PROGNAME}" \
+		--options "${SHORT_OPTS}" \
+		--longoptions "${LONG_OPTS}" \
+		-- "$@")
+	eval set -- "$TEMP"
+
+	while [ "$1" != "--" ]; do
+		case "$1" in
+			-h|--help)
+				usage
+				;;
+			-c|--count)
+				count_valid "$2" ||
+					usage "invalid count '$2'"
+				COUNT="$2"
+				shift
+				;;
+			-f|--fs-type)
+				fs_type_valid "$2" ||
+					usage "invalid fs_type '$2'"
+				FS_TYPE="$2"
+				shift
+				;;
+			-r|--randomize)
+				DO_RANDOMIZE="t"
+				;;
+			-s|--scratch-dev)
+				device_valid "$2" ||
+					usage "invalid scratch-dev '$2'"
+				SCRATCH_DEV="$2"
+				shift
+				;;
+			-t|--test-dev)
+				device_valid "$2" ||
+					usage "invalid test-dev '$2'"
+				TEST_DEV="$2"
+				shift
+				;;
+			-x|--expunge-file)
+				expunge_file_valid "$2" ||
+					usage "invalid expunge-file '$2'"
+				EXPUNGE_FILE="$2"
+				shift
+				;;
+			*)
+				exit 100	# Internal error
+				;;
+		esac
+		shift
+	done
+	shift
+
+	[ -n "${TEST_DEV}" ] || usage "test-dev must be supplied"
+	[ -n "${SCRATCH_DEV}" ] || usage "scratch-dev must be supplied"
+
+	[ $# -eq 0 ] || TESTS="$@"
+}
+
+################################################################
+
+[ -n "${TESTDIR}" ] || usage "TESTDIR env variable must be set"
+
+# Set up some environment for normal teuthology test setup.
+# This really should not be necessary but I found it was.
+export CEPH_ARGS="--conf ${TESTDIR}/ceph.conf"
+export CEPH_ARGS="${CEPH_ARGS} --keyring ${TESTDIR}/data/client.0.keyring"
+export CEPH_ARGS="${CEPH_ARGS} --name client.0"
+
+export LD_LIBRARY_PATH="${TESTDIR}/binary/usr/local/lib:${LD_LIBRARY_PATH}"
+export PATH="${TESTDIR}/binary/usr/local/bin:${PATH}"
+export PATH="${TESTDIR}/binary/usr/local/sbin:${PATH}"
+
+################################################################
+
+# Filesystem-specific mkfs options--set if not supplied
+#export XFS_MKFS_OPTIONS="${XFS_MKFS_OPTIONS:--f -l su=65536}"
+export EXT4_MKFS_OPTIONS="${EXT4_MKFS_OPTIONS:--F}"
+export BTRFS_MKFS_OPTION	# No defaults
+
+XFSTESTS_DIR="/var/lib/xfstests"	# Where the tests live
+XFSPROGS_DIR="/tmp/cephtest/xfsprogs-install"
+XFSDUMP_DIR="/tmp/cephtest/xfsdump-install"
+export PATH="${XFSPROGS_DIR}/sbin:${XFSDUMP_DIR}/sbin:${PATH}"
+
+# download, build, and install xfstests
+function install_xfstests() {
+	arg_count 0 $#
+
+	local multiple=""
+	local ncpu
+
+	pushd "${TESTDIR}"
+
+	git clone "${XFSTESTS_REPO}"
+
+	cd xfstests
+	git checkout "${XFSTESTS_VERSION}"
+
+	ncpu=$(getconf _NPROCESSORS_ONLN 2>&1)
+	[ -n "${ncpu}" -a "${ncpu}" -gt 1 ] && multiple="-j ${ncpu}"
+
+	make realclean
+	make ${multiple}
+	make -k install
+
+	popd
+}
+
+# remove previously-installed xfstests files
+function remove_xfstests() {
+	arg_count 0 $#
+
+	rm -rf "${TESTDIR}/xfstests"
+	rm -rf "${XFSTESTS_DIR}"
+}
+
+# create a host options file that uses the specified devices
+function setup_host_options() {
+	arg_count 0 $#
+	export MNTDIR="/tmp/cephtest"
+
+	# Create mount points for the test and scratch filesystems
+	mkdir -p ${MNTDIR}
+	local test_dir="$(mktemp -d ${MNTDIR}/test_dir.XXXXXXXXXX)"
+	local scratch_dir="$(mktemp -d ${MNTDIR}/scratch_mnt.XXXXXXXXXX)"
+
+	# Write a host options file that uses these devices.
+	# xfstests uses the file defined by HOST_OPTIONS as the
+	# place to get configuration variables for its run, and
+	# all (or most) of the variables set here are required.
+	export HOST_OPTIONS="$(mktemp ${TESTDIR}/host_options.XXXXXXXXXX)"
+	cat > "${HOST_OPTIONS}" <<-!
+		# Created by ${PROGNAME} on $(date)
+		# HOST_OPTIONS="${HOST_OPTIONS}"
+		TEST_DEV="${TEST_DEV}"
+		SCRATCH_DEV="${SCRATCH_DEV}"
+		TEST_DIR="${test_dir}"
+		SCRATCH_MNT="${scratch_dir}"
+		FSTYP="${FS_TYPE}"
+		export TEST_DEV SCRATCH_DEV TEST_DIR SCRATCH_MNT FSTYP
+		#
+		export XFS_MKFS_OPTIONS="${XFS_MKFS_OPTIONS}"
+	!
+
+	# Now ensure we are using the same values
+	. "${HOST_OPTIONS}"
+}
+
+# remove the host options file, plus the directories it refers to
+function cleanup_host_options() {
+	arg_count 0 $#
+
+	rm -rf "${TEST_DIR}" "${SCRATCH_MNT}"
+	rm -f "${HOST_OPTIONS}"
+}
+
+# run mkfs on the given device using the specified filesystem type
+function do_mkfs() {
+	arg_count 1 $#
+
+	local dev="${1}"
+	local options
+
+	case "${FSTYP}" in
+		xfs)	options="${XFS_MKFS_OPTIONS}" ;;
+		ext4)	options="${EXT4_MKFS_OPTIONS}" ;;
+		btrfs)	options="${BTRFS_MKFS_OPTIONS}" ;;
+	esac
+
+	"mkfs.${FSTYP}" ${options} "${dev}" ||
+		err "unable to make ${FSTYP} file system on device \"${dev}\""
+}
+
+# mount the given device on the given mount point
+function do_mount() {
+	arg_count 2 $#
+
+	local dev="${1}"
+	local dir="${2}"
+
+	mount "${dev}" "${dir}" ||
+		err "unable to mount file system \"${dev}\" on \"${dir}\""
+}
+
+# unmount a previously-mounted device
+function do_umount() {
+	arg_count 1 $#
+
+	local dev="${1}"
+
+	if mount | grep "${dev}" > /dev/null; then
+		if ! umount "${dev}"; then
+			err "unable to unmount device \"${dev}\""
+		fi
+	else
+		# Report it but don't error out
+		echo "device \"${dev}\" was not mounted" >&2
+	fi
+}
+
+# do basic xfstests setup--make and mount the test and scratch filesystems
+function setup_xfstests() {
+	arg_count 0 $#
+
+	# TEST_DEV can persist across test runs, but for now we
+	# don't bother.   I believe xfstests prefers its devices to
+	# have been already been formatted for the desired
+	# filesystem type--it uses blkid to identify things or
+	# something.  So we mkfs both here for a fresh start.
+	do_mkfs "${TEST_DEV}"
+	do_mkfs "${SCRATCH_DEV}"
+
+	# I believe the test device is expected to be mounted; the
+	# scratch doesn't need to be (but it doesn't hurt).
+	do_mount "${TEST_DEV}" "${TEST_DIR}"
+	do_mount "${SCRATCH_DEV}" "${SCRATCH_MNT}"
+}
+
+# clean up changes made by setup_xfstests
+function cleanup_xfstests() {
+	arg_count 0 $#
+
+	# Unmount these in case a test left them mounted (plus
+	# the corresponding setup function mounted them...)
+	do_umount "${TEST_DEV}"
+	do_umount "${SCRATCH_DEV}"
+	rmdir "${TEST_DIR}"
+	rmdir "${SCRATCH_MNT}"
+	rmdir "${MNTDIR}"
+}
+
+function install_xfsprogs() {
+	arg_count 0 $#
+
+	pushd "${TESTDIR}"
+	git clone ${XFSPROGS_REPO}
+	cd xfsprogs
+	git checkout ${XFSPROGS_VERSION}
+	libtoolize -c `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` -f
+	cp include/install-sh .
+	aclocal -I m4
+	autoconf
+	./configure --prefix=${XFSPROGS_DIR}
+	make install
+	popd
+}
+
+function install_xfsdump() {
+	arg_count 0 $#
+
+	pushd "${TESTDIR}"
+	git clone ${XFSDUMP_REPO}
+	cd xfsdump
+	git checkout ${XFSDUMP_VERSION}
+
+	# somebody took #define min and #define max out, which breaks the build on
+	# ubuntu. we back out this commit here, though that may cause problems with
+	# this script down the line.
+	git revert -n 5a2985233c390d59d2a9757b119cb0e001c87a96
+	libtoolize -c `libtoolize -n -i >/dev/null 2>/dev/null && echo -i` -f
+	cp include/install-sh .
+	aclocal -I m4
+	autoconf
+	./configure --prefix=${XFSDUMP_DIR}
+	(make -k install || true) # that's right, the install process is broken too
+	popd
+}
+
+function remove_xfsprogs() {
+	arg_count 0 $#
+
+	rm -rf ${TESTDIR}/xfsprogs
+	rm -rf ${XFSPROGS_DIR}
+}	
+
+function remove_xfsdump() {
+	arg_count 0 $#
+
+	rm -rf ${TESTDIR}/xfsdump
+	rm -rf ${XFSDUMP_DIR}
+}
+
+
+# top-level setup routine
+function setup() {
+	arg_count 0 $#
+
+	setup_host_options
+	install_xfsprogs
+	install_xfsdump
+	install_xfstests
+	setup_xfstests
+}
+
+# top-level (final) cleanup routine
+function cleanup() {
+	arg_count 0 $#
+
+	cd /
+	remove_xfsprogs
+	remove_xfsdump
+	cleanup_xfstests
+	remove_xfstests
+	cleanup_host_options
+}
+trap cleanup EXIT ERR HUP INT QUIT
+
+# ################################################################
+
+start_date="$(date)"
+
+parseargs "$@"
+
+setup
+
+pushd "${XFSTESTS_DIR}"
+for (( i = 1 ; i <= "${COUNT}" ; i++ )); do
+	[ "${COUNT}" -gt 1 ] && echo "=== Iteration "$i" starting at:  $(date)"
+
+	EXPUNGE=""
+	[ -n "${EXPUNGE_FILE}" ] && EXPUNGE="-E ${EXPUNGE_FILE}"
+
+	RANDOMIZE=""
+	[ -n "${DO_RANDOMIZE}" ] && RANDOMIZE="-r"
+
+	# -T output timestamps
+	./check -T ${RANDOMIZE} ${EXPUNGE} ${TESTS}
+	status=$?
+
+	[ "${COUNT}" -gt 1 ] && echo "=== Iteration "$i" complete at:  $(date)"
+done
+popd
+
+# cleanup is called via the trap call, above
+
+echo "This xfstests run started at:  ${start_date}"
+echo "xfstests run completed at:     $(date)"
+[ "${COUNT}" -gt 1 ] && echo "xfstests run consisted of ${COUNT} iterations"
+
+exit "${status}"
diff --git a/qa/run_xfstests_krbd.sh b/qa/run_xfstests_krbd.sh
new file mode 100644
index 0000000..aafc0f1
--- /dev/null
+++ b/qa/run_xfstests_krbd.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+#
+# This is a wrapper around run_xfstests.sh to provide an expunge file
+# suitable for krbd xfstests runs.
+
+set -x
+
+[ -n "${TESTDIR}" ] || export TESTDIR="/tmp/cephtest"
+[ -d "${TESTDIR}" ] || mkdir "${TESTDIR}"
+
+SCRIPT="run_xfstests.sh"
+
+if [ -z "${URL_BASE}" ]; then
+	URL_BASE="https://git.ceph.com/?p=ceph.git;a=blob_plain;f=qa"
+fi
+
+cd "${TESTDIR}"
+
+wget -O "${SCRIPT}" "${URL_BASE}/${SCRIPT}"
+chmod +x "${SCRIPT}"
+
+EXPUNGE="$(mktemp expunge.XXXXXXXXXX)"
+cat > "${EXPUNGE}" <<-!
+	# mv - moved here from the old version of run_xfstests.sh
+	#      and rbd_xfstests.yaml
+	# wasn't run - like 'mv', but wasn't specifically excluded
+	# new test - didn't exist in the xfstests version that was
+	#            used by the old version of this script
+	
+	generic/038
+	generic/042	# zeroes out only the last 4k of test file, but expects
+			#  only zeros in the entire file. bug in test?
+	generic/046	# _count_extents in common/rc assumes backticks do not
+			#  remove newlines. This breaks parsing on some
+			#  platforms.
+	generic/050	# blockdev --setro right after mkfs returns EBUSY
+	generic/078 # RENAME_WHITEOUT was enabled in kernel commit 7dcf5c, but causes
+			# a BUG for now
+	generic/081	# ubuntu lvm2 doesn't suport --yes argument
+	generic/083	# mkfs.xfs -dxize=104857600,agcount=6 fails
+			#  when sunit=swidth=8192
+	generic/093	# not for Linux
+	generic/097	# not for Linux
+	generic/099	# not for Linux
+	generic/204	# stripe size throws off test's math for when to
+			#  expect ENOSPC
+	generic/231 # broken for disk and rbd by xfs kernel commit 4162bb
+	generic/247 # race between DIO and mmap writes
+               # see (https://lists.01.org/pipermail/lkp/2015-March/002459.html)
+
+	shared/272	# not for xfs
+	shared/289	# not for xfs
+
+	xfs/007		# sector size math
+	xfs/030		# mkfs.xfs -dsize=100m,agcount=6 fails
+			#  when sunit=swidth=8192
+	xfs/032		# xfs_copy cleans up with pthread_kill (RHBA-2015-0537)
+	xfs/042		# stripe size throws off test's math when filling FS
+	xfs/051
+	xfs/057		# test for IRIX
+	xfs/058		# test for IRIX
+	xfs/069		# _filter_bmap in common/punch parses incorrectly if
+			#  blocks are not stripe-aligned
+	xfs/070		# extra output from xfs_repair
+	xfs/071		# xfs_repair issue on large offsets (RHBA-2015-0537)
+	xfs/073
+	xfs/081		# very small mkfs breaks test with sunit=swidth-8192
+	xfs/095		# not for Linux
+	xfs/096		# checks various mkfs options and chokes on sunit/swidth
+	xfs/104		# can't suppress sunit/swidth warnings on mkfs
+	xfs/109		# can't suppress sunit/swidth warnings on mkfs
+	xfs/167
+	xfs/178		# test explicitly checks for stripe width of 0
+	xfs/191		# tests NFSv4
+	xfs/197		# tests 32-bit machines
+	xfs/205		# very small mkfs breaks tests with sunit=swidth=8192
+	xfs/242		# _filter_bmap in common/punch parses incorrectly if
+			#  blocks are not stripe-aligned
+	xfs/261		# bug in mount_xfs involving creation of new quota files
+	xfs/279		# sector size math (logical v. physical: BZ836433?)
+	xfs/297		# XXX: temporarily expunged due to length
+	xfs/300		# SELinux
+!
+
+./"${SCRIPT}" -x "$(readlink -f "${EXPUNGE}")" "$@"
+STATUS=$?
+
+rm -f "${EXPUNGE}"
+rm -f "${SCRIPT}"
+
+exit "${STATUS}"
diff --git a/qa/run_xfstests_qemu.sh b/qa/run_xfstests_qemu.sh
new file mode 100644
index 0000000..a15f598
--- /dev/null
+++ b/qa/run_xfstests_qemu.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+#
+# TODO switch to run_xfstests.sh (see run_xfstests_krbd.sh)
+
+set -x
+
+[ -n "${TESTDIR}" ] || export TESTDIR="/tmp/cephtest"
+[ -d "${TESTDIR}" ] || mkdir "${TESTDIR}"
+
+URL_BASE="https://git.ceph.com/?p=ceph.git;a=blob_plain;f=qa"
+SCRIPT="run_xfstests-obsolete.sh"
+
+cd "${TESTDIR}"
+
+wget -O "${SCRIPT}" "${URL_BASE}/${SCRIPT}"
+chmod +x "${SCRIPT}"
+
+# tests excluded fail in the current testing vm regardless of whether
+# rbd is used
+
+./"${SCRIPT}" -c 1 -f xfs -t /dev/vdb -s /dev/vdc \
+    1-7 9-17 19-26 28-49 51-61 63 66-67 69-79 83 85-105 108-110 112-135 \
+    137-170 174-191 193-204 206-217 220-227 230-231 233 235-241 243-249 \
+    251-262 264-278 281-286 288-289
+STATUS=$?
+
+rm -f "${SCRIPT}"
+
+exit "${STATUS}"
diff --git a/qa/runallonce.sh b/qa/runallonce.sh
new file mode 100755
index 0000000..5730469
--- /dev/null
+++ b/qa/runallonce.sh
@@ -0,0 +1,25 @@
+#!/bin/bash -x
+
+set -e
+
+basedir=`echo $0 | sed 's/[^/]*$//g'`.
+testdir="$1"
+[ -n "$2" ] && logdir=$2 || logdir=$1
+
+[ ${basedir:0:1} == "." ] && basedir=`pwd`/${basedir:1}
+
+PATH="$basedir/src:$PATH"
+
+[ -z "$testdir" ] || [ ! -d "$testdir" ] && echo "specify test dir" && exit 1
+cd $testdir
+
+for test in `cd $basedir/workunits && find . -executable -type f | $basedir/../src/script/permute`
+do
+  echo "------ running test $test ------"
+  pwd
+  [ -d $test ] && rm -r $test
+  mkdir -p $test
+  mkdir -p `dirname $logdir/$test.log`
+  test -e $logdir/$test.log && rm $logdir/$test.log
+  sh -c "cd $test && $basedir/workunits/$test" 2>&1 | tee $logdir/$test.log
+done
diff --git a/qa/runoncfuse.sh b/qa/runoncfuse.sh
new file mode 100755
index 0000000..c1a5b01
--- /dev/null
+++ b/qa/runoncfuse.sh
@@ -0,0 +1,7 @@
+#!/bin/bash -x
+
+mkdir -p testspace
+ceph-fuse testspace -m $1
+
+./runallonce.sh testspace
+killall ceph-fuse
diff --git a/qa/runonkclient.sh b/qa/runonkclient.sh
new file mode 100755
index 0000000..fd76718
--- /dev/null
+++ b/qa/runonkclient.sh
@@ -0,0 +1,8 @@
+#!/bin/bash -x
+
+mkdir -p testspace
+/bin/mount -t ceph $1 testspace
+
+./runallonce.sh testspace
+
+/bin/umount testspace
\ No newline at end of file
diff --git a/qa/setup-chroot.sh b/qa/setup-chroot.sh
new file mode 100755
index 0000000..2e5ef46
--- /dev/null
+++ b/qa/setup-chroot.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+die() {
+        echo ${@}
+        exit 1
+}
+
+usage()
+{
+        cat << EOF
+$0: sets up a chroot environment for building the ceph server
+usage:
+-h                      Show this message
+
+-r [install_dir]        location of the root filesystem to install to
+                        example: -r /images/sepia/
+
+-s [src_dir]            location of the directory with the source code
+                        example: -s ./src/ceph
+EOF
+}
+
+cleanup() {
+        umount -l "${INSTALL_DIR}/mnt/tmp"
+        umount -l "${INSTALL_DIR}/proc"
+        umount -l "${INSTALL_DIR}/sys"
+}
+
+INSTALL_DIR=
+SRC_DIR=
+while getopts “hr:s:” OPTION; do
+        case $OPTION in
+        h) usage; exit 1 ;;
+        r) INSTALL_DIR=$OPTARG ;;
+        s) SRC_DIR=$OPTARG ;;
+        ?) usage; exit
+        ;;
+        esac
+done
+
+[ $EUID -eq 0 ] || die "This script uses chroot, which requires root permissions."
+
+[ -d "${INSTALL_DIR}" ] || die "No such directory as '${INSTALL_DIR}'. \
+You must specify an install directory with -r"
+
+[ -d "${SRC_DIR}" ] || die "no such directory as '${SRC_DIR}'. \
+You must specify a source directory with -s"
+
+readlink -f ${SRC_DIR} || die "readlink failed on ${SRC_DIR}"
+ABS_SRC_DIR=`readlink -f ${SRC_DIR}`
+
+trap cleanup INT TERM EXIT
+
+mount --bind "${ABS_SRC_DIR}" "${INSTALL_DIR}/mnt/tmp" || die "bind mount failed"
+mount -t proc none "${INSTALL_DIR}/proc" || die "mounting proc failed"
+mount -t sysfs none "${INSTALL_DIR}/sys" || die "mounting sys failed"
+
+echo "$0: starting chroot."
+echo "cd /mnt/tmp before building"
+echo
+chroot ${INSTALL_DIR} env HOME=/mnt/tmp /bin/bash
+
+echo "$0: exiting chroot."
+
+exit 0
diff --git a/qa/workunits/Makefile b/qa/workunits/Makefile
new file mode 100644
index 0000000..f75f5df
--- /dev/null
+++ b/qa/workunits/Makefile
@@ -0,0 +1,4 @@
+DIRS = direct_io fs
+
+all:
+	for d in $(DIRS) ; do ( cd $$d ; $(MAKE) all ) ; done
diff --git a/qa/workunits/caps/mon_commands.sh b/qa/workunits/caps/mon_commands.sh
new file mode 100755
index 0000000..5b5bce6
--- /dev/null
+++ b/qa/workunits/caps/mon_commands.sh
@@ -0,0 +1,25 @@
+#!/bin/sh -ex
+
+ceph-authtool --create-keyring k --gen-key -p --name client.xx
+ceph auth add -i k client.xx mon "allow command foo; allow command bar *; allow command baz ...; allow command foo add * mon allow\\ rwx osd allow\\ *"
+
+( ceph -k k -n client.xx foo      || true ) | grep 'unrecog'
+( ceph -k k -n client.xx foo ooo  || true ) | grep 'Access denied'
+( ceph -k k -n client.xx fo       || true ) | grep 'Access denied'
+( ceph -k k -n client.xx fooo     || true ) | grep 'Access denied'
+
+( ceph -k k -n client.xx bar       || true ) | grep 'Access denied'
+( ceph -k k -n client.xx bar a     || true ) | grep 'unrecog'
+( ceph -k k -n client.xx bar a b c || true ) | grep 'Access denied'
+( ceph -k k -n client.xx ba        || true ) | grep 'Access denied'
+( ceph -k k -n client.xx barr      || true ) | grep 'Access denied'
+
+( ceph -k k -n client.xx baz     || true ) | grep -v 'Access denied'
+( ceph -k k -n client.xx baz a   || true ) | grep -v 'Access denied'
+( ceph -k k -n client.xx baz a b || true ) | grep -v 'Access denied'
+
+( ceph -k k -n client.xx foo add osd.1 -i k mon 'allow rwx' osd 'allow *' || true ) | grep 'unrecog'
+( ceph -k k -n client.xx foo add osd a b c -i k mon 'allow rwx' osd 'allow *' || true ) | grep 'Access denied'
+( ceph -k k -n client.xx foo add osd a b c -i k mon 'allow *' || true ) | grep 'Access denied'
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/ceph-disk/60-ceph-by-partuuid.rules b/qa/workunits/ceph-disk/60-ceph-by-partuuid.rules
new file mode 100644
index 0000000..1ed0b12
--- /dev/null
+++ b/qa/workunits/ceph-disk/60-ceph-by-partuuid.rules
@@ -0,0 +1,29 @@
+#
+# Make sure /dev/disk/by-partuuid is populated
+#
+
+# forward scsi device event to corresponding block device
+ACTION=="change", SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST=="block", ATTR{block/*/uevent}="change"
+
+ACTION=="remove", GOTO="persistent_storage_end_two"
+
+SUBSYSTEM!="block", GOTO="persistent_storage_end_two"
+
+# skip rules for inappropriate block devices
+KERNEL=="fd*|mtd*|nbd*|gnbd*|btibm*|md*", GOTO="persistent_storage_end_two"
+
+# ignore partitions that span the entire disk
+TEST=="whole_disk", GOTO="persistent_storage_end_two"
+
+# for partitions import parent information
+ENV{DEVTYPE}=="partition", IMPORT{parent}="ID_*"
+
+# skip unpartitioned removable media devices from drivers which do not send "change" events
+ENV{DEVTYPE}=="disk", KERNEL!="sd*|sr*", ATTR{removable}=="1", GOTO="persistent_storage_end_two"
+
+# probe filesystem metadata of disks
+KERNEL!="sr*", IMPORT{program}="/sbin/blkid -o udev -p $tempnode"
+
+ENV{ID_PART_ENTRY_SCHEME}=="gpt", ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
+
+LABEL="persistent_storage_end_two"
diff --git a/qa/workunits/ceph-disk/ceph-disk-no-lockbox b/qa/workunits/ceph-disk/ceph-disk-no-lockbox
new file mode 100755
index 0000000..a9adc31
--- /dev/null
+++ b/qa/workunits/ceph-disk/ceph-disk-no-lockbox
@@ -0,0 +1,4598 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2015 Red Hat <contact at redhat.com>
+# Copyright (C) 2014 Inktank <info at inktank.com>
+# Copyright (C) 2014 Cloudwatt <libre.licensing at cloudwatt.com>
+# Copyright (C) 2014 Catalyst.net Ltd
+#
+# Author: Loic Dachary <loic at dachary.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Library Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library Public License for more details.
+#
+# THIS IS ceph-disk AS OF dc5a9053ce69c0630091774f16ce421da67d26fb v10.0.3-2247-gdc5a905
+# PRIOR TO THE INTRODUCTION OF THE LOCKBOX VOLUME TO STORE KEY FETCHING
+# STRATEGIES
+#
+import argparse
+import errno
+import fcntl
+import json
+import logging
+import os
+import platform
+import re
+import subprocess
+import stat
+import sys
+import tempfile
+import uuid
+import time
+import shlex
+import pwd
+import grp
+
+CEPH_OSD_ONDISK_MAGIC = 'ceph osd volume v026'
+
+PTYPE = {
+    'regular': {
+        'journal': {
+            # identical because creating a journal is atomic
+            'ready': '45b0969e-9b03-4f30-b4c6-b4b80ceff106',
+            'tobe': '45b0969e-9b03-4f30-b4c6-b4b80ceff106',
+        },
+        'block': {
+            # identical because creating a block is atomic
+            'ready': 'cafecafe-9b03-4f30-b4c6-b4b80ceff106',
+            'tobe': 'cafecafe-9b03-4f30-b4c6-b4b80ceff106',
+        },
+        'osd': {
+            'ready': '4fbd7e29-9d25-41b8-afd0-062c0ceff05d',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-f3ad0ceff2be',
+        },
+    },
+    'luks': {
+        'journal': {
+            'ready': '45b0969e-9b03-4f30-b4c6-35865ceff106',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-35865ceff2be',
+        },
+        'block': {
+            'ready': 'cafecafe-9b03-4f30-b4c6-35865ceff106',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-35865ceff2be',
+        },
+        'osd': {
+            'ready': '4fbd7e29-9d25-41b8-afd0-35865ceff05d',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-5ec00ceff2be',
+        },
+    },
+    'plain': {
+        'journal': {
+            'ready': '45b0969e-9b03-4f30-b4c6-5ec00ceff106',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-35865ceff2be',
+        },
+        'block': {
+            'ready': 'cafecafe-9b03-4f30-b4c6-5ec00ceff106',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-35865ceff2be',
+        },
+        'osd': {
+            'ready': '4fbd7e29-9d25-41b8-afd0-5ec00ceff05d',
+            'tobe': '89c57f98-2fe5-4dc0-89c1-5ec00ceff2be',
+        },
+    },
+    'mpath': {
+        'journal': {
+            'ready': '45b0969e-8ae0-4982-bf9d-5a8d867af560',
+            'tobe': '45b0969e-8ae0-4982-bf9d-5a8d867af560',
+        },
+        'block': {
+            'ready': 'cafecafe-8ae0-4982-bf9d-5a8d867af560',
+            'tobe': 'cafecafe-8ae0-4982-bf9d-5a8d867af560',
+        },
+        'osd': {
+            'ready': '4fbd7e29-8ae0-4982-bf9d-5a8d867af560',
+            'tobe': '89c57f98-8ae0-4982-bf9d-5a8d867af560',
+        },
+    },
+}
+
+
+class Ptype(object):
+
+    @staticmethod
+    def get_ready_by_type(what):
+        return [x['ready'] for x in PTYPE[what].values()]
+
+    @staticmethod
+    def get_ready_by_name(name):
+        return [x[name]['ready'] for x in PTYPE.values()]
+
+    @staticmethod
+    def is_regular_space(ptype):
+        return Ptype.is_what_space('regular', ptype)
+
+    @staticmethod
+    def is_mpath_space(ptype):
+        return Ptype.is_what_space('mpath', ptype)
+
+    @staticmethod
+    def is_plain_space(ptype):
+        return Ptype.is_what_space('plain', ptype)
+
+    @staticmethod
+    def is_luks_space(ptype):
+        return Ptype.is_what_space('luks', ptype)
+
+    @staticmethod
+    def is_what_space(what, ptype):
+        for name in Space.NAMES:
+            if ptype == PTYPE[what][name]['ready']:
+                return True
+        return False
+
+    @staticmethod
+    def space_ptype_to_name(ptype):
+        for what in PTYPE.values():
+            for name in Space.NAMES:
+                if ptype == what[name]['ready']:
+                    return name
+        raise ValueError('ptype ' + ptype + ' not found')
+
+    @staticmethod
+    def is_dmcrypt_space(ptype):
+        for name in Space.NAMES:
+            if Ptype.is_dmcrypt(ptype, name):
+                return True
+        return False
+
+    @staticmethod
+    def is_dmcrypt(ptype, name):
+        for what in ('plain', 'luks'):
+            if ptype == PTYPE[what][name]['ready']:
+                return True
+        return False
+
+DEFAULT_FS_TYPE = 'xfs'
+SYSFS = '/sys'
+
+"""
+OSD STATUS Definition
+"""
+OSD_STATUS_OUT_DOWN = 0
+OSD_STATUS_OUT_UP = 1
+OSD_STATUS_IN_DOWN = 2
+OSD_STATUS_IN_UP = 3
+
+MOUNT_OPTIONS = dict(
+    btrfs='noatime,user_subvol_rm_allowed',
+    # user_xattr is default ever since linux 2.6.39 / 3.0, but we'll
+    # delay a moment before removing it fully because we did have some
+    # issues with ext4 before the xatts-in-leveldb work, and it seemed
+    # that user_xattr helped
+    ext4='noatime,user_xattr',
+    xfs='noatime,inode64',
+)
+
+MKFS_ARGS = dict(
+    btrfs=[
+        # btrfs requires -f, for the same reason as xfs (see comment below)
+        '-f',
+        '-m', 'single',
+        '-l', '32768',
+        '-n', '32768',
+    ],
+    xfs=[
+        # xfs insists on not overwriting previous fs; even if we wipe
+        # partition table, we often recreate it exactly the same way,
+        # so we'll see ghosts of filesystems past
+        '-f',
+        '-i', 'size=2048',
+    ],
+)
+
+INIT_SYSTEMS = [
+    'upstart',
+    'sysvinit',
+    'systemd',
+    'auto',
+    'none',
+]
+
+STATEDIR = '/var/lib/ceph'
+
+SYSCONFDIR = '/etc/ceph'
+
+prepare_lock = None
+activate_lock = None
+SUPPRESS_PREFIX = None
+
+# only warn once about some things
+warned_about = {}
+
+# Nuke the TERM variable to avoid confusing any subprocesses we call.
+# For example, libreadline will print weird control sequences for some
+# TERM values.
+if 'TERM' in os.environ:
+    del os.environ['TERM']
+
+LOG_NAME = __name__
+if LOG_NAME == '__main__':
+    LOG_NAME = os.path.basename(sys.argv[0])
+LOG = logging.getLogger(LOG_NAME)
+
+# Allow user-preferred values for subprocess user and group
+CEPH_PREF_USER = None
+CEPH_PREF_GROUP = None
+
+
+class filelock(object):
+    def __init__(self, fn):
+        self.fn = fn
+        self.fd = None
+
+    def acquire(self):
+        assert not self.fd
+        self.fd = file(self.fn, 'w')
+        fcntl.lockf(self.fd, fcntl.LOCK_EX)
+
+    def release(self):
+        assert self.fd
+        fcntl.lockf(self.fd, fcntl.LOCK_UN)
+        self.fd = None
+
+
+class Error(Exception):
+    """
+    Error
+    """
+
+    def __str__(self):
+        doc = self.__doc__.strip()
+        return ': '.join([doc] + [str(a) for a in self.args])
+
+
+class MountError(Error):
+    """
+    Mounting filesystem failed
+    """
+
+
+class UnmountError(Error):
+    """
+    Unmounting filesystem failed
+    """
+
+
+class BadMagicError(Error):
+    """
+    Does not look like a Ceph OSD, or incompatible version
+    """
+
+
+class TruncatedLineError(Error):
+    """
+    Line is truncated
+    """
+
+
+class TooManyLinesError(Error):
+    """
+    Too many lines
+    """
+
+
+class FilesystemTypeError(Error):
+    """
+    Cannot discover filesystem type
+     """
+
+
+class CephDiskException(Exception):
+    """
+    A base exception for ceph-disk to provide custom (ad-hoc) messages that
+    will be caught and dealt with when main() is executed
+    """
+    pass
+
+
+class ExecutableNotFound(CephDiskException):
+    """
+    Exception to report on executables not available in PATH
+    """
+    pass
+
+
+def is_systemd():
+    """
+    Detect whether systemd is running
+    """
+    with file('/proc/1/comm', 'rb') as i:
+        for line in i:
+            if 'systemd' in line:
+                return True
+    return False
+
+
+def is_upstart():
+    """
+    Detect whether upstart is running
+    """
+    (out, err, _) = command(['init', '--version'])
+    if 'upstart' in out:
+        return True
+    return False
+
+
+def maybe_mkdir(*a, **kw):
+    """
+    Creates a new directory if it doesn't exist, removes
+    existing symlink before creating the directory.
+    """
+    # remove any symlink, if it is there..
+    if os.path.exists(*a) and stat.S_ISLNK(os.lstat(*a).st_mode):
+        LOG.debug('Removing old symlink at %s', *a)
+        os.unlink(*a)
+    try:
+        os.mkdir(*a, **kw)
+    except OSError, e:
+        if e.errno == errno.EEXIST:
+            pass
+        else:
+            raise
+
+
+def which(executable):
+    """find the location of an executable"""
+    if 'PATH' in os.environ:
+        envpath = os.environ['PATH']
+    else:
+        envpath = os.defpath
+    PATH = envpath.split(os.pathsep)
+
+    locations = PATH + [
+        '/usr/local/bin',
+        '/bin',
+        '/usr/bin',
+        '/usr/local/sbin',
+        '/usr/sbin',
+        '/sbin',
+    ]
+
+    for location in locations:
+        executable_path = os.path.join(location, executable)
+        if (os.path.isfile(executable_path) and
+                os.access(executable_path, os.X_OK)):
+            return executable_path
+
+
+def _get_command_executable(arguments):
+    """
+    Return the full path for an executable, raise if the executable is not
+    found. If the executable has already a full path do not perform any checks.
+    """
+    if arguments[0].startswith('/'):  # an absolute path
+        return arguments
+    executable = which(arguments[0])
+    if not executable:
+        command_msg = 'Could not run command: %s' % ' '.join(arguments)
+        executable_msg = '%s not in path.' % arguments[0]
+        raise ExecutableNotFound('%s %s' % (executable_msg, command_msg))
+
+    # swap the old executable for the new one
+    arguments[0] = executable
+    return arguments
+
+
+def command(arguments, **kwargs):
+    """
+    Safely execute a ``subprocess.Popen`` call making sure that the
+    executable exists and raising a helpful error message
+    if it does not.
+
+    .. note:: This should be the prefered way of calling ``subprocess.Popen``
+    since it provides the caller with the safety net of making sure that
+    executables *will* be found and will error nicely otherwise.
+
+    This returns the output of the command and the return code of the
+    process in a tuple: (output, returncode).
+    """
+    arguments = _get_command_executable(arguments)
+    LOG.info('Running command: %s' % ' '.join(arguments))
+    process = subprocess.Popen(
+        arguments,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        **kwargs)
+    out, err = process.communicate()
+    return out, err, process.returncode
+
+
+def command_check_call(arguments):
+    """
+    Safely execute a ``subprocess.check_call`` call making sure that the
+    executable exists and raising a helpful error message if it does not.
+
+    .. note:: This should be the prefered way of calling
+    ``subprocess.check_call`` since it provides the caller with the safety net
+    of making sure that executables *will* be found and will error nicely
+    otherwise.
+    """
+    arguments = _get_command_executable(arguments)
+    LOG.info('Running command: %s', ' '.join(arguments))
+    return subprocess.check_call(arguments)
+
+
+def platform_distro():
+    """
+    Returns a normalized, lower case string without any leading nor trailing
+    whitespace that represents the distribution name of the current machine.
+    """
+    distro = platform_information()[0] or ''
+    return distro.strip().lower()
+
+
+def platform_information():
+    distro, release, codename = platform.linux_distribution()
+    # this could be an empty string in Debian
+    if not codename and 'debian' in distro.lower():
+        debian_codenames = {
+            '8': 'jessie',
+            '7': 'wheezy',
+            '6': 'squeeze',
+        }
+        major_version = release.split('.')[0]
+        codename = debian_codenames.get(major_version, '')
+
+        # In order to support newer jessie/sid or wheezy/sid strings we test
+        # this if sid is buried in the minor, we should use sid anyway.
+        if not codename and '/' in release:
+            major, minor = release.split('/')
+            if minor == 'sid':
+                codename = minor
+            else:
+                codename = major
+
+    return (
+        str(distro).strip(),
+        str(release).strip(),
+        str(codename).strip()
+    )
+
+#
+# An alternative block_path implementation would be
+#
+#   name = basename(dev)
+#   return /sys/devices/virtual/block/$name
+#
+# It is however more fragile because it relies on the fact
+# that the basename of the device the user will use always
+# matches the one the driver will use. On Ubuntu 14.04, for
+# instance, when multipath creates a partition table on
+#
+#   /dev/mapper/353333330000007d0 -> ../dm-0
+#
+# it will create partition devices named
+#
+#   /dev/mapper/353333330000007d0-part1
+#
+# which is the same device as /dev/dm-1 but not a symbolic
+# link to it:
+#
+#   ubuntu at other:~$ ls -l /dev/mapper /dev/dm-1
+#   brw-rw---- 1 root disk 252, 1 Aug 15 17:52 /dev/dm-1
+#   lrwxrwxrwx 1 root root        7 Aug 15 17:52 353333330000007d0 -> ../dm-0
+#   brw-rw---- 1 root disk 252,   1 Aug 15 17:52 353333330000007d0-part1
+#
+# Using the basename in this case fails.
+#
+
+
+def block_path(dev):
+    path = os.path.realpath(dev)
+    rdev = os.stat(path).st_rdev
+    (M, m) = (os.major(rdev), os.minor(rdev))
+    return "{sysfs}/dev/block/{M}:{m}".format(sysfs=SYSFS, M=M, m=m)
+
+
+def get_dm_uuid(dev):
+    uuid_path = os.path.join(block_path(dev), 'dm', 'uuid')
+    LOG.debug("get_dm_uuid " + dev + " uuid path is " + uuid_path)
+    if not os.path.exists(uuid_path):
+        return False
+    uuid = open(uuid_path, 'r').read()
+    LOG.debug("get_dm_uuid " + dev + " uuid is " + uuid)
+    return uuid
+
+
+def is_mpath(dev):
+    """
+    True if the path is managed by multipath
+    """
+    uuid = get_dm_uuid(dev)
+    return (uuid and
+            (re.match('part\d+-mpath-', uuid) or
+             re.match('mpath-', uuid)))
+
+
+def get_dev_name(path):
+    """
+    get device name from path.  e.g.::
+
+        /dev/sda -> sdas, /dev/cciss/c0d1 -> cciss!c0d1
+
+    a device "name" is something like::
+
+        sdb
+        cciss!c0d1
+
+    """
+    assert path.startswith('/dev/')
+    base = path[5:]
+    return base.replace('/', '!')
+
+
+def get_dev_path(name):
+    """
+    get a path (/dev/...) from a name (cciss!c0d1)
+    a device "path" is something like::
+
+        /dev/sdb
+        /dev/cciss/c0d1
+
+    """
+    return '/dev/' + name.replace('!', '/')
+
+
+def get_dev_relpath(name):
+    """
+    get a relative path to /dev from a name (cciss!c0d1)
+    """
+    return name.replace('!', '/')
+
+
+def get_dev_size(dev, size='megabytes'):
+    """
+    Attempt to get the size of a device so that we can prevent errors
+    from actions to devices that are smaller, and improve error reporting.
+
+    Because we want to avoid breakage in case this approach is not robust, we
+    will issue a warning if we failed to get the size.
+
+    :param size: bytes or megabytes
+    :param dev: the device to calculate the size
+    """
+    fd = os.open(dev, os.O_RDONLY)
+    dividers = {'bytes': 1, 'megabytes': 1024 * 1024}
+    try:
+        device_size = os.lseek(fd, 0, os.SEEK_END)
+        divider = dividers.get(size, 1024 * 1024)  # default to megabytes
+        return device_size / divider
+    except Exception as error:
+        LOG.warning('failed to get size of %s: %s' % (dev, str(error)))
+    finally:
+        os.close(fd)
+
+
+def get_partition_mpath(dev, pnum):
+    part_re = "part{pnum}-mpath-".format(pnum=pnum)
+    partitions = list_partitions_mpath(dev, part_re)
+    if partitions:
+        return partitions[0]
+    else:
+        return None
+
+
+def get_partition_dev(dev, pnum):
+    """
+    get the device name for a partition
+
+    assume that partitions are named like the base dev,
+    with a number, and optionally
+    some intervening characters (like 'p').  e.g.,
+
+       sda 1 -> sda1
+       cciss/c0d1 1 -> cciss!c0d1p1
+    """
+    partname = None
+    if is_mpath(dev):
+        partname = get_partition_mpath(dev, pnum)
+    else:
+        name = get_dev_name(os.path.realpath(dev))
+        for f in os.listdir(os.path.join('/sys/block', name)):
+            if f.startswith(name) and f.endswith(str(pnum)):
+                # we want the shortest name that starts with the base name
+                # and ends with the partition number
+                if not partname or len(f) < len(partname):
+                    partname = f
+    if partname:
+        return get_dev_path(partname)
+    else:
+        raise Error('partition %d for %s does not appear to exist' %
+                    (pnum, dev))
+
+
+def list_all_partitions():
+    """
+    Return a list of devices and partitions
+    """
+    names = os.listdir('/sys/block')
+    dev_part_list = {}
+    for name in names:
+        # /dev/fd0 may hang http://tracker.ceph.com/issues/6827
+        if re.match(r'^fd\d$', name):
+            continue
+        dev_part_list[name] = list_partitions(get_dev_path(name))
+    return dev_part_list
+
+
+def list_partitions(dev):
+    dev = os.path.realpath(dev)
+    if is_mpath(dev):
+        return list_partitions_mpath(dev)
+    else:
+        return list_partitions_device(dev)
+
+
+def list_partitions_mpath(dev, part_re="part\d+-mpath-"):
+    p = block_path(dev)
+    partitions = []
+    holders = os.path.join(p, 'holders')
+    for holder in os.listdir(holders):
+        uuid_path = os.path.join(holders, holder, 'dm', 'uuid')
+        uuid = open(uuid_path, 'r').read()
+        LOG.debug("list_partitions_mpath: " + uuid_path + " uuid = " + uuid)
+        if re.match(part_re, uuid):
+            partitions.append(holder)
+    return partitions
+
+
+def list_partitions_device(dev):
+    """
+    Return a list of partitions on the given device name
+    """
+    partitions = []
+    basename = get_dev_name(dev)
+    for name in os.listdir(block_path(dev)):
+        if name.startswith(basename):
+            partitions.append(name)
+    return partitions
+
+
+def get_partition_base(dev):
+    """
+    Get the base device for a partition
+    """
+    dev = os.path.realpath(dev)
+    if not stat.S_ISBLK(os.lstat(dev).st_mode):
+        raise Error('not a block device', dev)
+
+    name = get_dev_name(dev)
+    if os.path.exists(os.path.join('/sys/block', name)):
+        raise Error('not a partition', dev)
+
+    # find the base
+    for basename in os.listdir('/sys/block'):
+        if os.path.exists(os.path.join('/sys/block', basename, name)):
+            return get_dev_path(basename)
+    raise Error('no parent device for partition', dev)
+
+
+def is_partition_mpath(dev):
+    uuid = get_dm_uuid(dev)
+    return bool(re.match('part\d+-mpath-', uuid))
+
+
+def partnum_mpath(dev):
+    uuid = get_dm_uuid(dev)
+    return re.findall('part(\d+)-mpath-', uuid)[0]
+
+
+def get_partition_base_mpath(dev):
+    slave_path = os.path.join(block_path(dev), 'slaves')
+    slaves = os.listdir(slave_path)
+    assert slaves
+    name_path = os.path.join(slave_path, slaves[0], 'dm', 'name')
+    name = open(name_path, 'r').read().strip()
+    return os.path.join('/dev/mapper', name)
+
+
+def is_partition(dev):
+    """
+    Check whether a given device path is a partition or a full disk.
+    """
+    if is_mpath(dev):
+        return is_partition_mpath(dev)
+
+    dev = os.path.realpath(dev)
+    st = os.lstat(dev)
+    if not stat.S_ISBLK(st.st_mode):
+        raise Error('not a block device', dev)
+
+    name = get_dev_name(dev)
+    if os.path.exists(os.path.join('/sys/block', name)):
+        return False
+
+    # make sure it is a partition of something else
+    major = os.major(st.st_rdev)
+    minor = os.minor(st.st_rdev)
+    if os.path.exists('/sys/dev/block/%d:%d/partition' % (major, minor)):
+        return True
+
+    raise Error('not a disk or partition', dev)
+
+
+def is_mounted(dev):
+    """
+    Check if the given device is mounted.
+    """
+    dev = os.path.realpath(dev)
+    with file('/proc/mounts', 'rb') as proc_mounts:
+        for line in proc_mounts:
+            fields = line.split()
+            if len(fields) < 3:
+                continue
+            mounts_dev = fields[0]
+            path = fields[1]
+            if mounts_dev.startswith('/') and os.path.exists(mounts_dev):
+                mounts_dev = os.path.realpath(mounts_dev)
+                if mounts_dev == dev:
+                    return path
+    return None
+
+
+def is_held(dev):
+    """
+    Check if a device is held by another device (e.g., a dm-crypt mapping)
+    """
+    assert os.path.exists(dev)
+    if is_mpath(dev):
+        return []
+
+    dev = os.path.realpath(dev)
+    base = get_dev_name(dev)
+
+    # full disk?
+    directory = '/sys/block/{base}/holders'.format(base=base)
+    if os.path.exists(directory):
+        return os.listdir(directory)
+
+    # partition?
+    part = base
+    while len(base):
+        directory = '/sys/block/{base}/{part}/holders'.format(
+            part=part, base=base)
+        if os.path.exists(directory):
+            return os.listdir(directory)
+        base = base[:-1]
+    return []
+
+
+def verify_not_in_use(dev, check_partitions=False):
+    """
+    Verify if a given device (path) is in use (e.g. mounted or
+    in use by device-mapper).
+
+    :raises: Error if device is in use.
+    """
+    assert os.path.exists(dev)
+    if is_mounted(dev):
+        raise Error('Device is mounted', dev)
+    holders = is_held(dev)
+    if holders:
+        raise Error('Device %s is in use by a device-mapper '
+                    'mapping (dm-crypt?)' % dev, ','.join(holders))
+
+    if check_partitions and not is_partition(dev):
+        for partname in list_partitions(dev):
+            partition = get_dev_path(partname)
+            if is_mounted(partition):
+                raise Error('Device is mounted', partition)
+            holders = is_held(partition)
+            if holders:
+                raise Error('Device %s is in use by a device-mapper '
+                            'mapping (dm-crypt?)'
+                            % partition, ','.join(holders))
+
+
+def must_be_one_line(line):
+    """
+    Checks if given line is really one single line.
+
+    :raises: TruncatedLineError or TooManyLinesError
+    :return: Content of the line, or None if line isn't valid.
+    """
+    if line[-1:] != '\n':
+        raise TruncatedLineError(line)
+    line = line[:-1]
+    if '\n' in line:
+        raise TooManyLinesError(line)
+    return line
+
+
+def read_one_line(parent, name):
+    """
+    Read a file whose sole contents are a single line.
+
+    Strips the newline.
+
+    :return: Contents of the line, or None if file did not exist.
+    """
+    path = os.path.join(parent, name)
+    try:
+        line = file(path, 'rb').read()
+    except IOError as e:
+        if e.errno == errno.ENOENT:
+            return None
+        else:
+            raise
+
+    try:
+        line = must_be_one_line(line)
+    except (TruncatedLineError, TooManyLinesError) as e:
+        raise Error(
+            'File is corrupt: {path}: {msg}'.format(
+                path=path,
+                msg=e,
+            )
+        )
+    return line
+
+
+def write_one_line(parent, name, text):
+    """
+    Write a file whose sole contents are a single line.
+
+    Adds a newline.
+    """
+    path = os.path.join(parent, name)
+    tmp = '{path}.{pid}.tmp'.format(path=path, pid=os.getpid())
+    with file(tmp, 'wb') as tmp_file:
+        tmp_file.write(text + '\n')
+        os.fsync(tmp_file.fileno())
+    path_set_context(tmp)
+    os.rename(tmp, path)
+
+
+def init_get():
+    """
+    Get a init system using 'ceph-detect-init'
+    """
+    init = _check_output(
+        args=[
+            'ceph-detect-init',
+            '--default', 'sysvinit',
+        ],
+    )
+    init = must_be_one_line(init)
+    return init
+
+
+def check_osd_magic(path):
+    """
+    Check that this path has the Ceph OSD magic.
+
+    :raises: BadMagicError if this does not look like a Ceph OSD data
+    dir.
+    """
+    magic = read_one_line(path, 'magic')
+    if magic is None:
+        # probably not mkfs'ed yet
+        raise BadMagicError(path)
+    if magic != CEPH_OSD_ONDISK_MAGIC:
+        raise BadMagicError(path)
+
+
+def check_osd_id(osd_id):
+    """
+    Ensures osd id is numeric.
+    """
+    if not re.match(r'^[0-9]+$', osd_id):
+        raise Error('osd id is not numeric', osd_id)
+
+
+def allocate_osd_id(
+    cluster,
+    fsid,
+    keyring,
+):
+    """
+    Accocates an OSD id on the given cluster.
+
+    :raises: Error if the call to allocate the OSD id fails.
+    :return: The allocated OSD id.
+    """
+
+    LOG.debug('Allocating OSD id...')
+    try:
+        osd_id = _check_output(
+            args=[
+                'ceph',
+                '--cluster', cluster,
+                '--name', 'client.bootstrap-osd',
+                '--keyring', keyring,
+                'osd', 'create', '--concise',
+                fsid,
+            ],
+        )
+    except subprocess.CalledProcessError as e:
+        raise Error('ceph osd create failed', e, e.output)
+    osd_id = must_be_one_line(osd_id)
+    check_osd_id(osd_id)
+    return osd_id
+
+
+def get_osd_id(path):
+    """
+    Gets the OSD id of the OSD at the given path.
+    """
+    osd_id = read_one_line(path, 'whoami')
+    if osd_id is not None:
+        check_osd_id(osd_id)
+    return osd_id
+
+
+def get_ceph_user():
+    global CEPH_PREF_USER
+
+    if CEPH_PREF_USER is not None:
+        try:
+            pwd.getpwnam(CEPH_PREF_USER)
+            return CEPH_PREF_USER
+        except KeyError:
+            print "No such user: " + CEPH_PREF_USER
+            sys.exit(2)
+    else:
+        try:
+            pwd.getpwnam('ceph')
+            return 'ceph'
+        except KeyError:
+            return 'root'
+
+
+def get_ceph_group():
+    global CEPH_PREF_GROUP
+
+    if CEPH_PREF_GROUP is not None:
+        try:
+            grp.getgrnam(CEPH_PREF_GROUP)
+            return CEPH_PREF_GROUP
+        except KeyError:
+            print "No such group: " + CEPH_PREF_GROUP
+            sys.exit(2)
+    else:
+        try:
+            grp.getgrnam('ceph')
+            return 'ceph'
+        except KeyError:
+            return 'root'
+
+
+def path_set_context(path):
+    # restore selinux context to default policy values
+    if which('restorecon'):
+        command(['restorecon', '-R', path])
+
+    # if ceph user exists, set owner to ceph
+    if get_ceph_user() == 'ceph':
+        command(['chown', '-R', 'ceph:ceph', path])
+
+
+def _check_output(args=None, **kwargs):
+    out, err, ret = command(args, **kwargs)
+    if ret:
+        cmd = args[0]
+        error = subprocess.CalledProcessError(ret, cmd)
+        error.output = out + err
+        raise error
+    return out
+
+
+def get_conf(cluster, variable):
+    """
+    Get the value of the given configuration variable from the
+    cluster.
+
+    :raises: Error if call to ceph-conf fails.
+    :return: The variable value or None.
+    """
+    try:
+        out, err, ret = command(
+            [
+                'ceph-conf',
+                '--cluster={cluster}'.format(
+                    cluster=cluster,
+                ),
+                '--name=osd.',
+                '--lookup',
+                variable,
+            ],
+            close_fds=True,
+        )
+    except OSError as e:
+        raise Error('error executing ceph-conf', e, err)
+    if ret == 1:
+        # config entry not found
+        return None
+    elif ret != 0:
+        raise Error('getting variable from configuration failed')
+    value = out.split('\n', 1)[0]
+    # don't differentiate between "var=" and no var set
+    if not value:
+        return None
+    return value
+
+
+def get_conf_with_default(cluster, variable):
+    """
+    Get a config value that is known to the C++ code.
+
+    This will fail if called on variables that are not defined in
+    common config options.
+    """
+    try:
+        out = _check_output(
+            args=[
+                'ceph-osd',
+                '--cluster={cluster}'.format(
+                    cluster=cluster,
+                ),
+                '--show-config-value={variable}'.format(
+                    variable=variable,
+                ),
+            ],
+            close_fds=True,
+        )
+    except subprocess.CalledProcessError as e:
+        raise Error(
+            'getting variable from configuration failed',
+            e,
+        )
+
+    value = str(out).split('\n', 1)[0]
+    return value
+
+
+def get_fsid(cluster):
+    """
+    Get the fsid of the cluster.
+
+    :return: The fsid or raises Error.
+    """
+    fsid = get_conf_with_default(cluster=cluster, variable='fsid')
+    if fsid is None:
+        raise Error('getting cluster uuid from configuration failed')
+    return fsid.lower()
+
+
+def get_dmcrypt_key_path(
+    _uuid,
+    key_dir,
+    luks
+):
+    """
+    Get path to dmcrypt key file.
+
+    :return: Path to the dmcrypt key file, callers should check for existence.
+    """
+    if luks:
+        path = os.path.join(key_dir, _uuid + ".luks.key")
+    else:
+        path = os.path.join(key_dir, _uuid)
+
+    return path
+
+
+def get_or_create_dmcrypt_key(
+    _uuid,
+    key_dir,
+    key_size,
+    luks
+):
+    """
+    Get path to existing dmcrypt key or create a new key file.
+
+    :return: Path to the dmcrypt key file.
+    """
+    path = get_dmcrypt_key_path(_uuid, key_dir, luks)
+    if os.path.exists(path):
+        return path
+
+    # make a new key
+    try:
+        if not os.path.exists(key_dir):
+            os.makedirs(key_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
+        with file('/dev/urandom', 'rb') as i:
+            key = i.read(key_size / 8)
+            fd = os.open(path, os.O_WRONLY | os.O_CREAT,
+                         stat.S_IRUSR | stat.S_IWUSR)
+            assert os.write(fd, key) == len(key)
+            os.close(fd)
+        return path
+    except:
+        raise Error('unable to read or create dm-crypt key', path)
+
+
+def _dmcrypt_map(
+    rawdev,
+    keypath,
+    _uuid,
+    cryptsetup_parameters,
+    luks,
+    format_dev=False,
+):
+    """
+    Maps a device to a dmcrypt device.
+
+    :return: Path to the dmcrypt device.
+    """
+    dev = '/dev/mapper/' + _uuid
+    luksFormat_args = [
+        'cryptsetup',
+        '--batch-mode',
+        '--key-file',
+        keypath,
+        'luksFormat',
+        rawdev,
+    ] + cryptsetup_parameters
+
+    luksOpen_args = [
+        'cryptsetup',
+        '--key-file',
+        keypath,
+        'luksOpen',
+        rawdev,
+        _uuid,
+    ]
+
+    create_args = [
+        'cryptsetup',
+        '--key-file',
+        keypath,
+        'create',
+        _uuid,
+        rawdev,
+    ] + cryptsetup_parameters
+
+    try:
+        if luks:
+            if format_dev:
+                command_check_call(luksFormat_args)
+            command_check_call(luksOpen_args)
+        else:
+            # Plain mode has no format function, nor any validation
+            # that the key is correct.
+            command_check_call(create_args)
+        # set proper ownership of mapped device
+        command_check_call(['chown', 'ceph:ceph', dev])
+        return dev
+
+    except subprocess.CalledProcessError as e:
+        raise Error('unable to map device', rawdev, e)
+
+
+def dmcrypt_unmap(
+    _uuid
+):
+    """
+    Removes the dmcrypt device with the given UUID.
+    """
+    retries = 0
+    while True:
+        try:
+            command_check_call(['cryptsetup', 'remove', _uuid])
+            break
+        except subprocess.CalledProcessError as e:
+            if retries == 10:
+                raise Error('unable to unmap device', _uuid, e)
+            else:
+                time.sleep(0.5 + retries * 1.0)
+                retries += 1
+
+
+def mount(
+    dev,
+    fstype,
+    options,
+):
+    """
+    Mounts a device with given filessystem type and
+    mount options to a tempfile path under /var/lib/ceph/tmp.
+    """
+    # sanity check: none of the arguments are None
+    if dev is None:
+        raise ValueError('dev may not be None')
+    if fstype is None:
+        raise ValueError('fstype may not be None')
+
+    # pick best-of-breed mount options based on fs type
+    if options is None:
+        options = MOUNT_OPTIONS.get(fstype, '')
+
+    # mount
+    path = tempfile.mkdtemp(
+        prefix='mnt.',
+        dir=STATEDIR + '/tmp',
+    )
+    try:
+        LOG.debug('Mounting %s on %s with options %s', dev, path, options)
+        command_check_call(
+            [
+                'mount',
+                '-t', fstype,
+                '-o', options,
+                '--',
+                dev,
+                path,
+            ],
+        )
+        if which('restorecon'):
+            command(
+                [
+                    'restorecon',
+                    path,
+                ],
+            )
+    except subprocess.CalledProcessError as e:
+        try:
+            os.rmdir(path)
+        except (OSError, IOError):
+            pass
+        raise MountError(e)
+
+    return path
+
+
+def unmount(
+    path,
+):
+    """
+    Unmount and removes the given mount point.
+    """
+    retries = 0
+    while True:
+        try:
+            LOG.debug('Unmounting %s', path)
+            command_check_call(
+                [
+                    '/bin/umount',
+                    '--',
+                    path,
+                ],
+            )
+            break
+        except subprocess.CalledProcessError as e:
+            # on failure, retry 3 times with incremental backoff
+            if retries == 3:
+                raise UnmountError(e)
+            else:
+                time.sleep(0.5 + retries * 1.0)
+                retries += 1
+
+    os.rmdir(path)
+
+
+###########################################
+
+def extract_parted_partition_numbers(partitions):
+    numbers_as_strings = re.findall('^\d+', partitions, re.MULTILINE)
+    return map(int, numbers_as_strings)
+
+
+def get_free_partition_index(dev):
+    """
+    Get the next free partition index on a given device.
+
+    :return: Index number (> 1 if there is already a partition on the device)
+    or 1 if there is no partition table.
+    """
+    try:
+        lines = _check_output(
+            args=[
+                'parted',
+                '--machine',
+                '--',
+                dev,
+                'print',
+            ],
+        )
+    except subprocess.CalledProcessError as e:
+        LOG.info('cannot read partition index; assume it '
+                 'isn\'t present\n (Error: %s)' % e)
+        return 1
+
+    if not lines:
+        raise Error('parted failed to output anything')
+    LOG.debug('get_free_partition_index: analyzing ' + lines)
+    if ('CHS;' not in lines and
+            'CYL;' not in lines and
+            'BYT;' not in lines):
+        raise Error('parted output expected to contain one of ' +
+                    'CHH; CYL; or BYT; : ' + lines)
+    if os.path.realpath(dev) not in lines:
+        raise Error('parted output expected to contain ' + dev + ': ' + lines)
+    _, partitions = lines.split(os.path.realpath(dev))
+    partition_numbers = extract_parted_partition_numbers(partitions)
+    if partition_numbers:
+        return max(partition_numbers) + 1
+    else:
+        return 1
+
+
+def check_journal_reqs(args):
+    _, _, allows_journal = command([
+        'ceph-osd', '--check-allows-journal',
+        '-i', '0',
+        '--cluster', args.cluster,
+    ])
+    _, _, wants_journal = command([
+        'ceph-osd', '--check-wants-journal',
+        '-i', '0',
+        '--cluster', args.cluster,
+    ])
+    _, _, needs_journal = command([
+        'ceph-osd', '--check-needs-journal',
+        '-i', '0',
+        '--cluster', args.cluster,
+    ])
+    return (not allows_journal, not wants_journal, not needs_journal)
+
+
+def update_partition(dev, description):
+    """
+    Must be called after modifying a partition table so the kernel
+    know about the change and fire udev events accordingly. A side
+    effect of partprobe is to remove partitions and add them again.
+    The first udevadm settle waits for ongoing udev events to
+    complete, just in case one of them rely on an existing partition
+    on dev.  The second udevadm settle guarantees to the caller that
+    all udev events related to the partition table change have been
+    processed, i.e. the 95-ceph-osd.rules actions and mode changes,
+    group changes etc. are complete.
+    """
+    LOG.debug('Calling partprobe on %s device %s', description, dev)
+    partprobe_ok = False
+    error = 'unknown error'
+    for i in (1, 2, 3, 4, 5):
+        command_check_call(['udevadm', 'settle', '--timeout=600'])
+        try:
+            _check_output(['partprobe', dev])
+            partprobe_ok = True
+            break
+        except subprocess.CalledProcessError as e:
+            error = e.output
+            if ('unable to inform the kernel' not in error and
+                    'Device or resource busy' not in error):
+                raise
+            LOG.debug('partprobe %s failed : %s (ignored, waiting 60s)'
+                      % (dev, error))
+            time.sleep(60)
+    if not partprobe_ok:
+        raise Error('partprobe %s failed : %s' % (dev, error))
+    command_check_call(['udevadm', 'settle', '--timeout=600'])
+
+
+def zap(dev):
+    """
+    Destroy the partition table and content of a given disk.
+    """
+    dev = os.path.realpath(dev)
+    dmode = os.stat(dev).st_mode
+    if not stat.S_ISBLK(dmode) or is_partition(dev):
+        raise Error('not full block device; cannot zap', dev)
+    try:
+        LOG.debug('Zapping partition table on %s', dev)
+
+        # try to wipe out any GPT partition table backups.  sgdisk
+        # isn't too thorough.
+        lba_size = 4096
+        size = 33 * lba_size
+        with file(dev, 'wb') as dev_file:
+            dev_file.seek(-size, os.SEEK_END)
+            dev_file.write(size * '\0')
+
+        command_check_call(
+            [
+                'sgdisk',
+                '--zap-all',
+                '--',
+                dev,
+            ],
+        )
+        command_check_call(
+            [
+                'sgdisk',
+                '--clear',
+                '--mbrtogpt',
+                '--',
+                dev,
+            ],
+        )
+
+        update_partition(dev, 'zapped')
+
+    except subprocess.CalledProcessError as e:
+        raise Error(e)
+
+
+def adjust_symlink(target, path):
+    create = True
+    if os.path.lexists(path):
+        try:
+            mode = os.lstat(path).st_mode
+            if stat.S_ISREG(mode):
+                LOG.debug('Removing old file %s', path)
+                os.unlink(path)
+            elif stat.S_ISLNK(mode):
+                old = os.readlink(path)
+                if old != target:
+                    LOG.debug('Removing old symlink %s -> %s', path, old)
+                    os.unlink(path)
+                else:
+                    create = False
+        except:
+            raise Error('unable to remove (or adjust) old file (symlink)',
+                        path)
+    if create:
+        LOG.debug('Creating symlink %s -> %s', path, target)
+        try:
+            os.symlink(target, path)
+        except:
+            raise Error('unable to create symlink %s -> %s' % (path, target))
+
+
+class Device(object):
+
+    def __init__(self, path, args):
+        self.args = args
+        self.path = path
+        self.dev_size = None
+        self.partitions = {}
+        self.ptype_map = None
+        assert not is_partition(self.path)
+
+    def create_partition(self, uuid, name, size=0, num=0):
+        ptype = self.ptype_tobe_for_name(name)
+        if num == 0:
+            num = get_free_partition_index(dev=self.path)
+        if size > 0:
+            new = '--new={num}:0:+{size}M'.format(num=num, size=size)
+            if size > self.get_dev_size():
+                LOG.error('refusing to create %s on %s' % (name, self.path))
+                LOG.error('%s size (%sM) is bigger than device (%sM)'
+                          % (name, size, self.get_dev_size()))
+                raise Error('%s device size (%sM) is not big enough for %s'
+                            % (self.path, self.get_dev_size(), name))
+        else:
+            new = '--largest-new={num}'.format(num=num)
+
+        LOG.debug('Creating %s partition num %d size %d on %s',
+                  name, num, size, self.path)
+        command_check_call(
+            [
+                'sgdisk',
+                new,
+                '--change-name={num}:ceph {name}'.format(num=num, name=name),
+                '--partition-guid={num}:{uuid}'.format(num=num, uuid=uuid),
+                '--typecode={num}:{uuid}'.format(num=num, uuid=ptype),
+                '--mbrtogpt',
+                '--',
+                self.path,
+            ]
+        )
+        update_partition(self.path, 'created')
+        return num
+
+    def ptype_tobe_for_name(self, name):
+        if name == 'data':
+            name = 'osd'
+        if self.ptype_map is None:
+            partition = DevicePartition.factory(
+                path=self.path, dev=None, args=self.args)
+            self.ptype_map = partition.ptype_map
+        return self.ptype_map[name]['tobe']
+
+    def get_partition(self, num):
+        if num not in self.partitions:
+            dev = get_partition_dev(self.path, num)
+            partition = DevicePartition.factory(
+                path=self.path, dev=dev, args=self.args)
+            partition.set_partition_number(num)
+            self.partitions[num] = partition
+        return self.partitions[num]
+
+    def get_dev_size(self):
+        if self.dev_size is None:
+            self.dev_size = get_dev_size(self.path)
+        return self.dev_size
+
+    @staticmethod
+    def factory(path, args):
+        return Device(path, args)
+
+
+class DevicePartition(object):
+
+    def __init__(self, args):
+        self.args = args
+        self.num = None
+        self.rawdev = None
+        self.dev = None
+        self.uuid = None
+        self.ptype_map = None
+        self.ptype = None
+        self.set_variables_ptype()
+
+    def get_uuid(self):
+        if self.uuid is None:
+            self.uuid = get_partition_uuid(self.rawdev)
+        return self.uuid
+
+    def get_ptype(self):
+        if self.ptype is None:
+            self.ptype = get_partition_type(self.rawdev)
+        return self.ptype
+
+    def set_partition_number(self, num):
+        self.num = num
+
+    def get_partition_number(self):
+        return self.num
+
+    def set_dev(self, dev):
+        self.dev = dev
+        self.rawdev = dev
+
+    def get_dev(self):
+        return self.dev
+
+    def get_rawdev(self):
+        return self.rawdev
+
+    def set_variables_ptype(self):
+        self.ptype_map = PTYPE['regular']
+
+    def ptype_for_name(self, name):
+        return self.ptype_map[name]['ready']
+
+    @staticmethod
+    def factory(path, dev, args):
+        dmcrypt_type = CryptHelpers.get_dmcrypt_type(args)
+        if ((path is not None and is_mpath(path)) or
+                (dev is not None and is_mpath(dev))):
+            partition = DevicePartitionMultipath(args)
+        elif dmcrypt_type == 'luks':
+            partition = DevicePartitionCryptLuks(args)
+        elif dmcrypt_type == 'plain':
+            partition = DevicePartitionCryptPlain(args)
+        else:
+            partition = DevicePartition(args)
+        partition.set_dev(dev)
+        return partition
+
+
+class DevicePartitionMultipath(DevicePartition):
+
+    def set_variables_ptype(self):
+        self.ptype_map = PTYPE['mpath']
+
+
+class DevicePartitionCrypt(DevicePartition):
+
+    def __init__(self, args):
+        super(DevicePartitionCrypt, self).__init__(args)
+        self.osd_dm_keypath = None
+        self.cryptsetup_parameters = CryptHelpers.get_cryptsetup_parameters(
+            self.args)
+        self.dmcrypt_type = CryptHelpers.get_dmcrypt_type(self.args)
+        self.dmcrypt_keysize = CryptHelpers.get_dmcrypt_keysize(self.args)
+
+    def setup_crypt(self):
+        pass
+
+    def map(self):
+        self.setup_crypt()
+        self.dev = _dmcrypt_map(
+            rawdev=self.rawdev,
+            keypath=self.osd_dm_keypath,
+            _uuid=self.get_uuid(),
+            cryptsetup_parameters=self.cryptsetup_parameters,
+            luks=self.luks(),
+            format_dev=True,
+        )
+
+    def unmap(self):
+        self.setup_crypt()
+        dmcrypt_unmap(self.get_uuid())
+        self.dev = self.rawdev
+
+    def format(self):
+        self.setup_crypt()
+        self.map()
+        self.unmap()
+
+
+class DevicePartitionCryptPlain(DevicePartitionCrypt):
+
+    def luks(self):
+        return False
+
+    def setup_crypt(self):
+        if self.osd_dm_keypath is not None:
+            return
+
+        self.cryptsetup_parameters += ['--key-size', str(self.dmcrypt_keysize)]
+
+        self.osd_dm_keypath = get_or_create_dmcrypt_key(
+            self.get_uuid(), self.args.dmcrypt_key_dir,
+            self.dmcrypt_keysize, False)
+
+    def set_variables_ptype(self):
+        self.ptype_map = PTYPE['plain']
+
+
+class DevicePartitionCryptLuks(DevicePartitionCrypt):
+
+    def luks(self):
+        return True
+
+    def setup_crypt(self):
+        if self.osd_dm_keypath is not None:
+            return
+
+        if self.dmcrypt_keysize == 1024:
+            # We don't force this into the cryptsetup_parameters,
+            # as we want the cryptsetup defaults
+            # to prevail for the actual LUKS key lengths.
+            pass
+        else:
+            self.cryptsetup_parameters += ['--key-size',
+                                           str(self.dmcrypt_keysize)]
+
+        self.osd_dm_keypath = get_or_create_dmcrypt_key(
+            self.get_uuid(), self.args.dmcrypt_key_dir,
+            self.dmcrypt_keysize, True)
+
+    def set_variables_ptype(self):
+        self.ptype_map = PTYPE['luks']
+
+
+class Prepare(object):
+
+    @staticmethod
+    def parser():
+        parser = argparse.ArgumentParser(add_help=False)
+        parser.add_argument(
+            '--cluster',
+            metavar='NAME',
+            default='ceph',
+            help='cluster name to assign this disk to',
+        )
+        parser.add_argument(
+            '--cluster-uuid',
+            metavar='UUID',
+            help='cluster uuid to assign this disk to',
+        )
+        parser.add_argument(
+            '--osd-uuid',
+            metavar='UUID',
+            help='unique OSD uuid to assign this disk to',
+        )
+        parser.add_argument(
+            '--dmcrypt',
+            action='store_true', default=None,
+            help='encrypt DATA and/or JOURNAL devices with dm-crypt',
+        )
+        parser.add_argument(
+            '--dmcrypt-key-dir',
+            metavar='KEYDIR',
+            default='/etc/ceph/dmcrypt-keys',
+            help='directory where dm-crypt keys are stored',
+        )
+        return parser
+
+    @staticmethod
+    def set_subparser(subparsers):
+        parents = [
+            Prepare.parser(),
+            PrepareData.parser(),
+        ]
+        parents.extend(PrepareFilestore.parent_parsers())
+        parents.extend(PrepareBluestore.parent_parsers())
+        parser = subparsers.add_parser(
+            'prepare',
+            parents=parents,
+            help='Prepare a directory or disk for a Ceph OSD',
+        )
+        parser.set_defaults(
+            func=Prepare.main,
+        )
+        return parser
+
+    def prepare(self):
+        prepare_lock.acquire()
+        self.prepare_locked()
+        prepare_lock.release()
+
+    @staticmethod
+    def factory(args):
+        if args.bluestore:
+            return PrepareBluestore(args)
+        else:
+            return PrepareFilestore(args)
+
+    @staticmethod
+    def main(args):
+        Prepare.factory(args).prepare()
+
+
+class PrepareFilestore(Prepare):
+
+    def __init__(self, args):
+        self.data = PrepareFilestoreData(args)
+        self.journal = PrepareJournal(args)
+
+    @staticmethod
+    def parent_parsers():
+        return [
+            PrepareJournal.parser(),
+        ]
+
+    def prepare_locked(self):
+        self.data.prepare(self.journal)
+
+
+class PrepareBluestore(Prepare):
+
+    def __init__(self, args):
+        self.data = PrepareBluestoreData(args)
+        self.block = PrepareBluestoreBlock(args)
+
+    @staticmethod
+    def parser():
+        parser = argparse.ArgumentParser(add_help=False)
+        parser.add_argument(
+            '--bluestore',
+            action='store_true', default=None,
+            help='bluestore objectstore',
+        )
+        return parser
+
+    @staticmethod
+    def parent_parsers():
+        return [
+            PrepareBluestore.parser(),
+            PrepareBluestoreBlock.parser(),
+        ]
+
+    def prepare_locked(self):
+        self.data.prepare(self.block)
+
+
+class Space(object):
+
+    NAMES = ('block', 'journal')
+
+
+class PrepareSpace(object):
+
+    NONE = 0
+    FILE = 1
+    DEVICE = 2
+
+    def __init__(self, args):
+        self.args = args
+        self.set_type()
+        self.space_size = self.get_space_size()
+        if (getattr(self.args, self.name) and
+                getattr(self.args, self.name + '_uuid') is None):
+            setattr(self.args, self.name + '_uuid', str(uuid.uuid4()))
+        self.space_symlink = None
+        self.space_dmcrypt = None
+
+    def set_type(self):
+        name = self.name
+        args = self.args
+        dmode = os.stat(args.data).st_mode
+        if (self.wants_space() and
+                stat.S_ISBLK(dmode) and
+                not is_partition(args.data) and
+                getattr(args, name) is None and
+                getattr(args, name + '_file') is None):
+            LOG.info('Will colocate %s with data on %s',
+                     name, args.data)
+            setattr(args, name, args.data)
+
+        if getattr(args, name) is None:
+            if getattr(args, name + '_dev'):
+                raise Error('%s is unspecified; not a block device' %
+                            name.capitalize(), getattr(args, name))
+            self.type = self.NONE
+            return
+
+        if not os.path.exists(getattr(args, name)):
+            if getattr(args, name + '_dev'):
+                raise Error('%s does not exist; not a block device' %
+                            name.capitalize(), getattr(args, name))
+            self.type = self.FILE
+            return
+
+        mode = os.stat(getattr(args, name)).st_mode
+        if stat.S_ISBLK(mode):
+            if getattr(args, name + '_file'):
+                raise Error('%s is not a regular file' % name.capitalize,
+                            geattr(args, name))
+            self.type = self.DEVICE
+            return
+
+        if stat.S_ISREG(mode):
+            if getattr(args, name + '_dev'):
+                raise Error('%s is not a block device' % name.capitalize,
+                            geattr(args, name))
+            self.type = self.FILE
+
+        raise Error('%s %s is neither a block device nor regular file' %
+                    (name.capitalize, geattr(args, name)))
+
+    def is_none(self):
+        return self.type == self.NONE
+
+    def is_file(self):
+        return self.type == self.FILE
+
+    def is_device(self):
+        return self.type == self.DEVICE
+
+    @staticmethod
+    def parser(name):
+        parser = argparse.ArgumentParser(add_help=False)
+        parser.add_argument(
+            '--%s-uuid' % name,
+            metavar='UUID',
+            help='unique uuid to assign to the %s' % name,
+        )
+        parser.add_argument(
+            '--%s-file' % name,
+            action='store_true', default=None,
+            help='verify that %s is a file' % name.upper(),
+        )
+        parser.add_argument(
+            '--%s-dev' % name,
+            action='store_true', default=None,
+            help='verify that %s is a block device' % name.upper(),
+        )
+        parser.add_argument(
+            name,
+            metavar=name.upper(),
+            nargs='?',
+            help=('path to OSD %s disk block device;' % name +
+                  ' leave out to store %s in file' % name),
+        )
+        return parser
+
+    def wants_space(self):
+        return True
+
+    def populate_data_path(self, path):
+        if self.type == self.DEVICE:
+            self.populate_data_path_device(path)
+        elif self.type == self.FILE:
+            self.populate_data_path_file(path)
+        elif self.type == self.NONE:
+            pass
+        else:
+            raise Error('unexpected type ', self.type)
+
+    def populate_data_path_file(self, path):
+        space_uuid = self.name + '_uuid'
+        if getattr(self.args, space_uuid) is not None:
+            write_one_line(path, space_uuid,
+                           getattr(self.args, space_uuid))
+
+    def populate_data_path_device(self, path):
+        self.populate_data_path_file(path)
+        if self.space_symlink is not None:
+            adjust_symlink(self.space_symlink,
+                           os.path.join(path, self.name))
+
+        if self.space_dmcrypt is not None:
+            adjust_symlink(self.space_dmcrypt,
+                           os.path.join(path, self.name + '_dmcrypt'))
+        else:
+            try:
+                os.unlink(os.path.join(path, self.name + '_dmcrypt'))
+            except OSError:
+                pass
+
+    def prepare(self):
+        if self.type == self.DEVICE:
+            self.prepare_device()
+        elif self.type == self.FILE:
+            self.prepare_file()
+        elif self.type == self.NONE:
+            pass
+        else:
+            raise Error('unexpected type ', self.type)
+
+    def prepare_file(self):
+        if not os.path.exists(getattr(self.args, self.name)):
+            LOG.debug('Creating %s file %s with size 0'
+                      ' (ceph-osd will resize and allocate)',
+                      self.name,
+                      getattr(self.args, self.name))
+            with file(getattr(self.args, self.name), 'wb') as space_file:
+                pass
+
+        LOG.debug('%s is file %s',
+                  self.name.capitalize(),
+                  getattr(self.args, self.name))
+        LOG.warning('OSD will not be hot-swappable if %s is '
+                    'not the same device as the osd data' %
+                    self.name)
+        self.space_symlink = space_file
+
+    def prepare_device(self):
+        reusing_partition = False
+
+        if is_partition(getattr(self.args, self.name)):
+            LOG.debug('%s %s is a partition',
+                      self.name.capitalize(), getattr(self.args, self.name))
+            partition = DevicePartition.factory(
+                path=None, dev=getattr(self.args, self.name), args=self.args)
+            if isinstance(partition, DevicePartitionCrypt):
+                raise Error(getattr(self.args, self.name) +
+                            ' partition already exists'
+                            ' and --dmcrypt specified')
+            LOG.warning('OSD will not be hot-swappable' +
+                        ' if ' + self.name + ' is not' +
+                        ' the same device as the osd data')
+            if partition.get_ptype() == partition.ptype_for_name(self.name):
+                LOG.debug('%s %s was previously prepared with '
+                          'ceph-disk. Reusing it.',
+                          self.name.capitalize(),
+                          getattr(self.args, self.name))
+                reusing_partition = True
+                # Read and reuse the partition uuid from this journal's
+                # previous life. We reuse the uuid instead of changing it
+                # because udev does not reliably notice changes to an
+                # existing partition's GUID.  See
+                # http://tracker.ceph.com/issues/10146
+                setattr(self.args, self.name + '_uuid', partition.get_uuid())
+                LOG.debug('Reusing %s with uuid %s',
+                          self.name,
+                          getattr(self.args, self.name + '_uuid'))
+            else:
+                LOG.warning('%s %s was not prepared with '
+                            'ceph-disk. Symlinking directly.',
+                            self.name.capitalize(),
+                            getattr(self.args, self.name))
+                self.space_symlink = getattr(self.args, self.name)
+                return
+
+        self.space_symlink = '/dev/disk/by-partuuid/{uuid}'.format(
+            uuid=getattr(self.args, self.name + '_uuid'))
+
+        if self.args.dmcrypt:
+            self.space_dmcrypt = self.space_symlink
+            self.space_symlink = '/dev/mapper/{uuid}'.format(
+                uuid=getattr(self.args, self.name + '_uuid'))
+
+        if reusing_partition:
+            # confirm that the space_symlink exists. It should since
+            # this was an active space
+            # in the past. Continuing otherwise would be futile.
+            assert os.path.exists(self.space_symlink)
+            return
+
+        num = self.desired_partition_number()
+
+        if num == 0:
+            LOG.warning('OSD will not be hot-swappable if %s '
+                        'is not the same device as the osd data',
+                        self.name)
+
+        device = Device.factory(getattr(self.args, self.name), self.args)
+        num = device.create_partition(
+            uuid=getattr(self.args, self.name + '_uuid'),
+            name=self.name,
+            size=self.space_size,
+            num=num)
+
+        partition = device.get_partition(num)
+
+        LOG.debug('%s is GPT partition %s',
+                  self.name.capitalize(),
+                  self.space_symlink)
+
+        if isinstance(partition, DevicePartitionCrypt):
+            partition.format()
+
+            command_check_call(
+                [
+                    'sgdisk',
+                    '--typecode={num}:{uuid}'.format(
+                        num=num,
+                        uuid=partition.ptype_for_name(self.name),
+                    ),
+                    '--',
+                    getattr(self.args, self.name),
+                ],
+            )
+
+        LOG.debug('%s is GPT partition %s',
+                  self.name.capitalize(),
+                  self.space_symlink)
+
+
+class PrepareJournal(PrepareSpace):
+
+    def __init__(self, args):
+        self.name = 'journal'
+        (self.allows_journal,
+         self.wants_journal,
+         self.needs_journal) = check_journal_reqs(args)
+
+        if args.journal and not self.allows_journal:
+            raise Error('journal specified but not allowed by osd backend')
+
+        super(PrepareJournal, self).__init__(args)
+
+    def wants_space(self):
+        return self.wants_journal
+
+    def get_space_size(self):
+        return int(get_conf_with_default(
+            cluster=self.args.cluster,
+            variable='osd_journal_size',
+        ))
+
+    def desired_partition_number(self):
+        if self.args.journal == self.args.data:
+            # we're sharing the disk between osd data and journal;
+            # make journal be partition number 2
+            num = 2
+        else:
+            num = 0
+        return num
+
+    @staticmethod
+    def parser():
+        return PrepareSpace.parser('journal')
+
+
+class PrepareBluestoreBlock(PrepareSpace):
+
+    def __init__(self, args):
+        self.name = 'block'
+        super(PrepareBluestoreBlock, self).__init__(args)
+
+    def get_space_size(self):
+        return 0  # get as much space as possible
+
+    def desired_partition_number(self):
+        if self.args.block == self.args.data:
+            num = 2
+        else:
+            num = 0
+        return num
+
+    @staticmethod
+    def parser():
+        return PrepareSpace.parser('block')
+
+
+class CryptHelpers(object):
+
+    @staticmethod
+    def get_cryptsetup_parameters(args):
+        cryptsetup_parameters_str = get_conf(
+            cluster=args.cluster,
+            variable='osd_cryptsetup_parameters',
+        )
+        if cryptsetup_parameters_str is None:
+            return []
+        else:
+            return shlex.split(cryptsetup_parameters_str)
+
+    @staticmethod
+    def get_dmcrypt_keysize(args):
+        dmcrypt_keysize_str = get_conf(
+            cluster=args.cluster,
+            variable='osd_dmcrypt_key_size',
+        )
+        dmcrypt_type = CryptHelpers.get_dmcrypt_type(args)
+        if dmcrypt_type == 'luks':
+            if dmcrypt_keysize_str is None:
+                # As LUKS will hash the 'passphrase' in .luks.key
+                # into a key, set a large default
+                # so if not updated for some time, it is still a
+                # reasonable value.
+                #
+                return 1024
+            else:
+                return int(dmcrypt_keysize_str)
+        elif dmcrypt_type == 'plain':
+            if dmcrypt_keysize_str is None:
+                # This value is hard-coded in the udev script
+                return 256
+            else:
+                LOG.warning('ensure the 95-ceph-osd.rules file has '
+                            'been copied to /etc/udev/rules.d '
+                            'and modified to call cryptsetup '
+                            'with --key-size=%s' % dmcrypt_keysize_str)
+                return int(dmcrypt_keysize_str)
+        else:
+            return 0
+
+    @staticmethod
+    def get_dmcrypt_type(args):
+        if args.dmcrypt:
+            dmcrypt_type = get_conf(
+                cluster=args.cluster,
+                variable='osd_dmcrypt_type',
+            )
+
+            if dmcrypt_type is None or dmcrypt_type == 'luks':
+                return 'luks'
+            elif dmcrypt_type == 'plain':
+                return 'plain'
+            else:
+                raise Error('invalid osd_dmcrypt_type parameter '
+                            '(must be luks or plain): ', dmcrypt_type)
+        else:
+            return None
+
+
+class PrepareData(object):
+
+    FILE = 1
+    DEVICE = 2
+
+    def __init__(self, args):
+
+        self.args = args
+        self.partition = None
+        self.set_type()
+        if self.args.cluster_uuid is None:
+            self.args.cluster_uuid = get_fsid(cluster=self.args.cluster)
+
+        if self.args.osd_uuid is None:
+            self.args.osd_uuid = str(uuid.uuid4())
+
+    def set_type(self):
+        dmode = os.stat(self.args.data).st_mode
+
+        if stat.S_ISDIR(dmode):
+            self.type = self.FILE
+        elif stat.S_ISBLK(dmode):
+            self.type = self.DEVICE
+        else:
+            raise Error('not a dir or block device', args.data)
+
+    def is_file(self):
+        return self.type == self.FILE
+
+    def is_device(self):
+        return self.type == self.DEVICE
+
+    @staticmethod
+    def parser():
+        parser = argparse.ArgumentParser(add_help=False)
+        parser.add_argument(
+            '--fs-type',
+            help='file system type to use (e.g. "ext4")',
+        )
+        parser.add_argument(
+            '--zap-disk',
+            action='store_true', default=None,
+            help='destroy the partition table (and content) of a disk',
+        )
+        parser.add_argument(
+            '--data-dir',
+            action='store_true', default=None,
+            help='verify that DATA is a dir',
+        )
+        parser.add_argument(
+            '--data-dev',
+            action='store_true', default=None,
+            help='verify that DATA is a block device',
+        )
+        parser.add_argument(
+            'data',
+            metavar='DATA',
+            help='path to OSD data (a disk block device or directory)',
+        )
+        return parser
+
+    def populate_data_path_file(self, path, *to_prepare_list):
+        self.populate_data_path(path, *to_prepare_list)
+
+    def populate_data_path(self, path, *to_prepare_list):
+        if os.path.exists(os.path.join(path, 'magic')):
+            LOG.debug('Data dir %s already exists', path)
+            return
+        else:
+            LOG.debug('Preparing osd data dir %s', path)
+
+        if self.args.osd_uuid is None:
+            self.args.osd_uuid = str(uuid.uuid4())
+
+        write_one_line(path, 'ceph_fsid', self.args.cluster_uuid)
+        write_one_line(path, 'fsid', self.args.osd_uuid)
+        write_one_line(path, 'magic', CEPH_OSD_ONDISK_MAGIC)
+
+        for to_prepare in to_prepare_list:
+            to_prepare.populate_data_path(path)
+
+    def prepare(self, *to_prepare_list):
+        if self.type == self.DEVICE:
+            self.prepare_device(*to_prepare_list)
+        elif self.type == self.FILE:
+            self.prepare_file(*to_prepare_list)
+        else:
+            raise Error('unexpected type ', self.type)
+
+    def prepare_file(self, *to_prepare_list):
+
+        if not os.path.exists(self.args.data):
+            raise Error('data path for directory does not exist',
+                        self.args.data)
+
+        if self.args.data_dev:
+            raise Error('data path is not a block device', self.args.data)
+
+        for to_prepare in to_prepare_list:
+            to_prepare.prepare()
+
+        self.populate_data_path_file(self.args.data, *to_prepare_list)
+
+    def sanity_checks(self):
+        if not os.path.exists(self.args.data):
+            raise Error('data path for device does not exist',
+                        self.args.data)
+        verify_not_in_use(self.args.data, True)
+
+    def set_variables(self):
+        if self.args.fs_type is None:
+            self.args.fs_type = get_conf(
+                cluster=self.args.cluster,
+                variable='osd_mkfs_type',
+            )
+            if self.args.fs_type is None:
+                self.args.fs_type = get_conf(
+                    cluster=self.args.cluster,
+                    variable='osd_fs_type',
+                )
+            if self.args.fs_type is None:
+                self.args.fs_type = DEFAULT_FS_TYPE
+
+        self.mkfs_args = get_conf(
+            cluster=self.args.cluster,
+            variable='osd_mkfs_options_{fstype}'.format(
+                fstype=self.args.fs_type,
+            ),
+        )
+        if self.mkfs_args is None:
+            self.mkfs_args = get_conf(
+                cluster=self.args.cluster,
+                variable='osd_fs_mkfs_options_{fstype}'.format(
+                    fstype=self.args.fs_type,
+                ),
+            )
+
+        self.mount_options = get_conf(
+            cluster=self.args.cluster,
+            variable='osd_mount_options_{fstype}'.format(
+                fstype=self.args.fs_type,
+            ),
+        )
+        if self.mount_options is None:
+            self.mount_options = get_conf(
+                cluster=self.args.cluster,
+                variable='osd_fs_mount_options_{fstype}'.format(
+                    fstype=self.args.fs_type,
+                ),
+            )
+        else:
+            # remove whitespaces
+            self.mount_options = "".join(self.mount_options.split())
+
+        if self.args.osd_uuid is None:
+            self.args.osd_uuid = str(uuid.uuid4())
+
+    def prepare_device(self, *to_prepare_list):
+        self.sanity_checks()
+        self.set_variables()
+        if self.args.zap_disk is not None:
+            zap(self.args.data)
+
+    def create_data_partition(self):
+        device = Device.factory(self.args.data, self.args)
+        partition_number = 1
+        device.create_partition(uuid=self.args.osd_uuid,
+                                name='data',
+                                num=partition_number,
+                                size=self.get_space_size())
+        return device.get_partition(partition_number)
+
+    def set_data_partition(self):
+        if is_partition(self.args.data):
+            LOG.debug('OSD data device %s is a partition',
+                      self.args.data)
+            self.partition = DevicePartition.factory(
+                path=None, dev=self.args.data, args=self.args)
+            ptype = partition.get_ptype()
+            if ptype != ptype_osd:
+                LOG.warning('incorrect partition UUID: %s, expected %s'
+                            % (ptype, ptype_osd))
+        else:
+            LOG.debug('Creating osd partition on %s',
+                      self.args.data)
+            self.partition = self.create_data_partition()
+
+    def populate_data_path_device(self, *to_prepare_list):
+        partition = self.partition
+
+        if isinstance(partition, DevicePartitionCrypt):
+            partition.map()
+
+        try:
+            args = [
+                'mkfs',
+                '-t',
+                self.args.fs_type,
+            ]
+            if self.mkfs_args is not None:
+                args.extend(self.mkfs_args.split())
+                if self.args.fs_type == 'xfs':
+                    args.extend(['-f'])  # always force
+            else:
+                args.extend(MKFS_ARGS.get(self.args.fs_type, []))
+            args.extend([
+                '--',
+                partition.get_dev(),
+            ])
+            try:
+                LOG.debug('Creating %s fs on %s',
+                          self.args.fs_type, partition.get_dev())
+                command_check_call(args)
+            except subprocess.CalledProcessError as e:
+                raise Error(e)
+
+            path = mount(dev=partition.get_dev(),
+                         fstype=self.args.fs_type,
+                         options=self.mount_options)
+
+            try:
+                self.populate_data_path(path, *to_prepare_list)
+            finally:
+                path_set_context(path)
+                unmount(path)
+        finally:
+            if isinstance(partition, DevicePartitionCrypt):
+                partition.unmap()
+
+        if not is_partition(self.args.data):
+            try:
+                command_check_call(
+                    [
+                        'sgdisk',
+                        '--typecode=%d:%s' % (partition.get_partition_number(),
+                                              partition.ptype_for_name('osd')),
+                        '--',
+                        self.args.data,
+                    ],
+                )
+            except subprocess.CalledProcessError as e:
+                raise Error(e)
+            update_partition(self.args.data, 'prepared')
+            command_check_call(['udevadm', 'trigger',
+                                '--action=add',
+                                '--sysname-match',
+                                os.path.basename(partition.rawdev)])
+
+
+class PrepareFilestoreData(PrepareData):
+
+    def get_space_size(self):
+        return 0  # get as much space as possible
+
+    def prepare_device(self, *to_prepare_list):
+        super(PrepareFilestoreData, self).prepare_device(*to_prepare_list)
+        for to_prepare in to_prepare_list:
+            to_prepare.prepare()
+        self.set_data_partition()
+        self.populate_data_path_device(*to_prepare_list)
+
+
+class PrepareBluestoreData(PrepareData):
+
+    def get_space_size(self):
+        return 100  # MB
+
+    def prepare_device(self, *to_prepare_list):
+        super(PrepareBluestoreData, self).prepare_device(*to_prepare_list)
+        self.set_data_partition()
+        for to_prepare in to_prepare_list:
+            to_prepare.prepare()
+        self.populate_data_path_device(*to_prepare_list)
+
+    def populate_data_path(self, path, *to_prepare_list):
+        super(PrepareBluestoreData, self).populate_data_path(path,
+                                                             *to_prepare_list)
+        write_one_line(path, 'type', 'bluestore')
+
+
+def mkfs(
+    path,
+    cluster,
+    osd_id,
+    fsid,
+    keyring,
+):
+    monmap = os.path.join(path, 'activate.monmap')
+    command_check_call(
+        [
+            'ceph',
+            '--cluster', cluster,
+            '--name', 'client.bootstrap-osd',
+            '--keyring', keyring,
+            'mon', 'getmap', '-o', monmap,
+        ],
+    )
+
+    osd_type = read_one_line(path, 'type')
+
+    if osd_type == 'bluestore':
+        command_check_call(
+            [
+                'ceph-osd',
+                '--cluster', cluster,
+                '--mkfs',
+                '--mkkey',
+                '-i', osd_id,
+                '--monmap', monmap,
+                '--osd-data', path,
+                '--osd-uuid', fsid,
+                '--keyring', os.path.join(path, 'keyring'),
+                '--setuser', get_ceph_user(),
+                '--setgroup', get_ceph_user(),
+            ],
+        )
+    else:
+        command_check_call(
+            [
+                'ceph-osd',
+                '--cluster', cluster,
+                '--mkfs',
+                '--mkkey',
+                '-i', osd_id,
+                '--monmap', monmap,
+                '--osd-data', path,
+                '--osd-journal', os.path.join(path, 'journal'),
+                '--osd-uuid', fsid,
+                '--keyring', os.path.join(path, 'keyring'),
+                '--setuser', get_ceph_user(),
+                '--setgroup', get_ceph_group(),
+            ],
+        )
+
+
+def auth_key(
+    path,
+    cluster,
+    osd_id,
+    keyring,
+):
+    try:
+        # try dumpling+ cap scheme
+        command_check_call(
+            [
+                'ceph',
+                '--cluster', cluster,
+                '--name', 'client.bootstrap-osd',
+                '--keyring', keyring,
+                'auth', 'add', 'osd.{osd_id}'.format(osd_id=osd_id),
+                '-i', os.path.join(path, 'keyring'),
+                'osd', 'allow *',
+                'mon', 'allow profile osd',
+            ],
+        )
+    except subprocess.CalledProcessError as err:
+        if err.returncode == errno.EINVAL:
+            # try old cap scheme
+            command_check_call(
+                [
+                    'ceph',
+                    '--cluster', cluster,
+                    '--name', 'client.bootstrap-osd',
+                    '--keyring', keyring,
+                    'auth', 'add', 'osd.{osd_id}'.format(osd_id=osd_id),
+                    '-i', os.path.join(path, 'keyring'),
+                    'osd', 'allow *',
+                    'mon', 'allow rwx',
+                ],
+            )
+        else:
+            raise
+
+
+def get_mount_point(cluster, osd_id):
+    parent = STATEDIR + '/osd'
+    return os.path.join(
+        parent,
+        '{cluster}-{osd_id}'.format(cluster=cluster, osd_id=osd_id),
+    )
+
+
+def move_mount(
+    dev,
+    path,
+    cluster,
+    osd_id,
+    fstype,
+    mount_options,
+):
+    LOG.debug('Moving mount to final location...')
+    osd_data = get_mount_point(cluster, osd_id)
+    maybe_mkdir(osd_data)
+
+    # pick best-of-breed mount options based on fs type
+    if mount_options is None:
+        mount_options = MOUNT_OPTIONS.get(fstype, '')
+
+    # we really want to mount --move, but that is not supported when
+    # the parent mount is shared, as it is by default on RH, Fedora,
+    # and probably others.  Also, --bind doesn't properly manipulate
+    # /etc/mtab, which *still* isn't a symlink to /proc/mounts despite
+    # this being 2013.  Instead, mount the original device at the final
+    # location.
+    command_check_call(
+        [
+            '/bin/mount',
+            '-o',
+            mount_options,
+            '--',
+            dev,
+            osd_data,
+        ],
+    )
+    command_check_call(
+        [
+            '/bin/umount',
+            '-l',   # lazy, in case someone else is peeking at the
+                    # wrong moment
+            '--',
+            path,
+        ],
+    )
+
+
+def start_daemon(
+    cluster,
+    osd_id,
+):
+    LOG.debug('Starting %s osd.%s...', cluster, osd_id)
+
+    path = (STATEDIR + '/osd/{cluster}-{osd_id}').format(
+        cluster=cluster, osd_id=osd_id)
+
+    try:
+        if os.path.exists(os.path.join(path, 'upstart')):
+            command_check_call(
+                [
+                    '/sbin/initctl',
+                    # use emit, not start, because start would fail if the
+                    # instance was already running
+                    'emit',
+                    # since the daemon starting doesn't guarantee much about
+                    # the service being operational anyway, don't bother
+                    # waiting for it
+                    '--no-wait',
+                    '--',
+                    'ceph-osd',
+                    'cluster={cluster}'.format(cluster=cluster),
+                    'id={osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+        elif os.path.exists(os.path.join(path, 'sysvinit')):
+            if os.path.exists('/usr/sbin/service'):
+                svc = '/usr/sbin/service'
+            else:
+                svc = '/sbin/service'
+            command_check_call(
+                [
+                    svc,
+                    'ceph',
+                    '--cluster',
+                    '{cluster}'.format(cluster=cluster),
+                    'start',
+                    'osd.{osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+        elif os.path.exists(os.path.join(path, 'systemd')):
+            command_check_call(
+                [
+                    'systemctl',
+                    'enable',
+                    'ceph-osd@{osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+            command_check_call(
+                [
+                    'systemctl',
+                    'start',
+                    'ceph-osd@{osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+        else:
+            raise Error('{cluster} osd.{osd_id} is not tagged '
+                        'with an init system'.format(
+                            cluster=cluster,
+                            osd_id=osd_id,
+                        ))
+    except subprocess.CalledProcessError as e:
+        raise Error('ceph osd start failed', e)
+
+
+def stop_daemon(
+    cluster,
+    osd_id,
+):
+    LOG.debug('Stoping %s osd.%s...', cluster, osd_id)
+
+    path = (STATEDIR + '/osd/{cluster}-{osd_id}').format(
+        cluster=cluster, osd_id=osd_id)
+
+    try:
+        if os.path.exists(os.path.join(path, 'upstart')):
+            command_check_call(
+                [
+                    '/sbin/initctl',
+                    'stop',
+                    'ceph-osd',
+                    'cluster={cluster}'.format(cluster=cluster),
+                    'id={osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+        elif os.path.exists(os.path.join(path, 'sysvinit')):
+            svc = which('service')
+            command_check_call(
+                [
+                    svc,
+                    'ceph',
+                    '--cluster',
+                    '{cluster}'.format(cluster=cluster),
+                    'stop',
+                    'osd.{osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+        elif os.path.exists(os.path.join(path, 'systemd')):
+            command_check_call(
+                [
+                    'systemctl',
+                    'disable',
+                    'ceph-osd@{osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+            command_check_call(
+                [
+                    'systemctl',
+                    'stop',
+                    'ceph-osd@{osd_id}'.format(osd_id=osd_id),
+                ],
+            )
+        else:
+            raise Error('{cluster} osd.{osd_id} is not tagged with an init '
+                        ' system'.format(cluster=cluster, osd_id=osd_id))
+    except subprocess.CalledProcessError as e:
+        raise Error('ceph osd stop failed', e)
+
+
+def detect_fstype(
+    dev,
+):
+    fstype = _check_output(
+        args=[
+            '/sbin/blkid',
+            # we don't want stale cached results
+            '-p',
+            '-s', 'TYPE',
+            '-o', 'value',
+            '--',
+            dev,
+        ],
+    )
+    fstype = must_be_one_line(fstype)
+    return fstype
+
+
+def dmcrypt_map(dev, dmcrypt_key_dir):
+    ptype = get_partition_type(dev)
+    if ptype in Ptype.get_ready_by_type('plain'):
+        luks = False
+        cryptsetup_parameters = ['--key-size', '256']
+    elif ptype in Ptype.get_ready_by_type('luks'):
+        luks = True
+        cryptsetup_parameters = []
+    else:
+        raise Error('--dmcrypt called for dev %s with invalid ptype %s'
+                    % (dev, ptype))
+    part_uuid = get_partition_uuid(dev)
+    dmcrypt_key_path = get_dmcrypt_key_path(part_uuid, dmcrypt_key_dir, luks)
+    return _dmcrypt_map(
+        rawdev=dev,
+        keypath=dmcrypt_key_path,
+        _uuid=part_uuid,
+        cryptsetup_parameters=cryptsetup_parameters,
+        luks=luks,
+        format_dev=False,
+    )
+
+
+def mount_activate(
+    dev,
+    activate_key_template,
+    init,
+    dmcrypt,
+    dmcrypt_key_dir,
+    reactivate=False,
+):
+
+    if dmcrypt:
+        part_uuid = get_partition_uuid(dev)
+        dev = dmcrypt_map(dev, dmcrypt_key_dir)
+    try:
+        fstype = detect_fstype(dev=dev)
+    except (subprocess.CalledProcessError,
+            TruncatedLineError,
+            TooManyLinesError) as e:
+        raise FilesystemTypeError(
+            'device {dev}'.format(dev=dev),
+            e,
+        )
+
+    # TODO always using mount options from cluster=ceph for
+    # now; see http://tracker.newdream.net/issues/3253
+    mount_options = get_conf(
+        cluster='ceph',
+        variable='osd_mount_options_{fstype}'.format(
+            fstype=fstype,
+        ),
+    )
+
+    if mount_options is None:
+        mount_options = get_conf(
+            cluster='ceph',
+            variable='osd_fs_mount_options_{fstype}'.format(
+                fstype=fstype,
+            ),
+        )
+
+    # remove whitespaces from mount_options
+    if mount_options is not None:
+        mount_options = "".join(mount_options.split())
+
+    path = mount(dev=dev, fstype=fstype, options=mount_options)
+
+    # check if the disk is deactive, change the journal owner, group
+    # mode for correct user and group.
+    if os.path.exists(os.path.join(path, 'deactive')):
+        # logging to syslog will help us easy to know udev triggered failure
+        if not reactivate:
+            unmount(path)
+            # we need to unmap again because dmcrypt map will create again
+            # on bootup stage (due to deactivate)
+            if '/dev/mapper/' in dev:
+                part_uuid = dev.replace('/dev/mapper/', '')
+                dmcrypt_unmap(part_uuid)
+            LOG.info('OSD deactivated! reactivate with: --reactivate')
+            raise Error('OSD deactivated! reactivate with: --reactivate')
+        # flag to activate a deactive osd.
+        deactive = True
+    else:
+        deactive = False
+
+    osd_id = None
+    cluster = None
+    try:
+        (osd_id, cluster) = activate(path, activate_key_template, init)
+
+        # Now active successfully
+        # If we got reactivate and deactive, remove the deactive file
+        if deactive and reactivate:
+            os.remove(os.path.join(path, 'deactive'))
+            LOG.info('Remove `deactive` file.')
+
+        # check if the disk is already active, or if something else is already
+        # mounted there
+        active = False
+        other = False
+        src_dev = os.stat(path).st_dev
+        try:
+            dst_dev = os.stat((STATEDIR + '/osd/{cluster}-{osd_id}').format(
+                cluster=cluster,
+                osd_id=osd_id)).st_dev
+            if src_dev == dst_dev:
+                active = True
+            else:
+                parent_dev = os.stat(STATEDIR + '/osd').st_dev
+                if dst_dev != parent_dev:
+                    other = True
+                elif os.listdir(get_mount_point(cluster, osd_id)):
+                    LOG.info(get_mount_point(cluster, osd_id) +
+                             " is not empty, won't override")
+                    other = True
+
+        except OSError:
+            pass
+
+        if active:
+            LOG.info('%s osd.%s already mounted in position; unmounting ours.'
+                     % (cluster, osd_id))
+            unmount(path)
+        elif other:
+            raise Error('another %s osd.%s already mounted in position '
+                        '(old/different cluster instance?); unmounting ours.'
+                        % (cluster, osd_id))
+        else:
+            move_mount(
+                dev=dev,
+                path=path,
+                cluster=cluster,
+                osd_id=osd_id,
+                fstype=fstype,
+                mount_options=mount_options,
+            )
+        return (cluster, osd_id)
+
+    except:
+        LOG.error('Failed to activate')
+        unmount(path)
+        raise
+    finally:
+        # remove our temp dir
+        if os.path.exists(path):
+            os.rmdir(path)
+
+
+def activate_dir(
+    path,
+    activate_key_template,
+    init,
+):
+
+    if not os.path.exists(path):
+        raise Error(
+            'directory %s does not exist' % path
+        )
+
+    (osd_id, cluster) = activate(path, activate_key_template, init)
+
+    if init not in (None, 'none'):
+        canonical = (STATEDIR + '/osd/{cluster}-{osd_id}').format(
+            cluster=cluster,
+            osd_id=osd_id)
+        if path != canonical:
+            # symlink it from the proper location
+            create = True
+            if os.path.lexists(canonical):
+                old = os.readlink(canonical)
+                if old != path:
+                    LOG.debug('Removing old symlink %s -> %s', canonical, old)
+                    try:
+                        os.unlink(canonical)
+                    except:
+                        raise Error('unable to remove old symlink', canonical)
+                else:
+                    create = False
+            if create:
+                LOG.debug('Creating symlink %s -> %s', canonical, path)
+                try:
+                    os.symlink(path, canonical)
+                except:
+                    raise Error('unable to create symlink %s -> %s'
+                                % (canonical, path))
+
+    return (cluster, osd_id)
+
+
+def find_cluster_by_uuid(_uuid):
+    """
+    Find a cluster name by searching /etc/ceph/*.conf for a conf file
+    with the right uuid.
+    """
+    _uuid = _uuid.lower()
+    no_fsid = []
+    if not os.path.exists(SYSCONFDIR):
+        return None
+    for conf_file in os.listdir(SYSCONFDIR):
+        if not conf_file.endswith('.conf'):
+            continue
+        cluster = conf_file[:-5]
+        try:
+            fsid = get_fsid(cluster)
+        except Error as e:
+            if e.message != 'getting cluster uuid from configuration failed':
+                raise e
+            no_fsid.append(cluster)
+        else:
+            if fsid == _uuid:
+                return cluster
+    # be tolerant of /etc/ceph/ceph.conf without an fsid defined.
+    if len(no_fsid) == 1 and no_fsid[0] == 'ceph':
+        LOG.warning('No fsid defined in ' + SYSCONFDIR +
+                    '/ceph.conf; using anyway')
+        return 'ceph'
+    return None
+
+
+def activate(
+    path,
+    activate_key_template,
+    init,
+):
+
+    check_osd_magic(path)
+
+    ceph_fsid = read_one_line(path, 'ceph_fsid')
+    if ceph_fsid is None:
+        raise Error('No cluster uuid assigned.')
+    LOG.debug('Cluster uuid is %s', ceph_fsid)
+
+    cluster = find_cluster_by_uuid(ceph_fsid)
+    if cluster is None:
+        raise Error('No cluster conf found in ' + SYSCONFDIR +
+                    ' with fsid %s' % ceph_fsid)
+    LOG.debug('Cluster name is %s', cluster)
+
+    fsid = read_one_line(path, 'fsid')
+    if fsid is None:
+        raise Error('No OSD uuid assigned.')
+    LOG.debug('OSD uuid is %s', fsid)
+
+    keyring = activate_key_template.format(cluster=cluster,
+                                           statedir=STATEDIR)
+
+    osd_id = get_osd_id(path)
+    if osd_id is None:
+        osd_id = allocate_osd_id(
+            cluster=cluster,
+            fsid=fsid,
+            keyring=keyring,
+        )
+        write_one_line(path, 'whoami', osd_id)
+    LOG.debug('OSD id is %s', osd_id)
+
+    if not os.path.exists(os.path.join(path, 'ready')):
+        LOG.debug('Initializing OSD...')
+        # re-running mkfs is safe, so just run until it completes
+        mkfs(
+            path=path,
+            cluster=cluster,
+            osd_id=osd_id,
+            fsid=fsid,
+            keyring=keyring,
+        )
+
+    if init not in (None, 'none'):
+        if init == 'auto':
+            conf_val = get_conf(
+                cluster=cluster,
+                variable='init'
+            )
+            if conf_val is not None:
+                init = conf_val
+            else:
+                init = init_get()
+
+        LOG.debug('Marking with init system %s', init)
+        with file(os.path.join(path, init), 'w'):
+            pass
+
+    # remove markers for others, just in case.
+    for other in INIT_SYSTEMS:
+        if other != init:
+            try:
+                os.unlink(os.path.join(path, other))
+            except OSError:
+                pass
+
+    if not os.path.exists(os.path.join(path, 'active')):
+        LOG.debug('Authorizing OSD key...')
+        auth_key(
+            path=path,
+            cluster=cluster,
+            osd_id=osd_id,
+            keyring=keyring,
+        )
+        write_one_line(path, 'active', 'ok')
+    LOG.debug('%s osd.%s data dir is ready at %s', cluster, osd_id, path)
+    return (osd_id, cluster)
+
+
+def main_activate(args):
+    cluster = None
+    osd_id = None
+
+    if not os.path.exists(args.path):
+        raise Error('%s does not exist' % args.path)
+
+    if is_suppressed(args.path):
+        LOG.info('suppressed activate request on %s', args.path)
+        return
+
+    activate_lock.acquire()  # noqa
+    try:
+        mode = os.stat(args.path).st_mode
+        if stat.S_ISBLK(mode):
+            if (is_partition(args.path) and
+                    (get_partition_type(args.path) ==
+                     PTYPE['mpath']['osd']['ready']) and
+                    not is_mpath(args.path)):
+                raise Error('%s is not a multipath block device' %
+                            args.path)
+            (cluster, osd_id) = mount_activate(
+                dev=args.path,
+                activate_key_template=args.activate_key_template,
+                init=args.mark_init,
+                dmcrypt=args.dmcrypt,
+                dmcrypt_key_dir=args.dmcrypt_key_dir,
+                reactivate=args.reactivate,
+            )
+            osd_data = get_mount_point(cluster, osd_id)
+
+        elif stat.S_ISDIR(mode):
+            (cluster, osd_id) = activate_dir(
+                path=args.path,
+                activate_key_template=args.activate_key_template,
+                init=args.mark_init,
+            )
+            osd_data = args.path
+
+        else:
+            raise Error('%s is not a directory or block device' % args.path)
+
+        if (not args.no_start_daemon and args.mark_init == 'none'):
+            command_check_call(
+                [
+                    'ceph-osd',
+                    '--cluster={cluster}'.format(cluster=cluster),
+                    '--id={osd_id}'.format(osd_id=osd_id),
+                    '--osd-data={path}'.format(path=osd_data),
+                    '--osd-journal={path}/journal'.format(path=osd_data),
+                ],
+            )
+
+        if (not args.no_start_daemon and
+                args.mark_init not in (None, 'none')):
+
+            start_daemon(
+                cluster=cluster,
+                osd_id=osd_id,
+            )
+
+    finally:
+        activate_lock.release()  # noqa
+
+
+###########################
+
+def _mark_osd_out(cluster, osd_id):
+    LOG.info('Prepare to mark osd.%d out...', osd_id)
+    command([
+        'ceph',
+        'osd',
+        'out',
+        'osd.%d' % osd_id,
+    ])
+
+
+def _check_osd_status(cluster, osd_id):
+    """
+    report the osd status:
+    00(0) : means OSD OUT AND DOWN
+    01(1) : means OSD OUT AND UP
+    10(2) : means OSD IN AND DOWN
+    11(3) : means OSD IN AND UP
+    """
+    LOG.info("Checking osd id: %s ..." % osd_id)
+    found = False
+    status_code = 0
+    out, err, ret = command([
+        'ceph',
+        'osd',
+        'dump',
+        '--cluster={cluster}'.format(
+            cluster=cluster,
+        ),
+        '--format',
+        'json',
+    ])
+    out_json = json.loads(out)
+    for item in out_json[u'osds']:
+        if item.get(u'osd') == int(osd_id):
+            found = True
+            if item.get(u'in') is 1:
+                status_code += 2
+            if item.get(u'up') is 1:
+                status_code += 1
+    if not found:
+        raise Error('Could not osd.%s in osd tree!' % osd_id)
+    return status_code
+
+
+def _remove_osd_directory_files(mounted_path, cluster):
+    """
+    To remove the 'ready', 'active', INIT-specific files.
+    """
+    if os.path.exists(os.path.join(mounted_path, 'ready')):
+        os.remove(os.path.join(mounted_path, 'ready'))
+        LOG.info('Remove `ready` file.')
+    else:
+        LOG.info('`ready` file is already removed.')
+
+    if os.path.exists(os.path.join(mounted_path, 'active')):
+        os.remove(os.path.join(mounted_path, 'active'))
+        LOG.info('Remove `active` file.')
+    else:
+        LOG.info('`active` file is already removed.')
+
+    # Just check `upstart` and `sysvinit` directly if filename is init-spec.
+    conf_val = get_conf(
+        cluster=cluster,
+        variable='init'
+    )
+    if conf_val is not None:
+        init = conf_val
+    else:
+        init = init_get()
+    os.remove(os.path.join(mounted_path, init))
+    LOG.info('Remove `%s` file.', init)
+    return
+
+
+def main_deactivate(args):
+    activate_lock.acquire()  # noqa
+    try:
+        main_deactivate_locked(args)
+    finally:
+        activate_lock.release()  # noqa
+
+
+def main_deactivate_locked(args):
+    osd_id = args.deactivate_by_id
+    path = args.path
+    target_dev = None
+    dmcrypt = False
+    devices = list_devices()
+
+    # list all devices and found we need
+    for device in devices:
+        if 'partitions' in device:
+            for dev_part in device.get('partitions'):
+                if (osd_id and
+                        'whoami' in dev_part and
+                        dev_part['whoami'] == osd_id):
+                    target_dev = dev_part
+                elif (path and
+                        'path' in dev_part and
+                        dev_part['path'] == path):
+                    target_dev = dev_part
+    if not target_dev:
+        raise Error('Cannot find any match device!!')
+
+    # set up all we need variable
+    osd_id = target_dev['whoami']
+    part_type = target_dev['ptype']
+    mounted_path = target_dev['mount']
+    if Ptype.is_dmcrypt(part_type, 'osd'):
+        dmcrypt = True
+
+    # Do not do anything if osd is already down.
+    status_code = _check_osd_status(args.cluster, osd_id)
+    if status_code == OSD_STATUS_IN_UP:
+        if args.mark_out is True:
+            _mark_osd_out(args.cluster, int(osd_id))
+        stop_daemon(args.cluster, osd_id)
+    elif status_code == OSD_STATUS_IN_DOWN:
+        if args.mark_out is True:
+            _mark_osd_out(args.cluster, int(osd_id))
+        LOG.info("OSD already out/down. Do not do anything now.")
+        return
+    elif status_code == OSD_STATUS_OUT_UP:
+        stop_daemon(args.cluster, osd_id)
+    elif status_code == OSD_STATUS_OUT_DOWN:
+        LOG.info("OSD already out/down. Do not do anything now.")
+        return
+
+    # remove 'ready', 'active', and INIT-specific files.
+    _remove_osd_directory_files(mounted_path, args.cluster)
+
+    # Write deactivate to osd directory!
+    with open(os.path.join(mounted_path, 'deactive'), 'w'):
+        path_set_context(os.path.join(mounted_path, 'deactive'))
+
+    unmount(mounted_path)
+    LOG.info("Umount `%s` successfully.", mounted_path)
+
+    if dmcrypt:
+        dmcrypt_unmap(target_dev['uuid'])
+        for name in Space.NAMES:
+            if name + '_uuid' in target_dev:
+                dmcrypt_unmap(target_dev[name + '_uuid'])
+
+###########################
+
+
+def _remove_from_crush_map(cluster, osd_id):
+    LOG.info("Prepare to remove osd.%s from crush map..." % osd_id)
+    command([
+        'ceph',
+        'osd',
+        'crush',
+        'remove',
+        'osd.%s' % osd_id,
+    ])
+
+
+def _delete_osd_auth_key(cluster, osd_id):
+    LOG.info("Prepare to delete osd.%s cephx key..." % osd_id)
+    command([
+        'ceph',
+        'auth',
+        'del',
+        'osd.%s' % osd_id,
+    ])
+
+
+def _deallocate_osd_id(cluster, osd_id):
+    LOG.info("Prepare to deallocate the osd-id: %s..." % osd_id)
+    command([
+        'ceph',
+        'osd',
+        'rm',
+        '%s' % osd_id,
+    ])
+
+
+def destroy_lookup_device(args, predicate, description):
+    devices = list_devices()
+    for device in devices:
+        for partition in device.get('partitions', []):
+            if partition['dmcrypt']:
+                dmcrypt_path = dmcrypt_map(partition['path'],
+                                           args.dmcrypt_key_dir)
+                list_dev_osd(dmcrypt_path, {}, partition)
+                dmcrypt_unmap(partition['uuid'])
+            if predicate(partition):
+                return partition
+    raise Error('found no device matching ', description)
+
+
+def main_destroy(args):
+    osd_id = args.destroy_by_id
+    path = args.path
+    dmcrypt = False
+    target_dev = None
+
+    if path:
+        if not is_partition(path):
+            raise Error(path + " must be a partition device")
+        path = os.path.realpath(path)
+
+    if path:
+        target_dev = destroy_lookup_device(
+            args, lambda x: x.get('path') == path,
+            path)
+    elif osd_id:
+        target_dev = destroy_lookup_device(
+            args, lambda x: x.get('whoami') == osd_id,
+            'osd id ' + str(osd_id))
+
+    osd_id = target_dev['whoami']
+    dev_path = target_dev['path']
+    if target_dev['ptype'] == PTYPE['mpath']['osd']['ready']:
+        base_dev = get_partition_base_mpath(dev_path)
+    else:
+        base_dev = get_partition_base(dev_path)
+
+    # Before osd deactivate, we cannot destroy it
+    status_code = _check_osd_status(args.cluster, osd_id)
+    if status_code != OSD_STATUS_OUT_DOWN and \
+       status_code != OSD_STATUS_IN_DOWN:
+        raise Error("Could not destroy the active osd. (osd-id: %s)" %
+                    osd_id)
+
+    # Remove OSD from crush map
+    _remove_from_crush_map(args.cluster, osd_id)
+
+    # Remove OSD cephx key
+    _delete_osd_auth_key(args.cluster, osd_id)
+
+    # Deallocate OSD ID
+    _deallocate_osd_id(args.cluster, osd_id)
+
+    # we remove the crypt map and device mapper (if dmcrypt is True)
+    if dmcrypt:
+        for name in Space.NAMES:
+            if target_dev.get(name + '_uuid'):
+                dmcrypt_unmap(target_dev[name + '_uuid'])
+
+    # Check zap flag. If we found zap flag, we need to find device for
+    # destroy this osd data.
+    if args.zap is True:
+        # erase the osd data
+        LOG.info("Prepare to zap the device %s" % base_dev)
+        zap(base_dev)
+
+
+def get_space_osd_uuid(name, path):
+    if not os.path.exists(path):
+        raise Error('%s does not exist' % path)
+
+    mode = os.stat(path).st_mode
+    if not stat.S_ISBLK(mode):
+        raise Error('%s is not a block device' % path)
+
+    if (is_partition(path) and
+            get_partition_type(path) in (PTYPE['mpath']['journal']['ready'],
+                                         PTYPE['mpath']['block']['ready']) and
+            not is_mpath(path)):
+        raise Error('%s is not a multipath block device' %
+                    path)
+
+    try:
+        out = _check_output(
+            args=[
+                'ceph-osd',
+                '--get-device-fsid',
+                path,
+            ],
+            close_fds=True,
+        )
+    except subprocess.CalledProcessError as e:
+        raise Error(
+            'failed to get osd uuid/fsid from %s' % name,
+            e,
+        )
+    value = str(out).split('\n', 1)[0]
+    LOG.debug('%s %s has OSD UUID %s', name.capitalize(), path, value)
+    return value
+
+
+def main_activate_space(name, args):
+    if not os.path.exists(args.dev):
+        raise Error('%s does not exist' % args.dev)
+
+    cluster = None
+    osd_id = None
+    osd_uuid = None
+    dev = None
+    activate_lock.acquire()  # noqa
+    try:
+        if args.dmcrypt:
+            dev = dmcrypt_map(args.dev, args.dmcrypt_key_dir)
+        else:
+            dev = args.dev
+        # FIXME: For an encrypted journal dev, does this return the
+        # cyphertext or plaintext dev uuid!? Also, if the journal is
+        # encrypted, is the data partition also always encrypted, or
+        # are mixed pairs supported!?
+        osd_uuid = get_space_osd_uuid(name, dev)
+        path = os.path.join('/dev/disk/by-partuuid/', osd_uuid.lower())
+
+        if is_suppressed(path):
+            LOG.info('suppressed activate request on %s', path)
+            return
+
+        (cluster, osd_id) = mount_activate(
+            dev=path,
+            activate_key_template=args.activate_key_template,
+            init=args.mark_init,
+            dmcrypt=args.dmcrypt,
+            dmcrypt_key_dir=args.dmcrypt_key_dir,
+            reactivate=args.reactivate,
+        )
+
+        start_daemon(
+            cluster=cluster,
+            osd_id=osd_id,
+        )
+
+    finally:
+        activate_lock.release()  # noqa
+
+
+###########################
+
+
+def main_activate_all(args):
+    dir = '/dev/disk/by-parttypeuuid'
+    LOG.debug('Scanning %s', dir)
+    if not os.path.exists(dir):
+        return
+    err = False
+    for name in os.listdir(dir):
+        if name.find('.') < 0:
+            continue
+        (tag, uuid) = name.split('.')
+
+        if tag in Ptype.get_ready_by_name('osd'):
+
+            if Ptype.is_dmcrypt(tag, 'osd'):
+                path = os.path.join('/dev/mapper', uuid)
+            else:
+                path = os.path.join(dir, name)
+
+            if is_suppressed(path):
+                LOG.info('suppressed activate request on %s', path)
+                continue
+
+            LOG.info('Activating %s', path)
+            activate_lock.acquire()  # noqa
+            try:
+                # never map dmcrypt cyphertext devices
+                (cluster, osd_id) = mount_activate(
+                    dev=path,
+                    activate_key_template=args.activate_key_template,
+                    init=args.mark_init,
+                    dmcrypt=False,
+                    dmcrypt_key_dir='',
+                )
+                start_daemon(
+                    cluster=cluster,
+                    osd_id=osd_id,
+                )
+
+            except Exception as e:
+                print >> sys.stderr, '{prog}: {msg}'.format(
+                    prog=args.prog,
+                    msg=e,
+                )
+                err = True
+
+            finally:
+                activate_lock.release()  # noqa
+    if err:
+        raise Error('One or more partitions failed to activate')
+
+
+###########################
+
+def is_swap(dev):
+    dev = os.path.realpath(dev)
+    with file('/proc/swaps', 'rb') as proc_swaps:
+        for line in proc_swaps.readlines()[1:]:
+            fields = line.split()
+            if len(fields) < 3:
+                continue
+            swaps_dev = fields[0]
+            if swaps_dev.startswith('/') and os.path.exists(swaps_dev):
+                swaps_dev = os.path.realpath(swaps_dev)
+                if swaps_dev == dev:
+                    return True
+    return False
+
+
+def get_oneliner(base, name):
+    path = os.path.join(base, name)
+    if os.path.isfile(path):
+        with open(path, 'r') as _file:
+            return _file.readline().rstrip()
+    return None
+
+
+def get_dev_fs(dev):
+    fscheck, _, _ = command(
+        [
+            'blkid',
+            '-s',
+            'TYPE',
+            dev,
+        ],
+    )
+    if 'TYPE' in fscheck:
+        fstype = fscheck.split()[1].split('"')[1]
+        return fstype
+    else:
+        return None
+
+
+def split_dev_base_partnum(dev):
+    if is_mpath(dev):
+        partnum = partnum_mpath(dev)
+        base = get_partition_base_mpath(dev)
+    else:
+        b = block_path(dev)
+        partnum = open(os.path.join(b, 'partition')).read().strip()
+        base = get_partition_base(dev)
+    return (base, partnum)
+
+
+def get_partition_type(part):
+    return get_blkid_partition_info(part, 'ID_PART_ENTRY_TYPE')
+
+
+def get_partition_uuid(part):
+    return get_blkid_partition_info(part, 'ID_PART_ENTRY_UUID')
+
+
+def get_blkid_partition_info(dev, what=None):
+    out, _, _ = command(
+        [
+            'blkid',
+            '-o',
+            'udev',
+            '-p',
+            dev,
+        ]
+    )
+    p = {}
+    for line in out.splitlines():
+        (key, value) = line.split('=')
+        p[key] = value
+    if what:
+        return p.get(what)
+    else:
+        return p
+
+
+def more_osd_info(path, uuid_map, desc):
+    desc['ceph_fsid'] = get_oneliner(path, 'ceph_fsid')
+    if desc['ceph_fsid']:
+        desc['cluster'] = find_cluster_by_uuid(desc['ceph_fsid'])
+    desc['whoami'] = get_oneliner(path, 'whoami')
+    for name in Space.NAMES:
+        uuid = get_oneliner(path, name + '_uuid')
+        if uuid:
+            desc[name + '_uuid'] = uuid.lower()
+            if desc[name + '_uuid'] in uuid_map:
+                desc[name + '_dev'] = uuid_map[desc[name + '_uuid']]
+
+
+def list_dev_osd(dev, uuid_map, desc):
+    desc['mount'] = is_mounted(dev)
+    desc['fs_type'] = get_dev_fs(dev)
+    desc['state'] = 'unprepared'
+    if desc['mount']:
+        desc['state'] = 'active'
+        more_osd_info(desc['mount'], uuid_map, desc)
+    elif desc['fs_type']:
+        try:
+            tpath = mount(dev=dev, fstype=desc['fs_type'], options='')
+            if tpath:
+                try:
+                    magic = get_oneliner(tpath, 'magic')
+                    if magic is not None:
+                        desc['magic'] = magic
+                        desc['state'] = 'prepared'
+                        more_osd_info(tpath, uuid_map, desc)
+                finally:
+                    unmount(tpath)
+        except MountError:
+            pass
+
+
+def list_format_more_osd_info_plain(dev):
+    desc = []
+    if dev.get('ceph_fsid'):
+        if dev.get('cluster'):
+            desc.append('cluster ' + dev['cluster'])
+        else:
+            desc.append('unknown cluster ' + dev['ceph_fsid'])
+    if dev.get('whoami'):
+        desc.append('osd.%s' % dev['whoami'])
+    for name in Space.NAMES:
+        if dev.get(name + '_dev'):
+            desc.append(name + ' %s' % dev[name + '_dev'])
+    return desc
+
+
+def list_format_dev_plain(dev, prefix=''):
+    desc = []
+    if dev['ptype'] == PTYPE['regular']['osd']['ready']:
+        desc = (['ceph data', dev['state']] +
+                list_format_more_osd_info_plain(dev))
+    elif Ptype.is_dmcrypt(dev['ptype'], 'osd'):
+        dmcrypt = dev['dmcrypt']
+        if not dmcrypt['holders']:
+            desc = ['ceph data (dmcrypt %s)' % dmcrypt['type'],
+                    'not currently mapped']
+        elif len(dmcrypt['holders']) == 1:
+            holder = get_dev_path(dmcrypt['holders'][0])
+            desc = ['ceph data (dmcrypt %s %s)' %
+                    (dmcrypt['type'], holder)]
+            desc += list_format_more_osd_info_plain(dev)
+        else:
+            desc = ['ceph data (dmcrypt %s)' % dmcrypt['type'],
+                    'holders: ' + ','.join(dmcrypt['holders'])]
+    elif Ptype.is_regular_space(dev['ptype']):
+        name = Ptype.space_ptype_to_name(dev['ptype'])
+        desc.append('ceph ' + name)
+        if dev.get(name + '_for'):
+            desc.append('for %s' % dev[name + '_for'])
+    elif Ptype.is_dmcrypt_space(dev['ptype']):
+        name = Ptype.space_ptype_to_name(dev['ptype'])
+        dmcrypt = dev['dmcrypt']
+        if dmcrypt['holders'] and len(dmcrypt['holders']) == 1:
+            holder = get_dev_path(dmcrypt['holders'][0])
+            desc = ['ceph ' + name + ' (dmcrypt %s %s)' %
+                    (dmcrypt['type'], holder)]
+        else:
+            desc = ['ceph ' + name + ' (dmcrypt %s)' % dmcrypt['type']]
+        if dev.get(name + '_for'):
+            desc.append('for %s' % dev[name + '_for'])
+    else:
+        desc.append(dev['type'])
+        if dev.get('fs_type'):
+            desc.append(dev['fs_type'])
+        elif dev.get('ptype'):
+            desc.append(dev['ptype'])
+        if dev.get('mount'):
+            desc.append('mounted on %s' % dev['mount'])
+    return '%s%s %s' % (prefix, dev['path'], ', '.join(desc))
+
+
+def list_format_plain(devices):
+    lines = []
+    for device in devices:
+        if device.get('partitions'):
+            lines.append('%s :' % device['path'])
+            for p in sorted(device['partitions']):
+                lines.append(list_format_dev_plain(dev=p,
+                                                   prefix=' '))
+        else:
+            lines.append(list_format_dev_plain(dev=device,
+                                               prefix=''))
+    return "\n".join(lines)
+
+
+def list_dev(dev, uuid_map, space_map):
+    info = {
+        'path': dev,
+        'dmcrypt': {},
+    }
+
+    info['is_partition'] = is_partition(dev)
+    if info['is_partition']:
+        ptype = get_partition_type(dev)
+        info['uuid'] = get_partition_uuid(dev)
+    else:
+        ptype = 'unknown'
+    info['ptype'] = ptype
+    LOG.info("list_dev(dev = " + dev + ", ptype = " + str(ptype) + ")")
+    if ptype in (PTYPE['regular']['osd']['ready'],
+                 PTYPE['mpath']['osd']['ready']):
+        info['type'] = 'data'
+        if ptype == PTYPE['mpath']['osd']['ready']:
+            info['multipath'] = True
+        list_dev_osd(dev, uuid_map, info)
+    elif ptype == PTYPE['plain']['osd']['ready']:
+        holders = is_held(dev)
+        info['type'] = 'data'
+        info['dmcrypt']['holders'] = holders
+        info['dmcrypt']['type'] = 'plain'
+        if len(holders) == 1:
+            list_dev_osd(get_dev_path(holders[0]), uuid_map, info)
+    elif ptype == PTYPE['luks']['osd']['ready']:
+        holders = is_held(dev)
+        info['type'] = 'data'
+        info['dmcrypt']['holders'] = holders
+        info['dmcrypt']['type'] = 'LUKS'
+        if len(holders) == 1:
+            list_dev_osd(get_dev_path(holders[0]), uuid_map, info)
+    elif Ptype.is_regular_space(ptype) or Ptype.is_mpath_space(ptype):
+        name = Ptype.space_ptype_to_name(ptype)
+        info['type'] = name
+        if ptype == PTYPE['mpath'][name]['ready']:
+            info['multipath'] = True
+        if info.get('uuid') in space_map:
+            info[name + '_for'] = space_map[info['uuid']]
+    elif Ptype.is_plain_space(ptype):
+        name = Ptype.space_ptype_to_name(ptype)
+        holders = is_held(dev)
+        info['type'] = name
+        info['dmcrypt']['type'] = 'plain'
+        info['dmcrypt']['holders'] = holders
+        if info.get('uuid') in space_map:
+            info[name + '_for'] = space_map[info['uuid']]
+    elif Ptype.is_luks_space(ptype):
+        name = Ptype.space_ptype_to_name(ptype)
+        holders = is_held(dev)
+        info['type'] = name
+        info['dmcrypt']['type'] = 'LUKS'
+        info['dmcrypt']['holders'] = holders
+        if info.get('uuid') in space_map:
+            info[name + '_for'] = space_map[info['uuid']]
+    else:
+        path = is_mounted(dev)
+        fs_type = get_dev_fs(dev)
+        if is_swap(dev):
+            info['type'] = 'swap'
+        else:
+            info['type'] = 'other'
+        if fs_type:
+            info['fs_type'] = fs_type
+        if path:
+            info['mount'] = path
+
+    return info
+
+
+def list_devices():
+    partmap = list_all_partitions()
+
+    uuid_map = {}
+    space_map = {}
+    for base, parts in sorted(partmap.iteritems()):
+        for p in parts:
+            dev = get_dev_path(p)
+            part_uuid = get_partition_uuid(dev)
+            if part_uuid:
+                uuid_map[part_uuid] = dev
+            ptype = get_partition_type(dev)
+            LOG.debug("main_list: " + dev +
+                      " ptype = " + str(ptype) +
+                      " uuid = " + str(part_uuid))
+            if ptype in Ptype.get_ready_by_name('osd'):
+                if Ptype.is_dmcrypt(ptype, 'osd'):
+                    holders = is_held(dev)
+                    if len(holders) != 1:
+                        continue
+                    dev_to_mount = get_dev_path(holders[0])
+                else:
+                    dev_to_mount = dev
+
+                fs_type = get_dev_fs(dev_to_mount)
+                if fs_type is not None:
+                    try:
+                        tpath = mount(dev=dev_to_mount,
+                                      fstype=fs_type, options='')
+                        try:
+                            for name in Space.NAMES:
+                                space_uuid = get_oneliner(tpath,
+                                                          name + '_uuid')
+                                if space_uuid:
+                                    space_map[space_uuid.lower()] = dev
+                        finally:
+                            unmount(tpath)
+                    except MountError:
+                        pass
+
+    LOG.debug("main_list: " + str(partmap) + ", uuid_map = " +
+              str(uuid_map) + ", space_map = " + str(space_map))
+
+    devices = []
+    for base, parts in sorted(partmap.iteritems()):
+        if parts:
+            disk = {'path': get_dev_path(base)}
+            partitions = []
+            for p in sorted(parts):
+                partitions.append(list_dev(get_dev_path(p),
+                                           uuid_map,
+                                           space_map))
+            disk['partitions'] = partitions
+            devices.append(disk)
+        else:
+            device = list_dev(get_dev_path(base), uuid_map, space_map)
+            device['path'] = get_dev_path(base)
+            devices.append(device)
+    LOG.debug("list_devices: " + str(devices))
+    return devices
+
+
+def main_list(args):
+    devices = list_devices()
+    if args.path:
+        paths = []
+        for path in args.path:
+            if os.path.exists(path):
+                paths.append(os.path.realpath(path))
+            else:
+                paths.append(path)
+        selected_devices = []
+        for device in devices:
+            for path in paths:
+                if re.search(path + '$', device['path']):
+                    selected_devices.append(device)
+    else:
+        selected_devices = devices
+    if args.format == 'json':
+        print json.dumps(selected_devices)
+    else:
+        output = list_format_plain(selected_devices)
+        if output:
+            print output
+
+
+###########################
+#
+# Mark devices that we want to suppress activates on with a
+# file like
+#
+#  /var/lib/ceph/tmp/suppress-activate.sdb
+#
+# where the last bit is the sanitized device name (/dev/X without the
+# /dev/ prefix) and the is_suppress() check matches a prefix.  That
+# means suppressing sdb will stop activate on sdb1, sdb2, etc.
+#
+
+def is_suppressed(path):
+    disk = os.path.realpath(path)
+    try:
+        if (not disk.startswith('/dev/') or
+                not stat.S_ISBLK(os.lstat(disk).st_mode)):
+            return False
+        base = get_dev_name(disk)
+        while len(base):
+            if os.path.exists(SUPPRESS_PREFIX + base):  # noqa
+                return True
+            base = base[:-1]
+    except:
+        return False
+
+
+def set_suppress(path):
+    disk = os.path.realpath(path)
+    if not os.path.exists(disk):
+        raise Error('does not exist', path)
+    if not stat.S_ISBLK(os.lstat(path).st_mode):
+        raise Error('not a block device', path)
+    base = get_dev_name(disk)
+
+    with file(SUPPRESS_PREFIX + base, 'w') as f:  # noqa
+        pass
+    LOG.info('set suppress flag on %s', base)
+
+
+def unset_suppress(path):
+    disk = os.path.realpath(path)
+    if not os.path.exists(disk):
+        raise Error('does not exist', path)
+    if not stat.S_ISBLK(os.lstat(path).st_mode):
+        raise Error('not a block device', path)
+    assert disk.startswith('/dev/')
+    base = get_dev_name(disk)
+
+    fn = SUPPRESS_PREFIX + base  # noqa
+    if not os.path.exists(fn):
+        raise Error('not marked as suppressed', path)
+
+    try:
+        os.unlink(fn)
+        LOG.info('unset suppress flag on %s', base)
+    except OSError as e:
+        raise Error('failed to unsuppress', e)
+
+
+def main_suppress(args):
+    set_suppress(args.path)
+
+
+def main_unsuppress(args):
+    unset_suppress(args.path)
+
+
+def main_zap(args):
+    for dev in args.dev:
+        zap(dev)
+
+
+def main_trigger(args):
+    LOG.debug("main_trigger: " + str(args))
+    if is_systemd() and not args.sync:
+        # http://www.freedesktop.org/software/systemd/man/systemd-escape.html
+        escaped_dev = args.dev[1:].replace('-', '\\x2d')
+        service = 'ceph-disk@{dev}.service'.format(dev=escaped_dev)
+        LOG.info('systemd detected, triggering %s' % service)
+        command(
+            [
+                'systemctl',
+                '--no-block',
+                'restart',
+                service,
+            ]
+        )
+        return
+    if is_upstart() and not args.sync:
+        LOG.info('upstart detected, triggering ceph-disk task')
+        command(
+            [
+                'initctl',
+                'emit',
+                'ceph-disk',
+                'dev={dev}'.format(dev=args.dev),
+                'pid={pid}'.format(pid=os.getpid()),
+            ]
+        )
+        return
+
+    parttype = get_partition_type(args.dev)
+    partid = get_partition_uuid(args.dev)
+
+    LOG.info('trigger {dev} parttype {parttype} uuid {partid}'.format(
+        dev=args.dev,
+        parttype=parttype,
+        partid=partid,
+    ))
+
+    if parttype in (PTYPE['regular']['osd']['ready'],
+                    PTYPE['mpath']['osd']['ready']):
+        command(
+            [
+                'ceph-disk',
+                'activate',
+                args.dev,
+            ]
+        )
+    elif parttype in (PTYPE['regular']['journal']['ready'],
+                      PTYPE['mpath']['journal']['ready']):
+        command(
+            [
+                'ceph-disk',
+                'activate-journal',
+                args.dev,
+            ]
+        )
+
+        # journals are easy: map, chown, activate-journal
+    elif parttype == PTYPE['plain']['journal']['ready']:
+        command(
+            [
+                '/sbin/cryptsetup',
+                '--key-file',
+                '/etc/ceph/dmcrypt-keys/{partid}'.format(partid=partid),
+                '--key-size',
+                '256',
+                'create',
+                partid,
+                args.dev,
+            ]
+        )
+        newdev = '/dev/mapper/' + partid
+        count = 0
+        while not os.path.exists(newdev) and count <= 10:
+            time.sleep(1)
+            count += 1
+        command(
+            [
+                '/bin/chown',
+                'ceph:ceph',
+                newdev,
+            ]
+        )
+        command(
+            [
+                '/usr/sbin/ceph-disk',
+                'activate-journal',
+                newdev,
+            ]
+        )
+    elif parttype == PTYPE['luks']['journal']['ready']:
+        command(
+            [
+                '/sbin/cryptsetup',
+                '--key-file',
+                '/etc/ceph/dmcrypt-keys/{partid}.luks.key'.format(
+                    partid=partid),
+                'luksOpen',
+                args.dev,
+                partid,
+            ]
+        )
+        newdev = '/dev/mapper/' + partid
+        count = 0
+        while not os.path.exists(newdev) and count <= 10:
+            time.sleep(1)
+            count += 1
+        command(
+            [
+                '/bin/chown',
+                'ceph:ceph',
+                newdev,
+            ]
+        )
+        command(
+            [
+                '/usr/sbin/ceph-disk',
+                'activate-journal',
+                newdev,
+            ]
+        )
+
+    elif parttype in (PTYPE['regular']['block']['ready'],
+                      PTYPE['mpath']['block']['ready']):
+        command(
+            [
+                'ceph-disk',
+                'activate-block',
+                args.dev,
+            ]
+        )
+
+        # blocks are easy: map, chown, activate-block
+    elif parttype == PTYPE['plain']['block']['ready']:
+        command(
+            [
+                '/sbin/cryptsetup',
+                '--key-file',
+                '/etc/ceph/dmcrypt-keys/{partid}'.format(partid=partid),
+                '--key-size',
+                '256',
+                'create',
+                partid,
+                args.dev,
+            ]
+        )
+        newdev = '/dev/mapper/' + partid
+        count = 0
+        while not os.path.exists(newdev) and count <= 10:
+            time.sleep(1)
+            count += 1
+        command(
+            [
+                '/bin/chown',
+                'ceph:ceph',
+                newdev,
+            ]
+        )
+        command(
+            [
+                '/usr/sbin/ceph-disk',
+                'activate-block',
+                newdev,
+            ]
+        )
+    elif parttype == PTYPE['luks']['block']['ready']:
+        command(
+            [
+                '/sbin/cryptsetup',
+                '--key-file',
+                '/etc/ceph/dmcrypt-keys/{partid}.luks.key'.format(
+                    partid=partid),
+                'luksOpen',
+                args.dev,
+                partid,
+            ]
+        )
+        newdev = '/dev/mapper/' + partid
+        count = 0
+        while not os.path.exists(newdev) and count <= 10:
+            time.sleep(1)
+            count += 1
+        command(
+            [
+                '/bin/chown',
+                'ceph:ceph',
+                newdev,
+            ]
+        )
+        command(
+            [
+                '/usr/sbin/ceph-disk',
+                'activate-block',
+                newdev,
+            ]
+        )
+
+        # osd data: map, activate
+    elif parttype == PTYPE['plain']['osd']['ready']:
+        command(
+            [
+                '/sbin/cryptsetup',
+                '--key-file',
+                '/etc/ceph/dmcrypt-keys/{partid}'.format(partid=partid),
+                '--key-size',
+                '256',
+                'create',
+                partid,
+                args.dev,
+            ]
+        )
+        newdev = '/dev/mapper/' + partid
+        count = 0
+        while not os.path.exists(newdev) and count <= 10:
+            time.sleep(1)
+            count += 1
+        command(
+            [
+                '/usr/sbin/ceph-disk',
+                'activate',
+                newdev,
+            ]
+        )
+
+    elif parttype == PTYPE['luks']['osd']['ready']:
+        command(
+            [
+                '/sbin/cryptsetup',
+                '--key-file',
+                '/etc/ceph/dmcrypt-keys/{partid}.luks.key'.format(
+                    partid=partid),
+                'luksOpen',
+                args.dev,
+                partid,
+            ]
+        )
+        newdev = '/dev/mapper/' + partid
+        count = 0
+        while not os.path.exists(newdev) and count <= 10:
+            time.sleep(1)
+            count += 1
+        command(
+            [
+                '/usr/sbin/ceph-disk',
+                'activate',
+                newdev,
+            ]
+        )
+
+    else:
+        raise Error('unrecognized partition type %s' % parttype)
+
+
+def setup_statedir(dir):
+    # XXX The following use of globals makes linting
+    # really hard. Global state in Python is iffy and
+    # should be avoided.
+    global STATEDIR
+    STATEDIR = dir
+
+    if not os.path.exists(STATEDIR):
+        os.mkdir(STATEDIR)
+    if not os.path.exists(STATEDIR + "/tmp"):
+        os.mkdir(STATEDIR + "/tmp")
+
+    global prepare_lock
+    prepare_lock = filelock(STATEDIR + '/tmp/ceph-disk.prepare.lock')
+
+    global activate_lock
+    activate_lock = filelock(STATEDIR + '/tmp/ceph-disk.activate.lock')
+
+    global SUPPRESS_PREFIX
+    SUPPRESS_PREFIX = STATEDIR + '/tmp/suppress-activate.'
+
+
+def setup_sysconfdir(dir):
+    global SYSCONFDIR
+    SYSCONFDIR = dir
+
+
+def parse_args(argv):
+    parser = argparse.ArgumentParser(
+        'ceph-disk',
+    )
+    parser.add_argument(
+        '-v', '--verbose',
+        action='store_true', default=None,
+        help='be more verbose',
+    )
+    parser.add_argument(
+        '--log-stdout',
+        action='store_true', default=None,
+        help='log to stdout',
+    )
+    parser.add_argument(
+        '--prepend-to-path',
+        metavar='PATH',
+        default='/usr/bin',
+        help=('prepend PATH to $PATH for backward compatibility '
+              '(default /usr/bin)'),
+    )
+    parser.add_argument(
+        '--statedir',
+        metavar='PATH',
+        default='/var/lib/ceph',
+        help=('directory in which ceph state is preserved '
+              '(default /var/lib/ceph)'),
+    )
+    parser.add_argument(
+        '--sysconfdir',
+        metavar='PATH',
+        default='/etc/ceph',
+        help=('directory in which ceph configuration files are found '
+              '(default /etc/ceph)'),
+    )
+    parser.add_argument(
+        '--setuser',
+        metavar='USER',
+        default=None,
+        help='use the given user for subprocesses, rather than ceph or root'
+    )
+    parser.add_argument(
+        '--setgroup',
+        metavar='GROUP',
+        default=None,
+        help='use the given group for subprocesses, rather than ceph or root'
+    )
+    parser.set_defaults(
+        # we want to hold on to this, for later
+        prog=parser.prog,
+    )
+
+    subparsers = parser.add_subparsers(
+        title='subcommands',
+        description='valid subcommands',
+        help='sub-command help',
+    )
+
+    Prepare.set_subparser(subparsers)
+    make_activate_parser(subparsers)
+    make_activate_block_parser(subparsers)
+    make_activate_journal_parser(subparsers)
+    make_activate_all_parser(subparsers)
+    make_list_parser(subparsers)
+    make_suppress_parser(subparsers)
+    make_deactivate_parser(subparsers)
+    make_destroy_parser(subparsers)
+    make_zap_parser(subparsers)
+    make_trigger_parser(subparsers)
+
+    args = parser.parse_args(argv)
+    return args
+
+
+def make_trigger_parser(subparsers):
+    trigger_parser = subparsers.add_parser(
+        'trigger',
+        help='Trigger an event (caled by udev)')
+    trigger_parser.add_argument(
+        'dev',
+        help=('device'),
+    )
+    trigger_parser.add_argument(
+        '--sync',
+        action='store_true', default=None,
+        help=('do operation synchronously; do not trigger systemd'),
+    )
+    trigger_parser.set_defaults(
+        func=main_trigger,
+    )
+    return trigger_parser
+
+
+def make_activate_parser(subparsers):
+    activate_parser = subparsers.add_parser(
+        'activate',
+        help='Activate a Ceph OSD')
+    activate_parser.add_argument(
+        '--mount',
+        action='store_true', default=None,
+        help='mount a block device [deprecated, ignored]',
+    )
+    activate_parser.add_argument(
+        '--activate-key',
+        metavar='PATH',
+        help='bootstrap-osd keyring path template (%(default)s)',
+        dest='activate_key_template',
+    )
+    activate_parser.add_argument(
+        '--mark-init',
+        metavar='INITSYSTEM',
+        help='init system to manage this dir',
+        default='auto',
+        choices=INIT_SYSTEMS,
+    )
+    activate_parser.add_argument(
+        '--no-start-daemon',
+        action='store_true', default=None,
+        help='do not start the daemon',
+    )
+    activate_parser.add_argument(
+        'path',
+        metavar='PATH',
+        help='path to block device or directory',
+    )
+    activate_parser.add_argument(
+        '--dmcrypt',
+        action='store_true', default=None,
+        help='map DATA and/or JOURNAL devices with dm-crypt',
+    )
+    activate_parser.add_argument(
+        '--dmcrypt-key-dir',
+        metavar='KEYDIR',
+        default='/etc/ceph/dmcrypt-keys',
+        help='directory where dm-crypt keys are stored',
+    )
+    activate_parser.add_argument(
+        '--reactivate',
+        action='store_true', default=False,
+        help='activate the deactived OSD',
+    )
+    activate_parser.set_defaults(
+        activate_key_template='{statedir}/bootstrap-osd/{cluster}.keyring',
+        func=main_activate,
+    )
+    return activate_parser
+
+
+def make_activate_block_parser(subparsers):
+    return make_activate_space_parser('block', subparsers)
+
+
+def make_activate_journal_parser(subparsers):
+    return make_activate_space_parser('journal', subparsers)
+
+
+def make_activate_space_parser(name, subparsers):
+    activate_space_parser = subparsers.add_parser(
+        'activate-%s' % name,
+        help='Activate an OSD via its %s device' % name)
+    activate_space_parser.add_argument(
+        'dev',
+        metavar='DEV',
+        help='path to %s block device' % name,
+    )
+    activate_space_parser.add_argument(
+        '--activate-key',
+        metavar='PATH',
+        help='bootstrap-osd keyring path template (%(default)s)',
+        dest='activate_key_template',
+    )
+    activate_space_parser.add_argument(
+        '--mark-init',
+        metavar='INITSYSTEM',
+        help='init system to manage this dir',
+        default='auto',
+        choices=INIT_SYSTEMS,
+    )
+    activate_space_parser.add_argument(
+        '--dmcrypt',
+        action='store_true', default=None,
+        help=('map data and/or auxiliariy (journal, etc.) '
+              'devices with dm-crypt'),
+    )
+    activate_space_parser.add_argument(
+        '--dmcrypt-key-dir',
+        metavar='KEYDIR',
+        default='/etc/ceph/dmcrypt-keys',
+        help='directory where dm-crypt keys are stored',
+    )
+    activate_space_parser.add_argument(
+        '--reactivate',
+        action='store_true', default=False,
+        help='activate the deactived OSD',
+    )
+    activate_space_parser.set_defaults(
+        activate_key_template='{statedir}/bootstrap-osd/{cluster}.keyring',
+        func=lambda args: main_activate_space(name, args),
+    )
+    return activate_space_parser
+
+
+def make_activate_all_parser(subparsers):
+    activate_all_parser = subparsers.add_parser(
+        'activate-all',
+        help='Activate all tagged OSD partitions')
+    activate_all_parser.add_argument(
+        '--activate-key',
+        metavar='PATH',
+        help='bootstrap-osd keyring path template (%(default)s)',
+        dest='activate_key_template',
+    )
+    activate_all_parser.add_argument(
+        '--mark-init',
+        metavar='INITSYSTEM',
+        help='init system to manage this dir',
+        default='auto',
+        choices=INIT_SYSTEMS,
+    )
+    activate_all_parser.set_defaults(
+        activate_key_template='{statedir}/bootstrap-osd/{cluster}.keyring',
+        func=main_activate_all,
+    )
+    return activate_all_parser
+
+
+def make_list_parser(subparsers):
+    list_parser = subparsers.add_parser(
+        'list',
+        help='List disks, partitions, and Ceph OSDs')
+    list_parser.add_argument(
+        '--format',
+        help='output format',
+        default='plain',
+        choices=['json', 'plain'],
+    )
+    list_parser.add_argument(
+        'path',
+        metavar='PATH',
+        nargs='*',
+        help='path to block devices, relative to /sys/block',
+    )
+    list_parser.set_defaults(
+        func=main_list,
+    )
+    return list_parser
+
+
+def make_suppress_parser(subparsers):
+    suppress_parser = subparsers.add_parser(
+        'suppress-activate',
+        help='Suppress activate on a device (prefix)')
+    suppress_parser.add_argument(
+        'path',
+        metavar='PATH',
+        help='path to block device or directory',
+    )
+    suppress_parser.set_defaults(
+        func=main_suppress,
+    )
+
+    unsuppress_parser = subparsers.add_parser(
+        'unsuppress-activate',
+        help='Stop suppressing activate on a device (prefix)')
+    unsuppress_parser.add_argument(
+        'path',
+        metavar='PATH',
+        help='path to block device or directory',
+    )
+    unsuppress_parser.set_defaults(
+        func=main_unsuppress,
+    )
+    return suppress_parser
+
+
+def make_deactivate_parser(subparsers):
+    deactivate_parser = subparsers.add_parser(
+        'deactivate',
+        help='Deactivate a Ceph OSD')
+    deactivate_parser.add_argument(
+        '--cluster',
+        metavar='NAME',
+        default='ceph',
+        help='cluster name to assign this disk to',
+    )
+    deactivate_parser.add_argument(
+        'path',
+        metavar='PATH',
+        nargs='?',
+        help='path to block device or directory',
+    )
+    deactivate_parser.add_argument(
+        '--deactivate-by-id',
+        metavar='<id>',
+        help='ID of OSD to deactive'
+    )
+    deactivate_parser.add_argument(
+        '--mark-out',
+        action='store_true', default=False,
+        help='option to mark the osd out',
+    )
+    deactivate_parser.set_defaults(
+        func=main_deactivate,
+    )
+
+
+def make_destroy_parser(subparsers):
+    destroy_parser = subparsers.add_parser(
+        'destroy',
+        help='Destroy a Ceph OSD')
+    destroy_parser.add_argument(
+        '--cluster',
+        metavar='NAME',
+        default='ceph',
+        help='cluster name to assign this disk to',
+    )
+    destroy_parser.add_argument(
+        'path',
+        metavar='PATH',
+        nargs='?',
+        help='path to block device or directory',
+    )
+    destroy_parser.add_argument(
+        '--destroy-by-id',
+        metavar='<id>',
+        help='ID of OSD to destroy'
+    )
+    destroy_parser.add_argument(
+        '--dmcrypt-key-dir',
+        metavar='KEYDIR',
+        default='/etc/ceph/dmcrypt-keys',
+        help=('directory where dm-crypt keys are stored '
+              '(If you don\'t know how it work, '
+              'dont use it. we have default value)'),
+    )
+    destroy_parser.add_argument(
+        '--zap',
+        action='store_true', default=False,
+        help='option to erase data and partition',
+    )
+    destroy_parser.set_defaults(
+        func=main_destroy,
+    )
+
+
+def make_zap_parser(subparsers):
+    zap_parser = subparsers.add_parser(
+        'zap',
+        help='Zap/erase/destroy a device\'s partition table (and contents)')
+    zap_parser.add_argument(
+        'dev',
+        metavar='DEV',
+        nargs='+',
+        help='path to block device',
+    )
+    zap_parser.set_defaults(
+        func=main_zap,
+    )
+    return zap_parser
+
+
+def main(argv):
+    args = parse_args(argv)
+
+    setup_logging(args.verbose, args.log_stdout)
+
+    if args.prepend_to_path != '':
+        path = os.environ.get('PATH', os.defpath)
+        os.environ['PATH'] = args.prepend_to_path + ":" + path
+
+    setup_statedir(args.statedir)
+    setup_sysconfdir(args.sysconfdir)
+
+    global CEPH_PREF_USER
+    CEPH_PREF_USER = args.setuser
+    global CEPH_PREF_GROUP
+    CEPH_PREF_GROUP = args.setgroup
+
+    if args.verbose:
+        args.func(args)
+    else:
+        main_catch(args.func, args)
+
+
+def setup_logging(verbose, log_stdout):
+    loglevel = logging.WARNING
+    if verbose:
+        loglevel = logging.DEBUG
+
+    if log_stdout:
+        ch = logging.StreamHandler(stream=sys.stdout)
+        ch.setLevel(loglevel)
+        formatter = logging.Formatter('%(filename)s: %(message)s')
+        ch.setFormatter(formatter)
+        LOG.addHandler(ch)
+        LOG.setLevel(loglevel)
+    else:
+        logging.basicConfig(
+            level=loglevel,
+        )
+
+
+def main_catch(func, args):
+
+    try:
+        func(args)
+
+    except Error as e:
+        raise SystemExit(
+            '{prog}: {msg}'.format(
+                prog=args.prog,
+                msg=e,
+            )
+        )
+
+    except CephDiskException as error:
+        exc_name = error.__class__.__name__
+        raise SystemExit(
+            '{prog} {exc_name}: {msg}'.format(
+                prog=args.prog,
+                exc_name=exc_name,
+                msg=error,
+            )
+        )
+
+
+def run():
+    main(sys.argv[1:])
+
+if __name__ == '__main__':
+    main(sys.argv[1:])
+    warned_about = {}
diff --git a/qa/workunits/ceph-disk/ceph-disk-test.py b/qa/workunits/ceph-disk/ceph-disk-test.py
new file mode 100644
index 0000000..63c2c7a
--- /dev/null
+++ b/qa/workunits/ceph-disk/ceph-disk-test.py
@@ -0,0 +1,697 @@
+#
+# Copyright (C) 2015, 2016 Red Hat <contact at redhat.com>
+#
+# Author: Loic Dachary <loic at dachary.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Library Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library Public License for more details.
+#
+# When debugging these tests (must be root), here are a few useful commands:
+#
+#  export PATH=.:..:$PATH
+#  ceph-disk.sh # run once to prepare the environment as it would be by teuthology
+#  ln -sf /home/ubuntu/ceph/src/ceph-disk/ceph_disk/main.py $(which ceph-disk)
+#  ln -sf /home/ubuntu/ceph/udev/95-ceph-osd.rules /lib/udev/rules.d/95-ceph-osd.rules
+#  ln -sf /home/ubuntu/ceph/systemd/ceph-disk at .service /usr/lib/systemd/system/ceph-disk at .service
+#  ceph-disk.conf will be silently ignored if it is a symbolic link or a hard link /var/log/upstart for logs
+#  cp /home/ubuntu/ceph/src/upstart/ceph-disk.conf /etc/init/ceph-disk.conf
+#  id=3 ; ceph-disk deactivate --deactivate-by-id $id ; ceph-disk destroy --zap --destroy-by-id $id
+#  py.test -s -v -k test_activate_dmcrypt_luks ceph-disk-test.py
+#
+#  CentOS 7
+#    udevadm monitor --property & tail -f /var/log/messages
+#    udev rules messages are logged in /var/log/messages
+#    systemctl stop ceph-osd at 2
+#    systemctl start ceph-osd at 2
+#
+#  udevadm monitor --property & tail -f /var/log/syslog /var/log/upstart/*  # on Ubuntu 14.04
+#  udevadm test --action=add /block/vdb/vdb1 # verify the udev rule is run as expected
+#  udevadm control --reload # when changing the udev rules
+#  sudo /usr/sbin/ceph-disk -v trigger /dev/vdb1 # activates if vdb1 is data
+#
+#  integration tests coverage
+#  pip install coverage
+#  perl -pi -e 's|"ceph-disk |"coverage run --source=/usr/sbin/ceph-disk --append /usr/sbin/ceph-disk |' ceph-disk-test.py
+#  rm -f .coverage ; py.test -s -v ceph-disk-test.py
+#  coverage report --show-missing
+#
+import argparse
+import json
+import logging
+import configobj
+import os
+import pytest
+import re
+import subprocess
+import sys
+import tempfile
+import time
+import uuid
+
+LOG = logging.getLogger('CephDisk')
+
+
+class CephDisk:
+
+    def __init__(self):
+        self.conf = configobj.ConfigObj('/etc/ceph/ceph.conf')
+
+    def save_conf(self):
+        self.conf.write(open('/etc/ceph/ceph.conf', 'w'))
+
+    @staticmethod
+    def helper(command):
+        command = "ceph-helpers-root.sh " + command
+        return CephDisk.sh(command)
+
+    @staticmethod
+    def sh(command):
+        LOG.debug(":sh: " + command)
+        proc = subprocess.Popen(
+            args=command,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT,
+            shell=True,
+            bufsize=1)
+        lines = []
+        with proc.stdout:
+            for line in iter(proc.stdout.readline, b''):
+                line = line.decode('utf-8')
+                if 'dangerous and experimental' in line:
+                    LOG.debug('SKIP dangerous and experimental')
+                    continue
+                lines.append(line)
+                LOG.debug(line.strip().encode('ascii', 'ignore'))
+        if proc.wait() != 0:
+            raise subprocess.CalledProcessError(
+                returncode=proc.returncode,
+                cmd=command
+            )
+        return "".join(lines)
+
+    def unused_disks(self, pattern='[vs]d.'):
+        names = filter(
+            lambda x: re.match(pattern, x), os.listdir("/sys/block"))
+        if not names:
+            return []
+        disks = json.loads(
+            self.sh("ceph-disk list --format json " + " ".join(names)))
+        unused = []
+        for disk in disks:
+            if 'partitions' not in disk:
+                unused.append(disk['path'])
+        return unused
+
+    def ensure_sd(self):
+        LOG.debug(self.unused_disks('sd.'))
+        if self.unused_disks('sd.'):
+            return
+        modprobe = "modprobe scsi_debug vpd_use_hostno=0 add_host=1 dev_size_mb=200 ; udevadm settle"
+        try:
+            self.sh(modprobe)
+        except:
+            self.helper("install linux-image-extra-3.13.0-61-generic")
+            self.sh(modprobe)
+
+    def unload_scsi_debug(self):
+        self.sh("rmmod scsi_debug || true")
+
+    def get_lockbox(self):
+        disks = json.loads(self.sh("ceph-disk list --format json"))
+        for disk in disks:
+            if 'partitions' in disk:
+                for partition in disk['partitions']:
+                    if partition.get('type') == 'lockbox':
+                        return partition
+        raise Exception("no lockbox found " + str(disks))
+
+    def get_osd_partition(self, uuid):
+        disks = json.loads(self.sh("ceph-disk list --format json"))
+        for disk in disks:
+            if 'partitions' in disk:
+                for partition in disk['partitions']:
+                    if partition.get('uuid') == uuid:
+                        return partition
+        raise Exception("uuid = " + uuid + " not found in " + str(disks))
+
+    def get_journal_partition(self, uuid):
+        return self.get_space_partition('journal', uuid)
+
+    def get_space_partition(self, name, uuid):
+        data_partition = self.get_osd_partition(uuid)
+        space_dev = data_partition[name + '_dev']
+        disks = json.loads(self.sh("ceph-disk list --format json"))
+        for disk in disks:
+            if 'partitions' in disk:
+                for partition in disk['partitions']:
+                    if partition['path'] == space_dev:
+                        if name + '_for' in partition:
+                            assert partition[
+                                name + '_for'] == data_partition['path']
+                        return partition
+        raise Exception(
+            name + " for uuid = " + uuid + " not found in " + str(disks))
+
+    def destroy_osd(self, uuid):
+        id = self.sh("ceph osd create " + uuid).strip()
+        self.sh("""
+        set -xe
+        ceph-disk --verbose deactivate --deactivate-by-id {id}
+        ceph-disk --verbose destroy --destroy-by-id {id} --zap
+        """.format(id=id))
+
+    def deactivate_osd(self, uuid):
+        id = self.sh("ceph osd create " + uuid).strip()
+        self.sh("""
+        set -xe
+        ceph-disk --verbose deactivate --once --deactivate-by-id {id}
+        """.format(id=id))
+
+    @staticmethod
+    def osd_up_predicate(osds, uuid):
+        for osd in osds:
+            if osd['uuid'] == uuid and 'up' in osd['state']:
+                return True
+        return False
+
+    @staticmethod
+    def wait_for_osd_up(uuid):
+        CephDisk.wait_for_osd(uuid, CephDisk.osd_up_predicate, 'up')
+
+    @staticmethod
+    def osd_down_predicate(osds, uuid):
+        found = False
+        for osd in osds:
+            if osd['uuid'] == uuid:
+                found = True
+                if 'down' in osd['state'] or ['exists'] == osd['state']:
+                    return True
+        return not found
+
+    @staticmethod
+    def wait_for_osd_down(uuid):
+        CephDisk.wait_for_osd(uuid, CephDisk.osd_down_predicate, 'down')
+
+    @staticmethod
+    def wait_for_osd(uuid, predicate, info):
+        LOG.info("wait_for_osd " + info + " " + uuid)
+        for delay in (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024):
+            dump = json.loads(CephDisk.sh("ceph osd dump -f json"))
+            if predicate(dump['osds'], uuid):
+                return True
+            time.sleep(delay)
+        raise Exception('timeout waiting for osd ' + uuid + ' to be ' + info)
+
+    def check_osd_status(self, uuid, space_name=None):
+        data_partition = self.get_osd_partition(uuid)
+        assert data_partition['type'] == 'data'
+        assert data_partition['state'] == 'active'
+        if space_name is not None:
+            space_partition = self.get_space_partition(space_name, uuid)
+            assert space_partition
+
+
+class TestCephDisk(object):
+
+    def setup_class(self):
+        logging.basicConfig(level=logging.DEBUG)
+        c = CephDisk()
+        if c.sh("lsb_release -si").strip() == 'CentOS':
+            c.helper("install multipath-tools device-mapper-multipath")
+        c.conf['global']['pid file'] = '/var/run/ceph/$cluster-$name.pid'
+        #
+        # Avoid json parsing interference
+        #
+        c.conf['global']['debug monc'] = 0
+        #
+        # objecstore
+        #
+        c.conf['global']['osd journal size'] = 100
+        #
+        # bluestore
+        #
+        c.conf['global']['enable experimental unrecoverable data corrupting features'] = '*'
+        c.conf['global']['bluestore fsck on mount'] = 'true'
+        c.save_conf()
+
+    def setup(self):
+        c = CephDisk()
+        for key in ('osd objectstore', 'osd dmcrypt type'):
+            if key in c.conf['global']:
+                del c.conf['global'][key]
+        c.save_conf()
+
+    def test_deactivate_reactivate_osd(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose zap " + disk)
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(c.sh("ceph-disk list --format json " + disk))[0]
+        assert len(device['partitions']) == 2
+        c.check_osd_status(osd_uuid, 'journal')
+        data_partition = c.get_osd_partition(osd_uuid)
+        c.sh("ceph-disk --verbose deactivate " + data_partition['path'])
+        c.wait_for_osd_down(osd_uuid)
+        c.sh("ceph-disk --verbose activate " + data_partition['path'] + " --reactivate")
+        # check again
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(c.sh("ceph-disk list --format json " + disk))[0]
+        assert len(device['partitions']) == 2
+        c.check_osd_status(osd_uuid, 'journal')
+        c.helper("pool_read_write")
+        c.destroy_osd(osd_uuid)
+
+    def test_destroy_osd_by_id(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid + " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        c.check_osd_status(osd_uuid)
+        c.destroy_osd(osd_uuid)
+
+    def test_destroy_osd_by_dev_path(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid + " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        partition = c.get_osd_partition(osd_uuid)
+        assert partition['type'] == 'data'
+        assert partition['state'] == 'active'
+        c.sh("ceph-disk --verbose deactivate " + partition['path'])
+        c.wait_for_osd_down(osd_uuid)
+        c.sh("ceph-disk --verbose destroy " + partition['path'] + " --zap")
+
+    def test_deactivate_reactivate_dmcrypt_plain(self):
+        c = CephDisk()
+        c.conf['global']['osd dmcrypt type'] = 'plain'
+        c.save_conf()
+        osd_uuid = self.activate_dmcrypt('ceph-disk-no-lockbox')
+        data_partition = c.get_osd_partition(osd_uuid)
+        c.sh("ceph-disk --verbose deactivate " + data_partition['path'])
+        c.wait_for_osd_down(osd_uuid)
+        c.sh("ceph-disk --verbose activate-journal " + data_partition['journal_dev'] +
+             " --reactivate" + " --dmcrypt")
+        c.wait_for_osd_up(osd_uuid)
+        c.check_osd_status(osd_uuid, 'journal')
+        c.destroy_osd(osd_uuid)
+        c.save_conf()
+
+    def test_deactivate_reactivate_dmcrypt_luks(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk')
+        data_partition = c.get_osd_partition(osd_uuid)
+        lockbox_partition = c.get_lockbox()
+        c.sh("ceph-disk --verbose deactivate " + data_partition['path'])
+        c.wait_for_osd_down(osd_uuid)
+        c.sh("ceph-disk --verbose trigger --sync " + lockbox_partition['path'])
+        c.sh("ceph-disk --verbose activate-journal " + data_partition['journal_dev'] +
+             " --reactivate" + " --dmcrypt")
+        c.wait_for_osd_up(osd_uuid)
+        c.check_osd_status(osd_uuid, 'journal')
+        c.destroy_osd(osd_uuid)
+
+    def test_activate_dmcrypt_plain_no_lockbox(self):
+        c = CephDisk()
+        c.conf['global']['osd dmcrypt type'] = 'plain'
+        c.save_conf()
+        osd_uuid = self.activate_dmcrypt('ceph-disk-no-lockbox')
+        c.destroy_osd(osd_uuid)
+        c.save_conf()
+
+    def test_activate_dmcrypt_luks_no_lockbox(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk-no-lockbox')
+        c.destroy_osd(osd_uuid)
+
+    def test_activate_dmcrypt_luks_with_lockbox(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk')
+        c.destroy_osd(osd_uuid)
+
+    def test_activate_lockbox(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk')
+        lockbox = c.get_lockbox()
+        assert lockbox['state'] == 'active'
+        c.sh("umount " + lockbox['path'])
+        lockbox = c.get_lockbox()
+        assert lockbox['state'] == 'prepared'
+        c.sh("ceph-disk --verbose trigger " + lockbox['path'])
+        success = False
+        for delay in (1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024):
+            lockbox = c.get_lockbox()
+            if lockbox['state'] == 'active':
+                success = True
+                break
+            time.sleep(delay)
+        if not success:
+            raise Exception('timeout waiting for lockbox ' + lockbox['path'])
+        c.destroy_osd(osd_uuid)
+
+    def activate_dmcrypt(self, ceph_disk):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        journal_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose zap " + disk)
+        c.sh(ceph_disk + " --verbose prepare " +
+             " --osd-uuid " + osd_uuid +
+             " --journal-uuid " + journal_uuid +
+             " --dmcrypt " +
+             " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        c.check_osd_status(osd_uuid, 'journal')
+        return osd_uuid
+
+    def test_trigger_dmcrypt_journal_lockbox(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk')
+        data_partition = c.get_osd_partition(osd_uuid)
+        lockbox_partition = c.get_lockbox()
+        c.deactivate_osd(osd_uuid)
+        c.wait_for_osd_down(osd_uuid)
+        with pytest.raises(subprocess.CalledProcessError):
+            # fails because the lockbox is not mounted yet
+            c.sh("ceph-disk --verbose trigger --sync " + data_partition['journal_dev'])
+        c.sh("ceph-disk --verbose trigger --sync " + lockbox_partition['path'])
+        c.wait_for_osd_up(osd_uuid)
+        c.destroy_osd(osd_uuid)
+
+    def test_trigger_dmcrypt_data_lockbox(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk')
+        data_partition = c.get_osd_partition(osd_uuid)
+        lockbox_partition = c.get_lockbox()
+        c.deactivate_osd(osd_uuid)
+        c.wait_for_osd_down(osd_uuid)
+        with pytest.raises(subprocess.CalledProcessError):
+            # fails because the lockbox is not mounted yet
+            c.sh("ceph-disk --verbose trigger --sync " + data_partition['path'])
+        c.sh("ceph-disk --verbose trigger --sync " + lockbox_partition['path'])
+        c.wait_for_osd_up(osd_uuid)
+        c.destroy_osd(osd_uuid)
+
+    def test_trigger_dmcrypt_lockbox(self):
+        c = CephDisk()
+        osd_uuid = self.activate_dmcrypt('ceph-disk')
+        data_partition = c.get_osd_partition(osd_uuid)
+        lockbox_partition = c.get_lockbox()
+        c.deactivate_osd(osd_uuid)
+        c.wait_for_osd_down(osd_uuid)
+        c.sh("ceph-disk --verbose trigger --sync " + lockbox_partition['path'])
+        c.wait_for_osd_up(osd_uuid)
+        c.destroy_osd(osd_uuid)
+
+    def test_activate_no_journal(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose zap " + disk)
+        c.conf['global']['osd objectstore'] = 'memstore'
+        c.save_conf()
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(c.sh("ceph-disk list --format json " + disk))[0]
+        assert len(device['partitions']) == 1
+        partition = device['partitions'][0]
+        assert partition['type'] == 'data'
+        assert partition['state'] == 'active'
+        assert 'journal_dev' not in partition
+        c.helper("pool_read_write")
+        c.destroy_osd(osd_uuid)
+        c.save_conf()
+
+    def test_activate_with_journal_dev_no_symlink(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose zap " + disk)
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(c.sh("ceph-disk list --format json " + disk))[0]
+        assert len(device['partitions']) == 2
+        c.check_osd_status(osd_uuid, 'journal')
+        c.helper("pool_read_write")
+        c.destroy_osd(osd_uuid)
+
+    def test_activate_bluestore(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose zap " + disk)
+        c.conf['global']['osd objectstore'] = 'bluestore'
+        c.save_conf()
+        c.sh("ceph-disk --verbose prepare --bluestore --osd-uuid " + osd_uuid +
+             " " + disk)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(c.sh("ceph-disk list --format json " + disk))[0]
+        assert len(device['partitions']) == 2
+        c.check_osd_status(osd_uuid, 'block')
+        c.helper("pool_read_write")
+        c.destroy_osd(osd_uuid)
+
+    def test_activate_with_journal_dev_is_symlink(self):
+        c = CephDisk()
+        disk = c.unused_disks()[0]
+        osd_uuid = str(uuid.uuid1())
+        tempdir = tempfile.mkdtemp()
+        symlink = os.path.join(tempdir, 'osd')
+        os.symlink(disk, symlink)
+        c.sh("ceph-disk --verbose zap " + symlink)
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + symlink)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(c.sh("ceph-disk list --format json " + symlink))[0]
+        assert len(device['partitions']) == 2
+        data_partition = c.get_osd_partition(osd_uuid)
+        assert data_partition['type'] == 'data'
+        assert data_partition['state'] == 'active'
+        journal_partition = c.get_journal_partition(osd_uuid)
+        assert journal_partition
+        c.helper("pool_read_write")
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + symlink)
+        os.unlink(symlink)
+        os.rmdir(tempdir)
+
+    def test_activate_journal_file(self):
+        c = CephDisk()
+        disks = c.unused_disks()
+        data_disk = disks[0]
+        #
+        # /var/lib/ceph/osd is required otherwise it may violate
+        # restrictions enforced by systemd regarding the directories
+        # which ceph-osd is allowed to read/write
+        #
+        tempdir = tempfile.mkdtemp(dir='/var/lib/ceph/osd')
+        c.sh("chown ceph:ceph " + tempdir + " || true")
+        journal_file = os.path.join(tempdir, 'journal')
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + data_disk + " " + journal_file)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(
+            c.sh("ceph-disk list --format json " + data_disk))[0]
+        assert len(device['partitions']) == 1
+        partition = device['partitions'][0]
+        assert journal_file == os.readlink(
+            os.path.join(partition['mount'], 'journal'))
+        c.check_osd_status(osd_uuid)
+        c.helper("pool_read_write 1")  # 1 == pool size
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_disk)
+        os.unlink(journal_file)
+        os.rmdir(tempdir)
+
+    def test_activate_separated_journal(self):
+        c = CephDisk()
+        disks = c.unused_disks()
+        data_disk = disks[0]
+        journal_disk = disks[1]
+        osd_uuid = self.activate_separated_journal(data_disk, journal_disk)
+        c.helper("pool_read_write 1")  # 1 == pool size
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_disk + " " + journal_disk)
+
+    def test_activate_separated_journal_dev_is_symlink(self):
+        c = CephDisk()
+        disks = c.unused_disks()
+        data_disk = disks[0]
+        journal_disk = disks[1]
+        tempdir = tempfile.mkdtemp()
+        data_symlink = os.path.join(tempdir, 'osd')
+        os.symlink(data_disk, data_symlink)
+        journal_symlink = os.path.join(tempdir, 'journal')
+        os.symlink(journal_disk, journal_symlink)
+        osd_uuid = self.activate_separated_journal(
+            data_symlink, journal_symlink)
+        c.helper("pool_read_write 1")  # 1 == pool size
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_symlink + " " + journal_symlink)
+        os.unlink(data_symlink)
+        os.unlink(journal_symlink)
+        os.rmdir(tempdir)
+
+    def activate_separated_journal(self, data_disk, journal_disk):
+        c = CephDisk()
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + data_disk + " " + journal_disk)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(
+            c.sh("ceph-disk list --format json " + data_disk))[0]
+        assert len(device['partitions']) == 1
+        c.check_osd_status(osd_uuid, 'journal')
+        return osd_uuid
+
+    #
+    # Create an OSD and get a journal partition from a disk that
+    # already contains a journal partition which is in use. Updates of
+    # the kernel partition table may behave differently when a
+    # partition is in use. See http://tracker.ceph.com/issues/7334 for
+    # more information.
+    #
+    def test_activate_two_separated_journal(self):
+        c = CephDisk()
+        disks = c.unused_disks()
+        data_disk = disks[0]
+        other_data_disk = disks[1]
+        journal_disk = disks[2]
+        osd_uuid = self.activate_separated_journal(data_disk, journal_disk)
+        other_osd_uuid = self.activate_separated_journal(
+            other_data_disk, journal_disk)
+        #
+        # read/write can only succeed if the two osds are up because
+        # the pool needs two OSD
+        #
+        c.helper("pool_read_write 2")  # 2 == pool size
+        c.destroy_osd(osd_uuid)
+        c.destroy_osd(other_osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_disk + " " +
+             journal_disk + " " + other_data_disk)
+
+    #
+    # Create an OSD and reuse an existing journal partition
+    #
+    def test_activate_reuse_journal(self):
+        c = CephDisk()
+        disks = c.unused_disks()
+        data_disk = disks[0]
+        journal_disk = disks[1]
+        #
+        # Create an OSD with a separated journal and destroy it.
+        #
+        osd_uuid = self.activate_separated_journal(data_disk, journal_disk)
+        journal_partition = c.get_journal_partition(osd_uuid)
+        journal_path = journal_partition['path']
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_disk)
+        osd_uuid = str(uuid.uuid1())
+        #
+        # Create another OSD with the journal partition of the previous OSD
+        #
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + data_disk + " " + journal_path)
+        c.helper("pool_read_write 1")  # 1 == pool size
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(
+            c.sh("ceph-disk list --format json " + data_disk))[0]
+        assert len(device['partitions']) == 1
+        c.check_osd_status(osd_uuid)
+        journal_partition = c.get_journal_partition(osd_uuid)
+        #
+        # Verify the previous OSD partition has been reused
+        #
+        assert journal_partition['path'] == journal_path
+        c.destroy_osd(osd_uuid)
+        c.sh("ceph-disk --verbose zap " + data_disk + " " + journal_disk)
+
+    def test_activate_multipath(self):
+        c = CephDisk()
+        if c.sh("lsb_release -si").strip() != 'CentOS':
+            pytest.skip(
+                "see issue https://bugs.launchpad.net/ubuntu/+source/multipath-tools/+bug/1488688")
+        c.ensure_sd()
+        #
+        # Figure out the name of the multipath device
+        #
+        disk = c.unused_disks('sd.')[0]
+        c.sh("mpathconf --enable || true")
+        c.sh("multipath " + disk)
+        holders = os.listdir(
+            "/sys/block/" + os.path.basename(disk) + "/holders")
+        assert 1 == len(holders)
+        name = open("/sys/block/" + holders[0] + "/dm/name").read()
+        multipath = "/dev/mapper/" + name
+        #
+        # Prepare the multipath device
+        #
+        osd_uuid = str(uuid.uuid1())
+        c.sh("ceph-disk --verbose zap " + multipath)
+        c.sh("ceph-disk --verbose prepare --osd-uuid " + osd_uuid +
+             " " + multipath)
+        c.wait_for_osd_up(osd_uuid)
+        device = json.loads(
+            c.sh("ceph-disk list --format json " + multipath))[0]
+        assert len(device['partitions']) == 2
+        data_partition = c.get_osd_partition(osd_uuid)
+        assert data_partition['type'] == 'data'
+        assert data_partition['state'] == 'active'
+        journal_partition = c.get_journal_partition(osd_uuid)
+        assert journal_partition
+        c.helper("pool_read_write")
+        c.destroy_osd(osd_uuid)
+        c.sh("udevadm settle")
+        c.sh("multipath -F")
+        c.unload_scsi_debug()
+
+
+class CephDiskTest(CephDisk):
+
+    def main(self, argv):
+        parser = argparse.ArgumentParser(
+            'ceph-disk-test',
+        )
+        parser.add_argument(
+            '-v', '--verbose',
+            action='store_true', default=None,
+            help='be more verbose',
+        )
+        parser.add_argument(
+            '--destroy-osd',
+            help='stop, umount and destroy',
+        )
+        args = parser.parse_args(argv)
+
+        if args.verbose:
+            logging.basicConfig(level=logging.DEBUG)
+
+        if args.destroy_osd:
+            dump = json.loads(CephDisk.sh("ceph osd dump -f json"))
+            osd_uuid = None
+            for osd in dump['osds']:
+                if str(osd['osd']) == args.destroy_osd:
+                    osd_uuid = osd['uuid']
+            if osd_uuid:
+                self.destroy_osd(osd_uuid)
+            else:
+                raise Exception("cannot find OSD " + args.destroy_osd +
+                                " ceph osd dump -f json")
+            return
+
+if __name__ == '__main__':
+    sys.exit(CephDiskTest().main(sys.argv[1:]))
diff --git a/qa/workunits/ceph-disk/ceph-disk.sh b/qa/workunits/ceph-disk/ceph-disk.sh
new file mode 100755
index 0000000..4bac24f
--- /dev/null
+++ b/qa/workunits/ceph-disk/ceph-disk.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+if [ -f $(dirname $0)/../ceph-helpers-root.sh ]; then
+    source $(dirname $0)/../ceph-helpers-root.sh
+else
+    echo "$(dirname $0)/../ceph-helpers-root.sh does not exist."
+    exit 1
+fi
+
+install python-pytest || true
+install pytest || true
+
+# complete the cluster setup done by the teuthology ceph task
+sudo chown $(id -u) /etc/ceph/ceph.conf
+if ! test -f /etc/ceph/ceph.client.admin.keyring ; then
+    sudo cp /etc/ceph/ceph.keyring /etc/ceph/ceph.client.admin.keyring
+fi
+if ! sudo test -f /var/lib/ceph/bootstrap-osd/ceph.keyring ; then
+    sudo ceph-create-keys --id a
+fi
+sudo ceph osd crush rm osd.0 || true
+sudo ceph osd crush rm osd.1 || true
+
+sudo cp $(dirname $0)/60-ceph-by-partuuid.rules /lib/udev/rules.d
+sudo udevadm control --reload
+
+perl -pi -e 's|pid file.*|pid file = /var/run/ceph/\$cluster-\$name.pid|' /etc/ceph/ceph.conf
+
+PATH=$(dirname $0):$(dirname $0)/..:$PATH
+
+if ! which py.test > /dev/null; then
+    echo "py.test not installed"
+    exit 1
+fi
+
+sudo env PATH=$(dirname $0):$(dirname $0)/..:$PATH py.test -s -v $(dirname $0)/ceph-disk-test.py
+result=$?
+
+sudo rm -f /lib/udev/rules.d/60-ceph-by-partuuid.rules
+# own whatever was created as a side effect of the py.test run
+# so that it can successfully be removed later on by a non privileged 
+# process
+sudo chown -R $(id -u) $(dirname $0)
+exit $result
diff --git a/qa/workunits/ceph-helpers-root.sh b/qa/workunits/ceph-helpers-root.sh
new file mode 100755
index 0000000..a622bd5
--- /dev/null
+++ b/qa/workunits/ceph-helpers-root.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+#
+# Copyright (C) 2015 Red Hat <contact at redhat.com>
+#
+# Author: Loic Dachary <loic at dachary.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Library Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library Public License for more details.
+#
+
+#######################################################################
+
+function install() {
+    for package in "$@" ; do
+        install_one $package
+    done
+    return 0
+}
+
+function install_one() {
+    case $(lsb_release -si) in
+        Ubuntu|Debian|Devuan)
+            sudo apt-get install -y "$@"
+            ;;
+        CentOS|Fedora|RedHatEnterpriseServer)
+            sudo yum install -y "$@"
+            ;;
+        *SUSE*)
+            sudo zypper --non-interactive install "$@"
+            ;;
+        *)
+            echo "$(lsb_release -si) is unknown, $@ will have to be installed manually."
+            ;;
+    esac
+}
+
+#######################################################################
+
+function control_osd() {
+    local action=$1
+    local id=$2
+
+    local init=$(ceph-detect-init)
+
+    case $init in
+        upstart)
+            sudo service ceph-osd $action id=$id
+            ;;
+        systemd)
+            sudo systemctl $action ceph-osd@$id
+            ;;
+        *)
+            echo ceph-detect-init returned an unknown init system: $init >&2
+            return 1
+            ;;
+    esac
+    return 0
+}
+
+#######################################################################
+
+function pool_read_write() {
+    local size=${1:-1}
+    local dir=/tmp
+    local timeout=360
+    local test_pool=test_pool
+
+    ceph osd pool delete $test_pool $test_pool --yes-i-really-really-mean-it || return 1
+    ceph osd pool create $test_pool 4 || return 1
+    ceph osd pool set $test_pool size $size || return 1
+    ceph osd pool set $test_pool min_size $size || return 1
+
+    echo FOO > $dir/BAR
+    timeout $timeout rados --pool $test_pool put BAR $dir/BAR || return 1
+    timeout $timeout rados --pool $test_pool get BAR $dir/BAR.copy || return 1
+    diff $dir/BAR $dir/BAR.copy || return 1
+    ceph osd pool delete $test_pool $test_pool --yes-i-really-really-mean-it || return 1
+}
+
+#######################################################################
+
+set -x
+
+"$@"
diff --git a/qa/workunits/ceph-helpers.sh b/qa/workunits/ceph-helpers.sh
new file mode 100755
index 0000000..4f5f8f8
--- /dev/null
+++ b/qa/workunits/ceph-helpers.sh
@@ -0,0 +1,1498 @@
+#!/bin/bash
+#
+# Copyright (C) 2013,2014 Cloudwatt <libre.licensing at cloudwatt.com>
+# Copyright (C) 2014,2015 Red Hat <contact at redhat.com>
+# Copyright (C) 2014 Federico Gimenez <fgimenez at coit.es>
+#
+# Author: Loic Dachary <loic at dachary.org>
+# Author: Federico Gimenez <fgimenez at coit.es>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Library Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library Public License for more details.
+#
+TIMEOUT=300
+PG_NUM=4
+: ${CEPH_BUILD_VIRTUALENV:=/tmp}
+
+if type xmlstarlet > /dev/null 2>&1; then
+    XMLSTARLET=xmlstarlet
+elif type xml > /dev/null 2>&1; then
+    XMLSTARLET=xml
+else
+	echo "Missing xmlstarlet binary!"
+	exit 1
+fi
+
+#! @file ceph-helpers.sh
+#  @brief Toolbox to manage Ceph cluster dedicated to testing
+#
+#  Example use case:
+#
+#  ~~~~~~~~~~~~~~~~{.sh}
+#  source ceph-helpers.sh
+#
+#  function mytest() {
+#    # cleanup leftovers and reset mydir
+#    setup mydir
+#    # create a cluster with one monitor and three osds
+#    run_mon mydir a
+#    run_osd mydir 0
+#    run_osd mydir 2
+#    run_osd mydir 3
+#    # put and get an object
+#    rados --pool rbd put GROUP /etc/group
+#    rados --pool rbd get GROUP /tmp/GROUP
+#    # stop the cluster and cleanup the directory
+#    teardown mydir
+#  }
+#  ~~~~~~~~~~~~~~~~
+#
+#  The focus is on simplicity and efficiency, in the context of
+#  functional tests. The output is intentionally very verbose
+#  and functions return as soon as an error is found. The caller
+#  is also expected to abort on the first error so that debugging
+#  can be done by looking at the end of the output.
+#
+#  Each function is documented, implemented and tested independently.
+#  When modifying a helper, the test and the documentation are
+#  expected to be updated and it is easier of they are collocated. A
+#  test for a given function can be run with
+#
+#  ~~~~~~~~~~~~~~~~{.sh}
+#    ceph-helpers.sh TESTS test_get_osds
+#  ~~~~~~~~~~~~~~~~
+#
+#  and all the tests (i.e. all functions matching test_*) are run
+#  with:
+#
+#  ~~~~~~~~~~~~~~~~{.sh}
+#    ceph-helpers.sh TESTS
+#  ~~~~~~~~~~~~~~~~
+#
+#  A test function takes a single argument : the directory dedicated
+#  to the tests. It is expected to not create any file outside of this
+#  directory and remove it entirely when it completes successfully.
+#
+
+
+##
+# Cleanup any leftovers found in **dir** via **teardown**
+# and reset **dir** as an empty environment.
+#
+# @param dir path name of the environment
+# @return 0 on success, 1 on error
+#
+function setup() {
+    local dir=$1
+    teardown $dir || return 1
+    mkdir -p $dir
+}
+
+function test_setup() {
+    local dir=$dir
+    setup $dir || return 1
+    test -d $dir || return 1
+    setup $dir || return 1
+    test -d $dir || return 1
+    teardown $dir
+}
+
+#######################################################################
+
+##
+# Kill all daemons for which a .pid file exists in **dir** and remove
+# **dir**. If the file system in which **dir** is btrfs, delete all
+# subvolumes that relate to it.
+#
+# @param dir path name of the environment
+# @return 0 on success, 1 on error
+#
+function teardown() {
+    local dir=$1
+    kill_daemons $dir KILL
+    if [ $(stat -f -c '%T' .) == "btrfs" ]; then
+        __teardown_btrfs $dir
+    fi
+    rm -fr $dir
+}
+
+function __teardown_btrfs() {
+    local btrfs_base_dir=$1
+
+    btrfs_dirs=`ls -l $btrfs_base_dir | egrep '^d' | awk '{print $9}'`
+    current_path=`pwd`
+    # extracting the current existing subvolumes
+    for subvolume in $(cd $btrfs_base_dir; btrfs subvolume list . -t |egrep '^[0-9]' | awk '{print $4}' |grep "$btrfs_base_dir/$btrfs_dir"); do
+       # Compute the relative path by removing the local path
+       # Like "erwan/chroot/ceph/src/testdir/test-7202/dev/osd1/snap_439" while we want "testdir/test-7202/dev/osd1/snap_439"
+       local_subvolume=$(echo $subvolume | sed -e "s|.*$current_path/||"g)
+       btrfs subvolume delete $local_subvolume
+    done
+}
+
+function test_teardown() {
+    local dir=$dir
+    setup $dir || return 1
+    teardown $dir || return 1
+    ! test -d $dir || return 1
+}
+
+#######################################################################
+
+##
+# Sends a signal to a single daemon.
+# This is a helper function for kill_daemons
+#
+# After the daemon is sent **signal**, its actual termination
+# will be verified by sending it signal 0. If the daemon is
+# still alive, kill_daemon will pause for a few seconds and
+# try again. This will repeat for a fixed number of times
+# before kill_daemon returns on failure. The list of
+# sleep intervals can be specified as **delays** and defaults
+# to:
+#
+#  0.1 0.2 1 1 1 2 3 5 5 5 10 10 20 60 60 60 120
+#
+# This sequence is designed to run first a very short sleep time (0.1)
+# if the machine is fast enough and the daemon terminates in a fraction of a
+# second. The increasing sleep numbers should give plenty of time for
+# the daemon to die even on the slowest running machine. If a daemon
+# takes more than a few minutes to stop (the sum of all sleep times),
+# there probably is no point in waiting more and a number of things
+# are likely to go wrong anyway: better give up and return on error.
+#
+# @param pid the process id to send a signal
+# @param send_signal the signal to send
+# @param delays sequence of sleep times before failure
+#
+function kill_daemon() {
+    local pid=$(cat $1)
+    local send_signal=$2
+    local delays=${3:-0.1 0.2 1 1 1 2 3 5 5 5 10 10 20 60 60 60 120}
+    local exit_code=1
+    for try in $delays ; do
+         if kill -$send_signal $pid 2> /dev/null ; then
+            exit_code=1
+         else
+            exit_code=0
+            break
+         fi
+         send_signal=0
+         sleep $try
+    done;
+    return $exit_code
+}
+
+function test_kill_daemon() {
+    local dir=$1
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+
+    name_prefix=osd
+    for pidfile in $(find $dir 2>/dev/null | grep $name_prefix'[^/]*\.pid') ; do
+        #
+        # sending signal 0 won't kill the daemon
+        # waiting just for one second instead of the default schedule
+        # allows us to quickly verify what happens when kill fails
+        # to stop the daemon (i.e. it must return false)
+        #
+        ! kill_daemon $pidfile 0 1 || return 1
+        #
+        # killing just the osd and verify the mon still is responsive
+        #
+        kill_daemon $pidfile TERM || return 1
+    done
+
+    ceph osd dump | grep "osd.0 down" || return 1
+
+    for pidfile in $(find $dir -name "*.pid" 2>/dev/null) ; do
+        #
+        # kill the mon and verify it cannot be reached
+        #
+        kill_daemon $pidfile TERM || return 1
+        ! ceph --connect-timeout 60 status || return 1
+    done
+
+    teardown $dir || return 1
+}
+
+##
+# Kill all daemons for which a .pid file exists in **dir**.  Each
+# daemon is sent a **signal** and kill_daemons waits for it to exit
+# during a few minutes. By default all daemons are killed. If a
+# **name_prefix** is provided, only the daemons for which a pid
+# file is found matching the prefix are killed. See run_osd and
+# run_mon for more information about the name conventions for
+# the pid files.
+#
+# Send TERM to all daemons : kill_daemons $dir
+# Send KILL to all daemons : kill_daemons $dir KILL
+# Send KILL to all osds : kill_daemons $dir KILL osd
+# Send KILL to osd 1 : kill_daemons $dir KILL osd.1
+#
+# If a daemon is sent the TERM signal and does not terminate
+# within a few minutes, it will still be running even after
+# kill_daemons returns. 
+#
+# If all daemons are kill successfully the function returns 0
+# if at least one daemon remains, this is treated as an 
+# error and the function return 1.
+#
+# @param dir path name of the environment
+# @param signal name of the first signal (defaults to TERM)
+# @param name_prefix only kill match daemons (defaults to all)
+# @param delays sequence of sleep times before failure
+# @return 0 on success, 1 on error
+#
+function kill_daemons() {
+    local trace=$(shopt -q -o xtrace && echo true || echo false)
+    $trace && shopt -u -o xtrace
+    local dir=$1
+    local signal=${2:-TERM}
+    local name_prefix=$3 # optional, osd, mon, osd.1
+    local delays=$4 #optional timing
+    local status=0
+    local pids=""
+
+    for pidfile in $(find $dir 2>/dev/null | grep $name_prefix'[^/]*\.pid') ; do
+	run_in_background pids kill_daemon $pidfile $signal $delays
+    done
+
+    wait_background pids
+    status=$?
+
+    $trace && shopt -s -o xtrace
+    return $status
+}
+
+function test_kill_daemons() {
+    local dir=$1
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    #
+    # sending signal 0 won't kill the daemon
+    # waiting just for one second instead of the default schedule
+    # allows us to quickly verify what happens when kill fails 
+    # to stop the daemon (i.e. it must return false)
+    #
+    ! kill_daemons $dir 0 osd 1 || return 1
+    #
+    # killing just the osd and verify the mon still is responsive
+    #
+    kill_daemons $dir TERM osd || return 1
+    ceph osd dump | grep "osd.0 down" || return 1
+    #
+    # kill the mon and verify it cannot be reached
+    #
+    kill_daemons $dir TERM || return 1
+    ! ceph --connect-timeout 60 status || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Run a monitor by the name mon.**id** with data in **dir**/**id**.
+# The logs can be found in **dir**/mon.**id**.log and the pid file
+# is **dir**/mon.**id**.pid and the admin socket is
+# **dir**/**id**/ceph-mon.**id**.asok.
+#
+# The remaining arguments are passed verbatim to ceph-mon --mkfs
+# and the ceph-mon daemon.
+#
+# Two mandatory arguments must be provided: --fsid and --mon-host
+# Instead of adding them to every call to run_mon, they can be
+# set in the CEPH_ARGS environment variable to be read implicitly
+# by every ceph command.
+#
+# The CEPH_CONF variable is expected to be set to /dev/null to
+# only rely on arguments for configuration.
+#
+# Examples:
+#
+# CEPH_ARGS="--fsid=$(uuidgen) "
+# CEPH_ARGS+="--mon-host=127.0.0.1:7018 "
+# run_mon $dir a # spawn a mon and bind port 7018
+# run_mon $dir a --debug-filestore=20 # spawn with filestore debugging
+#
+# If mon_initial_members is not set, the default rbd pool is deleted
+# and replaced with a replicated pool with less placement groups to
+# speed up initialization. If mon_initial_members is set, no attempt
+# is made to recreate the rbd pool because it would hang forever,
+# waiting for other mons to join.
+#
+# A **dir**/ceph.conf file is created but not meant to be used by any
+# function.  It is convenient for debugging a failure with:
+#
+#     ceph --conf **dir**/ceph.conf -s
+#
+# @param dir path name of the environment
+# @param id mon identifier
+# @param ... can be any option valid for ceph-mon
+# @return 0 on success, 1 on error
+#
+function run_mon() {
+    local dir=$1
+    shift
+    local id=$1
+    shift
+    local data=$dir/$id
+
+    ceph-mon \
+        --id $id \
+        --mkfs \
+        --mon-data=$data \
+        --run-dir=$dir \
+        "$@" || return 1
+
+    ceph-mon \
+        --id $id \
+        --mon-osd-full-ratio=.99 \
+        --mon-data-avail-crit=1 \
+        --paxos-propose-interval=0.1 \
+        --osd-crush-chooseleaf-type=0 \
+        --erasure-code-dir=$CEPH_LIB \
+        --plugin-dir=$CEPH_LIB \
+        --debug-mon 20 \
+        --debug-ms 20 \
+        --debug-paxos 20 \
+        --chdir= \
+        --mon-data=$data \
+        --log-file=$dir/\$name.log \
+        --admin-socket=$dir/\$cluster-\$name.asok \
+        --mon-cluster-log-file=$dir/log \
+        --run-dir=$dir \
+        --pid-file=$dir/\$name.pid \
+        "$@" || return 1
+
+    cat > $dir/ceph.conf <<EOF
+[global]
+fsid = $(get_config mon $id fsid)
+mon host = $(get_config mon $id mon_host)
+EOF
+    if test -z "$(get_config mon $id mon_initial_members)" ; then
+        ceph osd pool delete rbd rbd --yes-i-really-really-mean-it || return 1
+        ceph osd pool create rbd $PG_NUM || return 1
+    fi
+}
+
+function test_run_mon() {
+    local dir=$1
+
+    setup $dir || return 1
+
+    run_mon $dir a --mon-initial-members=a || return 1
+    # rbd has not been deleted / created, hence it has pool id 0
+    ceph osd dump | grep "pool 0 'rbd'" || return 1
+    kill_daemons $dir || return 1
+
+    run_mon $dir a || return 1
+    # rbd has been deleted / created, hence it does not have pool id 0
+    ! ceph osd dump | grep "pool 0 'rbd'" || return 1
+    local size=$(CEPH_ARGS='' ceph --format=json daemon $dir/ceph-mon.a.asok \
+        config get osd_pool_default_size)
+    test "$size" = '{"osd_pool_default_size":"3"}' || return 1
+
+    ! CEPH_ARGS='' ceph status || return 1
+    CEPH_ARGS='' ceph --conf $dir/ceph.conf status || return 1
+
+    kill_daemons $dir || return 1
+
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    local size=$(CEPH_ARGS='' ceph --format=json daemon $dir/ceph-mon.a.asok \
+        config get osd_pool_default_size)
+    test "$size" = '{"osd_pool_default_size":"1"}' || return 1
+    kill_daemons $dir || return 1
+
+    CEPH_ARGS="$CEPH_ARGS --osd_pool_default_size=2" \
+        run_mon $dir a || return 1
+    local size=$(CEPH_ARGS='' ceph --format=json daemon $dir/ceph-mon.a.asok \
+        config get osd_pool_default_size)
+    test "$size" = '{"osd_pool_default_size":"2"}' || return 1
+    kill_daemons $dir || return 1
+
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Create (prepare) and run (activate) an osd by the name osd.**id**
+# with data in **dir**/**id**.  The logs can be found in
+# **dir**/osd.**id**.log, the pid file is **dir**/osd.**id**.pid and
+# the admin socket is **dir**/**id**/ceph-osd.**id**.asok.
+#
+# The remaining arguments are passed verbatim to ceph-osd.
+#
+# Two mandatory arguments must be provided: --fsid and --mon-host
+# Instead of adding them to every call to run_osd, they can be
+# set in the CEPH_ARGS environment variable to be read implicitly
+# by every ceph command.
+#
+# The CEPH_CONF variable is expected to be set to /dev/null to
+# only rely on arguments for configuration.
+#
+# The run_osd function creates the OSD data directory with ceph-disk
+# prepare on the **dir**/**id** directory and relies on the
+# activate_osd function to run the daemon.
+#
+# Examples:
+#
+# CEPH_ARGS="--fsid=$(uuidgen) "
+# CEPH_ARGS+="--mon-host=127.0.0.1:7018 "
+# run_osd $dir 0 # prepare and activate an osd using the monitor listening on 7018
+#
+# @param dir path name of the environment
+# @param id osd identifier
+# @param ... can be any option valid for ceph-osd
+# @return 0 on success, 1 on error
+#
+function run_osd() {
+    local dir=$1
+    shift
+    local id=$1
+    shift
+    local osd_data=$dir/$id
+
+    local ceph_disk_args
+    ceph_disk_args+=" --statedir=$dir"
+    ceph_disk_args+=" --sysconfdir=$dir"
+    ceph_disk_args+=" --prepend-to-path="
+
+    mkdir -p $osd_data
+    ceph-disk $ceph_disk_args \
+        prepare $osd_data || return 1
+
+    activate_osd $dir $id "$@"
+}
+
+function test_run_osd() {
+    local dir=$1
+
+    setup $dir || return 1
+
+    run_mon $dir a || return 1
+
+    run_osd $dir 0 || return 1
+    local backfills=$(CEPH_ARGS='' ceph --format=json daemon $dir//ceph-osd.0.asok \
+        config get osd_max_backfills)
+    echo "$backfills" | grep --quiet 'osd_max_backfills' || return 1
+
+    run_osd $dir 1 --osd-max-backfills 20 || return 1
+    local backfills=$(CEPH_ARGS='' ceph --format=json daemon $dir//ceph-osd.1.asok \
+        config get osd_max_backfills)
+    test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
+
+    CEPH_ARGS="$CEPH_ARGS --osd-max-backfills 30" run_osd $dir 2 || return 1
+    local backfills=$(CEPH_ARGS='' ceph --format=json daemon $dir//ceph-osd.2.asok \
+        config get osd_max_backfills)
+    test "$backfills" = '{"osd_max_backfills":"30"}' || return 1
+
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Shutdown and remove all traces of the osd by the name osd.**id**.
+#
+# The OSD is shutdown with the TERM signal. It is then removed from
+# the auth list, crush map, osd map etc and the files associated with
+# it are also removed.
+#
+# @param dir path name of the environment
+# @param id osd identifier
+# @return 0 on success, 1 on error
+#
+function destroy_osd() {
+    local dir=$1
+    local id=$2
+
+    kill_daemons $dir TERM osd.$id || return 1
+    ceph osd out osd.$id || return 1
+    ceph auth del osd.$id || return 1
+    ceph osd crush remove osd.$id || return 1
+    ceph osd rm $id || return 1
+    teardown $dir/$id || return 1
+    rm -fr $dir/$id
+}
+
+function test_destroy_osd() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    run_osd $dir 0 || return 1
+    destroy_osd $dir 0 || return 1
+    ! ceph osd dump | grep "osd.$id " || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Run (activate) an osd by the name osd.**id** with data in
+# **dir**/**id**.  The logs can be found in **dir**/osd.**id**.log,
+# the pid file is **dir**/osd.**id**.pid and the admin socket is
+# **dir**/**id**/ceph-osd.**id**.asok.
+#
+# The remaining arguments are passed verbatim to ceph-osd.
+#
+# Two mandatory arguments must be provided: --fsid and --mon-host
+# Instead of adding them to every call to activate_osd, they can be
+# set in the CEPH_ARGS environment variable to be read implicitly
+# by every ceph command.
+#
+# The CEPH_CONF variable is expected to be set to /dev/null to
+# only rely on arguments for configuration.
+#
+# The activate_osd function expects a valid OSD data directory
+# in **dir**/**id**, either just created via run_osd or re-using
+# one left by a previous run of ceph-osd. The ceph-osd daemon is
+# run indirectly via ceph-disk activate.
+#
+# The activate_osd function blocks until the monitor reports the osd
+# up. If it fails to do so within $TIMEOUT seconds, activate_osd
+# fails.
+#
+# Examples:
+#
+# CEPH_ARGS="--fsid=$(uuidgen) "
+# CEPH_ARGS+="--mon-host=127.0.0.1:7018 "
+# activate_osd $dir 0 # activate an osd using the monitor listening on 7018
+#
+# @param dir path name of the environment
+# @param id osd identifier
+# @param ... can be any option valid for ceph-osd
+# @return 0 on success, 1 on error
+#
+function activate_osd() {
+    local dir=$1
+    shift
+    local id=$1
+    shift
+    local osd_data=$dir/$id
+
+    local ceph_disk_args
+    ceph_disk_args+=" --statedir=$dir"
+    ceph_disk_args+=" --sysconfdir=$dir"
+    ceph_disk_args+=" --prepend-to-path="
+
+    local ceph_args="$CEPH_ARGS"
+    ceph_args+=" --osd-backfill-full-ratio=.99"
+    ceph_args+=" --osd-failsafe-full-ratio=.99"
+    ceph_args+=" --osd-journal-size=100"
+    ceph_args+=" --osd-scrub-load-threshold=2000"
+    ceph_args+=" --osd-data=$osd_data"
+    ceph_args+=" --chdir="
+    ceph_args+=" --erasure-code-dir=$CEPH_LIB"
+    ceph_args+=" --plugin-dir=$CEPH_LIB"
+    ceph_args+=" --osd-class-dir=$CEPH_LIB"
+    ceph_args+=" --run-dir=$dir"
+    ceph_args+=" --debug-osd=20"
+    ceph_args+=" --log-file=$dir/\$name.log"
+    ceph_args+=" --pid-file=$dir/\$name.pid"
+    ceph_args+=" --osd-max-object-name-len 460"
+    ceph_args+=" --osd-max-object-namespace-len 64"
+    ceph_args+=" "
+    ceph_args+="$@"
+    mkdir -p $osd_data
+    CEPH_ARGS="$ceph_args " ceph-disk $ceph_disk_args \
+        activate \
+        --mark-init=none \
+        $osd_data || return 1
+
+    [ "$id" = "$(cat $osd_data/whoami)" ] || return 1
+
+    ceph osd crush create-or-move "$id" 1 root=default host=localhost
+
+    wait_for_osd up $id || return 1
+}
+
+function test_activate_osd() {
+    local dir=$1
+
+    setup $dir || return 1
+
+    run_mon $dir a || return 1
+
+    run_osd $dir 0 || return 1
+    local backfills=$(CEPH_ARGS='' ceph --format=json daemon $dir//ceph-osd.0.asok \
+        config get osd_max_backfills)
+    echo "$backfills" | grep --quiet 'osd_max_backfills' || return 1
+
+    kill_daemons $dir TERM osd || return 1
+
+    activate_osd $dir 0 --osd-max-backfills 20 || return 1
+    local backfills=$(CEPH_ARGS='' ceph --format=json daemon $dir//ceph-osd.0.asok \
+        config get osd_max_backfills)
+    test "$backfills" = '{"osd_max_backfills":"20"}' || return 1
+
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Wait until the OSD **id** is either up or down, as specified by
+# **state**. It fails after $TIMEOUT seconds.
+#
+# @param state either up or down
+# @param id osd identifier
+# @return 0 on success, 1 on error
+#
+function wait_for_osd() {
+    local state=$1
+    local id=$2
+
+    status=1
+    for ((i=0; i < $TIMEOUT; i++)); do
+        echo $i
+        if ! ceph osd dump | grep "osd.$id $state"; then
+            sleep 1
+        else
+            status=0
+            break
+        fi
+    done
+    return $status
+}
+
+function test_wait_for_osd() {
+    local dir=$1
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_osd up 0 || return 1
+    kill_daemons $dir TERM osd || return 1
+    wait_for_osd down 0 || return 1
+    ( TIMEOUT=1 ; ! wait_for_osd up 0 ) || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Display the list of OSD ids supporting the **objectname** stored in
+# **poolname**, as reported by ceph osd map.
+#
+# @param poolname an existing pool
+# @param objectname an objectname (may or may not exist)
+# @param STDOUT white space separated list of OSD ids
+# @return 0 on success, 1 on error
+#
+function get_osds() {
+    local poolname=$1
+    local objectname=$2
+
+    local osds=$(ceph --format xml osd map $poolname $objectname 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//acting/osd" -v . -o ' ')
+    # get rid of the trailing space
+    echo $osds
+}
+
+function test_get_osds() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=2 || return 1
+    run_osd $dir 0 || return 1
+    run_osd $dir 1 || return 1
+    wait_for_clean || return 1
+    get_osds rbd GROUP | grep --quiet '^[0-1] [0-1]$' || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the PG of supporting the **objectname** stored in
+# **poolname**, as reported by ceph osd map.
+#
+# @param poolname an existing pool
+# @param objectname an objectname (may or may not exist)
+# @param STDOUT a PG
+# @return 0 on success, 1 on error
+#
+function get_pg() {
+    local poolname=$1
+    local objectname=$2
+
+    ceph --format xml osd map $poolname $objectname 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//pgid" -v . -n
+}
+
+function test_get_pg() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    get_pg rbd GROUP | grep --quiet '^[0-9]\.[0-9a-f][0-9a-f]*$' || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the value of the **config**, obtained via the config get command
+# of the admin socket of **daemon**.**id**.
+#
+# @param daemon mon or osd
+# @param id mon or osd ID
+# @param config the configuration variable name as found in config_opts.h
+# @param STDOUT the config value
+# @return 0 on success, 1 on error
+#
+function get_config() {
+    local daemon=$1
+    local id=$2
+    local config=$3
+
+    CEPH_ARGS='' \
+        ceph --format xml daemon $dir/ceph-$daemon.$id.asok \
+        config get $config 2> /dev/null | \
+        $XMLSTARLET sel -t -m "//$config" -v . -n
+}
+
+function test_get_config() {
+    local dir=$1
+
+    # override the default config using command line arg and check it
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    test $(get_config mon a osd_pool_default_size) = 1 || return 1
+    run_osd $dir 0 --osd_max_scrubs=3 || return 1
+    test $(get_config osd 0 osd_max_scrubs) = 3 || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Set the **config** to specified **value**, via the config set command
+# of the admin socket of **daemon**.**id**
+#
+# @param daemon mon or osd
+# @param id mon or osd ID
+# @param config the configuration variable name as found in config_opts.h
+# @param value the config value
+# @return 0 on success, 1 on error
+#
+function set_config() {
+    local daemon=$1
+    local id=$2
+    local config=$3
+    local value=$4
+
+    CEPH_ARGS='' \
+        ceph --format xml daemon $dir/ceph-$daemon.$id.asok \
+        config set $config $value 2> /dev/null | \
+        $XMLSTARLET sel -Q -t -m "//success" -v .
+}
+
+function test_set_config() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    test $(get_config mon a ms_crc_header) = true || return 1
+    set_config mon a ms_crc_header false || return 1
+    test $(get_config mon a ms_crc_header) = false || return 1
+    set_config mon a ms_crc_header true || return 1
+    test $(get_config mon a ms_crc_header) = true || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the OSD id of the primary OSD supporting the **objectname**
+# stored in **poolname**, as reported by ceph osd map.
+#
+# @param poolname an existing pool
+# @param objectname an objectname (may or may not exist)
+# @param STDOUT the primary OSD id
+# @return 0 on success, 1 on error
+#
+function get_primary() {
+    local poolname=$1
+    local objectname=$2
+
+    ceph --format xml osd map $poolname $objectname 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//acting_primary" -v . -n
+}
+
+function test_get_primary() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    local osd=0
+    run_osd $dir $osd || return 1
+    wait_for_clean || return 1
+    test $(get_primary rbd GROUP) = $osd || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the id of any OSD supporting the **objectname** stored in
+# **poolname**, as reported by ceph osd map, except the primary.
+#
+# @param poolname an existing pool
+# @param objectname an objectname (may or may not exist)
+# @param STDOUT the OSD id
+# @return 0 on success, 1 on error
+#
+function get_not_primary() {
+    local poolname=$1
+    local objectname=$2
+
+    local primary=$(get_primary $poolname $objectname)
+    ceph --format xml osd map $poolname $objectname 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//acting/osd[not(.='$primary')]" -v . -n | \
+        head -1
+}
+
+function test_get_not_primary() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=2 || return 1
+    run_osd $dir 0 || return 1
+    run_osd $dir 1 || return 1
+    wait_for_clean || return 1
+    local primary=$(get_primary rbd GROUP)
+    local not_primary=$(get_not_primary rbd GROUP)
+    test $not_primary != $primary || return 1
+    test $not_primary = 0 -o $not_primary = 1 || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Run ceph-objectstore-tool against the OSD **id** using the data path
+# **dir**. The OSD is killed with TERM prior to running
+# ceph-objectstore-tool because access to the data path is
+# exclusive. The OSD is restarted after the command completes. The
+# objectstore_tool returns after all PG are active+clean again.
+#
+# @param dir the data path of the OSD
+# @param id the OSD id
+# @param ... arguments to ceph-objectstore-tool
+# @param STDIN the input of ceph-objectstore-tool
+# @param STDOUT the output of ceph-objectstore-tool
+# @return 0 on success, 1 on error
+#
+function objectstore_tool() {
+    local dir=$1
+    shift
+    local id=$1
+    shift
+    local osd_data=$dir/$id
+
+    kill_daemons $dir TERM osd.$id >&2 < /dev/null || return 1
+    ceph-objectstore-tool \
+        --data-path $osd_data \
+        --journal-path $osd_data/journal \
+        "$@" || return 1
+    activate_osd $dir $id >&2 || return 1
+    wait_for_clean >&2
+}
+
+function test_objectstore_tool() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    local osd=0
+    run_osd $dir $osd || return 1
+    wait_for_clean || return 1
+    rados --pool rbd put GROUP /etc/group || return 1
+    objectstore_tool $dir $osd GROUP get-bytes | \
+        diff - /etc/group
+    ! objectstore_tool $dir $osd NOTEXISTS get-bytes || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Predicate checking if there is an ongoing recovery in the
+# cluster. If any of the recovering_{keys,bytes,objects}_per_sec
+# counters are reported by ceph status, it means recovery is in
+# progress.
+#
+# @return 0 if recovery in progress, 1 otherwise
+#
+function get_is_making_recovery_progress() {
+    local progress=$(ceph --format xml status 2>/dev/null | \
+        $XMLSTARLET sel \
+        -t -m "//pgmap/recovering_keys_per_sec" -v . -o ' ' \
+        -t -m "//pgmap/recovering_bytes_per_sec" -v . -o ' ' \
+        -t -m "//pgmap/recovering_objects_per_sec" -v .)
+    test -n "$progress"
+}
+
+function test_get_is_making_recovery_progress() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    ! get_is_making_recovery_progress || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the number of active PGs in the cluster. A PG is active if
+# ceph pg dump pgs reports it both **active** and **clean** and that
+# not **stale**.
+#
+# @param STDOUT the number of active PGs
+# @return 0 on success, 1 on error
+#
+function get_num_active_clean() {
+    local expression="("
+    expression+="contains(.,'active') and "
+    expression+="contains(.,'clean') and "
+    expression+="not(contains(.,'stale'))"
+    expression+=")"
+    # xmlstarlet 1.3.0 (which is on Ubuntu precise)
+    # add extra new lines that must be ignored with
+    # grep -v '^$' 
+    ceph --format xml pg dump pgs 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//pg_stat/state[$expression]" -v . -n | \
+        grep -cv '^$'
+}
+
+function test_get_num_active_clean() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    local num_active_clean=$(get_num_active_clean)
+    test "$num_active_clean" = $PG_NUM || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the number of PGs in the cluster, according to
+# ceph pg dump pgs.
+#
+# @param STDOUT the number of PGs
+# @return 0 on success, 1 on error
+#
+function get_num_pgs() {
+    ceph --format xml status 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//pgmap/num_pgs" -v .
+}
+
+function test_get_num_pgs() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    local num_pgs=$(get_num_pgs)
+    test "$num_pgs" -gt 0 || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return the date and time of the last completed scrub for **pgid**,
+# as reported by ceph pg dump pgs. Note that a repair also sets this
+# date.
+#
+# @param pgid the id of the PG
+# @param STDOUT the date and time of the last scrub
+# @return 0 on success, 1 on error
+#
+function get_last_scrub_stamp() {
+    local pgid=$1
+    ceph --format xml pg dump pgs 2>/dev/null | \
+        $XMLSTARLET sel -t -m "//pg_stat[pgid='$pgid']/last_scrub_stamp" -v .
+}
+
+function test_get_last_scrub_stamp() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    stamp=$(get_last_scrub_stamp 1.0)
+    test -n "$stamp" || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Predicate checking if the cluster is clean, i.e. all of its PGs are
+# in a clean state (see get_num_active_clean for a definition).
+#
+# @return 0 if the cluster is clean, 1 otherwise
+#
+function is_clean() {
+    num_pgs=$(get_num_pgs)
+    test $num_pgs != 0 || return 1
+    test $(get_num_active_clean) = $num_pgs || return 1
+}
+
+function test_is_clean() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    ! is_clean || return 1
+    wait_for_clean || return 1
+    is_clean || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Wait until the cluster becomes clean or if it does not make progress
+# for $TIMEOUT seconds.
+# Progress is measured either via the **get_is_making_recovery_progress**
+# predicate or if the number of clean PGs changes (as returned by get_num_active_clean)
+#
+# @return 0 if the cluster is clean, 1 otherwise
+#
+function wait_for_clean() {
+    local status=1
+    local num_active_clean=-1
+    local cur_active_clean
+    local -i timer=0
+    local num_pgs=$(get_num_pgs)
+    test $num_pgs != 0 || return 1
+
+    while true ; do
+        # Comparing get_num_active_clean & get_num_pgs is used to determine
+        # if the cluster is clean. That's almost an inline of is_clean() to
+        # get more performance by avoiding multiple calls of get_num_active_clean.
+        cur_active_clean=$(get_num_active_clean)
+        test $cur_active_clean = $num_pgs && break
+        if test $cur_active_clean != $num_active_clean ; then
+            timer=0
+            num_active_clean=$cur_active_clean
+        elif get_is_making_recovery_progress ; then
+            timer=0
+        elif (( timer >= $(($TIMEOUT * 10)))) ; then
+            ceph report
+            return 1
+        fi
+        sleep .1
+        timer=$(expr $timer + 1)
+    done
+    return 0
+}
+
+function test_wait_for_clean() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    ! TIMEOUT=1 wait_for_clean || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Run repair on **pgid** and wait until it completes. The repair
+# function will fail if repair does not complete within $TIMEOUT
+# seconds.
+#
+# @param pgid the id of the PG
+# @return 0 on success, 1 on error
+#
+function repair() {
+    local pgid=$1
+    local last_scrub=$(get_last_scrub_stamp $pgid)
+    ceph pg repair $pgid
+    wait_for_scrub $pgid "$last_scrub"
+}
+
+function test_repair() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    repair 1.0 || return 1
+    kill_daemons $dir KILL osd || return 1
+    ! TIMEOUT=1 repair 1.0 || return 1
+    teardown $dir || return 1
+}
+#######################################################################
+
+##
+# Run scrub on **pgid** and wait until it completes. The pg_scrub
+# function will fail if repair does not complete within $TIMEOUT
+# seconds. The pg_scrub is complete whenever the
+# **get_last_scrub_stamp** function reports a timestamp different from
+# the one stored before starting the scrub.
+#
+# @param pgid the id of the PG
+# @return 0 on success, 1 on error
+#
+function pg_scrub() {
+    local pgid=$1
+    local last_scrub=$(get_last_scrub_stamp $pgid)
+    ceph pg scrub $pgid
+    wait_for_scrub $pgid "$last_scrub"
+}
+
+function test_pg_scrub() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    pg_scrub 1.0 || return 1
+    kill_daemons $dir KILL osd || return 1
+    ! TIMEOUT=1 pg_scrub 1.0 || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Run the *command* and expect it to fail (i.e. return a non zero status).
+# The output (stderr and stdout) is stored in a temporary file in *dir*
+# and is expected to contain the string *expected*.
+#
+# Return 0 if the command failed and the string was found. Otherwise
+# return 1 and cat the full output of the command on stderr for debug.
+#
+# @param dir temporary directory to store the output
+# @param expected string to look for in the output
+# @param command ... the command and its arguments
+# @return 0 on success, 1 on error
+#
+
+function expect_failure() {
+    local dir=$1
+    shift
+    local expected="$1"
+    shift
+    local success
+
+    if "$@" > $dir/out 2>&1 ; then
+        success=true
+    else
+        success=false
+    fi
+
+    if $success || ! grep --quiet "$expected" $dir/out ; then
+        cat $dir/out >&2
+        return 1
+    else
+        return 0
+    fi
+}
+
+function test_expect_failure() {
+    local dir=$1
+
+    setup $dir || return 1
+    expect_failure $dir FAIL bash -c 'echo FAIL ; exit 1' || return 1
+    # the command did not fail
+    ! expect_failure $dir FAIL bash -c 'echo FAIL ; exit 0' > $dir/out || return 1
+    grep --quiet FAIL $dir/out || return 1
+    # the command failed but the output does not contain the expected string
+    ! expect_failure $dir FAIL bash -c 'echo UNEXPECTED ; exit 1' > $dir/out || return 1
+    ! grep --quiet FAIL $dir/out || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Given the *last_scrub*, wait for scrub to happen on **pgid**.  It
+# will fail if scrub does not complete within $TIMEOUT seconds. The
+# repair is complete whenever the **get_last_scrub_stamp** function
+# reports a timestamp different from the one given in argument.
+#
+# @param pgid the id of the PG
+# @param last_scrub timestamp of the last scrub for *pgid*
+# @return 0 on success, 1 on error
+#
+function wait_for_scrub() {
+    local pgid=$1
+    local last_scrub="$2"
+
+    for ((i=0; i < $TIMEOUT; i++)); do
+        if test "$last_scrub" != "$(get_last_scrub_stamp $pgid)" ; then
+            return 0
+        fi
+        sleep 1
+    done
+    return 1
+}
+
+function test_wait_for_scrub() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a --osd_pool_default_size=1 || return 1
+    run_osd $dir 0 || return 1
+    wait_for_clean || return 1
+    local pgid=1.0
+    ceph pg repair $pgid
+    local last_scrub=$(get_last_scrub_stamp $pgid)
+    wait_for_scrub $pgid "$last_scrub" || return 1
+    kill_daemons $dir KILL osd || return 1
+    last_scrub=$(get_last_scrub_stamp $pgid)
+    ! TIMEOUT=1 wait_for_scrub $pgid "$last_scrub" || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Return 0 if the erasure code *plugin* is available, 1 otherwise.
+#
+# @param plugin erasure code plugin
+# @return 0 on success, 1 on error
+#
+
+function erasure_code_plugin_exists() {
+    local plugin=$1
+
+    local status
+    if ceph osd erasure-code-profile set TESTPROFILE plugin=$plugin 2>&1 |
+        grep "$plugin.*No such file" ; then
+        status=1
+    else
+        status=0
+        ceph osd erasure-code-profile rm TESTPROFILE
+    fi
+    return $status
+}
+
+function test_erasure_code_plugin_exists() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    erasure_code_plugin_exists jerasure || return 1
+    ! erasure_code_plugin_exists FAKE || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+
+##
+# Display all log files from **dir** on stdout.
+#
+# @param dir directory in which all data is stored
+#
+
+function display_logs() {
+    local dir=$1
+
+    find $dir -maxdepth 1 -name '*.log' | \
+        while read file ; do
+            echo "======================= $file"
+            cat $file
+        done
+}
+
+function test_display_logs() {
+    local dir=$1
+
+    setup $dir || return 1
+    run_mon $dir a || return 1
+    kill_daemons $dir || return 1
+    display_logs $dir > $dir/log.out
+    grep --quiet mon.a.log $dir/log.out || return 1
+    teardown $dir || return 1
+}
+
+#######################################################################
+##
+# Spawn a command in background and save the pid in the variable name
+# passed in argument. To make the output reading easier, the output is
+# prepend with the process id.
+#
+# Example:
+#   pids1=""
+#   run_in_background pids1 bash -c 'sleep 1; exit 1'
+#
+# @param pid_variable the variable name (not value) where the pids will be stored
+# @param ... the command to execute
+# @return only the pid_variable output should be considered and used with **wait_background**
+#
+function run_in_background() {
+    local pid_variable=$1
+    shift;
+    # Execute the command and prepend the output with its pid
+    # We enforce to return the exit status of the command and not the awk one.
+    ("$@" |& awk '{ a[i++] = $0 }END{for (i = 0; i in a; ++i) { print PROCINFO["pid"] ": " a[i]} }'; return ${PIPESTATUS[0]}) &
+    eval "$pid_variable+=\" $!\""
+}
+
+function test_run_in_background() {
+    local pids
+    run_in_background pids sleep 1
+    run_in_background pids sleep 1
+    test $(echo $pids | wc -w) = 2 || return 1
+    wait $pids || return 1
+}
+
+#######################################################################
+##
+# Wait for pids running in background to complete.
+# This function is usually used after a **run_in_background** call
+# Example:
+#   pids1=""
+#   run_in_background pids1 bash -c 'sleep 1; exit 1'
+#   wait_background pids1
+#
+# @param pids The variable name that contains the active PIDS. Set as empty at then end of the function.
+# @return returns 1 if at least one process exits in error unless returns 0
+#
+function wait_background() {
+    # We extract the PIDS from the variable name
+    pids=${!1}
+
+    return_code=0
+    for pid in $pids; do
+        if ! wait $pid; then
+            # If one process failed then return 1
+            return_code=1
+        fi
+    done
+
+    # We empty the variable reporting that all process ended
+    eval "$1=''"
+
+    return $return_code
+}
+
+
+function test_wait_background() {
+    local pids=""
+    run_in_background pids bash -c "sleep 1; exit 1"
+    run_in_background pids bash -c "sleep 2; exit 0"
+    wait_background pids
+    if [ $? -ne 1 ]; then return 1; fi
+
+    run_in_background pids bash -c "sleep 1; exit 0"
+    run_in_background pids bash -c "sleep 2; exit 0"
+    wait_background pids
+    if [ $? -ne 0 ]; then return 1; fi
+
+    if [ ! -z "$pids" ]; then return 1; fi
+}
+
+#######################################################################
+
+##
+# Call the **run** function (which must be defined by the caller) with
+# the **dir** argument followed by the caller argument list.
+#
+# If the **run** function returns on error, all logs found in **dir**
+# are displayed for diagnostic purposes.
+#
+# **teardown** function is called when the **run** function returns
+# (on success or on error), to cleanup leftovers. The CEPH_CONF is set
+# to /dev/null and CEPH_ARGS is unset so that the tests are protected from
+# external interferences.
+#
+# It is the responsibility of the **run** function to call the
+# **setup** function to prepare the test environment (create a temporary
+# directory etc.).
+#
+# The shell is required (via PS4) to display the function and line
+# number whenever a statement is executed to help debugging.
+#
+# @param dir directory in which all data is stored
+# @param ... arguments passed transparently to **run**
+# @return 0 on success, 1 on error
+#
+function main() {
+    local dir=testdir/$1
+    shift
+
+    shopt -s -o xtrace
+    PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}:  '
+
+    export PATH=${CEPH_BUILD_VIRTUALENV}/ceph-disk-virtualenv/bin:${CEPH_BUILD_VIRTUALENV}/ceph-detect-init-virtualenv/bin:.:$PATH # make sure program from sources are prefered
+    #export PATH=$CEPH_ROOT/src/ceph-disk/virtualenv/bin:$CEPH_ROOT/src/ceph-detect-init/virtualenv/bin:.:$PATH # make sure program from sources are prefered
+
+    export CEPH_CONF=/dev/null
+    unset CEPH_ARGS
+
+    local code
+    if run $dir "$@" ; then
+        code=0
+    else
+        display_logs $dir
+        code=1
+    fi
+    teardown $dir || return 1
+    return $code
+}
+
+#######################################################################
+
+function run_tests() {
+    shopt -s -o xtrace
+    PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}:  '
+
+    export PATH=${CEPH_BUILD_VIRTUALENV}/ceph-disk-virtualenv/bin:${CEPH_BUILD_VIRTUALENV}/ceph-detect-init-virtualenv/bin:.:$PATH # make sure program from sources are prefered
+    #export PATH=$CEPH_ROOT/src/ceph-disk/virtualenv/bin:$CEPH_ROOT/src/ceph-detect-init/virtualenv/bin:.:$PATH # make sure program from sources are prefered
+
+    export CEPH_MON="127.0.0.1:7109" # git grep '\<7109\>' : there must be only one
+    export CEPH_ARGS
+    CEPH_ARGS+="--fsid=$(uuidgen) --auth-supported=none "
+    CEPH_ARGS+="--mon-host=$CEPH_MON "
+    export CEPH_CONF=/dev/null
+
+    local funcs=${@:-$(set | sed -n -e 's/^\(test_[0-9a-z_]*\) .*/\1/p')}
+    local dir=testdir/ceph-helpers
+
+    for func in $funcs ; do
+        $func $dir || return 1
+    done
+}
+
+if test "$1" = TESTS ; then
+    shift
+    run_tests "$@"
+fi
+
+# Local Variables:
+# compile-command: "cd ../../src ; make -j4 && ../qa/workunits/ceph-helpers.sh TESTS # test_get_config"
+# End:
diff --git a/qa/workunits/ceph-tests/ceph-admin-commands.sh b/qa/workunits/ceph-tests/ceph-admin-commands.sh
new file mode 100755
index 0000000..30e74cc
--- /dev/null
+++ b/qa/workunits/ceph-tests/ceph-admin-commands.sh
@@ -0,0 +1,13 @@
+#!/bin/sh -e
+
+#check ceph health
+ceph -s
+#list pools
+rados lspools
+#lisr rbd images
+rbd ls
+#check that the monitors work
+ceph osd set nodown
+ceph osd unset nodown
+
+exit 0
diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh
new file mode 100755
index 0000000..1ad5f53
--- /dev/null
+++ b/qa/workunits/cephtool/test.sh
@@ -0,0 +1,1977 @@
+#!/bin/bash -x
+
+source $(dirname $0)/../ceph-helpers.sh
+
+set -e
+set -o functrace
+PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}:  '
+SUDO=${SUDO:-sudo}
+
+function check_no_osd_down()
+{
+    ! ceph osd dump | grep ' down '
+}
+
+function wait_no_osd_down()
+{
+  for i in $(seq 1 300) ; do
+    if ! check_no_osd_down ; then
+      echo "waiting for osd(s) to come back up"
+      sleep 1
+    else
+      break
+    fi
+  done
+  check_no_osd_down
+}
+
+function expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+TMPDIR=/tmp/cephtool$$
+mkdir $TMPDIR
+trap "rm -fr $TMPDIR" 0
+
+TMPFILE=$TMPDIR/test_invalid.$$
+
+#
+# retry_eagain max cmd args ...
+#
+# retry cmd args ... if it exits on error and its output contains the
+# string EAGAIN, at most $max times
+#
+function retry_eagain()
+{
+    local max=$1
+    shift
+    local status
+    local tmpfile=$TMPDIR/retry_eagain.$$
+    local count
+    for count in $(seq 1 $max) ; do
+        status=0
+        "$@" > $tmpfile 2>&1 || status=$?
+        if test $status = 0 || 
+            ! grep --quiet EAGAIN $tmpfile ; then
+            break
+        fi
+        sleep 1
+    done
+    if test $count = $max ; then
+        echo retried with non zero exit status, $max times: "$@" >&2
+    fi
+    cat $tmpfile
+    rm $tmpfile
+    return $status
+}
+
+#
+# map_enxio_to_eagain cmd arg ...
+#
+# add EAGAIN to the output of cmd arg ... if the output contains
+# ENXIO.
+#
+function map_enxio_to_eagain()
+{
+    local status=0
+    local tmpfile=$TMPDIR/map_enxio_to_eagain.$$
+
+    "$@" > $tmpfile 2>&1 || status=$?
+    if test $status != 0 &&
+        grep --quiet ENXIO $tmpfile ; then
+        echo "EAGAIN added by $0::map_enxio_to_eagain" >> $tmpfile
+    fi
+    cat $tmpfile
+    rm $tmpfile
+    return $status
+}
+
+function check_response()
+{
+	expected_string=$1
+	retcode=$2
+	expected_retcode=$3
+	if [ "$expected_retcode" -a $retcode != $expected_retcode ] ; then
+		echo "return code invalid: got $retcode, expected $expected_retcode" >&2
+		exit 1
+	fi
+
+	if ! grep --quiet -- "$expected_string" $TMPFILE ; then 
+		echo "Didn't find $expected_string in output" >&2
+		cat $TMPFILE >&2
+		exit 1
+	fi
+}
+
+function get_config_value_or_die()
+{
+  local target config_opt raw val
+
+  target=$1
+  config_opt=$2
+
+  raw="`$SUDO ceph daemon $target config get $config_opt 2>/dev/null`"
+  if [[ $? -ne 0 ]]; then
+    echo "error obtaining config opt '$config_opt' from '$target': $raw"
+    exit 1
+  fi
+
+  raw=`echo $raw | sed -e 's/[{} "]//g'`
+  val=`echo $raw | cut -f2 -d:`
+
+  echo "$val"
+  return 0
+}
+
+function expect_config_value()
+{
+  local target config_opt expected_val val
+  target=$1
+  config_opt=$2
+  expected_val=$3
+
+  val=$(get_config_value_or_die $target $config_opt)
+
+  if [[ "$val" != "$expected_val" ]]; then
+    echo "expected '$expected_val', got '$val'"
+    exit 1
+  fi
+}
+
+function ceph_watch_start()
+{
+    local whatch_opt=--watch
+
+    if [ -n "$1" ]; then
+	whatch_opt=--watch-$1
+    fi
+
+    CEPH_WATCH_FILE=${TMPDIR}/CEPH_WATCH_$$
+    ceph $whatch_opt > $CEPH_WATCH_FILE &
+    CEPH_WATCH_PID=$!
+
+    # wait until the "ceph" client is connected and receiving
+    # log messages from monitor
+    for i in `seq 3`; do
+        grep -q "cluster" $CEPH_WATCH_FILE && break
+        sleep 1
+    done
+}
+
+function ceph_watch_wait()
+{
+    local regexp=$1
+    local timeout=30
+
+    if [ -n "$2" ]; then
+	timeout=$2
+    fi
+
+    for i in `seq ${timeout}`; do
+	grep -q "$regexp" $CEPH_WATCH_FILE && break
+	sleep 1
+    done
+
+    kill $CEPH_WATCH_PID
+
+    if ! grep "$regexp" $CEPH_WATCH_FILE; then
+	echo "pattern ${regexp} not found in watch file. Full watch file content:" >&2
+	cat $CEPH_WATCH_FILE >&2
+	return 1
+    fi
+}
+
+function test_mon_injectargs()
+{
+  CEPH_ARGS='--mon_debug_dump_location the.dump' ceph tell osd.0 injectargs --no-osd_enable_op_tracker >& $TMPFILE || return 1
+  check_response "osd_enable_op_tracker = 'false'"
+  ! grep "the.dump" $TMPFILE || return 1
+  ceph tell osd.0 injectargs '--osd_enable_op_tracker --osd_op_history_duration 500' >& $TMPFILE || return 1
+  check_response "osd_enable_op_tracker = 'true' osd_op_history_duration = '500'"
+  ceph tell osd.0 injectargs --no-osd_enable_op_tracker >& $TMPFILE || return 1
+  check_response "osd_enable_op_tracker = 'false'"
+  ceph tell osd.0 injectargs -- --osd_enable_op_tracker >& $TMPFILE || return 1
+  check_response "osd_enable_op_tracker = 'true'"
+  ceph tell osd.0 injectargs -- '--osd_enable_op_tracker --osd_op_history_duration 600' >& $TMPFILE || return 1
+  check_response "osd_enable_op_tracker = 'true' osd_op_history_duration = '600'"
+  ceph tell osd.0 injectargs -- '--osd_op_history_duration' >& $TMPFILE || return 1
+  check_response "Option --osd_op_history_duration requires an argument"
+
+  ceph tell osd.0 injectargs -- '--mon-lease 6' >& $TMPFILE || return 1
+  check_response "mon_lease = '6' (unchangeable)"
+}
+
+function test_mon_injectargs_SI()
+{
+  # Test SI units during injectargs and 'config set'
+  # We only aim at testing the units are parsed accordingly
+  # and don't intend to test whether the options being set
+  # actually expect SI units to be passed.
+  # Keep in mind that all integer based options (i.e., INT,
+  # LONG, U32, U64) will accept SI unit modifiers.
+  initial_value=$(get_config_value_or_die "mon.a" "mon_pg_warn_min_objects")
+  $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects 10
+  expect_config_value "mon.a" "mon_pg_warn_min_objects" 10
+  $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects 10K
+  expect_config_value "mon.a" "mon_pg_warn_min_objects" 10240
+  $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects 1G
+  expect_config_value "mon.a" "mon_pg_warn_min_objects" 1073741824
+  $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects 10F > $TMPFILE || true
+  check_response "'10F': (22) Invalid argument"
+  # now test with injectargs
+  ceph tell mon.a injectargs '--mon_pg_warn_min_objects 10'
+  expect_config_value "mon.a" "mon_pg_warn_min_objects" 10
+  ceph tell mon.a injectargs '--mon_pg_warn_min_objects 10K'
+  expect_config_value "mon.a" "mon_pg_warn_min_objects" 10240
+  ceph tell mon.a injectargs '--mon_pg_warn_min_objects 1G'
+  expect_config_value "mon.a" "mon_pg_warn_min_objects" 1073741824
+  expect_false ceph tell mon.a injectargs '--mon_pg_warn_min_objects 10F'
+  $SUDO ceph daemon mon.a config set mon_pg_warn_min_objects $initial_value
+}
+
+function test_tiering_agent()
+{
+  local slow=slow_eviction
+  local fast=fast_eviction
+  ceph osd pool create $slow  1 1
+  ceph osd pool create $fast  1 1
+  ceph osd tier add $slow $fast
+  ceph osd tier cache-mode $fast writeback
+  ceph osd tier set-overlay $slow $fast
+  ceph osd pool set $fast hit_set_type bloom
+  rados -p $slow put obj1 /etc/group
+  ceph osd pool set $fast target_max_objects  1
+  ceph osd pool set $fast hit_set_count 1
+  ceph osd pool set $fast hit_set_period 5
+  # wait for the object to be evicted from the cache
+  local evicted
+  evicted=false
+  for i in `seq 1 300` ; do
+      if ! rados -p $fast ls | grep obj1 ; then
+          evicted=true
+          break
+      fi
+      sleep 1
+  done
+  $evicted # assert
+  # the object is proxy read and promoted to the cache
+  rados -p $slow get obj1 - >/dev/null
+  # wait for the promoted object to be evicted again
+  evicted=false
+  for i in `seq 1 300` ; do
+      if ! rados -p $fast ls | grep obj1 ; then
+          evicted=true
+          break
+      fi
+      sleep 1
+  done
+  $evicted # assert
+  ceph osd tier remove-overlay $slow
+  ceph osd tier remove $slow $fast
+  ceph osd pool delete $fast $fast --yes-i-really-really-mean-it
+  ceph osd pool delete $slow $slow --yes-i-really-really-mean-it
+}
+
+function test_tiering()
+{
+  # tiering
+  ceph osd pool create slow 2
+  ceph osd pool create slow2 2
+  ceph osd pool create cache 2
+  ceph osd pool create cache2 2
+  ceph osd tier add slow cache
+  ceph osd tier add slow cache2
+  expect_false ceph osd tier add slow2 cache
+  # test some state transitions
+  ceph osd tier cache-mode cache writeback
+  expect_false ceph osd tier cache-mode cache forward
+  ceph osd tier cache-mode cache forward --yes-i-really-mean-it
+  expect_false ceph osd tier cache-mode cache readonly
+  ceph osd tier cache-mode cache readonly --yes-i-really-mean-it
+  expect_false ceph osd tier cache-mode cache forward
+  ceph osd tier cache-mode cache forward --yes-i-really-mean-it
+  ceph osd tier cache-mode cache none
+  ceph osd tier cache-mode cache writeback
+  ceph osd tier cache-mode cache proxy
+  ceph osd tier cache-mode cache writeback
+  expect_false ceph osd tier cache-mode cache none
+  expect_false ceph osd tier cache-mode cache readonly --yes-i-really-mean-it
+  # test with dirty objects in the tier pool
+  # tier pool currently set to 'writeback'
+  rados -p cache put /etc/passwd /etc/passwd
+  ceph tell osd.\* flush_pg_stats || true
+  # 1 dirty object in pool 'cache'
+  ceph osd tier cache-mode cache proxy
+  expect_false ceph osd tier cache-mode cache none
+  expect_false ceph osd tier cache-mode cache readonly --yes-i-really-mean-it
+  ceph osd tier cache-mode cache writeback
+  # remove object from tier pool
+  rados -p cache rm /etc/passwd
+  rados -p cache cache-flush-evict-all
+  ceph tell osd.\* flush_pg_stats || true
+  # no dirty objects in pool 'cache'
+  ceph osd tier cache-mode cache proxy
+  ceph osd tier cache-mode cache none
+  ceph osd tier cache-mode cache readonly --yes-i-really-mean-it
+  TRIES=0
+  while ! ceph osd pool set cache pg_num 3 --yes-i-really-mean-it 2>$TMPFILE
+  do
+    grep 'currently creating pgs' $TMPFILE
+    TRIES=$(( $TRIES + 1 ))
+    test $TRIES -ne 60
+    sleep 3
+  done
+  expect_false ceph osd pool set cache pg_num 4
+  ceph osd tier cache-mode cache none
+  ceph osd tier set-overlay slow cache
+  expect_false ceph osd tier set-overlay slow cache2
+  expect_false ceph osd tier remove slow cache
+  ceph osd tier remove-overlay slow
+  ceph osd tier set-overlay slow cache2
+  ceph osd tier remove-overlay slow
+  ceph osd tier remove slow cache
+  ceph osd tier add slow2 cache
+  expect_false ceph osd tier set-overlay slow cache
+  ceph osd tier set-overlay slow2 cache
+  ceph osd tier remove-overlay slow2
+  ceph osd tier remove slow2 cache
+  ceph osd tier remove slow cache2
+
+  # make sure a non-empty pool fails
+  rados -p cache2 put /etc/passwd /etc/passwd
+  while ! ceph df | grep cache2 | grep ' 1 ' ; do
+    echo waiting for pg stats to flush
+    sleep 2
+  done
+  expect_false ceph osd tier add slow cache2
+  ceph osd tier add slow cache2 --force-nonempty
+  ceph osd tier remove slow cache2
+
+  ceph osd pool ls | grep cache2
+  ceph osd pool ls -f json-pretty | grep cache2
+  ceph osd pool ls detail | grep cache2
+  ceph osd pool ls detail -f json-pretty | grep cache2
+
+  ceph osd pool delete cache cache --yes-i-really-really-mean-it
+  ceph osd pool delete cache2 cache2 --yes-i-really-really-mean-it
+
+  # make sure we can't clobber snapshot state
+  ceph osd pool create snap_base 2
+  ceph osd pool create snap_cache 2
+  ceph osd pool mksnap snap_cache snapname
+  expect_false ceph osd tier add snap_base snap_cache
+  ceph osd pool delete snap_base snap_base --yes-i-really-really-mean-it
+  ceph osd pool delete snap_cache snap_cache --yes-i-really-really-mean-it
+
+  # make sure we can't create an ec pool tier
+  ceph osd pool create eccache 2 2 erasure
+  ceph osd pool create repbase 2
+  expect_false ceph osd tier add repbase eccache
+  ceph osd pool delete repbase repbase --yes-i-really-really-mean-it
+  ceph osd pool delete eccache eccache --yes-i-really-really-mean-it
+
+  # convenient add-cache command
+  ceph osd pool create cache3 2
+  ceph osd tier add-cache slow cache3 1024000
+  ceph osd dump | grep cache3 | grep bloom | grep 'false_positive_probability: 0.05' | grep 'target_bytes 1024000' | grep '1200s x4'
+  ceph osd tier remove slow cache3 2> $TMPFILE || true
+  check_response "EBUSY: tier pool 'cache3' is the overlay for 'slow'; please remove-overlay first"
+  ceph osd tier remove-overlay slow
+  ceph osd tier remove slow cache3
+  ceph osd pool ls | grep cache3
+  ceph osd pool delete cache3 cache3 --yes-i-really-really-mean-it
+  ! ceph osd pool ls | grep cache3 || exit 1
+
+  ceph osd pool delete slow2 slow2 --yes-i-really-really-mean-it
+  ceph osd pool delete slow slow --yes-i-really-really-mean-it
+
+  # check add-cache whether work
+  ceph osd pool create datapool 2
+  ceph osd pool create cachepool 2
+  ceph osd tier add-cache datapool cachepool 1024000
+  ceph osd tier cache-mode cachepool writeback
+  rados -p datapool put object /etc/passwd
+  rados -p cachepool stat object
+  rados -p cachepool cache-flush object
+  rados -p datapool stat object
+  ceph osd tier remove-overlay datapool
+  ceph osd tier remove datapool cachepool
+  ceph osd pool delete cachepool cachepool --yes-i-really-really-mean-it
+  ceph osd pool delete datapool datapool --yes-i-really-really-mean-it
+
+  # protection against pool removal when used as tiers
+  ceph osd pool create datapool 2
+  ceph osd pool create cachepool 2
+  ceph osd tier add-cache datapool cachepool 1024000
+  ceph osd pool delete cachepool cachepool --yes-i-really-really-mean-it 2> $TMPFILE || true
+  check_response "EBUSY: pool 'cachepool' is a tier of 'datapool'"
+  ceph osd pool delete datapool datapool --yes-i-really-really-mean-it 2> $TMPFILE || true
+  check_response "EBUSY: pool 'datapool' has tiers cachepool"
+  ceph osd tier remove-overlay datapool
+  ceph osd tier remove datapool cachepool
+  ceph osd pool delete cachepool cachepool --yes-i-really-really-mean-it
+  ceph osd pool delete datapool datapool --yes-i-really-really-mean-it
+
+  ## check health check
+  ceph osd set notieragent
+  ceph osd pool create datapool 2
+  ceph osd pool create cache4 2
+  ceph osd tier add-cache datapool cache4 1024000
+  ceph osd tier cache-mode cache4 writeback
+  tmpfile=$(mktemp|grep tmp)
+  dd if=/dev/zero of=$tmpfile  bs=4K count=1
+  ceph osd pool set cache4 target_max_objects 200
+  ceph osd pool set cache4 target_max_bytes 1000000
+  rados -p cache4 put foo1 $tmpfile
+  rados -p cache4 put foo2 $tmpfile
+  rm -f $tmpfile
+  ceph tell osd.\* flush_pg_stats || true
+  ceph df | grep datapool | grep ' 2 '
+  ceph osd tier remove-overlay datapool
+  ceph osd tier remove datapool cache4
+  ceph osd pool delete cache4 cache4 --yes-i-really-really-mean-it
+  ceph osd pool delete datapool datapool --yes-i-really-really-mean-it
+  ceph osd unset notieragent
+
+
+  # make sure 'tier remove' behaves as we expect
+  # i.e., removing a tier from a pool that's not its base pool only
+  # results in a 'pool foo is now (or already was) not a tier of bar'
+  #
+  ceph osd pool create basepoolA 2
+  ceph osd pool create basepoolB 2
+  poolA_id=$(ceph osd dump | grep 'pool.*basepoolA' | awk '{print $2;}')
+  poolB_id=$(ceph osd dump | grep 'pool.*basepoolB' | awk '{print $2;}')
+
+  ceph osd pool create cache5 2
+  ceph osd pool create cache6 2
+  ceph osd tier add basepoolA cache5
+  ceph osd tier add basepoolB cache6
+  ceph osd tier remove basepoolB cache5 2>&1 | grep 'not a tier of'
+  ceph osd dump | grep "pool.*'cache5'" 2>&1 | grep "tier_of[ \t]\+$poolA_id"
+  ceph osd tier remove basepoolA cache6 2>&1 | grep 'not a tier of'
+  ceph osd dump | grep "pool.*'cache6'" 2>&1 | grep "tier_of[ \t]\+$poolB_id"
+
+  ceph osd tier remove basepoolA cache5 2>&1 | grep 'not a tier of'
+  ! ceph osd dump | grep "pool.*'cache5'" 2>&1 | grep "tier_of" || exit 1
+  ceph osd tier remove basepoolB cache6 2>&1 | grep 'not a tier of'
+  ! ceph osd dump | grep "pool.*'cache6'" 2>&1 | grep "tier_of" || exit 1
+
+  ! ceph osd dump | grep "pool.*'basepoolA'" 2>&1 | grep "tiers" || exit 1
+  ! ceph osd dump | grep "pool.*'basepoolB'" 2>&1 | grep "tiers" || exit 1
+
+  ceph osd pool delete cache6 cache6 --yes-i-really-really-mean-it
+  ceph osd pool delete cache5 cache5 --yes-i-really-really-mean-it
+  ceph osd pool delete basepoolB basepoolB --yes-i-really-really-mean-it
+  ceph osd pool delete basepoolA basepoolA --yes-i-really-really-mean-it
+}
+
+function test_auth()
+{
+  ceph auth add client.xx mon allow osd "allow *"
+  ceph auth export client.xx >client.xx.keyring
+  ceph auth add client.xx -i client.xx.keyring
+  rm -f client.xx.keyring
+  ceph auth list | grep client.xx
+  ceph auth get client.xx | grep caps | grep mon
+  ceph auth get client.xx | grep caps | grep osd
+  ceph auth get-key client.xx
+  ceph auth print-key client.xx
+  ceph auth print_key client.xx
+  ceph auth caps client.xx osd "allow rw"
+  expect_false "ceph auth get client.xx | grep caps | grep mon"
+  ceph auth get client.xx | grep osd | grep "allow rw"
+  ceph auth export | grep client.xx
+  ceph auth export -o authfile
+  ceph auth import -i authfile
+  ceph auth export -o authfile2
+  diff authfile authfile2
+  rm authfile authfile2
+  ceph auth del client.xx
+  expect_false ceph auth get client.xx
+
+  # (almost) interactive mode
+  echo -e 'auth add client.xx mon allow osd "allow *"\n' | ceph
+  ceph auth get client.xx
+  # script mode
+  echo 'auth del client.xx' | ceph
+  expect_false ceph auth get client.xx
+
+  #
+  # get / set auid
+  #
+  local auid=444
+  ceph-authtool --create-keyring --name client.TEST --gen-key --set-uid $auid TEST-keyring
+  ceph auth import --in-file TEST-keyring
+  rm TEST-keyring
+  ceph auth get client.TEST > $TMPFILE
+  check_response "auid = $auid"
+  ceph --format json-pretty auth get client.TEST > $TMPFILE
+  check_response '"auid": '$auid
+  ceph auth list > $TMPFILE
+  check_response "auid: $auid"
+  ceph --format json-pretty auth list > $TMPFILE
+  check_response '"auid": '$auid
+  ceph auth del client.TEST
+}
+
+function test_auth_profiles()
+{
+  ceph auth add client.xx-profile-ro mon 'allow profile read-only'
+  ceph auth add client.xx-profile-rw mon 'allow profile read-write'
+  ceph auth add client.xx-profile-rd mon 'allow profile role-definer'
+
+  ceph auth export > client.xx.keyring
+
+  # read-only is allowed all read-only commands (auth excluded)
+  ceph -n client.xx-profile-ro -k client.xx.keyring status
+  ceph -n client.xx-profile-ro -k client.xx.keyring osd dump
+  ceph -n client.xx-profile-ro -k client.xx.keyring pg dump
+  ceph -n client.xx-profile-ro -k client.xx.keyring mon dump
+  ceph -n client.xx-profile-ro -k client.xx.keyring mds dump
+  # read-only gets access denied for rw commands or auth commands
+  ceph -n client.xx-profile-ro -k client.xx.keyring log foo >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  ceph -n client.xx-profile-ro -k client.xx.keyring osd set noout >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  ceph -n client.xx-profile-ro -k client.xx.keyring auth list >& $TMPFILE || true
+  check_response "EACCES: access denied"
+
+  # read-write is allowed for all read-write commands (except auth)
+  ceph -n client.xx-profile-rw -k client.xx.keyring status
+  ceph -n client.xx-profile-rw -k client.xx.keyring osd dump
+  ceph -n client.xx-profile-rw -k client.xx.keyring pg dump
+  ceph -n client.xx-profile-rw -k client.xx.keyring mon dump
+  ceph -n client.xx-profile-rw -k client.xx.keyring mds dump
+  ceph -n client.xx-profile-rw -k client.xx.keyring log foo
+  ceph -n client.xx-profile-rw -k client.xx.keyring osd set noout
+  ceph -n client.xx-profile-rw -k client.xx.keyring osd unset noout
+  # read-write gets access denied for auth commands
+  ceph -n client.xx-profile-rw -k client.xx.keyring auth list >& $TMPFILE || true
+  check_response "EACCES: access denied"
+
+  # role-definer is allowed RWX 'auth' commands and read-only 'mon' commands
+  ceph -n client.xx-profile-rd -k client.xx.keyring auth list
+  ceph -n client.xx-profile-rd -k client.xx.keyring auth export
+  ceph -n client.xx-profile-rd -k client.xx.keyring auth add client.xx-profile-foo
+  ceph -n client.xx-profile-rd -k client.xx.keyring status
+  ceph -n client.xx-profile-rd -k client.xx.keyring osd dump >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  ceph -n client.xx-profile-rd -k client.xx.keyring pg dump >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  # read-only 'mon' subsystem commands are allowed
+  ceph -n client.xx-profile-rd -k client.xx.keyring mon dump
+  # but read-write 'mon' commands are not
+  ceph -n client.xx-profile-rd -k client.xx.keyring mon add foo 1.1.1.1 >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  ceph -n client.xx-profile-rd -k client.xx.keyring mds dump >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  ceph -n client.xx-profile-rd -k client.xx.keyring log foo >& $TMPFILE || true
+  check_response "EACCES: access denied"
+  ceph -n client.xx-profile-rd -k client.xx.keyring osd set noout >& $TMPFILE || true
+  check_response "EACCES: access denied"
+
+  ceph -n client.xx-profile-rd -k client.xx.keyring auth del client.xx-profile-ro
+  ceph -n client.xx-profile-rd -k client.xx.keyring auth del client.xx-profile-rw
+  
+  # add a new role-definer with the existing role-definer
+  ceph -n client.xx-profile-rd -k client.xx.keyring \
+    auth add client.xx-profile-rd2 mon 'allow profile role-definer'
+  ceph -n client.xx-profile-rd -k client.xx.keyring \
+    auth export > client.xx.keyring.2
+  # remove old role-definer using the new role-definer
+  ceph -n client.xx-profile-rd2 -k client.xx.keyring.2 \
+    auth del client.xx-profile-rd
+  # remove the remaining role-definer with admin
+  ceph auth del client.xx-profile-rd2
+  rm -f client.xx.keyring client.xx.keyring.2
+}
+
+function test_mon_caps()
+{
+  ceph-authtool --create-keyring $TMPDIR/ceph.client.bug.keyring
+  chmod +r  $TMPDIR/ceph.client.bug.keyring
+  ceph-authtool  $TMPDIR/ceph.client.bug.keyring -n client.bug --gen-key
+  ceph auth add client.bug -i  $TMPDIR/ceph.client.bug.keyring
+
+  rados lspools --keyring $TMPDIR/ceph.client.bug.keyring -n client.bug >& $TMPFILE || true
+  check_response "Permission denied"
+
+  rm -rf $TMPDIR/ceph.client.bug.keyring
+  ceph auth del client.bug
+  ceph-authtool --create-keyring $TMPDIR/ceph.client.bug.keyring
+  chmod +r  $TMPDIR/ceph.client.bug.keyring
+  ceph-authtool  $TMPDIR/ceph.client.bug.keyring -n client.bug --gen-key
+  ceph-authtool -n client.bug --cap mon '' $TMPDIR/ceph.client.bug.keyring
+  ceph auth add client.bug -i  $TMPDIR/ceph.client.bug.keyring
+  rados lspools --keyring $TMPDIR/ceph.client.bug.keyring -n client.bug >& $TMPFILE || true
+  check_response "Permission denied"  
+}
+
+function test_mon_misc()
+{
+  # with and without verbosity
+  ceph osd dump | grep '^epoch'
+  ceph --concise osd dump | grep '^epoch'
+
+  # df
+  ceph df > $TMPFILE
+  grep GLOBAL $TMPFILE
+  grep -v DIRTY $TMPFILE
+  ceph df detail > $TMPFILE
+  grep CATEGORY $TMPFILE
+  grep DIRTY $TMPFILE
+  ceph df --format json > $TMPFILE
+  grep 'total_bytes' $TMPFILE
+  grep -v 'dirty' $TMPFILE
+  ceph df detail --format json > $TMPFILE
+  grep 'rd_bytes' $TMPFILE
+  grep 'dirty' $TMPFILE
+  ceph df --format xml | grep '<total_bytes>'
+  ceph df detail --format xml | grep '<rd_bytes>'
+
+  ceph fsid
+  ceph health
+  ceph health detail
+  ceph health --format json-pretty
+  ceph health detail --format xml-pretty
+
+  ceph node ls
+  for t in mon osd mds ; do
+      ceph node ls $t
+  done
+
+  ceph_watch_start
+  mymsg="this is a test log message $$.$(date)"
+  ceph log "$mymsg"
+  ceph_watch_wait "$mymsg"
+
+  ceph mon metadata a
+  ceph node ls
+}
+
+function check_mds_active()
+{
+    fs_name=$1
+    ceph fs get $fs_name | grep active
+}
+
+function wait_mds_active()
+{
+  fs_name=$1
+  for i in $(seq 1 300) ; do
+      if ! check_mds_active $fs_name ; then
+          echo "waiting for an active MDS daemon"
+          sleep 5
+      else
+          break
+      fi
+  done
+  check_mds_active $fs_name
+}
+
+function get_mds_gids()
+{
+    fs_name=$1
+    ceph fs get $fs_name --format=json | python -c "import json; import sys; print ' '.join([m['gid'].__str__() for m in json.load(sys.stdin)['mdsmap']['info'].values()])"
+}
+
+function fail_all_mds()
+{
+  fs_name=$1
+  ceph fs set $fs_name cluster_down true
+  mds_gids=$(get_mds_gids $fs_name)
+  for mds_gid in $mds_gids ; do
+      ceph mds fail $mds_gid
+  done
+  if check_mds_active $fs_name ; then
+      echo "An active MDS remains, something went wrong"
+      ceph fs get $fs_name
+      exit -1
+  fi
+
+}
+
+function remove_all_fs()
+{
+  existing_fs=$(ceph fs ls --format=json | python -c "import json; import sys; print ' '.join([fs['name'] for fs in json.load(sys.stdin)])")
+  for fs_name in $existing_fs ; do
+      echo "Removing fs ${fs_name}..."
+      fail_all_mds $fs_name
+      echo "Removing existing filesystem '${fs_name}'..."
+      ceph fs rm $fs_name --yes-i-really-mean-it
+      echo "Removed '${fs_name}'."
+  done
+}
+
+# So that tests requiring MDS can skip if one is not configured
+# in the cluster at all
+function mds_exists()
+{
+    ceph auth list | grep "^mds"
+}
+
+function test_mds_tell()
+{
+  FS_NAME=cephfs
+  if ! mds_exists ; then
+      echo "Skipping test, no MDS found"
+      return
+  fi
+
+  remove_all_fs
+  ceph osd pool create fs_data 10
+  ceph osd pool create fs_metadata 10
+  ceph fs new $FS_NAME fs_metadata fs_data
+  wait_mds_active $FS_NAME
+
+  # Test injectargs by GID
+  old_mds_gids=$(get_mds_gids $FS_NAME)
+  echo Old GIDs: $old_mds_gids
+
+  for mds_gid in $old_mds_gids ; do
+      ceph tell mds.$mds_gid injectargs "--debug-mds 20"
+  done
+
+  # Test respawn by rank
+  ceph tell mds.0 respawn
+  new_mds_gids=$old_mds_gids
+  while [ $new_mds_gids -eq $old_mds_gids ] ; do
+      sleep 5
+      new_mds_gids=$(get_mds_gids $FS_NAME)
+  done
+  echo New GIDs: $new_mds_gids
+
+  # Test respawn by ID
+  ceph tell mds.a respawn
+  new_mds_gids=$old_mds_gids
+  while [ $new_mds_gids -eq $old_mds_gids ] ; do
+      sleep 5
+      new_mds_gids=$(get_mds_gids $FS_NAME)
+  done
+  echo New GIDs: $new_mds_gids
+
+  remove_all_fs
+  ceph osd pool delete fs_data fs_data --yes-i-really-really-mean-it
+  ceph osd pool delete fs_metadata fs_metadata --yes-i-really-really-mean-it
+}
+
+function test_mon_mds()
+{
+  FS_NAME=cephfs
+  remove_all_fs
+
+  ceph osd pool create fs_data 10
+  ceph osd pool create fs_metadata 10
+  ceph fs new $FS_NAME fs_metadata fs_data
+
+  ceph fs set $FS_NAME cluster_down true
+  ceph fs set $FS_NAME cluster_down false
+
+  # Legacy commands, act on default fs
+  ceph mds cluster_down
+  ceph mds cluster_up
+
+  ceph mds compat rm_incompat 4
+  ceph mds compat rm_incompat 4
+
+  # We don't want any MDSs to be up, their activity can interfere with
+  # the "current_epoch + 1" checking below if they're generating updates
+  fail_all_mds $FS_NAME
+
+  # Check for default crash_replay_interval set automatically in 'fs new'
+  #This may vary based on ceph.conf (e.g., it's 5 in teuthology runs)
+  #ceph osd dump | grep fs_data > $TMPFILE
+  #check_response "crash_replay_interval 45 "
+
+  ceph mds compat show
+  expect_false ceph mds deactivate 2
+  ceph mds dump
+  ceph fs dump
+  ceph fs get $FS_NAME
+  for mds_gid in $(get_mds_gids $FS_NAME) ; do
+      ceph mds metadata $mds_id
+  done
+  # XXX mds fail, but how do you undo it?
+  mdsmapfile=$TMPDIR/mdsmap.$$
+  current_epoch=$(ceph mds getmap -o $mdsmapfile --no-log-to-stderr 2>&1 | grep epoch | sed 's/.*epoch //')
+  [ -s $mdsmapfile ]
+  rm $mdsmapfile
+
+  ceph osd pool create data2 10
+  ceph osd pool create data3 10
+  data2_pool=$(ceph osd dump | grep "pool.*'data2'" | awk '{print $2;}')
+  data3_pool=$(ceph osd dump | grep "pool.*'data3'" | awk '{print $2;}')
+  ceph mds add_data_pool $data2_pool
+  ceph mds add_data_pool $data3_pool
+  ceph mds add_data_pool 100 >& $TMPFILE || true
+  check_response "Error ENOENT"
+  ceph mds add_data_pool foobarbaz >& $TMPFILE || true
+  check_response "Error ENOENT"
+  ceph mds remove_data_pool $data2_pool
+  ceph mds remove_data_pool $data3_pool
+  ceph osd pool delete data2 data2 --yes-i-really-really-mean-it
+  ceph osd pool delete data3 data3 --yes-i-really-really-mean-it
+  expect_false ceph mds set_max_mds 4
+  ceph mds set allow_multimds true --yes-i-really-mean-it
+  ceph mds set_max_mds 4
+  ceph mds set_max_mds 3
+  ceph mds set_max_mds 256
+  expect_false ceph mds set_max_mds 257
+  ceph mds set max_mds 4
+  ceph mds set max_mds 256
+  expect_false ceph mds set max_mds 257
+  expect_false ceph mds set max_mds asdf
+  expect_false ceph mds set inline_data true
+  ceph mds set inline_data true --yes-i-really-mean-it
+  ceph mds set inline_data yes --yes-i-really-mean-it
+  ceph mds set inline_data 1 --yes-i-really-mean-it
+  expect_false ceph mds set inline_data --yes-i-really-mean-it
+  ceph mds set inline_data false
+  ceph mds set inline_data no
+  ceph mds set inline_data 0
+  expect_false ceph mds set inline_data asdf
+  ceph mds set max_file_size 1048576
+  expect_false ceph mds set max_file_size 123asdf
+
+  expect_false ceph mds set allow_new_snaps
+  expect_false ceph mds set allow_new_snaps true
+  ceph mds set allow_new_snaps true --yes-i-really-mean-it
+  ceph mds set allow_new_snaps 0
+  ceph mds set allow_new_snaps false
+  ceph mds set allow_new_snaps no
+  expect_false ceph mds set allow_new_snaps taco
+
+  # we should never be able to add EC pools as data or metadata pools
+  # create an ec-pool...
+  ceph osd pool create mds-ec-pool 10 10 erasure
+  set +e
+  ceph mds add_data_pool mds-ec-pool 2>$TMPFILE
+  check_response 'erasure-code' $? 22
+  set -e
+  ec_poolnum=$(ceph osd dump | grep "pool.* 'mds-ec-pool" | awk '{print $2;}')
+  data_poolnum=$(ceph osd dump | grep "pool.* 'fs_data" | awk '{print $2;}')
+  metadata_poolnum=$(ceph osd dump | grep "pool.* 'fs_metadata" | awk '{print $2;}')
+
+  fail_all_mds $FS_NAME
+
+  set +e
+  # Check that rmfailed requires confirmation
+  expect_false ceph mds rmfailed 0
+  ceph mds rmfailed 0 --yes-i-really-mean-it
+  set -e
+
+  # Check that `newfs` is no longer permitted
+  expect_false ceph mds newfs $metadata_poolnum $data_poolnum --yes-i-really-mean-it 2>$TMPFILE
+
+  # Check that 'fs reset' runs
+  ceph fs reset $FS_NAME --yes-i-really-mean-it
+
+  # Check that creating a second FS fails by default
+  ceph osd pool create fs_metadata2 10
+  ceph osd pool create fs_data2 10
+  set +e
+  expect_false ceph fs new cephfs2 fs_metadata2 fs_data2
+  set -e
+
+  # Check that setting enable_multiple enables creation of second fs
+  ceph fs flag set enable_multiple true --yes-i-really-mean-it
+  ceph fs new cephfs2 fs_metadata2 fs_data2
+
+  # Clean up multi-fs stuff
+  fail_all_mds cephfs2
+  ceph fs rm cephfs2 --yes-i-really-mean-it
+  ceph osd pool delete fs_metadata2 fs_metadata2 --yes-i-really-really-mean-it
+  ceph osd pool delete fs_data2 fs_data2 --yes-i-really-really-mean-it
+
+  fail_all_mds $FS_NAME
+
+  # Clean up to enable subsequent fs new tests
+  ceph fs rm $FS_NAME --yes-i-really-mean-it
+
+  set +e
+  ceph fs new $FS_NAME fs_metadata mds-ec-pool 2>$TMPFILE
+  check_response 'erasure-code' $? 22
+  ceph fs new $FS_NAME mds-ec-pool fs_data 2>$TMPFILE
+  check_response 'erasure-code' $? 22
+  ceph fs new $FS_NAME mds-ec-pool mds-ec-pool 2>$TMPFILE
+  check_response 'erasure-code' $? 22
+  set -e
+
+  # ... new create a cache tier in front of the EC pool...
+  ceph osd pool create mds-tier 2
+  ceph osd tier add mds-ec-pool mds-tier
+  ceph osd tier set-overlay mds-ec-pool mds-tier
+  tier_poolnum=$(ceph osd dump | grep "pool.* 'mds-tier" | awk '{print $2;}')
+
+  # Use of a readonly tier should be forbidden
+  ceph osd tier cache-mode mds-tier readonly --yes-i-really-mean-it
+  set +e
+  ceph fs new $FS_NAME fs_metadata mds-ec-pool 2>$TMPFILE
+  check_response 'has a write tier (mds-tier) that is configured to forward' $? 22
+  set -e
+
+  # Use of a writeback tier should enable FS creation
+  ceph osd tier cache-mode mds-tier writeback
+  ceph fs new $FS_NAME fs_metadata mds-ec-pool
+
+  # While a FS exists using the tiered pools, I should not be allowed
+  # to remove the tier
+  set +e
+  ceph osd tier remove-overlay mds-ec-pool 2>$TMPFILE
+  check_response 'in use by CephFS' $? 16
+  ceph osd tier remove mds-ec-pool mds-tier 2>$TMPFILE
+  check_response 'in use by CephFS' $? 16
+  set -e
+
+  fail_all_mds $FS_NAME
+  ceph fs rm $FS_NAME --yes-i-really-mean-it
+
+  # ... but we should be forbidden from using the cache pool in the FS directly.
+  set +e
+  ceph fs new $FS_NAME fs_metadata mds-tier 2>$TMPFILE
+  check_response 'in use as a cache tier' $? 22
+  ceph fs new $FS_NAME mds-tier fs_data 2>$TMPFILE
+  check_response 'in use as a cache tier' $? 22
+  ceph fs new $FS_NAME mds-tier mds-tier 2>$TMPFILE
+  check_response 'in use as a cache tier' $? 22
+  set -e
+
+  # Clean up tier + EC pools
+  ceph osd tier remove-overlay mds-ec-pool
+  ceph osd tier remove mds-ec-pool mds-tier
+
+  # Create a FS using the 'cache' pool now that it's no longer a tier
+  ceph fs new $FS_NAME fs_metadata mds-tier
+
+  # We should be forbidden from using this pool as a tier now that
+  # it's in use for CephFS
+  set +e
+  ceph osd tier add mds-ec-pool mds-tier 2>$TMPFILE
+  check_response 'in use by CephFS' $? 16
+  set -e
+
+  fail_all_mds $FS_NAME
+  ceph fs rm $FS_NAME --yes-i-really-mean-it
+  ceph osd pool delete mds-ec-pool mds-ec-pool --yes-i-really-really-mean-it
+
+  # Create a FS and check that we can subsequently add a cache tier to it
+  ceph fs new $FS_NAME fs_metadata fs_data
+
+  # Adding overlay to FS pool should be permitted, RADOS clients handle this.
+  ceph osd tier add fs_metadata mds-tier
+  ceph osd tier cache-mode mds-tier writeback
+  ceph osd tier set-overlay fs_metadata mds-tier
+
+  # Removing tier should be permitted because the underlying pool is
+  # replicated (#11504 case)
+  ceph osd tier cache-mode mds-tier proxy
+  ceph osd tier remove-overlay fs_metadata
+  ceph osd tier remove fs_metadata mds-tier
+  ceph osd pool delete mds-tier mds-tier --yes-i-really-really-mean-it
+
+  # Clean up FS
+  fail_all_mds $FS_NAME
+  ceph fs rm $FS_NAME --yes-i-really-mean-it
+
+  ceph mds stat
+  # ceph mds tell mds.a getmap
+  # ceph mds rm
+  # ceph mds rmfailed
+  # ceph mds set_state
+  # ceph mds stop
+
+  ceph osd pool delete fs_data fs_data --yes-i-really-really-mean-it
+  ceph osd pool delete fs_metadata fs_metadata --yes-i-really-really-mean-it
+}
+
+function test_mon_mds_metadata()
+{
+  local nmons=$(ceph tell 'mon.*' version | grep -c 'version')
+  test "$nmons" -gt 0
+
+  ceph mds dump |
+  sed -nEe "s/^([0-9]+):.*'([a-z])' mds\\.([0-9]+)\\..*/\\1 \\2 \\3/p" |
+  while read gid id rank; do
+    ceph mds metadata ${gid} | grep '"hostname":'
+    ceph mds metadata ${id} | grep '"hostname":'
+    ceph mds metadata ${rank} | grep '"hostname":'
+
+    local n=$(ceph tell 'mon.*' mds metadata ${id} | grep -c '"hostname":')
+    test "$n" -eq "$nmons"
+  done
+
+  expect_false ceph mds metadata UNKNOWN
+}
+
+function test_mon_mon()
+{
+  # print help message
+  ceph --help mon
+  # no mon add/remove
+  ceph mon dump
+  ceph mon getmap -o $TMPDIR/monmap.$$
+  [ -s $TMPDIR/monmap.$$ ]
+  # ceph mon tell
+  ceph mon_status
+}
+
+function test_mon_osd()
+{
+  #
+  # osd blacklist
+  #
+  bl=192.168.0.1:0/1000
+  # Escaped form which may appear in JSON output
+  bl_json=192.168.0.1:0\\\\/1000
+  ceph osd blacklist add $bl
+  ceph osd blacklist ls | grep $bl
+  ceph osd blacklist ls --format=json-pretty | grep $bl_json
+  ceph osd dump --format=json-pretty | grep $bl
+  ceph osd dump | grep "^blacklist $bl"
+  ceph osd blacklist rm $bl
+  expect_false "ceph osd blacklist ls | grep $bl"
+
+  bl=192.168.0.1
+  # test without nonce, invalid nonce
+  ceph osd blacklist add $bl
+  ceph osd blacklist ls | grep $bl
+  ceph osd blacklist rm $bl
+  expect_false "ceph osd blacklist ls | grep $bl"
+  expect_false "ceph osd blacklist $bl/-1"
+  expect_false "ceph osd blacklist $bl/foo"
+
+  # Test `clear`
+  ceph osd blacklist add $bl
+  ceph osd blacklist ls | grep $bl
+  ceph osd blacklist clear
+  expect_false "ceph osd blacklist ls | grep $bl"
+
+  #
+  # osd crush
+  #
+  ceph osd crush reweight-all
+  ceph osd crush tunables legacy
+  ceph osd crush show-tunables | grep argonaut
+  ceph osd crush tunables bobtail
+  ceph osd crush show-tunables | grep bobtail
+  ceph osd crush tunables firefly
+  ceph osd crush show-tunables | grep firefly
+
+  ceph osd crush set-tunable straw_calc_version 0
+  ceph osd crush get-tunable straw_calc_version | grep 0
+  ceph osd crush set-tunable straw_calc_version 1
+  ceph osd crush get-tunable straw_calc_version | grep 1
+
+  #
+  # osd scrub
+  #
+  # how do I tell when these are done?
+  ceph osd scrub 0
+  ceph osd deep-scrub 0
+  ceph osd repair 0
+
+  for f in noup nodown noin noout noscrub nodeep-scrub nobackfill norebalance norecover notieragent full sortbitwise
+  do
+    ceph osd set $f
+    ceph osd unset $f
+  done
+  ceph osd set sortbitwise  # new backends cant handle nibblewise
+  expect_false ceph osd set bogus
+  expect_false ceph osd unset bogus
+  ceph osd set require_jewel_osds
+  expect_false ceph osd unset require_jewel_osds
+
+  ceph osd set noup
+  ceph osd down 0
+  ceph osd dump | grep 'osd.0 down'
+  ceph osd unset noup
+  for ((i=0; i < 1000; i++)); do
+    if ! ceph osd dump | grep 'osd.0 up'; then
+      echo "waiting for osd.0 to come back up"
+      sleep 1
+    else
+      break
+    fi
+  done
+  ceph osd dump | grep 'osd.0 up'
+
+  ceph osd thrash 0
+
+  ceph osd dump | grep 'osd.0 up'
+  ceph osd find 1
+  ceph --format plain osd find 1 # falls back to json-pretty
+  ceph osd metadata 1 | grep 'distro'
+  ceph --format plain osd metadata 1 | grep 'distro' # falls back to json-pretty
+  ceph osd out 0
+  ceph osd dump | grep 'osd.0.*out'
+  ceph osd in 0
+  ceph osd dump | grep 'osd.0.*in'
+  ceph osd find 0
+
+  f=$TMPDIR/map.$$
+  ceph osd getcrushmap -o $f
+  [ -s $f ]
+  ceph osd setcrushmap -i $f
+  rm $f
+  ceph osd getmap -o $f
+  [ -s $f ]
+  rm $f
+  save=$(ceph osd getmaxosd | sed -e 's/max_osd = //' -e 's/ in epoch.*//')
+  [ "$save" -gt 0 ]
+  ceph osd setmaxosd $((save - 1)) 2>&1 | grep 'EBUSY'
+  ceph osd setmaxosd 10
+  ceph osd getmaxosd | grep 'max_osd = 10'
+  ceph osd setmaxosd $save
+  ceph osd getmaxosd | grep "max_osd = $save"
+
+  for id in `ceph osd ls` ; do
+    retry_eagain 5 map_enxio_to_eagain ceph tell osd.$id version
+  done
+
+  ceph osd rm 0 2>&1 | grep 'EBUSY'
+
+  local old_osds=$(echo $(ceph osd ls))
+  id=`ceph osd create`
+  ceph osd find $id
+  ceph osd lost $id --yes-i-really-mean-it
+  expect_false ceph osd setmaxosd $id
+  local new_osds=$(echo $(ceph osd ls))
+  for id in $(echo $new_osds | sed -e "s/$old_osds//") ; do
+      ceph osd rm $id
+  done
+
+  uuid=`uuidgen`
+  id=`ceph osd create $uuid`
+  id2=`ceph osd create $uuid`
+  [ "$id" = "$id2" ]
+  ceph osd rm $id
+
+  ceph --help osd
+
+  # reset max_osd.
+  ceph osd setmaxosd $id
+  ceph osd getmaxosd | grep "max_osd = $save"
+  local max_osd=$save
+
+  ceph osd create $uuid 0 2>&1 | grep 'EINVAL'
+  ceph osd create $uuid $((max_osd - 1)) 2>&1 | grep 'EINVAL'
+
+  id=`ceph osd create $uuid $max_osd`
+  [ "$id" = "$max_osd" ]
+  ceph osd find $id
+  max_osd=$((max_osd + 1))
+  ceph osd getmaxosd | grep "max_osd = $max_osd"
+
+  ceph osd create $uuid $((id - 1)) 2>&1 | grep 'EINVAL'
+  ceph osd create $uuid $((id + 1)) 2>&1 | grep 'EINVAL'
+  id2=`ceph osd create $uuid`
+  [ "$id" = "$id2" ]
+  id2=`ceph osd create $uuid $id`
+  [ "$id" = "$id2" ]
+
+  uuid=`uuidgen`
+  local gap_start=$max_osd
+  id=`ceph osd create $uuid $((gap_start + 100))`
+  [ "$id" = "$((gap_start + 100))" ]
+  max_osd=$((id + 1))
+  ceph osd getmaxosd | grep "max_osd = $max_osd"
+
+  ceph osd create $uuid $gap_start 2>&1 | grep 'EINVAL'
+
+  #
+  # When CEPH_CLI_TEST_DUP_COMMAND is set, osd create
+  # is repeated and consumes two osd id, not just one.
+  #
+  local next_osd
+  if test "$CEPH_CLI_TEST_DUP_COMMAND" ; then
+      next_osd=$((gap_start + 1))
+  else
+      next_osd=$gap_start
+  fi
+  id=`ceph osd create`
+  [ "$id" = "$next_osd" ]
+
+  next_osd=$((id + 1))
+  id=`ceph osd create $(uuidgen)`
+  [ "$id" = "$next_osd" ]
+
+  next_osd=$((id + 1))
+  id=`ceph osd create $(uuidgen) $next_osd`
+  [ "$id" = "$next_osd" ]
+
+  local new_osds=$(echo $(ceph osd ls))
+  for id in $(echo $new_osds | sed -e "s/$old_osds//") ; do
+      [ $id -ge $save ]
+      ceph osd rm $id
+  done
+  ceph osd setmaxosd $save
+
+  ceph osd ls
+  ceph osd pool create data 10
+  ceph osd lspools | grep data
+  ceph osd map data foo | grep 'pool.*data.*object.*foo.*pg.*up.*acting'
+  ceph osd map data foo namespace| grep 'pool.*data.*object.*namespace/foo.*pg.*up.*acting'
+  ceph osd pool delete data data --yes-i-really-really-mean-it
+
+  ceph osd pause
+  ceph osd dump | grep 'flags pauserd,pausewr'
+  ceph osd unpause
+
+  ceph osd tree
+  ceph osd perf
+  ceph osd blocked-by
+
+  ceph osd stat | grep up,
+}
+
+function test_mon_osd_pool()
+{
+  #
+  # osd pool
+  #
+  ceph osd pool create data 10
+  ceph osd pool mksnap data datasnap
+  rados -p data lssnap | grep datasnap
+  ceph osd pool rmsnap data datasnap
+  ceph osd pool delete data data --yes-i-really-really-mean-it
+
+  ceph osd pool create data2 10
+  ceph osd pool rename data2 data3
+  ceph osd lspools | grep data3
+  ceph osd pool delete data3 data3 --yes-i-really-really-mean-it
+
+  ceph osd pool create replicated 12 12 replicated
+  ceph osd pool create replicated 12 12 replicated
+  ceph osd pool create replicated 12 12 # default is replicated
+  ceph osd pool create replicated 12    # default is replicated, pgp_num = pg_num
+  # should fail because the type is not the same
+  expect_false ceph osd pool create replicated 12 12 erasure
+  ceph osd lspools | grep replicated
+  ceph osd pool delete replicated replicated --yes-i-really-really-mean-it
+}
+
+function test_mon_osd_pool_quota()
+{
+  #
+  # test osd pool set/get quota
+  #
+
+  # create tmp pool
+  ceph osd pool create tmp-quota-pool 36
+  #
+  # set erroneous quotas
+  #
+  expect_false ceph osd pool set-quota tmp-quota-pool max_fooness 10
+  expect_false ceph osd pool set-quota tmp-quota-pool max_bytes -1
+  expect_false ceph osd pool set-quota tmp-quota-pool max_objects aaa
+  #
+  # set valid quotas
+  #
+  ceph osd pool set-quota tmp-quota-pool max_bytes 10
+  ceph osd pool set-quota tmp-quota-pool max_objects 10M
+  #
+  # get quotas
+  #
+  ceph osd pool get-quota tmp-quota-pool | grep 'max bytes.*10B'
+  ceph osd pool get-quota tmp-quota-pool | grep 'max objects.*10240k objects'
+  #
+  # get quotas in json-pretty format
+  #
+  ceph osd pool get-quota tmp-quota-pool --format=json-pretty | \
+    grep '"quota_max_objects":.*10485760'
+  ceph osd pool get-quota tmp-quota-pool --format=json-pretty | \
+    grep '"quota_max_bytes":.*10'
+  #
+  # reset pool quotas
+  #
+  ceph osd pool set-quota tmp-quota-pool max_bytes 0
+  ceph osd pool set-quota tmp-quota-pool max_objects 0
+  #
+  # test N/A quotas
+  #
+  ceph osd pool get-quota tmp-quota-pool | grep 'max bytes.*N/A'
+  ceph osd pool get-quota tmp-quota-pool | grep 'max objects.*N/A'
+  #
+  # cleanup tmp pool
+  ceph osd pool delete tmp-quota-pool tmp-quota-pool --yes-i-really-really-mean-it
+}
+
+function test_mon_pg()
+{
+  ceph pg debug unfound_objects_exist
+  ceph pg debug degraded_pgs_exist
+  ceph pg deep-scrub 0.0
+  ceph pg dump
+  ceph pg dump pgs_brief --format=json
+  ceph pg dump pgs --format=json
+  ceph pg dump pools --format=json
+  ceph pg dump osds --format=json
+  ceph pg dump sum --format=json
+  ceph pg dump all --format=json
+  ceph pg dump pgs_brief osds --format=json
+  ceph pg dump pools osds pgs_brief --format=json
+  ceph pg dump_json
+  ceph pg dump_pools_json
+  ceph pg dump_stuck inactive
+  ceph pg dump_stuck unclean
+  ceph pg dump_stuck stale
+  ceph pg dump_stuck undersized
+  ceph pg dump_stuck degraded
+  ceph pg ls
+  ceph pg ls 0
+  ceph pg ls stale
+  ceph pg ls active stale repair recovering
+  ceph pg ls 0 active
+  ceph pg ls 0 active stale
+  ceph pg ls-by-primary osd.0
+  ceph pg ls-by-primary osd.0 0
+  ceph pg ls-by-primary osd.0 active
+  ceph pg ls-by-primary osd.0 active stale
+  ceph pg ls-by-primary osd.0 0 active stale
+  ceph pg ls-by-osd osd.0
+  ceph pg ls-by-osd osd.0 0
+  ceph pg ls-by-osd osd.0 active
+  ceph pg ls-by-osd osd.0 active stale
+  ceph pg ls-by-osd osd.0 0 active stale
+  ceph pg ls-by-pool rbd
+  ceph pg ls-by-pool rbd active stale
+  # can't test this...
+  # ceph pg force_create_pg
+  ceph pg getmap -o $TMPDIR/map.$$
+  [ -s $TMPDIR/map.$$ ]
+  ceph pg map 0.0 | grep acting
+  ceph pg repair 0.0
+  ceph pg scrub 0.0
+
+  ceph pg set_full_ratio 0.90
+  ceph pg dump --format=plain | grep '^full_ratio 0.9'
+  ceph pg set_full_ratio 0.95
+  ceph pg set_nearfull_ratio 0.90
+  ceph pg dump --format=plain | grep '^nearfull_ratio 0.9'
+  ceph pg set_nearfull_ratio 0.85
+  ceph pg stat | grep 'pgs:'
+  ceph pg 0.0 query
+  ceph tell 0.0 query
+  ceph quorum enter
+  ceph quorum_status
+  ceph report | grep osd_stats
+  ceph status
+  ceph -s
+
+  #
+  # tell osd version
+  #
+  ceph tell osd.0 version
+  expect_false ceph tell osd.9999 version 
+  expect_false ceph tell osd.foo version
+
+  # back to pg stuff
+
+  ceph tell osd.0 dump_pg_recovery_stats | grep Started
+
+  ceph osd reweight 0 0.9
+  expect_false ceph osd reweight 0 -1
+  ceph osd reweight 0 1
+
+  ceph osd primary-affinity osd.0 .9
+  expect_false ceph osd primary-affinity osd.0 -2
+  ceph osd primary-affinity osd.0 1
+
+  ceph osd pg-temp 0.0 0 1 2
+  ceph osd pg-temp 0.0 1 0 2
+  expect_false ceph osd pg-temp asdf qwer
+  expect_false ceph osd pg-temp 0.0 asdf
+  expect_false ceph osd pg-temp 0.0
+
+  # don't test ceph osd primary-temp for now
+}
+
+function test_mon_osd_pool_set()
+{
+  TEST_POOL_GETSET=pool_getset
+  ceph osd pool create $TEST_POOL_GETSET 1
+  wait_for_clean
+  ceph osd pool get $TEST_POOL_GETSET all
+
+  for s in pg_num pgp_num size min_size crash_replay_interval crush_ruleset; do
+    ceph osd pool get $TEST_POOL_GETSET $s
+  done
+
+  old_size=$(ceph osd pool get $TEST_POOL_GETSET size | sed -e 's/size: //')
+  (( new_size = old_size + 1 ))
+  ceph osd pool set $TEST_POOL_GETSET size $new_size
+  ceph osd pool get $TEST_POOL_GETSET size | grep "size: $new_size"
+  ceph osd pool set $TEST_POOL_GETSET size $old_size
+
+  ceph osd pool create pool_erasure 1 1 erasure
+  wait_for_clean
+  set +e
+  ceph osd pool set pool_erasure size 4444 2>$TMPFILE
+  check_response 'not change the size'
+  set -e
+  ceph osd pool get pool_erasure erasure_code_profile
+
+  auid=5555
+  ceph osd pool set $TEST_POOL_GETSET auid $auid
+  ceph osd pool get $TEST_POOL_GETSET auid | grep $auid
+  ceph --format=xml osd pool get $TEST_POOL_GETSET auid | grep $auid
+  ceph osd pool set $TEST_POOL_GETSET auid 0
+
+  for flag in hashpspool nodelete nopgchange nosizechange write_fadvise_dontneed noscrub nodeep-scrub; do
+      ceph osd pool set $TEST_POOL_GETSET $flag false
+      ceph osd pool get $TEST_POOL_GETSET $flag | grep "$flag: false"
+      ceph osd pool set $TEST_POOL_GETSET $flag true
+      ceph osd pool get $TEST_POOL_GETSET $flag | grep "$flag: true"
+      ceph osd pool set $TEST_POOL_GETSET $flag 1
+      ceph osd pool get $TEST_POOL_GETSET $flag | grep "$flag: true"
+      ceph osd pool set $TEST_POOL_GETSET $flag 0
+      ceph osd pool get $TEST_POOL_GETSET $flag | grep "$flag: false"
+      expect_false ceph osd pool set $TEST_POOL_GETSET $flag asdf
+      expect_false ceph osd pool set $TEST_POOL_GETSET $flag 2
+  done
+
+  expect_false "ceph osd pool get $TEST_POOL_GETSET scrub_min_interval | grep '.'"
+  ceph osd pool set $TEST_POOL_GETSET scrub_min_interval 123456
+  ceph osd pool get $TEST_POOL_GETSET scrub_min_interval | grep 'scrub_min_interval: 123456'
+  ceph osd pool set $TEST_POOL_GETSET scrub_min_interval 0
+  expect_false "ceph osd pool get $TEST_POOL_GETSET scrub_min_interval | grep '.'"
+
+  expect_false "ceph osd pool get $TEST_POOL_GETSET scrub_max_interval | grep '.'"
+  ceph osd pool set $TEST_POOL_GETSET scrub_max_interval 123456
+  ceph osd pool get $TEST_POOL_GETSET scrub_max_interval | grep 'scrub_max_interval: 123456'
+  ceph osd pool set $TEST_POOL_GETSET scrub_max_interval 0
+  expect_false "ceph osd pool get $TEST_POOL_GETSET scrub_max_interval | grep '.'"
+
+  expect_false "ceph osd pool get $TEST_POOL_GETSET deep_scrub_interval | grep '.'"
+  ceph osd pool set $TEST_POOL_GETSET deep_scrub_interval 123456
+  ceph osd pool get $TEST_POOL_GETSET deep_scrub_interval | grep 'deep_scrub_interval: 123456'
+  ceph osd pool set $TEST_POOL_GETSET deep_scrub_interval 0
+  expect_false "ceph osd pool get $TEST_POOL_GETSET deep_scrub_interval | grep '.'"
+
+  expect_false "ceph osd pool get $TEST_POOL_GETSET recovery_priority | grep '.'"
+  ceph osd pool set $TEST_POOL_GETSET recovery_priority 5 
+  ceph osd pool get $TEST_POOL_GETSET recovery_priority | grep 'recovery_priority: 5'
+  ceph osd pool set $TEST_POOL_GETSET recovery_priority 0
+  expect_false "ceph osd pool get $TEST_POOL_GETSET recovery_priority | grep '.'"
+
+  expect_false "ceph osd pool get $TEST_POOL_GETSET recovery_op_priority | grep '.'"
+  ceph osd pool set $TEST_POOL_GETSET recovery_op_priority 5 
+  ceph osd pool get $TEST_POOL_GETSET recovery_op_priority | grep 'recovery_op_priority: 5'
+  ceph osd pool set $TEST_POOL_GETSET recovery_op_priority 0
+  expect_false "ceph osd pool get $TEST_POOL_GETSET recovery_op_priority | grep '.'"
+
+  expect_false "ceph osd pool get $TEST_POOL_GETSET scrub_priority | grep '.'"
+  ceph osd pool set $TEST_POOL_GETSET scrub_priority 5 
+  ceph osd pool get $TEST_POOL_GETSET scrub_priority | grep 'scrub_priority: 5'
+  ceph osd pool set $TEST_POOL_GETSET scrub_priority 0
+  expect_false "ceph osd pool get $TEST_POOL_GETSET scrub_priority | grep '.'"
+
+  ceph osd pool set $TEST_POOL_GETSET nopgchange 1
+  expect_false ceph osd pool set $TEST_POOL_GETSET pg_num 10
+  expect_false ceph osd pool set $TEST_POOL_GETSET pgp_num 10
+  ceph osd pool set $TEST_POOL_GETSET nopgchange 0
+  ceph osd pool set $TEST_POOL_GETSET pg_num 10
+  wait_for_clean
+  ceph osd pool set $TEST_POOL_GETSET pgp_num 10
+
+  ceph osd pool set $TEST_POOL_GETSET nosizechange 1
+  expect_false ceph osd pool set $TEST_POOL_GETSET size 2
+  expect_false ceph osd pool set $TEST_POOL_GETSET min_size 2
+  ceph osd pool set $TEST_POOL_GETSET nosizechange 0
+  ceph osd pool set $TEST_POOL_GETSET size 2
+  wait_for_clean
+  ceph osd pool set $TEST_POOL_GETSET min_size 2
+
+  ceph osd pool set $TEST_POOL_GETSET nodelete 1
+  expect_false ceph osd pool delete $TEST_POOL_GETSET $TEST_POOL_GETSET --yes-i-really-really-mean-it
+  ceph osd pool set $TEST_POOL_GETSET nodelete 0
+  ceph osd pool delete $TEST_POOL_GETSET $TEST_POOL_GETSET --yes-i-really-really-mean-it
+
+  ceph osd pool get rbd crush_ruleset | grep 'crush_ruleset: 0'
+}
+
+function test_mon_osd_tiered_pool_set()
+{
+  # this is really a tier pool
+  ceph osd pool create real-tier 2
+  ceph osd tier add rbd real-tier
+
+  ceph osd pool set real-tier hit_set_type explicit_hash
+  ceph osd pool get real-tier hit_set_type | grep "hit_set_type: explicit_hash"
+  ceph osd pool set real-tier hit_set_type explicit_object
+  ceph osd pool get real-tier hit_set_type | grep "hit_set_type: explicit_object"
+  ceph osd pool set real-tier hit_set_type bloom
+  ceph osd pool get real-tier hit_set_type | grep "hit_set_type: bloom"
+  expect_false ceph osd pool set real-tier hit_set_type i_dont_exist
+  ceph osd pool set real-tier hit_set_period 123
+  ceph osd pool get real-tier hit_set_period | grep "hit_set_period: 123"
+  ceph osd pool set real-tier hit_set_count 12
+  ceph osd pool get real-tier hit_set_count | grep "hit_set_count: 12"
+  ceph osd pool set real-tier hit_set_fpp .01
+  ceph osd pool get real-tier hit_set_fpp | grep "hit_set_fpp: 0.01"
+
+  ceph osd pool set real-tier target_max_objects 123
+  ceph osd pool get real-tier target_max_objects | \
+    grep 'target_max_objects:[ \t]\+123'
+  ceph osd pool set real-tier target_max_bytes 123456
+  ceph osd pool get real-tier target_max_bytes | \
+    grep 'target_max_bytes:[ \t]\+123456'
+  ceph osd pool set real-tier cache_target_dirty_ratio .123
+  ceph osd pool get real-tier cache_target_dirty_ratio | \
+    grep 'cache_target_dirty_ratio:[ \t]\+0.123'
+  expect_false ceph osd pool set real-tier cache_target_dirty_ratio -.2
+  expect_false ceph osd pool set real-tier cache_target_dirty_ratio 1.1
+  ceph osd pool set real-tier cache_target_dirty_high_ratio .123
+  ceph osd pool get real-tier cache_target_dirty_high_ratio | \
+    grep 'cache_target_dirty_high_ratio:[ \t]\+0.123'
+  expect_false ceph osd pool set real-tier cache_target_dirty_high_ratio -.2
+  expect_false ceph osd pool set real-tier cache_target_dirty_high_ratio 1.1
+  ceph osd pool set real-tier cache_target_full_ratio .123
+  ceph osd pool get real-tier cache_target_full_ratio | \
+    grep 'cache_target_full_ratio:[ \t]\+0.123'
+  ceph osd dump -f json-pretty | grep '"cache_target_full_ratio_micro": 123000'
+  ceph osd pool set real-tier cache_target_full_ratio 1.0
+  ceph osd pool set real-tier cache_target_full_ratio 0
+  expect_false ceph osd pool set real-tier cache_target_full_ratio 1.1
+  ceph osd pool set real-tier cache_min_flush_age 123
+  ceph osd pool get real-tier cache_min_flush_age | \
+    grep 'cache_min_flush_age:[ \t]\+123'
+  ceph osd pool set real-tier cache_min_evict_age 234
+  ceph osd pool get real-tier cache_min_evict_age | \
+    grep 'cache_min_evict_age:[ \t]\+234'
+
+  # this is not a tier pool
+  ceph osd pool create fake-tier 2
+  wait_for_clean
+
+  expect_false ceph osd pool set fake-tier hit_set_type explicit_hash
+  expect_false ceph osd pool get fake-tier hit_set_type
+  expect_false ceph osd pool set fake-tier hit_set_type explicit_object
+  expect_false ceph osd pool get fake-tier hit_set_type
+  expect_false ceph osd pool set fake-tier hit_set_type bloom
+  expect_false ceph osd pool get fake-tier hit_set_type
+  expect_false ceph osd pool set fake-tier hit_set_type i_dont_exist
+  expect_false ceph osd pool set fake-tier hit_set_period 123
+  expect_false ceph osd pool get fake-tier hit_set_period
+  expect_false ceph osd pool set fake-tier hit_set_count 12
+  expect_false ceph osd pool get fake-tier hit_set_count
+  expect_false ceph osd pool set fake-tier hit_set_fpp .01
+  expect_false ceph osd pool get fake-tier hit_set_fpp
+
+  expect_false ceph osd pool set fake-tier target_max_objects 123
+  expect_false ceph osd pool get fake-tier target_max_objects
+  expect_false ceph osd pool set fake-tier target_max_bytes 123456
+  expect_false ceph osd pool get fake-tier target_max_bytes
+  expect_false ceph osd pool set fake-tier cache_target_dirty_ratio .123
+  expect_false ceph osd pool get fake-tier cache_target_dirty_ratio
+  expect_false ceph osd pool set fake-tier cache_target_dirty_ratio -.2
+  expect_false ceph osd pool set fake-tier cache_target_dirty_ratio 1.1
+  expect_false ceph osd pool set fake-tier cache_target_dirty_high_ratio .123
+  expect_false ceph osd pool get fake-tier cache_target_dirty_high_ratio
+  expect_false ceph osd pool set fake-tier cache_target_dirty_high_ratio -.2
+  expect_false ceph osd pool set fake-tier cache_target_dirty_high_ratio 1.1
+  expect_false ceph osd pool set fake-tier cache_target_full_ratio .123
+  expect_false ceph osd pool get fake-tier cache_target_full_ratio
+  expect_false ceph osd pool set fake-tier cache_target_full_ratio 1.0
+  expect_false ceph osd pool set fake-tier cache_target_full_ratio 0
+  expect_false ceph osd pool set fake-tier cache_target_full_ratio 1.1
+  expect_false ceph osd pool set fake-tier cache_min_flush_age 123
+  expect_false ceph osd pool get fake-tier cache_min_flush_age
+  expect_false ceph osd pool set fake-tier cache_min_evict_age 234
+  expect_false ceph osd pool get fake-tier cache_min_evict_age
+
+  ceph osd tier remove rbd real-tier
+  ceph osd pool delete real-tier real-tier --yes-i-really-really-mean-it
+  ceph osd pool delete fake-tier fake-tier --yes-i-really-really-mean-it
+}
+
+function test_mon_osd_erasure_code()
+{
+
+  ceph osd erasure-code-profile set fooprofile a=b c=d
+  ceph osd erasure-code-profile set fooprofile a=b c=d
+  expect_false ceph osd erasure-code-profile set fooprofile a=b c=d e=f
+  ceph osd erasure-code-profile set fooprofile a=b c=d e=f --force
+  ceph osd erasure-code-profile set fooprofile a=b c=d e=f
+  expect_false ceph osd erasure-code-profile set fooprofile a=b c=d e=f g=h
+  #
+  # cleanup by removing profile 'fooprofile'
+  ceph osd erasure-code-profile rm fooprofile
+}
+
+function test_mon_osd_misc()
+{
+  set +e
+
+  # expect error about missing 'pool' argument
+  ceph osd map 2>$TMPFILE; check_response 'pool' $? 22
+
+  # expect error about unused argument foo
+  ceph osd ls foo 2>$TMPFILE; check_response 'unused' $? 22 
+
+  # expect "not in range" for invalid full ratio
+  ceph pg set_full_ratio 95 2>$TMPFILE; check_response 'not in range' $? 22
+
+  # expect "not in range" for invalid overload percentage
+  ceph osd reweight-by-utilization 80 2>$TMPFILE; check_response 'higher than 100' $? 22
+
+  set -e
+
+  ceph osd reweight-by-utilization 110
+  ceph osd reweight-by-utilization 110 .5
+  expect_false ceph osd reweight-by-utilization 110 0
+  expect_false ceph osd reweight-by-utilization 110 -0.1
+  ceph osd test-reweight-by-utilization 110 .5 --no-increasing
+  ceph osd test-reweight-by-utilization 110 .5 4 --no-increasing
+  expect_false ceph osd test-reweight-by-utilization 110 .5 0 --no-increasing
+  expect_false ceph osd test-reweight-by-utilization 110 .5 -10 --no-increasing
+  ceph osd reweight-by-pg 110
+  ceph osd test-reweight-by-pg 110 .5
+  ceph osd reweight-by-pg 110 rbd
+  ceph osd reweight-by-pg 110 .5 rbd
+  expect_false ceph osd reweight-by-pg 110 boguspoolasdfasdfasdf
+}
+
+function test_mon_heap_profiler()
+{
+  do_test=1
+  set +e
+  # expect 'heap' commands to be correctly parsed
+  ceph heap stats 2>$TMPFILE
+  if [[ $? -eq 22 && `grep 'tcmalloc not enabled' $TMPFILE` ]]; then
+    echo "tcmalloc not enabled; skip heap profiler test"
+    do_test=0
+  fi
+  set -e
+
+  [[ $do_test -eq 0 ]] && return 0
+
+  ceph heap start_profiler
+  ceph heap dump
+  ceph heap stop_profiler
+  ceph heap release
+}
+
+function test_osd_bench()
+{
+  # test osd bench limits
+  # As we should not rely on defaults (as they may change over time),
+  # lets inject some values and perform some simple tests
+  # max iops: 10              # 100 IOPS
+  # max throughput: 10485760  # 10MB/s
+  # max block size: 2097152   # 2MB
+  # duration: 10              # 10 seconds
+
+  ceph tell osd.0 injectargs "\
+    --osd-bench-duration 10 \
+    --osd-bench-max-block-size 2097152 \
+    --osd-bench-large-size-max-throughput 10485760 \
+    --osd-bench-small-size-max-iops 10"
+
+  # anything with a bs larger than 2097152  must fail
+  expect_false ceph tell osd.0 bench 1 2097153
+  # but using 'osd_bench_max_bs' must succeed
+  ceph tell osd.0 bench 1 2097152
+
+  # we assume 1MB as a large bs; anything lower is a small bs
+  # for a 4096 bytes bs, for 10 seconds, we are limited by IOPS
+  # max count: 409600 (bytes)
+
+  # more than max count must not be allowed
+  expect_false ceph tell osd.0 bench 409601 4096
+  # but 409600 must be succeed
+  ceph tell osd.0 bench 409600 4096
+
+  # for a large bs, we are limited by throughput.
+  # for a 2MB block size for 10 seconds, assuming 10MB/s throughput,
+  # the max count will be (10MB * 10s) = 100MB
+  # max count: 104857600 (bytes)
+
+  # more than max count must not be allowed
+  expect_false ceph tell osd.0 bench 104857601 2097152
+  # up to max count must be allowed
+  ceph tell osd.0 bench 104857600 2097152
+}
+
+function test_osd_negative_filestore_merge_threshold()
+{
+  $SUDO ceph daemon osd.0 config set filestore_merge_threshold -1
+  expect_config_value "osd.0" "filestore_merge_threshold" -1
+}
+
+function test_mon_tell()
+{
+  ceph tell mon.a version
+  ceph tell mon.b version
+  expect_false ceph tell mon.foo version
+
+  sleep 1
+
+  ceph_watch_start debug
+  ceph tell mon.a version
+  ceph_watch_wait 'mon.0 \[DBG\] from.*cmd=\[{"prefix": "version"}\]: dispatch'
+
+  ceph_watch_start debug
+  ceph tell mon.b version
+  ceph_watch_wait 'mon.1 \[DBG\] from.*cmd=\[{"prefix": "version"}\]: dispatch'
+}
+
+function test_mon_crushmap_validation()
+{
+  local map=$TMPDIR/map
+  ceph osd getcrushmap -o $map
+
+  local crushtool_path="${TMPDIR}/crushtool"
+  touch "${crushtool_path}"
+  chmod +x "${crushtool_path}"
+  local crushtool_path_old=`ceph-conf --show-config-value crushtool`
+  ceph tell mon.\* injectargs --crushtool "${crushtool_path}"
+
+  printf "%s\n" \
+      "#!/bin/sh
+       cat > /dev/null
+       exit 0" > "${crushtool_path}"
+
+  ceph osd setcrushmap -i $map
+
+  printf "%s\n" \
+      "#!/bin/sh
+       cat > /dev/null
+       exit 1" > "${crushtool_path}"
+
+  expect_false ceph osd setcrushmap -i $map
+
+  printf "%s\n" \
+      "#!/bin/sh
+       cat > /dev/null
+       echo 'TEST FAIL' >&2
+       exit 1" > "${crushtool_path}"
+
+  expect_false ceph osd setcrushmap -i $map 2> $TMPFILE
+  check_response "Error EINVAL: Failed crushmap test: TEST FAIL"
+
+  local mon_lease=`ceph-conf --show-config-value mon_lease`
+
+  test "${mon_lease}" -gt 0
+
+  printf "%s\n" \
+      "#!/bin/sh
+       cat > /dev/null
+       sleep $((mon_lease - 1))" > "${crushtool_path}"
+
+  ceph osd setcrushmap -i $map
+
+  printf "%s\n" \
+      "#!/bin/sh
+       cat > /dev/null
+       sleep $((mon_lease + 1))" > "${crushtool_path}"
+
+  expect_false ceph osd setcrushmap -i $map 2> $TMPFILE
+  check_response "Error EINVAL: Failed crushmap test: ${crushtool_path}: timed out (${mon_lease} sec)"
+
+  ceph tell mon.\* injectargs --crushtool "${crushtool_path_old}"
+
+  rm -f "${crushtool_path}"
+}
+
+function test_mon_ping()
+{
+  ceph ping mon.a
+  ceph ping mon.b
+  expect_false ceph ping mon.foo
+
+  ceph ping mon.\*
+}
+
+function test_mon_deprecated_commands()
+{
+  # current DEPRECATED commands are:
+  #  ceph compact
+  #  ceph scrub
+  #  ceph sync force
+  #
+  # Testing should be accomplished by setting
+  # 'mon_debug_deprecated_as_obsolete = true' and expecting ENOTSUP for
+  # each one of these commands.
+
+  ceph tell mon.a injectargs '--mon-debug-deprecated-as-obsolete'
+  expect_false ceph tell mon.a compact 2> $TMPFILE
+  check_response "\(EOPNOTSUPP\|ENOTSUP\): command is obsolete"
+
+  expect_false ceph tell mon.a scrub 2> $TMPFILE
+  check_response "\(EOPNOTSUPP\|ENOTSUP\): command is obsolete"
+
+  expect_false ceph tell mon.a sync force 2> $TMPFILE
+  check_response "\(EOPNOTSUPP\|ENOTSUP\): command is obsolete"
+
+  ceph tell mon.a injectargs '--no-mon-debug-deprecated-as-obsolete'
+}
+
+function test_mon_cephdf_commands()
+{
+  # ceph df detail:
+  # pool section:
+  # RAW USED The near raw used per pool in raw total
+
+  ceph osd pool create cephdf_for_test 32 32 replicated
+  ceph osd pool set cephdf_for_test size 2
+
+  dd if=/dev/zero of=./cephdf_for_test bs=4k count=1
+  rados put cephdf_for_test cephdf_for_test -p cephdf_for_test
+
+  #wait for update
+  for i in `seq 1 10`; do
+    rados -p cephdf_for_test ls - | grep -q cephdf_for_test && break
+    sleep 1
+  done
+
+  cal_raw_used_size=`ceph df detail | grep cephdf_for_test | awk -F ' ' '{printf "%d\n", 2 * $4}'`
+  raw_used_size=`ceph df detail | grep cephdf_for_test | awk -F ' '  '{print $11}'`
+
+  ceph osd pool delete cephdf_for_test cephdf_for_test --yes-i-really-really-mean-it
+  rm ./cephdf_for_test
+
+  expect_false test $cal_raw_used_size != $raw_used_size
+}
+
+#
+# New tests should be added to the TESTS array below
+#
+# Individual tests may be run using the '-t <testname>' argument
+# The user can specify '-t <testname>' as many times as she wants
+#
+# Tests will be run in order presented in the TESTS array, or in
+# the order specified by the '-t <testname>' options.
+#
+# '-l' will list all the available test names
+# '-h' will show usage
+#
+# The test maintains backward compatibility: not specifying arguments
+# will run all tests following the order they appear in the TESTS array.
+#
+
+set +x
+MON_TESTS+=" mon_injectargs"
+MON_TESTS+=" mon_injectargs_SI"
+MON_TESTS+=" tiering"
+MON_TESTS+=" auth"
+MON_TESTS+=" auth_profiles"
+MON_TESTS+=" mon_misc"
+MON_TESTS+=" mon_mon"
+MON_TESTS+=" mon_osd"
+MON_TESTS+=" mon_osd_pool"
+MON_TESTS+=" mon_osd_pool_quota"
+MON_TESTS+=" mon_pg"
+MON_TESTS+=" mon_osd_pool_set"
+MON_TESTS+=" mon_osd_tiered_pool_set"
+MON_TESTS+=" mon_osd_erasure_code"
+MON_TESTS+=" mon_osd_misc"
+MON_TESTS+=" mon_heap_profiler"
+MON_TESTS+=" mon_tell"
+MON_TESTS+=" mon_crushmap_validation"
+MON_TESTS+=" mon_ping"
+MON_TESTS+=" mon_deprecated_commands"
+MON_TESTS+=" mon_caps"
+OSD_TESTS+=" osd_bench"
+OSD_TESTS+=" osd_negative_filestore_merge_threshold"
+OSD_TESTS+=" tiering_agent"
+
+MDS_TESTS+=" mds_tell"
+MDS_TESTS+=" mon_mds"
+MDS_TESTS+=" mon_mds_metadata"
+MDS_TESTS+=" mon_cephdf_commands"
+
+TESTS+=$MON_TESTS
+TESTS+=$OSD_TESTS
+TESTS+=$MDS_TESTS
+
+#
+# "main" follows
+#
+
+function list_tests()
+{
+  echo "AVAILABLE TESTS"
+  for i in $TESTS; do
+    echo "  $i"
+  done
+}
+
+function usage()
+{
+  echo "usage: $0 [-h|-l|-t <testname> [-t <testname>...]]"
+}
+
+tests_to_run=()
+
+sanity_check=true
+
+while [[ $# -gt 0 ]]; do
+  opt=$1
+
+  case "$opt" in
+    "-l" )
+      do_list=1
+      ;;
+    "--asok-does-not-need-root" )
+      SUDO=""
+      ;;
+    "--no-sanity-check" )
+      sanity_check=false
+      ;;
+    "--test-mon" )
+      tests_to_run+="$MON_TESTS"
+      ;;
+    "--test-osd" )
+      tests_to_run+="$OSD_TESTS"
+      ;;
+    "--test-mds" )
+      tests_to_run+="$MDS_TESTS"
+      ;;
+    "-t" )
+      shift
+      if [[ -z "$1" ]]; then
+        echo "missing argument to '-t'"
+        usage ;
+        exit 1
+      fi
+      tests_to_run+=" $1"
+      ;;
+    "-h" )
+      usage ;
+      exit 0
+      ;;
+  esac
+  shift
+done
+
+if [[ $do_list -eq 1 ]]; then
+  list_tests ;
+  exit 0
+fi
+
+if test -z "$tests_to_run" ; then
+  tests_to_run="$TESTS"
+fi
+
+if $sanity_check ; then
+    wait_no_osd_down
+fi
+for i in $tests_to_run; do
+  if $sanity_check ; then
+      check_no_osd_down
+  fi
+  set -x
+  test_${i}
+  set +x
+done
+if $sanity_check ; then
+    check_no_osd_down
+fi
+
+set -x
+
+echo OK
diff --git a/qa/workunits/cephtool/test_daemon.sh b/qa/workunits/cephtool/test_daemon.sh
new file mode 100755
index 0000000..413f708
--- /dev/null
+++ b/qa/workunits/cephtool/test_daemon.sh
@@ -0,0 +1,43 @@
+#!/bin/bash -x
+
+set -e
+
+expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+echo note: assuming mon.a is on the current host
+
+# can set to 'sudo ./ceph' to execute tests from current dir for development
+CEPH=${CEPH:-'sudo ceph'}
+
+${CEPH} daemon mon.a version | grep version
+
+# get debug_ms setting and strip it, painfully for reuse
+old_ms=$(${CEPH} daemon mon.a config get debug_ms | \
+	grep debug_ms | sed -e 's/.*: //' -e 's/["\}\\]//g')
+${CEPH} daemon mon.a config set debug_ms 13
+new_ms=$(${CEPH} daemon mon.a config get debug_ms | \
+	grep debug_ms | sed -e 's/.*: //' -e 's/["\}\\]//g')
+[ "$new_ms" = "13/13" ]
+${CEPH} daemon mon.a config set debug_ms $old_ms
+new_ms=$(${CEPH} daemon mon.a config get debug_ms | \
+	grep debug_ms | sed -e 's/.*: //' -e 's/["\}\\]//g')
+[ "$new_ms" = "$old_ms" ]
+
+# unregistered/non-existent command
+expect_false ${CEPH} daemon mon.a bogus_command_blah foo
+
+set +e
+OUTPUT=$(${CEPH} -c /not/a/ceph.conf daemon mon.a help 2>&1)
+# look for EINVAL
+if [ $? != 22 ] ; then exit 1; fi
+if ! echo "$OUTPUT" | grep -q '.*open.*/not/a/ceph.conf'; then 
+	echo "didn't find expected error in bad conf search"
+	exit 1
+fi
+set -e
+
+echo OK
diff --git a/qa/workunits/cls/test_cls_hello.sh b/qa/workunits/cls/test_cls_hello.sh
new file mode 100755
index 0000000..0a2e096
--- /dev/null
+++ b/qa/workunits/cls/test_cls_hello.sh
@@ -0,0 +1,5 @@
+#!/bin/sh -e
+
+ceph_test_cls_hello
+
+exit 0
diff --git a/qa/workunits/cls/test_cls_lock.sh b/qa/workunits/cls/test_cls_lock.sh
new file mode 100755
index 0000000..c145270
--- /dev/null
+++ b/qa/workunits/cls/test_cls_lock.sh
@@ -0,0 +1,5 @@
+#!/bin/sh -e
+
+ceph_test_cls_lock
+
+exit 0
diff --git a/qa/workunits/cls/test_cls_numops.sh b/qa/workunits/cls/test_cls_numops.sh
new file mode 100755
index 0000000..dcbafca
--- /dev/null
+++ b/qa/workunits/cls/test_cls_numops.sh
@@ -0,0 +1,5 @@
+#!/bin/sh -e
+
+ceph_test_cls_numops
+
+exit 0
diff --git a/qa/workunits/cls/test_cls_rbd.sh b/qa/workunits/cls/test_cls_rbd.sh
new file mode 100755
index 0000000..fd4bec0
--- /dev/null
+++ b/qa/workunits/cls/test_cls_rbd.sh
@@ -0,0 +1,6 @@
+#!/bin/sh -e
+
+GTEST_FILTER=${CLS_RBD_GTEST_FILTER:-*}
+ceph_test_cls_rbd --gtest_filter=${GTEST_FILTER}
+
+exit 0
diff --git a/qa/workunits/cls/test_cls_refcount.sh b/qa/workunits/cls/test_cls_refcount.sh
new file mode 100755
index 0000000..d722f5a
--- /dev/null
+++ b/qa/workunits/cls/test_cls_refcount.sh
@@ -0,0 +1,5 @@
+#!/bin/sh -e
+
+ceph_test_cls_refcount
+
+exit 0
diff --git a/qa/workunits/cls/test_cls_rgw.sh b/qa/workunits/cls/test_cls_rgw.sh
new file mode 100755
index 0000000..257338a
--- /dev/null
+++ b/qa/workunits/cls/test_cls_rgw.sh
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+
+ceph_test_cls_rgw
+#ceph_test_cls_rgw_meta
+#ceph_test_cls_rgw_log
+#ceph_test_cls_rgw_opstate
+
+exit 0
diff --git a/qa/workunits/direct_io/.gitignore b/qa/workunits/direct_io/.gitignore
new file mode 100644
index 0000000..80f1fd1
--- /dev/null
+++ b/qa/workunits/direct_io/.gitignore
@@ -0,0 +1,3 @@
+/direct_io_test
+/test_sync_io
+/test_short_dio_read
diff --git a/qa/workunits/direct_io/Makefile b/qa/workunits/direct_io/Makefile
new file mode 100644
index 0000000..20fec0b
--- /dev/null
+++ b/qa/workunits/direct_io/Makefile
@@ -0,0 +1,11 @@
+CFLAGS = -Wall -Wextra -D_GNU_SOURCE
+
+TARGETS = direct_io_test test_sync_io test_short_dio_read
+
+.c:
+	$(CC) $(CFLAGS) $@.c -o $@
+
+all:	$(TARGETS)
+
+clean:
+	rm $(TARGETS)
diff --git a/qa/workunits/direct_io/big.sh b/qa/workunits/direct_io/big.sh
new file mode 100755
index 0000000..43bd6d7
--- /dev/null
+++ b/qa/workunits/direct_io/big.sh
@@ -0,0 +1,6 @@
+#!/bin/sh -ex
+
+echo "test large (16MB) dio write"
+dd if=/dev/zero of=foo.big bs=16M count=1 oflag=direct
+
+echo OK
diff --git a/qa/workunits/direct_io/direct_io_test.c b/qa/workunits/direct_io/direct_io_test.c
new file mode 100644
index 0000000..ccfbbb8
--- /dev/null
+++ b/qa/workunits/direct_io/direct_io_test.c
@@ -0,0 +1,312 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2011 New Dream Network
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#include <errno.h>
+#include <inttypes.h>
+#include <fcntl.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+
+/*
+ * direct_io_test
+ *
+ * This test does some I/O using O_DIRECT.
+ *
+ * Semantics of O_DIRECT can be found at http://lwn.net/Articles/348739/
+ *
+ */
+
+static int g_num_pages = 100;
+
+static int g_duration = 10;
+
+struct chunk {
+        uint64_t offset;
+        uint64_t pad0;
+        uint64_t pad1;
+        uint64_t pad2;
+        uint64_t pad3;
+        uint64_t pad4;
+        uint64_t pad5;
+        uint64_t not_offset;
+} __attribute__((packed));
+
+static int page_size;
+
+static char temp_file[] = "direct_io_temp_file_XXXXXX";
+
+static int safe_write(int fd, const void *buf, signed int len)
+{
+        const char *b = (const char*)buf;
+        /* Handle EINTR and short writes */
+        while (1) {
+                int res = write(fd, b, len);
+                if (res < 0) {
+                        int err = errno;
+                        if (err != EINTR) {
+                                return err;
+                        }
+                }
+                len -= res;
+                b += res;
+                if (len <= 0)
+                        return 0;
+        }
+}
+
+static int do_read(int fd, char *buf, int buf_sz)
+{
+        /* We assume no short reads or EINTR. It's not really clear how
+         * those things interact with O_DIRECT. */
+        int ret = read(fd, buf, buf_sz);
+        if (ret < 0) {
+                int err = errno;
+                printf("do_read: error: %d (%s)\n", err, strerror(err));
+                return err;
+        }
+        if (ret != buf_sz) {
+                printf("do_read: short read\n");
+                return -EIO;
+        }
+        return 0;
+}
+
+static int setup_temp_file(void)
+{
+        int fd;
+        int64_t num_chunks, i;
+
+        if (page_size % sizeof(struct chunk)) {
+                printf("setup_big_file: page_size doesn't divide evenly "
+                        "into data blocks.\n");
+                return -EINVAL;
+        }
+
+        fd = mkstemp(temp_file);
+        if (fd < 0) {
+                int err = errno;
+                printf("setup_big_file: mkostemps failed with error %d\n", err);
+                return err;
+        }
+
+        num_chunks = g_num_pages * (page_size / sizeof(struct chunk));
+        for (i = 0; i < num_chunks; ++i) {
+                int ret;
+                struct chunk c;
+                memset(&c, 0, sizeof(c));
+                c.offset = i * sizeof(struct chunk);
+                c.pad0 = 0;
+                c.pad1 = 1;
+                c.pad2 = 2;
+                c.pad3 = 3;
+                c.pad4 = 4;
+                c.pad5 = 5;
+                c.not_offset = ~c.offset;
+                ret = safe_write(fd, &c, sizeof(struct chunk));
+                if (ret) {
+                        printf("setup_big_file: safe_write failed with "
+                               "error: %d\n", ret);
+                        TEMP_FAILURE_RETRY(close(fd));
+                        unlink(temp_file);
+                        return ret;
+                }
+        }
+        TEMP_FAILURE_RETRY(close(fd));
+        return 0;
+}
+
+static int verify_chunk(const struct chunk *c, uint64_t offset)
+{
+        if (c->offset != offset) {
+                printf("verify_chunk(%" PRId64 "): bad offset value (got: %"
+                       PRId64 ", expected: %" PRId64 "\n", offset, c->offset, offset);
+                return EIO;
+        }
+        if (c->pad0 != 0) {
+                printf("verify_chunk(%" PRId64 "): bad pad0 value\n", offset);
+                return EIO;
+        }
+        if (c->pad1 != 1) {
+                printf("verify_chunk(%" PRId64 "): bad pad1 value\n", offset);
+                return EIO;
+        }
+        if (c->pad2 != 2) {
+                printf("verify_chunk(%" PRId64 "): bad pad2 value\n", offset);
+                return EIO;
+        }
+        if (c->pad3 != 3) {
+                printf("verify_chunk(%" PRId64 "): bad pad3 value\n", offset);
+                return EIO;
+        }
+        if (c->pad4 != 4) {
+                printf("verify_chunk(%" PRId64 "): bad pad4 value\n", offset);
+                return EIO;
+        }
+        if (c->pad5 != 5) {
+                printf("verify_chunk(%" PRId64 "): bad pad5 value\n", offset);
+                return EIO;
+        }
+        if (c->not_offset != ~offset) {
+                printf("verify_chunk(%" PRId64 "): bad not_offset value\n",
+                       offset);
+                return EIO;
+        }
+        return 0;
+}
+
+static int do_o_direct_reads(void)
+{
+        int fd, ret;
+        unsigned int i;
+        void *buf = 0;
+        time_t cur_time, end_time;
+        ret = posix_memalign(&buf, page_size, page_size);
+        if (ret) {
+                printf("do_o_direct_reads: posix_memalign returned %d\n", ret);
+                goto done;
+        }
+
+        fd = open(temp_file, O_RDONLY | O_DIRECT);
+        if (fd < 0) {
+                ret = errno;
+                printf("do_o_direct_reads: error opening fd: %d\n", ret);
+                goto free_buf;
+        }
+
+        // read the first chunk and see if it looks OK
+        ret = do_read(fd, buf, page_size);
+        if (ret)
+                goto close_fd;
+        ret = verify_chunk((struct chunk*)buf, 0);
+        if (ret)
+                goto close_fd;
+
+        // read some random chunks and see how they look
+        cur_time = time(NULL);
+        end_time = cur_time + g_duration;
+        i = 0;
+        do {
+                time_t next_time;
+                uint64_t offset;
+                int page;
+                unsigned int seed;
+
+                seed = i++;
+                page = rand_r(&seed) % g_num_pages;
+                offset = page;
+                offset *= page_size;
+                if (lseek64(fd, offset, SEEK_SET) == -1) {
+                        int err = errno;
+                        printf("lseek64(%" PRId64 ") failed: error %d (%s)\n",
+                               offset, err, strerror(err));
+                        goto close_fd;
+                }
+                ret = do_read(fd, buf, page_size);
+                if (ret)
+                        goto close_fd;
+                ret = verify_chunk((struct chunk*)buf, offset);
+                if (ret)
+                        goto close_fd;
+                next_time = time(NULL);
+                if (next_time > cur_time) {
+                        printf(".");
+                }
+                cur_time = next_time;
+        } while (time(NULL) < end_time);
+
+        printf("\ndo_o_direct_reads: SUCCESS\n");
+close_fd:
+        TEMP_FAILURE_RETRY(close(fd));
+free_buf:
+        free(buf);
+done:
+        return ret;
+}
+
+static void usage(char *argv0)
+{
+        printf("%s: tests direct I/O\n", argv0);
+        printf("-d <seconds>:          sets duration to <seconds>\n");
+        printf("-h:                    this help\n");
+        printf("-p <pages>:            sets number of pages to allocate\n");
+}
+
+static void parse_args(int argc, char *argv[])
+{
+        int c;
+        while ((c = getopt (argc, argv, "d:hp:")) != -1) {
+                switch (c) {
+                case 'd':
+                        g_duration = atoi(optarg);
+                        if (g_duration <= 0) {
+                                printf("tried to set invalid value of "
+                                       "g_duration: %d\n", g_num_pages);
+                                exit(1);
+                        }
+                        break;
+                case 'h':
+                        usage(argv[0]);
+                        exit(0);
+                        break;
+                case 'p':
+                        g_num_pages = atoi(optarg);
+                        if (g_num_pages <= 0) {
+                                printf("tried to set invalid value of "
+                                       "g_num_pages: %d\n", g_num_pages);
+                                exit(1);
+                        }
+                        break;
+                case '?':
+                        usage(argv[0]);
+                        exit(1);
+                        break;
+                default:
+                        usage(argv[0]);
+                        exit(1);
+                        break;
+                }
+        }
+}
+
+int main(int argc, char *argv[])
+{
+        int ret;
+
+        parse_args(argc, argv);
+
+        setvbuf(stdout, NULL, _IONBF, 0);
+
+        page_size = getpagesize();
+
+        ret = setup_temp_file();
+        if (ret) {
+                printf("setup_temp_file failed with error %d\n", ret);
+                goto done;
+        }
+
+        ret = do_o_direct_reads();
+        if (ret) {
+                printf("do_o_direct_reads failed with error %d\n", ret);
+                goto unlink_temp_file;
+        }
+
+unlink_temp_file:
+        unlink(temp_file);
+done:
+        return ret;
+}
diff --git a/qa/workunits/direct_io/misc.sh b/qa/workunits/direct_io/misc.sh
new file mode 100755
index 0000000..6de080d
--- /dev/null
+++ b/qa/workunits/direct_io/misc.sh
@@ -0,0 +1,16 @@
+#!/bin/sh -ex
+
+# a few test cases from henry
+echo "test read from hole"
+dd if=/dev/zero of=dd3 bs=1 seek=1048576 count=0
+dd if=dd3 of=/tmp/ddout1 skip=8 bs=512 count=2 iflag=direct
+dd if=/dev/zero of=/tmp/dd3 bs=512 count=2
+cmp /tmp/dd3 /tmp/ddout1
+
+echo "other thing"
+dd if=/dev/urandom of=/tmp/dd10 bs=500 count=1
+dd if=/tmp/dd10 of=dd10 bs=512 seek=8388 count=1
+dd if=dd10 of=/tmp/dd10out bs=512 skip=8388 count=1 iflag=direct
+cmp /tmp/dd10 /tmp/dd10out
+
+echo OK
diff --git a/qa/workunits/direct_io/test_short_dio_read.c b/qa/workunits/direct_io/test_short_dio_read.c
new file mode 100644
index 0000000..5024855
--- /dev/null
+++ b/qa/workunits/direct_io/test_short_dio_read.c
@@ -0,0 +1,57 @@
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+int main()
+{
+        char buf[409600];
+        ssize_t r;
+	int err;
+	int fd = open("shortfile", O_WRONLY|O_CREAT, 0644);
+
+	if (fd < 0) {
+		err = errno;
+		printf("error: open() failed with: %d (%s)\n", err, strerror(err));
+		exit(err);
+	}
+
+	printf("writing first 3 bytes of 10k file\n");
+        r = write(fd, "foo", 3);
+	if (r == -1) {
+		err = errno;
+		printf("error: write() failed with: %d (%s)\n", err, strerror(err));
+		close(fd);
+		exit(err);
+	}
+        r = ftruncate(fd, 10000);
+	if (r == -1) {
+		err = errno;
+		printf("error: ftruncate() failed with: %d (%s)\n", err, strerror(err));
+		close(fd);
+		exit(err);
+	}
+	
+        fsync(fd);
+        close(fd);
+
+	printf("reading O_DIRECT\n");
+        fd = open("shortfile", O_RDONLY|O_DIRECT);
+	if (fd < 0) {
+		err = errno;
+		printf("error: open() failed with: %d (%s)\n", err, strerror(err));
+		exit(err);
+	}
+
+        r = read(fd, buf, sizeof(buf));
+        close(fd);
+
+        printf("got %d\n", (int)r);
+	if (r != 10000)
+		return 1;
+        return 0;
+}
diff --git a/qa/workunits/direct_io/test_sync_io.c b/qa/workunits/direct_io/test_sync_io.c
new file mode 100644
index 0000000..f393fa6
--- /dev/null
+++ b/qa/workunits/direct_io/test_sync_io.c
@@ -0,0 +1,250 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <linux/types.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+//#include "../client/ioctl.h"
+
+#include <linux/ioctl.h>
+#define CEPH_IOCTL_MAGIC 0x97
+#define CEPH_IOC_SYNCIO _IO(CEPH_IOCTL_MAGIC, 5)
+
+void write_pattern()
+{
+	printf("writing pattern\n");
+
+	uint64_t i;
+	int r;
+
+	int fd = open("foo", O_CREAT|O_WRONLY, 0644);
+	if (fd < 0) {
+	   r = errno;
+	   printf("write_pattern: error: open() failed with: %d (%s)\n", r, strerror(r));
+	   exit(r);
+	}
+	for (i=0; i<1048576 * sizeof(i); i += sizeof(i)) {
+		r = write(fd, &i, sizeof(i));
+		if (r == -1) {
+			r = errno;
+			printf("write_pattern: error: write() failed with: %d (%s)\n", r, strerror(r));
+			break;
+		}
+	}
+
+	close(fd);
+}
+
+int verify_pattern(char *buf, size_t len, uint64_t off)
+{
+	size_t i;
+
+	for (i = 0; i < len; i += sizeof(uint64_t)) {
+		uint64_t expected = i + off;
+		uint64_t actual = *(uint64_t*)(buf + i);
+		if (expected != actual) {
+			printf("error: offset %llu had %llu\n", (unsigned long long)expected,
+			       (unsigned long long)actual);
+			exit(1);
+		}
+	}
+	return 0;
+}
+
+void generate_pattern(void *buf, size_t len, uint64_t offset)
+{
+	uint64_t *v = buf;
+	size_t i;
+
+	for (i=0; i<len / sizeof(v); i++)
+		v[i] = i * sizeof(v) + offset;
+	verify_pattern(buf, len, offset);
+}
+
+int read_file(int buf_align, uint64_t offset, int len, int direct) {
+
+	printf("read_file buf_align %d offset %llu len %d\n", buf_align,
+	       (unsigned long long)offset, len);
+	void *rawbuf;
+	int r;
+        int flags;
+	int err = 0;
+
+	if(direct)
+	   flags = O_RDONLY|O_DIRECT;
+	else
+	   flags = O_RDONLY;
+
+	int fd = open("foo", flags);
+	if (fd < 0) {
+	   err = errno;
+	   printf("read_file: error: open() failed with: %d (%s)\n", err, strerror(err));
+	   exit(err);
+	}
+
+	if (!direct)
+	   ioctl(fd, CEPH_IOC_SYNCIO);
+
+	if ((r = posix_memalign(&rawbuf, 4096, len + buf_align)) != 0) {
+	   printf("read_file: error: posix_memalign failed with %d", r);
+	   close(fd);
+	   exit (r);
+	}
+
+	void *buf = (char *)rawbuf + buf_align;
+	memset(buf, 0, len);
+	r = pread(fd, buf, len, offset);
+	if (r == -1) {
+	   err = errno;
+	   printf("read_file: error: pread() failed with: %d (%s)\n", err, strerror(err));
+	   goto out;
+	}
+	r = verify_pattern(buf, len, offset);
+
+out:
+	close(fd);
+	free(rawbuf);
+	return r;
+}
+
+int read_direct(int buf_align, uint64_t offset, int len)
+{
+	printf("read_direct buf_align %d offset %llu len %d\n", buf_align,
+	       (unsigned long long)offset, len);
+	return read_file(buf_align, offset, len, 1);
+}
+
+int read_sync(int buf_align, uint64_t offset, int len)
+{
+	printf("read_sync buf_align %d offset %llu len %d\n", buf_align,
+	       (unsigned long long)offset, len);
+	return read_file(buf_align, offset, len, 0);
+}
+
+int write_file(int buf_align, uint64_t offset, int len, int direct)
+{
+	printf("write_file buf_align %d offset %llu len %d\n", buf_align,
+	       (unsigned long long)offset, len);
+	void *rawbuf;
+	int r;
+        int err = 0;
+	int flags;
+	if (direct)
+	   flags = O_WRONLY|O_DIRECT|O_CREAT;
+        else
+	   flags = O_WRONLY|O_CREAT;
+
+	int fd = open("foo", flags, 0644);
+	if (fd < 0) {
+	   int err = errno;
+	   printf("write_file: error: open() failed with: %d (%s)\n", err, strerror(err));
+	   exit(err);
+	}
+
+	if ((r = posix_memalign(&rawbuf, 4096, len + buf_align)) != 0) {
+	   printf("write_file: error: posix_memalign failed with %d", r);
+	   err = r;
+	   goto out_close;
+	}
+
+	if (!direct)
+	   ioctl(fd, CEPH_IOC_SYNCIO);
+
+	void *buf = (char *)rawbuf + buf_align;
+
+	generate_pattern(buf, len, offset);
+
+	r = pwrite(fd, buf, len, offset);
+	close(fd);
+
+	fd = open("foo", O_RDONLY);
+	if (fd < 0) {
+	   err = errno;
+	   printf("write_file: error: open() failed with: %d (%s)\n", err, strerror(err));
+	   free(rawbuf);
+	   goto out_unlink;
+	}
+	void *buf2 = malloc(len);
+	if (!buf2) {
+	   err = -ENOMEM;
+	   printf("write_file: error: malloc failed\n");
+	   goto out_free;
+	}
+
+	memset(buf2, 0, len);
+	r = pread(fd, buf2, len, offset);
+	if (r == -1) {
+	   err = errno;
+	   printf("write_file: error: pread() failed with: %d (%s)\n", err, strerror(err));
+	   goto out_free_buf;
+	}
+	r = verify_pattern(buf2, len, offset);
+
+out_free_buf:
+	free(buf2);
+out_free:
+	free(rawbuf);
+out_close:
+	close(fd);
+out_unlink:
+	unlink("foo");
+	if (err)
+	   exit(err);
+	return r;
+}
+
+int write_direct(int buf_align, uint64_t offset, int len)
+{
+	printf("write_direct buf_align %d offset %llu len %d\n", buf_align,
+	       (unsigned long long)offset, len);
+	return write_file (buf_align, offset, len, 1);
+}
+
+int write_sync(int buf_align, uint64_t offset, int len)
+{
+	printf("write_sync buf_align %d offset %llu len %d\n", buf_align,
+	       (unsigned long long)offset, len);
+	return write_file (buf_align, offset, len, 0);
+}
+
+int main(int argc, char **argv)
+{
+	uint64_t i, j, k;
+	int read = 1;
+	int write = 1;
+
+	if (argc >= 2 && strcmp(argv[1], "read") == 0)
+		write = 0;
+	if (argc >= 2 && strcmp(argv[1], "write") == 0)
+		read = 0;
+
+	if (read) {
+		write_pattern();
+		
+		for (i = 0; i < 4096; i += 512)
+			for (j = 4*1024*1024 - 4096; j < 4*1024*1024 + 4096; j += 512)
+				for (k = 1024; k <= 16384; k *= 2) {
+					read_direct(i, j, k);
+					read_sync(i, j, k);
+				}
+		
+	}
+	unlink("foo");
+	if (write) {
+		for (i = 0; i < 4096; i += 512)
+			for (j = 4*1024*1024 - 4096 + 512; j < 4*1024*1024 + 4096; j += 512)
+				for (k = 1024; k <= 16384; k *= 2) {
+					write_direct(i, j, k);
+					write_sync(i, j, k);
+				}
+	}
+	
+
+	return 0;
+}
diff --git a/qa/workunits/erasure-code/.gitignore b/qa/workunits/erasure-code/.gitignore
new file mode 100644
index 0000000..7e563b8
--- /dev/null
+++ b/qa/workunits/erasure-code/.gitignore
@@ -0,0 +1,2 @@
+*.log
+*.trs
diff --git a/qa/workunits/erasure-code/bench.html b/qa/workunits/erasure-code/bench.html
new file mode 100644
index 0000000..3b4b6c7
--- /dev/null
+++ b/qa/workunits/erasure-code/bench.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" >
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+    <title>Erasure Code Plugins Benchmarks</title>
+    <link href="examples.css" rel="stylesheet" type="text/css">
+    <script language="javascript" type="text/javascript" src="jquery.js"></script>
+    <script language="javascript" type="text/javascript" src="jquery.flot.js"></script>
+    <script language="javascript" type="text/javascript" src="jquery.flot.categories.js"></script>
+    <script language="javascript" type="text/javascript" src="bench.js"></script>
+    <script language="javascript" type="text/javascript" src="plot.js"></script>
+  </head>
+  <body>
+
+    <div id="header">
+      <h2>Erasure Code Plugins Benchmarks</h2>
+    </div>
+
+    <div id="content">
+
+      <div class="demo-container">
+	<div id="encode" class="demo-placeholder"></div>
+      </div>
+      <p>encode: Y = GB/s, X = K/M</p>
+
+      <div class="demo-container">
+	<div id="decode" class="demo-placeholder"></div>
+      </div>
+      <p>decode: Y = GB/s, X = K/M/erasures</p>
+
+    </div>
+
+  </body>
+</html>
diff --git a/qa/workunits/erasure-code/bench.sh b/qa/workunits/erasure-code/bench.sh
new file mode 100755
index 0000000..8e8671c
--- /dev/null
+++ b/qa/workunits/erasure-code/bench.sh
@@ -0,0 +1,194 @@
+#!/bin/bash 
+#
+# Copyright (C) 2015 Red Hat <contact at redhat.com>
+# Copyright (C) 2013,2014 Cloudwatt <libre.licensing at cloudwatt.com>
+#
+# Author: Loic Dachary <loic at dachary.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Library Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Library Public License for more details.
+#
+# Test that it works from sources with:
+#
+#  CEPH_ERASURE_CODE_BENCHMARK=src/ceph_erasure_code_benchmark  \
+#  PLUGIN_DIRECTORY=src/.libs \
+#      qa/workunits/erasure-code/bench.sh fplot jerasure |
+#      tee qa/workunits/erasure-code/bench.js
+#
+# This should start immediately and display:
+#
+# ...
+# [ '2/1',  .48035538612887358583  ],
+# [ '3/2',  .21648470405675016626  ],
+# etc.
+#
+# and complete within a few seconds. The result can then be displayed with:
+#
+#  firefox qa/workunits/erasure-code/bench.html
+#
+# Once it is confirmed to work, it can be run with a more significant
+# volume of data so that the measures are more reliable:
+#
+#  TOTAL_SIZE=$((4 * 1024 * 1024 * 1024)) \
+#  CEPH_ERASURE_CODE_BENCHMARK=src/ceph_erasure_code_benchmark  \
+#  PLUGIN_DIRECTORY=src/.libs \
+#      qa/workunits/erasure-code/bench.sh fplot jerasure |
+#      tee qa/workunits/erasure-code/bench.js
+#
+set -e
+
+export PATH=/sbin:$PATH
+
+: ${VERBOSE:=false}
+: ${CEPH_ERASURE_CODE_BENCHMARK:=ceph_erasure_code_benchmark}
+: ${PLUGIN_DIRECTORY:=/usr/lib/ceph/erasure-code}
+: ${PLUGINS:=isa jerasure_generic jerasure_sse4}
+: ${TECHNIQUES:=vandermonde cauchy}
+: ${TOTAL_SIZE:=$((1024 * 1024))}
+: ${SIZE:=4096}
+: ${PARAMETERS:=--parameter jerasure-per-chunk-alignment=true}
+
+function bench_header() {
+    echo -e "seconds\tKB\tplugin\tk\tm\twork.\titer.\tsize\teras.\tcommand."
+}
+
+function bench() {
+    local plugin=$1
+    shift
+    local k=$1
+    shift
+    local m=$1
+    shift
+    local workload=$1
+    shift
+    local iterations=$1
+    shift
+    local size=$1
+    shift
+    local erasures=$1
+    shift
+    command=$(echo $CEPH_ERASURE_CODE_BENCHMARK \
+        --plugin $plugin \
+        --workload $workload \
+        --iterations $iterations \
+        --size $size \
+        --erasures $erasures \
+        --parameter k=$k \
+        --parameter m=$m \
+        --erasure-code-dir $PLUGIN_DIRECTORY)
+    result=$($command "$@")
+    echo -e "$result\t$plugin\t$k\t$m\t$workload\t$iterations\t$size\t$erasures\t$command ""$@"
+}
+
+function packetsize() {
+    local k=$1
+    local w=$2
+    local vector_wordsize=$3
+    local size=$4
+
+    local p=$(( ($size / $k / $w / $vector_wordsize ) * $vector_wordsize))
+    if [ $p -gt 3100 ] ; then
+        p=3100
+    fi
+    echo $p
+}
+
+function bench_run() {
+    local plugin=jerasure
+    local w=8
+    local VECTOR_WORDSIZE=16
+    local ks="2 3 4 6 10"
+    declare -A k2ms
+    k2ms[2]="1"
+    k2ms[3]="2"
+    k2ms[4]="2 3"
+    k2ms[6]="2 3 4"
+    k2ms[10]="3 4"
+    local isa2technique_vandermonde='reed_sol_van'
+    local isa2technique_cauchy='cauchy'
+    local jerasure_generic2technique_vandermonde='reed_sol_van'
+    local jerasure_generic2technique_cauchy='cauchy_good'
+    local jerasure_sse42technique_vandermonde='reed_sol_van'
+    local jerasure_sse42technique_cauchy='cauchy_good'
+    for technique in ${TECHNIQUES} ; do
+        for plugin in ${PLUGINS} ; do
+            eval technique_parameter=\$${plugin}2technique_${technique}
+            echo "serie encode_${technique}_${plugin}"
+            for k in $ks ; do
+                for m in ${k2ms[$k]} ; do
+                    bench $plugin $k $m encode $(($TOTAL_SIZE / $SIZE)) $SIZE 0 \
+                        --parameter packetsize=$(packetsize $k $w $VECTOR_WORDSIZE $SIZE) \
+                        ${PARAMETERS} \
+                        --parameter technique=$technique_parameter
+
+                done
+            done
+        done
+    done
+    for technique in ${TECHNIQUES} ; do
+        for plugin in ${PLUGINS} ; do
+            eval technique_parameter=\$${plugin}2technique_${technique}
+            echo "serie decode_${technique}_${plugin}"
+            for k in $ks ; do
+                for m in ${k2ms[$k]} ; do
+                    echo
+                    for erasures in $(seq 1 $m) ; do
+                        bench $plugin $k $m decode $(($TOTAL_SIZE / $SIZE)) $SIZE $erasures \
+                            --parameter packetsize=$(packetsize $k $w $VECTOR_WORDSIZE  $SIZE) \
+                            ${PARAMETERS} \
+                            --parameter technique=$technique_parameter
+                    done
+                done
+            done
+        done
+    done
+}
+
+function fplot() {
+    local serie
+    bench_run | while read seconds total plugin k m workload iteration size erasures rest ; do 
+        if [ -z $seconds ] ; then
+            echo null,
+        elif [ $seconds = serie ] ; then
+            if [ "$serie" ] ; then
+                echo '];'
+            fi
+            local serie=`echo $total | sed 's/cauchy_\([0-9]\)/cauchy_good_\1/g'`
+            echo "var $serie = ["
+        else
+            local x
+            if [ $workload = encode ] ; then
+                x=$k/$m
+            else
+                x=$k/$m/$erasures
+            fi
+            echo "[ '$x', " $(echo "( $total / 1024 / 1024 ) / $seconds" | bc -ql) " ], "
+        fi
+    done
+    echo '];'
+}
+
+function main() {
+    bench_header
+    bench_run
+}
+
+if [ "$1" = fplot ] ; then
+    "$@"
+else
+    main
+fi
+# Local Variables:
+# compile-command: "\
+#   CEPH_ERASURE_CODE_BENCHMARK=../../../src/ceph_erasure_code_benchmark \
+#   PLUGIN_DIRECTORY=../../../src/.libs \
+#   ./bench.sh
+# "
+# End:
diff --git a/qa/workunits/erasure-code/examples.css b/qa/workunits/erasure-code/examples.css
new file mode 100644
index 0000000..ee47247
--- /dev/null
+++ b/qa/workunits/erasure-code/examples.css
@@ -0,0 +1,97 @@
+* {	padding: 0; margin: 0; vertical-align: top; }
+
+body {
+	background: url(background.png) repeat-x;
+	font: 18px/1.5em "proxima-nova", Helvetica, Arial, sans-serif;
+}
+
+a {	color: #069; }
+a:hover { color: #28b; }
+
+h2 {
+	margin-top: 15px;
+	font: normal 32px "omnes-pro", Helvetica, Arial, sans-serif;
+}
+
+h3 {
+	margin-left: 30px;
+	font: normal 26px "omnes-pro", Helvetica, Arial, sans-serif;
+	color: #666;
+}
+
+p {
+	margin-top: 10px;
+}
+
+button {
+	font-size: 18px;
+	padding: 1px 7px;
+}
+
+input {
+	font-size: 18px;
+}
+
+input[type=checkbox] {
+	margin: 7px;
+}
+
+#header {
+	position: relative;
+	width: 900px;
+	margin: auto;
+}
+
+#header h2 {
+	margin-left: 10px;
+	vertical-align: middle;
+	font-size: 42px;
+	font-weight: bold;
+	text-decoration: none;
+	color: #000;
+}
+
+#content {
+	width: 880px;
+	margin: 0 auto;
+	padding: 10px;
+}
+
+#footer {
+	margin-top: 25px;
+	margin-bottom: 10px;
+	text-align: center;
+	font-size: 12px;
+	color: #999;
+}
+
+.demo-container {
+	box-sizing: border-box;
+	width: 850px;
+	height: 450px;
+	padding: 20px 15px 15px 15px;
+	margin: 15px auto 30px auto;
+	border: 1px solid #ddd;
+	background: #fff;
+	background: linear-gradient(#f6f6f6 0, #fff 50px);
+	background: -o-linear-gradient(#f6f6f6 0, #fff 50px);
+	background: -ms-linear-gradient(#f6f6f6 0, #fff 50px);
+	background: -moz-linear-gradient(#f6f6f6 0, #fff 50px);
+	background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px);
+	box-shadow: 0 3px 10px rgba(0,0,0,0.15);
+	-o-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
+	-ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
+	-moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
+	-webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1);
+}
+
+.demo-placeholder {
+	width: 100%;
+	height: 100%;
+	font-size: 14px;
+	line-height: 1.2em;
+}
+
+.legend table {
+	border-spacing: 5px;
+}
\ No newline at end of file
diff --git a/qa/workunits/erasure-code/jquery.flot.categories.js b/qa/workunits/erasure-code/jquery.flot.categories.js
new file mode 100644
index 0000000..2f9b257
--- /dev/null
+++ b/qa/workunits/erasure-code/jquery.flot.categories.js
@@ -0,0 +1,190 @@
+/* Flot plugin for plotting textual data or categories.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin
+allows you to plot such a dataset directly.
+
+To enable it, you must specify mode: "categories" on the axis with the textual
+labels, e.g.
+
+	$.plot("#placeholder", data, { xaxis: { mode: "categories" } });
+
+By default, the labels are ordered as they are met in the data series. If you
+need a different ordering, you can specify "categories" on the axis options
+and list the categories there:
+
+	xaxis: {
+		mode: "categories",
+		categories: ["February", "March", "April"]
+	}
+
+If you need to customize the distances between the categories, you can specify
+"categories" as an object mapping labels to values
+
+	xaxis: {
+		mode: "categories",
+		categories: { "February": 1, "March": 3, "April": 4 }
+	}
+
+If you don't specify all categories, the remaining categories will be numbered
+from the max value plus 1 (with a spacing of 1 between each).
+
+Internally, the plugin works by transforming the input data through an auto-
+generated mapping where the first category becomes 0, the second 1, etc.
+Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this
+is visible in hover and click events that return numbers rather than the
+category labels). The plugin also overrides the tick generator to spit out the
+categories as ticks instead of the values.
+
+If you need to map a value back to its label, the mapping is always accessible
+as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories.
+
+*/
+
+(function ($) {
+    var options = {
+        xaxis: {
+            categories: null
+        },
+        yaxis: {
+            categories: null
+        }
+    };
+    
+    function processRawData(plot, series, data, datapoints) {
+        // if categories are enabled, we need to disable
+        // auto-transformation to numbers so the strings are intact
+        // for later processing
+
+        var xCategories = series.xaxis.options.mode == "categories",
+            yCategories = series.yaxis.options.mode == "categories";
+        
+        if (!(xCategories || yCategories))
+            return;
+
+        var format = datapoints.format;
+
+        if (!format) {
+            // FIXME: auto-detection should really not be defined here
+            var s = series;
+            format = [];
+            format.push({ x: true, number: true, required: true });
+            format.push({ y: true, number: true, required: true });
+
+            if (s.bars.show || (s.lines.show && s.lines.fill)) {
+                var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
+                format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
+                if (s.bars.horizontal) {
+                    delete format[format.length - 1].y;
+                    format[format.length - 1].x = true;
+                }
+            }
+            
+            datapoints.format = format;
+        }
+
+        for (var m = 0; m < format.length; ++m) {
+            if (format[m].x && xCategories)
+                format[m].number = false;
+            
+            if (format[m].y && yCategories)
+                format[m].number = false;
+        }
+    }
+
+    function getNextIndex(categories) {
+        var index = -1;
+        
+        for (var v in categories)
+            if (categories[v] > index)
+                index = categories[v];
+
+        return index + 1;
+    }
+
+    function categoriesTickGenerator(axis) {
+        var res = [];
+        for (var label in axis.categories) {
+            var v = axis.categories[label];
+            if (v >= axis.min && v <= axis.max)
+                res.push([v, label]);
+        }
+
+        res.sort(function (a, b) { return a[0] - b[0]; });
+
+        return res;
+    }
+    
+    function setupCategoriesForAxis(series, axis, datapoints) {
+        if (series[axis].options.mode != "categories")
+            return;
+        
+        if (!series[axis].categories) {
+            // parse options
+            var c = {}, o = series[axis].options.categories || {};
+            if ($.isArray(o)) {
+                for (var i = 0; i < o.length; ++i)
+                    c[o[i]] = i;
+            }
+            else {
+                for (var v in o)
+                    c[v] = o[v];
+            }
+            
+            series[axis].categories = c;
+        }
+
+        // fix ticks
+        if (!series[axis].options.ticks)
+            series[axis].options.ticks = categoriesTickGenerator;
+
+        transformPointsOnAxis(datapoints, axis, series[axis].categories);
+    }
+    
+    function transformPointsOnAxis(datapoints, axis, categories) {
+        // go through the points, transforming them
+        var points = datapoints.points,
+            ps = datapoints.pointsize,
+            format = datapoints.format,
+            formatColumn = axis.charAt(0),
+            index = getNextIndex(categories);
+
+        for (var i = 0; i < points.length; i += ps) {
+            if (points[i] == null)
+                continue;
+            
+            for (var m = 0; m < ps; ++m) {
+                var val = points[i + m];
+
+                if (val == null || !format[m][formatColumn])
+                    continue;
+
+                if (!(val in categories)) {
+                    categories[val] = index;
+                    ++index;
+                }
+                
+                points[i + m] = categories[val];
+            }
+        }
+    }
+
+    function processDatapoints(plot, series, datapoints) {
+        setupCategoriesForAxis(series, "xaxis", datapoints);
+        setupCategoriesForAxis(series, "yaxis", datapoints);
+    }
+
+    function init(plot) {
+        plot.hooks.processRawData.push(processRawData);
+        plot.hooks.processDatapoints.push(processDatapoints);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'categories',
+        version: '1.0'
+    });
+})(jQuery);
diff --git a/qa/workunits/erasure-code/jquery.flot.js b/qa/workunits/erasure-code/jquery.flot.js
new file mode 100644
index 0000000..39f3e4c
--- /dev/null
+++ b/qa/workunits/erasure-code/jquery.flot.js
@@ -0,0 +1,3168 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+
+// first an inline dependency, jquery.colorhelpers.js, we inline it here
+// for convenience
+
+/* Plugin for jQuery for working with colors.
+ *
+ * Version 1.1.
+ *
+ * Inspiration from jQuery color animation plugin by John Resig.
+ *
+ * Released under the MIT license by Ole Laursen, October 2009.
+ *
+ * Examples:
+ *
+ *   $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString()
+ *   var c = $.color.extract($("#mydiv"), 'background-color');
+ *   console.log(c.r, c.g, c.b, c.a);
+ *   $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)"
+ *
+ * Note that .scale() and .add() return the same modified object
+ * instead of making a new one.
+ *
+ * V. 1.1: Fix error handling so e.g. parsing an empty string does
+ * produce a color rather than just crashing.
+ */
+(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>ma [...]
+
+// the actual Flot code
+(function($) {
+
+	// Cache the prototype hasOwnProperty for faster access
+
+	var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+    // A shim to provide 'detach' to jQuery versions prior to 1.4.  Using a DOM
+    // operation produces the same effect as detach, i.e. removing the element
+    // without touching its jQuery data.
+
+    // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.
+
+    if (!$.fn.detach) {
+        $.fn.detach = function() {
+            return this.each(function() {
+                if (this.parentNode) {
+                    this.parentNode.removeChild( this );
+                }
+            });
+        };
+    }
+
+	///////////////////////////////////////////////////////////////////////////
+	// The Canvas object is a wrapper around an HTML5 <canvas> tag.
+	//
+	// @constructor
+	// @param {string} cls List of classes to apply to the canvas.
+	// @param {element} container Element onto which to append the canvas.
+	//
+	// Requiring a container is a little iffy, but unfortunately canvas
+	// operations don't work unless the canvas is attached to the DOM.
+
+	function Canvas(cls, container) {
+
+		var element = container.children("." + cls)[0];
+
+		if (element == null) {
+
+			element = document.createElement("canvas");
+			element.className = cls;
+
+			$(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 })
+				.appendTo(container);
+
+			// If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas
+
+			if (!element.getContext) {
+				if (window.G_vmlCanvasManager) {
+					element = window.G_vmlCanvasManager.initElement(element);
+				} else {
+					throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.");
+				}
+			}
+		}
+
+		this.element = element;
+
+		var context = this.context = element.getContext("2d");
+
+		// Determine the screen's ratio of physical to device-independent
+		// pixels.  This is the ratio between the canvas width that the browser
+		// advertises and the number of pixels actually present in that space.
+
+		// The iPhone 4, for example, has a device-independent width of 320px,
+		// but its screen is actually 640px wide.  It therefore has a pixel
+		// ratio of 2, while most normal devices have a ratio of 1.
+
+		var devicePixelRatio = window.devicePixelRatio || 1,
+			backingStoreRatio =
+				context.webkitBackingStorePixelRatio ||
+				context.mozBackingStorePixelRatio ||
+				context.msBackingStorePixelRatio ||
+				context.oBackingStorePixelRatio ||
+				context.backingStorePixelRatio || 1;
+
+		this.pixelRatio = devicePixelRatio / backingStoreRatio;
+
+		// Size the canvas to match the internal dimensions of its container
+
+		this.resize(container.width(), container.height());
+
+		// Collection of HTML div layers for text overlaid onto the canvas
+
+		this.textContainer = null;
+		this.text = {};
+
+		// Cache of text fragments and metrics, so we can avoid expensively
+		// re-calculating them when the plot is re-rendered in a loop.
+
+		this._textCache = {};
+	}
+
+	// Resizes the canvas to the given dimensions.
+	//
+	// @param {number} width New width of the canvas, in pixels.
+	// @param {number} width New height of the canvas, in pixels.
+
+	Canvas.prototype.resize = function(width, height) {
+
+		if (width <= 0 || height <= 0) {
+			throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
+		}
+
+		var element = this.element,
+			context = this.context,
+			pixelRatio = this.pixelRatio;
+
+		// Resize the canvas, increasing its density based on the display's
+		// pixel ratio; basically giving it more pixels without increasing the
+		// size of its element, to take advantage of the fact that retina
+		// displays have that many more pixels in the same advertised space.
+
+		// Resizing should reset the state (excanvas seems to be buggy though)
+
+		if (this.width != width) {
+			element.width = width * pixelRatio;
+			element.style.width = width + "px";
+			this.width = width;
+		}
+
+		if (this.height != height) {
+			element.height = height * pixelRatio;
+			element.style.height = height + "px";
+			this.height = height;
+		}
+
+		// Save the context, so we can reset in case we get replotted.  The
+		// restore ensure that we're really back at the initial state, and
+		// should be safe even if we haven't saved the initial state yet.
+
+		context.restore();
+		context.save();
+
+		// Scale the coordinate space to match the display density; so even though we
+		// may have twice as many pixels, we still want lines and other drawing to
+		// appear at the same size; the extra pixels will just make them crisper.
+
+		context.scale(pixelRatio, pixelRatio);
+	};
+
+	// Clears the entire canvas area, not including any overlaid HTML text
+
+	Canvas.prototype.clear = function() {
+		this.context.clearRect(0, 0, this.width, this.height);
+	};
+
+	// Finishes rendering the canvas, including managing the text overlay.
+
+	Canvas.prototype.render = function() {
+
+		var cache = this._textCache;
+
+		// For each text layer, add elements marked as active that haven't
+		// already been rendered, and remove those that are no longer active.
+
+		for (var layerKey in cache) {
+			if (hasOwnProperty.call(cache, layerKey)) {
+
+				var layer = this.getTextLayer(layerKey),
+					layerCache = cache[layerKey];
+
+				layer.hide();
+
+				for (var styleKey in layerCache) {
+					if (hasOwnProperty.call(layerCache, styleKey)) {
+						var styleCache = layerCache[styleKey];
+						for (var key in styleCache) {
+							if (hasOwnProperty.call(styleCache, key)) {
+
+								var positions = styleCache[key].positions;
+
+								for (var i = 0, position; position = positions[i]; i++) {
+									if (position.active) {
+										if (!position.rendered) {
+											layer.append(position.element);
+											position.rendered = true;
+										}
+									} else {
+										positions.splice(i--, 1);
+										if (position.rendered) {
+											position.element.detach();
+										}
+									}
+								}
+
+								if (positions.length == 0) {
+									delete styleCache[key];
+								}
+							}
+						}
+					}
+				}
+
+				layer.show();
+			}
+		}
+	};
+
+	// Creates (if necessary) and returns the text overlay container.
+	//
+	// @param {string} classes String of space-separated CSS classes used to
+	//     uniquely identify the text layer.
+	// @return {object} The jQuery-wrapped text-layer div.
+
+	Canvas.prototype.getTextLayer = function(classes) {
+
+		var layer = this.text[classes];
+
+		// Create the text layer if it doesn't exist
+
+		if (layer == null) {
+
+			// Create the text layer container, if it doesn't exist
+
+			if (this.textContainer == null) {
+				this.textContainer = $("<div class='flot-text'></div>")
+					.css({
+						position: "absolute",
+						top: 0,
+						left: 0,
+						bottom: 0,
+						right: 0,
+						'font-size': "smaller",
+						color: "#545454"
+					})
+					.insertAfter(this.element);
+			}
+
+			layer = this.text[classes] = $("<div></div>")
+				.addClass(classes)
+				.css({
+					position: "absolute",
+					top: 0,
+					left: 0,
+					bottom: 0,
+					right: 0
+				})
+				.appendTo(this.textContainer);
+		}
+
+		return layer;
+	};
+
+	// Creates (if necessary) and returns a text info object.
+	//
+	// The object looks like this:
+	//
+	// {
+	//     width: Width of the text's wrapper div.
+	//     height: Height of the text's wrapper div.
+	//     element: The jQuery-wrapped HTML div containing the text.
+	//     positions: Array of positions at which this text is drawn.
+	// }
+	//
+	// The positions array contains objects that look like this:
+	//
+	// {
+	//     active: Flag indicating whether the text should be visible.
+	//     rendered: Flag indicating whether the text is currently visible.
+	//     element: The jQuery-wrapped HTML div containing the text.
+	//     x: X coordinate at which to draw the text.
+	//     y: Y coordinate at which to draw the text.
+	// }
+	//
+	// Each position after the first receives a clone of the original element.
+	//
+	// The idea is that that the width, height, and general 'identity' of the
+	// text is constant no matter where it is placed; the placements are a
+	// secondary property.
+	//
+	// Canvas maintains a cache of recently-used text info objects; getTextInfo
+	// either returns the cached element or creates a new entry.
+	//
+	// @param {string} layer A string of space-separated CSS classes uniquely
+	//     identifying the layer containing this text.
+	// @param {string} text Text string to retrieve info for.
+	// @param {(string|object)=} font Either a string of space-separated CSS
+	//     classes or a font-spec object, defining the text's font and style.
+	// @param {number=} angle Angle at which to rotate the text, in degrees.
+	//     Angle is currently unused, it will be implemented in the future.
+	// @param {number=} width Maximum width of the text before it wraps.
+	// @return {object} a text info object.
+
+	Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
+
+		var textStyle, layerCache, styleCache, info;
+
+		// Cast the value to a string, in case we were given a number or such
+
+		text = "" + text;
+
+		// If the font is a font-spec object, generate a CSS font definition
+
+		if (typeof font === "object") {
+			textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family;
+		} else {
+			textStyle = font;
+		}
+
+		// Retrieve (or create) the cache for the text's layer and styles
+
+		layerCache = this._textCache[layer];
+
+		if (layerCache == null) {
+			layerCache = this._textCache[layer] = {};
+		}
+
+		styleCache = layerCache[textStyle];
+
+		if (styleCache == null) {
+			styleCache = layerCache[textStyle] = {};
+		}
+
+		info = styleCache[text];
+
+		// If we can't find a matching element in our cache, create a new one
+
+		if (info == null) {
+
+			var element = $("<div></div>").html(text)
+				.css({
+					position: "absolute",
+					'max-width': width,
+					top: -9999
+				})
+				.appendTo(this.getTextLayer(layer));
+
+			if (typeof font === "object") {
+				element.css({
+					font: textStyle,
+					color: font.color
+				});
+			} else if (typeof font === "string") {
+				element.addClass(font);
+			}
+
+			info = styleCache[text] = {
+				width: element.outerWidth(true),
+				height: element.outerHeight(true),
+				element: element,
+				positions: []
+			};
+
+			element.detach();
+		}
+
+		return info;
+	};
+
+	// Adds a text string to the canvas text overlay.
+	//
+	// The text isn't drawn immediately; it is marked as rendering, which will
+	// result in its addition to the canvas on the next render pass.
+	//
+	// @param {string} layer A string of space-separated CSS classes uniquely
+	//     identifying the layer containing this text.
+	// @param {number} x X coordinate at which to draw the text.
+	// @param {number} y Y coordinate at which to draw the text.
+	// @param {string} text Text string to draw.
+	// @param {(string|object)=} font Either a string of space-separated CSS
+	//     classes or a font-spec object, defining the text's font and style.
+	// @param {number=} angle Angle at which to rotate the text, in degrees.
+	//     Angle is currently unused, it will be implemented in the future.
+	// @param {number=} width Maximum width of the text before it wraps.
+	// @param {string=} halign Horizontal alignment of the text; either "left",
+	//     "center" or "right".
+	// @param {string=} valign Vertical alignment of the text; either "top",
+	//     "middle" or "bottom".
+
+	Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
+
+		var info = this.getTextInfo(layer, text, font, angle, width),
+			positions = info.positions;
+
+		// Tweak the div's position to match the text's alignment
+
+		if (halign == "center") {
+			x -= info.width / 2;
+		} else if (halign == "right") {
+			x -= info.width;
+		}
+
+		if (valign == "middle") {
+			y -= info.height / 2;
+		} else if (valign == "bottom") {
+			y -= info.height;
+		}
+
+		// Determine whether this text already exists at this position.
+		// If so, mark it for inclusion in the next render pass.
+
+		for (var i = 0, position; position = positions[i]; i++) {
+			if (position.x == x && position.y == y) {
+				position.active = true;
+				return;
+			}
+		}
+
+		// If the text doesn't exist at this position, create a new entry
+
+		// For the very first position we'll re-use the original element,
+		// while for subsequent ones we'll clone it.
+
+		position = {
+			active: true,
+			rendered: false,
+			element: positions.length ? info.element.clone() : info.element,
+			x: x,
+			y: y
+		};
+
+		positions.push(position);
+
+		// Move the element to its final position within the container
+
+		position.element.css({
+			top: Math.round(y),
+			left: Math.round(x),
+			'text-align': halign	// In case the text wraps
+		});
+	};
+
+	// Removes one or more text strings from the canvas text overlay.
+	//
+	// If no parameters are given, all text within the layer is removed.
+	//
+	// Note that the text is not immediately removed; it is simply marked as
+	// inactive, which will result in its removal on the next render pass.
+	// This avoids the performance penalty for 'clear and redraw' behavior,
+	// where we potentially get rid of all text on a layer, but will likely
+	// add back most or all of it later, as when redrawing axes, for example.
+	//
+	// @param {string} layer A string of space-separated CSS classes uniquely
+	//     identifying the layer containing this text.
+	// @param {number=} x X coordinate of the text.
+	// @param {number=} y Y coordinate of the text.
+	// @param {string=} text Text string to remove.
+	// @param {(string|object)=} font Either a string of space-separated CSS
+	//     classes or a font-spec object, defining the text's font and style.
+	// @param {number=} angle Angle at which the text is rotated, in degrees.
+	//     Angle is currently unused, it will be implemented in the future.
+
+	Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
+		if (text == null) {
+			var layerCache = this._textCache[layer];
+			if (layerCache != null) {
+				for (var styleKey in layerCache) {
+					if (hasOwnProperty.call(layerCache, styleKey)) {
+						var styleCache = layerCache[styleKey];
+						for (var key in styleCache) {
+							if (hasOwnProperty.call(styleCache, key)) {
+								var positions = styleCache[key].positions;
+								for (var i = 0, position; position = positions[i]; i++) {
+									position.active = false;
+								}
+							}
+						}
+					}
+				}
+			}
+		} else {
+			var positions = this.getTextInfo(layer, text, font, angle).positions;
+			for (var i = 0, position; position = positions[i]; i++) {
+				if (position.x == x && position.y == y) {
+					position.active = false;
+				}
+			}
+		}
+	};
+
+	///////////////////////////////////////////////////////////////////////////
+	// The top-level container for the entire plot.
+
+    function Plot(placeholder, data_, options_, plugins) {
+        // data is on the form:
+        //   [ series1, series2 ... ]
+        // where series is either just the data as [ [x1, y1], [x2, y2], ... ]
+        // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... }
+
+        var series = [],
+            options = {
+                // the color theme used for graphs
+                colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"],
+                legend: {
+                    show: true,
+                    noColumns: 1, // number of colums in legend table
+                    labelFormatter: null, // fn: string -> string
+                    labelBoxBorderColor: "#ccc", // border color for the little label boxes
+                    container: null, // container (as jQuery object) to put legend in, null means default on top of graph
+                    position: "ne", // position of default legend container within plot
+                    margin: 5, // distance from grid edge to default legend container within plot
+                    backgroundColor: null, // null means auto-detect
+                    backgroundOpacity: 0.85, // set to 0 to avoid background
+                    sorted: null    // default to no legend sorting
+                },
+                xaxis: {
+                    show: null, // null = auto-detect, true = always, false = never
+                    position: "bottom", // or "top"
+                    mode: null, // null or "time"
+                    font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" }
+                    color: null, // base color, labels, ticks
+                    tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)"
+                    transform: null, // null or f: number -> number to transform axis
+                    inverseTransform: null, // if transform is set, this should be the inverse function
+                    min: null, // min. value to show, null means set automatically
+                    max: null, // max. value to show, null means set automatically
+                    autoscaleMargin: null, // margin in % to add if auto-setting min/max
+                    ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks
+                    tickFormatter: null, // fn: number -> string
+                    labelWidth: null, // size of tick labels in pixels
+                    labelHeight: null,
+                    reserveSpace: null, // whether to reserve space even if axis isn't shown
+                    tickLength: null, // size in pixels of ticks, or "full" for whole line
+                    alignTicksWithAxis: null, // axis number or null for no sync
+                    tickDecimals: null, // no. of decimals, null means auto
+                    tickSize: null, // number or [number, "unit"]
+                    minTickSize: null // number or [number, "unit"]
+                },
+                yaxis: {
+                    autoscaleMargin: 0.02,
+                    position: "left" // or "right"
+                },
+                xaxes: [],
+                yaxes: [],
+                series: {
+                    points: {
+                        show: false,
+                        radius: 3,
+                        lineWidth: 2, // in pixels
+                        fill: true,
+                        fillColor: "#ffffff",
+                        symbol: "circle" // or callback
+                    },
+                    lines: {
+                        // we don't put in show: false so we can see
+                        // whether lines were actively disabled
+                        lineWidth: 2, // in pixels
+                        fill: false,
+                        fillColor: null,
+                        steps: false
+                        // Omit 'zero', so we can later default its value to
+                        // match that of the 'fill' option.
+                    },
+                    bars: {
+                        show: false,
+                        lineWidth: 2, // in pixels
+                        barWidth: 1, // in units of the x axis
+                        fill: true,
+                        fillColor: null,
+                        align: "left", // "left", "right", or "center"
+                        horizontal: false,
+                        zero: true
+                    },
+                    shadowSize: 3,
+                    highlightColor: null
+                },
+                grid: {
+                    show: true,
+                    aboveData: false,
+                    color: "#545454", // primary color used for outline and labels
+                    backgroundColor: null, // null for transparent, else color
+                    borderColor: null, // set if different from the grid color
+                    tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)"
+                    margin: 0, // distance from the canvas edge to the grid
+                    labelMargin: 5, // in pixels
+                    axisMargin: 8, // in pixels
+                    borderWidth: 2, // in pixels
+                    minBorderMargin: null, // in pixels, null means taken from points radius
+                    markings: null, // array of ranges or fn: axes -> array of ranges
+                    markingsColor: "#f4f4f4",
+                    markingsLineWidth: 2,
+                    // interactive stuff
+                    clickable: false,
+                    hoverable: false,
+                    autoHighlight: true, // highlight in case mouse is near
+                    mouseActiveRadius: 10 // how far the mouse can be away to activate an item
+                },
+                interaction: {
+                    redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
+                },
+                hooks: {}
+            },
+        surface = null,     // the canvas for the plot itself
+        overlay = null,     // canvas for interactive stuff on top of plot
+        eventHolder = null, // jQuery object that events should be bound to
+        ctx = null, octx = null,
+        xaxes = [], yaxes = [],
+        plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
+        plotWidth = 0, plotHeight = 0,
+        hooks = {
+            processOptions: [],
+            processRawData: [],
+            processDatapoints: [],
+            processOffset: [],
+            drawBackground: [],
+            drawSeries: [],
+            draw: [],
+            bindEvents: [],
+            drawOverlay: [],
+            shutdown: []
+        },
+        plot = this;
+
+        // public functions
+        plot.setData = setData;
+        plot.setupGrid = setupGrid;
+        plot.draw = draw;
+        plot.getPlaceholder = function() { return placeholder; };
+        plot.getCanvas = function() { return surface.element; };
+        plot.getPlotOffset = function() { return plotOffset; };
+        plot.width = function () { return plotWidth; };
+        plot.height = function () { return plotHeight; };
+        plot.offset = function () {
+            var o = eventHolder.offset();
+            o.left += plotOffset.left;
+            o.top += plotOffset.top;
+            return o;
+        };
+        plot.getData = function () { return series; };
+        plot.getAxes = function () {
+            var res = {}, i;
+            $.each(xaxes.concat(yaxes), function (_, axis) {
+                if (axis)
+                    res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis;
+            });
+            return res;
+        };
+        plot.getXAxes = function () { return xaxes; };
+        plot.getYAxes = function () { return yaxes; };
+        plot.c2p = canvasToAxisCoords;
+        plot.p2c = axisToCanvasCoords;
+        plot.getOptions = function () { return options; };
+        plot.highlight = highlight;
+        plot.unhighlight = unhighlight;
+        plot.triggerRedrawOverlay = triggerRedrawOverlay;
+        plot.pointOffset = function(point) {
+            return {
+                left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
+                top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
+            };
+        };
+        plot.shutdown = shutdown;
+        plot.destroy = function () {
+            shutdown();
+            placeholder.removeData("plot").empty();
+
+            series = [];
+            options = null;
+            surface = null;
+            overlay = null;
+            eventHolder = null;
+            ctx = null;
+            octx = null;
+            xaxes = [];
+            yaxes = [];
+            hooks = null;
+            highlights = [];
+            plot = null;
+        };
+        plot.resize = function () {
+        	var width = placeholder.width(),
+        		height = placeholder.height();
+            surface.resize(width, height);
+            overlay.resize(width, height);
+        };
+
+        // public attributes
+        plot.hooks = hooks;
+
+        // initialize
+        initPlugins(plot);
+        parseOptions(options_);
+        setupCanvases();
+        setData(data_);
+        setupGrid();
+        draw();
+        bindEvents();
+
+
+        function executeHooks(hook, args) {
+            args = [plot].concat(args);
+            for (var i = 0; i < hook.length; ++i)
+                hook[i].apply(this, args);
+        }
+
+        function initPlugins() {
+
+            // References to key classes, allowing plugins to modify them
+
+            var classes = {
+                Canvas: Canvas
+            };
+
+            for (var i = 0; i < plugins.length; ++i) {
+                var p = plugins[i];
+                p.init(plot, classes);
+                if (p.options)
+                    $.extend(true, options, p.options);
+            }
+        }
+
+        function parseOptions(opts) {
+
+            $.extend(true, options, opts);
+
+            // $.extend merges arrays, rather than replacing them.  When less
+            // colors are provided than the size of the default palette, we
+            // end up with those colors plus the remaining defaults, which is
+            // not expected behavior; avoid it by replacing them here.
+
+            if (opts && opts.colors) {
+            	options.colors = opts.colors;
+            }
+
+            if (options.xaxis.color == null)
+                options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
+            if (options.yaxis.color == null)
+                options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString();
+
+            if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility
+                options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color;
+            if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility
+                options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color;
+
+            if (options.grid.borderColor == null)
+                options.grid.borderColor = options.grid.color;
+            if (options.grid.tickColor == null)
+                options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString();
+
+            // Fill in defaults for axis options, including any unspecified
+            // font-spec fields, if a font-spec was provided.
+
+            // If no x/y axis options were provided, create one of each anyway,
+            // since the rest of the code assumes that they exist.
+
+            var i, axisOptions, axisCount,
+                fontSize = placeholder.css("font-size"),
+                fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13,
+                fontDefaults = {
+                    style: placeholder.css("font-style"),
+                    size: Math.round(0.8 * fontSizeDefault),
+                    variant: placeholder.css("font-variant"),
+                    weight: placeholder.css("font-weight"),
+                    family: placeholder.css("font-family")
+                };
+
+            axisCount = options.xaxes.length || 1;
+            for (i = 0; i < axisCount; ++i) {
+
+                axisOptions = options.xaxes[i];
+                if (axisOptions && !axisOptions.tickColor) {
+                    axisOptions.tickColor = axisOptions.color;
+                }
+
+                axisOptions = $.extend(true, {}, options.xaxis, axisOptions);
+                options.xaxes[i] = axisOptions;
+
+                if (axisOptions.font) {
+                    axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
+                    if (!axisOptions.font.color) {
+                        axisOptions.font.color = axisOptions.color;
+                    }
+                    if (!axisOptions.font.lineHeight) {
+                        axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
+                    }
+                }
+            }
+
+            axisCount = options.yaxes.length || 1;
+            for (i = 0; i < axisCount; ++i) {
+
+                axisOptions = options.yaxes[i];
+                if (axisOptions && !axisOptions.tickColor) {
+                    axisOptions.tickColor = axisOptions.color;
+                }
+
+                axisOptions = $.extend(true, {}, options.yaxis, axisOptions);
+                options.yaxes[i] = axisOptions;
+
+                if (axisOptions.font) {
+                    axisOptions.font = $.extend({}, fontDefaults, axisOptions.font);
+                    if (!axisOptions.font.color) {
+                        axisOptions.font.color = axisOptions.color;
+                    }
+                    if (!axisOptions.font.lineHeight) {
+                        axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15);
+                    }
+                }
+            }
+
+            // backwards compatibility, to be removed in future
+            if (options.xaxis.noTicks && options.xaxis.ticks == null)
+                options.xaxis.ticks = options.xaxis.noTicks;
+            if (options.yaxis.noTicks && options.yaxis.ticks == null)
+                options.yaxis.ticks = options.yaxis.noTicks;
+            if (options.x2axis) {
+                options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis);
+                options.xaxes[1].position = "top";
+                // Override the inherit to allow the axis to auto-scale
+                if (options.x2axis.min == null) {
+                    options.xaxes[1].min = null;
+                }
+                if (options.x2axis.max == null) {
+                    options.xaxes[1].max = null;
+                }
+            }
+            if (options.y2axis) {
+                options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis);
+                options.yaxes[1].position = "right";
+                // Override the inherit to allow the axis to auto-scale
+                if (options.y2axis.min == null) {
+                    options.yaxes[1].min = null;
+                }
+                if (options.y2axis.max == null) {
+                    options.yaxes[1].max = null;
+                }
+            }
+            if (options.grid.coloredAreas)
+                options.grid.markings = options.grid.coloredAreas;
+            if (options.grid.coloredAreasColor)
+                options.grid.markingsColor = options.grid.coloredAreasColor;
+            if (options.lines)
+                $.extend(true, options.series.lines, options.lines);
+            if (options.points)
+                $.extend(true, options.series.points, options.points);
+            if (options.bars)
+                $.extend(true, options.series.bars, options.bars);
+            if (options.shadowSize != null)
+                options.series.shadowSize = options.shadowSize;
+            if (options.highlightColor != null)
+                options.series.highlightColor = options.highlightColor;
+
+            // save options on axes for future reference
+            for (i = 0; i < options.xaxes.length; ++i)
+                getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i];
+            for (i = 0; i < options.yaxes.length; ++i)
+                getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i];
+
+            // add hooks from options
+            for (var n in hooks)
+                if (options.hooks[n] && options.hooks[n].length)
+                    hooks[n] = hooks[n].concat(options.hooks[n]);
+
+            executeHooks(hooks.processOptions, [options]);
+        }
+
+        function setData(d) {
+            series = parseData(d);
+            fillInSeriesOptions();
+            processData();
+        }
+
+        function parseData(d) {
+            var res = [];
+            for (var i = 0; i < d.length; ++i) {
+                var s = $.extend(true, {}, options.series);
+
+                if (d[i].data != null) {
+                    s.data = d[i].data; // move the data instead of deep-copy
+                    delete d[i].data;
+
+                    $.extend(true, s, d[i]);
+
+                    d[i].data = s.data;
+                }
+                else
+                    s.data = d[i];
+                res.push(s);
+            }
+
+            return res;
+        }
+
+        function axisNumber(obj, coord) {
+            var a = obj[coord + "axis"];
+            if (typeof a == "object") // if we got a real axis, extract number
+                a = a.n;
+            if (typeof a != "number")
+                a = 1; // default to first axis
+            return a;
+        }
+
+        function allAxes() {
+            // return flat array without annoying null entries
+            return $.grep(xaxes.concat(yaxes), function (a) { return a; });
+        }
+
+        function canvasToAxisCoords(pos) {
+            // return an object with x/y corresponding to all used axes
+            var res = {}, i, axis;
+            for (i = 0; i < xaxes.length; ++i) {
+                axis = xaxes[i];
+                if (axis && axis.used)
+                    res["x" + axis.n] = axis.c2p(pos.left);
+            }
+
+            for (i = 0; i < yaxes.length; ++i) {
+                axis = yaxes[i];
+                if (axis && axis.used)
+                    res["y" + axis.n] = axis.c2p(pos.top);
+            }
+
+            if (res.x1 !== undefined)
+                res.x = res.x1;
+            if (res.y1 !== undefined)
+                res.y = res.y1;
+
+            return res;
+        }
+
+        function axisToCanvasCoords(pos) {
+            // get canvas coords from the first pair of x/y found in pos
+            var res = {}, i, axis, key;
+
+            for (i = 0; i < xaxes.length; ++i) {
+                axis = xaxes[i];
+                if (axis && axis.used) {
+                    key = "x" + axis.n;
+                    if (pos[key] == null && axis.n == 1)
+                        key = "x";
+
+                    if (pos[key] != null) {
+                        res.left = axis.p2c(pos[key]);
+                        break;
+                    }
+                }
+            }
+
+            for (i = 0; i < yaxes.length; ++i) {
+                axis = yaxes[i];
+                if (axis && axis.used) {
+                    key = "y" + axis.n;
+                    if (pos[key] == null && axis.n == 1)
+                        key = "y";
+
+                    if (pos[key] != null) {
+                        res.top = axis.p2c(pos[key]);
+                        break;
+                    }
+                }
+            }
+
+            return res;
+        }
+
+        function getOrCreateAxis(axes, number) {
+            if (!axes[number - 1])
+                axes[number - 1] = {
+                    n: number, // save the number for future reference
+                    direction: axes == xaxes ? "x" : "y",
+                    options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis)
+                };
+
+            return axes[number - 1];
+        }
+
+        function fillInSeriesOptions() {
+
+            var neededColors = series.length, maxIndex = -1, i;
+
+            // Subtract the number of series that already have fixed colors or
+            // color indexes from the number that we still need to generate.
+
+            for (i = 0; i < series.length; ++i) {
+                var sc = series[i].color;
+                if (sc != null) {
+                    neededColors--;
+                    if (typeof sc == "number" && sc > maxIndex) {
+                        maxIndex = sc;
+                    }
+                }
+            }
+
+            // If any of the series have fixed color indexes, then we need to
+            // generate at least as many colors as the highest index.
+
+            if (neededColors <= maxIndex) {
+                neededColors = maxIndex + 1;
+            }
+
+            // Generate all the colors, using first the option colors and then
+            // variations on those colors once they're exhausted.
+
+            var c, colors = [], colorPool = options.colors,
+                colorPoolSize = colorPool.length, variation = 0;
+
+            for (i = 0; i < neededColors; i++) {
+
+                c = $.color.parse(colorPool[i % colorPoolSize] || "#666");
+
+                // Each time we exhaust the colors in the pool we adjust
+                // a scaling factor used to produce more variations on
+                // those colors. The factor alternates negative/positive
+                // to produce lighter/darker colors.
+
+                // Reset the variation after every few cycles, or else
+                // it will end up producing only white or black colors.
+
+                if (i % colorPoolSize == 0 && i) {
+                    if (variation >= 0) {
+                        if (variation < 0.5) {
+                            variation = -variation - 0.2;
+                        } else variation = 0;
+                    } else variation = -variation;
+                }
+
+                colors[i] = c.scale('rgb', 1 + variation);
+            }
+
+            // Finalize the series options, filling in their colors
+
+            var colori = 0, s;
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                // assign colors
+                if (s.color == null) {
+                    s.color = colors[colori].toString();
+                    ++colori;
+                }
+                else if (typeof s.color == "number")
+                    s.color = colors[s.color].toString();
+
+                // turn on lines automatically in case nothing is set
+                if (s.lines.show == null) {
+                    var v, show = true;
+                    for (v in s)
+                        if (s[v] && s[v].show) {
+                            show = false;
+                            break;
+                        }
+                    if (show)
+                        s.lines.show = true;
+                }
+
+                // If nothing was provided for lines.zero, default it to match
+                // lines.fill, since areas by default should extend to zero.
+
+                if (s.lines.zero == null) {
+                    s.lines.zero = !!s.lines.fill;
+                }
+
+                // setup axes
+                s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x"));
+                s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y"));
+            }
+        }
+
+        function processData() {
+            var topSentry = Number.POSITIVE_INFINITY,
+                bottomSentry = Number.NEGATIVE_INFINITY,
+                fakeInfinity = Number.MAX_VALUE,
+                i, j, k, m, length,
+                s, points, ps, x, y, axis, val, f, p,
+                data, format;
+
+            function updateAxis(axis, min, max) {
+                if (min < axis.datamin && min != -fakeInfinity)
+                    axis.datamin = min;
+                if (max > axis.datamax && max != fakeInfinity)
+                    axis.datamax = max;
+            }
+
+            $.each(allAxes(), function (_, axis) {
+                // init axis
+                axis.datamin = topSentry;
+                axis.datamax = bottomSentry;
+                axis.used = false;
+            });
+
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                s.datapoints = { points: [] };
+
+                executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
+            }
+
+            // first pass: clean and copy data
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                data = s.data;
+                format = s.datapoints.format;
+
+                if (!format) {
+                    format = [];
+                    // find out how to copy
+                    format.push({ x: true, number: true, required: true });
+                    format.push({ y: true, number: true, required: true });
+
+                    if (s.bars.show || (s.lines.show && s.lines.fill)) {
+                        var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero));
+                        format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale });
+                        if (s.bars.horizontal) {
+                            delete format[format.length - 1].y;
+                            format[format.length - 1].x = true;
+                        }
+                    }
+
+                    s.datapoints.format = format;
+                }
+
+                if (s.datapoints.pointsize != null)
+                    continue; // already filled in
+
+                s.datapoints.pointsize = format.length;
+
+                ps = s.datapoints.pointsize;
+                points = s.datapoints.points;
+
+                var insertSteps = s.lines.show && s.lines.steps;
+                s.xaxis.used = s.yaxis.used = true;
+
+                for (j = k = 0; j < data.length; ++j, k += ps) {
+                    p = data[j];
+
+                    var nullify = p == null;
+                    if (!nullify) {
+                        for (m = 0; m < ps; ++m) {
+                            val = p[m];
+                            f = format[m];
+
+                            if (f) {
+                                if (f.number && val != null) {
+                                    val = +val; // convert to number
+                                    if (isNaN(val))
+                                        val = null;
+                                    else if (val == Infinity)
+                                        val = fakeInfinity;
+                                    else if (val == -Infinity)
+                                        val = -fakeInfinity;
+                                }
+
+                                if (val == null) {
+                                    if (f.required)
+                                        nullify = true;
+
+                                    if (f.defaultValue != null)
+                                        val = f.defaultValue;
+                                }
+                            }
+
+                            points[k + m] = val;
+                        }
+                    }
+
+                    if (nullify) {
+                        for (m = 0; m < ps; ++m) {
+                            val = points[k + m];
+                            if (val != null) {
+                                f = format[m];
+                                // extract min/max info
+                                if (f.autoscale !== false) {
+                                    if (f.x) {
+                                        updateAxis(s.xaxis, val, val);
+                                    }
+                                    if (f.y) {
+                                        updateAxis(s.yaxis, val, val);
+                                    }
+                                }
+                            }
+                            points[k + m] = null;
+                        }
+                    }
+                    else {
+                        // a little bit of line specific stuff that
+                        // perhaps shouldn't be here, but lacking
+                        // better means...
+                        if (insertSteps && k > 0
+                            && points[k - ps] != null
+                            && points[k - ps] != points[k]
+                            && points[k - ps + 1] != points[k + 1]) {
+                            // copy the point to make room for a middle point
+                            for (m = 0; m < ps; ++m)
+                                points[k + ps + m] = points[k + m];
+
+                            // middle point has same y
+                            points[k + 1] = points[k - ps + 1];
+
+                            // we've added a point, better reflect that
+                            k += ps;
+                        }
+                    }
+                }
+            }
+
+            // give the hooks a chance to run
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+
+                executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
+            }
+
+            // second pass: find datamax/datamin for auto-scaling
+            for (i = 0; i < series.length; ++i) {
+                s = series[i];
+                points = s.datapoints.points;
+                ps = s.datapoints.pointsize;
+                format = s.datapoints.format;
+
+                var xmin = topSentry, ymin = topSentry,
+                    xmax = bottomSentry, ymax = bottomSentry;
+
+                for (j = 0; j < points.length; j += ps) {
+                    if (points[j] == null)
+                        continue;
+
+                    for (m = 0; m < ps; ++m) {
+                        val = points[j + m];
+                        f = format[m];
+                        if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity)
+                            continue;
+
+                        if (f.x) {
+                            if (val < xmin)
+                                xmin = val;
+                            if (val > xmax)
+                                xmax = val;
+                        }
+                        if (f.y) {
+                            if (val < ymin)
+                                ymin = val;
+                            if (val > ymax)
+                                ymax = val;
+                        }
+                    }
+                }
+
+                if (s.bars.show) {
+                    // make sure we got room for the bar on the dancing floor
+                    var delta;
+
+                    switch (s.bars.align) {
+                        case "left":
+                            delta = 0;
+                            break;
+                        case "right":
+                            delta = -s.bars.barWidth;
+                            break;
+                        default:
+                            delta = -s.bars.barWidth / 2;
+                    }
+
+                    if (s.bars.horizontal) {
+                        ymin += delta;
+                        ymax += delta + s.bars.barWidth;
+                    }
+                    else {
+                        xmin += delta;
+                        xmax += delta + s.bars.barWidth;
+                    }
+                }
+
+                updateAxis(s.xaxis, xmin, xmax);
+                updateAxis(s.yaxis, ymin, ymax);
+            }
+
+            $.each(allAxes(), function (_, axis) {
+                if (axis.datamin == topSentry)
+                    axis.datamin = null;
+                if (axis.datamax == bottomSentry)
+                    axis.datamax = null;
+            });
+        }
+
+        function setupCanvases() {
+
+            // Make sure the placeholder is clear of everything except canvases
+            // from a previous plot in this container that we'll try to re-use.
+
+            placeholder.css("padding", 0) // padding messes up the positioning
+                .children().filter(function(){
+                    return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
+                }).remove();
+
+            if (placeholder.css("position") == 'static')
+                placeholder.css("position", "relative"); // for positioning labels and overlay
+
+            surface = new Canvas("flot-base", placeholder);
+            overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features
+
+            ctx = surface.context;
+            octx = overlay.context;
+
+            // define which element we're listening for events on
+            eventHolder = $(overlay.element).unbind();
+
+            // If we're re-using a plot object, shut down the old one
+
+            var existing = placeholder.data("plot");
+
+            if (existing) {
+                existing.shutdown();
+                overlay.clear();
+            }
+
+            // save in case we get replotted
+            placeholder.data("plot", plot);
+        }
+
+        function bindEvents() {
+            // bind events
+            if (options.grid.hoverable) {
+                eventHolder.mousemove(onMouseMove);
+
+                // Use bind, rather than .mouseleave, because we officially
+                // still support jQuery 1.2.6, which doesn't define a shortcut
+                // for mouseenter or mouseleave.  This was a bug/oversight that
+                // was fixed somewhere around 1.3.x.  We can return to using
+                // .mouseleave when we drop support for 1.2.6.
+
+                eventHolder.bind("mouseleave", onMouseLeave);
+            }
+
+            if (options.grid.clickable)
+                eventHolder.click(onClick);
+
+            executeHooks(hooks.bindEvents, [eventHolder]);
+        }
+
+        function shutdown() {
+            if (redrawTimeout)
+                clearTimeout(redrawTimeout);
+
+            eventHolder.unbind("mousemove", onMouseMove);
+            eventHolder.unbind("mouseleave", onMouseLeave);
+            eventHolder.unbind("click", onClick);
+
+            executeHooks(hooks.shutdown, [eventHolder]);
+        }
+
+        function setTransformationHelpers(axis) {
+            // set helper functions on the axis, assumes plot area
+            // has been computed already
+
+            function identity(x) { return x; }
+
+            var s, m, t = axis.options.transform || identity,
+                it = axis.options.inverseTransform;
+
+            // precompute how much the axis is scaling a point
+            // in canvas space
+            if (axis.direction == "x") {
+                s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min));
+                m = Math.min(t(axis.max), t(axis.min));
+            }
+            else {
+                s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min));
+                s = -s;
+                m = Math.max(t(axis.max), t(axis.min));
+            }
+
+            // data point to canvas coordinate
+            if (t == identity) // slight optimization
+                axis.p2c = function (p) { return (p - m) * s; };
+            else
+                axis.p2c = function (p) { return (t(p) - m) * s; };
+            // canvas coordinate to data point
+            if (!it)
+                axis.c2p = function (c) { return m + c / s; };
+            else
+                axis.c2p = function (c) { return it(m + c / s); };
+        }
+
+        function measureTickLabels(axis) {
+
+            var opts = axis.options,
+                ticks = axis.ticks || [],
+                labelWidth = opts.labelWidth || 0,
+                labelHeight = opts.labelHeight || 0,
+                maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null),
+                legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
+                layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
+                font = opts.font || "flot-tick-label tickLabel";
+
+            for (var i = 0; i < ticks.length; ++i) {
+
+                var t = ticks[i];
+
+                if (!t.label)
+                    continue;
+
+                var info = surface.getTextInfo(layer, t.label, font, null, maxWidth);
+
+                labelWidth = Math.max(labelWidth, info.width);
+                labelHeight = Math.max(labelHeight, info.height);
+            }
+
+            axis.labelWidth = opts.labelWidth || labelWidth;
+            axis.labelHeight = opts.labelHeight || labelHeight;
+        }
+
+        function allocateAxisBoxFirstPhase(axis) {
+            // find the bounding box of the axis by looking at label
+            // widths/heights and ticks, make room by diminishing the
+            // plotOffset; this first phase only looks at one
+            // dimension per axis, the other dimension depends on the
+            // other axes so will have to wait
+
+            var lw = axis.labelWidth,
+                lh = axis.labelHeight,
+                pos = axis.options.position,
+                isXAxis = axis.direction === "x",
+                tickLength = axis.options.tickLength,
+                axisMargin = options.grid.axisMargin,
+                padding = options.grid.labelMargin,
+                innermost = true,
+                outermost = true,
+                first = true,
+                found = false;
+
+            // Determine the axis's position in its direction and on its side
+
+            $.each(isXAxis ? xaxes : yaxes, function(i, a) {
+                if (a && (a.show || a.reserveSpace)) {
+                    if (a === axis) {
+                        found = true;
+                    } else if (a.options.position === pos) {
+                        if (found) {
+                            outermost = false;
+                        } else {
+                            innermost = false;
+                        }
+                    }
+                    if (!found) {
+                        first = false;
+                    }
+                }
+            });
+
+            // The outermost axis on each side has no margin
+
+            if (outermost) {
+                axisMargin = 0;
+            }
+
+            // The ticks for the first axis in each direction stretch across
+
+            if (tickLength == null) {
+                tickLength = first ? "full" : 5;
+            }
+
+            if (!isNaN(+tickLength))
+                padding += +tickLength;
+
+            if (isXAxis) {
+                lh += padding;
+
+                if (pos == "bottom") {
+                    plotOffset.bottom += lh + axisMargin;
+                    axis.box = { top: surface.height - plotOffset.bottom, height: lh };
+                }
+                else {
+                    axis.box = { top: plotOffset.top + axisMargin, height: lh };
+                    plotOffset.top += lh + axisMargin;
+                }
+            }
+            else {
+                lw += padding;
+
+                if (pos == "left") {
+                    axis.box = { left: plotOffset.left + axisMargin, width: lw };
+                    plotOffset.left += lw + axisMargin;
+                }
+                else {
+                    plotOffset.right += lw + axisMargin;
+                    axis.box = { left: surface.width - plotOffset.right, width: lw };
+                }
+            }
+
+             // save for future reference
+            axis.position = pos;
+            axis.tickLength = tickLength;
+            axis.box.padding = padding;
+            axis.innermost = innermost;
+        }
+
+        function allocateAxisBoxSecondPhase(axis) {
+            // now that all axis boxes have been placed in one
+            // dimension, we can set the remaining dimension coordinates
+            if (axis.direction == "x") {
+                axis.box.left = plotOffset.left - axis.labelWidth / 2;
+                axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth;
+            }
+            else {
+                axis.box.top = plotOffset.top - axis.labelHeight / 2;
+                axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight;
+            }
+        }
+
+        function adjustLayoutForThingsStickingOut() {
+            // possibly adjust plot offset to ensure everything stays
+            // inside the canvas and isn't clipped off
+
+            var minMargin = options.grid.minBorderMargin,
+                axis, i;
+
+            // check stuff from the plot (FIXME: this should just read
+            // a value from the series, otherwise it's impossible to
+            // customize)
+            if (minMargin == null) {
+                minMargin = 0;
+                for (i = 0; i < series.length; ++i)
+                    minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
+            }
+
+            var margins = {
+                left: minMargin,
+                right: minMargin,
+                top: minMargin,
+                bottom: minMargin
+            };
+
+            // check axis labels, note we don't check the actual
+            // labels but instead use the overall width/height to not
+            // jump as much around with replots
+            $.each(allAxes(), function (_, axis) {
+                if (axis.reserveSpace && axis.ticks && axis.ticks.length) {
+                    if (axis.direction === "x") {
+                        margins.left = Math.max(margins.left, axis.labelWidth / 2);
+                        margins.right = Math.max(margins.right, axis.labelWidth / 2);
+                    } else {
+                        margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2);
+                        margins.top = Math.max(margins.top, axis.labelHeight / 2);
+                    }
+                }
+            });
+
+            plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left));
+            plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right));
+            plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top));
+            plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom));
+        }
+
+        function setupGrid() {
+            var i, axes = allAxes(), showGrid = options.grid.show;
+
+            // Initialize the plot's offset from the edge of the canvas
+
+            for (var a in plotOffset) {
+                var margin = options.grid.margin || 0;
+                plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0;
+            }
+
+            executeHooks(hooks.processOffset, [plotOffset]);
+
+            // If the grid is visible, add its border width to the offset
+
+            for (var a in plotOffset) {
+                if(typeof(options.grid.borderWidth) == "object") {
+                    plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
+                }
+                else {
+                    plotOffset[a] += showGrid ? options.grid.borderWidth : 0;
+                }
+            }
+
+            $.each(axes, function (_, axis) {
+                var axisOpts = axis.options;
+                axis.show = axisOpts.show == null ? axis.used : axisOpts.show;
+                axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace;
+                setRange(axis);
+            });
+
+            if (showGrid) {
+
+                var allocatedAxes = $.grep(axes, function (axis) {
+                    return axis.show || axis.reserveSpace;
+                });
+
+                $.each(allocatedAxes, function (_, axis) {
+                    // make the ticks
+                    setupTickGeneration(axis);
+                    setTicks(axis);
+                    snapRangeToTicks(axis, axis.ticks);
+                    // find labelWidth/Height for axis
+                    measureTickLabels(axis);
+                });
+
+                // with all dimensions calculated, we can compute the
+                // axis bounding boxes, start from the outside
+                // (reverse order)
+                for (i = allocatedAxes.length - 1; i >= 0; --i)
+                    allocateAxisBoxFirstPhase(allocatedAxes[i]);
+
+                // make sure we've got enough space for things that
+                // might stick out
+                adjustLayoutForThingsStickingOut();
+
+                $.each(allocatedAxes, function (_, axis) {
+                    allocateAxisBoxSecondPhase(axis);
+                });
+            }
+
+            plotWidth = surface.width - plotOffset.left - plotOffset.right;
+            plotHeight = surface.height - plotOffset.bottom - plotOffset.top;
+
+            // now we got the proper plot dimensions, we can compute the scaling
+            $.each(axes, function (_, axis) {
+                setTransformationHelpers(axis);
+            });
+
+            if (showGrid) {
+                drawAxisLabels();
+            }
+
+            insertLegend();
+        }
+
+        function setRange(axis) {
+            var opts = axis.options,
+                min = +(opts.min != null ? opts.min : axis.datamin),
+                max = +(opts.max != null ? opts.max : axis.datamax),
+                delta = max - min;
+
+            if (delta == 0.0) {
+                // degenerate case
+                var widen = max == 0 ? 1 : 0.01;
+
+                if (opts.min == null)
+                    min -= widen;
+                // always widen max if we couldn't widen min to ensure we
+                // don't fall into min == max which doesn't work
+                if (opts.max == null || opts.min != null)
+                    max += widen;
+            }
+            else {
+                // consider autoscaling
+                var margin = opts.autoscaleMargin;
+                if (margin != null) {
+                    if (opts.min == null) {
+                        min -= delta * margin;
+                        // make sure we don't go below zero if all values
+                        // are positive
+                        if (min < 0 && axis.datamin != null && axis.datamin >= 0)
+                            min = 0;
+                    }
+                    if (opts.max == null) {
+                        max += delta * margin;
+                        if (max > 0 && axis.datamax != null && axis.datamax <= 0)
+                            max = 0;
+                    }
+                }
+            }
+            axis.min = min;
+            axis.max = max;
+        }
+
+        function setupTickGeneration(axis) {
+            var opts = axis.options;
+
+            // estimate number of ticks
+            var noTicks;
+            if (typeof opts.ticks == "number" && opts.ticks > 0)
+                noTicks = opts.ticks;
+            else
+                // heuristic based on the model a*sqrt(x) fitted to
+                // some data points that seemed reasonable
+                noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height);
+
+            var delta = (axis.max - axis.min) / noTicks,
+                dec = -Math.floor(Math.log(delta) / Math.LN10),
+                maxDec = opts.tickDecimals;
+
+            if (maxDec != null && dec > maxDec) {
+                dec = maxDec;
+            }
+
+            var magn = Math.pow(10, -dec),
+                norm = delta / magn, // norm is between 1.0 and 10.0
+                size;
+
+            if (norm < 1.5) {
+                size = 1;
+            } else if (norm < 3) {
+                size = 2;
+                // special case for 2.5, requires an extra decimal
+                if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) {
+                    size = 2.5;
+                    ++dec;
+                }
+            } else if (norm < 7.5) {
+                size = 5;
+            } else {
+                size = 10;
+            }
+
+            size *= magn;
+
+            if (opts.minTickSize != null && size < opts.minTickSize) {
+                size = opts.minTickSize;
+            }
+
+            axis.delta = delta;
+            axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec);
+            axis.tickSize = opts.tickSize || size;
+
+            // Time mode was moved to a plug-in in 0.8, and since so many people use it
+            // we'll add an especially friendly reminder to make sure they included it.
+
+            if (opts.mode == "time" && !axis.tickGenerator) {
+                throw new Error("Time mode requires the flot.time plugin.");
+            }
+
+            // Flot supports base-10 axes; any other mode else is handled by a plug-in,
+            // like flot.time.js.
+
+            if (!axis.tickGenerator) {
+
+                axis.tickGenerator = function (axis) {
+
+                    var ticks = [],
+                        start = floorInBase(axis.min, axis.tickSize),
+                        i = 0,
+                        v = Number.NaN,
+                        prev;
+
+                    do {
+                        prev = v;
+                        v = start + i * axis.tickSize;
+                        ticks.push(v);
+                        ++i;
+                    } while (v < axis.max && v != prev);
+                    return ticks;
+                };
+
+				axis.tickFormatter = function (value, axis) {
+
+					var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1;
+					var formatted = "" + Math.round(value * factor) / factor;
+
+					// If tickDecimals was specified, ensure that we have exactly that
+					// much precision; otherwise default to the value's own precision.
+
+					if (axis.tickDecimals != null) {
+						var decimal = formatted.indexOf(".");
+						var precision = decimal == -1 ? 0 : formatted.length - decimal - 1;
+						if (precision < axis.tickDecimals) {
+							return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision);
+						}
+					}
+
+                    return formatted;
+                };
+            }
+
+            if ($.isFunction(opts.tickFormatter))
+                axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); };
+
+            if (opts.alignTicksWithAxis != null) {
+                var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1];
+                if (otherAxis && otherAxis.used && otherAxis != axis) {
+                    // consider snapping min/max to outermost nice ticks
+                    var niceTicks = axis.tickGenerator(axis);
+                    if (niceTicks.length > 0) {
+                        if (opts.min == null)
+                            axis.min = Math.min(axis.min, niceTicks[0]);
+                        if (opts.max == null && niceTicks.length > 1)
+                            axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]);
+                    }
+
+                    axis.tickGenerator = function (axis) {
+                        // copy ticks, scaled to this axis
+                        var ticks = [], v, i;
+                        for (i = 0; i < otherAxis.ticks.length; ++i) {
+                            v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min);
+                            v = axis.min + v * (axis.max - axis.min);
+                            ticks.push(v);
+                        }
+                        return ticks;
+                    };
+
+                    // we might need an extra decimal since forced
+                    // ticks don't necessarily fit naturally
+                    if (!axis.mode && opts.tickDecimals == null) {
+                        var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1),
+                            ts = axis.tickGenerator(axis);
+
+                        // only proceed if the tick interval rounded
+                        // with an extra decimal doesn't give us a
+                        // zero at end
+                        if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec))))
+                            axis.tickDecimals = extraDec;
+                    }
+                }
+            }
+        }
+
+        function setTicks(axis) {
+            var oticks = axis.options.ticks, ticks = [];
+            if (oticks == null || (typeof oticks == "number" && oticks > 0))
+                ticks = axis.tickGenerator(axis);
+            else if (oticks) {
+                if ($.isFunction(oticks))
+                    // generate the ticks
+                    ticks = oticks(axis);
+                else
+                    ticks = oticks;
+            }
+
+            // clean up/labelify the supplied ticks, copy them over
+            var i, v;
+            axis.ticks = [];
+            for (i = 0; i < ticks.length; ++i) {
+                var label = null;
+                var t = ticks[i];
+                if (typeof t == "object") {
+                    v = +t[0];
+                    if (t.length > 1)
+                        label = t[1];
+                }
+                else
+                    v = +t;
+                if (label == null)
+                    label = axis.tickFormatter(v, axis);
+                if (!isNaN(v))
+                    axis.ticks.push({ v: v, label: label });
+            }
+        }
+
+        function snapRangeToTicks(axis, ticks) {
+            if (axis.options.autoscaleMargin && ticks.length > 0) {
+                // snap to ticks
+                if (axis.options.min == null)
+                    axis.min = Math.min(axis.min, ticks[0].v);
+                if (axis.options.max == null && ticks.length > 1)
+                    axis.max = Math.max(axis.max, ticks[ticks.length - 1].v);
+            }
+        }
+
+        function draw() {
+
+            surface.clear();
+
+            executeHooks(hooks.drawBackground, [ctx]);
+
+            var grid = options.grid;
+
+            // draw background, if any
+            if (grid.show && grid.backgroundColor)
+                drawBackground();
+
+            if (grid.show && !grid.aboveData) {
+                drawGrid();
+            }
+
+            for (var i = 0; i < series.length; ++i) {
+                executeHooks(hooks.drawSeries, [ctx, series[i]]);
+                drawSeries(series[i]);
+            }
+
+            executeHooks(hooks.draw, [ctx]);
+
+            if (grid.show && grid.aboveData) {
+                drawGrid();
+            }
+
+            surface.render();
+
+            // A draw implies that either the axes or data have changed, so we
+            // should probably update the overlay highlights as well.
+
+            triggerRedrawOverlay();
+        }
+
+        function extractRange(ranges, coord) {
+            var axis, from, to, key, axes = allAxes();
+
+            for (var i = 0; i < axes.length; ++i) {
+                axis = axes[i];
+                if (axis.direction == coord) {
+                    key = coord + axis.n + "axis";
+                    if (!ranges[key] && axis.n == 1)
+                        key = coord + "axis"; // support x1axis as xaxis
+                    if (ranges[key]) {
+                        from = ranges[key].from;
+                        to = ranges[key].to;
+                        break;
+                    }
+                }
+            }
+
+            // backwards-compat stuff - to be removed in future
+            if (!ranges[key]) {
+                axis = coord == "x" ? xaxes[0] : yaxes[0];
+                from = ranges[coord + "1"];
+                to = ranges[coord + "2"];
+            }
+
+            // auto-reverse as an added bonus
+            if (from != null && to != null && from > to) {
+                var tmp = from;
+                from = to;
+                to = tmp;
+            }
+
+            return { from: from, to: to, axis: axis };
+        }
+
+        function drawBackground() {
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)");
+            ctx.fillRect(0, 0, plotWidth, plotHeight);
+            ctx.restore();
+        }
+
+        function drawGrid() {
+            var i, axes, bw, bc;
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            // draw markings
+            var markings = options.grid.markings;
+            if (markings) {
+                if ($.isFunction(markings)) {
+                    axes = plot.getAxes();
+                    // xmin etc. is backwards compatibility, to be
+                    // removed in the future
+                    axes.xmin = axes.xaxis.min;
+                    axes.xmax = axes.xaxis.max;
+                    axes.ymin = axes.yaxis.min;
+                    axes.ymax = axes.yaxis.max;
+
+                    markings = markings(axes);
+                }
+
+                for (i = 0; i < markings.length; ++i) {
+                    var m = markings[i],
+                        xrange = extractRange(m, "x"),
+                        yrange = extractRange(m, "y");
+
+                    // fill in missing
+                    if (xrange.from == null)
+                        xrange.from = xrange.axis.min;
+                    if (xrange.to == null)
+                        xrange.to = xrange.axis.max;
+                    if (yrange.from == null)
+                        yrange.from = yrange.axis.min;
+                    if (yrange.to == null)
+                        yrange.to = yrange.axis.max;
+
+                    // clip
+                    if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max ||
+                        yrange.to < yrange.axis.min || yrange.from > yrange.axis.max)
+                        continue;
+
+                    xrange.from = Math.max(xrange.from, xrange.axis.min);
+                    xrange.to = Math.min(xrange.to, xrange.axis.max);
+                    yrange.from = Math.max(yrange.from, yrange.axis.min);
+                    yrange.to = Math.min(yrange.to, yrange.axis.max);
+
+                    var xequal = xrange.from === xrange.to,
+                        yequal = yrange.from === yrange.to;
+
+                    if (xequal && yequal) {
+                        continue;
+                    }
+
+                    // then draw
+                    xrange.from = Math.floor(xrange.axis.p2c(xrange.from));
+                    xrange.to = Math.floor(xrange.axis.p2c(xrange.to));
+                    yrange.from = Math.floor(yrange.axis.p2c(yrange.from));
+                    yrange.to = Math.floor(yrange.axis.p2c(yrange.to));
+
+                    if (xequal || yequal) {
+                        var lineWidth = m.lineWidth || options.grid.markingsLineWidth,
+                            subPixel = lineWidth % 2 ? 0.5 : 0;
+                        ctx.beginPath();
+                        ctx.strokeStyle = m.color || options.grid.markingsColor;
+                        ctx.lineWidth = lineWidth;
+                        if (xequal) {
+                            ctx.moveTo(xrange.to + subPixel, yrange.from);
+                            ctx.lineTo(xrange.to + subPixel, yrange.to);
+                        } else {
+                            ctx.moveTo(xrange.from, yrange.to + subPixel);
+                            ctx.lineTo(xrange.to, yrange.to + subPixel);                            
+                        }
+                        ctx.stroke();
+                    } else {
+                        ctx.fillStyle = m.color || options.grid.markingsColor;
+                        ctx.fillRect(xrange.from, yrange.to,
+                                     xrange.to - xrange.from,
+                                     yrange.from - yrange.to);
+                    }
+                }
+            }
+
+            // draw the ticks
+            axes = allAxes();
+            bw = options.grid.borderWidth;
+
+            for (var j = 0; j < axes.length; ++j) {
+                var axis = axes[j], box = axis.box,
+                    t = axis.tickLength, x, y, xoff, yoff;
+                if (!axis.show || axis.ticks.length == 0)
+                    continue;
+
+                ctx.lineWidth = 1;
+
+                // find the edges
+                if (axis.direction == "x") {
+                    x = 0;
+                    if (t == "full")
+                        y = (axis.position == "top" ? 0 : plotHeight);
+                    else
+                        y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0);
+                }
+                else {
+                    y = 0;
+                    if (t == "full")
+                        x = (axis.position == "left" ? 0 : plotWidth);
+                    else
+                        x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0);
+                }
+
+                // draw tick bar
+                if (!axis.innermost) {
+                    ctx.strokeStyle = axis.options.color;
+                    ctx.beginPath();
+                    xoff = yoff = 0;
+                    if (axis.direction == "x")
+                        xoff = plotWidth + 1;
+                    else
+                        yoff = plotHeight + 1;
+
+                    if (ctx.lineWidth == 1) {
+                        if (axis.direction == "x") {
+                            y = Math.floor(y) + 0.5;
+                        } else {
+                            x = Math.floor(x) + 0.5;
+                        }
+                    }
+
+                    ctx.moveTo(x, y);
+                    ctx.lineTo(x + xoff, y + yoff);
+                    ctx.stroke();
+                }
+
+                // draw ticks
+
+                ctx.strokeStyle = axis.options.tickColor;
+
+                ctx.beginPath();
+                for (i = 0; i < axis.ticks.length; ++i) {
+                    var v = axis.ticks[i].v;
+
+                    xoff = yoff = 0;
+
+                    if (isNaN(v) || v < axis.min || v > axis.max
+                        // skip those lying on the axes if we got a border
+                        || (t == "full"
+                            && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0)
+                            && (v == axis.min || v == axis.max)))
+                        continue;
+
+                    if (axis.direction == "x") {
+                        x = axis.p2c(v);
+                        yoff = t == "full" ? -plotHeight : t;
+
+                        if (axis.position == "top")
+                            yoff = -yoff;
+                    }
+                    else {
+                        y = axis.p2c(v);
+                        xoff = t == "full" ? -plotWidth : t;
+
+                        if (axis.position == "left")
+                            xoff = -xoff;
+                    }
+
+                    if (ctx.lineWidth == 1) {
+                        if (axis.direction == "x")
+                            x = Math.floor(x) + 0.5;
+                        else
+                            y = Math.floor(y) + 0.5;
+                    }
+
+                    ctx.moveTo(x, y);
+                    ctx.lineTo(x + xoff, y + yoff);
+                }
+
+                ctx.stroke();
+            }
+
+
+            // draw border
+            if (bw) {
+                // If either borderWidth or borderColor is an object, then draw the border
+                // line by line instead of as one rectangle
+                bc = options.grid.borderColor;
+                if(typeof bw == "object" || typeof bc == "object") {
+                    if (typeof bw !== "object") {
+                        bw = {top: bw, right: bw, bottom: bw, left: bw};
+                    }
+                    if (typeof bc !== "object") {
+                        bc = {top: bc, right: bc, bottom: bc, left: bc};
+                    }
+
+                    if (bw.top > 0) {
+                        ctx.strokeStyle = bc.top;
+                        ctx.lineWidth = bw.top;
+                        ctx.beginPath();
+                        ctx.moveTo(0 - bw.left, 0 - bw.top/2);
+                        ctx.lineTo(plotWidth, 0 - bw.top/2);
+                        ctx.stroke();
+                    }
+
+                    if (bw.right > 0) {
+                        ctx.strokeStyle = bc.right;
+                        ctx.lineWidth = bw.right;
+                        ctx.beginPath();
+                        ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top);
+                        ctx.lineTo(plotWidth + bw.right / 2, plotHeight);
+                        ctx.stroke();
+                    }
+
+                    if (bw.bottom > 0) {
+                        ctx.strokeStyle = bc.bottom;
+                        ctx.lineWidth = bw.bottom;
+                        ctx.beginPath();
+                        ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2);
+                        ctx.lineTo(0, plotHeight + bw.bottom / 2);
+                        ctx.stroke();
+                    }
+
+                    if (bw.left > 0) {
+                        ctx.strokeStyle = bc.left;
+                        ctx.lineWidth = bw.left;
+                        ctx.beginPath();
+                        ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
+                        ctx.lineTo(0- bw.left/2, 0);
+                        ctx.stroke();
+                    }
+                }
+                else {
+                    ctx.lineWidth = bw;
+                    ctx.strokeStyle = options.grid.borderColor;
+                    ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
+                }
+            }
+
+            ctx.restore();
+        }
+
+        function drawAxisLabels() {
+
+            $.each(allAxes(), function (_, axis) {
+                var box = axis.box,
+                    legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis",
+                    layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles,
+                    font = axis.options.font || "flot-tick-label tickLabel",
+                    tick, x, y, halign, valign;
+
+                // Remove text before checking for axis.show and ticks.length;
+                // otherwise plugins, like flot-tickrotor, that draw their own
+                // tick labels will end up with both theirs and the defaults.
+
+                surface.removeText(layer);
+
+                if (!axis.show || axis.ticks.length == 0)
+                    return;
+
+                for (var i = 0; i < axis.ticks.length; ++i) {
+
+                    tick = axis.ticks[i];
+                    if (!tick.label || tick.v < axis.min || tick.v > axis.max)
+                        continue;
+
+                    if (axis.direction == "x") {
+                        halign = "center";
+                        x = plotOffset.left + axis.p2c(tick.v);
+                        if (axis.position == "bottom") {
+                            y = box.top + box.padding;
+                        } else {
+                            y = box.top + box.height - box.padding;
+                            valign = "bottom";
+                        }
+                    } else {
+                        valign = "middle";
+                        y = plotOffset.top + axis.p2c(tick.v);
+                        if (axis.position == "left") {
+                            x = box.left + box.width - box.padding;
+                            halign = "right";
+                        } else {
+                            x = box.left + box.padding;
+                        }
+                    }
+
+                    surface.addText(layer, x, y, tick.label, font, null, null, halign, valign);
+                }
+            });
+        }
+
+        function drawSeries(series) {
+            if (series.lines.show)
+                drawSeriesLines(series);
+            if (series.bars.show)
+                drawSeriesBars(series);
+            if (series.points.show)
+                drawSeriesPoints(series);
+        }
+
+        function drawSeriesLines(series) {
+            function plotLine(datapoints, xoffset, yoffset, axisx, axisy) {
+                var points = datapoints.points,
+                    ps = datapoints.pointsize,
+                    prevx = null, prevy = null;
+
+                ctx.beginPath();
+                for (var i = ps; i < points.length; i += ps) {
+                    var x1 = points[i - ps], y1 = points[i - ps + 1],
+                        x2 = points[i], y2 = points[i + 1];
+
+                    if (x1 == null || x2 == null)
+                        continue;
+
+                    // clip with ymin
+                    if (y1 <= y2 && y1 < axisy.min) {
+                        if (y2 < axisy.min)
+                            continue;   // line segment is outside
+                        // compute new intersection point
+                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.min;
+                    }
+                    else if (y2 <= y1 && y2 < axisy.min) {
+                        if (y1 < axisy.min)
+                            continue;
+                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.min;
+                    }
+
+                    // clip with ymax
+                    if (y1 >= y2 && y1 > axisy.max) {
+                        if (y2 > axisy.max)
+                            continue;
+                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.max;
+                    }
+                    else if (y2 >= y1 && y2 > axisy.max) {
+                        if (y1 > axisy.max)
+                            continue;
+                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.max;
+                    }
+
+                    // clip with xmin
+                    if (x1 <= x2 && x1 < axisx.min) {
+                        if (x2 < axisx.min)
+                            continue;
+                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.min;
+                    }
+                    else if (x2 <= x1 && x2 < axisx.min) {
+                        if (x1 < axisx.min)
+                            continue;
+                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.min;
+                    }
+
+                    // clip with xmax
+                    if (x1 >= x2 && x1 > axisx.max) {
+                        if (x2 > axisx.max)
+                            continue;
+                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.max;
+                    }
+                    else if (x2 >= x1 && x2 > axisx.max) {
+                        if (x1 > axisx.max)
+                            continue;
+                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.max;
+                    }
+
+                    if (x1 != prevx || y1 != prevy)
+                        ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset);
+
+                    prevx = x2;
+                    prevy = y2;
+                    ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset);
+                }
+                ctx.stroke();
+            }
+
+            function plotLineArea(datapoints, axisx, axisy) {
+                var points = datapoints.points,
+                    ps = datapoints.pointsize,
+                    bottom = Math.min(Math.max(0, axisy.min), axisy.max),
+                    i = 0, top, areaOpen = false,
+                    ypos = 1, segmentStart = 0, segmentEnd = 0;
+
+                // we process each segment in two turns, first forward
+                // direction to sketch out top, then once we hit the
+                // end we go backwards to sketch the bottom
+                while (true) {
+                    if (ps > 0 && i > points.length + ps)
+                        break;
+
+                    i += ps; // ps is negative if going backwards
+
+                    var x1 = points[i - ps],
+                        y1 = points[i - ps + ypos],
+                        x2 = points[i], y2 = points[i + ypos];
+
+                    if (areaOpen) {
+                        if (ps > 0 && x1 != null && x2 == null) {
+                            // at turning point
+                            segmentEnd = i;
+                            ps = -ps;
+                            ypos = 2;
+                            continue;
+                        }
+
+                        if (ps < 0 && i == segmentStart + ps) {
+                            // done with the reverse sweep
+                            ctx.fill();
+                            areaOpen = false;
+                            ps = -ps;
+                            ypos = 1;
+                            i = segmentStart = segmentEnd + ps;
+                            continue;
+                        }
+                    }
+
+                    if (x1 == null || x2 == null)
+                        continue;
+
+                    // clip x values
+
+                    // clip with xmin
+                    if (x1 <= x2 && x1 < axisx.min) {
+                        if (x2 < axisx.min)
+                            continue;
+                        y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.min;
+                    }
+                    else if (x2 <= x1 && x2 < axisx.min) {
+                        if (x1 < axisx.min)
+                            continue;
+                        y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.min;
+                    }
+
+                    // clip with xmax
+                    if (x1 >= x2 && x1 > axisx.max) {
+                        if (x2 > axisx.max)
+                            continue;
+                        y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x1 = axisx.max;
+                    }
+                    else if (x2 >= x1 && x2 > axisx.max) {
+                        if (x1 > axisx.max)
+                            continue;
+                        y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1;
+                        x2 = axisx.max;
+                    }
+
+                    if (!areaOpen) {
+                        // open area
+                        ctx.beginPath();
+                        ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom));
+                        areaOpen = true;
+                    }
+
+                    // now first check the case where both is outside
+                    if (y1 >= axisy.max && y2 >= axisy.max) {
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max));
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max));
+                        continue;
+                    }
+                    else if (y1 <= axisy.min && y2 <= axisy.min) {
+                        ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min));
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min));
+                        continue;
+                    }
+
+                    // else it's a bit more complicated, there might
+                    // be a flat maxed out rectangle first, then a
+                    // triangular cutout or reverse; to find these
+                    // keep track of the current x values
+                    var x1old = x1, x2old = x2;
+
+                    // clip the y values, without shortcutting, we
+                    // go through all cases in turn
+
+                    // clip with ymin
+                    if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) {
+                        x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.min;
+                    }
+                    else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) {
+                        x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.min;
+                    }
+
+                    // clip with ymax
+                    if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) {
+                        x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y1 = axisy.max;
+                    }
+                    else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) {
+                        x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1;
+                        y2 = axisy.max;
+                    }
+
+                    // if the x value was changed we got a rectangle
+                    // to fill
+                    if (x1 != x1old) {
+                        ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1));
+                        // it goes to (x1, y1), but we fill that below
+                    }
+
+                    // fill triangular section, this sometimes result
+                    // in redundant points if (x1, y1) hasn't changed
+                    // from previous line to, but we just ignore that
+                    ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1));
+                    ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
+
+                    // fill the other rectangle if it's there
+                    if (x2 != x2old) {
+                        ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2));
+                        ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2));
+                    }
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+            ctx.lineJoin = "round";
+
+            var lw = series.lines.lineWidth,
+                sw = series.shadowSize;
+            // FIXME: consider another form of shadow when filling is turned on
+            if (lw > 0 && sw > 0) {
+                // draw shadow as a thick and thin line with transparency
+                ctx.lineWidth = sw;
+                ctx.strokeStyle = "rgba(0,0,0,0.1)";
+                // position shadow at angle from the mid of line
+                var angle = Math.PI/18;
+                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
+                ctx.lineWidth = sw/2;
+                plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
+            }
+
+            ctx.lineWidth = lw;
+            ctx.strokeStyle = series.color;
+            var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight);
+            if (fillStyle) {
+                ctx.fillStyle = fillStyle;
+                plotLineArea(series.datapoints, series.xaxis, series.yaxis);
+            }
+
+            if (lw > 0)
+                plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function drawSeriesPoints(series) {
+            function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) {
+                var points = datapoints.points, ps = datapoints.pointsize;
+
+                for (var i = 0; i < points.length; i += ps) {
+                    var x = points[i], y = points[i + 1];
+                    if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
+                        continue;
+
+                    ctx.beginPath();
+                    x = axisx.p2c(x);
+                    y = axisy.p2c(y) + offset;
+                    if (symbol == "circle")
+                        ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false);
+                    else
+                        symbol(ctx, x, y, radius, shadow);
+                    ctx.closePath();
+
+                    if (fillStyle) {
+                        ctx.fillStyle = fillStyle;
+                        ctx.fill();
+                    }
+                    ctx.stroke();
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            var lw = series.points.lineWidth,
+                sw = series.shadowSize,
+                radius = series.points.radius,
+                symbol = series.points.symbol;
+
+            // If the user sets the line width to 0, we change it to a very 
+            // small value. A line width of 0 seems to force the default of 1.
+            // Doing the conditional here allows the shadow setting to still be 
+            // optional even with a lineWidth of 0.
+
+            if( lw == 0 )
+                lw = 0.0001;
+
+            if (lw > 0 && sw > 0) {
+                // draw shadow in two steps
+                var w = sw / 2;
+                ctx.lineWidth = w;
+                ctx.strokeStyle = "rgba(0,0,0,0.1)";
+                plotPoints(series.datapoints, radius, null, w + w/2, true,
+                           series.xaxis, series.yaxis, symbol);
+
+                ctx.strokeStyle = "rgba(0,0,0,0.2)";
+                plotPoints(series.datapoints, radius, null, w/2, true,
+                           series.xaxis, series.yaxis, symbol);
+            }
+
+            ctx.lineWidth = lw;
+            ctx.strokeStyle = series.color;
+            plotPoints(series.datapoints, radius,
+                       getFillStyle(series.points, series.color), 0, false,
+                       series.xaxis, series.yaxis, symbol);
+            ctx.restore();
+        }
+
+        function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) {
+            var left, right, bottom, top,
+                drawLeft, drawRight, drawTop, drawBottom,
+                tmp;
+
+            // in horizontal mode, we start the bar from the left
+            // instead of from the bottom so it appears to be
+            // horizontal rather than vertical
+            if (horizontal) {
+                drawBottom = drawRight = drawTop = true;
+                drawLeft = false;
+                left = b;
+                right = x;
+                top = y + barLeft;
+                bottom = y + barRight;
+
+                // account for negative bars
+                if (right < left) {
+                    tmp = right;
+                    right = left;
+                    left = tmp;
+                    drawLeft = true;
+                    drawRight = false;
+                }
+            }
+            else {
+                drawLeft = drawRight = drawTop = true;
+                drawBottom = false;
+                left = x + barLeft;
+                right = x + barRight;
+                bottom = b;
+                top = y;
+
+                // account for negative bars
+                if (top < bottom) {
+                    tmp = top;
+                    top = bottom;
+                    bottom = tmp;
+                    drawBottom = true;
+                    drawTop = false;
+                }
+            }
+
+            // clip
+            if (right < axisx.min || left > axisx.max ||
+                top < axisy.min || bottom > axisy.max)
+                return;
+
+            if (left < axisx.min) {
+                left = axisx.min;
+                drawLeft = false;
+            }
+
+            if (right > axisx.max) {
+                right = axisx.max;
+                drawRight = false;
+            }
+
+            if (bottom < axisy.min) {
+                bottom = axisy.min;
+                drawBottom = false;
+            }
+
+            if (top > axisy.max) {
+                top = axisy.max;
+                drawTop = false;
+            }
+
+            left = axisx.p2c(left);
+            bottom = axisy.p2c(bottom);
+            right = axisx.p2c(right);
+            top = axisy.p2c(top);
+
+            // fill the bar
+            if (fillStyleCallback) {
+                c.fillStyle = fillStyleCallback(bottom, top);
+                c.fillRect(left, top, right - left, bottom - top)
+            }
+
+            // draw outline
+            if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) {
+                c.beginPath();
+
+                // FIXME: inline moveTo is buggy with excanvas
+                c.moveTo(left, bottom);
+                if (drawLeft)
+                    c.lineTo(left, top);
+                else
+                    c.moveTo(left, top);
+                if (drawTop)
+                    c.lineTo(right, top);
+                else
+                    c.moveTo(right, top);
+                if (drawRight)
+                    c.lineTo(right, bottom);
+                else
+                    c.moveTo(right, bottom);
+                if (drawBottom)
+                    c.lineTo(left, bottom);
+                else
+                    c.moveTo(left, bottom);
+                c.stroke();
+            }
+        }
+
+        function drawSeriesBars(series) {
+            function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
+                var points = datapoints.points, ps = datapoints.pointsize;
+
+                for (var i = 0; i < points.length; i += ps) {
+                    if (points[i] == null)
+                        continue;
+                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
+                }
+            }
+
+            ctx.save();
+            ctx.translate(plotOffset.left, plotOffset.top);
+
+            // FIXME: figure out a way to add shadows (for instance along the right edge)
+            ctx.lineWidth = series.bars.lineWidth;
+            ctx.strokeStyle = series.color;
+
+            var barLeft;
+
+            switch (series.bars.align) {
+                case "left":
+                    barLeft = 0;
+                    break;
+                case "right":
+                    barLeft = -series.bars.barWidth;
+                    break;
+                default:
+                    barLeft = -series.bars.barWidth / 2;
+            }
+
+            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
+            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
+            ctx.restore();
+        }
+
+        function getFillStyle(filloptions, seriesColor, bottom, top) {
+            var fill = filloptions.fill;
+            if (!fill)
+                return null;
+
+            if (filloptions.fillColor)
+                return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor);
+
+            var c = $.color.parse(seriesColor);
+            c.a = typeof fill == "number" ? fill : 0.4;
+            c.normalize();
+            return c.toString();
+        }
+
+        function insertLegend() {
+
+            if (options.legend.container != null) {
+                $(options.legend.container).html("");
+            } else {
+                placeholder.find(".legend").remove();
+            }
+
+            if (!options.legend.show) {
+                return;
+            }
+
+            var fragments = [], entries = [], rowStarted = false,
+                lf = options.legend.labelFormatter, s, label;
+
+            // Build a list of legend entries, with each having a label and a color
+
+            for (var i = 0; i < series.length; ++i) {
+                s = series[i];
+                if (s.label) {
+                    label = lf ? lf(s.label, s) : s.label;
+                    if (label) {
+                        entries.push({
+                            label: label,
+                            color: s.color
+                        });
+                    }
+                }
+            }
+
+            // Sort the legend using either the default or a custom comparator
+
+            if (options.legend.sorted) {
+                if ($.isFunction(options.legend.sorted)) {
+                    entries.sort(options.legend.sorted);
+                } else if (options.legend.sorted == "reverse") {
+                	entries.reverse();
+                } else {
+                    var ascending = options.legend.sorted != "descending";
+                    entries.sort(function(a, b) {
+                        return a.label == b.label ? 0 : (
+                            (a.label < b.label) != ascending ? 1 : -1   // Logical XOR
+                        );
+                    });
+                }
+            }
+
+            // Generate markup for the list of entries, in their final order
+
+            for (var i = 0; i < entries.length; ++i) {
+
+                var entry = entries[i];
+
+                if (i % options.legend.noColumns == 0) {
+                    if (rowStarted)
+                        fragments.push('</tr>');
+                    fragments.push('<tr>');
+                    rowStarted = true;
+                }
+
+                fragments.push(
+                    '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' +
+                    '<td class="legendLabel">' + entry.label + '</td>'
+                );
+            }
+
+            if (rowStarted)
+                fragments.push('</tr>');
+
+            if (fragments.length == 0)
+                return;
+
+            var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>';
+            if (options.legend.container != null)
+                $(options.legend.container).html(table);
+            else {
+                var pos = "",
+                    p = options.legend.position,
+                    m = options.legend.margin;
+                if (m[0] == null)
+                    m = [m, m];
+                if (p.charAt(0) == "n")
+                    pos += 'top:' + (m[1] + plotOffset.top) + 'px;';
+                else if (p.charAt(0) == "s")
+                    pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;';
+                if (p.charAt(1) == "e")
+                    pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
+                else if (p.charAt(1) == "w")
+                    pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
+                var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
+                if (options.legend.backgroundOpacity != 0.0) {
+                    // put in the transparent background
+                    // separately to avoid blended labels and
+                    // label boxes
+                    var c = options.legend.backgroundColor;
+                    if (c == null) {
+                        c = options.grid.backgroundColor;
+                        if (c && typeof c == "string")
+                            c = $.color.parse(c);
+                        else
+                            c = $.color.extract(legend, 'background-color');
+                        c.a = 1;
+                        c = c.toString();
+                    }
+                    var div = legend.children();
+                    $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
+                }
+            }
+        }
+
+
+        // interactive features
+
+        var highlights = [],
+            redrawTimeout = null;
+
+        // returns the data item the mouse is over, or null if none is found
+        function findNearbyItem(mouseX, mouseY, seriesFilter) {
+            var maxDistance = options.grid.mouseActiveRadius,
+                smallestDistance = maxDistance * maxDistance + 1,
+                item = null, foundPoint = false, i, j, ps;
+
+            for (i = series.length - 1; i >= 0; --i) {
+                if (!seriesFilter(series[i]))
+                    continue;
+
+                var s = series[i],
+                    axisx = s.xaxis,
+                    axisy = s.yaxis,
+                    points = s.datapoints.points,
+                    mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster
+                    my = axisy.c2p(mouseY),
+                    maxx = maxDistance / axisx.scale,
+                    maxy = maxDistance / axisy.scale;
+
+                ps = s.datapoints.pointsize;
+                // with inverse transforms, we can't use the maxx/maxy
+                // optimization, sadly
+                if (axisx.options.inverseTransform)
+                    maxx = Number.MAX_VALUE;
+                if (axisy.options.inverseTransform)
+                    maxy = Number.MAX_VALUE;
+
+                if (s.lines.show || s.points.show) {
+                    for (j = 0; j < points.length; j += ps) {
+                        var x = points[j], y = points[j + 1];
+                        if (x == null)
+                            continue;
+
+                        // For points and lines, the cursor must be within a
+                        // certain distance to the data point
+                        if (x - mx > maxx || x - mx < -maxx ||
+                            y - my > maxy || y - my < -maxy)
+                            continue;
+
+                        // We have to calculate distances in pixels, not in
+                        // data units, because the scales of the axes may be different
+                        var dx = Math.abs(axisx.p2c(x) - mouseX),
+                            dy = Math.abs(axisy.p2c(y) - mouseY),
+                            dist = dx * dx + dy * dy; // we save the sqrt
+
+                        // use <= to ensure last point takes precedence
+                        // (last generally means on top of)
+                        if (dist < smallestDistance) {
+                            smallestDistance = dist;
+                            item = [i, j / ps];
+                        }
+                    }
+                }
+
+                if (s.bars.show && !item) { // no other point can be nearby
+
+                    var barLeft, barRight;
+
+                    switch (s.bars.align) {
+                        case "left":
+                            barLeft = 0;
+                            break;
+                        case "right":
+                            barLeft = -s.bars.barWidth;
+                            break;
+                        default:
+                            barLeft = -s.bars.barWidth / 2;
+                    }
+
+                    barRight = barLeft + s.bars.barWidth;
+
+                    for (j = 0; j < points.length; j += ps) {
+                        var x = points[j], y = points[j + 1], b = points[j + 2];
+                        if (x == null)
+                            continue;
+
+                        // for a bar graph, the cursor must be inside the bar
+                        if (series[i].bars.horizontal ?
+                            (mx <= Math.max(b, x) && mx >= Math.min(b, x) &&
+                             my >= y + barLeft && my <= y + barRight) :
+                            (mx >= x + barLeft && mx <= x + barRight &&
+                             my >= Math.min(b, y) && my <= Math.max(b, y)))
+                                item = [i, j / ps];
+                    }
+                }
+            }
+
+            if (item) {
+                i = item[0];
+                j = item[1];
+                ps = series[i].datapoints.pointsize;
+
+                return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
+                         dataIndex: j,
+                         series: series[i],
+                         seriesIndex: i };
+            }
+
+            return null;
+        }
+
+        function onMouseMove(e) {
+            if (options.grid.hoverable)
+                triggerClickHoverEvent("plothover", e,
+                                       function (s) { return s["hoverable"] != false; });
+        }
+
+        function onMouseLeave(e) {
+            if (options.grid.hoverable)
+                triggerClickHoverEvent("plothover", e,
+                                       function (s) { return false; });
+        }
+
+        function onClick(e) {
+            triggerClickHoverEvent("plotclick", e,
+                                   function (s) { return s["clickable"] != false; });
+        }
+
+        // trigger click or hover event (they send the same parameters
+        // so we share their code)
+        function triggerClickHoverEvent(eventname, event, seriesFilter) {
+            var offset = eventHolder.offset(),
+                canvasX = event.pageX - offset.left - plotOffset.left,
+                canvasY = event.pageY - offset.top - plotOffset.top,
+            pos = canvasToAxisCoords({ left: canvasX, top: canvasY });
+
+            pos.pageX = event.pageX;
+            pos.pageY = event.pageY;
+
+            var item = findNearbyItem(canvasX, canvasY, seriesFilter);
+
+            if (item) {
+                // fill in mouse pos for any listeners out there
+                item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10);
+                item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10);
+            }
+
+            if (options.grid.autoHighlight) {
+                // clear auto-highlights
+                for (var i = 0; i < highlights.length; ++i) {
+                    var h = highlights[i];
+                    if (h.auto == eventname &&
+                        !(item && h.series == item.series &&
+                          h.point[0] == item.datapoint[0] &&
+                          h.point[1] == item.datapoint[1]))
+                        unhighlight(h.series, h.point);
+                }
+
+                if (item)
+                    highlight(item.series, item.datapoint, eventname);
+            }
+
+            placeholder.trigger(eventname, [ pos, item ]);
+        }
+
+        function triggerRedrawOverlay() {
+            var t = options.interaction.redrawOverlayInterval;
+            if (t == -1) {      // skip event queue
+                drawOverlay();
+                return;
+            }
+
+            if (!redrawTimeout)
+                redrawTimeout = setTimeout(drawOverlay, t);
+        }
+
+        function drawOverlay() {
+            redrawTimeout = null;
+
+            // draw highlights
+            octx.save();
+            overlay.clear();
+            octx.translate(plotOffset.left, plotOffset.top);
+
+            var i, hi;
+            for (i = 0; i < highlights.length; ++i) {
+                hi = highlights[i];
+
+                if (hi.series.bars.show)
+                    drawBarHighlight(hi.series, hi.point);
+                else
+                    drawPointHighlight(hi.series, hi.point);
+            }
+            octx.restore();
+
+            executeHooks(hooks.drawOverlay, [octx]);
+        }
+
+        function highlight(s, point, auto) {
+            if (typeof s == "number")
+                s = series[s];
+
+            if (typeof point == "number") {
+                var ps = s.datapoints.pointsize;
+                point = s.datapoints.points.slice(ps * point, ps * (point + 1));
+            }
+
+            var i = indexOfHighlight(s, point);
+            if (i == -1) {
+                highlights.push({ series: s, point: point, auto: auto });
+
+                triggerRedrawOverlay();
+            }
+            else if (!auto)
+                highlights[i].auto = false;
+        }
+
+        function unhighlight(s, point) {
+            if (s == null && point == null) {
+                highlights = [];
+                triggerRedrawOverlay();
+                return;
+            }
+
+            if (typeof s == "number")
+                s = series[s];
+
+            if (typeof point == "number") {
+                var ps = s.datapoints.pointsize;
+                point = s.datapoints.points.slice(ps * point, ps * (point + 1));
+            }
+
+            var i = indexOfHighlight(s, point);
+            if (i != -1) {
+                highlights.splice(i, 1);
+
+                triggerRedrawOverlay();
+            }
+        }
+
+        function indexOfHighlight(s, p) {
+            for (var i = 0; i < highlights.length; ++i) {
+                var h = highlights[i];
+                if (h.series == s && h.point[0] == p[0]
+                    && h.point[1] == p[1])
+                    return i;
+            }
+            return -1;
+        }
+
+        function drawPointHighlight(series, point) {
+            var x = point[0], y = point[1],
+                axisx = series.xaxis, axisy = series.yaxis,
+                highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString();
+
+            if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max)
+                return;
+
+            var pointRadius = series.points.radius + series.points.lineWidth / 2;
+            octx.lineWidth = pointRadius;
+            octx.strokeStyle = highlightColor;
+            var radius = 1.5 * pointRadius;
+            x = axisx.p2c(x);
+            y = axisy.p2c(y);
+
+            octx.beginPath();
+            if (series.points.symbol == "circle")
+                octx.arc(x, y, radius, 0, 2 * Math.PI, false);
+            else
+                series.points.symbol(octx, x, y, radius, false);
+            octx.closePath();
+            octx.stroke();
+        }
+
+        function drawBarHighlight(series, point) {
+            var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(),
+                fillStyle = highlightColor,
+                barLeft;
+
+            switch (series.bars.align) {
+                case "left":
+                    barLeft = 0;
+                    break;
+                case "right":
+                    barLeft = -series.bars.barWidth;
+                    break;
+                default:
+                    barLeft = -series.bars.barWidth / 2;
+            }
+
+            octx.lineWidth = series.bars.lineWidth;
+            octx.strokeStyle = highlightColor;
+
+            drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth,
+                    function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth);
+        }
+
+        function getColorOrGradient(spec, bottom, top, defaultColor) {
+            if (typeof spec == "string")
+                return spec;
+            else {
+                // assume this is a gradient spec; IE currently only
+                // supports a simple vertical gradient properly, so that's
+                // what we support too
+                var gradient = ctx.createLinearGradient(0, top, 0, bottom);
+
+                for (var i = 0, l = spec.colors.length; i < l; ++i) {
+                    var c = spec.colors[i];
+                    if (typeof c != "string") {
+                        var co = $.color.parse(defaultColor);
+                        if (c.brightness != null)
+                            co = co.scale('rgb', c.brightness);
+                        if (c.opacity != null)
+                            co.a *= c.opacity;
+                        c = co.toString();
+                    }
+                    gradient.addColorStop(i / (l - 1), c);
+                }
+
+                return gradient;
+            }
+        }
+    }
+
+    // Add the plot function to the top level of the jQuery object
+
+    $.plot = function(placeholder, data, options) {
+        //var t0 = new Date();
+        var plot = new Plot($(placeholder), data, options, $.plot.plugins);
+        //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
+        return plot;
+    };
+
+    $.plot.version = "0.8.3";
+
+    $.plot.plugins = [];
+
+    // Also add the plot function as a chainable property
+
+    $.fn.plot = function(data, options) {
+        return this.each(function() {
+            $.plot(this, data, options);
+        });
+    };
+
+    // round to nearby lower multiple of base
+    function floorInBase(n, base) {
+        return base * Math.floor(n / base);
+    }
+
+})(jQuery);
diff --git a/qa/workunits/erasure-code/jquery.js b/qa/workunits/erasure-code/jquery.js
new file mode 100644
index 0000000..8c24ffc
--- /dev/null
+++ b/qa/workunits/erasure-code/jquery.js
@@ -0,0 +1,9472 @@
+/*!
+ * jQuery JavaScript Library v1.8.3
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
+ */
+(function( window, undefined ) {
+var
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// The deferred used on DOM ready
+	readyList,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+	navigator = window.navigator,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// Save a reference to some core methods
+	core_push = Array.prototype.push,
+	core_slice = Array.prototype.slice,
+	core_indexOf = Array.prototype.indexOf,
+	core_toString = Object.prototype.toString,
+	core_hasOwn = Object.prototype.hasOwnProperty,
+	core_trim = String.prototype.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+	// Used for detecting and trimming whitespace
+	core_rnotwhite = /\S/,
+	core_rspace = /\s+/,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return ( letter + "" ).toUpperCase();
+	},
+
+	// The ready event handler and self cleanup method
+	DOMContentLoaded = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+			jQuery.ready();
+		} else if ( document.readyState === "complete" ) {
+			// we're here because readyState === "complete" in oldIE
+			// which is good enough for us to call the dom ready!
+			document.detachEvent( "onreadystatechange", DOMContentLoaded );
+			jQuery.ready();
+		}
+	},
+
+	// [[Class]] -> type pairs
+	class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem, ret, doc;
+
+		// Handle $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+					doc = ( context && context.nodeType ? context.ownerDocument || context : document );
+
+					// scripts is true for back-compat
+					selector = jQuery.parseHTML( match[1], doc, true );
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						this.attr.call( selector, context, true );
+					}
+
+					return jQuery.merge( this, selector );
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.8.3",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return core_slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" ) {
+			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+		} else if ( name ) {
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+		}
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	eq: function( i ) {
+		i = +i;
+		return i === -1 ?
+			this.slice( i ) :
+			this.slice( i, i + 1 );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	slice: function() {
+		return this.pushStack( core_slice.apply( this, arguments ),
+			"slice", core_slice.call(arguments).join(",") );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var options, name, src, copy, copyIsArray, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready, 1 );
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		return obj == null ?
+			String( obj ) :
+			class2type[ core_toString.call(obj) ] || "object";
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// scripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, scripts ) {
+		var parsed;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			scripts = context;
+			context = 0;
+		}
+		context = context || document;
+
+		// Single tag
+		if ( (parsed = rsingleTag.exec( data )) ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+		return jQuery.merge( [],
+			(parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+	},
+
+	parseJSON: function( data ) {
+		if ( !data || typeof data !== "string") {
+			return null;
+		}
+
+		// Make sure leading/trailing whitespace is removed (IE can't handle it)
+		data = jQuery.trim( data );
+
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		// Make sure the incoming data is actual JSON
+		// Logic borrowed from http://json.org/json2.js
+		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+			.replace( rvalidtokens, "]" )
+			.replace( rvalidbraces, "")) ) {
+
+			return ( new Function( "return " + data ) )();
+
+		}
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && core_rnotwhite.test( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var name,
+			i = 0,
+			length = obj.length,
+			isObj = length === undefined || jQuery.isFunction( obj );
+
+		if ( args ) {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.apply( obj[ name ], args ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.apply( obj[ i++ ], args ) === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isObj ) {
+				for ( name in obj ) {
+					if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( ; i < length; ) {
+					if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var type,
+			ret = results || [];
+
+		if ( arr != null ) {
+			// The window, strings (and functions) also have 'length'
+			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+			type = jQuery.type( arr );
+
+			if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+				core_push.call( ret, arr );
+			} else {
+				jQuery.merge( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value, key,
+			ret = [],
+			i = 0,
+			length = elems.length,
+			// jquery objects are treated as arrays
+			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( key in elems ) {
+				value = callback( elems[ key ], key, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return ret.concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var tmp, args, proxy;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+		var exec,
+			bulk = key == null,
+			i = 0,
+			length = elems.length;
+
+		// Sets many values
+		if ( key && typeof key === "object" ) {
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+			}
+			chainable = 1;
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			// Optionally, function values get executed if exec is true
+			exec = pass === undefined && jQuery.isFunction( value );
+
+			if ( bulk ) {
+				// Bulk operations only iterate when executing function values
+				if ( exec ) {
+					exec = fn;
+					fn = function( elem, key, value ) {
+						return exec.call( jQuery( elem ), value );
+					};
+
+				// Otherwise they run against the entire set
+				} else {
+					fn.call( elems, value );
+					fn = null;
+				}
+			}
+
+			if ( fn ) {
+				for (; i < length; i++ ) {
+					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+				}
+			}
+
+			chainable = 1;
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready, 1 );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", jQuery.ready, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", jQuery.ready );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.split( core_rspace ), function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// Flag to know if list is currently firing
+		firing,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Control if a given callback is in the list
+			has: function( fn ) {
+				return jQuery.inArray( fn, list ) > -1;
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+								function() {
+									var returned = fn.apply( this, arguments );
+									if ( returned && jQuery.isFunction( returned.promise ) ) {
+										returned.promise()
+											.done( newDefer.resolve )
+											.fail( newDefer.reject )
+											.progress( newDefer.notify );
+									} else {
+										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+									}
+								} :
+								newDefer[ action ]
+							);
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ] = list.fire
+			deferred[ tuple[0] ] = list.fire;
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function() {
+
+	var support,
+		all,
+		a,
+		select,
+		opt,
+		input,
+		fragment,
+		eventName,
+		i,
+		isSupported,
+		clickFn,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Support tests won't run in some limited or non-browser environments
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !all || !a || !all.length ) {
+		return {};
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+	support = {
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.5/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Make sure that if no value is specified for a checkbox
+		// that it defaults to "on".
+		// (WebKit defaults to "" instead)
+		checkOn: ( input.value === "on" ),
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// Tests for enctype support on a form (#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: ( document.compatMode === "CSS1Compat" ),
+
+		// Will be defined later
+		submitBubbles: true,
+		changeBubbles: true,
+		focusinBubbles: false,
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Test to see if it's possible to delete an expando from an element
+	// Fails in Internet Explorer
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+		div.attachEvent( "onclick", clickFn = function() {
+			// Cloning a node shouldn't copy over any
+			// bound event handlers (IE does this)
+			support.noCloneEvent = false;
+		});
+		div.cloneNode( true ).fireEvent("onclick");
+		div.detachEvent( "onclick", clickFn );
+	}
+
+	// Check if a radio maintains its value
+	// after being appended to the DOM
+	input = document.createElement("input");
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+
+	input.setAttribute( "checked", "checked" );
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "name", "t" );
+
+	div.appendChild( input );
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( div.lastChild );
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	fragment.removeChild( input );
+	fragment.appendChild( div );
+
+	// Technique from Juriy Zaytsev
+	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+	// We only care about the case where non-standard event systems
+	// are used, namely in IE. Short-circuiting here helps us to
+	// avoid an eval call (in setAttribute) which can cause CSP
+	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+	if ( div.attachEvent ) {
+		for ( i in {
+			submit: true,
+			change: true,
+			focusin: true
+		}) {
+			eventName = "on" + i;
+			isSupported = ( eventName in div );
+			if ( !isSupported ) {
+				div.setAttribute( eventName, "return;" );
+				isSupported = ( typeof div[ eventName ] === "function" );
+			}
+			support[ i + "Bubbles" ] = isSupported;
+		}
+	}
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, div, tds, marginDiv,
+			divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+		body.insertBefore( container, body.firstChild );
+
+		// Construct the test element
+		div = document.createElement("div");
+		container.appendChild( div );
+
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		// (only IE 8 fails this test)
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Check if empty table cells still have offsetWidth/Height
+		// (IE <= 8 fail this test)
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// NOTE: To any future maintainer, we've window.getComputedStyle
+		// because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. For more
+			// info see bug #3333
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = document.createElement("div");
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+			div.appendChild( marginDiv );
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== "undefined" ) {
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			// (IE < 8 does this)
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Check if elements with layout shrink-wrap their children
+			// (IE 6 does this)
+			div.style.display = "block";
+			div.style.overflow = "visible";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			container.style.zoom = 1;
+		}
+
+		// Null elements to avoid leaks in IE
+		body.removeChild( container );
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	fragment.removeChild( div );
+	all = a = select = opt = input = fragment = div = null;
+
+	return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+	cache: {},
+
+	deletedIds: [],
+
+	// Remove at next major release (1.9/2.0)
+	uuid: 0,
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, ret,
+			internalKey = jQuery.expando,
+			getByName = typeof name === "string",
+
+			// We have to handle DOM nodes and JS objects differently because IE6-7
+			// can't GC object references properly across the DOM-JS boundary
+			isNode = elem.nodeType,
+
+			// Only DOM nodes need the global jQuery cache; JS object data is
+			// attached directly to the object so GC can occur automatically
+			cache = isNode ? jQuery.cache : elem,
+
+			// Only defining an ID for JS objects if its cache already exists allows
+			// the code to shortcut on the same path as a DOM node with no cache
+			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+		// Avoid doing any more work than we need to when trying to get data on an
+		// object that has no data at all
+		if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+			return;
+		}
+
+		if ( !id ) {
+			// Only DOM nodes need a new unique ID for each element since their data
+			// ends up in the global cache
+			if ( isNode ) {
+				elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
+			} else {
+				id = internalKey;
+			}
+		}
+
+		if ( !cache[ id ] ) {
+			cache[ id ] = {};
+
+			// Avoids exposing jQuery metadata on plain JS objects when the object
+			// is serialized using JSON.stringify
+			if ( !isNode ) {
+				cache[ id ].toJSON = jQuery.noop;
+			}
+		}
+
+		// An object can be passed to jQuery.data instead of a key/value pair; this gets
+		// shallow copied over onto the existing cache
+		if ( typeof name === "object" || typeof name === "function" ) {
+			if ( pvt ) {
+				cache[ id ] = jQuery.extend( cache[ id ], name );
+			} else {
+				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+			}
+		}
+
+		thisCache = cache[ id ];
+
+		// jQuery data() is stored in a separate object inside the object's internal data
+		// cache in order to avoid key collisions between internal data and user-defined
+		// data.
+		if ( !pvt ) {
+			if ( !thisCache.data ) {
+				thisCache.data = {};
+			}
+
+			thisCache = thisCache.data;
+		}
+
+		if ( data !== undefined ) {
+			thisCache[ jQuery.camelCase( name ) ] = data;
+		}
+
+		// Check for both converted-to-camel and non-converted data property names
+		// If a data property was specified
+		if ( getByName ) {
+
+			// First Try to find as-is property data
+			ret = thisCache[ name ];
+
+			// Test for null|undefined property data
+			if ( ret == null ) {
+
+				// Try to find the camelCased property
+				ret = thisCache[ jQuery.camelCase( name ) ];
+			}
+		} else {
+			ret = thisCache;
+		}
+
+		return ret;
+	},
+
+	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+		if ( !jQuery.acceptData( elem ) ) {
+			return;
+		}
+
+		var thisCache, i, l,
+
+			isNode = elem.nodeType,
+
+			// See jQuery.data for more information
+			cache = isNode ? jQuery.cache : elem,
+			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+		// If there is already no cache entry for this object, there is no
+		// purpose in continuing
+		if ( !cache[ id ] ) {
+			return;
+		}
+
+		if ( name ) {
+
+			thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+			if ( thisCache ) {
+
+				// Support array or space separated string names for data keys
+				if ( !jQuery.isArray( name ) ) {
+
+					// try the string as a key before any manipulation
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+
+						// split the camel cased version by spaces unless a key with the spaces exists
+						name = jQuery.camelCase( name );
+						if ( name in thisCache ) {
+							name = [ name ];
+						} else {
+							name = name.split(" ");
+						}
+					}
+				}
+
+				for ( i = 0, l = name.length; i < l; i++ ) {
+					delete thisCache[ name[i] ];
+				}
+
+				// If there is no data left in the cache, we want to continue
+				// and let the cache object itself get destroyed
+				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+					return;
+				}
+			}
+		}
+
+		// See jQuery.data for more information
+		if ( !pvt ) {
+			delete cache[ id ].data;
+
+			// Don't destroy the parent cache unless the internal data object
+			// had been the only thing left in it
+			if ( !isEmptyDataObject( cache[ id ] ) ) {
+				return;
+			}
+		}
+
+		// Destroy the cache
+		if ( isNode ) {
+			jQuery.cleanData( [ elem ], true );
+
+		// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+		} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+			delete cache[ id ];
+
+		// When all else fails, null
+		} else {
+			cache[ id ] = null;
+		}
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return jQuery.data( elem, name, data, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var parts, part, attr, name, l,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attr = elem.attributes;
+					for ( l = attr.length; i < l; i++ ) {
+						name = attr[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.substring(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		parts = key.split( ".", 2 );
+		parts[1] = parts[1] ? "." + parts[1] : "";
+		part = parts[1] + "!";
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
+
+				// Try to fetch any internally stored data first
+				if ( data === undefined && elem ) {
+					data = jQuery.data( elem, key );
+					data = dataAttr( elem, key, data );
+				}
+
+				return data === undefined && parts[1] ?
+					this.data( parts[0] ) :
+					data;
+			}
+
+			parts[1] = value;
+			this.each(function() {
+				var self = jQuery( this );
+
+				self.triggerHandler( "setData" + part, parts );
+				jQuery.data( this, key, value );
+				self.triggerHandler( "changeData" + part, parts );
+			});
+		}, null, value, arguments.length > 1, null, false );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+				data === "false" ? false :
+				data === "null" ? null :
+				// Only convert to a number if it doesn't change the string
+				+data + "" === data ? +data :
+				rbrace.test( data ) ? jQuery.parseJSON( data ) :
+					data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery.removeData( elem, type + "queue", true );
+				jQuery.removeData( elem, key, true );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook, fixSpecified,
+	rclass = /[\t\r\n]/g,
+	rreturn = /\r/g,
+	rtype = /^(?:button|input)$/i,
+	rfocusable = /^(?:button|input|object|select|textarea)$/i,
+	rclickable = /^a(?:rea|)$/i,
+	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classNames, i, l, elem,
+			setClass, c, cl;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call(this, j, this.className) );
+			});
+		}
+
+		if ( value && typeof value === "string" ) {
+			classNames = value.split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+
+				if ( elem.nodeType === 1 ) {
+					if ( !elem.className && classNames.length === 1 ) {
+						elem.className = value;
+
+					} else {
+						setClass = " " + elem.className + " ";
+
+						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+							if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
+								setClass += classNames[ c ] + " ";
+							}
+						}
+						elem.className = jQuery.trim( setClass );
+					}
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var removes, className, elem, c, cl, i, l;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call(this, j, this.className) );
+			});
+		}
+		if ( (value && typeof value === "string") || value === undefined ) {
+			removes = ( value || "" ).split( core_rspace );
+
+			for ( i = 0, l = this.length; i < l; i++ ) {
+				elem = this[ i ];
+				if ( elem.nodeType === 1 && elem.className ) {
+
+					className = (" " + elem.className + " ").replace( rclass, " " );
+
+					// loop over each item in the removal list
+					for ( c = 0, cl = removes.length; c < cl; c++ ) {
+						// Remove until there is nothing to remove,
+						while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
+							className = className.replace( " " + removes[ c ] + " " , " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( className ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.split( core_rspace );
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			} else if ( type === "undefined" || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// toggle whole className
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var hooks, ret, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val,
+				self = jQuery(this);
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+							// Don't return options that are disabled or in a disabled optgroup
+							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+	attrFn: {},
+
+	attr: function( elem, name, value, pass ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+			return jQuery( elem )[ name ]( value );
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === "undefined" ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+				return;
+
+			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			ret = elem.getAttribute( name );
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret === null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var propName, attrNames, name, isBool,
+			i = 0;
+
+		if ( value && elem.nodeType === 1 ) {
+
+			attrNames = value.split( core_rspace );
+
+			for ( ; i < attrNames.length; i++ ) {
+				name = attrNames[ i ];
+
+				if ( name ) {
+					propName = jQuery.propFix[ name ] || name;
+					isBool = rboolean.test( name );
+
+					// See #9699 for explanation of this approach (setting first, then removal)
+					// Do not do this for boolean attributes (see #10870)
+					if ( !isBool ) {
+						jQuery.attr( elem, name, "" );
+					}
+					elem.removeAttribute( getSetAttribute ? name : propName );
+
+					// Set corresponding property to false for boolean attributes
+					if ( isBool && propName in elem ) {
+						elem[ propName ] = false;
+					}
+				}
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				// We can't allow the type property to be changed (since it causes problems in IE)
+				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+					jQuery.error( "type property can't be changed" );
+				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to it's default in case type is set after value
+					// This is for element creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		},
+		// Use the value property for back compat
+		// Use the nodeHook for button elements in IE6/7 (#1954)
+		value: {
+			get: function( elem, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.get( elem, name );
+				}
+				return name in elem ?
+					elem.value :
+					null;
+			},
+			set: function( elem, value, name ) {
+				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+					return nodeHook.set( elem, value, name );
+				}
+				// Does not return so that setAttribute is also used
+				elem.value = value;
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		// Align boolean attributes with corresponding properties
+		// Fall back to attribute presence where some booleans are not supported
+		var attrNode,
+			property = jQuery.prop( elem, name );
+		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		var propName;
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else {
+			// value is true since we know at this point it's type boolean and not false
+			// Set boolean attributes to the same name and set the DOM property
+			propName = jQuery.propFix[ name ] || name;
+			if ( propName in elem ) {
+				// Only set the IDL specifically if it already exists on the element
+				elem[ propName ] = true;
+			}
+
+			elem.setAttribute( name, name.toLowerCase() );
+		}
+		return name;
+	}
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	fixSpecified = {
+		name: true,
+		id: true,
+		coords: true
+	};
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret;
+			ret = elem.getAttributeNode( name );
+			return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				ret = document.createAttribute( name );
+				elem.setAttributeNode( ret );
+			}
+			return ( ret.value = value + "" );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			if ( value === "" ) {
+				value = "false";
+			}
+			nodeHook.set( elem, value, name );
+		}
+	};
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret === null ? undefined : ret;
+			}
+		});
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Normalize to lowercase since IE uppercases css property names
+			return elem.style.cssText.toLowerCase() || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+	rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+	rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	hoverHack = function( events ) {
+		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+	};
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	add: function( elem, types, handler, data, selector ) {
+
+		var elemData, eventHandle, events,
+			t, tns, type, namespaces, handleObj,
+			handleObjIn, handlers, special;
+
+		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
+		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		events = elemData.events;
+		if ( !events ) {
+			elemData.events = events = {};
+		}
+		eventHandle = elemData.handle;
+		if ( !eventHandle ) {
+			elemData.handle = eventHandle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = jQuery.trim( hoverHack(types) ).split( " " );
+		for ( t = 0; t < types.length; t++ ) {
+
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = tns[1];
+			namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: tns[1],
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			handlers = events[ type ];
+			if ( !handlers ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	global: {},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+
+		var t, tns, type, origType, namespaces, origCount,
+			j, events, special, eventType, handleObj,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+		for ( t = 0; t < types.length; t++ ) {
+			tns = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tns[1];
+			namespaces = tns[2];
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector? special.delegateType : special.bindType ) || type;
+			eventType = events[ type ] || [];
+			origCount = eventType.length;
+			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+
+			// Remove matching events
+			for ( j = 0; j < eventType.length; j++ ) {
+				handleObj = eventType[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					 ( !handler || handler.guid === handleObj.guid ) &&
+					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					eventType.splice( j--, 1 );
+
+					if ( handleObj.selector ) {
+						eventType.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( eventType.length === 0 && origCount !== eventType.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery.removeData( elem, "events", true );
+		}
+	},
+
+	// Events that are safe to short-circuit if no handlers are attached.
+	// Native DOM events should not be added, they may have inline handlers.
+	customEvent: {
+		"getData": true,
+		"setData": true,
+		"changeData": true
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		// Don't do events on text and comment nodes
+		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+			return;
+		}
+
+		// Event object or event type
+		var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+			type = event.type || event,
+			namespaces = [];
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf( "!" ) >= 0 ) {
+			// Exclusive events trigger only for the exact event (no namespaces)
+			type = type.slice(0, -1);
+			exclusive = true;
+		}
+
+		if ( type.indexOf( "." ) >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+
+		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+			// No jQuery handlers for this event type, and it can't have inline handlers
+			return;
+		}
+
+		// Caller can pass in an Event, Object, or just an event type string
+		event = typeof event === "object" ?
+			// jQuery.Event object
+			event[ jQuery.expando ] ? event :
+			// Object literal
+			new jQuery.Event( type, event ) :
+			// Just the event type (string)
+			new jQuery.Event( type );
+
+		event.type = type;
+		event.isTrigger = true;
+		event.exclusive = exclusive;
+		event.namespace = namespaces.join( "." );
+		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+		// Handle a global trigger
+		if ( !elem ) {
+
+			// TODO: Stop taunting the data cache; remove global events and always attach to document
+			cache = jQuery.cache;
+			for ( i in cache ) {
+				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+				}
+			}
+			return;
+		}
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data != null ? jQuery.makeArray( data ) : [];
+		data.unshift( event );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		eventPath = [[ elem, special.bindType || type ]];
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+			for ( old = elem; cur; cur = cur.parentNode ) {
+				eventPath.push([ cur, bubbleType ]);
+				old = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( old === (elem.ownerDocument || document) ) {
+				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+			}
+		}
+
+		// Fire handlers on the event path
+		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
+
+			cur = eventPath[i][0];
+			event.type = eventPath[i][1];
+
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+			// Note that this is a bare JS function and not a jQuery handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				// IE<9 dies on focus/blur to hidden element (#1486)
+				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					old = elem[ ontype ];
+
+					if ( old ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					elem[ type ]();
+					jQuery.event.triggered = undefined;
+
+					if ( old ) {
+						elem[ ontype ] = old;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event || window.event );
+
+		var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+			handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+			delegateCount = handlers.delegateCount,
+			args = core_slice.call( arguments ),
+			run_all = !event.exclusive && !event.namespace,
+			special = jQuery.event.special[ event.type ] || {},
+			handlerQueue = [];
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers that should run if there are delegated events
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && !(event.button && event.type === "click") ) {
+
+			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.disabled !== true || event.type !== "click" ) {
+					selMatch = {};
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+						sel = handleObj.selector;
+
+						if ( selMatch[ sel ] === undefined ) {
+							selMatch[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( selMatch[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, matches: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( handlers.length > delegateCount ) {
+			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+		}
+
+		// Run delegates first; they may want to stop propagation beneath us
+		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+			matched = handlerQueue[ i ];
+			event.currentTarget = matched.elem;
+
+			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+				handleObj = matched.matches[ j ];
+
+				// Triggered event must either 1) be non-exclusive and have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.data = handleObj.data;
+					event.handleObj = handleObj;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						event.result = ret;
+						if ( ret === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var eventDoc, doc, body,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop,
+			originalEvent = event,
+			fixHook = jQuery.event.fixHooks[ event.type ] || {},
+			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = jQuery.Event( originalEvent );
+
+		for ( i = copy.length; i; ) {
+			prop = copy[ --i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Target should not be a text node (#504, Safari)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+
+		focus: {
+			delegateType: "focusin"
+		},
+		blur: {
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			setup: function( data, namespaces, eventHandle ) {
+				// We only want to do this special case on windows
+				if ( jQuery.isWindow( this ) ) {
+					this.onbeforeunload = eventHandle;
+				}
+			},
+
+			teardown: function( namespaces, eventHandle ) {
+				if ( this.onbeforeunload === eventHandle ) {
+					this.onbeforeunload = null;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === "undefined" ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+	return false;
+}
+function returnTrue() {
+	return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	preventDefault: function() {
+		this.isDefaultPrevented = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+
+		// if preventDefault exists run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// otherwise set the returnValue property of the original event to false (IE)
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		this.isPropagationStopped = returnTrue;
+
+		var e = this.originalEvent;
+		if ( !e ) {
+			return;
+		}
+		// if stopPropagation exists run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+		// otherwise set the cancelBubble property of the original event to true (IE)
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	},
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj,
+				selector = handleObj.selector;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "_submit_attached", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "_change_attached", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var origFn, type;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) { // && selector != null
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	live: function( types, data, fn ) {
+		jQuery( this.context ).on( types, this.selector, data, fn );
+		return this;
+	},
+	die: function( types, fn ) {
+		jQuery( this.context ).off( types, this.selector || "**", fn );
+		return this;
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		if ( this[0] ) {
+			return jQuery.event.trigger( type, data, this[0], true );
+		}
+	},
+
+	toggle: function( fn ) {
+		// Save reference to arguments for access in closure
+		var args = arguments,
+			guid = fn.guid || jQuery.guid++,
+			i = 0,
+			toggler = function( event ) {
+				// Figure out which function to execute
+				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+				// Make sure that clicks stop
+				event.preventDefault();
+
+				// and execute the function
+				return args[ lastToggle ].apply( this, arguments ) || false;
+			};
+
+		// link all the functions, so any of them can unbind this click handler
+		toggler.guid = guid;
+		while ( i < args.length ) {
+			args[ i++ ].guid = guid;
+		}
+
+		return this.click( toggler );
+	},
+
+	hover: function( fnOver, fnOut ) {
+		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+	}
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		if ( fn == null ) {
+			fn = data;
+			data = null;
+		}
+
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+
+	if ( rkeyEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+	}
+
+	if ( rmouseEvent.test( name ) ) {
+		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var cachedruns,
+	assertGetIdNotName,
+	Expr,
+	getText,
+	isXML,
+	contains,
+	compile,
+	sortOrder,
+	hasDuplicate,
+	outermostContext,
+
+	baseHasDuplicate = true,
+	strundefined = "undefined",
+
+	expando = ( "sizcache" + Math.random() ).replace( ".", "" ),
+
+	Token = String,
+	document = window.document,
+	docElem = document.documentElement,
+	dirruns = 0,
+	done = 0,
+	pop = [].pop,
+	push = [].push,
+	slice = [].slice,
+	// Use a stripped-down indexOf if a native one is unavailable
+	indexOf = [].indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+	// Augment a function for special use by Sizzle
+	markFunction = function( fn, value ) {
+		fn[ expando ] = value == null || value;
+		return fn;
+	},
+
+	createCache = function() {
+		var cache = {},
+			keys = [];
+
+		return markFunction(function( key, value ) {
+			// Only keep the most recent entries
+			if ( keys.push( key ) > Expr.cacheLength ) {
+				delete cache[ keys.shift() ];
+			}
+
+			// Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)
+			return (cache[ key + " " ] = value);
+		}, cache );
+	},
+
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// Regex
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments not in parens/brackets,
+	//   then attribute selectors and non-pseudos (denoted by :),
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
+
+	// For matchExpr.POS and matchExpr.needsContext
+	pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+		"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
+
+	rnot = /^:not/,
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+	rendsWithNot = /:not\($/,
+
+	rheader = /h\d/i,
+	rinputs = /input|select|textarea|button/i,
+
+	rbackslash = /\\(?!\\)/g,
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"POS": new RegExp( pos, "i" ),
+		"CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		// For use in libraries implementing .is()
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )
+	},
+
+	// Support
+
+	// Used for testing something on an element
+	assert = function( fn ) {
+		var div = document.createElement("div");
+
+		try {
+			return fn( div );
+		} catch (e) {
+			return false;
+		} finally {
+			// release memory in IE
+			div = null;
+		}
+	},
+
+	// Check if getElementsByTagName("*") returns only elements
+	assertTagNameNoComments = assert(function( div ) {
+		div.appendChild( document.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	}),
+
+	// Check if getAttribute returns normalized href attributes
+	assertHrefNotNormalized = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}),
+
+	// Check if attributes should be retrieved by attribute nodes
+	assertAttributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	}),
+
+	// Check if getElementsByClassName can be trusted
+	assertUsableClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	}),
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	assertUsableName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = document.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			document.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			document.getElementsByName( expando + 0 ).length;
+		assertGetIdNotName = !document.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+// If slice is not available, provide a backup
+try {
+	slice.call( docElem.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		for ( ; (elem = this[i]); i++ ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+function Sizzle( selector, context, results, seed ) {
+	results = results || [];
+	context = context || document;
+	var match, elem, xml, m,
+		nodeType = context.nodeType;
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( nodeType !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	xml = isXML( context );
+
+	if ( !xml && !seed ) {
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );
+}
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	return Sizzle( expr, null, null, [ elem ] ).length > 0;
+};
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( nodeType ) {
+		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+			// Use textContent for elements
+			// innerText usage removed for consistency of new lines (see #11153)
+			if ( typeof elem.textContent === "string" ) {
+				return elem.textContent;
+			} else {
+				// Traverse its children
+				for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+					ret += getText( elem );
+				}
+			}
+		} else if ( nodeType === 3 || nodeType === 4 ) {
+			return elem.nodeValue;
+		}
+		// Do not include comment or processing instruction nodes
+	} else {
+
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	}
+	return ret;
+};
+
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+// Element contains another
+contains = Sizzle.contains = docElem.contains ?
+	function( a, b ) {
+		var adown = a.nodeType === 9 ? a.documentElement : a,
+			bup = b && b.parentNode;
+		return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );
+	} :
+	docElem.compareDocumentPosition ?
+	function( a, b ) {
+		return b && !!( a.compareDocumentPosition( b ) & 16 );
+	} :
+	function( a, b ) {
+		while ( (b = b.parentNode) ) {
+			if ( b === a ) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+Sizzle.attr = function( elem, name ) {
+	var val,
+		xml = isXML( elem );
+
+	if ( !xml ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( xml || assertAttributes ) {
+		return elem.getAttribute( name );
+	}
+	val = elem.getAttributeNode( name );
+	return val ?
+		typeof elem[ name ] === "boolean" ?
+			elem[ name ] ? name : null :
+			val.specified ? val.value : null :
+		null;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	// IE6/7 return a modified href
+	attrHandle: assertHrefNotNormalized ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		},
+
+	find: {
+		"ID": assertGetIdNotName ?
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					return m && m.parentNode ? [m] : [];
+				}
+			} :
+			function( id, context, xml ) {
+				if ( typeof context.getElementById !== strundefined && !xml ) {
+					var m = context.getElementById( id );
+
+					return m ?
+						m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+							[m] :
+							undefined :
+						[];
+				}
+			},
+
+		"TAG": assertTagNameNoComments ?
+			function( tag, context ) {
+				if ( typeof context.getElementsByTagName !== strundefined ) {
+					return context.getElementsByTagName( tag );
+				}
+			} :
+			function( tag, context ) {
+				var results = context.getElementsByTagName( tag );
+
+				// Filter out possible comments
+				if ( tag === "*" ) {
+					var elem,
+						tmp = [],
+						i = 0;
+
+					for ( ; (elem = results[i]); i++ ) {
+						if ( elem.nodeType === 1 ) {
+							tmp.push( elem );
+						}
+					}
+
+					return tmp;
+				}
+				return results;
+			},
+
+		"NAME": assertUsableName && function( tag, context ) {
+			if ( typeof context.getElementsByName !== strundefined ) {
+				return context.getElementsByName( name );
+			}
+		},
+
+		"CLASS": assertUsableClassName && function( className, context, xml ) {
+			if ( typeof context.getElementsByClassName !== strundefined && !xml ) {
+				return context.getElementsByClassName( className );
+			}
+		}
+	},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( rbackslash, "" );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				3 xn-component of xn+y argument ([+-]?\d*n|)
+				4 sign of xn-component
+				5 x of xn-component
+				6 sign of y-component
+				7 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1] === "nth" ) {
+				// nth-child requires argument
+				if ( !match[2] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );
+				match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[2] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var unquoted, excess;
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			if ( match[3] ) {
+				match[2] = match[3];
+			} else if ( (unquoted = match[4]) ) {
+				// Only check arguments that contain a pseudo
+				if ( rpseudo.test(unquoted) &&
+					// Get excess from tokenize (recursively)
+					(excess = tokenize( unquoted, true )) &&
+					// advance to the next closing parenthesis
+					(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+					// excess is a negative index
+					unquoted = unquoted.slice( 0, excess );
+					match[0] = match[0].slice( 0, excess );
+				}
+				match[2] = unquoted;
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+		"ID": assertGetIdNotName ?
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					return elem.getAttribute("id") === id;
+				};
+			} :
+			function( id ) {
+				id = id.replace( rbackslash, "" );
+				return function( elem ) {
+					var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+					return node && node.value === id;
+				};
+			},
+
+		"TAG": function( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+			nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();
+
+			return function( elem ) {
+				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+			};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ expando ][ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem, context ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.substr( result.length - check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, argument, first, last ) {
+
+			if ( type === "nth" ) {
+				return function( elem ) {
+					var node, diff,
+						parent = elem.parentNode;
+
+					if ( first === 1 && last === 0 ) {
+						return true;
+					}
+
+					if ( parent ) {
+						diff = 0;
+						for ( node = parent.firstChild; node; node = node.nextSibling ) {
+							if ( node.nodeType === 1 ) {
+								diff++;
+								if ( elem === node ) {
+									break;
+								}
+							}
+						}
+					}
+
+					// Incorporate the offset (or cast to NaN), then check against cycle size
+					diff -= last;
+					return diff === first || ( diff % first === 0 && diff / first >= 0 );
+				};
+			}
+
+			return function( elem ) {
+				var node = elem;
+
+				switch ( type ) {
+					case "only":
+					case "first":
+						while ( (node = node.previousSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						if ( type === "first" ) {
+							return true;
+						}
+
+						node = elem;
+
+						/* falls through */
+					case "last":
+						while ( (node = node.nextSibling) ) {
+							if ( node.nodeType === 1 ) {
+								return false;
+							}
+						}
+
+						return true;
+				}
+			};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			var nodeType;
+			elem = elem.firstChild;
+			while ( elem ) {
+				if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {
+					return false;
+				}
+				elem = elem.nextSibling;
+			}
+			return true;
+		},
+
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"text": function( elem ) {
+			var type, attr;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				(type = elem.type) === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );
+		},
+
+		// Input types
+		"radio": createInputPseudo("radio"),
+		"checkbox": createInputPseudo("checkbox"),
+		"file": createInputPseudo("file"),
+		"password": createInputPseudo("password"),
+		"image": createInputPseudo("image"),
+
+		"submit": createButtonPseudo("submit"),
+		"reset": createButtonPseudo("reset"),
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"focus": function( elem ) {
+			var doc = elem.ownerDocument;
+			return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		"active": function( elem ) {
+			return elem === elem.ownerDocument.activeElement;
+		},
+
+		// Positional types
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			for ( var i = 0; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			for ( var i = 1; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+function siblingCheck( a, b, ret ) {
+	if ( a === b ) {
+		return ret;
+	}
+
+	var cur = a.nextSibling;
+
+	while ( cur ) {
+		if ( cur === b ) {
+			return -1;
+		}
+
+		cur = cur.nextSibling;
+	}
+
+	return 1;
+}
+
+sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?
+			a.compareDocumentPosition :
+			a.compareDocumentPosition(b) & 4
+		) ? -1 : 1;
+	} :
+	function( a, b ) {
+		// The nodes are identical, we can exit early
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Fallback to using sourceIndex (in IE) if it's available on both nodes
+		} else if ( a.sourceIndex && b.sourceIndex ) {
+			return a.sourceIndex - b.sourceIndex;
+		}
+
+		var al, bl,
+			ap = [],
+			bp = [],
+			aup = a.parentNode,
+			bup = b.parentNode,
+			cur = aup;
+
+		// If the nodes are siblings (or identical) we can do a quick check
+		if ( aup === bup ) {
+			return siblingCheck( a, b );
+
+		// If no parents were found then the nodes are disconnected
+		} else if ( !aup ) {
+			return -1;
+
+		} else if ( !bup ) {
+			return 1;
+		}
+
+		// Otherwise they're somewhere else in the tree so we need
+		// to build up a full list of the parentNodes for comparison
+		while ( cur ) {
+			ap.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		cur = bup;
+
+		while ( cur ) {
+			bp.unshift( cur );
+			cur = cur.parentNode;
+		}
+
+		al = ap.length;
+		bl = bp.length;
+
+		// Start walking down the tree looking for a discrepancy
+		for ( var i = 0; i < al && i < bl; i++ ) {
+			if ( ap[i] !== bp[i] ) {
+				return siblingCheck( ap[i], bp[i] );
+			}
+		}
+
+		// We ended someplace up the tree so do a sibling check
+		return i === al ?
+			siblingCheck( a, bp[i], -1 ) :
+			siblingCheck( ap[i], b, 1 );
+	};
+
+// Always assume the presence of duplicates if sort doesn't
+// pass them to our comparison function (as in Google Chrome).
+[0, 0].sort( sortOrder );
+baseHasDuplicate = !hasDuplicate;
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		i = 1,
+		j = 0;
+
+	hasDuplicate = baseHasDuplicate;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	return results;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ expando ][ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			tokens.push( matched = new Token( match.shift() ) );
+			soFar = soFar.slice( matched.length );
+
+			// Cast descendant combinators to space
+			matched.type = match[0].replace( rtrim, " " );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+
+				tokens.push( matched = new Token( match.shift() ) );
+				soFar = soFar.slice( matched.length );
+				matched.type = type;
+				matched.matches = match;
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && combinator.dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( checkNonElements || elem.nodeType === 1  ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( !xml ) {
+				var cache,
+					dirkey = dirruns + " " + doneName + " ",
+					cachedkey = dirkey + cachedruns;
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( (cache = elem[ expando ]) === cachedkey ) {
+							return elem.sizset;
+						} else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {
+							if ( elem.sizset ) {
+								return elem;
+							}
+						} else {
+							elem[ expando ] = cachedkey;
+							if ( matcher( elem, context, xml ) ) {
+								elem.sizset = true;
+								return elem;
+							}
+							elem.sizset = false;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( checkNonElements || elem.nodeType === 1 ) {
+						if ( matcher( elem, context, xml ) ) {
+							return elem;
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && tokens.join("")
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	var bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Nested matchers should use non-integer dirruns
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = superMatcher.el;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					for ( j = 0; (matcher = elementMatchers[j]); j++ ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++superMatcher.el;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				for ( j = 0; (matcher = setMatchers[j]); j++ ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	superMatcher.el = 0;
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ expando ][ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed, xml ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector ),
+		j = match.length;
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					context.nodeType === 9 && !xml &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];
+				if ( !context ) {
+					return results;
+				}
+
+				selector = selector.slice( tokens.shift().length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( rbackslash, "" ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context,
+						xml
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && tokens.join("");
+						if ( !selector ) {
+							push.apply( results, slice.call( seed, 0 ) );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		xml,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+if ( document.querySelectorAll ) {
+	(function() {
+		var disconnectedMatch,
+			oldSelect = select,
+			rescape = /'|\\/g,
+			rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+			// qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA
+			// A support test would require too much code (would include document ready)
+			rbuggyQSA = [ ":focus" ],
+
+			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+			// A support test would require too much code (would include document ready)
+			// just skip matchesSelector for :active
+			rbuggyMatches = [ ":active" ],
+			matches = docElem.matchesSelector ||
+				docElem.mozMatchesSelector ||
+				docElem.webkitMatchesSelector ||
+				docElem.oMatchesSelector ||
+				docElem.msMatchesSelector;
+
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here (do not put tests after this one)
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Opera 10-12/IE9 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<p test=''></p>";
+			if ( div.querySelectorAll("[test^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here (do not put tests after this one)
+			div.innerHTML = "<input type='hidden'/>";
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push(":enabled", ":disabled");
+			}
+		});
+
+		// rbuggyQSA always contains :focus, so no need for a length check
+		rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") );
+
+		select = function( selector, context, results, seed, xml ) {
+			// Only use querySelectorAll when not filtering,
+			// when this is not xml,
+			// and when no QSA bugs apply
+			if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {
+				var groups, i,
+					old = true,
+					nid = expando,
+					newContext = context,
+					newSelector = context.nodeType === 9 && selector;
+
+				// qSA works strangely on Element-rooted queries
+				// We can work around this by specifying an extra ID on the root
+				// and working up from there (Thanks to Andrew Dupont for the technique)
+				// IE 8 doesn't work on object elements
+				if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+					groups = tokenize( selector );
+
+					if ( (old = context.getAttribute("id")) ) {
+						nid = old.replace( rescape, "\\$&" );
+					} else {
+						context.setAttribute( "id", nid );
+					}
+					nid = "[id='" + nid + "'] ";
+
+					i = groups.length;
+					while ( i-- ) {
+						groups[i] = nid + groups[i].join("");
+					}
+					newContext = rsibling.test( selector ) && context.parentNode || context;
+					newSelector = groups.join(",");
+				}
+
+				if ( newSelector ) {
+					try {
+						push.apply( results, slice.call( newContext.querySelectorAll(
+							newSelector
+						), 0 ) );
+						return results;
+					} catch(qsaError) {
+					} finally {
+						if ( !old ) {
+							context.removeAttribute("id");
+						}
+					}
+				}
+			}
+
+			return oldSelect( selector, context, results, seed, xml );
+		};
+
+		if ( matches ) {
+			assert(function( div ) {
+				// Check to see if it's possible to do matchesSelector
+				// on a disconnected node (IE 9)
+				disconnectedMatch = matches.call( div, "div" );
+
+				// This should fail with an exception
+				// Gecko does not error, returns false instead
+				try {
+					matches.call( div, "[test!='']:sizzle" );
+					rbuggyMatches.push( "!=", pseudos );
+				} catch ( e ) {}
+			});
+
+			// rbuggyMatches always contains :active and :focus, so no need for a length check
+			rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );
+
+			Sizzle.matchesSelector = function( elem, expr ) {
+				// Make sure that attribute selectors are quoted
+				expr = expr.replace( rattributeQuotes, "='$1']" );
+
+				// rbuggyMatches always contains :active, so no need for an existence check
+				if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {
+					try {
+						var ret = matches.call( elem, expr );
+
+						// IE 9's matchesSelector returns false on disconnected nodes
+						if ( ret || disconnectedMatch ||
+								// As well, disconnected nodes are said to be in a document
+								// fragment in IE 9
+								elem.document && elem.document.nodeType !== 11 ) {
+							return ret;
+						}
+					} catch(e) {}
+				}
+
+				return Sizzle( expr, null, null, [ elem ] ).length > 0;
+			};
+		}
+	})();
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Back-compat
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var i, l, length, n, r, ret,
+			self = this;
+
+		if ( typeof selector !== "string" ) {
+			return jQuery( selector ).filter(function() {
+				for ( i = 0, l = self.length; i < l; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			});
+		}
+
+		ret = this.pushStack( "", "find", selector );
+
+		for ( i = 0, l = this.length; i < l; i++ ) {
+			length = ret.length;
+			jQuery.find( selector, this[i], ret );
+
+			if ( i > 0 ) {
+				// Make sure that the results are unique
+				for ( n = length; n < ret.length; n++ ) {
+					for ( r = 0; r < length; r++ ) {
+						if ( ret[r] === ret[n] ) {
+							ret.splice(n--, 1);
+							break;
+						}
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false), "not", selector);
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true), "filter", selector );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional/relative selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+		return this.pushStack( ret, "closest", selectors );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+			all :
+			jQuery.unique( all ) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+	return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( this.length > 1 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem, i ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+	safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	rnocache = /<(?:script|object|embed|option|style)/i,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rcheckableType = /^(?:checkbox|radio)$/,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /\/(java|ecma)script/i,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		area: [ 1, "<map>", "</map>" ],
+		_default: [ 0, "", "" ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+	wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+		}
+	},
+
+	after: function() {
+		if ( !isDisconnected( this[0] ) ) {
+			return this.domManip(arguments, false, function( elem ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			});
+		}
+
+		if ( arguments.length ) {
+			var set = jQuery.clean( arguments );
+			return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+		}
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( elem.getElementsByTagName("*") );
+					jQuery.cleanData( [ elem ] );
+				}
+
+				if ( elem.parentNode ) {
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( elem.getElementsByTagName("*") );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		if ( !isDisconnected( this[0] ) ) {
+			// Make sure that the elements are removed from the DOM before they are inserted
+			// this can help fix replacing a parent with child elements
+			if ( jQuery.isFunction( value ) ) {
+				return this.each(function(i) {
+					var self = jQuery(this), old = self.html();
+					self.replaceWith( value.call( this, i, old ) );
+				});
+			}
+
+			if ( typeof value !== "string" ) {
+				value = jQuery( value ).detach();
+			}
+
+			return this.each(function() {
+				var next = this.nextSibling,
+					parent = this.parentNode;
+
+				jQuery( this ).remove();
+
+				if ( next ) {
+					jQuery(next).before( value );
+				} else {
+					jQuery(parent).append( value );
+				}
+			});
+		}
+
+		return this.length ?
+			this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+			this;
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+
+		// Flatten any nested arrays
+		args = [].concat.apply( [], args );
+
+		var results, first, fragment, iNoClone,
+			i = 0,
+			value = args[0],
+			scripts = [],
+			l = this.length;
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+			return this.each(function() {
+				jQuery(this).domManip( args, table, callback );
+			});
+		}
+
+		if ( jQuery.isFunction(value) ) {
+			return this.each(function(i) {
+				var self = jQuery(this);
+				args[0] = value.call( this, i, table ? self.html() : undefined );
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( this[0] ) {
+			results = jQuery.buildFragment( args, this, scripts );
+			fragment = results.fragment;
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				// Fragments from the fragment cache must always be cloned and never used in place.
+				for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							this[i],
+						i === iNoClone ?
+							fragment :
+							jQuery.clone( fragment, true, true )
+					);
+				}
+			}
+
+			// Fix #11809: Avoid leaking memory
+			fragment = first = null;
+
+			if ( scripts.length ) {
+				jQuery.each( scripts, function( i, elem ) {
+					if ( elem.src ) {
+						if ( jQuery.ajax ) {
+							jQuery.ajax({
+								url: elem.src,
+								type: "GET",
+								dataType: "script",
+								async: false,
+								global: false,
+								"throws": true
+							});
+						} else {
+							jQuery.error("no ajax");
+						}
+					} else {
+						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+					}
+
+					if ( elem.parentNode ) {
+						elem.parentNode.removeChild( elem );
+					}
+				});
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function cloneFixAttributes( src, dest ) {
+	var nodeName;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	// clearAttributes removes the attributes, which we don't want,
+	// but also removes the attachEvent events, which we *do* want
+	if ( dest.clearAttributes ) {
+		dest.clearAttributes();
+	}
+
+	// mergeAttributes, in contrast, only merges back on the
+	// original attributes, not the events
+	if ( dest.mergeAttributes ) {
+		dest.mergeAttributes( src );
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	if ( nodeName === "object" ) {
+		// IE6-10 improperly clones children of object elements using classid.
+		// IE10 throws NoModificationAllowedError if parent is null, #12132.
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+
+	// IE blanks contents when cloning scripts
+	} else if ( nodeName === "script" && dest.text !== src.text ) {
+		dest.text = src.text;
+	}
+
+	// Event data gets referenced instead of copied if the expando
+	// gets copied too
+	dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+	var fragment, cacheable, cachehit,
+		first = args[ 0 ];
+
+	// Set context from what may come in as undefined or a jQuery collection or a node
+	// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+	// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+	context = context || document;
+	context = !context.nodeType && context[0] || context;
+	context = context.ownerDocument || context;
+
+	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+	// Cloning options loses the selected state, so don't cache them
+	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+	if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+		first.charAt(0) === "<" && !rnocache.test( first ) &&
+		(jQuery.support.checkClone || !rchecked.test( first )) &&
+		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+		// Mark cacheable and look for a hit
+		cacheable = true;
+		fragment = jQuery.fragments[ first ];
+		cachehit = fragment !== undefined;
+	}
+
+	if ( !fragment ) {
+		fragment = context.createDocumentFragment();
+		jQuery.clean( args, context, fragment, scripts );
+
+		// Update the cache, but only store false
+		// unless this is a second parsing of the same content
+		if ( cacheable ) {
+			jQuery.fragments[ first ] = cachehit && fragment;
+		}
+	}
+
+	return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			l = insert.length,
+			parent = this.length === 1 && this[0].parentNode;
+
+		if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+			insert[ original ]( this[0] );
+			return this;
+		} else {
+			for ( ; i < l; i++ ) {
+				elems = ( i > 0 ? this.clone(true) : this ).get();
+				jQuery( insert[i] )[ original ]( elems );
+				ret = ret.concat( elems );
+			}
+
+			return this.pushStack( ret, name, insert.selector );
+		}
+	};
+});
+
+function getAll( elem ) {
+	if ( typeof elem.getElementsByTagName !== "undefined" ) {
+		return elem.getElementsByTagName( "*" );
+
+	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
+		return elem.querySelectorAll( "*" );
+
+	} else {
+		return [];
+	}
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var srcElements,
+			destElements,
+			i,
+			clone;
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+			// IE copies events bound via attachEvent when using cloneNode.
+			// Calling detachEvent on the clone will also remove the events
+			// from the original. In order to get around this, we use some
+			// proprietary methods to clear the events. Thanks to MooTools
+			// guys for this hotness.
+
+			cloneFixAttributes( elem, clone );
+
+			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+			srcElements = getAll( elem );
+			destElements = getAll( clone );
+
+			// Weird iteration because IE will replace the length property
+			// with an element if you are cloning the body and one of the
+			// elements on the page has a name or id of "length"
+			for ( i = 0; srcElements[i]; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					cloneFixAttributes( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			cloneCopyEvent( elem, clone );
+
+			if ( deepDataAndEvents ) {
+				srcElements = getAll( elem );
+				destElements = getAll( clone );
+
+				for ( i = 0; srcElements[i]; ++i ) {
+					cloneCopyEvent( srcElements[i], destElements[i] );
+				}
+			}
+		}
+
+		srcElements = destElements = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	clean: function( elems, context, fragment, scripts ) {
+		var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+			safe = context === document && safeFragment,
+			ret = [];
+
+		// Ensure that context is a document
+		if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+			context = document;
+		}
+
+		// Use the already-created safe fragment if context permits
+		for ( i = 0; (elem = elems[i]) != null; i++ ) {
+			if ( typeof elem === "number" ) {
+				elem += "";
+			}
+
+			if ( !elem ) {
+				continue;
+			}
+
+			// Convert html string into DOM nodes
+			if ( typeof elem === "string" ) {
+				if ( !rhtml.test( elem ) ) {
+					elem = context.createTextNode( elem );
+				} else {
+					// Ensure a safe container in which to render the html
+					safe = safe || createSafeFragment( context );
+					div = context.createElement("div");
+					safe.appendChild( div );
+
+					// Fix "XHTML"-style tags in all browsers
+					elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+					// Go to html and back, then peel off extra wrappers
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+					depth = wrap[0];
+					div.innerHTML = wrap[1] + elem + wrap[2];
+
+					// Move to the right depth
+					while ( depth-- ) {
+						div = div.lastChild;
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						hasBody = rtbody.test(elem);
+							tbody = tag === "table" && !hasBody ?
+								div.firstChild && div.firstChild.childNodes :
+
+								// String was a bare <thead> or <tfoot>
+								wrap[1] === "<table>" && !hasBody ?
+									div.childNodes :
+									[];
+
+						for ( j = tbody.length - 1; j >= 0 ; --j ) {
+							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+								tbody[ j ].parentNode.removeChild( tbody[ j ] );
+							}
+						}
+					}
+
+					// IE completely kills leading whitespace when innerHTML is used
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+					}
+
+					elem = div.childNodes;
+
+					// Take out of fragment container (we need a fresh div each time)
+					div.parentNode.removeChild( div );
+				}
+			}
+
+			if ( elem.nodeType ) {
+				ret.push( elem );
+			} else {
+				jQuery.merge( ret, elem );
+			}
+		}
+
+		// Fix #11356: Clear elements from safeFragment
+		if ( div ) {
+			elem = div = safe = null;
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				if ( jQuery.nodeName( elem, "input" ) ) {
+					fixDefaultChecked( elem );
+				} else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+					jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+				}
+			}
+		}
+
+		// Append elements to a provided document fragment
+		if ( fragment ) {
+			// Special handling of each script element
+			handleScript = function( elem ) {
+				// Check if we consider it executable
+				if ( !elem.type || rscriptType.test( elem.type ) ) {
+					// Detach the script and store it in the scripts array (if provided) or the fragment
+					// Return truthy to indicate that it has been handled
+					return scripts ?
+						scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+						fragment.appendChild( elem );
+				}
+			};
+
+			for ( i = 0; (elem = ret[i]) != null; i++ ) {
+				// Check if we're done after handling an executable script
+				if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+					// Append to fragment and handle embedded scripts
+					fragment.appendChild( elem );
+					if ( typeof elem.getElementsByTagName !== "undefined" ) {
+						// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+						jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+						// Splice the scripts into ret after their former ancestor and advance our index beyond them
+						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+						i += jsTags.length;
+					}
+				}
+			}
+		}
+
+		return ret;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var data, id, elem, type,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( elem.removeAttribute ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						jQuery.deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+	ua = ua.toLowerCase();
+
+	var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+		/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+		/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+		/(msie) ([\w.]+)/.exec( ua ) ||
+		ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+		[];
+
+	return {
+		browser: match[ 1 ] || "",
+		version: match[ 2 ] || "0"
+	};
+};
+
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
+
+if ( matched.browser ) {
+	browser[ matched.browser ] = true;
+	browser.version = matched.version;
+}
+
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+	browser.webkit = true;
+} else if ( browser.webkit ) {
+	browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+	function jQuerySub( selector, context ) {
+		return new jQuerySub.fn.init( selector, context );
+	}
+	jQuery.extend( true, jQuerySub, this );
+	jQuerySub.superclass = this;
+	jQuerySub.fn = jQuerySub.prototype = this();
+	jQuerySub.fn.constructor = jQuerySub;
+	jQuerySub.sub = this.sub;
+	jQuerySub.fn.init = function init( selector, context ) {
+		if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+			context = jQuerySub( context );
+		}
+
+		return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+	};
+	jQuerySub.fn.init.prototype = jQuerySub.fn;
+	var rootjQuerySub = jQuerySub(document);
+	return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity=([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+	eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var elem, display,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && elem.style.display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+			display = curCSS( elem, "display" );
+
+			if ( !values[ index ] && display !== "none" ) {
+				jQuery._data( elem, "olddisplay", display );
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state, fn2 ) {
+		var bool = typeof state === "boolean";
+
+		if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+			return eventsToggle.apply( this, arguments );
+		}
+
+		return this.each(function() {
+			if ( bool ? state : isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, numeric, extra ) {
+		var val, num, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( numeric || extra !== undefined ) {
+			num = parseFloat( val );
+			return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.call( elem );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	curCSS = function( elem, name ) {
+		var ret, width, minWidth, maxWidth,
+			computed = window.getComputedStyle( elem, null ),
+			style = elem.style;
+
+		if ( computed ) {
+
+			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+			ret = computed.getPropertyValue( name ) || computed[ name ];
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	curCSS = function( elem, name ) {
+		var left, rsLeft,
+			ret = elem.currentStyle && elem.currentStyle[ name ],
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				elem.runtimeStyle.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+			Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+			value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			// we use jQuery.css instead of curCSS here
+			// because of the reliableMarginRight CSS hook!
+			val += jQuery.css( elem, extra + cssExpand[ i ], true );
+		}
+
+		// From this point on we use curCSS for maximum performance (relevant in animations)
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		valueIsBorderBox = true,
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox
+		)
+	) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	if ( elemdisplay[ nodeName ] ) {
+		return elemdisplay[ nodeName ];
+	}
+
+	var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+		display = elem.css("display");
+	elem.remove();
+
+	// If the simple way fails,
+	// get element's real default display by attaching it to a temp iframe
+	if ( display === "none" || display === "" ) {
+		// Use the already-created iframe if possible
+		iframe = document.body.appendChild(
+			iframe || jQuery.extend( document.createElement("iframe"), {
+				frameBorder: 0,
+				width: 0,
+				height: 0
+			})
+		);
+
+		// Create a cacheable copy of the iframe document on first call.
+		// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+		// document to it; WebKit & Firefox won't allow reusing the iframe document.
+		if ( !iframeDoc || !iframe.createElement ) {
+			iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+			iframeDoc.write("<!doctype html><html><body>");
+			iframeDoc.close();
+		}
+
+		elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
+
+		display = curCSS( elem, "display" );
+		document.body.removeChild( iframe );
+	}
+
+	// Store the correct default display
+	elemdisplay[ nodeName ] = display;
+
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+					return jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					});
+				} else {
+					return getWidthOrHeight( elem, name, extra );
+				}
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+				style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there there is no filter style applied in a css rule, we are done
+				if ( currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+				// Work around by temporarily setting element display to inline-block
+				return jQuery.swap( elem, { "display": "inline-block" }, function() {
+					if ( computed ) {
+						return curCSS( elem, "marginRight" );
+					}
+				});
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						var ret = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i,
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ],
+				expanded = {};
+
+			for ( i = 0; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+	rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			return this.elements ? jQuery.makeArray( this.elements ) : this;
+		})
+		.filter(function(){
+			return this.name && !this.disabled &&
+				( this.checked || rselectTextarea.test( this.nodeName ) ||
+					rinput.test( this.type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val, i ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		});
+
+	} else {
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// If array item is non-scalar (array or object), encode its
+				// numeric index to resolve deserialization ambiguity issues.
+				// Note that rack (as of 1.0.0) can't currently deserialize
+				// nested arrays properly, and attempting to do so may cause
+				// a server error. Possible fixes are to modify rack's
+				// deserialization algorithm or to provide an option or flag
+				// to force array serialization to be shallow.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+
+	rhash = /#.*$/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rquery = /\?/,
+	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+	rts = /([?&])_=[^&]*/,
+	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType, list, placeBefore,
+			dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+			i = 0,
+			length = dataTypes.length;
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			for ( ; i < length; i++ ) {
+				dataType = dataTypes[ i ];
+				// We control if we're asked to add before
+				// any existing element
+				placeBefore = /^\+/.test( dataType );
+				if ( placeBefore ) {
+					dataType = dataType.substr( 1 ) || "*";
+				}
+				list = structure[ dataType ] = structure[ dataType ] || [];
+				// then we add to the structure accordingly
+				list[ placeBefore ? "unshift" : "push" ]( func );
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+		dataType /* internal */, inspected /* internal */ ) {
+
+	dataType = dataType || options.dataTypes[ 0 ];
+	inspected = inspected || {};
+
+	inspected[ dataType ] = true;
+
+	var selection,
+		list = structure[ dataType ],
+		i = 0,
+		length = list ? list.length : 0,
+		executeOnly = ( structure === prefilters );
+
+	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+		selection = list[ i ]( options, originalOptions, jqXHR );
+		// If we got redirected to another dataType
+		// we try there if executing only and not done already
+		if ( typeof selection === "string" ) {
+			if ( !executeOnly || inspected[ selection ] ) {
+				selection = undefined;
+			} else {
+				options.dataTypes.unshift( selection );
+				selection = inspectPrefiltersOrTransports(
+						structure, options, originalOptions, jqXHR, selection, inspected );
+			}
+		}
+	}
+	// If we're only executing or nothing was selected
+	// we try the catchall dataType if not done already
+	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+		selection = inspectPrefiltersOrTransports(
+				structure, options, originalOptions, jqXHR, "*", inspected );
+	}
+	// unnecessary when only executing (prefilters)
+	// but it'll be ignored by the caller in that case
+	return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var key, deep,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	// Don't do a request if no elements are being requested
+	if ( !this.length ) {
+		return this;
+	}
+
+	var selector, type, response,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// Request the remote document
+	jQuery.ajax({
+		url: url,
+
+		// if "type" variable is undefined, then "GET" method will be used
+		type: type,
+		dataType: "html",
+		data: params,
+		complete: function( jqXHR, status ) {
+			if ( callback ) {
+				self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+			}
+		}
+	}).done(function( responseText ) {
+
+		// Save response for use in complete callback
+		response = arguments;
+
+		// See if a selector was specified
+		self.html( selector ?
+
+			// Create a dummy div to hold the results
+			jQuery("<div>")
+
+				// inject the contents of the document in, removing the scripts
+				// to avoid any 'Permission Denied' errors in IE
+				.append( responseText.replace( rscript, "" ) )
+
+				// Locate the specified elements
+				.find( selector ) :
+
+			// If not, just inject the full result
+			responseText );
+
+	});
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+	jQuery.fn[ o ] = function( f ){
+		return this.on( o, f );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			type: method,
+			url: url,
+			data: data,
+			success: callback,
+			dataType: type
+		});
+	};
+});
+
+jQuery.extend({
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		if ( settings ) {
+			// Building a settings object
+			ajaxExtend( target, jQuery.ajaxSettings );
+		} else {
+			// Extending ajaxSettings
+			settings = target;
+			target = jQuery.ajaxSettings;
+		}
+		ajaxExtend( target, settings );
+		return target;
+	},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		type: "GET",
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		processData: true,
+		async: true,
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			xml: "application/xml, text/xml",
+			html: "text/html",
+			text: "text/plain",
+			json: "application/json, text/javascript",
+			"*": allTypes
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// List of data converters
+		// 1) key format is "source_type destination_type" (a single space in-between)
+		// 2) the catchall symbol "*" can be used for source_type
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			context: true,
+			url: true
+		}
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // ifModified key
+			ifModifiedKey,
+			// Response headers
+			responseHeadersString,
+			responseHeaders,
+			// transport
+			transport,
+			// timeout handle
+			timeoutTimer,
+			// Cross-domain detection vars
+			parts,
+			// To know if global events are to be dispatched
+			fireGlobals,
+			// Loop variable
+			i,
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events
+			// It's the callbackContext if one was provided in the options
+			// and if it's a DOM node or a jQuery collection
+			globalEventContext = callbackContext !== s &&
+				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+						jQuery( callbackContext ) : jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks( "once memory" ),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+
+				readyState: 0,
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					if ( !state ) {
+						var lname = name.toLowerCase();
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match === undefined ? null : match;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					statusText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( statusText );
+					}
+					done( 0, statusText );
+					return this;
+				}
+			};
+
+		// Callback for when everything is done
+		// It is defined here because jslint complains if it is declared
+		// at the end of the function (which would be more logical and readable)
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ ifModifiedKey ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("Etag");
+					if ( modified ) {
+						jQuery.etag[ ifModifiedKey ] = modified;
+					}
+				}
+
+				// If not modified
+				if ( status === 304 ) {
+
+					statusText = "notmodified";
+					isSuccess = true;
+
+				// If we have data
+				} else {
+
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.error;
+					isSuccess = !error;
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( !statusText || status ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+						[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger( "ajaxStop" );
+				}
+			}
+		}
+
+		// Attach deferreds
+		deferred.promise( jqXHR );
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+		jqXHR.complete = completeDeferred.add;
+
+		// Status-dependent callbacks
+		jqXHR.statusCode = function( map ) {
+			if ( map ) {
+				var tmp;
+				if ( state < 2 ) {
+					for ( tmp in map ) {
+						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+					}
+				} else {
+					tmp = map[ jqXHR.status ];
+					jqXHR.always( tmp );
+				}
+			}
+			return this;
+		};
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger( "ajaxStart" );
+		}
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Get ifModifiedKey before adding the anti-cache parameter
+			ifModifiedKey = s.url;
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+
+				var ts = jQuery.now(),
+					// try replacing _= if it is there
+					ret = s.url.replace( rts, "$1_=" + ts );
+
+				// if nothing was replaced, add timestamp to the end
+				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			ifModifiedKey = ifModifiedKey || s.url;
+			if ( jQuery.lastModified[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+			}
+			if ( jQuery.etag[ ifModifiedKey ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+			}
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+				// Abort if not done already and return
+				return jqXHR.abort();
+
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout( function(){
+					jqXHR.abort( "timeout" );
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch (e) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+	var ct, type, finalDataType, firstDataType,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+	var conv, conv2, current, tmp,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ],
+		converters = {},
+		i = 0;
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split(" ");
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.splice( i--, 0, current );
+								}
+
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s["throws"] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = current;
+		}
+	}
+
+	return { state: "success", data: response };
+}
+var oldCallbacks = [],
+	rquestion = /\?/,
+	rjsonp = /(=)\?(?=&|$)|\?\?/,
+	nonce = jQuery.now();
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		data = s.data,
+		url = s.url,
+		hasCallback = s.jsonp !== false,
+		replaceInUrl = hasCallback && rjsonp.test( url ),
+		replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+			!( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+			rjsonp.test( data );
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+		overwritten = window[ callbackName ];
+
+		// Insert callback into url or form data
+		if ( replaceInUrl ) {
+			s.url = url.replace( rjsonp, "$1" + callbackName );
+		} else if ( replaceInData ) {
+			s.data = data.replace( rjsonp, "$1" + callbackName );
+		} else if ( hasCallback ) {
+			s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /javascript|ecmascript/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement( "script" );
+
+				script.async = "async";
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( head && script.parentNode ) {
+							head.removeChild( script );
+						}
+
+						// Dereference the script
+						script = undefined;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+				// This arises when a base node is used (#2709 and #4378).
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( 0, 1 );
+				}
+			}
+		};
+	}
+});
+var xhrCallbacks,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject ? function() {
+		// Abort all pending requests
+		for ( var key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( 0, 1 );
+		}
+	} : false,
+	xhrId = 0;
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+	jQuery.extend( jQuery.support, {
+		ajax: !!xhr,
+		cors: !!xhr && ( "withCredentials" in xhr )
+	});
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers[ "X-Requested-With" ] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( _ ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+
+						var status,
+							statusText,
+							responseHeaders,
+							responses,
+							xml;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+									responses = {};
+									xml = xhr.responseXML;
+
+									// Construct response list
+									if ( xml && xml.documentElement /* #4958 */ ) {
+										responses.xml = xml;
+									}
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									try {
+										responses.text = xhr.responseText;
+									} catch( e ) {
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback, 0 );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback(0,1);
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+					do {
+						// If previous iteration zeroed out, double until we get *something*
+						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+						scale = scale || ".5";
+
+						// Adjust and apply
+						start = start / scale;
+						jQuery.style( tween.elem, prop, start + unit );
+
+					// Update scale, tolerating zero or NaN from tween.cur()
+					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	}, 0 );
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		index = 0,
+		tweenerIndex = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end, easing ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	createTweens( animation, props );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			anim: animation,
+			queue: animation.opts.queue,
+			elem: elem
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var index, name, easing, value, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.done(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( "hidden" in dataShow ) {
+			hidden = dataShow.hidden;
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery.removeData( elem, "fxshow", true );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing any value as a 4th parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, false, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ||
+			// special check for .toggle( handler, handler, ... )
+			( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+				// Empty animations resolve immediately
+				if ( empty ) {
+					anim.stop( true );
+				}
+			};
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	if ( (body = doc.body) === elem ) {
+		return jQuery.offset.bodyOffset( elem );
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	clientTop  = docElem.clientTop  || body.clientTop  || 0;
+	clientLeft = docElem.clientLeft || body.clientLeft || 0;
+	scrollTop  = win.pageYOffset || docElem.scrollTop;
+	scrollLeft = win.pageXOffset || docElem.scrollLeft;
+	return {
+		top: box.top  + scrollTop  - clientTop,
+		left: box.left + scrollLeft - clientLeft
+	};
+};
+
+jQuery.offset = {
+
+	bodyOffset: function( body ) {
+		var top = body.offsetTop,
+			left = body.offsetLeft;
+
+		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+		}
+
+		return { top: top, left: left };
+	},
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[0] ) {
+			return;
+		}
+
+		var elem = this[0],
+
+		// Get *real* offsetParent
+		offsetParent = this.offsetParent(),
+
+		// Get correct offsets
+		offset       = this.offset(),
+		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+		// Subtract element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+		// Add offsetParent borders
+		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+		// Subtract the two offsets
+		return {
+			top:  offset.top  - parentOffset.top,
+			left: offset.left - parentOffset.left
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.body;
+			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || document.body;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					 top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, value, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
diff --git a/qa/workunits/erasure-code/plot.js b/qa/workunits/erasure-code/plot.js
new file mode 100644
index 0000000..793ab1a
--- /dev/null
+++ b/qa/workunits/erasure-code/plot.js
@@ -0,0 +1,98 @@
+$(function() {
+    encode = [];
+    if (typeof encode_vandermonde_isa != 'undefined') {
+        encode.push({
+	    data: encode_vandermonde_isa,
+            label: "ISA, Vandermonde",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof encode_vandermonde_jerasure_generic != 'undefined') {
+        encode.push({
+	    data: encode_vandermonde_jerasure_generic,
+            label: "Jerasure Generic, Vandermonde",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof encode_vandermonde_jerasure_sse4 != 'undefined') {
+        encode.push({
+	    data: encode_vandermonde_jerasure_sse4,
+            label: "Jerasure SIMD, Vandermonde",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof encode_cauchy_isa != 'undefined') {
+        encode.push({
+	    data: encode_cauchy_isa,
+            label: "ISA, Cauchy",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof encode_cauchy_jerasure_generic != 'undefined') {
+        encode.push({
+	    data: encode_cauchy_jerasure_generic,
+            label: "Jerasure, Cauchy",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    $.plot("#encode", encode, {
+	xaxis: {
+	    mode: "categories",
+	    tickLength: 0
+	},
+    });
+
+    decode = [];
+    if (typeof decode_vandermonde_isa != 'undefined') {
+        decode.push({
+	    data: decode_vandermonde_isa,
+            label: "ISA, Vandermonde",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof decode_vandermonde_jerasure_generic != 'undefined') {
+        decode.push({
+	    data: decode_vandermonde_jerasure_generic,
+            label: "Jerasure Generic, Vandermonde",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof decode_vandermonde_jerasure_sse4 != 'undefined') {
+        decode.push({
+	    data: decode_vandermonde_jerasure_sse4,
+            label: "Jerasure SIMD, Vandermonde",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof decode_cauchy_isa != 'undefined') {
+        decode.push({
+	    data: decode_cauchy_isa,
+            label: "ISA, Cauchy",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    if (typeof decode_cauchy_jerasure_generic != 'undefined') {
+        decode.push({
+	    data: decode_cauchy_jerasure_generic,
+            label: "Jerasure, Cauchy",
+	    points: { show: true },
+	    lines: { show: true },
+	});
+    }
+    $.plot("#decode", decode, {
+	xaxis: {
+	    mode: "categories",
+	    tickLength: 0
+	},
+    });
+
+});
diff --git a/qa/workunits/false.sh b/qa/workunits/false.sh
new file mode 100644
index 0000000..8a961b3
--- /dev/null
+++ b/qa/workunits/false.sh
@@ -0,0 +1,3 @@
+#!/bin/sh -ex
+
+false
\ No newline at end of file
diff --git a/qa/workunits/fs/.gitignore b/qa/workunits/fs/.gitignore
new file mode 100644
index 0000000..f7f7a06
--- /dev/null
+++ b/qa/workunits/fs/.gitignore
@@ -0,0 +1 @@
+test_o_trunc
diff --git a/qa/workunits/fs/Makefile b/qa/workunits/fs/Makefile
new file mode 100644
index 0000000..c993425
--- /dev/null
+++ b/qa/workunits/fs/Makefile
@@ -0,0 +1,11 @@
+CFLAGS = -Wall -Wextra -D_GNU_SOURCE
+
+TARGETS = test_o_trunc
+
+.c:
+	$(CC) $(CFLAGS) $@.c -o $@
+
+all:	$(TARGETS)
+
+clean:
+	rm $(TARGETS)
diff --git a/qa/workunits/fs/misc/acl.sh b/qa/workunits/fs/misc/acl.sh
new file mode 100755
index 0000000..a213300
--- /dev/null
+++ b/qa/workunits/fs/misc/acl.sh
@@ -0,0 +1,34 @@
+#!/bin/sh -x
+
+set -e
+mkdir -p testdir
+cd testdir
+
+set +e
+setfacl -d -m u:nobody:rw .
+if test $? != 0; then
+	echo "Filesystem does not support ACL"
+	exit 0
+fi
+
+set -e
+c=0
+while [ $c -lt 100  ]
+do
+	c=`expr $c + 1`
+	# inherited ACL from parent directory's default ACL
+	mkdir d1
+	c1=`getfacl d1 | grep -c "nobody:rw"`
+	echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null
+	c2=`getfacl d1 | grep -c "nobody:rw"`
+	rmdir d1
+	if [ $c1 -ne 2 ] || [ $c2 -ne 2 ]
+	then
+		echo "ERROR: incorrect ACLs"
+		exit 1
+	fi
+done
+
+cd ..
+rmdir testdir
+echo OK
diff --git a/qa/workunits/fs/misc/chmod.sh b/qa/workunits/fs/misc/chmod.sh
new file mode 100755
index 0000000..de66776
--- /dev/null
+++ b/qa/workunits/fs/misc/chmod.sh
@@ -0,0 +1,60 @@
+#!/bin/sh -x
+
+set -e
+
+check_perms() {
+
+	file=$1
+	r=$(ls -la ${file})
+	if test $? != 0; then
+		echo "ERROR: File listing/stat failed"
+		exit 1
+	fi
+
+	perms=$2
+	if test "${perms}" != $(echo ${r} | awk '{print $1}') && \
+           test "${perms}." != $(echo ${r} | awk '{print $1}') && \
+           test "${perms}+" != $(echo ${r} | awk '{print $1}'); then
+		echo "ERROR: Permissions should be ${perms}"
+		exit 1
+	fi
+}
+
+file=test_chmod.$$
+
+echo "foo" > ${file}
+if test $? != 0; then
+	echo "ERROR: Failed to create file ${file}"
+	exit 1
+fi
+
+chmod 400 ${file}
+if test $? != 0; then
+	echo "ERROR: Failed to change mode of ${file}"
+	exit 1
+fi
+
+check_perms ${file} "-r--------"
+
+set +e
+echo "bar" >> ${file}
+if test $? = 0; then
+	echo "ERROR: Write to read-only file should Fail"
+	exit 1
+fi
+
+set -e
+chmod 600 ${file}
+echo "bar" >> ${file}
+if test $? != 0; then
+	echo "ERROR: Write to writeable file failed"
+	exit 1
+fi
+
+check_perms ${file} "-rw-------"
+
+echo "foo" >> ${file}
+if test $? != 0; then
+	echo "ERROR: Failed to write to file"
+	exit 1
+fi
diff --git a/qa/workunits/fs/misc/direct_io.py b/qa/workunits/fs/misc/direct_io.py
new file mode 100755
index 0000000..48be584
--- /dev/null
+++ b/qa/workunits/fs/misc/direct_io.py
@@ -0,0 +1,47 @@
+#!/usr/bin/python
+
+import os
+import mmap
+import subprocess
+import json
+
+def get_data_pool():
+    cmd = ['ceph', 'fs', 'ls', '--format=json-pretty']
+    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE)
+    out = proc.communicate()[0]
+    return json.loads(out)[0]['data_pools'][0]
+
+def main():
+    fd = os.open("testfile", os.O_RDWR | os.O_CREAT | os.O_TRUNC | os.O_DIRECT, 0644)
+
+    ino = os.fstat(fd).st_ino
+    obj_name = "{ino:x}.00000000".format(ino=ino)
+    pool_name = get_data_pool()
+
+    buf = mmap.mmap(-1, 1);
+    buf.write('1');
+    os.write(fd, buf);
+
+    proc = subprocess.Popen(['rados', '-p', pool_name, 'get', obj_name, 'tmpfile'])
+    proc.wait();
+
+    with open('tmpfile', 'r') as tmpf:
+        out = tmpf.read()
+        if out != '1':
+            raise RuntimeError("data were not written to object store directly")
+
+    with open('tmpfile', 'w') as tmpf:
+        tmpf.write('2')
+
+    proc = subprocess.Popen(['rados', '-p', pool_name, 'put', obj_name, 'tmpfile'])
+    proc.wait();
+
+    os.lseek(fd, 0, os.SEEK_SET)
+    out = os.read(fd, 1);
+    if out != '2':
+        raise RuntimeError("data were not directly read from object store")
+
+    os.close(fd);
+    print 'ok'
+
+main()
diff --git a/qa/workunits/fs/misc/dirfrag.sh b/qa/workunits/fs/misc/dirfrag.sh
new file mode 100755
index 0000000..c059f88
--- /dev/null
+++ b/qa/workunits/fs/misc/dirfrag.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+set -e
+
+DEPTH=5
+COUNT=10000
+
+kill_jobs() {
+  jobs -p | xargs kill
+}
+trap kill_jobs INT
+
+create_files() {
+  for i in `seq 1 $COUNT`
+  do
+    touch file$i
+  done
+}
+
+delete_files() {
+  for i in `ls -f`
+  do
+    if [[ ${i}a = file*a ]]
+    then
+      rm -f $i
+    fi
+  done
+}
+
+rm -rf testdir
+mkdir testdir
+cd testdir
+
+echo "creating folder hierarchy"
+for i in `seq 1 $DEPTH`; do
+  mkdir dir$i
+  cd dir$i
+  create_files &
+done
+wait
+
+echo "created hierarchy, now cleaning up"
+
+for i in `seq 1 $DEPTH`; do
+  delete_files &
+  cd ..
+done
+wait
+
+echo "cleaned up hierarchy"
+cd ..
+rm -rf testdir
diff --git a/qa/workunits/fs/misc/filelock_deadlock.py b/qa/workunits/fs/misc/filelock_deadlock.py
new file mode 100755
index 0000000..a344761
--- /dev/null
+++ b/qa/workunits/fs/misc/filelock_deadlock.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+
+import time
+import os
+import fcntl
+import errno
+import signal
+import struct
+
+def handler(signum, frame):
+    pass
+
+def lock_two(f1, f2):
+    lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 10, 0, 0)
+    fcntl.fcntl(f1, fcntl.F_SETLKW, lockdata)
+    time.sleep(10)
+
+    # don't wait forever
+    signal.signal(signal.SIGALRM, handler);
+    signal.alarm(10);
+    exitcode = 0;
+    try:
+        fcntl.fcntl(f2, fcntl.F_SETLKW, lockdata)
+    except IOError, e:
+        if e.errno == errno.EDEADLK:
+            exitcode = 1
+        elif e.errno == errno.EINTR:
+            exitcode = 2
+        else:
+            exitcode = 3;
+    os._exit(exitcode);
+
+def main():
+    pid1 = os.fork()
+    if pid1 == 0:
+        f1 = open("testfile1", 'w')
+        f2 = open("testfile2", 'w')
+        lock_two(f1, f2)
+
+    pid2 = os.fork()
+    if pid2 == 0:
+        f1 = open("testfile2", 'w')
+        f2 = open("testfile3", 'w')
+        lock_two(f1, f2)
+
+    pid3 = os.fork()
+    if pid3 == 0:
+        f1 = open("testfile3", 'w')
+        f2 = open("testfile1", 'w')
+        lock_two(f1, f2)
+
+    deadlk_count = 0
+    i = 0
+    while i < 3:
+        pid, status = os.wait();
+        exitcode = status >> 8
+        if exitcode == 1:
+            deadlk_count = deadlk_count + 1;
+        elif exitcode != 0:
+            raise RuntimeError("unexpect exit code of child")
+	i = i + 1
+
+    if deadlk_count != 1:
+        raise RuntimeError("unexpect count of EDEADLK")
+
+    print 'ok'
+
+main()
diff --git a/qa/workunits/fs/misc/filelock_interrupt.py b/qa/workunits/fs/misc/filelock_interrupt.py
new file mode 100755
index 0000000..a17fa39
--- /dev/null
+++ b/qa/workunits/fs/misc/filelock_interrupt.py
@@ -0,0 +1,85 @@
+#!/usr/bin/python
+
+import time
+import fcntl
+import errno
+import signal
+import struct
+
+"""
+introduced by Linux 3.15
+"""
+fcntl.F_OFD_GETLK=36
+fcntl.F_OFD_SETLK=37
+fcntl.F_OFD_SETLKW=38
+
+def handler(signum, frame):
+    pass
+
+def main():
+    f1 = open("testfile", 'w')
+    f2 = open("testfile", 'w')
+
+    fcntl.flock(f1, fcntl.LOCK_SH | fcntl.LOCK_NB)
+
+    """
+    is flock interruptable?
+    """
+    signal.signal(signal.SIGALRM, handler);
+    signal.alarm(5);
+    try:
+        fcntl.flock(f2, fcntl.LOCK_EX)
+    except IOError, e:
+        if e.errno != errno.EINTR:
+            raise
+    else:
+        raise RuntimeError("expect flock to block")
+
+    fcntl.flock(f1, fcntl.LOCK_UN)
+
+    lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 10, 0, 0)
+    try:
+        fcntl.fcntl(f1, fcntl.F_OFD_SETLK, lockdata)
+    except IOError, e:
+        if e.errno != errno.EINVAL:
+            raise
+        else:
+            print 'kernel does not support fcntl.F_OFD_SETLK'
+            return
+
+    lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 10, 10, 0, 0)
+    fcntl.fcntl(f2, fcntl.F_OFD_SETLK, lockdata)
+
+    """
+    is poxis lock interruptable?
+    """
+    signal.signal(signal.SIGALRM, handler);
+    signal.alarm(5);
+    try:
+        lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
+        fcntl.fcntl(f2, fcntl.F_OFD_SETLKW, lockdata)
+    except IOError, e:
+        if e.errno != errno.EINTR:
+            raise
+    else:
+        raise RuntimeError("expect posix lock to block")
+
+    """
+    file handler 2 should still hold lock on 10~10
+    """
+    try:
+        lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 10, 10, 0, 0)
+        fcntl.fcntl(f1, fcntl.F_OFD_SETLK, lockdata)
+    except IOError, e:
+        if e.errno == errno.EAGAIN:
+            pass
+    else:
+        raise RuntimeError("expect file handler 2 to hold lock on 10~10")
+
+    lockdata = struct.pack('hhllhh', fcntl.F_UNLCK, 0, 0, 0, 0, 0)
+    fcntl.fcntl(f1, fcntl.F_OFD_SETLK, lockdata)
+    fcntl.fcntl(f2, fcntl.F_OFD_SETLK, lockdata)
+
+    print 'ok'
+
+main()
diff --git a/qa/workunits/fs/misc/i_complete_vs_rename.sh b/qa/workunits/fs/misc/i_complete_vs_rename.sh
new file mode 100755
index 0000000..a9b9827
--- /dev/null
+++ b/qa/workunits/fs/misc/i_complete_vs_rename.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+set -e
+
+mkdir x
+cd x
+touch a
+touch b
+touch c
+touch d
+ls
+chmod 777 .
+stat e || true
+touch f
+touch g
+
+# over existing file
+echo attempting rename over existing file...
+touch ../xx
+mv ../xx f
+ls | grep f || false
+echo rename over existing file is okay
+
+# over negative dentry
+echo attempting rename over negative dentry...
+touch ../xx
+mv ../xx e
+ls | grep e || false
+echo rename over negative dentry is ok
+
+echo OK
diff --git a/qa/workunits/fs/misc/layout_vxattrs.sh b/qa/workunits/fs/misc/layout_vxattrs.sh
new file mode 100755
index 0000000..1858968
--- /dev/null
+++ b/qa/workunits/fs/misc/layout_vxattrs.sh
@@ -0,0 +1,109 @@
+#!/bin/bash -x
+
+set -e
+
+# detect data pool
+datapool=
+dir=.
+while true ; do
+    echo $dir
+    datapool=$(getfattr -n ceph.dir.layout.pool $dir --only-values) && break
+    dir=$dir/..
+done
+
+# file
+rm -f file file2
+touch file file2
+
+getfattr -n ceph.file.layout file
+getfattr -n ceph.file.layout file | grep -q object_size=
+getfattr -n ceph.file.layout file | grep -q stripe_count=
+getfattr -n ceph.file.layout file | grep -q stripe_unit=
+getfattr -n ceph.file.layout file | grep -q pool=
+getfattr -n ceph.file.layout.pool file
+getfattr -n ceph.file.layout.pool_namespace file
+getfattr -n ceph.file.layout.stripe_unit file
+getfattr -n ceph.file.layout.stripe_count file
+getfattr -n ceph.file.layout.object_size file
+
+getfattr -n ceph.file.layout.bogus file   2>&1 | grep -q 'No such attribute'
+getfattr -n ceph.dir.layout file    2>&1 | grep -q 'No such attribute'
+
+setfattr -n ceph.file.layout.stripe_unit -v 1048576 file2
+setfattr -n ceph.file.layout.stripe_count -v 8 file2
+setfattr -n ceph.file.layout.object_size -v 10485760 file2
+
+setfattr -n ceph.file.layout.pool -v $datapool file2
+getfattr -n ceph.file.layout.pool file2 | grep -q $datapool
+setfattr -n ceph.file.layout.pool_namespace -v foons file2
+getfattr -n ceph.file.layout.pool_namespace file2 | grep -q foons
+
+getfattr -n ceph.file.layout.stripe_unit file2 | grep -q 1048576
+getfattr -n ceph.file.layout.stripe_count file2 | grep -q 8
+getfattr -n ceph.file.layout.object_size file2 | grep -q 10485760
+
+setfattr -n ceph.file.layout -v "stripe_unit=4194304 stripe_count=16 object_size=41943040 pool=$datapool pool_namespace=foons" file2
+getfattr -n ceph.file.layout.stripe_unit file2 | grep -q 4194304
+getfattr -n ceph.file.layout.stripe_count file2 | grep -q 16
+getfattr -n ceph.file.layout.object_size file2 | grep -q 41943040
+getfattr -n ceph.file.layout.pool file2 | grep -q $datapool
+getfattr -n ceph.file.layout.pool_namespace file2 | grep -q foons
+
+setfattr -n ceph.file.layout -v "stripe_unit=1048576" file2
+getfattr -n ceph.file.layout.stripe_unit file2 | grep -q 1048576
+getfattr -n ceph.file.layout.stripe_count file2 | grep -q 16
+getfattr -n ceph.file.layout.object_size file2 | grep -q 41943040
+getfattr -n ceph.file.layout.pool file2 | grep -q $datapool
+getfattr -n ceph.file.layout.pool_namespace file2 | grep -q foons
+
+setfattr -n ceph.file.layout -v "stripe_unit=2097152 stripe_count=4 object_size=2097152 pool=$datapool pool_namespace=barns" file2
+getfattr -n ceph.file.layout.stripe_unit file2 | grep -q 2097152
+getfattr -n ceph.file.layout.stripe_count file2 | grep -q 4
+getfattr -n ceph.file.layout.object_size file2 | grep -q 2097152
+getfattr -n ceph.file.layout.pool file2 | grep -q $datapool
+getfattr -n ceph.file.layout.pool_namespace file2 | grep -q barns
+
+# dir
+rm -f dir/file || true
+rmdir dir || true
+mkdir -p dir
+
+getfattr -d -m - dir | grep -q ceph.dir.layout       && exit 1 || true
+getfattr -d -m - dir | grep -q ceph.file.layout      && exit 1 || true
+getfattr -n ceph.dir.layout dir                      && exit 1 || true
+
+setfattr -n ceph.dir.layout.stripe_unit -v 1048576 dir
+setfattr -n ceph.dir.layout.stripe_count -v 8 dir
+setfattr -n ceph.dir.layout.object_size -v 10485760 dir
+setfattr -n ceph.dir.layout.pool -v $datapool dir
+setfattr -n ceph.dir.layout.pool_namespace -v dirns dir
+
+getfattr -n ceph.dir.layout dir
+getfattr -n ceph.dir.layout dir | grep -q object_size=10485760
+getfattr -n ceph.dir.layout dir | grep -q stripe_count=8
+getfattr -n ceph.dir.layout dir | grep -q stripe_unit=1048576
+getfattr -n ceph.dir.layout dir | grep -q pool=$datapool
+getfattr -n ceph.dir.layout dir | grep -q pool_namespace=dirns
+getfattr -n ceph.dir.layout.pool dir | grep -q $datapool
+getfattr -n ceph.dir.layout.stripe_unit dir | grep -q 1048576
+getfattr -n ceph.dir.layout.stripe_count dir | grep -q 8
+getfattr -n ceph.dir.layout.object_size dir | grep -q 10485760
+getfattr -n ceph.dir.layout.pool_namespace dir | grep -q dirns
+
+setfattr -n ceph.file.layout -v "stripe_count=16" file2
+getfattr -n ceph.file.layout.stripe_count file2 | grep -q 16
+setfattr -n ceph.file.layout -v "object_size=10485760 stripe_count=8 stripe_unit=1048576 pool=$datapool pool_namespace=dirns" file2
+getfattr -n ceph.file.layout.stripe_count file2 | grep -q 8
+
+touch dir/file
+getfattr -n ceph.file.layout.pool dir/file | grep -q $datapool
+getfattr -n ceph.file.layout.stripe_unit dir/file | grep -q 1048576
+getfattr -n ceph.file.layout.stripe_count dir/file | grep -q 8
+getfattr -n ceph.file.layout.object_size dir/file | grep -q 10485760
+getfattr -n ceph.file.layout.pool_namespace dir/file | grep -q dirns
+
+setfattr -x ceph.dir.layout dir
+getfattr -n ceph.dir.layout dir     2>&1 | grep -q 'No such attribute'
+
+echo OK
+
diff --git a/qa/workunits/fs/misc/mkpool_layout_vxattrs.sh b/qa/workunits/fs/misc/mkpool_layout_vxattrs.sh
new file mode 100755
index 0000000..91d3166
--- /dev/null
+++ b/qa/workunits/fs/misc/mkpool_layout_vxattrs.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+set -e
+
+touch foo.$$
+rados mkpool foo.$$
+ceph mds add_data_pool foo.$$
+setfattr -n ceph.file.layout.pool -v foo.$$ foo.$$
+
+# cleanup
+rm foo.$$
+ceph mds remove_data_pool foo.$$
+rados rmpool foo.$$ foo.$$ --yes-i-really-really-mean-it
+
+echo OK
diff --git a/qa/workunits/fs/misc/multiple_rsync.sh b/qa/workunits/fs/misc/multiple_rsync.sh
new file mode 100755
index 0000000..87a9761
--- /dev/null
+++ b/qa/workunits/fs/misc/multiple_rsync.sh
@@ -0,0 +1,25 @@
+#!/bin/sh -ex
+
+
+# Populate with some arbitrary files from the local system.  Take
+# a copy to protect against false fails from system updates during test.
+export PAYLOAD=/tmp/multiple_rsync_payload.$$
+sudo cp -r /usr/lib/ $PAYLOAD
+
+set -e
+
+sudo rsync -av $PAYLOAD payload.1
+sudo rsync -av $PAYLOAD payload.2
+
+# this shouldn't transfer any additional files
+echo we should get 4 here if no additional files are transfered
+sudo rsync -auv $PAYLOAD payload.1 | tee /tmp/$$
+hexdump -C /tmp/$$
+wc -l /tmp/$$ | grep 4
+sudo rsync -auv $PAYLOAD payload.2 | tee /tmp/$$
+hexdump -C /tmp/$$
+wc -l /tmp/$$ | grep 4
+echo OK
+
+rm /tmp/$$
+sudo rm -rf $PAYLOAD
diff --git a/qa/workunits/fs/misc/trivial_sync.sh b/qa/workunits/fs/misc/trivial_sync.sh
new file mode 100755
index 0000000..68e4072
--- /dev/null
+++ b/qa/workunits/fs/misc/trivial_sync.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+set -e
+
+mkdir foo
+echo foo > bar
+sync
diff --git a/qa/workunits/fs/misc/xattrs.sh b/qa/workunits/fs/misc/xattrs.sh
new file mode 100755
index 0000000..fcd94d2
--- /dev/null
+++ b/qa/workunits/fs/misc/xattrs.sh
@@ -0,0 +1,14 @@
+#!/bin/sh -x
+
+set -e
+
+touch file
+
+setfattr -n user.foo -v foo file
+setfattr -n user.bar -v bar file
+setfattr -n user.empty file
+getfattr -d file | grep foo
+getfattr -d file | grep bar
+getfattr -d file | grep empty
+
+echo OK.
diff --git a/qa/workunits/fs/multiclient_sync_read_eof.py b/qa/workunits/fs/multiclient_sync_read_eof.py
new file mode 100755
index 0000000..03293d8
--- /dev/null
+++ b/qa/workunits/fs/multiclient_sync_read_eof.py
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+
+import argparse
+import os
+import sys
+import time
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('mnt1')
+    parser.add_argument('mnt2')
+    parser.add_argument('fn')
+    args = parser.parse_args()
+
+    file(os.path.join(args.mnt1, args.fn), 'w')
+    f1 = file(os.path.join(args.mnt1, args.fn), 'r+')
+    f2 = file(os.path.join(args.mnt2, args.fn), 'r+')
+
+    f1.write('foo')
+    f1.flush()
+    a = f2.read(3)
+    print 'got "%s"' % a
+    assert a == 'foo'
+    f2.write('bar')
+    f2.flush()
+    a = f1.read(3)
+    print 'got "%s"' % a
+    assert a == 'bar'
+
+    ## test short reads
+    f1.write('short')
+    f1.flush()
+    a = f2.read(100)
+    print 'got "%s"' % a
+    assert a == 'short'
+    f2.write('longer')
+    f2.flush()
+    a = f1.read(1000)
+    print 'got "%s"' % a
+    assert a == 'longer'
+
+    print 'ok'
+
+main()
diff --git a/qa/workunits/fs/norstats/kernel_untar_tar.sh b/qa/workunits/fs/norstats/kernel_untar_tar.sh
new file mode 100755
index 0000000..63f8c74
--- /dev/null
+++ b/qa/workunits/fs/norstats/kernel_untar_tar.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+# check if there is file changed while being archived
+
+set -e
+
+KERNEL=linux-4.0.5
+
+wget -q http://download.ceph.com/qa/$KERNEL.tar.xz
+
+mkdir untar_tar
+cd untar_tar
+
+tar Jxvf ../$KERNEL.tar.xz $KERNEL/Documentation/
+tar cf doc.tar $KERNEL
+
+tar xf doc.tar
+sync
+tar c $KERNEL >/dev/null
+
+rm -rf $KERNEL
+
+tar xf doc.tar
+sync
+tar c $KERNEL >/dev/null
+
+echo Ok
diff --git a/qa/workunits/fs/quota/quota.sh b/qa/workunits/fs/quota/quota.sh
new file mode 100755
index 0000000..ff27a61
--- /dev/null
+++ b/qa/workunits/fs/quota/quota.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+
+set -e
+set -x
+
+function expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+function write_file()
+{
+	set +x
+	for ((i=1;i<=$2;i++))
+	do
+		dd if=/dev/zero of=$1 bs=1M count=1 conv=notrunc oflag=append 2>/dev/null >/dev/null
+		if [ $? != 0 ]; then
+			echo Try to write $(($i * 1048576))
+			set -x
+			return 1
+		fi
+		sleep 0.05
+	done
+	set -x
+	return 0
+}
+
+mkdir quota-test
+cd quota-test
+
+# bytes
+setfattr . -n ceph.quota.max_bytes -v 100000000  # 100m
+expect_false write_file big 1000     # 1g
+expect_false write_file second 10
+setfattr . -n ceph.quota.max_bytes -v 0
+dd if=/dev/zero of=third bs=1M count=10
+dd if=/dev/zero of=big2 bs=1M count=100
+
+
+rm -rf *
+
+# files
+setfattr . -n ceph.quota.max_files -v 5
+mkdir ok
+touch ok/1
+touch ok/2
+touch 3
+expect_false touch shouldbefail     #  5 files will include the "."
+expect_false touch ok/shouldbefail  #  5 files will include the "."
+setfattr . -n ceph.quota.max_files -v 0
+touch shouldbecreated
+touch shouldbecreated2
+
+
+rm -rf *
+
+# mix
+mkdir bytes bytes/files
+
+setfattr bytes -n ceph.quota.max_bytes -v 10000000   #10m
+setfattr bytes/files -n ceph.quota.max_files -v 5
+dd if=/dev/zero of=bytes/files/1 bs=1M count=4
+dd if=/dev/zero of=bytes/files/2 bs=1M count=4
+expect_false write_file bytes/files/3 1000
+expect_false write_file bytes/files/4 1000
+expect_false write_file bytes/files/5 1000
+stat --printf="%n %s\n" bytes/files/1 #4M
+stat --printf="%n %s\n" bytes/files/2 #4M
+stat --printf="%n %s\n" bytes/files/3 #bigger than 2M
+stat --printf="%n %s\n" bytes/files/4 #should be zero
+expect_false stat bytes/files/5       #shouldn't be exist
+
+
+
+
+rm -rf *
+
+#mv
+mkdir files limit
+truncate files/file -s 10G
+setfattr limit -n ceph.quota.max_bytes -v 1000000 #1m
+expect_false mv files limit/
+
+
+
+rm -rf *
+
+#limit by ancestor
+
+mkdir -p ancestor/p1/p2/parent/p3
+setfattr ancestor -n ceph.quota.max_bytes -v 1000000
+setfattr ancestor/p1/p2/parent -n ceph.quota.max_bytes -v 1000000000 #1g
+expect_false write_file ancestor/p1/p2/parent/p3/file1 900 #900m
+stat --printf="%n %s\n" ancestor/p1/p2/parent/p3/file1
+
+
+#get/set attribute
+
+setfattr -n ceph.quota.max_bytes -v 0 .
+setfattr -n ceph.quota.max_bytes -v 1 .
+setfattr -n ceph.quota.max_bytes -v 9223372036854775807 .
+expect_false setfattr -n ceph.quota.max_bytes -v 9223372036854775808 .
+expect_false setfattr -n ceph.quota.max_bytes -v -1 .
+expect_false setfattr -n ceph.quota.max_bytes -v -9223372036854775808 .
+expect_false setfattr -n ceph.quota.max_bytes -v -9223372036854775809 .
+
+setfattr -n ceph.quota.max_files -v 0 .
+setfattr -n ceph.quota.max_files -v 1 .
+setfattr -n ceph.quota.max_files -v 9223372036854775807 .
+expect_false setfattr -n ceph.quota.max_files -v 9223372036854775808 .
+expect_false setfattr -n ceph.quota.max_files -v -1 .
+expect_false setfattr -n ceph.quota.max_files -v -9223372036854775808 .
+expect_false setfattr -n ceph.quota.max_files -v -9223372036854775809 .
+
+setfattr -n ceph.quota -v "max_bytes=0 max_files=0" .
+setfattr -n ceph.quota -v "max_bytes=1 max_files=0" .
+setfattr -n ceph.quota -v "max_bytes=0 max_files=1" .
+setfattr -n ceph.quota -v "max_bytes=1 max_files=1" .
+expect_false setfattr -n ceph.quota -v "max_bytes=-1 max_files=0" .
+expect_false setfattr -n ceph.quota -v "max_bytes=0 max_files=-1" .
+expect_false setfattr -n ceph.quota -v "max_bytes=-1 max_files=-1" .
+
+#addme
+
+cd ..
+rm -rf quota-test
+
+echo OK
diff --git a/qa/workunits/fs/snaps/snap-rm-diff.sh b/qa/workunits/fs/snaps/snap-rm-diff.sh
new file mode 100755
index 0000000..c1b6c24
--- /dev/null
+++ b/qa/workunits/fs/snaps/snap-rm-diff.sh
@@ -0,0 +1,11 @@
+#!/bin/sh -ex
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+wget -q http://download.ceph.com/qa/linux-2.6.33.tar.bz2
+mkdir foo
+cp linux* foo
+mkdir foo/.snap/barsnap
+rm foo/linux*
+diff -q foo/.snap/barsnap/linux* linux* && echo "passed: files are identical"
+rmdir foo/.snap/barsnap
+echo OK
diff --git a/qa/workunits/fs/snaps/snaptest-0.sh b/qa/workunits/fs/snaps/snaptest-0.sh
new file mode 100755
index 0000000..b57763a
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-0.sh
@@ -0,0 +1,27 @@
+#!/bin/sh -x
+
+expect_failure() {
+	if "$@"; then return 1; else return 0; fi
+}
+set -e
+
+ceph mds set allow_new_snaps false
+expect_failure mkdir .snap/foo
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+echo asdf > foo
+mkdir .snap/foo
+grep asdf .snap/foo/foo
+rmdir .snap/foo
+
+echo asdf > bar
+mkdir .snap/bar
+rm bar
+grep asdf .snap/bar/bar
+rmdir .snap/bar
+rm foo
+
+ceph mds set allow_new_snaps false
+expect_failure mkdir .snap/baz
+
+echo OK
diff --git a/qa/workunits/fs/snaps/snaptest-1.sh b/qa/workunits/fs/snaps/snaptest-1.sh
new file mode 100755
index 0000000..f8fb614
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-1.sh
@@ -0,0 +1,31 @@
+#!/bin/bash -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+echo 1 > file1
+echo 2 > file2
+echo 3 > file3
+[ -e file4 ] && rm file4
+mkdir .snap/snap1
+echo 4 > file4
+now=`ls`
+then=`ls .snap/snap1`
+rmdir .snap/snap1
+if [ "$now" = "$then" ]; then
+    echo live and snap contents are identical?
+    false
+fi
+
+# do it again
+echo 1 > file1
+echo 2 > file2
+echo 3 > file3
+mkdir .snap/snap1
+echo 4 > file4
+rmdir .snap/snap1
+
+rm file?
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/snaptest-2.sh b/qa/workunits/fs/snaps/snaptest-2.sh
new file mode 100755
index 0000000..b2458d9
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-2.sh
@@ -0,0 +1,61 @@
+#!/bin/bash
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+echo "Create dir 100 to 199 ..."
+for i in $(seq 100 199); do
+	echo "    create dir $i"
+	mkdir "$i"
+	for y in $(seq 10 20); do
+		echo "This is a test file before any snapshot was taken." >"$i/$y"
+	done
+done
+
+echo "Take first snapshot .snap/test1"
+mkdir .snap/test1
+
+echo "Create dir 200 to 299 ..."
+for i in $(seq 200 299); do
+	echo "    create dir $i"
+        mkdir $i
+        for y in $(seq 20 29); do
+                echo "This is a test file. Created after .snap/test1" >"$i/$y"
+        done
+done
+
+echo "Create a snapshot in every first level dir ..."
+for dir in $(ls); do
+	echo "    create $dir/.snap/snap-subdir-test"
+	mkdir "$dir/.snap/snap-subdir-test"
+	for y in $(seq 30 39); do
+		echo "        create $dir/$y file after the snapshot"
+                echo "This is a test file. Created after $dir/.snap/snap-subdir-test" >"$dir/$y"
+        done
+done
+
+echo "Take second snapshot .snap/test2"
+mkdir .snap/test2
+
+echo "Copy content of .snap/test1 to copyofsnap1 ..."
+mkdir copyofsnap1
+cp -Rv .snap/test1 copyofsnap1/
+
+
+echo "Take third snapshot .snap/test3"
+mkdir .snap/test3
+
+echo "Delete the snapshots..."
+
+find ./ -type d -print | \
+        xargs -I% -n1 find %/.snap -mindepth 1 -maxdepth 1 \
+                         \( ! -name "_*" \) -print 2>/dev/null
+
+find ./ -type d -print | \
+	xargs -I% -n1 find %/.snap -mindepth 1 -maxdepth 1 \
+                         \( ! -name "_*" \) -print 2>/dev/null | \
+	xargs -n1 rmdir
+
+echo "Delete all the files and directories ..."
+rm -Rfv ./*
+
+echo OK
diff --git a/qa/workunits/fs/snaps/snaptest-authwb.sh b/qa/workunits/fs/snaps/snaptest-authwb.sh
new file mode 100755
index 0000000..9dd9845
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-authwb.sh
@@ -0,0 +1,14 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+touch foo
+chmod +x foo
+mkdir .snap/s
+find .snap/s/foo -executable | grep foo
+rmdir .snap/s
+rm foo
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/snaptest-capwb.sh b/qa/workunits/fs/snaps/snaptest-capwb.sh
new file mode 100755
index 0000000..3b6a01a
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-capwb.sh
@@ -0,0 +1,35 @@
+#!/bin/sh -x
+
+set -e
+
+mkdir foo
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+# make sure mds handles it when the client does not send flushsnap
+echo x > foo/x
+sync
+mkdir foo/.snap/ss
+ln foo/x foo/xx
+cat foo/.snap/ss/x
+rmdir foo/.snap/ss
+
+#
+echo a > foo/a
+echo b > foo/b
+mkdir foo/.snap/s
+r=`cat foo/.snap/s/a`
+[ -z "$r" ] && echo "a appears empty in snapshot" && false
+
+ln foo/b foo/b2
+cat foo/.snap/s/b
+
+echo "this used to hang:"
+echo more >> foo/b2
+echo "oh, it didn't hang! good job."
+cat foo/b
+rmdir foo/.snap/s
+
+rm -r foo
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/snaptest-dir-rename.sh b/qa/workunits/fs/snaps/snaptest-dir-rename.sh
new file mode 100755
index 0000000..b98358a
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-dir-rename.sh
@@ -0,0 +1,19 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+#
+# make sure we keep an existing dn's seq
+#
+
+mkdir a
+mkdir .snap/bar
+mkdir a/.snap/foo
+rmdir a/.snap/foo
+rmdir a
+stat .snap/bar/a
+rmdir .snap/bar
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/snaptest-double-null.sh b/qa/workunits/fs/snaps/snaptest-double-null.sh
new file mode 100755
index 0000000..b547213
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-double-null.sh
@@ -0,0 +1,25 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+# multiple intervening snapshots with no modifications, and thus no
+# snapflush client_caps messages.  make sure the mds can handle this.
+
+for f in `seq 1 20` ; do
+
+mkdir a
+cat > a/foo &
+mkdir a/.snap/one
+mkdir a/.snap/two
+chmod 777 a/foo
+sync   # this might crash the mds
+ps
+rmdir a/.snap/*
+rm a/foo
+rmdir a
+
+done
+
+echo OK
diff --git a/qa/workunits/fs/snaps/snaptest-estale.sh b/qa/workunits/fs/snaps/snaptest-estale.sh
new file mode 100755
index 0000000..1465a35
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-estale.sh
@@ -0,0 +1,15 @@
+#!/bin/sh -x
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+mkdir .snap/foo
+
+echo "We want ENOENT, not ESTALE, here."
+for f in `seq 1 100`
+do
+    stat .snap/foo/$f 2>&1 | grep 'No such file'
+done
+
+rmdir .snap/foo
+
+echo "OK"
diff --git a/qa/workunits/fs/snaps/snaptest-git-ceph.sh b/qa/workunits/fs/snaps/snaptest-git-ceph.sh
new file mode 100755
index 0000000..1769fe8
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-git-ceph.sh
@@ -0,0 +1,35 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+git clone git://git.ceph.com/ceph.git
+cd ceph
+
+versions=`seq 1 21`
+
+for v in $versions
+do
+    ver="v0.$v"
+    echo $ver
+    git reset --hard $ver
+    mkdir .snap/$ver
+done
+
+for v in $versions
+do
+    ver="v0.$v"
+    echo checking $ver
+    cd .snap/$ver
+    git diff --exit-code
+    cd ../..
+done
+
+for v in $versions
+do
+    ver="v0.$v"
+    rmdir .snap/$ver
+done
+
+echo OK
diff --git a/qa/workunits/fs/snaps/snaptest-intodir.sh b/qa/workunits/fs/snaps/snaptest-intodir.sh
new file mode 100755
index 0000000..729baa1
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-intodir.sh
@@ -0,0 +1,24 @@
+#!/bin/sh -ex
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+# this tests fix for #1399
+mkdir foo
+mkdir foo/.snap/one
+touch bar
+mv bar foo
+sync
+# should not crash :)
+
+mkdir baz
+mkdir baz/.snap/two
+mv baz foo
+sync
+# should not crash :)
+
+# clean up.
+rmdir foo/baz/.snap/two
+rmdir foo/.snap/one
+rm -r foo
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/snaptest-multiple-capsnaps.sh b/qa/workunits/fs/snaps/snaptest-multiple-capsnaps.sh
new file mode 100755
index 0000000..bc58bac
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-multiple-capsnaps.sh
@@ -0,0 +1,44 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+echo asdf > a
+mkdir .snap/1
+chmod 777 a
+mkdir .snap/2
+echo qwer > a
+mkdir .snap/3
+chmod 666 a
+mkdir .snap/4
+echo zxcv > a
+mkdir .snap/5
+
+ls -al .snap/?/a
+
+grep asdf .snap/1/a
+stat .snap/1/a | grep 'Size: 5'
+
+grep asdf .snap/2/a
+stat .snap/2/a | grep 'Size: 5'
+stat .snap/2/a | grep -- '-rwxrwxrwx'
+
+grep qwer .snap/3/a
+stat .snap/3/a | grep 'Size: 5'
+stat .snap/3/a | grep -- '-rwxrwxrwx'
+
+grep qwer .snap/4/a
+stat .snap/4/a | grep 'Size: 5'
+stat .snap/4/a | grep -- '-rw-rw-rw-'
+
+grep zxcv .snap/5/a
+stat .snap/5/a | grep 'Size: 5'
+stat .snap/5/a | grep -- '-rw-rw-rw-'
+
+rmdir .snap/[12345]
+
+echo "OK"
+
+
+
diff --git a/qa/workunits/fs/snaps/snaptest-parents.sh b/qa/workunits/fs/snaps/snaptest-parents.sh
new file mode 100755
index 0000000..6b76fdb
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-parents.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+echo "making directory tree and files"
+mkdir -p 1/a/b/c/
+echo "i'm file1" > 1/a/file1
+echo "i'm file2" > 1/a/b/file2
+echo "i'm file3" > 1/a/b/c/file3
+echo "snapshotting"
+mkdir 1/.snap/foosnap1
+mkdir 2
+echo "moving tree"
+mv 1/a 2
+echo "checking snapshot contains tree..."
+dir1=`find 1/.snap/foosnap1 | wc -w`
+dir2=`find 2/ | wc -w`
+#diff $dir1 $dir2 && echo "Success!"
+test $dir1==$dir2 && echo "Success!"
+echo "adding folder and file to tree..."
+mkdir 2/a/b/c/d
+echo "i'm file 4!" > 2/a/b/c/d/file4
+echo "snapshotting tree 2"
+mkdir 2/.snap/barsnap2
+echo "comparing snapshots"
+dir1=`find 1/.snap/foosnap1/ -maxdepth 2 | wc -w`
+dir2=`find 2/.snap/barsnap2/ -maxdepth 2 | wc -w`
+#diff $dir1 $dir2 && echo "Success!"
+test $dir1==$dir2 && echo "Success!"
+echo "moving subtree to first folder"
+mv 2/a/b/c 1
+echo "comparing snapshots and new tree"
+dir1=`find 1/ | wc -w`
+dir2=`find 2/.snap/barsnap2/a/b/c | wc -w`
+#diff $dir1 $dir2 && echo "Success!"
+test $dir1==$dir2 && echo "Sucess!"
+rmdir 1/.snap/*
+rmdir 2/.snap/*
+echo "OK"
diff --git a/qa/workunits/fs/snaps/snaptest-snap-rename.sh b/qa/workunits/fs/snaps/snaptest-snap-rename.sh
new file mode 100755
index 0000000..e48b10b
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-snap-rename.sh
@@ -0,0 +1,35 @@
+#!/bin/sh -x
+
+expect_failure() {
+	if "$@"; then return 1; else return 0; fi
+}
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+mkdir -p d1/d2
+mkdir -p d1/d3
+mkdir d1/.snap/foo
+mkdir d1/d2/.snap/foo
+mkdir d1/d3/.snap/foo
+mkdir d1/d3/.snap/bar
+mv d1/d2/.snap/foo d1/d2/.snap/bar
+# snapshot name can't start with _
+expect_failure mv d1/d2/.snap/bar d1/d2/.snap/_bar
+# can't rename parent snapshot
+expect_failure mv d1/d2/.snap/_foo_* d1/d2/.snap/foo
+expect_failure mv d1/d2/.snap/_foo_* d1/d2/.snap/_foo_1
+# can't rename snapshot to different directroy
+expect_failure mv d1/d2/.snap/bar d1/.snap/
+# can't overwrite existing snapshot
+expect_failure python -c "import os; os.rename('d1/d3/.snap/foo', 'd1/d3/.snap/bar')"
+# can't move snaphost out of snapdir
+expect_failure python -c "import os; os.rename('d1/.snap/foo', 'd1/foo')"
+
+rmdir d1/.snap/foo
+rmdir d1/d2/.snap/bar
+rmdir d1/d3/.snap/foo
+rmdir d1/d3/.snap/bar
+rm -rf d1
+
+echo OK
diff --git a/qa/workunits/fs/snaps/snaptest-snap-rm-cmp.sh b/qa/workunits/fs/snaps/snaptest-snap-rm-cmp.sh
new file mode 100755
index 0000000..8b1ca5b
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-snap-rm-cmp.sh
@@ -0,0 +1,26 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+file=linux-2.6.33.tar.bz2
+wget -q http://download.ceph.com/qa/$file
+
+real=`md5sum $file | awk '{print $1}'`
+
+for f in `seq 1 20`
+do
+    echo $f
+    cp $file a
+    mkdir .snap/s
+    rm a
+    cp .snap/s/a /tmp/a
+    cur=`md5sum /tmp/a | awk '{print $1}'`
+    if [ "$cur" != "$real" ]; then
+	echo "FAIL: bad match, /tmp/a $cur != real $real"
+	false
+    fi
+    rmdir .snap/s
+done
+rm $file
diff --git a/qa/workunits/fs/snaps/snaptest-upchildrealms.sh b/qa/workunits/fs/snaps/snaptest-upchildrealms.sh
new file mode 100755
index 0000000..64a99ea
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-upchildrealms.sh
@@ -0,0 +1,30 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+#
+# verify that a snap update on a parent realm will induce
+# snap cap writeback for inodes child realms
+#
+
+mkdir a
+mkdir a/b
+mkdir a/.snap/a1
+mkdir a/b/.snap/b1
+echo asdf > a/b/foo
+mkdir a/.snap/a2
+# client _should_ have just queued a capsnap for writeback
+ln a/b/foo a/b/bar       # make the server cow the inode
+
+echo "this should not hang..."
+cat a/b/.snap/_a2_*/foo
+echo "good, it did not hang."
+
+rmdir a/b/.snap/b1
+rmdir a/.snap/a1
+rmdir a/.snap/a2
+rm -r a
+
+echo "OK"
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/snaptest-xattrwb.sh b/qa/workunits/fs/snaps/snaptest-xattrwb.sh
new file mode 100755
index 0000000..af28b63
--- /dev/null
+++ b/qa/workunits/fs/snaps/snaptest-xattrwb.sh
@@ -0,0 +1,31 @@
+#!/bin/sh -x
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+echo "testing simple xattr wb"
+touch x
+setfattr -n user.foo x
+mkdir .snap/s1
+getfattr -n user.foo .snap/s1/x | grep user.foo
+rm x
+rmdir .snap/s1
+
+echo "testing wb with pre-wb server cow"
+mkdir a
+mkdir a/b
+mkdir a/b/c
+# b now has As but not Ax
+setfattr -n user.foo a/b
+mkdir a/.snap/s
+mkdir a/b/cc
+# b now has been cowed on the server, but we still have dirty xattr caps
+getfattr -n user.foo a/b          # there they are...
+getfattr -n user.foo a/.snap/s/b | grep user.foo  # should be there, too!
+
+# ok, clean up
+rmdir a/.snap/s
+rm -r a
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/fs/snaps/untar_snap_rm.sh b/qa/workunits/fs/snaps/untar_snap_rm.sh
new file mode 100755
index 0000000..b337aea
--- /dev/null
+++ b/qa/workunits/fs/snaps/untar_snap_rm.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+set -e
+
+ceph mds set allow_new_snaps true --yes-i-really-mean-it
+
+do_tarball() {
+    wget http://download.ceph.com/qa/$1
+    tar xvf$2 $1
+    mkdir .snap/k
+    sync
+    rm -rv $3
+    cp -av .snap/k .
+    rmdir .snap/k
+    rm -rv k
+    rm $1
+}
+
+do_tarball coreutils_8.5.orig.tar.gz z coreutils-8.5
+do_tarball linux-2.6.33.tar.bz2 j linux-2.6.33
diff --git a/qa/workunits/fs/test_o_trunc.c b/qa/workunits/fs/test_o_trunc.c
new file mode 100644
index 0000000..1ce19e4
--- /dev/null
+++ b/qa/workunits/fs/test_o_trunc.c
@@ -0,0 +1,45 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+
+int main(int argc, char *argv[])
+{
+	char obuf[32], ibuf[1024];
+	int n, max = 0;
+	
+	if (argc > 2)
+		max = atoi(argv[2]);
+	if (!max)
+		max = 600;
+	
+	memset(obuf, 0xff, sizeof(obuf));
+	
+	for (n = 1; n <= max; ++n) {
+		int fd, ret;
+		fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0644);
+		printf("%d/%d: open fd = %d\n", n, max, fd);
+		
+		ret = write(fd, obuf, sizeof(obuf));
+		printf("write ret = %d\n", ret);
+		
+		sleep(1);
+		
+		ret = write(fd, obuf, sizeof(obuf));
+		printf("write ret = %d\n", ret);
+		
+		ret = pread(fd, ibuf, sizeof(ibuf), 0);
+		printf("pread ret = %d\n", ret);
+		
+		if (memcmp(obuf, ibuf, sizeof(obuf))) {
+			printf("mismatch\n");
+			close(fd);
+			break;
+		}
+		close(fd);
+	}
+	return 0;
+}
diff --git a/qa/workunits/fs/test_o_trunc.sh b/qa/workunits/fs/test_o_trunc.sh
new file mode 100755
index 0000000..90a7260
--- /dev/null
+++ b/qa/workunits/fs/test_o_trunc.sh
@@ -0,0 +1,7 @@
+#!/bin/sh -ex
+
+mydir=`dirname $0`
+$mydir/test_o_trunc trunc.foo 600
+
+echo OK
+
diff --git a/qa/workunits/fs/test_python.sh b/qa/workunits/fs/test_python.sh
new file mode 100755
index 0000000..ea0af66
--- /dev/null
+++ b/qa/workunits/fs/test_python.sh
@@ -0,0 +1,10 @@
+#!/bin/sh -ex
+
+CEPH_REF=${CEPH_REF:-master}
+wget -O test_cephfs.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=src/test/pybind/test_cephfs.py" || \
+    wget -O test_cephfs.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=ref/heads/$CEPH_REF;f=src/test/pybind/test_cephfs.py"
+
+# Running as root because the filesystem root directory will be
+# owned by uid 0, and that's where we're writing.
+sudo nosetests -v test_cephfs
+exit 0
diff --git a/qa/workunits/hadoop/repl.sh b/qa/workunits/hadoop/repl.sh
new file mode 100755
index 0000000..f2e9fcc
--- /dev/null
+++ b/qa/workunits/hadoop/repl.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+set -e
+set -x
+
+# bail if $TESTDIR is not set as this test will fail in that scenario
+[ -z $TESTDIR ] && { echo "\$TESTDIR needs to be set, but is not. Exiting."; exit 1; }
+
+# if HADOOP_PREFIX is not set, use default
+[ -z $HADOOP_PREFIX ] && { HADOOP_PREFIX=$TESTDIR/hadoop; }
+
+# create pools with different replication factors
+for repl in 2 3 7 8 9; do
+  name=hadoop.$repl
+  ceph osd pool create $name 8 8
+  ceph osd pool set $name size $repl
+
+  id=`ceph osd dump | sed -n "s/^pool \([0-9]*\) '$name'.*/\1/p"`
+  ceph mds add_data_pool $id
+done
+
+# create a file in each of the pools
+for repl in 2 3 7 8 9; do
+  name=hadoop.$repl
+  $HADOOP_PREFIX/bin/hadoop fs -rm -f /$name.dat
+  dd if=/dev/zero bs=1048576 count=1 | \
+    $HADOOP_PREFIX/bin/hadoop fs -Dceph.data.pools="$name" \
+    -put - /$name.dat
+done
+
+# check that hadoop reports replication matching
+# that of the pool the file was written into
+for repl in 2 3 7 8 9; do
+  name=hadoop.$repl
+  repl2=$($HADOOP_PREFIX/bin/hadoop fs -ls /$name.dat | awk '{print $2}')
+  if [ $repl -ne $repl2 ]; then
+    echo "replication factors didn't match!"
+    exit 1
+  fi
+done
+
+exit 0
diff --git a/qa/workunits/hadoop/terasort.sh b/qa/workunits/hadoop/terasort.sh
new file mode 100755
index 0000000..7996aec
--- /dev/null
+++ b/qa/workunits/hadoop/terasort.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+
+set -e
+set -x
+
+INPUT=/terasort-input
+OUTPUT=/terasort-output
+REPORT=/tersort-report
+
+num_records=100000
+[ ! -z $NUM_RECORDS ] && num_records=$NUM_RECORDS
+
+# bail if $TESTDIR is not set as this test will fail in that scenario
+[ -z $TESTDIR ] && { echo "\$TESTDIR needs to be set, but is not. Exiting."; exit 1; }
+
+# if HADOOP_PREFIX is not set, use default
+[ -z $HADOOP_PREFIX ] && { HADOOP_PREFIX=$TESTDIR/hadoop; }
+
+# Nuke hadoop directories
+$HADOOP_PREFIX/bin/hadoop fs -rm -r $INPUT $OUTPUT $REPORT || true
+
+# Generate terasort data
+#
+#-Ddfs.blocksize=512M \
+#-Dio.file.buffer.size=131072 \
+#-Dmapreduce.map.java.opts=-Xmx1536m \
+#-Dmapreduce.map.memory.mb=2048 \
+#-Dmapreduce.task.io.sort.mb=256 \
+#-Dyarn.app.mapreduce.am.resource.mb=1024 \
+#-Dmapred.map.tasks=64 \
+$HADOOP_PREFIX/bin/hadoop jar \
+  $HADOOP_PREFIX/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \
+  teragen \
+  -Dmapred.map.tasks=9 \
+  $num_records \
+  $INPUT
+
+# Run the sort job
+#
+#-Ddfs.blocksize=512M \
+#-Dio.file.buffer.size=131072 \
+#-Dmapreduce.map.java.opts=-Xmx1536m \
+#-Dmapreduce.map.memory.mb=2048 \
+#-Dmapreduce.map.output.compress=true \
+#-Dmapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.Lz4Codec \
+#-Dmapreduce.reduce.java.opts=-Xmx1536m \
+#-Dmapreduce.reduce.memory.mb=2048 \
+#-Dmapreduce.task.io.sort.factor=100 \
+#-Dmapreduce.task.io.sort.mb=768 \
+#-Dyarn.app.mapreduce.am.resource.mb=1024 \
+#-Dmapred.reduce.tasks=100 \
+#-Dmapreduce.terasort.output.replication=1 \
+$HADOOP_PREFIX/bin/hadoop jar \
+  $HADOOP_PREFIX/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \
+  terasort \
+  -Dmapred.reduce.tasks=10 \
+  $INPUT $OUTPUT
+
+# Validate the sorted data
+#
+#-Ddfs.blocksize=512M \
+#-Dio.file.buffer.size=131072 \
+#-Dmapreduce.map.java.opts=-Xmx1536m \
+#-Dmapreduce.map.memory.mb=2048 \
+#-Dmapreduce.reduce.java.opts=-Xmx1536m \
+#-Dmapreduce.reduce.memory.mb=2048 \
+#-Dmapreduce.task.io.sort.mb=256 \
+#-Dyarn.app.mapreduce.am.resource.mb=1024 \
+#-Dmapred.reduce.tasks=1 \
+$HADOOP_PREFIX/bin/hadoop jar \
+  $HADOOP_PREFIX/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \
+  teravalidate \
+  -Dmapred.reduce.tasks=1 \
+  $OUTPUT $REPORT
+
+exit 0
diff --git a/qa/workunits/hadoop/wordcount.sh b/qa/workunits/hadoop/wordcount.sh
new file mode 100755
index 0000000..1ff057a
--- /dev/null
+++ b/qa/workunits/hadoop/wordcount.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+set -e
+set -x
+
+WC_INPUT=/wc_input
+WC_OUTPUT=/wc_output
+DATA_INPUT=$(mktemp -d)
+
+echo "starting hadoop-wordcount test"
+
+# bail if $TESTDIR is not set as this test will fail in that scenario
+[ -z $TESTDIR ] && { echo "\$TESTDIR needs to be set, but is not. Exiting."; exit 1; }
+
+# if HADOOP_PREFIX is not set, use default
+[ -z $HADOOP_PREFIX ] && { HADOOP_PREFIX=$TESTDIR/hadoop; }
+
+# Nuke hadoop directories
+$HADOOP_PREFIX/bin/hadoop fs -rm -r $WC_INPUT $WC_OUTPUT || true
+
+# Fetch and import testing data set
+curl http://download.ceph.com/qa/hadoop_input_files.tar | tar xf - -C $DATA_INPUT
+$HADOOP_PREFIX/bin/hadoop fs -copyFromLocal $DATA_INPUT $WC_INPUT
+rm -rf $DATA_INPUT
+
+# Run the job
+$HADOOP_PREFIX/bin/hadoop jar \
+  $HADOOP_PREFIX/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar \
+  wordcount $WC_INPUT $WC_OUTPUT
+
+# Cleanup
+$HADOOP_PREFIX/bin/hadoop fs -rm -r $WC_INPUT $WC_OUTPUT || true
+
+echo "completed hadoop-wordcount test"
+exit 0
diff --git a/qa/workunits/kernel_untar_build.sh b/qa/workunits/kernel_untar_build.sh
new file mode 100755
index 0000000..93fee1f
--- /dev/null
+++ b/qa/workunits/kernel_untar_build.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+set -e
+
+wget -q http://download.ceph.com/qa/linux-4.0.5.tar.xz
+
+mkdir t
+cd t
+tar Jxvf ../linux*.xz
+cd linux*
+make defconfig
+make -j`grep -c processor /proc/cpuinfo`
+cd ..
+if ! rm -rv linux* ; then
+    echo "uh oh rm -r failed, it left behind:"
+    find .
+    exit 1
+fi
+cd ..
+rm -rv t linux*
diff --git a/qa/workunits/libcephfs-java/test.sh b/qa/workunits/libcephfs-java/test.sh
new file mode 100755
index 0000000..f299e95
--- /dev/null
+++ b/qa/workunits/libcephfs-java/test.sh
@@ -0,0 +1,39 @@
+#!/bin/sh -e
+
+echo "starting libcephfs-java tests"
+# configure CEPH_CONF and LD_LIBRARY_PATH if they're not already set
+conf="$CEPH_CONF"
+if [ -z "$conf" ] ; then
+	echo "Setting conf to /etc/ceph/ceph.conf" 
+	conf="/etc/ceph/ceph.conf"
+else
+	echo "conf is set to $conf"
+fi
+
+ld_lib_path="$LD_LIBRARY_PATH"
+if [ -z "$ld_lib_path" ] ; then
+	echo "Setting ld_lib_path to /usr/lib/jni:/usr/lib64"
+	ld_lib_path="/usr/lib/jni:/usr/lib64"
+else
+	echo "ld_lib_path was set to $ld_lib_path"
+fi
+
+ceph_java="$CEPH_JAVA_PATH"
+if [ -z "$ceph_java" ] ; then
+	echo "Setting ceph_java to /usr/share/java"
+	ceph_java="/usr/share/java"
+else
+	echo "ceph_java was set to $ceph_java"
+fi
+
+command="java -DCEPH_CONF_FILE=$conf -Djava.library.path=$ld_lib_path -cp /usr/share/java/junit4.jar:$ceph_java/libcephfs.jar:$ceph_java/libcephfs-test.jar org.junit.runner.JUnitCore com.ceph.fs.CephAllTests"
+
+echo "----------------------"
+echo $command
+echo "----------------------"
+
+$command
+
+echo "completed libcephfs-java tests"
+
+exit 0
diff --git a/qa/workunits/libcephfs/test.sh b/qa/workunits/libcephfs/test.sh
new file mode 100755
index 0000000..4a501e0
--- /dev/null
+++ b/qa/workunits/libcephfs/test.sh
@@ -0,0 +1,5 @@
+#!/bin/sh -e
+
+ceph_test_libcephfs
+
+exit 0
diff --git a/qa/workunits/mon/auth_caps.sh b/qa/workunits/mon/auth_caps.sh
new file mode 100755
index 0000000..74b2277
--- /dev/null
+++ b/qa/workunits/mon/auth_caps.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+
+set -e
+set -x
+declare -A keymap
+
+combinations="r w x rw rx wx rwx"
+
+for i in ${combinations}; do
+  k="foo_$i"
+  k=`ceph auth get-or-create-key client.$i mon "allow $i"` || exit 1
+  keymap["$i"]=$k
+done
+
+# add special caps
+# force blank cap with '--force'
+keymap["blank"]=`ceph auth get-or-create-key client.blank mon 'allow' --force` || exit 1
+keymap["all"]=`ceph auth get-or-create-key client.all mon 'allow *'` || exit 1
+
+tmp=`mktemp`
+ceph auth export > $tmp
+
+trap "rm $tmp" INT ERR EXIT QUIT 0
+
+expect() {
+
+  set +e
+
+  local expected_ret=$1
+  local ret
+
+  shift
+  cmd=$@
+
+  eval $cmd
+  ret=$?
+
+  set -e
+
+  if [[ $ret -ne $expected_ret ]]; then
+    echo "ERROR: running \'$cmd\': expected $expected_ret got $ret"
+    return 1
+  fi
+
+  return 0
+}
+
+read_ops() {
+  local caps=$1
+  local has_read=1 has_exec=1
+  local ret
+  local args
+
+  ( echo $caps | grep 'r' ) || has_read=0
+  ( echo $caps | grep 'x' ) || has_exec=0
+  
+  if [[ "$caps" == "all" ]]; then
+    has_read=1
+    has_exec=1
+  fi
+
+  ret=13
+  if [[ $has_read -gt 0 && $has_exec -gt 0 ]]; then
+    ret=0
+  fi
+
+  args="--id $caps --key ${keymap[$caps]}"
+ 
+  expect $ret ceph auth get client.admin $args
+  expect $ret ceph auth get-key client.admin $args
+  expect $ret ceph auth export $args
+  expect $ret ceph auth export client.admin $args
+  expect $ret ceph auth list $args
+  expect $ret ceph auth print-key client.admin $args
+  expect $ret ceph auth print_key client.admin $args
+}
+
+write_ops() {
+
+  local caps=$1
+  local has_read=1 has_write=1 has_exec=1
+  local ret
+  local err
+  local args
+
+  ( echo $caps | grep 'r' ) || has_read=0
+  ( echo $caps | grep 'w' ) || has_write=0
+  ( echo $caps | grep 'x' ) || has_exec=0
+
+  if [[ "$caps" == "all" ]]; then
+    has_read=1
+    has_write=1
+    has_exec=1
+  fi
+
+  ret=13
+  if [[ $has_read -gt 0 && $has_write -gt 0 && $has_exec -gt 0 ]]; then
+    ret=0
+  fi
+
+  args="--id $caps --key ${keymap[$caps]}"
+
+  expect $ret ceph auth add client.foo $args
+  expect $ret "ceph auth caps client.foo mon 'allow *' $args"
+  expect $ret ceph auth get-or-create client.admin $args
+  echo "wtf -- before: err=$err ret=$ret"
+  err=$ret
+  [[ $ret -eq 0 ]] && err=22 # EINVAL
+  expect $err "ceph auth get-or-create client.bar mon 'allow' $args"
+  echo "wtf -- after: err=$err ret=$ret"
+  expect $ret "ceph auth get-or-create client.bar mon 'allow' --force $args"
+  expect $ret ceph auth get-or-create-key client.admin $args
+  expect $ret ceph auth get-or-create-key client.baz $args
+  expect $ret ceph auth del client.bar $args
+  expect $ret ceph auth del client.baz $args
+  expect $ret ceph auth del client.foo $args
+  expect $ret ceph auth import -i $tmp $args
+}
+
+echo "running combinations: ${!keymap[@]}"
+
+subcmd=$1
+
+for i in ${!keymap[@]}; do
+  echo "caps: $i"
+  if [[ -z "$subcmd" || "$subcmd" == "read" || "$subcmd" == "all" ]]; then
+    read_ops $i
+  fi
+
+  if [[ -z "$subcmd" || "$subcmd" == "write" || "$subcmd" == "all" ]]; then
+    write_ops $i
+  fi
+done
+
+# cleanup
+for i in ${combinations} blank all; do
+  ceph auth del client.$i || exit 1
+done
+
+echo "OK"
diff --git a/qa/workunits/mon/caps.py b/qa/workunits/mon/caps.py
new file mode 100644
index 0000000..44bd0c2
--- /dev/null
+++ b/qa/workunits/mon/caps.py
@@ -0,0 +1,367 @@
+#!/usr/bin/python
+
+import json
+import subprocess
+import shlex
+from StringIO import StringIO
+import errno
+import sys
+import os
+import io
+import re
+
+
+import rados
+from ceph_argparse import *
+
+keyring_base = '/tmp/cephtest-caps.keyring'
+
+class UnexpectedReturn(Exception):
+  def __init__(self, cmd, ret, expected, msg):
+    if isinstance(cmd, list):
+      self.cmd = ' '.join(cmd)
+    else:
+      assert isinstance(cmd, str) or isinstance(cmd, unicode), \
+          'cmd needs to be either a list or a str'
+      self.cmd = cmd
+    self.cmd = str(self.cmd)
+    self.ret = int(ret)
+    self.expected = int(expected)
+    self.msg = str(msg)
+
+  def __str__(self):
+    return repr('{c}: expected return {e}, got {r} ({o})'.format(
+        c=self.cmd, e=self.expected, r=self.ret, o=self.msg))
+
+def call(cmd):
+  if isinstance(cmd, list):
+    args = cmd
+  elif isinstance(cmd, str) or isinstance(cmd, unicode):
+    args = shlex.split(cmd)
+  else:
+    assert False, 'cmd is not a string/unicode nor a list!'
+
+  print 'call: {0}'.format(args)
+  proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+  ret = proc.wait()
+
+  return (ret, proc)
+
+def expect(cmd, expected_ret):
+
+  try:
+    (r, p) = call(cmd)
+  except ValueError as e:
+    print >> sys.stderr, \
+             'unable to run {c}: {err}'.format(c=repr(cmd), err=e.message)
+    return errno.EINVAL
+
+  assert r == p.returncode, \
+      'wth? r was supposed to match returncode!'
+
+  if r != expected_ret:
+    raise UnexpectedReturn(repr(cmd), r, expected_ret, str(p.stderr.read()))
+
+  return p
+
+def expect_to_file(cmd, expected_ret, out_file, mode='a'):
+
+  # Let the exception be propagated to the caller
+  p = expect(cmd, expected_ret)
+  assert p.returncode == expected_ret, \
+      'expected result doesn\'t match and no exception was thrown!'
+
+  with io.open(out_file, mode) as file:
+    file.write(unicode(p.stdout.read()))
+
+  return p
+
+class Command:
+  def __init__(self, cid, j):
+    self.cid = cid[3:]
+    self.perms = j['perm']
+    self.module = j['module']
+
+    self.sig = ''
+    self.args = []
+    for s in j['sig']:
+      if not isinstance(s, dict):
+        assert isinstance(s, str) or isinstance(s,unicode), \
+            'malformatted signature cid {0}: {1}\n{2}'.format(cid,s,j)
+        if len(self.sig) > 0:
+          self.sig += ' '
+        self.sig += s
+      else:
+        self.args.append(s)
+
+  def __str__(self):
+    return repr('command {0}: {1} (requires \'{2}\')'.format(self.cid,\
+          self.sig, self.perms))
+
+
+def destroy_keyring(path):
+  if not os.path.exists(path):
+    raise Exception('oops! cannot remove inexistent keyring {0}'.format(path))
+
+  # grab all client entities from the keyring
+  entities = [m.group(1) for m in [re.match(r'\[client\.(.*)\]', l)
+                for l in [str(line.strip())
+                  for line in io.open(path,'r')]] if m is not None]
+
+  # clean up and make sure each entity is gone
+  for e in entities:
+    expect('ceph auth del client.{0}'.format(e), 0)
+    expect('ceph auth get client.{0}'.format(e), errno.ENOENT)
+
+  # remove keyring
+  os.unlink(path)
+
+  return True
+
+def test_basic_auth():
+  # make sure we can successfully add/del entities, change their caps
+  # and import/export keyrings.
+
+  expect('ceph auth add client.basicauth', 0)
+  expect('ceph auth caps client.basicauth mon \'allow *\'', 0)
+  # entity exists and caps do not match
+  expect('ceph auth add client.basicauth', errno.EINVAL)
+  # this command attempts to change an existing state and will fail
+  expect('ceph auth add client.basicauth mon \'allow w\'', errno.EINVAL)
+  expect('ceph auth get-or-create client.basicauth', 0)
+  expect('ceph auth get-key client.basicauth', 0)
+  expect('ceph auth get-or-create client.basicauth2', 0)
+  # cleanup
+  expect('ceph auth del client.basicauth', 0)
+  expect('ceph auth del client.basicauth2', 0)
+
+  return True
+
+def gen_module_keyring(module):
+  module_caps = [
+      ('all', '{t} \'allow service {s} rwx\'', 0),
+      ('none', '', errno.EACCES),
+      ('wrong', '{t} \'allow service foobar rwx\'', errno.EACCES),
+      ('right', '{t} \'allow service {s} {p}\'', 0),
+      ('no-execute', '{t} \'allow service {s} x\'', errno.EACCES)
+      ]
+
+  keyring = '{0}.service-{1}'.format(keyring_base,module)
+  for perms in 'r rw x'.split():
+    for (n,p,r) in module_caps:
+      c = p.format(t='mon', s=module, p=perms)
+      expect_to_file(
+          'ceph auth get-or-create client.{cn}-{cp} {caps}'.format(
+          cn=n,cp=perms,caps=c), 0, keyring)
+
+  return keyring
+
+
+def test_all():
+
+
+  perms = {
+      'good': {
+        'broad':[
+          ('rwx', 'allow *'),
+          ('r', 'allow r'),
+          ('rw', 'allow rw'),
+          ('x', 'allow x'),
+          ],
+        'service':[
+          ('rwx', 'allow service {s} rwx'),
+          ('r', 'allow service {s} r'),
+          ('rw', 'allow service {s} rw'),
+          ('x', 'allow service {s} x'),
+          ],
+        'command':[
+          ('rwx', 'allow command "{c}"'),
+          ],
+        'command-with':[
+          ('rwx', 'allow command "{c}" with {kv}')
+          ],
+        'command-with-prefix':[
+          ('rwx', 'allow command "{c}" with {key} prefix {val}')
+          ]
+        },
+      'bad': {
+        'broad':[
+          ('none', ''),
+          ],
+        'service':[
+          ('none1', 'allow service foo rwx'),
+          ('none2', 'allow service foo r'),
+          ('none3', 'allow service foo rw'),
+          ('none4', 'allow service foo x'),
+          ],
+        'command':[
+          ('none', 'allow command foo'),
+          ],
+        'command-with':[
+          ('none', 'allow command "{c}" with foo=bar'),
+          ],
+        'command-with-prefix':[
+          ('none', 'allow command "{c}" with foo prefix bar'),
+          ],
+        }
+      }
+
+  cmds = {
+      '':[
+        {
+          'cmd':('status', '', 'r')
+          },
+        {
+          'pre':'heap start_profiler',
+          'cmd':('heap', 'heapcmd=stats', 'rw'),
+          'post':'heap stop_profiler'
+          }
+        ],
+      'auth':[
+        {
+          'pre':'',
+          'cmd':('auth list', '', 'r'),
+          'post':''
+          },
+        {
+          'pre':'auth get-or-create client.foo mon \'allow *\'',
+          'cmd':('auth caps', 'entity="client.foo"', 'rw'),
+          'post':'auth del client.foo'
+          }
+        ],
+      'pg':[
+        {
+          'cmd':('pg getmap', '', 'r'),
+          },
+        ],
+      'mds':[
+        {
+          'cmd':('mds getmap', '', 'r'),
+          },
+        {
+          'cmd':('mds cluster_down', '', 'rw'),
+          'post':'mds cluster_up'
+          },
+        ],
+      'mon':[
+        {
+          'cmd':('mon getmap', '', 'r')
+          },
+        {
+          'cmd':('mon remove', 'name=a', 'rw')
+          }
+        ],
+      'osd':[
+        {
+          'cmd':('osd getmap', '', 'r'),
+          },
+        {
+          'cmd':('osd pause', '', 'rw'),
+          'post':'osd unpause'
+          },
+        {
+          'cmd':('osd crush dump', '', 'r')
+          },
+        ],
+      'config-key':[
+          {
+            'pre':'config-key put foo bar',
+            'cmd':('config-key get', 'key=foo', 'r')
+            },
+          {
+            'pre':'config-key put foo bar',
+            'cmd':('config-key del', 'key=foo', 'rw')
+            }
+          ]
+      }
+
+  for (module,cmd_lst) in cmds.iteritems():
+    k = keyring_base + '.' + module
+    for cmd in cmd_lst:
+
+      (cmd_cmd, cmd_args, cmd_perm) = cmd['cmd']
+      cmd_args_key = ''
+      cmd_args_val = ''
+      if len(cmd_args) > 0:
+        (cmd_args_key, cmd_args_val) = cmd_args.split('=')
+
+      print 'generating keyring for {m}/{c}'.format(m=module,c=cmd_cmd)
+      # gen keyring
+      for (good_or_bad,kind_map) in perms.iteritems():
+        for (kind,lst) in kind_map.iteritems():
+          for (perm, cap) in lst:
+            cap_formatted = cap.format(
+                s=module,
+                c=cmd_cmd,
+                kv=cmd_args,
+                key=cmd_args_key,
+                val=cmd_args_val)
+
+            if len(cap_formatted) == 0:
+              run_cap = ''
+            else:
+              run_cap = 'mon \'{fc}\''.format(fc=cap_formatted)
+
+            cname = 'client.{gb}-{kind}-{p}'.format(
+                gb=good_or_bad,kind=kind,p=perm)
+            expect_to_file(
+                'ceph auth get-or-create {n} {c}'.format(
+                  n=cname,c=run_cap), 0, k)
+      # keyring generated
+      print 'testing {m}/{c}'.format(m=module,c=cmd_cmd)
+
+      # test
+      for good_bad in perms.iterkeys():
+        for (kind,lst) in perms[good_bad].iteritems():
+          for (perm,_) in lst:
+            cname = 'client.{gb}-{k}-{p}'.format(gb=good_bad,k=kind,p=perm)
+
+          if good_bad == 'good':
+            expect_ret = 0
+          else:
+            expect_ret = errno.EACCES
+
+          if ( cmd_perm not in perm ):
+            expect_ret = errno.EACCES
+          if 'with' in kind and len(cmd_args) == 0:
+            expect_ret = errno.EACCES
+          if 'service' in kind and len(module) == 0:
+            expect_ret = errno.EACCES
+
+          if 'pre' in cmd and len(cmd['pre']) > 0:
+            expect('ceph {0}'.format(cmd['pre']), 0)
+          expect('ceph -n {cn} -k {k} {c} {arg_val}'.format(
+            cn=cname,k=k,c=cmd_cmd,arg_val=cmd_args_val), expect_ret)
+          if 'post' in cmd and len(cmd['post']) > 0:
+            expect('ceph {0}'.format(cmd['post']), 0)
+      # finish testing
+      destroy_keyring(k)
+
+
+  return True
+
+
+def test_misc():
+
+  k = keyring_base + '.misc'
+  expect_to_file(
+      'ceph auth get-or-create client.caps mon \'allow command "auth caps"' \
+          ' with entity="client.caps"\'', 0, k)
+  expect('ceph -n client.caps -k {kf} mon_status'.format(kf=k), errno.EACCES)
+  expect('ceph -n client.caps -k {kf} auth caps client.caps mon \'allow *\''.format(kf=k), 0)
+  expect('ceph -n client.caps -k {kf} mon_status'.format(kf=k), 0)
+  destroy_keyring(k)
+
+def main():
+
+  test_basic_auth()
+  test_all()
+  test_misc()
+
+  print 'OK'
+
+  return 0
+
+if __name__ == '__main__':
+  main()
+
diff --git a/qa/workunits/mon/caps.sh b/qa/workunits/mon/caps.sh
new file mode 100755
index 0000000..f5aebbb
--- /dev/null
+++ b/qa/workunits/mon/caps.sh
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+tmp=/tmp/cephtest-mon-caps-madness
+
+exit_on_error=1
+
+[[ ! -z $TEST_EXIT_ON_ERROR ]] && exit_on_error=$TEST_EXIT_ON_ERROR
+
+expect()
+{
+  cmd=$1
+  expected_ret=$2
+
+  echo $cmd
+  eval $cmd >&/dev/null
+  ret=$?
+
+  if [[ $ret -ne $expected_ret ]]; then
+    echo "Error: Expected return $expected_ret, got $ret"
+    [[ $exit_on_error -eq 1 ]] && exit 1
+    return 1
+  fi
+
+  return 0
+}
+
+expect "ceph auth get-or-create client.bazar > $tmp.bazar.keyring" 0
+expect "ceph -k $tmp.bazar.keyring --user bazar mon_status" 13
+ceph auth del client.bazar
+
+c="'allow command \"auth list\", allow command mon_status'"
+expect "ceph auth get-or-create client.foo mon $c > $tmp.foo.keyring" 0
+expect "ceph -k $tmp.foo.keyring --user foo mon_status" 0
+expect "ceph -k $tmp.foo.keyring --user foo auth list" 0
+expect "ceph -k $tmp.foo.keyring --user foo auth export" 13
+expect "ceph -k $tmp.foo.keyring --user foo auth del client.bazar" 13
+expect "ceph -k $tmp.foo.keyring --user foo osd dump" 13
+expect "ceph -k $tmp.foo.keyring --user foo pg dump" 13
+expect "ceph -k $tmp.foo.keyring --user foo quorum_status" 13
+ceph auth del client.foo
+
+c="'allow command service with prefix=list, allow command mon_status'"
+expect "ceph auth get-or-create client.bar mon $c > $tmp.bar.keyring" 0
+expect "ceph -k $tmp.bar.keyring --user bar mon_status" 0
+expect "ceph -k $tmp.bar.keyring --user bar auth list" 13
+expect "ceph -k $tmp.bar.keyring --user bar auth export" 13
+expect "ceph -k $tmp.bar.keyring --user bar auth del client.foo" 13
+expect "ceph -k $tmp.bar.keyring --user bar osd dump" 13
+expect "ceph -k $tmp.bar.keyring --user bar pg dump" 13
+expect "ceph -k $tmp.bar.keyring --user bar quorum_status" 13
+ceph auth del client.bar
+
+rm $tmp.bazar.keyring $tmp.foo.keyring $tmp.bar.keyring
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/mon/crush_ops.sh b/qa/workunits/mon/crush_ops.sh
new file mode 100755
index 0000000..adb3162
--- /dev/null
+++ b/qa/workunits/mon/crush_ops.sh
@@ -0,0 +1,108 @@
+#!/bin/bash -x
+
+set -e
+
+function expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+ceph osd crush dump
+
+# rules
+ceph osd crush rule dump
+ceph osd crush rule ls
+ceph osd crush rule list
+
+ceph osd crush rule create-simple foo default host
+ceph osd crush rule create-simple foo default host
+ceph osd crush rule create-simple bar default host
+
+ceph osd crush rule ls | grep foo
+
+ceph osd crush rule rm foo
+ceph osd crush rule rm foo  # idempotent
+ceph osd crush rule rm bar
+
+# can't delete in-use rules, tho:
+expect_false ceph osd crush rule rm replicated_ruleset
+
+# build a simple map
+expect_false ceph osd crush add-bucket foo osd
+ceph osd crush add-bucket foo root
+o1=`ceph osd create`
+o2=`ceph osd create`
+ceph osd crush add $o1 1 host=host1 root=foo
+ceph osd crush add $o1 1 host=host1 root=foo  # idemptoent
+ceph osd crush add $o2 1 host=host2 root=foo
+ceph osd crush add $o2 1 host=host2 root=foo  # idempotent
+ceph osd crush add-bucket bar root
+ceph osd crush add-bucket bar root  # idempotent
+ceph osd crush link host1 root=bar
+ceph osd crush link host1 root=bar  # idempotent
+ceph osd crush link host2 root=bar
+ceph osd crush link host2 root=bar  # idempotent
+
+ceph osd tree | grep -c osd.$o1 | grep -q 2
+ceph osd tree | grep -c host1 | grep -q 2
+ceph osd tree | grep -c osd.$o2 | grep -q 2
+ceph osd tree | grep -c host2 | grep -q 2
+expect_false ceph osd crush rm host1 foo   # not empty
+ceph osd crush unlink host1 foo
+ceph osd crush unlink host1 foo
+ceph osd tree | grep -c host1 | grep -q 1
+
+expect_false ceph osd crush rm foo  # not empty
+expect_false ceph osd crush rm bar  # not empty
+ceph osd crush unlink host1 bar
+ceph osd tree | grep -c host1 | grep -q 1   # now an orphan
+ceph osd crush rm osd.$o1 host1
+ceph osd crush rm host1
+ceph osd tree | grep -c host1 | grep -q 0
+
+expect_false ceph osd crush rm bar   # not empty
+ceph osd crush unlink host2
+
+# reference foo and bar with a rule
+ceph osd crush rule create-simple foo-rule foo host firstn
+expect_false ceph osd crush rm foo
+ceph osd crush rule rm foo-rule
+
+ceph osd crush rm bar
+ceph osd crush rm foo
+ceph osd crush rm osd.$o2 host2
+ceph osd crush rm host2
+
+ceph osd crush rm osd.$o1
+ceph osd crush rm osd.$o2
+
+ceph osd crush add-bucket foo host
+ceph osd crush move foo root=default rack=localrack
+ceph osd crush rm foo
+
+# test reweight
+o3=`ceph osd create`
+ceph osd crush add $o3 123 root=default
+ceph osd tree | grep osd.$o3 | grep 123
+ceph osd crush reweight osd.$o3 113
+ceph osd tree | grep osd.$o3 | grep 113
+ceph osd crush rm osd.$o3
+ceph osd rm osd.$o3
+
+# test reweight-subtree
+o4=`ceph osd create`
+o5=`ceph osd create`
+ceph osd crush add $o4 123 root=default host=foobaz
+ceph osd crush add $o5 123 root=default host=foobaz
+ceph osd tree | grep osd.$o4 | grep 123
+ceph osd tree | grep osd.$o5 | grep 123
+ceph osd crush reweight-subtree foobaz 155
+ceph osd tree | grep osd.$o4 | grep 155
+ceph osd tree | grep osd.$o5 | grep 155
+ceph osd crush rm osd.$o4
+ceph osd crush rm osd.$o5
+ceph osd rm osd.$o4
+ceph osd rm osd.$o5
+
+echo OK
diff --git a/qa/workunits/mon/osd.sh b/qa/workunits/mon/osd.sh
new file mode 100755
index 0000000..75bf220
--- /dev/null
+++ b/qa/workunits/mon/osd.sh
@@ -0,0 +1,24 @@
+#!/bin/sh -x
+
+set -e
+
+ua=`uuidgen`
+ub=`uuidgen`
+
+# shoudl get same id with same uuid
+na=`ceph osd create $ua`
+test $na -eq `ceph osd create $ua`
+
+nb=`ceph osd create $ub`
+test $nb -eq `ceph osd create $ub`
+test $nb -ne $na
+
+ceph osd rm $na
+ceph osd rm $na
+ceph osd rm $nb
+ceph osd rm 1000
+
+na2=`ceph osd create $ua`
+
+echo OK
+
diff --git a/qa/workunits/mon/ping.py b/qa/workunits/mon/ping.py
new file mode 100755
index 0000000..6a38103
--- /dev/null
+++ b/qa/workunits/mon/ping.py
@@ -0,0 +1,104 @@
+#!/usr/bin/python
+
+import json
+import subprocess
+import shlex
+import errno
+import sys
+
+class UnexpectedReturn(Exception):
+    def __init__(self, cmd, ret, expected, msg):
+        if isinstance(cmd, list):
+            self.cmd = ' '.join(cmd)
+        else:
+            assert isinstance(cmd, str) or isinstance(cmd, unicode), \
+                    'cmd needs to be either a list or a str'
+            self.cmd = cmd
+        self.cmd = str(self.cmd)
+        self.ret = int(ret)
+        self.expected = int(expected)
+        self.msg = str(msg)
+
+    def __str__(self):
+        return repr('{c}: expected return {e}, got {r} ({o})'.format(
+                c=self.cmd, e=self.expected, r=self.ret, o=self.msg))
+
+def call(cmd):
+    if isinstance(cmd, list):
+        args = cmd
+    elif isinstance(cmd, basestring):
+        args = shlex.split(cmd)
+    else:
+        assert False, 'cmd is not a string/unicode nor a list!'
+
+    print 'call: {0}'.format(args)
+    proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    (procout,procerr) = proc.communicate(None)
+
+    return (proc.returncode, procout, procerr)
+
+def expect(cmd, expected_ret):
+
+    try:
+        (r, out, err) = call(cmd)
+    except ValueError as e:
+        assert False, \
+            'unable to run {c}: {err}'.format(c=repr(cmd), err=e.message)
+
+    if r != expected_ret:
+        raise UnexpectedReturn(repr(cmd), r, expected_ret, err)
+
+    return out
+
+def get_quorum_status(timeout=300):
+    cmd = 'ceph quorum_status'
+    if timeout > 0:
+        cmd += ' --connect-timeout {0}'.format(timeout)
+
+    out = expect(cmd, 0)
+    j = json.loads(out)
+    return j
+
+def main():
+
+    quorum_status = get_quorum_status()
+    mon_names = [mon['name'] for mon in quorum_status['monmap']['mons']]
+
+    print 'ping all monitors'
+    for m in mon_names:
+        print 'ping mon.{0}'.format(m)
+        out = expect('ceph ping mon.{0}'.format(m), 0)
+        reply = json.loads(out)
+
+        assert reply['mon_status']['name'] == m, \
+                'reply obtained from mon.{0}, expected mon.{1}'.format(
+                        reply['mon_status']['name'], m)
+
+    print 'test out-of-quorum reply'
+    for m in mon_names:
+        print 'testing mon.{0}'.format(m)
+        expect('ceph daemon mon.{0} quorum exit'.format(m), 0)
+
+        quorum_status = get_quorum_status()
+        assert m not in quorum_status['quorum_names'], \
+                'mon.{0} was not supposed to be in quorum ({1})'.format(
+                        m, quorum_status['quorum_names'])
+
+        out = expect('ceph ping mon.{0}'.format(m), 0)
+        reply = json.loads(out)
+        mon_status = reply['mon_status']
+
+        assert mon_status['name'] == m, \
+                'reply obtained from mon.{0}, expected mon.{1}'.format(
+                        mon_status['name'], m)
+
+        assert mon_status['state'] == 'electing', \
+                'mon.{0} is in state {1}, expected electing'.format(
+                        m,mon_status['state'])
+
+        expect('ceph daemon mon.{0} quorum enter'.format(m), 0)
+
+    print 'OK'
+
+if __name__ == '__main__':
+    main()
diff --git a/qa/workunits/mon/pool_ops.sh b/qa/workunits/mon/pool_ops.sh
new file mode 100755
index 0000000..b19dbd1
--- /dev/null
+++ b/qa/workunits/mon/pool_ops.sh
@@ -0,0 +1,49 @@
+#!/bin/bash -x
+
+set -e
+
+function expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+# note: we need to pass the other args or ceph_argparse.py will take
+# 'invalid' that is not replicated|erasure and assume it is the next
+# argument, which is a string.
+expect_false ceph osd pool create foo 123 123 invalid foo-profile foo-ruleset
+
+ceph osd pool create foo 123 123 replicated
+ceph osd pool create fooo 123 123 erasure default
+ceph osd pool create foooo 123
+
+ceph osd pool create foo 123 # idempotent
+
+ceph osd pool set foo size 1
+ceph osd pool set foo size 4
+ceph osd pool set foo size 10
+expect_false ceph osd pool set foo size 0
+expect_false ceph osd pool set foo size 20
+
+# should fail due to safety interlock
+expect_false ceph osd pool delete foo
+expect_false ceph osd pool delete foo foo
+expect_false ceph osd pool delete foo foo --force
+expect_false ceph osd pool delete foo fooo --yes-i-really-mean-it
+expect_false ceph osd pool delete foo --yes-i-really-mean-it foo
+
+ceph osd pool delete foooo foooo --yes-i-really-really-mean-it
+ceph osd pool delete fooo fooo --yes-i-really-really-mean-it
+ceph osd pool delete foo foo --yes-i-really-really-mean-it
+
+# idempotent
+ceph osd pool delete foo foo --yes-i-really-really-mean-it
+ceph osd pool delete fooo fooo --yes-i-really-really-mean-it
+ceph osd pool delete fooo fooo --yes-i-really-really-mean-it
+
+# non-existent pool
+ceph osd pool delete fuggg fuggg --yes-i-really-really-mean-it
+
+echo OK
+
+
diff --git a/qa/workunits/mon/rbd_snaps_ops.sh b/qa/workunits/mon/rbd_snaps_ops.sh
new file mode 100755
index 0000000..97c9996
--- /dev/null
+++ b/qa/workunits/mon/rbd_snaps_ops.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+
+# attempt to trigger #6047
+
+
+cmd_no=0
+expect()
+{
+  cmd_no=$(($cmd_no+1))
+  cmd="$1"
+  expected=$2
+  echo "[$cmd_no] $cmd"
+  eval  $cmd
+  ret=$?
+  if [[ $ret -ne $expected ]]; then
+    echo "[$cmd_no] unexpected return '$ret', expected '$expected'"
+    exit 1
+  fi
+}
+
+expect 'ceph osd pool create test 256 256' 0
+expect 'ceph osd pool mksnap test snapshot' 0
+expect 'ceph osd pool rmsnap test snapshot' 0
+
+expect 'rbd --pool=test create --size=102400 image' 0
+expect 'rbd --pool=test snap create image at snapshot' 22
+
+expect 'ceph osd pool delete test test --yes-i-really-really-mean-it' 0
+expect 'ceph osd pool create test 256 256' 0
+expect 'rbd --pool=test create --size=102400 image' 0
+expect 'rbd --pool=test snap create image at snapshot' 0
+expect 'rbd --pool=test snap ls image' 0
+expect 'rbd --pool=test snap rm image at snapshot' 0
+
+expect 'ceph osd pool mksnap test snapshot' 22
+
+expect 'ceph osd pool delete test test --yes-i-really-really-mean-it' 0
+
+# reproduce 7210 and expect it to be fixed
+# basically create such a scenario where we end up deleting what used to
+# be an unmanaged snapshot from a not-unmanaged pool
+
+expect 'rados mkpool test-foo' 0
+expect 'rbd --pool test-foo create --size 1024 image' 0
+expect 'rbd --pool test-foo snap create image at snapshot' 0
+expect 'rados mkpool test-bar' 0
+expect 'rados cppool test-foo test-bar' 0
+expect 'rbd --pool test-bar snap rm image at snapshot' 95
+expect 'ceph osd pool delete test-foo test-foo --yes-i-really-really-mean-it' 0
+expect 'ceph osd pool delete test-bar test-bar --yes-i-really-really-mean-it' 0
+
+
+echo OK
diff --git a/qa/workunits/mon/test_mon_config_key.py b/qa/workunits/mon/test_mon_config_key.py
new file mode 100755
index 0000000..037d5d1
--- /dev/null
+++ b/qa/workunits/mon/test_mon_config_key.py
@@ -0,0 +1,400 @@
+#!/usr/bin/python
+#
+# test_mon_config_key - Test 'ceph config-key' interface
+#
+# Copyright (C) 2013 Inktank
+#
+# This is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software
+# Foundation.  See file COPYING.
+#
+import sys
+import os
+import base64
+import time
+import errno
+import random
+import subprocess
+import string
+import logging
+import argparse
+
+
+#
+# Accepted Environment variables:
+#   CEPH_TEST_VERBOSE     - be more verbose; '1' enables; '0' disables
+#   CEPH_TEST_DURATION    - test duration in seconds
+#   CEPH_TEST_SEED        - seed to be used during the test
+#
+# Accepted arguments and options (see --help):
+#   -v, --verbose         - be more verbose
+#   -d, --duration SECS   - test duration in seconds
+#   -s, --seed SEED       - seed to be used during the test
+#
+
+
+LOG = logging.getLogger(os.path.basename(sys.argv[0].replace('.py','')))
+
+SIZES = [
+    (0, 0),
+    (10, 0),
+    (25, 0),
+    (50, 0),
+    (100, 0),
+    (1000, 0),
+    (4096, 0),
+    (4097, -errno.EFBIG),
+    (8192, -errno.EFBIG)
+    ]
+
+OPS = {
+      'put':['existing','new'],
+      'del':['existing','enoent'],
+      'exists':['existing','enoent'],
+      'get':['existing','enoent']
+      }
+
+CONFIG_PUT = []       #list: keys
+CONFIG_DEL = []       #list: keys
+CONFIG_EXISTING = {}  #map: key -> size
+
+def run_cmd(cmd, expects=0):
+    full_cmd = [ 'ceph', 'config-key' ] + cmd
+
+    if expects < 0:
+        expects = -expects
+
+    cmdlog = LOG.getChild('run_cmd')
+    cmdlog.debug('{fc}'.format(fc=' '.join(full_cmd)))
+
+    proc = subprocess.Popen(full_cmd,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE)
+
+    stdout = []
+    stderr = []
+    while True:
+        try:
+            (out, err) = proc.communicate()
+            if out is not None:
+                stdout += str(out).split('\n')
+                cmdlog.debug('stdout: {s}'.format(s=out))
+            if err is not None:
+                stdout += str(err).split('\n')
+                cmdlog.debug('stderr: {s}'.format(s=err))
+        except ValueError:
+            ret = proc.wait()
+            break
+
+    if ret != expects:
+        cmdlog.error('cmd > {cmd}'.format(cmd=full_cmd))
+        cmdlog.error('expected return \'{expected}\' got \'{got}\''.format(
+            expected=expects,got=ret))
+        cmdlog.error('stdout')
+        for i in stdout:
+            cmdlog.error('{x}'.format(x=i))
+        cmdlog.error('stderr')
+        for i in stderr:
+            cmdlog.error('{x}'.format(x=i))
+
+#end run_cmd
+
+def gen_data(size, rnd):
+    chars = string.ascii_letters + string.digits
+    return ''.join(rnd.choice(chars) for i in range(size))
+
+def gen_key(rnd):
+    return gen_data(20, rnd)
+
+def gen_tmp_file_path(rnd):
+    file_name = gen_data(20, rnd)
+    file_path = os.path.join('/tmp', 'ceph-test.'+file_name)
+    return file_path
+
+def destroy_tmp_file(fpath):
+    if os.path.exists(fpath) and os.path.isfile(fpath):
+        os.unlink(fpath)
+
+def write_data_file(data, rnd):
+    file_path = gen_tmp_file_path(rnd)
+    data_file = open(file_path, 'wr+')
+    data_file.truncate()
+    data_file.write(data)
+    data_file.close()
+    return file_path
+#end write_data_file
+
+def choose_random_op(rnd):
+    op = rnd.choice(OPS.keys())
+    sop = rnd.choice(OPS[op])
+    return (op, sop)
+
+
+def parse_args(args):
+    parser = argparse.ArgumentParser(
+        description='Test the monitor\'s \'config-key\' API',
+        )
+    parser.add_argument(
+        '-v', '--verbose',
+        action='store_true',
+        help='be more verbose',
+        )
+    parser.add_argument(
+        '-s', '--seed',
+        metavar='SEED',
+        help='use SEED instead of generating it in run-time',
+        )
+    parser.add_argument(
+        '-d', '--duration',
+        metavar='SECS',
+        help='run test for SECS seconds (default: 300)',
+        )
+    parser.set_defaults(
+        seed=None,
+        duration=300,
+        verbose=False,
+        )
+    return parser.parse_args(args)
+
+def main():
+
+    args = parse_args(sys.argv[1:])
+
+    verbose = args.verbose
+    if os.environ.get('CEPH_TEST_VERBOSE') is not None:
+        verbose = (os.environ.get('CEPH_TEST_VERBOSE') == '1')
+
+    duration = int(os.environ.get('CEPH_TEST_DURATION', args.duration))
+    seed = os.environ.get('CEPH_TEST_SEED', args.seed)
+    seed = int(time.time()) if seed is None else int(seed)
+
+    rnd = random.Random()
+    rnd.seed(seed)
+
+    loglevel = logging.INFO
+    if verbose:
+        loglevel = logging.DEBUG
+
+    logging.basicConfig(level=loglevel,)
+
+    LOG.info('seed: {s}'.format(s=seed))
+
+    start = time.time()
+
+    while (time.time() - start) < duration:
+        (op, sop) = choose_random_op(rnd)
+
+        LOG.info('{o}({s})'.format(o=op, s=sop))
+        op_log = LOG.getChild('{o}({s})'.format(o=op, s=sop))
+
+        if op == 'put':
+            via_file = (rnd.uniform(0, 100) < 50.0)
+
+            expected = 0
+            cmd = [ 'put' ]
+            key = None
+
+            if sop == 'existing':
+                if len(CONFIG_EXISTING) == 0:
+                    op_log.debug('no existing keys; continue')
+                    continue
+                key = rnd.choice(CONFIG_PUT)
+                assert key in CONFIG_EXISTING, \
+                    'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+
+                expected = 0 # the store just overrides the value if the key exists
+            #end if sop == 'existing'
+            elif sop == 'new':
+                for x in xrange(0, 10):
+                    key = gen_key(rnd)
+                    if key not in CONFIG_EXISTING:
+                        break
+                    key = None
+                if key is None:
+                    op_log.error('unable to generate an unique key -- try again later.')
+                    continue
+
+                assert key not in CONFIG_PUT and key not in CONFIG_EXISTING, \
+                    'key {k} was not supposed to exist!'.format(k=key)
+
+            assert key is not None, \
+                'key must be != None'
+
+            cmd += [ key ]
+
+            (size, error) = rnd.choice(SIZES)
+            if size > 25:
+                via_file = True
+
+            data = gen_data(size, rnd)
+            if error == 0: # only add if we expect the put to be successful
+                if sop == 'new':
+                    CONFIG_PUT.append(key)
+                CONFIG_EXISTING[key] = size
+            expected = error
+
+            if via_file:
+                data_file = write_data_file(data, rnd)
+                cmd += [ '-i', data_file ]
+            else:
+                cmd += [ data ]
+
+            op_log.debug('size: {sz}, via: {v}'.format(
+                sz=size,
+                v='file: {f}'.format(f=data_file) if via_file == True else 'cli')
+                )
+            run_cmd(cmd, expects=expected)
+            if via_file:
+                destroy_tmp_file(data_file)
+            continue
+
+        elif op == 'del':
+            expected = 0
+            cmd = [ 'del' ]
+            key = None
+
+            if sop == 'existing':
+                if len(CONFIG_EXISTING) == 0:
+                    op_log.debug('no existing keys; continue')
+                    continue
+                key = rnd.choice(CONFIG_PUT)
+                assert key in CONFIG_EXISTING, \
+                    'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+
+            if sop == 'enoent':
+                for x in xrange(0, 10):
+                    key = base64.b64encode(os.urandom(20))
+                    if key not in CONFIG_EXISTING:
+                        break
+                    key = None
+                if key is None:
+                    op_log.error('unable to generate an unique key -- try again later.')
+                    continue
+                assert key not in CONFIG_PUT and key not in CONFIG_EXISTING, \
+                    'key {k} was not supposed to exist!'.format(k=key)
+                expected = 0  # deleting a non-existent key succeeds
+
+            assert key is not None, \
+                'key must be != None'
+
+            cmd += [ key ]
+            op_log.debug('key: {k}'.format(k=key))
+            run_cmd(cmd, expects=expected)
+            if sop == 'existing':
+                CONFIG_DEL.append(key)
+                CONFIG_PUT.remove(key)
+                del CONFIG_EXISTING[key]
+            continue
+
+        elif op == 'exists':
+            expected = 0
+            cmd = [ 'exists' ]
+            key = None
+
+            if sop == 'existing':
+                if len(CONFIG_EXISTING) == 0:
+                    op_log.debug('no existing keys; continue')
+                    continue
+                key = rnd.choice(CONFIG_PUT)
+                assert key in CONFIG_EXISTING, \
+                    'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+
+            if sop == 'enoent':
+                for x in xrange(0, 10):
+                    key = base64.b64encode(os.urandom(20))
+                    if key not in CONFIG_EXISTING:
+                        break
+                    key = None
+                if key is None:
+                    op_log.error('unable to generate an unique key -- try again later.')
+                    continue
+                assert key not in CONFIG_PUT and key not in CONFIG_EXISTING, \
+                    'key {k} was not supposed to exist!'.format(k=key)
+                expected = -errno.ENOENT
+
+            assert key is not None, \
+                'key must be != None'
+
+            cmd += [ key ]
+            op_log.debug('key: {k}'.format(k=key))
+            run_cmd(cmd, expects=expected)
+            continue
+
+        elif op == 'get':
+            expected = 0
+            cmd = [ 'get' ]
+            key = None
+
+            if sop == 'existing':
+                if len(CONFIG_EXISTING) == 0:
+                    op_log.debug('no existing keys; continue')
+                    continue
+                key = rnd.choice(CONFIG_PUT)
+                assert key in CONFIG_EXISTING, \
+                    'key \'{k_}\' not in CONFIG_EXISTING'.format(k_=key)
+
+            if sop == 'enoent':
+                for x in xrange(0, 10):
+                    key = base64.b64encode(os.urandom(20))
+                    if key not in CONFIG_EXISTING:
+                        break
+                    key = None
+                if key is None:
+                    op_log.error('unable to generate an unique key -- try again later.')
+                    continue
+                assert key not in CONFIG_PUT and key not in CONFIG_EXISTING, \
+                    'key {k} was not supposed to exist!'.format(k=key)
+                expected = -errno.ENOENT
+
+            assert key is not None, \
+                'key must be != None'
+
+            file_path = gen_tmp_file_path(rnd)
+            cmd += [ key, '-o', file_path ]
+            op_log.debug('key: {k}'.format(k=key))
+            run_cmd(cmd, expects=expected)
+            if sop == 'existing':
+                try:
+                    temp_file = open(file_path, 'r+')
+                except IOError as err:
+                    if err.errno == errno.ENOENT:
+                        assert CONFIG_EXISTING[key] == 0, \
+                            'error opening \'{fp}\': {e}'.format(fp=file_path,e=err)
+                        continue
+                    else:
+                        assert False, \
+                            'some error occurred: {e}'.format(e=err)
+                cnt = 0
+                while True:
+                    read_data = temp_file.read()
+                    if read_data == '':
+                        break
+                    cnt += len(read_data)
+                assert cnt == CONFIG_EXISTING[key], \
+                    'wrong size from store for key \'{k}\': {sz}, expected {es}'.format(
+                        k=key,sz=cnt,es=CONFIG_EXISTING[key])
+                destroy_tmp_file(file_path)
+            continue
+        else:
+            assert False, 'unknown op {o}'.format(o=op)
+
+    # check if all keys in 'CONFIG_PUT' exist and
+    # if all keys on 'CONFIG_DEL' don't.
+    # but first however, remove all keys in CONFIG_PUT that might
+    # be in CONFIG_DEL as well.
+    config_put_set = set(CONFIG_PUT)
+    config_del_set = set(CONFIG_DEL).difference(config_put_set)
+
+    LOG.info('perform sanity checks on store')
+
+    for k in config_put_set:
+        LOG.getChild('check(puts)').debug('key: {k_}'.format(k_=k))
+        run_cmd(['exists', k], expects=0)
+    for k in config_del_set:
+        LOG.getChild('check(dels)').debug('key: {k_}'.format(k_=k))
+        run_cmd(['exists', k], expects=-errno.ENOENT)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/qa/workunits/mon/workloadgen.sh b/qa/workunits/mon/workloadgen.sh
new file mode 100755
index 0000000..d43abe1
--- /dev/null
+++ b/qa/workunits/mon/workloadgen.sh
@@ -0,0 +1,169 @@
+#!/bin/bash -x
+# vim: ts=8 sw=2 smarttab
+#
+# $0.sh - run mon workload generator
+
+d() {
+  [[ "$VERBOSE" != "" && $VERBOSE -eq 1 ]] && echo "## DEBUG ## $*"
+}
+
+d "check for required binaries"
+
+required_bins="ceph crushtool ceph_test_mon_workloadgen"
+for b in $required_bins; do
+  which $b >& /dev/null
+  if [[ $? -ne 0 ]]; then
+    echo "Unable to find '$b' in PATH"
+    exit 1
+  fi
+done
+
+d "Start workunit"
+
+crush_map_fn=test.crush.map
+create_crush=0
+clobber_crush=0
+new_cluster=0
+do_run=0
+num_osds=0
+
+# Assume the test is in PATH
+bin_test=ceph_test_mon_workloadgen
+
+num_osds=10
+if [[ "$LOADGEN_NUM_OSDS" != "" ]]; then
+  num_osds=$LOADGEN_NUM_OSDS
+fi
+
+duration=300
+[ ! -z $DURATION ] && duration=$DURATION
+
+d "checking osd tree"
+
+crush_testing_root="`ceph osd tree | grep 'root[ \t]\+testing'`"
+
+d "$crush_testing_root"
+
+if [[ "$crush_testing_root" == "" ]]; then
+  d "set create_crush"
+  create_crush=1
+fi
+
+d "generate run_id (create_crush = $create_crush)"
+
+run_id=`uuidgen`
+
+d "run_id = $run_id ; create_crush = $create_crush"
+
+if [[ $create_crush -eq 1 ]]; then
+  tmp_crush_fn="/tmp/ceph.$run_id.crush"
+  ceph osd getcrushmap -o $tmp_crush_fn
+  crushtool -d $tmp_crush_fn -o $tmp_crush_fn.plain
+
+  highest_root_id=0
+  root_ids_raw="`cat $tmp_crush_fn.plain | grep id`"
+  ifs=$IFS
+  IFS=$'\n'
+  for l in $root_ids_raw; do
+    root_id=`echo $l | sed 's/.*-\([[:digit:]]\+\).*/\1/'`
+    d "root id = $root_id ; highest = $highest_root_id"
+    if [[ $root_id -gt $highest_root_id ]]; then
+      highest_root_id=$root_id
+    fi
+  done
+  our_root_id=$(($highest_root_id+1))
+  IFS=$ifs
+
+  cat << EOF >> $tmp_crush_fn.plain
+root testing {
+  id -$our_root_id
+  alg straw
+  hash 0  # rjenkins1
+}
+rule testingdata {
+  ruleset 0
+  type replicated
+  min_size 1
+  max_size 10
+  step take testing
+  step choose firstn 0 type osd
+  step emit
+}
+rule testingmetadata {
+  ruleset 1
+  type replicated
+  min_size 1
+  max_size 10
+  step take testing
+  step choose firstn 0 type osd
+  step emit
+}
+rule testingrbd {
+  ruleset 2
+  type replicated
+  min_size 1
+  max_size 10
+  step take testing
+  step choose firstn 0 type osd
+  step emit
+}
+EOF
+
+  if [[ $VERBOSE -eq 1 ]]; then
+    cat $tmp_crush_fn.plain
+  fi
+
+  crushtool -c $tmp_crush_fn.plain -o $tmp_crush_fn
+  if [[ $? -eq 1 ]]; then
+    echo "Error compiling test crush map; probably need newer crushtool"
+    echo "NOK"
+    exit 1
+  fi
+
+  d "created crush"
+
+  ceph osd setcrushmap -i $tmp_crush_fn
+fi
+
+keyring="/tmp/ceph.$run_id.keyring"
+
+ceph auth get-or-create-key osd.admin mon 'allow rwx' osd 'allow *'
+ceph auth export | grep -v "export" > $keyring
+
+osd_ids=""
+
+for osd in `seq 1 $num_osds`; do
+  id=`ceph osd create`
+  osd_ids="$osd_ids $id"
+  d "osd.$id"
+  ceph osd crush set $id osd.$id 1.0 host=testhost rack=testrack root=testing
+done
+
+d "osds: $osd_ids"
+
+stub_id_args=""
+f=
+l=
+for i in $osd_ids; do
+  d "i: $i"
+  if [[ $stub_id_args == "" ]]; then
+    stub_id_args="--stub-id $i"
+    f=$i
+  fi
+  if [[ $l != "" ]]; then
+    if [[ $i -gt $(($l+1)) ]]; then
+      stub_id_args="$stub_id_args..$l --stub-id $i"
+      f=$i
+    fi
+  fi
+  l=$i
+done
+if [[ $l -gt $f ]]; then
+  stub_id_args="$stub_id_args..$l"
+fi
+
+args="$EXTRA_ARGS --duration $duration $stub_id_args"
+  
+d "running: $args"
+
+$bin_test --keyring $keyring $args
diff --git a/qa/workunits/objectstore/test_fuse.sh b/qa/workunits/objectstore/test_fuse.sh
new file mode 100755
index 0000000..07c3ea9
--- /dev/null
+++ b/qa/workunits/objectstore/test_fuse.sh
@@ -0,0 +1,117 @@
+#!/bin/sh -ex
+
+if ! id -u | grep -q '^0$'; then
+    echo "not root, re-running self via sudo"
+    sudo PATH=$PATH $0 || echo FAIL
+    exit 0
+fi
+
+function expect_false()
+{
+        set -x
+        if "$@"; then return 1; else return 0; fi
+}
+
+COT=ceph-objectstore-tool
+DATA=store_test_fuse_dir
+TYPE=bluestore
+MNT=store_test_fuse_mnt
+
+rm -rf $DATA
+mkdir -p $DATA
+
+fusermount -u $MNT || true
+rmdir $MNT || true
+mkdir $MNT
+
+$COT --op mkfs --data-path $DATA --type $TYPE
+$COT --op fuse --data-path $DATA --mountpoint $MNT &
+
+while ! test -e $MNT/type ; do
+    echo waiting for $MNT/type to appear
+    sleep 1
+done
+
+umask 0
+
+grep $TYPE $MNT/type
+
+# create collection
+mkdir $MNT/meta
+test -e $MNT/meta/bitwise_hash_start
+test -d $MNT/meta/all
+test -d $MNT/meta/by_bitwise_hash
+
+# create object
+mkdir $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@
+test -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+test -d $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr
+test -d $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap
+test -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/bitwise_hash
+test -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap_header
+
+# omap header
+echo omap header > $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap_header
+grep -q omap $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap_header
+
+# omap
+echo value a > $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keya
+echo value b > $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keyb
+ls $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap | grep -c key | grep -q 2
+grep 'value a' $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keya
+grep 'value b' $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keyb
+rm $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keya
+test ! -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keya
+rm $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keyb
+test ! -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/omap/keyb
+
+# attr
+echo value a > $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keya
+echo value b > $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keyb
+ls $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr | grep -c key | grep -q 2
+grep 'value a' $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keya
+grep 'value b' $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keyb
+rm $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keya
+test ! -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keya
+rm $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keyb
+test ! -e $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/attr/keyb
+
+# data
+test ! -s $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+echo asdfasdfasdf > $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+test -s $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+grep -q asdfasdfasdf $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+rm $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+test ! -s $MNT/meta/all/@-1:7b3f43c4:::osd_superblock:0@/data
+
+# create pg collection
+mkdir --mode 0003 $MNT/0.0_head
+cat $MNT/0.0_head/bitwise_hash_bits
+grep -q 3 $MNT/0.0_head/bitwise_hash_bits
+grep -q 00000000 $MNT/0.0_head/bitwise_hash_start
+grep -q 1fffffff $MNT/0.0_head/bitwise_hash_end
+test -d $MNT/0.0_head/all
+
+mkdir --mode 0003 $MNT/0.1_head
+grep -q 3 $MNT/0.1_head/bitwise_hash_bits
+grep -q 80000000 $MNT/0.1_head/bitwise_hash_start
+grep -q 9fffffff $MNT/0.1_head/bitwise_hash_end
+
+# create pg object
+mkdir $MNT/0.0_head/all/@0:00000000::::head@/
+mkdir $MNT/0.0_head/all/@0:10000000:::foo:head@/
+
+# verify pg bounds check
+expect_false mkdir $MNT/0.0_head/all/@0:20000000:::bar:head@/
+
+# remove a collection
+expect_false rmdir $MNT/0.0_head
+rmdir $MNT/0.0_head/all/@0:10000000:::foo:head@/
+rmdir $MNT/0.0_head/all/@0:00000000::::head@/
+rmdir $MNT/0.0_head
+rmdir $MNT/0.1_head
+
+fusermount -u $MNT
+wait
+
+echo OK
diff --git a/qa/workunits/osdc/stress_objectcacher.sh b/qa/workunits/osdc/stress_objectcacher.sh
new file mode 100755
index 0000000..67baadc
--- /dev/null
+++ b/qa/workunits/osdc/stress_objectcacher.sh
@@ -0,0 +1,28 @@
+#!/bin/sh -ex
+
+for i in $(seq 1 10)
+do
+    for DELAY in 0 1000
+    do
+        for OPS in 1000 10000
+        do
+            for OBJECTS in 10 50 100
+            do
+                for READS in 0.90 0.50 0.10
+                do
+                    for OP_SIZE in 4096 131072 1048576
+                    do
+                        for MAX_DIRTY in 0 25165824
+                        do
+                            ceph_test_objectcacher_stress --ops $OPS --percent-read $READS --delay-ns $DELAY --objects $OBJECTS --max-op-size $OP_SIZE --client-oc-max-dirty $MAX_DIRTY --stress-test > /dev/null 2>&1
+                        done
+                    done
+                done
+            done
+        done
+    done
+done
+
+ceph_test_objectcacher_stress --correctness-test > /dev/null 2>&1
+
+echo OK
diff --git a/qa/workunits/post-file.sh b/qa/workunits/post-file.sh
new file mode 100755
index 0000000..133e668
--- /dev/null
+++ b/qa/workunits/post-file.sh
@@ -0,0 +1,7 @@
+#!/bin/bash -ex
+
+what="$1"
+[ -z "$what" ] && what=/etc/udev/rules.d
+sudo ceph-post-file -d ceph-test-workunit $what
+
+echo OK
diff --git a/qa/workunits/rados/clone.sh b/qa/workunits/rados/clone.sh
new file mode 100755
index 0000000..281e89f
--- /dev/null
+++ b/qa/workunits/rados/clone.sh
@@ -0,0 +1,13 @@
+#!/bin/sh -x
+
+set -e
+
+rados -p data rm foo || true
+rados -p data put foo.tmp /etc/passwd --object-locator foo
+rados -p data clonedata foo.tmp foo --object-locator foo
+rados -p data get foo /tmp/foo
+cmp /tmp/foo /etc/passwd
+rados -p data rm foo.tmp --object-locator foo
+rados -p data rm foo
+
+echo OK
\ No newline at end of file
diff --git a/qa/workunits/rados/load-gen-big.sh b/qa/workunits/rados/load-gen-big.sh
new file mode 100755
index 0000000..1e9a2ca
--- /dev/null
+++ b/qa/workunits/rados/load-gen-big.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+rados -p rbd load-gen \
+    --num-objects 10240 \
+    --min-object-size 1048576 \
+    --max-object-size 25600000 \
+    --max-ops 1024 \
+    --max-backlog 1024 \
+    --percent 50 \
+    --run-length 1200
diff --git a/qa/workunits/rados/load-gen-mix-small-long.sh b/qa/workunits/rados/load-gen-mix-small-long.sh
new file mode 100755
index 0000000..62364ef
--- /dev/null
+++ b/qa/workunits/rados/load-gen-mix-small-long.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+rados -p rbd load-gen \
+    --num-objects 1024 \
+    --min-object-size 1 \
+    --max-object-size 1048576 \
+    --max-ops 128 \
+    --max-backlog 128 \
+    --percent 50 \
+    --run-length 1800
diff --git a/qa/workunits/rados/load-gen-mix-small.sh b/qa/workunits/rados/load-gen-mix-small.sh
new file mode 100755
index 0000000..5fc15b1
--- /dev/null
+++ b/qa/workunits/rados/load-gen-mix-small.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+rados -p rbd load-gen \
+    --num-objects 1024 \
+    --min-object-size 1 \
+    --max-object-size 1048576 \
+    --max-ops 128 \
+    --max-backlog 128 \
+    --percent 50 \
+    --run-length 600
diff --git a/qa/workunits/rados/load-gen-mix.sh b/qa/workunits/rados/load-gen-mix.sh
new file mode 100755
index 0000000..2efb210
--- /dev/null
+++ b/qa/workunits/rados/load-gen-mix.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+rados -p rbd load-gen \
+    --num-objects 10240 \
+    --min-object-size 1 \
+    --max-object-size 1048576 \
+    --max-ops 128 \
+    --max-backlog 128 \
+    --percent 50 \
+    --run-length 600
diff --git a/qa/workunits/rados/load-gen-mostlyread.sh b/qa/workunits/rados/load-gen-mostlyread.sh
new file mode 100755
index 0000000..9d288b2
--- /dev/null
+++ b/qa/workunits/rados/load-gen-mostlyread.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+rados -p rbd load-gen \
+    --num-objects 102400 \
+    --min-object-size 1 \
+    --max-object-size 1048576 \
+    --max-ops 128 \
+    --max-backlog 128 \
+    --percent 90 \
+    --run-length 600
diff --git a/qa/workunits/rados/stress_watch.sh b/qa/workunits/rados/stress_watch.sh
new file mode 100755
index 0000000..49f144b
--- /dev/null
+++ b/qa/workunits/rados/stress_watch.sh
@@ -0,0 +1,7 @@
+#!/bin/sh -e
+
+ceph_test_stress_watch
+ceph_multi_stress_watch rep reppool repobj
+ceph_multi_stress_watch ec ecpool ecobj
+
+exit 0
diff --git a/qa/workunits/rados/test-upgrade-v11.0.0.sh b/qa/workunits/rados/test-upgrade-v11.0.0.sh
new file mode 100755
index 0000000..c716a56
--- /dev/null
+++ b/qa/workunits/rados/test-upgrade-v11.0.0.sh
@@ -0,0 +1,50 @@
+#!/bin/bash -ex
+
+parallel=1
+[ "$1" = "--serial" ] && parallel=0
+
+color=""
+[ -t 1 ] && color="--gtest_color=yes"
+
+function cleanup() {
+    pkill -P $$ || true
+}
+trap cleanup EXIT ERR HUP INT QUIT
+
+pids=""
+for f in \
+    'api_aio --gtest_filter=-LibRadosAio.RacingRemovePP' \
+    'api_list --gtest_filter=-LibRadosList*.EnumerateObjects*' \
+    api_io api_lock api_misc \
+    api_tier api_pool api_snapshots api_stat api_watch_notify api_cmd \
+    api_c_write_operations \
+    api_c_read_operations \
+    list_parallel \
+    open_pools_parallel \
+    delete_pools_parallel \
+    watch_notify
+do
+    if [ $parallel -eq 1 ]; then
+	r=`printf '%25s' $f`
+	bash -o pipefail -exc "ceph_test_rados_$f $color 2>&1 | tee 'ceph_test_rados_$f.log' | sed \"s/^/$r: /\"" &
+	pid=$!
+	echo "test $f on pid $pid"
+	pids="$pids $pid"
+    else
+	ceph_test_rados_$f
+    fi
+done
+
+ret=0
+if [ $parallel -eq 1 ]; then
+for p in $pids
+do
+  if ! wait $p
+  then
+    echo "error in $p"
+    ret=1
+  fi
+done
+fi
+
+exit $ret
diff --git a/qa/workunits/rados/test.sh b/qa/workunits/rados/test.sh
new file mode 100755
index 0000000..fbc3797
--- /dev/null
+++ b/qa/workunits/rados/test.sh
@@ -0,0 +1,49 @@
+#!/bin/bash -ex
+
+parallel=1
+[ "$1" = "--serial" ] && parallel=0
+
+color=""
+[ -t 1 ] && color="--gtest_color=yes"
+
+function cleanup() {
+    pkill -P $$ || true
+}
+trap cleanup EXIT ERR HUP INT QUIT
+
+pids=""
+for f in \
+    api_aio api_io api_list api_lock api_misc \
+    api_tier api_pool api_snapshots api_stat api_watch_notify api_cmd \
+    api_c_write_operations \
+    api_c_read_operations \
+    api_tmap_migrate \
+    list_parallel \
+    open_pools_parallel \
+    delete_pools_parallel \
+    watch_notify
+do
+    if [ $parallel -eq 1 ]; then
+	r=`printf '%25s' $f`
+	bash -o pipefail -exc "ceph_test_rados_$f $color 2>&1 | tee ceph_test_rados_$f.log | sed \"s/^/$r: /\"" &
+	pid=$!
+	echo "test $f on pid $pid"
+	pids="$pids $pid"
+    else
+	ceph_test_rados_$f
+    fi
+done
+
+ret=0
+if [ $parallel -eq 1 ]; then
+for p in $pids
+do
+  if ! wait $p
+  then
+    echo "error in $p"
+    ret=1
+  fi
+done
+fi
+
+exit $ret
diff --git a/qa/workunits/rados/test_alloc_hint.sh b/qa/workunits/rados/test_alloc_hint.sh
new file mode 100755
index 0000000..b3e185a
--- /dev/null
+++ b/qa/workunits/rados/test_alloc_hint.sh
@@ -0,0 +1,174 @@
+#!/bin/bash
+
+set -ex
+shopt -s nullglob # fns glob expansion in expect_alloc_hint_eq()
+
+#
+# Helpers
+#
+
+function get_xml_val() {
+    local xml="$1"
+    local tag="$2"
+
+    local regex=".*<${tag}>(.*)</${tag}>.*"
+    if [[ ! "${xml}" =~ ${regex} ]]; then
+        echo "'${xml}' xml doesn't match '${tag}' tag regex" >&2
+        return 2
+    fi
+
+    echo "${BASH_REMATCH[1]}"
+}
+
+function get_conf_val() {
+    set -e
+
+    local entity="$1"
+    local option="$2"
+
+    local val
+    val="$(sudo ceph daemon "${entity}" config get --format=xml "${option}")"
+    val="$(get_xml_val "${val}" "${option}")"
+
+    echo "${val}"
+}
+
+function setup_osd_data() {
+    for (( i = 0 ; i < "${NUM_OSDS}" ; i++ )); do
+        OSD_DATA[i]="$(get_conf_val "osd.$i" "osd_data")"
+    done
+}
+
+function setup_pgid() {
+    local poolname="$1"
+    local objname="$2"
+
+    local pgid
+    pgid="$(ceph osd map "${poolname}" "${objname}" --format=xml)"
+    pgid="$(get_xml_val "${pgid}" "pgid")"
+
+    PGID="${pgid}"
+}
+
+function expect_alloc_hint_eq() {
+    local expected_extsize="$1"
+
+    for (( i = 0 ; i < "${NUM_OSDS}" ; i++ )); do
+        # Make sure that stuff is flushed from the journal to the store
+        # by the time we get to it, as we prod the actual files and not
+        # the journal.
+        sudo ceph daemon "osd.${i}" "flush_journal"
+
+        # e.g., .../25.6_head/foo__head_7FC1F406__19
+        #       .../26.bs1_head/bar__head_EFE6384B__1a_ffffffffffffffff_1
+        local fns=$(sudo sh -c "ls ${OSD_DATA[i]}/current/${PGID}*_head/${OBJ}_*")
+        local count="${#fns[@]}"
+        if [ "${count}" -ne 1 ]; then
+            echo "bad fns count: ${count}" >&2
+            return 2
+        fi
+
+        local extsize
+        extsize="$(sudo xfs_io -c extsize "${fns[0]}")"
+        local extsize_regex="^\[(.*)\] ${fns[0]}$"
+        if [[ ! "${extsize}" =~ ${extsize_regex} ]]; then
+            echo "extsize doesn't match extsize_regex: ${extsize}" >&2
+            return 2
+        fi
+        extsize="${BASH_REMATCH[1]}"
+
+        if [ "${extsize}" -ne "${expected_extsize}" ]; then
+            echo "FAIL: alloc_hint: actual ${extsize}, expected ${expected_extsize}" >&2
+            return 1
+        fi
+    done
+}
+
+#
+# Global setup
+#
+
+EC_K="2"
+EC_M="1"
+NUM_OSDS="$((EC_K + EC_M))"
+
+NUM_PG="12"
+NUM_PGP="${NUM_PG}"
+
+LOW_CAP="$(get_conf_val "osd.0" "filestore_max_alloc_hint_size")"
+HIGH_CAP="$((LOW_CAP * 10))" # 10M, assuming 1M default cap
+SMALL_HINT="$((LOW_CAP / 4))" # 256K, assuming 1M default cap
+BIG_HINT="$((LOW_CAP * 6))" # 6M, assuming 1M default cap
+
+setup_osd_data
+
+#
+# ReplicatedBackend tests
+#
+
+POOL="alloc_hint-rep"
+ceph osd pool create "${POOL}" "${NUM_PG}"
+ceph osd pool set "${POOL}" size "${NUM_OSDS}"
+
+OBJ="foo"
+setup_pgid "${POOL}" "${OBJ}"
+rados -p "${POOL}" create "${OBJ}"
+
+# Empty object, SMALL_HINT - expect SMALL_HINT
+rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
+expect_alloc_hint_eq "${SMALL_HINT}"
+
+# Try changing to BIG_HINT (1) - expect LOW_CAP (BIG_HINT > LOW_CAP)
+rados -p "${POOL}" set-alloc-hint "${OBJ}" "${BIG_HINT}" "${BIG_HINT}"
+expect_alloc_hint_eq "${LOW_CAP}"
+
+# Bump the cap to HIGH_CAP
+ceph tell 'osd.*' injectargs "--filestore_max_alloc_hint_size ${HIGH_CAP}"
+
+# Try changing to BIG_HINT (2) - expect BIG_HINT (BIG_HINT < HIGH_CAP)
+rados -p "${POOL}" set-alloc-hint "${OBJ}" "${BIG_HINT}" "${BIG_HINT}"
+expect_alloc_hint_eq "${BIG_HINT}"
+
+ceph tell 'osd.*' injectargs "--filestore_max_alloc_hint_size ${LOW_CAP}"
+
+# Populate object with some data
+rados -p "${POOL}" put "${OBJ}" /etc/passwd
+
+# Try changing back to SMALL_HINT - expect BIG_HINT (non-empty object)
+rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
+expect_alloc_hint_eq "${BIG_HINT}"
+
+OBJ="bar"
+setup_pgid "${POOL}" "${OBJ}"
+
+# Non-existent object, SMALL_HINT - expect SMALL_HINT (object creation)
+rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
+expect_alloc_hint_eq "${SMALL_HINT}"
+
+ceph osd pool delete "${POOL}" "${POOL}" --yes-i-really-really-mean-it
+
+#
+# ECBackend tests
+#
+
+PROFILE="alloc_hint-ecprofile"
+POOL="alloc_hint-ec"
+ceph osd erasure-code-profile set "${PROFILE}" k=2 m=1 ruleset-failure-domain=osd
+ceph osd erasure-code-profile get "${PROFILE}" # just so it's logged
+ceph osd pool create "${POOL}" "${NUM_PG}" "${NUM_PGP}" erasure "${PROFILE}"
+
+OBJ="baz"
+setup_pgid "${POOL}" "${OBJ}"
+rados -p "${POOL}" create "${OBJ}"
+
+# Empty object, SMALL_HINT - expect scaled-down SMALL_HINT
+rados -p "${POOL}" set-alloc-hint "${OBJ}" "${SMALL_HINT}" "${SMALL_HINT}"
+expect_alloc_hint_eq "$((SMALL_HINT / EC_K))"
+
+ceph osd pool delete "${POOL}" "${POOL}" --yes-i-really-really-mean-it
+
+#
+# Global teardown
+#
+
+echo "OK"
diff --git a/qa/workunits/rados/test_cache_pool.sh b/qa/workunits/rados/test_cache_pool.sh
new file mode 100755
index 0000000..4db965d
--- /dev/null
+++ b/qa/workunits/rados/test_cache_pool.sh
@@ -0,0 +1,137 @@
+#!/bin/bash -x
+
+set -e
+
+expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+# create pools, set up tier relationship
+ceph osd pool create base_pool 2
+ceph osd pool create partial_wrong 2
+ceph osd pool create wrong_cache 2
+ceph osd tier add base_pool partial_wrong
+ceph osd tier add base_pool wrong_cache
+
+# populate base_pool with some data
+echo "foo" > foo.txt
+echo "bar" > bar.txt
+echo "baz" > baz.txt
+rados -p base_pool put fooobj foo.txt
+rados -p base_pool put barobj bar.txt
+# fill in wrong_cache backwards so we can tell we read from it
+rados -p wrong_cache put fooobj bar.txt
+rados -p wrong_cache put barobj foo.txt
+# partial_wrong gets barobj backwards so we can check promote and non-promote
+rados -p partial_wrong put barobj foo.txt
+
+# get the objects back before setting a caching pool
+rados -p base_pool get fooobj tmp.txt
+diff -q tmp.txt foo.txt
+rados -p base_pool get barobj tmp.txt
+diff -q tmp.txt bar.txt
+
+# set up redirect and make sure we get backwards results
+ceph osd tier set-overlay base_pool wrong_cache
+ceph osd tier cache-mode wrong_cache writeback
+rados -p base_pool get fooobj tmp.txt
+diff -q tmp.txt bar.txt
+rados -p base_pool get barobj tmp.txt
+diff -q tmp.txt foo.txt
+
+# switch cache pools and make sure we're doing promote
+ceph osd tier remove-overlay base_pool
+ceph osd tier set-overlay base_pool partial_wrong
+ceph osd tier cache-mode partial_wrong writeback
+rados -p base_pool get fooobj tmp.txt
+diff -q tmp.txt foo.txt # hurray, it promoted!
+rados -p base_pool get barobj tmp.txt
+diff -q tmp.txt foo.txt # yep, we read partial_wrong's local object!
+
+# try a nonexistent object and make sure we get an error
+expect_false rados -p base_pool get bazobj tmp.txt
+
+# drop the cache entirely and make sure contents are still the same
+ceph osd tier remove-overlay base_pool
+rados -p base_pool get fooobj tmp.txt
+diff -q tmp.txt foo.txt
+rados -p base_pool get barobj tmp.txt
+diff -q tmp.txt bar.txt
+
+# create an empty cache pool and make sure it has objects after reading
+ceph osd pool create empty_cache 2
+
+touch empty.txt
+rados -p empty_cache ls > tmp.txt
+diff -q tmp.txt empty.txt
+
+ceph osd tier add base_pool empty_cache
+ceph osd tier set-overlay base_pool empty_cache
+ceph osd tier cache-mode empty_cache writeback
+rados -p base_pool get fooobj tmp.txt
+rados -p base_pool get barobj tmp.txt
+expect_false rados -p base_pool get bazobj tmp.txt
+
+rados -p empty_cache ls > tmp.txt
+expect_false diff -q tmp.txt empty.txt
+
+# cleanup
+ceph osd tier remove-overlay base_pool
+ceph osd tier remove base_pool wrong_cache
+ceph osd tier remove base_pool partial_wrong
+ceph osd tier remove base_pool empty_cache
+ceph osd pool delete base_pool base_pool --yes-i-really-really-mean-it
+ceph osd pool delete empty_cache empty_cache --yes-i-really-really-mean-it
+ceph osd pool delete wrong_cache wrong_cache --yes-i-really-really-mean-it
+ceph osd pool delete partial_wrong partial_wrong --yes-i-really-really-mean-it
+
+## set of base, cache
+ceph osd pool create base 8
+ceph osd pool create cache 8
+
+ceph osd tier add base cache
+ceph osd tier cache-mode cache writeback
+ceph osd tier set-overlay base cache
+
+# cache-flush, cache-evict
+rados -p base put foo /etc/passwd
+expect_false rados -p base cache-evict foo
+expect_false rados -p base cache-flush foo
+expect_false rados -p cache cache-evict foo
+rados -p cache cache-flush foo
+rados -p cache cache-evict foo
+rados -p cache ls - | wc -l | grep 0
+
+# cache-try-flush, cache-evict
+rados -p base put foo /etc/passwd
+expect_false rados -p base cache-evict foo
+expect_false rados -p base cache-flush foo
+expect_false rados -p cache cache-evict foo
+rados -p cache cache-try-flush foo
+rados -p cache cache-evict foo
+rados -p cache ls - | wc -l | grep 0
+
+# cache-flush-evict-all
+rados -p base put bar /etc/passwd
+rados -p cache ls - | wc -l | grep 1
+expect_false rados -p base cache-flush-evict-all
+rados -p cache cache-flush-evict-all
+rados -p cache ls - | wc -l | grep 0
+
+# cache-try-flush-evict-all
+rados -p base put bar /etc/passwd
+rados -p cache ls - | wc -l | grep 1
+expect_false rados -p base cache-flush-evict-all
+rados -p cache cache-try-flush-evict-all
+rados -p cache ls - | wc -l | grep 0
+
+# cleanup
+ceph osd tier remove-overlay base
+ceph osd tier remove base cache
+
+ceph osd pool delete cache cache --yes-i-really-really-mean-it
+ceph osd pool delete base base --yes-i-really-really-mean-it
+
+echo OK
diff --git a/qa/workunits/rados/test_hang.sh b/qa/workunits/rados/test_hang.sh
new file mode 100755
index 0000000..724e0bb
--- /dev/null
+++ b/qa/workunits/rados/test_hang.sh
@@ -0,0 +1,8 @@
+#!/bin/sh -ex
+
+# Hang forever for manual testing using the thrasher
+while(true)
+do
+   sleep 300
+done
+exit 0
diff --git a/qa/workunits/rados/test_pool_quota.sh b/qa/workunits/rados/test_pool_quota.sh
new file mode 100755
index 0000000..71a9e52
--- /dev/null
+++ b/qa/workunits/rados/test_pool_quota.sh
@@ -0,0 +1,66 @@
+#!/bin/sh -ex
+
+p=`uuidgen`
+
+# objects
+ceph osd pool create $p 12
+ceph osd pool set-quota $p max_objects 10
+
+for f in `seq 1 10` ; do
+ rados -p $p put obj$f /etc/passwd
+done
+
+sleep 30
+
+rados -p $p put onemore /etc/passwd  &
+pid=$!
+
+ceph osd pool set-quota $p max_objects 100
+wait $pid 
+[ $? -ne 0 ] && exit 1 || true
+
+rados -p $p put twomore /etc/passwd
+
+# bytes
+ceph osd pool set-quota $p max_bytes 100
+sleep 30
+
+rados -p $p put two /etc/passwd &
+pid=$!
+
+ceph osd pool set-quota $p max_bytes 0
+ceph osd pool set-quota $p max_objects 0
+wait $pid 
+[ $? -ne 0 ] && exit 1 || true
+
+rados -p $p put three /etc/passwd
+
+
+#one pool being full does not block a different pool
+
+pp=`uuidgen`
+
+ceph osd pool create $pp 12
+
+# set objects quota 
+ceph osd pool set-quota $pp max_objects 10
+sleep 30
+
+for f in `seq 1 10` ; do
+ rados -p $pp put obj$f /etc/passwd
+done
+
+sleep 30
+
+rados -p $p put threemore /etc/passwd 
+
+ceph osd pool set-quota $p max_bytes 0
+ceph osd pool set-quota $p max_objects 0
+
+sleep 30
+# done
+ceph osd pool delete $p $p --yes-i-really-really-mean-it
+ceph osd pool delete $pp $pp --yes-i-really-really-mean-it
+
+echo OK
+
diff --git a/qa/workunits/rados/test_python.sh b/qa/workunits/rados/test_python.sh
new file mode 100755
index 0000000..2aaff2d
--- /dev/null
+++ b/qa/workunits/rados/test_python.sh
@@ -0,0 +1,8 @@
+#!/bin/sh -ex
+
+CEPH_REF=${CEPH_REF:-master}
+#wget -q https://raw.github.com/ceph/ceph/$CEPH_REF/src/test/pybind/test_rados.py
+wget -O test_rados.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=src/test/pybind/test_rados.py" || \
+    wget -O test_rados.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=ref/heads/$CEPH_REF;f=src/test/pybind/test_rados.py"
+nosetests -v test_rados
+exit 0
diff --git a/qa/workunits/rados/test_rados_timeouts.sh b/qa/workunits/rados/test_rados_timeouts.sh
new file mode 100755
index 0000000..bb35d72
--- /dev/null
+++ b/qa/workunits/rados/test_rados_timeouts.sh
@@ -0,0 +1,47 @@
+#!/bin/bash -x
+
+delay_mon() {
+    MSGTYPE=$1
+    shift
+    $@ --rados-mon-op-timeout 1 --ms-inject-delay-type mon --ms-inject-delay-max 10000000 --ms-inject-delay-probability 1 --ms-inject-delay-msg-type $MSGTYPE
+    if [ $? -eq 0 ]; then
+        exit 1
+    fi
+}
+
+delay_osd() {
+    MSGTYPE=$1
+    shift
+    $@ --rados-osd-op-timeout 1 --ms-inject-delay-type osd --ms-inject-delay-max 10000000 --ms-inject-delay-probability 1 --ms-inject-delay-msg-type $MSGTYPE
+    if [ $? -eq 0 ]; then
+        exit 2
+    fi
+}
+
+# pool ops
+delay_mon omap rados lspools
+delay_mon poolopreply rados mkpool test
+delay_mon poolopreply rados mksnap -p test snap
+delay_mon poolopreply rados rmpool test test --yes-i-really-really-mean-it
+
+# other mon ops
+delay_mon getpoolstats rados df
+delay_mon mon_command ceph df
+delay_mon omap ceph osd dump
+delay_mon omap ceph -s
+
+# osd ops
+delay_osd osd_op_reply rados -p data put ls /bin/ls
+delay_osd osd_op_reply rados -p data get ls - >/dev/null
+delay_osd osd_op_reply rados -p data ls
+delay_osd command_reply ceph tell osd.0 bench 1 1
+
+# rbd commands, using more kinds of osd ops
+rbd create -s 1 test
+delay_osd osd_op_reply rbd watch test
+delay_osd osd_op_reply rbd info test
+delay_osd osd_op_reply rbd snap create test at snap
+delay_osd osd_op_reply rbd import /bin/ls ls
+rbd rm test
+
+echo OK
diff --git a/qa/workunits/rados/test_rados_tool.sh b/qa/workunits/rados/test_rados_tool.sh
new file mode 100755
index 0000000..1368d92
--- /dev/null
+++ b/qa/workunits/rados/test_rados_tool.sh
@@ -0,0 +1,327 @@
+#!/bin/bash
+
+die() {
+    echo "$@"
+    exit 1
+}
+
+usage() {
+    cat <<EOF
+test_rados_tool.sh: tests rados_tool
+-c:        RADOS configuration file to use [optional]
+-k:        keep temp files
+-h:        this help message
+-p:        set temporary pool to use [optional]
+EOF
+}
+
+do_run() {
+    if [ "$1" == "--tee" ]; then
+      shift
+      tee_out="$1"
+      shift
+      "$@" | tee $tee_out
+    else
+      "$@"
+    fi
+}
+
+run_expect_fail() {
+    echo "RUN_EXPECT_FAIL: " "$@"
+    do_run "$@"
+    [ $? -eq 0 ] && die "expected failure, but got success! cmd: $@"
+}
+
+run_expect_succ() {
+    echo "RUN_EXPECT_SUCC: " "$@"
+    do_run "$@"
+    [ $? -ne 0 ] && die "expected success, but got failure! cmd: $@"
+}
+
+run_expect_nosignal() {
+    echo "RUN_EXPECT_NOSIGNAL: " "$@"
+    do_run "$@"
+    [ $? -ge 128 ] && die "expected succes or fail, but got signal! cmd: $@"
+}
+
+run() {
+    echo "RUN: " $@
+    do_run "$@"
+}
+
+DNAME="`dirname $0`"
+DNAME="`readlink -f $DNAME`"
+RADOS_TOOL="`readlink -f \"$DNAME/../rados\"`"
+if ! test -f $RADOS_TOOL ; then
+    RADOS_TOOL=$(which rados)
+fi
+KEEP_TEMP_FILES=0
+POOL=trs_pool
+POOL_CP_TARGET=trs_pool.2
+
+[ -x "$RADOS_TOOL" ] || die "couldn't find $RADOS_TOOL binary to test"
+
+while getopts  "c:hkp:" flag; do
+    case $flag in
+        c)  RADOS_TOOL="$RADOS_TOOL -c $OPTARG";;
+        k)  KEEP_TEMP_FILES=1;;
+        h)  usage; exit 0;;
+        p)  POOL=$OPTARG;;
+        *)  echo; usage; exit 1;;
+    esac
+done
+
+TDIR=`mktemp -d -t test_rados_tool.XXXXXXXXXX` || die "mktemp failed"
+[ $KEEP_TEMP_FILES -eq 0 ] && trap "rm -rf ${TDIR}; exit" INT TERM EXIT
+
+run_expect_succ "$RADOS_TOOL" mkpool "$POOL"
+
+# expb happens to be the empty export for legacy reasons
+run_expect_succ "$RADOS_TOOL" -p "$POOL" export "$TDIR/expb"
+
+# expa has objects foo, foo2 and bar
+run_expect_succ "$RADOS_TOOL" -p "$POOL" put foo /etc/fstab
+run_expect_succ "$RADOS_TOOL" -p "$POOL" put foo2 /etc/fstab
+run_expect_succ "$RADOS_TOOL" -p "$POOL" put bar /etc/fstab
+run_expect_succ "$RADOS_TOOL" -p "$POOL" export "$TDIR/expa"
+
+# expc has foo and foo2 with some attributes and omaps set
+run_expect_succ "$RADOS_TOOL" -p "$POOL" rm bar
+run_expect_succ "$RADOS_TOOL" -p "$POOL" setxattr foo "rados.toothbrush" "toothbrush"
+run_expect_succ "$RADOS_TOOL" -p "$POOL" setxattr foo "rados.toothpaste" "crest"
+run_expect_succ "$RADOS_TOOL" -p "$POOL" setomapval foo "rados.floss" "myfloss"
+run_expect_succ "$RADOS_TOOL" -p "$POOL" setxattr foo2 "rados.toothbrush" "green"
+run_expect_succ "$RADOS_TOOL" -p "$POOL" setomapheader foo2 "foo2.header"
+run_expect_succ "$RADOS_TOOL" -p "$POOL" export "$TDIR/expc"
+
+# make sure that --create works
+run "$RADOS_TOOL" rmpool "$POOL" "$POOL" --yes-i-really-really-mean-it
+run_expect_succ "$RADOS_TOOL" -p "$POOL" --create import "$TDIR/expa"
+
+# make sure that lack of --create fails
+run_expect_succ "$RADOS_TOOL" rmpool "$POOL" "$POOL" --yes-i-really-really-mean-it
+run_expect_fail "$RADOS_TOOL" -p "$POOL" import "$TDIR/expa"
+
+run_expect_succ "$RADOS_TOOL" -p "$POOL" --create import "$TDIR/expa"
+
+# inaccessible import src should fail
+run_expect_fail "$RADOS_TOOL" -p "$POOL" import "$TDIR/dir_nonexistent"
+
+# export an empty pool to test purge
+run_expect_succ "$RADOS_TOOL" purge "$POOL" --yes-i-really-really-mean-it
+run_expect_succ "$RADOS_TOOL" -p "$POOL" export "$TDIR/empty"
+cmp -s "$TDIR/expb" "$TDIR/empty" \
+    || die "failed to export the same stuff we imported!"
+rm -f "$TDIR/empty"
+
+# import some stuff with extended attributes on it
+run_expect_succ "$RADOS_TOOL" -p "$POOL" import "$TDIR/expc"
+VAL=`"$RADOS_TOOL" -p "$POOL" getxattr foo "rados.toothbrush"`
+[ ${VAL} = "toothbrush" ] || die "Invalid attribute after import"
+
+# the second time, the xattrs should match, so there should be nothing to do.
+run_expect_succ "$RADOS_TOOL" -p "$POOL" import "$TDIR/expc"
+VAL=`"$RADOS_TOOL" -p "$POOL" getxattr foo "rados.toothbrush"`
+[ "${VAL}" = "toothbrush" ] || die "Invalid attribute after second import"
+
+# Now try with --no-overwrite option after changing an attribute
+run_expect_succ "$RADOS_TOOL" -p "$POOL" setxattr foo "rados.toothbrush" "dentist"
+run_expect_succ "$RADOS_TOOL" -p "$POOL" import --no-overwrite "$TDIR/expc"
+VAL=`"$RADOS_TOOL" -p "$POOL" getxattr foo "rados.toothbrush"`
+[ "${VAL}" = "dentist" ] || die "Invalid attribute after second import"
+
+# now force it to copy everything
+run_expect_succ "$RADOS_TOOL" -p "$POOL" import "$TDIR/expc"
+VAL=`"$RADOS_TOOL" -p "$POOL" getxattr foo "rados.toothbrush"`
+[ "${VAL}" = "toothbrush" ] || die "Invalid attribute after second import"
+
+# test copy pool
+run "$RADOS_TOOL" rmpool "$POOL" "$POOL" --yes-i-really-really-mean-it
+run "$RADOS_TOOL" rmpool "$POOL_CP_TARGET" "$POOL_CP_TARGET" --yes-i-really-really-mean-it
+run_expect_succ "$RADOS_TOOL" mkpool "$POOL"
+run_expect_succ "$RADOS_TOOL" mkpool "$POOL_CP_TARGET"
+
+# create src files
+mkdir -p "$TDIR/dir_cp_src"
+for i in `seq 1 5`; do
+  fname="$TDIR/dir_cp_src/f.$i"
+  objname="f.$i"
+  dd if=/dev/urandom of="$fname" bs=$((1024*1024)) count=$i
+  run_expect_succ "$RADOS_TOOL" -p "$POOL" put $objname "$fname"
+
+# a few random attrs
+  for j in `seq 1 4`; do
+    rand_str=`dd if=/dev/urandom bs=4 count=1 | hexdump -x`
+    run_expect_succ "$RADOS_TOOL" -p "$POOL" setxattr $objname attr.$j "$rand_str"
+    run_expect_succ --tee "$fname.attr.$j" "$RADOS_TOOL" -p "$POOL" getxattr $objname attr.$j
+  done
+
+  rand_str=`dd if=/dev/urandom bs=4 count=1 | hexdump -x`
+  run_expect_succ "$RADOS_TOOL" -p "$POOL" setomapheader $objname "$rand_str"
+  run_expect_succ --tee "$fname.omap.header" "$RADOS_TOOL" -p "$POOL" getomapheader $objname
+# a few random omap keys
+  for j in `seq 1 4`; do
+    rand_str=`dd if=/dev/urandom bs=4 count=1 | hexdump -x`
+    run_expect_succ "$RADOS_TOOL" -p "$POOL" setomapval $objname key.$j "$rand_str"
+  done
+  run_expect_succ --tee "$fname.omap.vals" "$RADOS_TOOL" -p "$POOL" listomapvals $objname
+done
+
+run_expect_succ "$RADOS_TOOL" cppool "$POOL" "$POOL_CP_TARGET"
+
+mkdir -p "$TDIR/dir_cp_dst"
+for i in `seq 1 5`; do
+  fname="$TDIR/dir_cp_dst/f.$i"
+  objname="f.$i"
+  run_expect_succ "$RADOS_TOOL" -p "$POOL_CP_TARGET" get $objname "$fname"
+
+# a few random attrs
+  for j in `seq 1 4`; do
+    run_expect_succ --tee "$fname.attr.$j" "$RADOS_TOOL" -p "$POOL_CP_TARGET" getxattr $objname attr.$j
+  done
+
+  run_expect_succ --tee "$fname.omap.header" "$RADOS_TOOL" -p "$POOL_CP_TARGET" getomapheader $objname
+  run_expect_succ --tee "$fname.omap.vals" "$RADOS_TOOL" -p "$POOL_CP_TARGET" listomapvals $objname
+done
+
+diff -q -r "$TDIR/dir_cp_src" "$TDIR/dir_cp_dst" \
+    || die "copy pool validation failed!"
+
+for opt in \
+    block-size \
+    concurrent-ios \
+    min-object-size \
+    max-object-size \
+    min-op-len \
+    max-op-len \
+    max-ops \
+    max-backlog \
+    target-throughput \
+    read-percent \
+    num-objects \
+    run-length \
+    ; do
+    run_expect_succ "$RADOS_TOOL" --$opt 4 df
+    run_expect_fail "$RADOS_TOOL" --$opt 4k df
+done
+
+run_expect_succ "$RADOS_TOOL" lock list f.1 --lock-duration 4 --pool "$POOL"
+echo # previous command doesn't output an end of line: issue #9735
+run_expect_fail "$RADOS_TOOL" lock list f.1 --lock-duration 4k --pool "$POOL"
+
+run_expect_succ "$RADOS_TOOL" mksnap snap1 --pool "$POOL"
+snapid=$("$RADOS_TOOL" lssnap --pool "$POOL" | grep snap1 | cut -f1)
+[ $? -ne 0 ] && die "expected success, but got failure! cmd: \"$RADOS_TOOL\" lssnap --pool \"$POOL\" | grep snap1 | cut -f1"
+run_expect_succ "$RADOS_TOOL" ls --pool "$POOL" --snapid="$snapid"
+run_expect_fail "$RADOS_TOOL" ls --pool "$POOL" --snapid="$snapid"k
+
+run_expect_succ "$RADOS_TOOL" chown 1 --pool "$POOL"
+run_expect_fail "$RADOS_TOOL" chown 1k --pool "$POOL"
+
+run_expect_succ "$RADOS_TOOL" truncate f.1 0 --pool "$POOL"
+run_expect_fail "$RADOS_TOOL" truncate f.1 0k --pool "$POOL"
+
+run "$RADOS_TOOL" rmpool delete_me_mkpool_test delete_me_mkpool_test --yes-i-really-really-mean-it
+run_expect_succ "$RADOS_TOOL" mkpool delete_me_mkpool_test 0 0
+run_expect_fail "$RADOS_TOOL" mkpool delete_me_mkpool_test2 0k 0
+run_expect_fail "$RADOS_TOOL" mkpool delete_me_mkpool_test3 0 0k
+
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 1 write
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 1k write
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 1 write --format json --output "$TDIR/bench.json"
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 1 write --output "$TDIR/bench.json"
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --format json --no-cleanup
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 1 rand --format json
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 1 seq --format json
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-omap
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-object
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-xattr
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-xattr --write-object
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-xattr --write-omap
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-omap --write-object
+run_expect_succ "$RADOS_TOOL" --pool "$POOL" bench 5 write --write-xattr --write-omap --write-object
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-omap
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-object
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-xattr
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-xattr --write-object
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-xattr --write-omap
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-omap --write-object
+run_expect_fail "$RADOS_TOOL" --pool "$POOL" bench 5 read --write-xattr --write-omap --write-object
+
+for i in $("$RADOS_TOOL" --pool "$POOL" ls | grep "benchmark_data"); do
+    "$RADOS_TOOL" --pool "$POOL" truncate $i 0
+done
+
+run_expect_nosignal "$RADOS_TOOL" --pool "$POOL" bench 1 rand
+run_expect_nosignal "$RADOS_TOOL" --pool "$POOL" bench 1 seq
+
+set -e
+
+OBJ=test_rados_obj
+
+expect_false()
+{
+	if "$@"; then return 1; else return 0; fi
+}
+
+cleanup() {
+    $RADOS_TOOL -p $POOL rm $OBJ || true
+}
+
+test_omap() {
+    cleanup
+    for i in $(seq 1 1 600)
+    do
+	if [ $(($i % 2)) -eq 0 ]; then
+            $RADOS_TOOL -p $POOL setomapval $OBJ $i $i
+	else
+            echo -n "$i" | $RADOS_TOOL -p $POOL setomapval $OBJ $i
+	fi
+        $RADOS_TOOL -p $POOL getomapval $OBJ $i | grep -q "|$i|\$"
+    done
+    $RADOS_TOOL -p $POOL listomapvals $OBJ | grep -c value | grep 600
+    cleanup
+}
+
+test_xattr() {
+    cleanup
+    $RADOS_TOOL -p $POOL put $OBJ /etc/passwd
+    V1=`mktemp fooattrXXXXXXX`
+    V2=`mktemp fooattrXXXXXXX`
+    echo -n fooval > $V1
+    expect_false $RADOS_TOOL -p $POOL setxattr $OBJ 2>/dev/null
+    expect_false $RADOS_TOOL -p $POOL setxattr $OBJ foo fooval extraarg 2>/dev/null
+    $RADOS_TOOL -p $POOL setxattr $OBJ foo fooval
+    $RADOS_TOOL -p $POOL getxattr $OBJ foo > $V2
+    cmp $V1 $V2
+    cat $V1 | $RADOS_TOOL -p $POOL setxattr $OBJ bar
+    $RADOS_TOOL -p $POOL getxattr $OBJ bar > $V2
+    cmp $V1 $V2
+    $RADOS_TOOL -p $POOL listxattr $OBJ > $V1
+    grep -q foo $V1
+    grep -q bar $V1
+    wc -l $V1 | grep -q "^2 "
+    rm $V1 $V2
+    cleanup
+}
+test_rmobj() {
+    p=`uuidgen`
+    ceph osd pool create $p 1
+    ceph osd pool set-quota $p max_objects 1
+    V1=`mktemp fooattrXXXXXXX`
+    rados put $OBJ $V1 -p $p
+    while ! ceph osd dump | grep 'full max_objects'
+    do
+	sleep 2
+    done
+    rados -p $p rm $OBJ --force-full
+    rados rmpool $p $p --yes-i-really-really-mean-it
+    rm $V1
+}
+
+test_xattr
+test_omap
+test_rmobj
+
+echo "SUCCESS!"
+exit 0
diff --git a/qa/workunits/rados/test_tmap_to_omap.sh b/qa/workunits/rados/test_tmap_to_omap.sh
new file mode 100755
index 0000000..76656ad
--- /dev/null
+++ b/qa/workunits/rados/test_tmap_to_omap.sh
@@ -0,0 +1,28 @@
+#!/bin/sh -ex
+
+expect_false()
+{
+	set -x
+	if "$@"; then return 1; else return 0; fi
+}
+
+pool="pool-$$"
+rados mkpool $pool
+
+rados -p $pool tmap set foo key1 value1
+rados -p $pool tmap set foo key2 value2
+rados -p $pool tmap set foo key2 value2
+rados -p $pool tmap dump foo | grep key1
+rados -p $pool tmap dump foo | grep key2
+rados -p $pool tmap-to-omap foo
+expect_false rados -p $pool tmap dump foo
+expect_false rados -p $pool tmap dump foo
+
+rados -p $pool listomapkeys foo | grep key1
+rados -p $pool listomapkeys foo | grep key2
+rados -p $pool getomapval foo key1 | grep value1
+rados -p $pool getomapval foo key2 | grep value2
+
+rados rmpool $pool $pool --yes-i-really-really-mean-it
+
+echo OK
diff --git a/qa/workunits/rbd/concurrent.sh b/qa/workunits/rbd/concurrent.sh
new file mode 100755
index 0000000..e2fb797
--- /dev/null
+++ b/qa/workunits/rbd/concurrent.sh
@@ -0,0 +1,375 @@
+#!/bin/bash -e
+
+# Copyright (C) 2013 Inktank Storage, Inc.
+#
+# This is free software; see the source for copying conditions.
+# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as
+# published by the Free Software Foundation version 2.
+
+# Alex Elder <elder at inktank.com>
+# January 29, 2013
+
+################################################################
+
+# The purpose of this test is to exercise paths through the rbd
+# code, making sure no bad pointer references or invalid reference
+# count operations occur in the face of concurrent activity.
+#
+# Each pass of the test creates an rbd image, maps it, and writes
+# some data into the image.  It also reads some data from all of the
+# other images that exist at the time the pass executes.  Finally,
+# the image is unmapped and removed.  The image removal completes in
+# the background.
+#
+# An iteration of the test consists of performing some number of
+# passes, initating each pass as a background job, and finally
+# sleeping for a variable delay.  The delay is initially a specified
+# value, but each iteration shortens that proportionally, such that
+# the last iteration will not delay at all.
+#
+# The result exercises concurrent creates and deletes of rbd images,
+# writes to new images, reads from both written and unwritten image
+# data (including reads concurrent with writes), and attempts to
+# unmap images being read.
+
+# Usage: concurrent [-i <iter>] [-c <count>] [-d <delay>]
+#
+# Exit status:
+#     0:  success
+#     1:  usage error
+#     2:  other runtime error
+#    99:  argument count error (programming error)
+#   100:  getopt error (internal error)
+
+################################################################
+
+set -x
+
+# Default flag values; RBD_CONCURRENT_ITER names are intended
+# to be used in yaml scripts to pass in alternate values, e.g.:
+#    env:
+#        RBD_CONCURRENT_ITER: 20
+#        RBD_CONCURRENT_COUNT: 5
+#        RBD_CONCURRENT_DELAY: 3
+ITER_DEFAULT=${RBD_CONCURRENT_ITER:-100}
+COUNT_DEFAULT=${RBD_CONCURRENT_COUNT:-5}
+DELAY_DEFAULT=${RBD_CONCURRENT_DELAY:-5}		# seconds
+
+CEPH_SECRET_FILE=${CEPH_SECRET_FILE:-}
+CEPH_ID=${CEPH_ID:-admin}
+SECRET_ARGS=""
+if [ "${CEPH_SECRET_FILE}" ]; then
+	SECRET_ARGS="--secret $CEPH_SECRET_FILE"
+fi
+
+################################################################
+
+function setup() {
+	ID_MAX_DIR=$(mktemp -d /tmp/image_max_id.XXXXX)
+	ID_COUNT_DIR=$(mktemp -d /tmp/image_ids.XXXXXX)
+	NAMES_DIR=$(mktemp -d /tmp/image_names.XXXXXX)
+	SOURCE_DATA=$(mktemp /tmp/source_data.XXXXXX)
+
+	# Use urandom to generate SOURCE_DATA
+        dd if=/dev/urandom of=${SOURCE_DATA} bs=2048 count=66 \
+               >/dev/null 2>&1
+
+	# List of rbd id's *not* created by this script
+	export INITIAL_RBD_IDS=$(ls /sys/bus/rbd/devices)
+
+	# Set up some environment for normal teuthology test setup.
+	# This really should not be necessary but I found it was.
+
+	export CEPH_ARGS=" --name client.0"
+}
+
+function cleanup() {
+	[ ! "${ID_MAX_DIR}" ] && return
+	local id
+	local image
+
+	# Unmap mapped devices
+	for id in $(rbd_ids); do
+		image=$(cat "/sys/bus/rbd/devices/${id}/name")
+		rbd_unmap_image "${id}"
+		rbd_destroy_image "${image}"
+	done
+	# Get any leftover images
+	for image in $(rbd ls 2>/dev/null); do
+		rbd_destroy_image "${image}"
+	done
+	wait
+	sync
+	rm -f "${SOURCE_DATA}"
+	[ -d "${NAMES_DIR}" ] && rmdir "${NAMES_DIR}"
+	echo "Max concurrent rbd image count was $(get_max "${ID_COUNT_DIR}")"
+	rm -rf "${ID_COUNT_DIR}"
+	echo "Max rbd image id was $(get_max "${ID_MAX_DIR}")"
+	rm -rf "${ID_MAX_DIR}"
+}
+
+function get_max() {
+	[ $# -eq 1 ] || exit 99
+	local dir="$1"
+
+	ls -U "${dir}" | sort -n | tail -1
+}
+
+trap cleanup HUP INT QUIT
+
+# print a usage message and quit
+#
+# if a message is supplied, print that first, and then exit
+# with non-zero status
+function usage() {
+	if [ $# -gt 0 ]; then
+		echo "" >&2
+		echo "$@" >&2
+	fi
+
+	echo "" >&2
+	echo "Usage: ${PROGNAME} <options> <tests>" >&2
+	echo "" >&2
+	echo "    options:" >&2
+	echo "        -h or --help" >&2
+	echo "            show this message" >&2
+	echo "        -i or --iterations" >&2
+	echo "            iteration count (1 or more)" >&2
+	echo "        -c or --count" >&2
+	echo "            images created per iteration (1 or more)" >&2
+	echo "        -d or --delay" >&2
+	echo "            maximum delay between iterations" >&2
+	echo "" >&2
+	echo "    defaults:" >&2
+	echo "        iterations: ${ITER_DEFAULT}"
+	echo "        count: ${COUNT_DEFAULT}"
+	echo "        delay: ${DELAY_DEFAULT} (seconds)"
+	echo "" >&2
+
+	[ $# -gt 0 ] && exit 1
+
+	exit 0		# This is used for a --help
+}
+
+# parse command line arguments
+function parseargs() {
+	ITER="${ITER_DEFAULT}"
+	COUNT="${COUNT_DEFAULT}"
+	DELAY="${DELAY_DEFAULT}"
+
+	# Short option flags
+	SHORT_OPTS=""
+	SHORT_OPTS="${SHORT_OPTS},h"
+	SHORT_OPTS="${SHORT_OPTS},i:"
+	SHORT_OPTS="${SHORT_OPTS},c:"
+	SHORT_OPTS="${SHORT_OPTS},d:"
+
+	# Short option flags
+	LONG_OPTS=""
+	LONG_OPTS="${LONG_OPTS},help"
+	LONG_OPTS="${LONG_OPTS},iterations:"
+	LONG_OPTS="${LONG_OPTS},count:"
+	LONG_OPTS="${LONG_OPTS},delay:"
+
+	TEMP=$(getopt --name "${PROGNAME}" \
+		--options "${SHORT_OPTS}" \
+		--longoptions "${LONG_OPTS}" \
+		-- "$@")
+	eval set -- "$TEMP"
+
+	while [ "$1" != "--" ]; do
+		case "$1" in
+			-h|--help)
+				usage
+				;;
+			-i|--iterations)
+				ITER="$2"
+				[ "${ITER}" -lt 1 ] &&
+					usage "bad iterations value"
+				shift
+				;;
+			-c|--count)
+				COUNT="$2"
+				[ "${COUNT}" -lt 1 ] &&
+					usage "bad count value"
+				shift
+				;;
+			-d|--delay)
+				DELAY="$2"
+				shift
+				;;
+			*)
+				exit 100	# Internal error
+				;;
+		esac
+		shift
+	done
+	shift
+}
+
+function rbd_ids() {
+	[ $# -eq 0 ] || exit 99
+	local ids
+	local i
+
+	[ -d /sys/bus/rbd ] || return
+	ids=" $(echo $(ls /sys/bus/rbd/devices)) "
+	for i in ${INITIAL_RBD_IDS}; do
+		ids=${ids/ ${i} / }
+	done
+	echo ${ids}
+}
+
+function update_maxes() {
+	local ids="$@"
+	local last_id
+	# These aren't 100% safe against concurrent updates but it
+	# should be pretty close
+	count=$(echo ${ids} | wc -w)
+	touch "${ID_COUNT_DIR}/${count}"
+	last_id=${ids% }
+	last_id=${last_id##* }
+	touch "${ID_MAX_DIR}/${last_id}"
+}
+
+function rbd_create_image() {
+	[ $# -eq 0 ] || exit 99
+	local image=$(basename $(mktemp "${NAMES_DIR}/image.XXXXXX"))
+
+	rbd create "${image}" --size=1024
+	echo "${image}"
+}
+
+function rbd_image_id() {
+	[ $# -eq 1 ] || exit 99
+	local image="$1"
+
+	grep -l "${image}" /sys/bus/rbd/devices/*/name 2>/dev/null |
+		cut -d / -f 6
+}
+
+function rbd_map_image() {
+	[ $# -eq 1 ] || exit 99
+	local image="$1"
+	local id
+
+	sudo rbd map "${image}" --user "${CEPH_ID}" ${SECRET_ARGS} \
+		> /dev/null 2>&1
+
+	id=$(rbd_image_id "${image}")
+	echo "${id}"
+}
+
+function rbd_write_image() {
+	[ $# -eq 1 ] || exit 99
+	local id="$1"
+
+	# Offset and size here are meant to ensure beginning and end
+	# cross both (4K or 64K) page and (4MB) rbd object boundaries.
+	# It assumes the SOURCE_DATA file has size 66 * 2048 bytes
+	dd if="${SOURCE_DATA}" of="/dev/rbd${id}" bs=2048 seek=2015 \
+		> /dev/null 2>&1
+}
+
+# All starting and ending offsets here are selected so they are not
+# aligned on a (4 KB or 64 KB) page boundary
+function rbd_read_image() {
+	[ $# -eq 1 ] || exit 99
+	local id="$1"
+
+	# First read starting and ending at an offset before any
+	# written data.  The osd zero-fills data read from an
+	# existing rbd object, but before any previously-written
+	# data.
+	dd if="/dev/rbd${id}" of=/dev/null bs=2048 count=34 skip=3 \
+		> /dev/null 2>&1
+	# Next read starting at an offset before any written data,
+	# but ending at an offset that includes data that's been
+	# written.  The osd zero-fills unwritten data at the
+	# beginning of a read.
+	dd if="/dev/rbd${id}" of=/dev/null bs=2048 count=34 skip=1983 \
+		> /dev/null 2>&1
+	# Read the data at offset 2015 * 2048 bytes (where it was
+	# written) and make sure it matches the original data.
+	cmp --quiet "${SOURCE_DATA}" "/dev/rbd${id}" 0 4126720 ||
+		echo "MISMATCH!!!"
+	# Now read starting within the pre-written data, but ending
+	# beyond it.  The rbd client zero-fills the unwritten
+	# portion at the end of a read.
+	dd if="/dev/rbd${id}" of=/dev/null bs=2048 count=34 skip=2079 \
+		> /dev/null 2>&1
+	# Now read starting from an unwritten range within a written
+	# rbd object.  The rbd client zero-fills this.
+	dd if="/dev/rbd${id}" of=/dev/null bs=2048 count=34 skip=2115 \
+		> /dev/null 2>&1
+	# Finally read from an unwritten region which would reside
+	# in a different (non-existent) osd object.  The osd client
+	# zero-fills unwritten data when the target object doesn't
+	# exist.
+	dd if="/dev/rbd${id}" of=/dev/null bs=2048 count=34 skip=4098 \
+		> /dev/null 2>&1
+}
+
+function rbd_unmap_image() {
+	[ $# -eq 1 ] || exit 99
+	local id="$1"
+
+	sudo rbd unmap "/dev/rbd${id}"
+}
+
+function rbd_destroy_image() {
+	[ $# -eq 1 ] || exit 99
+	local image="$1"
+
+	# Don't wait for it to complete, to increase concurrency
+	rbd rm "${image}" >/dev/null 2>&1 &
+	rm -f "${NAMES_DIR}/${image}"
+}
+
+function one_pass() {
+	[ $# -eq 0 ] || exit 99
+	local image
+	local id
+	local ids
+	local i
+
+	image=$(rbd_create_image)
+	id=$(rbd_map_image "${image}")
+	ids=$(rbd_ids)
+	update_maxes "${ids}"
+	for i in ${rbd_ids}; do
+		if [ "${i}" -eq "${id}" ]; then
+			rbd_write_image "${i}"
+		else
+			rbd_read_image "${i}"
+		fi
+	done
+	rbd_unmap_image "${id}"
+	rbd_destroy_image "${image}"
+}
+
+################################################################
+
+parseargs "$@"
+
+setup
+
+for iter in $(seq 1 "${ITER}"); do
+	for count in $(seq 1 "${COUNT}"); do
+		one_pass &
+	done
+	# Sleep longer at first, overlap iterations more later.
+	# Use awk to get sub-second granularity (see sleep(1)).
+	sleep $(echo "${DELAY}" "${iter}" "${ITER}" |
+		awk '{ printf("%.2f\n", $1 - $1 * $2 / $3);}')
+
+done
+wait
+
+cleanup
+
+exit 0
diff --git a/qa/workunits/rbd/copy.sh b/qa/workunits/rbd/copy.sh
new file mode 100755
index 0000000..746dd38
--- /dev/null
+++ b/qa/workunits/rbd/copy.sh
@@ -0,0 +1,350 @@
+#!/bin/sh -ex
+
+# make sure rbd pool is EMPTY.. this is a test script!!
+rbd ls | wc -l | grep -v '^0$' && echo "nonempty rbd pool, aborting!  run this script on an empty test cluster only." && exit 1
+
+IMGS="testimg1 testimg2 testimg3 foo foo2 bar bar2 test1 test2 test3 clone2"
+
+tiered=0
+if ceph osd dump | grep ^pool | grep "'rbd'" | grep tier; then
+    tiered=1
+fi
+
+remove_images() {
+    for img in $IMGS
+    do
+        (rbd snap purge $img || true) >/dev/null 2>&1
+        (rbd rm $img || true) >/dev/null 2>&1
+    done
+}
+
+test_others() {
+    echo "testing import, export, resize, and snapshots..."
+    TMP_FILES="/tmp/img1 /tmp/img1.new /tmp/img2 /tmp/img2.new /tmp/img3 /tmp/img3.new /tmp/img1.snap1"
+
+    remove_images
+    rm -f $TMP_FILES
+
+    # create an image
+    dd if=/bin/sh of=/tmp/img1 bs=1k count=1 seek=10
+    dd if=/bin/dd of=/tmp/img1 bs=1k count=10 seek=100
+    dd if=/bin/rm of=/tmp/img1 bs=1k count=100 seek=1000
+    dd if=/bin/ls of=/tmp/img1 bs=1k seek=10000
+    dd if=/bin/ln of=/tmp/img1 bs=1k seek=100000
+
+    # import, snapshot
+    rbd import $RBD_CREATE_ARGS /tmp/img1 testimg1
+    rbd resize testimg1 --size=256 --allow-shrink
+    rbd export testimg1 /tmp/img2
+    rbd snap create testimg1 --snap=snap1
+    rbd resize testimg1 --size=128 && exit 1 || true   # shrink should fail
+    rbd resize testimg1 --size=128 --allow-shrink
+    rbd export testimg1 /tmp/img3
+
+    # info
+    rbd info testimg1 | grep 'size 128 MB'
+    rbd info --snap=snap1 testimg1 | grep 'size 256 MB'
+
+    # make copies
+    rbd copy testimg1 --snap=snap1 testimg2
+    rbd copy testimg1 testimg3
+
+    # verify the result
+    rbd info testimg2 | grep 'size 256 MB'
+    rbd info testimg3 | grep 'size 128 MB'
+
+    rbd export testimg1 /tmp/img1.new
+    rbd export testimg2 /tmp/img2.new
+    rbd export testimg3 /tmp/img3.new
+
+    cmp /tmp/img2 /tmp/img2.new
+    cmp /tmp/img3 /tmp/img3.new
+
+    # rollback
+    rbd snap rollback --snap=snap1 testimg1
+    rbd info testimg1 | grep 'size 256 MB'
+    rbd export testimg1 /tmp/img1.snap1
+    cmp /tmp/img2 /tmp/img1.snap1
+
+    # test create, copy of zero-length images
+    rbd rm testimg2
+    rbd rm testimg3
+    rbd create testimg2 -s 0
+    rbd cp testimg2 testimg3
+
+    # remove snapshots
+    rbd snap rm --snap=snap1 testimg1
+    rbd info --snap=snap1 testimg1 2>&1 | grep 'error setting snapshot context: (2) No such file or directory'
+
+    remove_images
+    rm -f $TMP_FILES
+}
+
+test_rename() {
+    echo "testing rename..."
+    remove_images
+
+    rbd create --image-format 1 -s 1 foo
+    rbd create --image-format 2 -s 1 bar
+    rbd rename foo foo2
+    rbd rename foo2 bar 2>&1 | grep exists
+    rbd rename bar bar2
+    rbd rename bar2 foo2 2>&1 | grep exists
+
+    rados mkpool rbd2
+    rbd create -p rbd2 -s 1 foo
+    rbd rename rbd2/foo rbd2/bar
+    rbd -p rbd2 ls | grep bar
+    ! rbd rename rbd2/bar foo
+    ! rbd rename rbd2/bar --dest-pool rbd foo
+    rbd rename --pool rbd2 bar --dest-pool rbd2 foo
+    rbd -p rbd2 ls | grep foo
+    rados rmpool rbd2 rbd2 --yes-i-really-really-mean-it
+
+    remove_images
+}
+
+test_ls() {
+    echo "testing ls..."
+    remove_images
+
+    rbd create --image-format 1 -s 1 test1
+    rbd create --image-format 1 -s 1 test2
+    rbd ls | grep test1
+    rbd ls | grep test2
+    rbd ls | wc -l | grep 2
+    # look for fields in output of ls -l without worrying about space
+    rbd ls -l | grep 'test1.*1024k.*1'
+    rbd ls -l | grep 'test2.*1024k.*1'
+
+    rbd rm test1
+    rbd rm test2
+
+    rbd create --image-format 2 -s 1 test1
+    rbd create --image-format 2 -s 1 test2
+    rbd ls | grep test1
+    rbd ls | grep test2
+    rbd ls | wc -l | grep 2
+    rbd ls -l | grep 'test1.*1024k.*2'
+    rbd ls -l | grep 'test2.*1024k.*2'
+
+    rbd rm test1
+    rbd rm test2
+
+    rbd create --image-format 2 -s 1 test1
+    rbd create --image-format 1 -s 1 test2
+    rbd ls | grep test1
+    rbd ls | grep test2
+    rbd ls | wc -l | grep 2
+    rbd ls -l | grep 'test1.*1024k.*2'
+    rbd ls -l | grep 'test2.*1024k.*1'
+    remove_images
+	
+    # test that many images can be shown by ls
+    for i in $(seq -w 00 99); do
+	rbd create image.$i -s 1
+    done
+    rbd ls | wc -l | grep 100
+    rbd ls -l | grep image | wc -l | grep 100
+    for i in $(seq -w 00 99); do
+	rbd rm image.$i 
+    done
+
+    for i in $(seq -w 00 99); do
+	rbd create image.$i --image-format 2 -s 1
+    done
+    rbd ls | wc -l | grep 100
+    rbd ls -l | grep image |  wc -l | grep 100
+    for i in $(seq -w 00 99); do
+	rbd rm image.$i 
+    done
+}
+
+test_remove() {
+    echo "testing remove..."
+    remove_images
+
+    rbd create --image-format 1 -s 1 test1
+    rbd rm test1
+    rbd ls | wc -l | grep "^0$"
+
+    rbd create --image-format 2 -s 1 test2
+    rbd rm test2
+    rbd ls | wc -l | grep "^0$"
+
+    # check that remove succeeds even if it's
+    # interrupted partway through. simulate this
+    # by removing some objects manually.
+
+    # remove with header missing (old format)
+    rbd create --image-format 1 -s 1 test1
+    rados rm -p rbd test1.rbd
+    rbd rm test1
+    rbd ls | wc -l | grep "^0$"
+
+    if [ $tiered -eq 0 ]; then
+        # remove with header missing
+	rbd create --image-format 2 -s 1 test2
+	HEADER=$(rados -p rbd ls | grep '^rbd_header')
+	rados -p rbd rm $HEADER
+	rbd rm test2
+	rbd ls | wc -l | grep "^0$"
+
+        # remove with header and id missing
+	rbd create --image-format 2 -s 1 test2
+	HEADER=$(rados -p rbd ls | grep '^rbd_header')
+	rados -p rbd rm $HEADER
+	rados -p rbd rm rbd_id.test2
+	rbd rm test2
+	rbd ls | wc -l | grep "^0$"
+    fi
+
+    # remove with rbd_children object missing (and, by extension,
+    # with child not mentioned in rbd_children)
+    rbd create --image-format 2 -s 1 test2
+    rbd snap create test2 at snap
+    rbd snap protect test2 at snap
+    rbd clone test2 at snap clone
+
+    rados -p rbd rm rbd_children
+    rbd rm clone
+    rbd ls | grep clone | wc -l | grep '^0$'
+
+    rbd snap unprotect test2 at snap
+    rbd snap rm test2 at snap
+    rbd rm test2
+}
+
+test_locking() {
+    echo "testing locking..."
+    remove_images
+
+    rbd create -s 1 test1
+    rbd lock list test1 | wc -l | grep '^0$'
+    rbd lock add test1 id
+    rbd lock list test1 | grep ' 1 '
+    LOCKER=$(rbd lock list test1 | tail -n 1 | awk '{print $1;}')
+    rbd lock remove test1 id $LOCKER
+    rbd lock list test1 | wc -l | grep '^0$'
+
+    rbd lock add test1 id --shared tag
+    rbd lock list test1 | grep ' 1 '
+    rbd lock add test1 id --shared tag
+    rbd lock list test1 | grep ' 2 '
+    rbd lock add test1 id2 --shared tag
+    rbd lock list test1 | grep ' 3 '
+    rbd lock list test1 | tail -n 1 | awk '{print $2, $1;}' | xargs rbd lock remove test1
+    if rbd info test1 | grep -qE "features:.*exclusive"
+    then
+      # new locking functionality requires all locks to be released
+      while [ -n "$(rbd lock list test1)" ]
+      do
+        rbd lock list test1 | tail -n 1 | awk '{print $2, $1;}' | xargs rbd lock remove test1
+      done
+    fi
+    rbd rm test1
+}
+
+test_pool_image_args() {
+    echo "testing pool and image args..."
+    remove_images
+
+    ceph osd pool delete test test --yes-i-really-really-mean-it || true
+    ceph osd pool create test 100
+    truncate -s 1 /tmp/empty
+
+    rbd ls | wc -l | grep 0
+    rbd create -s 1 test1
+    rbd ls | grep -q test1
+    rbd import --image test2 /tmp/empty
+    rbd ls | grep -q test2
+    rbd --dest test3 import /tmp/empty
+    rbd ls | grep -q test3
+    rbd import /tmp/empty foo
+    rbd ls | grep -q foo
+
+    rbd ls test | wc -l | grep 0
+    rbd import /tmp/empty test/test1
+    rbd ls test | grep -q test1
+    rbd -p test import /tmp/empty test2
+    rbd ls test | grep -q test2
+    rbd --image test3 -p test import /tmp/empty
+    rbd ls test | grep -q test3
+    rbd --image test4 -p test import /tmp/empty
+    rbd ls test | grep -q test4
+    rbd --dest test5 -p test import /tmp/empty
+    rbd ls test | grep -q test5
+    rbd --dest test6 --dest-pool test import /tmp/empty
+    rbd ls test | grep -q test6
+    rbd --image test7 --dest-pool test import /tmp/empty
+    rbd ls test | grep -q test7
+    rbd --image test/test8 import /tmp/empty
+    rbd ls test | grep -q test8
+    rbd --dest test/test9 import /tmp/empty
+    rbd ls test | grep -q test9
+    rbd import --pool test /tmp/empty
+    rbd ls test | grep -q empty
+
+    # copy with no explicit pool goes to pool rbd
+    rbd copy test/test9 test10
+    rbd ls test | grep -qv test10
+    rbd ls | grep -q test10
+    rbd copy test/test9 test/test10
+    rbd ls test | grep -q test10
+    rbd copy --pool test test10 --dest-pool test test11
+    rbd ls test | grep -q test11
+    rbd copy --dest-pool rbd --pool test test11 test12
+    rbd ls | grep test12
+    rbd ls test | grep -qv test12
+
+    rm -f /tmp/empty
+    ceph osd pool delete test test --yes-i-really-really-mean-it
+
+    for f in foo test1 test10 test12 test2 test3 ; do
+	rbd rm $f
+    done
+}
+
+test_clone() {
+    echo "testing clone..."
+    remove_images
+    rbd create test1 $RBD_CREATE_ARGS -s 1
+    rbd snap create test1 at s1
+    rbd snap protect test1 at s1
+
+    rados mkpool rbd2
+    rbd clone test1 at s1 rbd2/clone
+    rbd -p rbd2 ls | grep clone
+    rbd -p rbd2 ls -l | grep clone | grep test1 at s1
+    rbd ls | grep -v clone
+    rbd flatten rbd2/clone
+    rbd snap create rbd2/clone at s1
+    rbd snap protect rbd2/clone at s1
+    rbd clone rbd2/clone at s1 clone2
+    rbd ls | grep clone2
+    rbd ls -l | grep clone2 | grep rbd2/clone at s1
+    rbd -p rbd2 ls | grep -v clone2
+
+    rbd rm clone2
+    rbd snap unprotect rbd2/clone at s1
+    rbd snap rm rbd2/clone at s1
+    rbd rm rbd2/clone
+    rbd snap unprotect test1 at s1
+    rbd snap rm test1 at s1
+    rbd rm test1
+    rados rmpool rbd2 rbd2 --yes-i-really-really-mean-it
+}
+
+test_pool_image_args
+test_rename
+test_ls
+test_remove
+RBD_CREATE_ARGS=""
+test_others
+test_locking
+RBD_CREATE_ARGS="--image-format 2"
+test_others
+test_locking
+test_clone
+
+echo OK
diff --git a/qa/workunits/rbd/diff.sh b/qa/workunits/rbd/diff.sh
new file mode 100755
index 0000000..48ab5bb
--- /dev/null
+++ b/qa/workunits/rbd/diff.sh
@@ -0,0 +1,52 @@
+#!/bin/bash -ex
+
+function cleanup() {
+    rbd snap purge foo || :
+    rbd rm foo || :
+    rbd snap purge foo.copy || :
+    rbd rm foo.copy || :
+    rbd snap purge foo.copy2 || :
+    rbd rm foo.copy2 || :
+    rm -f foo.diff foo.out
+}
+
+cleanup
+
+rbd create foo --size 1000
+rbd bench-write foo --io-size 4096 --io-threads 5 --io-total 4096000 --io-pattern rand
+
+#rbd cp foo foo.copy
+rbd create foo.copy --size 1000
+rbd export-diff foo - | rbd import-diff - foo.copy
+
+rbd snap create foo --snap=two
+rbd bench-write foo --io-size 4096 --io-threads 5 --io-total 4096000 --io-pattern rand
+rbd snap create foo --snap=three
+rbd snap create foo.copy --snap=two
+
+rbd export-diff foo at two --from-snap three foo.diff && exit 1 || true  # wrong snap order
+rm foo.diff
+
+rbd export-diff foo at three --from-snap two foo.diff
+rbd import-diff foo.diff foo.copy
+rbd import-diff foo.diff foo.copy && exit 1 || true   # this should fail with EEXIST on the end snap
+rbd snap ls foo.copy | grep three
+
+rbd create foo.copy2 --size 1000
+rbd import-diff foo.diff foo.copy2 && exit 1 || true   # this should fail bc the start snap dne
+
+rbd export foo foo.out
+orig=`md5sum foo.out | awk '{print $1}'`
+rm foo.out
+rbd export foo.copy foo.out
+copy=`md5sum foo.out | awk '{print $1}'`
+
+if [ "$orig" != "$copy" ]; then
+    echo does not match
+    exit 1
+fi
+
+cleanup
+
+echo OK
+
diff --git a/qa/workunits/rbd/diff_continuous.sh b/qa/workunits/rbd/diff_continuous.sh
new file mode 100755
index 0000000..41e4412
--- /dev/null
+++ b/qa/workunits/rbd/diff_continuous.sh
@@ -0,0 +1,59 @@
+#!/bin/bash -ex
+
+max=20
+size=1500
+
+iosize=16384
+iototal=16384000
+iothreads=16
+
+parent=`uuidgen`"-parent"
+src=`uuidgen`"-src";
+dst=`uuidgen`"-dst";
+
+function cleanup() {
+    rbd snap purge $src || :
+    rbd rm $src || :
+    rbd snap purge $dst || :
+    rbd rm $dst || :
+    rbd snap unprotect $parent --snap parent || :
+    rbd snap purge $parent || :
+    rbd rm $parent || :
+}
+trap cleanup EXIT
+
+# start from a clone
+rbd create $parent --size $size --image-format 2 --stripe-count 8 --stripe-unit 65536
+rbd bench-write $parent --io-size $iosize --io-threads $iothreads --io-total $iototal --io-pattern rand 
+rbd snap create $parent --snap parent
+rbd snap protect $parent --snap parent
+rbd clone $parent at parent $src --stripe-count 4 --stripe-unit 262144
+rbd create $dst --size $size --image-format 2 --order 19
+
+# mirror for a while
+for s in `seq 1 $max`; do
+    rbd snap create $src --snap=snap$s
+    rbd export-diff $src at snap$s - $lastsnap | rbd import-diff - $dst  &
+    rbd bench-write $src --io-size $iosize --io-threads $iothreads --io-total $iototal --io-pattern rand  &
+    wait
+    lastsnap="--from-snap snap$s"
+done
+
+#trap "" EXIT
+#exit 0
+
+# validate
+for s in `seq 1 $max`; do
+    ssum=`rbd export $src at snap$s - | md5sum`
+    dsum=`rbd export $dst at snap$s - | md5sum`
+    if [ "$ssum" != "$dsum" ]; then
+	echo different sum at snap$s
+	exit 1
+    fi
+done
+
+cleanup
+trap "" EXIT
+
+echo OK
+
diff --git a/qa/workunits/rbd/huge-tickets.sh b/qa/workunits/rbd/huge-tickets.sh
new file mode 100755
index 0000000..63a6384
--- /dev/null
+++ b/qa/workunits/rbd/huge-tickets.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# This is a test for http://tracker.ceph.com/issues/8979 and the fallout
+# from triaging it.  #8979 itself was random crashes on corrupted memory
+# due to a buffer overflow (for tickets larger than 256 bytes), further
+# inspection showed that vmalloced tickets weren't handled correctly as
+# well.
+#
+# What we are doing here is generating three huge keyrings and feeding
+# them to libceph (through 'rbd map' on a scratch image).  Bad kernels
+# will crash reliably either on corrupted memory somewhere or a bad page
+# fault in scatterwalk_pagedone().
+
+set -ex
+
+function generate_keyring() {
+    local user=$1
+    local n=$2
+
+    ceph-authtool -C -n client.$user --cap mon 'allow *' --gen-key /tmp/keyring-$user
+
+    set +x # don't pollute trace with echos
+    echo -en "\tcaps osd = \"allow rwx pool=rbd" >>/tmp/keyring-$user
+    for i in $(seq 1 $n); do
+        echo -n ", allow rwx pool=pool$i" >>/tmp/keyring-$user
+    done
+    echo "\"" >>/tmp/keyring-$user
+    set -x
+}
+
+generate_keyring foo 1000 # ~25K, kmalloc
+generate_keyring bar 20000 # ~500K, vmalloc
+generate_keyring baz 300000 # ~8M, vmalloc + sg chaining
+
+rbd create --size 1 test
+
+for user in {foo,bar,baz}; do
+    ceph auth import -i /tmp/keyring-$user
+    DEV=$(sudo rbd map -n client.$user --keyring /tmp/keyring-$user test)
+    sudo rbd unmap $DEV
+done
diff --git a/qa/workunits/rbd/image_read.sh b/qa/workunits/rbd/image_read.sh
new file mode 100755
index 0000000..907ce86
--- /dev/null
+++ b/qa/workunits/rbd/image_read.sh
@@ -0,0 +1,677 @@
+#!/bin/bash -e
+
+# Copyright (C) 2013 Inktank Storage, Inc.
+#
+# This is free software; see the source for copying conditions.
+# There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.
+#
+# This is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as
+# published by the Free Software Foundation version 2.
+
+# Alex Elder <elder at inktank.com>
+# April 10, 2013
+
+################################################################
+
+# The purpose of this test is to validate that data read from a
+# mapped rbd image is what it's expected to be.
+#
+# By default it creates an image and fills it with some data.  It
+# then reads back the data at a series of offsets known to cover
+# various situations (such as reading the beginning, end, or the
+# entirety of an object, or doing a read that spans multiple
+# objects), and stashes the results in a set of local files.
+#
+# It also creates and maps a snapshot of the original image after
+# it's been filled, and reads back the same ranges of data from the
+# snapshot.  It then compares the data read back with what was read
+# back from the original image, verifying they match.
+#
+# Clone functionality is tested as well, in which case a clone is
+# made of the snapshot, and the same ranges of data are again read
+# and compared with the original.  In addition, a snapshot of that
+# clone is created, and a clone of *that* snapshot is put through
+# the same set of tests.  (Clone testing can be optionally skipped.)
+
+################################################################
+
+# Default parameter values.  Environment variables, if set, will
+# supercede these defaults.  Such variables have names that begin
+# with "IMAGE_READ_", for e.g. use IMAGE_READ_PAGE_SIZE=65536
+# to use 65536 as the page size.
+
+DEFAULT_VERBOSE=true
+DEFAULT_TEST_CLONES=true
+DEFAULT_LOCAL_FILES=false
+DEFAULT_FORMAT=2
+DEFAULT_DOUBLE_ORDER=true
+DEFAULT_HALF_ORDER=false
+DEFAULT_PAGE_SIZE=4096
+DEFAULT_OBJECT_ORDER=22
+MIN_OBJECT_ORDER=12	# technically 9, but the rbd CLI enforces 12
+MAX_OBJECT_ORDER=32
+
+PROGNAME=$(basename $0)
+
+ORIGINAL=original-$$
+SNAP1=snap1-$$
+CLONE1=clone1-$$
+SNAP2=snap2-$$
+CLONE2=clone2-$$
+
+function err() {
+	if [ $# -gt 0 ]; then
+		echo "${PROGNAME}: $@" >&2
+	fi
+	exit 2
+}
+
+function usage() {
+	if [ $# -gt 0 ]; then
+		echo "" >&2
+		echo "${PROGNAME}: $@" >&2
+	fi
+	echo "" >&2
+	echo "Usage: ${PROGNAME} [<options>]" >&2
+	echo "" >&2
+	echo "options are:" >&2
+	echo "    -o object_order" >&2
+	echo "        must be ${MIN_OBJECT_ORDER}..${MAX_OBJECT_ORDER}" >&2
+	echo "    -p page_size    (in bytes)" >&2
+	echo "        note: there must be at least 4 pages per object" >&2
+	echo "    -1" >&2
+	echo "        test using format 1 rbd images (default)" >&2
+	echo "    -2" >&2
+	echo "        test using format 2 rbd images" >&2
+	echo "    -c" >&2
+	echo "        also test rbd clone images (implies format 2)" >&2
+	echo "    -d" >&2
+	echo "        clone object order double its parent's (format 2)" >&2
+	echo "    -h" >&2
+	echo "        clone object order half of its parent's (format 2)" >&2
+	echo "    -l" >&2
+	echo "        use local files rather than rbd images" >&2
+	echo "    -v" >&2
+	echo "        disable reporting of what's going on" >&2
+	echo "" >&2
+	exit 1
+}
+
+function verbose() {
+	[ "${VERBOSE}" = true ] && echo "$@"
+	true	# Don't let the verbose test spoil our return value
+}
+
+function quiet() {
+	"$@" 2> /dev/null
+}
+
+function boolean_toggle() {
+	[ $# -eq 1 ] || exit 99
+	test "$1" = "true" && echo false || echo true
+}
+
+function parseargs() {
+	local opts="o:p:12clv"
+	local lopts="order:,page_size:,local,clone,verbose"
+	local parsed
+	local clone_order_msg
+
+	# use values from environment if available
+	VERBOSE="${IMAGE_READ_VERBOSE:-${DEFAULT_VERBOSE}}"
+	TEST_CLONES="${IMAGE_READ_TEST_CLONES:-${DEFAULT_TEST_CLONES}}"
+	LOCAL_FILES="${IMAGE_READ_LOCAL_FILES:-${DEFAULT_LOCAL_FILES}}"
+	DOUBLE_ORDER="${IMAGE_READ_DOUBLE_ORDER:-${DEFAULT_DOUBLE_ORDER}}"
+	HALF_ORDER="${IMAGE_READ_HALF_ORDER:-${DEFAULT_HALF_ORDER}}"
+	FORMAT="${IMAGE_READ_FORMAT:-${DEFAULT_FORMAT}}"
+	PAGE_SIZE="${IMAGE_READ_PAGE_SIZE:-${DEFAULT_PAGE_SIZE}}"
+	OBJECT_ORDER="${IMAGE_READ_OBJECT_ORDER:-${DEFAULT_OBJECT_ORDER}}"
+
+	parsed=$(getopt -o "${opts}" -l "${lopts}" -n "${PROGNAME}" -- "$@") ||
+		usage
+	eval set -- "${parsed}"
+	while true; do
+		case "$1" in
+		-v|--verbose)
+			VERBOSE=$(boolean_toggle "${VERBOSE}");;
+		-c|--clone)
+			TEST_CLONES=$(boolean_toggle "${TEST_CLONES}");;
+		-d|--double)
+			DOUBLE_ORDER=$(boolean_toggle "${DOUBLE_ORDER}");;
+		-h|--half)
+			HALF_ORDER=$(boolean_toggle "${HALF_ORDER}");;
+		-l|--local)
+			LOCAL_FILES=$(boolean_toggle "${LOCAL_FILES}");;
+		-1|-2)
+			FORMAT="${1:1}";;
+		-p|--page_size)
+			PAGE_SIZE="$2"; shift;;
+		-o|--order)
+			OBJECT_ORDER="$2"; shift;;
+		--)
+			shift; break;;
+		*)
+			err "getopt internal error"
+		esac
+		shift
+	done
+	[ $# -gt 0 ] && usage "excess arguments ($*)"
+
+	if [ "${TEST_CLONES}" = true ]; then
+		# If we're using different object orders for clones,
+		# make sure the limits are updated accordingly.  If
+		# both "half" and "double" are specified, just
+		# ignore them both.
+		if [ "${DOUBLE_ORDER}" = true ]; then
+			if [ "${HALF_ORDER}" = true ]; then
+				DOUBLE_ORDER=false
+				HALF_ORDER=false
+			else
+				((MAX_OBJECT_ORDER -= 2))
+			fi
+		elif [ "${HALF_ORDER}" = true ]; then
+			((MIN_OBJECT_ORDER += 2))
+		fi
+	fi
+
+	[ "${OBJECT_ORDER}" -lt "${MIN_OBJECT_ORDER}" ] &&
+		usage "object order (${OBJECT_ORDER}) must be" \
+			"at least ${MIN_OBJECT_ORDER}"
+	[ "${OBJECT_ORDER}" -gt "${MAX_OBJECT_ORDER}" ] &&
+		usage "object order (${OBJECT_ORDER}) must be" \
+			"at most ${MAX_OBJECT_ORDER}"
+
+	if [ "${TEST_CLONES}" = true ]; then
+		if [ "${DOUBLE_ORDER}" = true ]; then
+			((CLONE1_ORDER = OBJECT_ORDER + 1))
+			((CLONE2_ORDER = OBJECT_ORDER + 2))
+			clone_order_msg="double"
+		elif [ "${HALF_ORDER}" = true ]; then
+			((CLONE1_ORDER = OBJECT_ORDER - 1))
+			((CLONE2_ORDER = OBJECT_ORDER - 2))
+			clone_order_msg="half of"
+		else
+			CLONE1_ORDER="${OBJECT_ORDER}"
+			CLONE2_ORDER="${OBJECT_ORDER}"
+			clone_order_msg="the same as"
+		fi
+	fi
+
+	[ "${TEST_CLONES}" != true ] || FORMAT=2
+
+	OBJECT_SIZE=$(echo "2 ^ ${OBJECT_ORDER}" | bc)
+	OBJECT_PAGES=$(echo "${OBJECT_SIZE} / ${PAGE_SIZE}" | bc)
+	IMAGE_SIZE=$((2 * 16 * OBJECT_SIZE / (1024 * 1024)))
+	[ "${IMAGE_SIZE}" -lt 1 ] && IMAGE_SIZE=1
+	IMAGE_OBJECTS=$((IMAGE_SIZE * (1024 * 1024) / OBJECT_SIZE))
+
+	[ "${OBJECT_PAGES}" -lt 4 ] &&
+		usage "object size (${OBJECT_SIZE}) must be" \
+			"at least 4 * page size (${PAGE_SIZE})"
+
+	echo "parameters for this run:"
+	echo "    format ${FORMAT} images will be tested"
+	echo "    object order is ${OBJECT_ORDER}, so" \
+		"objects are ${OBJECT_SIZE} bytes"
+	echo "    page size is ${PAGE_SIZE} bytes, so" \
+		"there are are ${OBJECT_PAGES} pages in an object"
+	echo "    derived image size is ${IMAGE_SIZE} MB, so" \
+		"there are ${IMAGE_OBJECTS} objects in an image"
+	if [ "${TEST_CLONES}" = true ]; then
+		echo "    clone functionality will be tested"
+		echo "    object size for a clone will be ${clone_order_msg}"
+		echo "        the object size of its parent image"
+	fi
+
+	true	# Don't let the clones test spoil our return value
+}
+
+function image_dev_path() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+
+	if [ "${LOCAL_FILES}" = true ]; then
+		echo "${TEMP}/${image_name}"
+		return
+	fi
+
+	echo "/dev/rbd/rbd/${image_name}"
+}
+
+function out_data_dir() {
+	[ $# -lt 2 ] || exit 99
+	local out_data="${TEMP}/data"
+	local image_name
+
+	if [ $# -eq 1 ]; then
+		image_name="$1"
+		echo "${out_data}/${image_name}"
+	else
+		echo "${out_data}"
+	fi
+}
+
+function setup() {
+	verbose "===== setting up ====="
+	TEMP=$(mktemp -d /tmp/rbd_image_read.XXXXX)
+	mkdir -p $(out_data_dir)
+
+	# create and fill the original image with some data
+	create_image "${ORIGINAL}"
+	map_image "${ORIGINAL}"
+	fill_original
+
+	# create a snapshot of the original
+	create_image_snap "${ORIGINAL}" "${SNAP1}"
+	map_image_snap "${ORIGINAL}" "${SNAP1}"
+
+	if [ "${TEST_CLONES}" = true ]; then
+		# create a clone of the original snapshot
+		create_snap_clone "${ORIGINAL}" "${SNAP1}" \
+			"${CLONE1}" "${CLONE1_ORDER}"
+		map_image "${CLONE1}"
+
+		# create a snapshot of that clone
+		create_image_snap "${CLONE1}" "${SNAP2}"
+		map_image_snap "${CLONE1}" "${SNAP2}"
+
+		# create a clone of that clone's snapshot
+		create_snap_clone "${CLONE1}" "${SNAP2}" \
+			"${CLONE2}" "${CLONE2_ORDER}"
+		map_image "${CLONE2}"
+	fi
+}
+
+function teardown() {
+	verbose "===== cleaning up ====="
+	if [ "${TEST_CLONES}" = true ]; then
+		unmap_image "${CLONE2}"					|| true
+		destroy_snap_clone "${CLONE1}" "${SNAP2}" "${CLONE2}"	|| true
+
+		unmap_image_snap "${CLONE1}" "${SNAP2}"			|| true
+		destroy_image_snap "${CLONE1}" "${SNAP2}"		|| true
+
+		unmap_image "${CLONE1}"					|| true
+		destroy_snap_clone "${ORIGINAL}" "${SNAP1}" "${CLONE1}"	|| true
+	fi
+	unmap_image_snap "${ORIGINAL}" "${SNAP1}"			|| true
+	destroy_image_snap "${ORIGINAL}" "${SNAP1}"			|| true
+	unmap_image "${ORIGINAL}"					|| true
+	destroy_image "${ORIGINAL}"					|| true
+
+	rm -rf $(out_data_dir)
+	rmdir "${TEMP}"
+}
+
+function create_image() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+	local image_path
+	local bytes
+
+	verbose "creating image \"${image_name}\""
+	if [ "${LOCAL_FILES}" = true ]; then
+		image_path=$(image_dev_path "${image_name}")
+		bytes=$(echo "${IMAGE_SIZE} * 1024 * 1024 - 1" | bc)
+		quiet dd if=/dev/zero bs=1 count=1 seek="${bytes}" \
+			of="${image_path}"
+		return
+	fi
+
+	rbd create "${image_name}" --image-format "${FORMAT}" \
+		--size "${IMAGE_SIZE}" --order "${OBJECT_ORDER}" \
+		--image-shared
+}
+
+function destroy_image() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+	local image_path
+
+	verbose "destroying image \"${image_name}\""
+	if [ "${LOCAL_FILES}" = true ]; then
+		image_path=$(image_dev_path "${image_name}")
+		rm -f "${image_path}"
+		return
+	fi
+
+	rbd rm "${image_name}"
+}
+
+function map_image() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"		# can be image at snap too
+
+	if [ "${LOCAL_FILES}" = true ]; then
+		return
+	fi
+
+	sudo rbd map "${image_name}"
+}
+
+function unmap_image() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"		# can be image at snap too
+	local image_path
+
+	if [ "${LOCAL_FILES}" = true ]; then
+		return
+	fi
+	image_path=$(image_dev_path "${image_name}")
+
+	if [ -e "${image_path}" ]; then
+		sudo rbd unmap "${image_path}"
+	fi
+}
+
+function map_image_snap() {
+	[ $# -eq 2 ] || exit 99
+	local image_name="$1"
+	local snap_name="$2"
+	local image_snap
+
+	if [ "${LOCAL_FILES}" = true ]; then
+		return
+	fi
+
+	image_snap="${image_name}@${snap_name}"
+	map_image "${image_snap}"
+}
+
+function unmap_image_snap() {
+	[ $# -eq 2 ] || exit 99
+	local image_name="$1"
+	local snap_name="$2"
+	local image_snap
+
+	if [ "${LOCAL_FILES}" = true ]; then
+		return
+	fi
+
+	image_snap="${image_name}@${snap_name}"
+	unmap_image "${image_snap}"
+}
+
+function create_image_snap() {
+	[ $# -eq 2 ] || exit 99
+	local image_name="$1"
+	local snap_name="$2"
+	local image_snap="${image_name}@${snap_name}"
+	local image_path
+	local snap_path
+
+	verbose "creating snapshot \"${snap_name}\"" \
+		"of image \"${image_name}\""
+	if [ "${LOCAL_FILES}" = true ]; then
+		image_path=$(image_dev_path "${image_name}")
+		snap_path=$(image_dev_path "${image_snap}")
+
+		cp "${image_path}" "${snap_path}"
+		return
+	fi
+
+	rbd snap create "${image_snap}"
+}
+
+function destroy_image_snap() {
+	[ $# -eq 2 ] || exit 99
+	local image_name="$1"
+	local snap_name="$2"
+	local image_snap="${image_name}@${snap_name}"
+	local snap_path
+
+	verbose "destroying snapshot \"${snap_name}\"" \
+		"of image \"${image_name}\""
+	if [ "${LOCAL_FILES}" = true ]; then
+		snap_path=$(image_dev_path "${image_snap}")
+		rm -rf "${snap_path}"
+		return
+	fi
+
+	rbd snap rm "${image_snap}"
+}
+
+function create_snap_clone() {
+	[ $# -eq 4 ] || exit 99
+	local image_name="$1"
+	local snap_name="$2"
+	local clone_name="$3"
+	local clone_order="$4"
+	local image_snap="${image_name}@${snap_name}"
+	local snap_path
+	local clone_path
+
+	verbose "creating clone image \"${clone_name}\"" \
+		"of image snapshot \"${image_name}@${snap_name}\""
+	if [ "${LOCAL_FILES}" = true ]; then
+		snap_path=$(image_dev_path "${image_name}@${snap_name}")
+		clone_path=$(image_dev_path "${clone_name}")
+
+		cp "${snap_path}" "${clone_path}"
+		return
+	fi
+
+	rbd snap protect "${image_snap}"
+	rbd clone --order "${clone_order}" --image-shared \
+		"${image_snap}" "${clone_name}"
+}
+
+function destroy_snap_clone() {
+	[ $# -eq 3 ] || exit 99
+	local image_name="$1"
+	local snap_name="$2"
+	local clone_name="$3"
+	local image_snap="${image_name}@${snap_name}"
+	local clone_path
+
+	verbose "destroying clone image \"${clone_name}\""
+	if [ "${LOCAL_FILES}" = true ]; then
+		clone_path=$(image_dev_path "${clone_name}")
+
+		rm -rf "${clone_path}"
+		return
+	fi
+
+	rbd rm "${clone_name}"
+	rbd snap unprotect "${image_snap}"
+}
+
+# function that produces "random" data with which to fill the image
+function source_data() {
+	while quiet dd if=/bin/bash skip=$(($$ % 199)) bs="${PAGE_SIZE}"; do
+		:	# Just do the dd
+	done
+}
+
+function fill_original() {
+	local image_path=$(image_dev_path "${ORIGINAL}")
+
+	verbose "filling original image"
+	# Fill 16 objects worth of "random" data
+	source_data |
+	quiet dd bs="${PAGE_SIZE}" count=$((16 * OBJECT_PAGES)) \
+		of="${image_path}"
+}
+
+function do_read() {
+	[ $# -eq 3 -o $# -eq 4 ] || exit 99
+	local image_name="$1"
+	local offset="$2"
+	local length="$3"
+	[ "${length}" -gt 0 ] || err "do_read: length must be non-zero"
+	local image_path=$(image_dev_path "${image_name}")
+	local out_data=$(out_data_dir "${image_name}")
+	local range=$(printf "%06u~%04u" "${offset}" "${length}")
+	local out_file
+
+	[ $# -eq 4 ] && offset=$((offset + 16 * OBJECT_PAGES))
+
+	verbose "reading \"${image_name}\" pages ${range}"
+
+	out_file="${out_data}/pages_${range}"
+
+	quiet dd bs="${PAGE_SIZE}" skip="${offset}" count="${length}" \
+		if="${image_path}" of="${out_file}"
+}
+
+function one_pass() {
+	[ $# -eq 1 -o $# -eq 2 ] || exit 99
+	local image_name="$1"
+	local extended
+	[ $# -eq 2 ] && extended="true"
+	local offset
+	local length
+
+	offset=0
+
+	# +-----------+-----------+---
+	# |X:X:X...X:X| : : ... : | :
+	# +-----------+-----------+---
+	length="${OBJECT_PAGES}"
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+---
+	#  : |X: : ... : | :
+	# ---+-----------+---
+	length=1
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+---
+	#  : | :X: ... : | :
+	# ---+-----------+---
+	length=1
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+---
+	#  : | : :X...X: | :
+	# ---+-----------+---
+	length=$((OBJECT_PAGES - 3))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+---
+	#  : | : : ... :X| :
+	# ---+-----------+---
+	length=1
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+---
+	#  : |X:X:X...X:X| :
+	# ---+-----------+---
+	length="${OBJECT_PAGES}"
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	offset=$((offset + 1))		# skip 1
+
+	# ---+-----------+---
+	#  : | :X:X...X:X| :
+	# ---+-----------+---
+	length=$((OBJECT_PAGES - 1))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+-----------+---
+	#  : |X:X:X...X:X|X: : ... : | :
+	# ---+-----------+-----------+---
+	length=$((OBJECT_PAGES + 1))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+-----------+---
+	#  : | :X:X...X:X|X: : ... : | :
+	# ---+-----------+-----------+---
+	length="${OBJECT_PAGES}"
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+-----------+---
+	#  : | :X:X...X:X|X:X: ... : | :
+	# ---+-----------+-----------+---
+	length=$((OBJECT_PAGES + 1))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# ---+-----------+-----------+---
+	#  : | : :X...X:X|X:X:X...X:X| :
+	# ---+-----------+-----------+---
+	length=$((2 * OBJECT_PAGES + 2))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	offset=$((offset + 1))		# skip 1
+
+	# ---+-----------+-----------+-----
+	#  : | :X:X...X:X|X:X:X...X:X|X: :
+	# ---+-----------+-----------+-----
+	length=$((2 * OBJECT_PAGES))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	offset=$((offset + length))
+
+	# --+-----------+-----------+--------
+	#  : | :X:X...X:X|X:X:X...X:X|X:X: :
+	# --+-----------+-----------+--------
+	length=2049
+	length=$((2 * OBJECT_PAGES + 1))
+	do_read "${image_name}" "${offset}" "${length}" ${extended}
+	# offset=$((offset + length))
+}
+
+function run_using() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+	local out_data=$(out_data_dir "${image_name}")
+
+	verbose "===== running using \"${image_name}\" ====="
+	mkdir -p "${out_data}"
+	one_pass "${image_name}"
+	one_pass "${image_name}" extended
+}
+
+function compare() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+	local out_data=$(out_data_dir "${image_name}")
+	local original=$(out_data_dir "${ORIGINAL}")
+
+	verbose "===== comparing \"${image_name}\" ====="
+	for i in $(ls "${original}"); do
+		verbose compare "\"${image_name}\" \"${i}\""
+		cmp "${original}/${i}" "${out_data}/${i}"
+	done
+	[ "${image_name}" = "${ORIGINAL}" ] || rm -rf "${out_data}"
+}
+
+function doit() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+
+	run_using "${image_name}"
+	compare "${image_name}"
+}
+
+########## Start
+
+parseargs "$@"
+
+trap teardown EXIT HUP INT
+setup
+
+run_using "${ORIGINAL}"
+doit "${ORIGINAL}@${SNAP1}"
+if [ "${TEST_CLONES}" = true ]; then
+	doit "${CLONE1}"
+	doit "${CLONE1}@${SNAP2}"
+	doit "${CLONE2}"
+fi
+rm -rf $(out_data_dir "${ORIGINAL}")
+
+echo "Success!"
+
+exit 0
diff --git a/qa/workunits/rbd/import_export.sh b/qa/workunits/rbd/import_export.sh
new file mode 100755
index 0000000..bbc1255
--- /dev/null
+++ b/qa/workunits/rbd/import_export.sh
@@ -0,0 +1,153 @@
+#!/bin/sh -ex
+
+# return list of object numbers populated in image
+objects () {
+   image=$1
+   prefix=$(rbd info $image | grep block_name_prefix | awk '{print $NF;}')
+
+   # strip off prefix and leading zeros from objects; sort, although
+   # it doesn't necessarily make sense as they're hex, at least it makes
+   # the list repeatable and comparable
+   objects=$(rados ls -p rbd | grep $prefix | \
+       sed -e 's/'$prefix'\.//' -e 's/^0*\([0-9a-f]\)/\1/' | sort -u)
+   echo $objects
+}
+
+# return false if either files don't compare or their ondisk
+# sizes don't compare
+
+compare_files_and_ondisk_sizes () {
+    cmp -l $1 $2 || return 1
+    origsize=$(stat $1 --format %b)
+    exportsize=$(stat $2 --format %b)
+    difference=$(($exportsize - $origsize))
+    difference=${difference#-} # absolute value
+    test $difference -ge 0 -a $difference -lt 4096
+}
+
+TMPDIR=/tmp/rbd_import_export_$$
+rm -rf $TMPDIR
+mkdir $TMPDIR
+trap "rm -rf $TMPDIR" INT TERM EXIT
+
+# cannot import a dir
+mkdir foo.$$
+rbd import foo.$$ foo.dir && exit 1 || true   # should fail
+rmdir foo.$$
+
+# create a sparse file
+dd if=/bin/sh of=${TMPDIR}/img bs=1k count=1 seek=10
+dd if=/bin/dd of=${TMPDIR}/img bs=1k count=10 seek=100
+dd if=/bin/rm of=${TMPDIR}/img bs=1k count=100 seek=1000
+dd if=/bin/ls of=${TMPDIR}/img bs=1k seek=10000
+dd if=/bin/ln of=${TMPDIR}/img bs=1k seek=100000
+dd if=/bin/grep of=${TMPDIR}/img bs=1k seek=1000000
+
+rbd rm testimg || true
+
+rbd import $RBD_CREATE_ARGS ${TMPDIR}/img testimg
+rbd export testimg ${TMPDIR}/img2
+rbd export testimg - > ${TMPDIR}/img3
+rbd rm testimg
+cmp ${TMPDIR}/img ${TMPDIR}/img2
+cmp ${TMPDIR}/img ${TMPDIR}/img3
+rm ${TMPDIR}/img2 ${TMPDIR}/img3
+
+# try again, importing from stdin
+rbd import $RBD_CREATE_ARGS - testimg < ${TMPDIR}/img
+rbd export testimg ${TMPDIR}/img2
+rbd export testimg - > ${TMPDIR}/img3
+rbd rm testimg
+cmp ${TMPDIR}/img ${TMPDIR}/img2
+cmp ${TMPDIR}/img ${TMPDIR}/img3
+
+rm ${TMPDIR}/img ${TMPDIR}/img2 ${TMPDIR}/img3
+
+
+tiered=0
+if ceph osd dump | grep ^pool | grep "'rbd'" | grep tier; then
+    tiered=1
+fi
+
+# create specifically sparse files
+# 1 1M block of sparse, 1 1M block of random
+dd if=/dev/urandom bs=1M seek=1 count=1 of=${TMPDIR}/sparse1
+
+# 1 1M block of random, 1 1M block of sparse
+dd if=/dev/urandom bs=1M count=1 of=${TMPDIR}/sparse2; truncate ${TMPDIR}/sparse2 -s 2M
+
+# 1M-block images; validate resulting blocks
+
+# 1M sparse, 1M data
+rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse1
+rbd ls -l | grep sparse1 | grep -i '2048k'
+[ $tiered -eq 1 -o "$(objects sparse1)" = '1' ]
+
+# export, compare contents and on-disk size
+rbd export sparse1 ${TMPDIR}/sparse1.out
+compare_files_and_ondisk_sizes ${TMPDIR}/sparse1 ${TMPDIR}/sparse1.out
+rm ${TMPDIR}/sparse1.out
+rbd rm sparse1
+
+# 1M data, 1M sparse
+rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse2
+rbd ls -l | grep sparse2 | grep -i '2048k'
+[ $tiered -eq 1 -o "$(objects sparse2)" = '0' ]
+rbd export sparse2 ${TMPDIR}/sparse2.out
+compare_files_and_ondisk_sizes ${TMPDIR}/sparse2 ${TMPDIR}/sparse2.out
+rm ${TMPDIR}/sparse2.out
+rbd rm sparse2
+
+# extend sparse1 to 10 1M blocks, sparse at the end
+truncate ${TMPDIR}/sparse1 -s 10M
+# import from stdin just for fun, verify still sparse
+rbd import $RBD_CREATE_ARGS --order 20 - sparse1 < ${TMPDIR}/sparse1
+rbd ls -l | grep sparse1 | grep -i '10240k'
+[ $tiered -eq 1 -o "$(objects sparse1)" = '1' ]
+rbd export sparse1 ${TMPDIR}/sparse1.out
+compare_files_and_ondisk_sizes ${TMPDIR}/sparse1 ${TMPDIR}/sparse1.out
+rm ${TMPDIR}/sparse1.out
+rbd rm sparse1
+
+# extend sparse2 to 4M total with two more nonsparse megs
+dd if=/dev/urandom bs=2M count=1 of=${TMPDIR}/sparse2 oflag=append conv=notrunc
+# again from stding
+rbd import $RBD_CREATE_ARGS --order 20 - sparse2 < ${TMPDIR}/sparse2
+rbd ls -l | grep sparse2 | grep -i '4096k'
+[ $tiered -eq 1 -o "$(objects sparse2)" = '0 2 3' ]
+rbd export sparse2 ${TMPDIR}/sparse2.out
+compare_files_and_ondisk_sizes ${TMPDIR}/sparse2 ${TMPDIR}/sparse2.out
+rm ${TMPDIR}/sparse2.out
+rbd rm sparse2
+
+# zeros import to a sparse image.  Note: all zeros currently
+# doesn't work right now due to the way we handle 'empty' fiemaps;
+# the image ends up zero-filled.
+
+echo "partially-sparse file imports to partially-sparse image"
+rbd import $RBD_CREATE_ARGS --order 20 ${TMPDIR}/sparse1 sparse
+[ $tiered -eq 1 -o "$(objects sparse)" = '1' ]
+rbd rm sparse
+
+echo "zeros import through stdin to sparse image"
+# stdin
+dd if=/dev/zero bs=1M count=4 | rbd import $RBD_CREATE_ARGS - sparse
+[ $tiered -eq 1 -o "$(objects sparse)" = '' ]
+rbd rm sparse
+
+echo "zeros export to sparse file"
+#  Must be tricky to make image "by hand" ; import won't create a zero image
+rbd create $RBD_CREATE_ARGS sparse --size 4
+prefix=$(rbd info sparse | grep block_name_prefix | awk '{print $NF;}')
+# drop in 0 object directly
+dd if=/dev/zero bs=4M count=1 | rados -p rbd put ${prefix}.000000000000 -
+[ $tiered -eq 1 -o "$(objects sparse)" = '0' ]
+# 1 object full of zeros; export should still create 0-disk-usage file
+rm ${TMPDIR}/sparse || true
+rbd export sparse ${TMPDIR}/sparse
+[ $(stat ${TMPDIR}/sparse --format=%b) = '0' ] 
+rbd rm sparse
+
+rm ${TMPDIR}/sparse ${TMPDIR}/sparse1 ${TMPDIR}/sparse2 ${TMPDIR}/sparse3 || true
+
+echo OK
diff --git a/qa/workunits/rbd/journal.sh b/qa/workunits/rbd/journal.sh
new file mode 100755
index 0000000..4d9b806
--- /dev/null
+++ b/qa/workunits/rbd/journal.sh
@@ -0,0 +1,310 @@
+#!/bin/bash -e
+
+. $(dirname $0)/../ceph-helpers.sh
+
+function list_tests()
+{
+  echo "AVAILABLE TESTS"
+  for i in $TESTS; do
+    echo "  $i"
+  done
+}
+
+function usage()
+{
+  echo "usage: $0 [-h|-l|-t <testname> [-t <testname>...] [--no-sanity-check] [--no-cleanup]]"
+}
+
+function expect_false()
+{
+    set -x
+    if "$@"; then return 1; else return 0; fi
+}
+
+function save_commit_position()
+{
+    local journal=$1
+
+    rados -p rbd getomapval journal.${journal} client_ \
+	  $TMPDIR/${journal}.client_.omap
+}
+
+function restore_commit_position()
+{
+    local journal=$1
+
+    rados -p rbd setomapval journal.${journal} client_ \
+	  < $TMPDIR/${journal}.client_.omap
+}
+
+test_rbd_journal()
+{
+    local image=testrbdjournal$$
+
+    rbd create --image-feature exclusive-lock --image-feature journaling \
+	--size 128 ${image}
+    local journal=$(rbd info ${image} --format=xml 2>/dev/null |
+			   $XMLSTARLET sel -t -v "//image/journal")
+    test -n "${journal}"
+    rbd journal info ${journal}
+    rbd journal info --journal ${journal}
+    rbd journal info --image ${image}
+
+    rbd feature disable ${image} journaling
+
+    rbd info ${image} --format=xml 2>/dev/null |
+	expect_false $XMLSTARLET sel -t -v "//image/journal"
+    expect_false rbd journal info ${journal}
+    expect_false rbd journal info --image ${image}
+
+    rbd feature enable ${image} journaling
+
+    local journal1=$(rbd info ${image} --format=xml 2>/dev/null |
+			    $XMLSTARLET sel -t -v "//image/journal")
+    test "${journal}" = "${journal1}"
+
+    rbd journal info ${journal}
+
+    rbd journal status ${journal}
+
+    local count=10
+    save_commit_position ${journal}
+    rbd bench-write ${image} --io-size 4096 --io-threads 1 \
+	--io-total $((4096 * count)) --io-pattern seq
+    rbd journal status --image ${image} | fgrep "tid=$((count - 1))"
+    restore_commit_position ${journal}
+    rbd journal status --image ${image} | fgrep "positions=[]"
+    local count1=$(rbd journal inspect --verbose ${journal} |
+			  grep -c 'event_type.*AioWrite')
+    test "${count}" -eq "${count1}"
+
+    rbd journal export ${journal} $TMPDIR/journal.export
+    local size=$(stat -c "%s" $TMPDIR/journal.export)
+    test "${size}" -gt 0
+
+    rbd export ${image} $TMPDIR/${image}.export
+
+    local image1=${image}1
+    rbd create --image-feature exclusive-lock --image-feature journaling \
+	--size 128 ${image1}
+    journal1=$(rbd info ${image1} --format=xml 2>/dev/null |
+		      $XMLSTARLET sel -t -v "//image/journal")
+
+    save_commit_position ${journal1}
+    rbd journal import --dest ${image1} $TMPDIR/journal.export
+    rbd snap create ${image1}@test
+    restore_commit_position ${journal1}
+    # check that commit position is properly updated: the journal should contain
+    # 12 entries (10 AioWrite + 1 SnapCreate + 1 OpFinish) and commit
+    # position set to tid=11
+    rbd journal inspect --image ${image1} --verbose | awk '
+      /AioWrite/          {w++}         # match: "event_type": "AioWrite",
+      /SnapCreate/        {s++}         # match: "event_type": "SnapCreate",
+      /OpFinish/          {f++}         # match: "event_type": "OpFinish",
+      /entries inspected/ {t=$1; e=$4}  # match: 12 entries inspected, 0 errors
+                          {print}       # for diagnostic
+      END                 {
+        if (w != 10 || s != 1 || f != 1 || t != 12 || e != 0) exit(1)
+      }
+    '
+
+    rbd export ${image1}@test $TMPDIR/${image1}.export
+    cmp $TMPDIR/${image}.export $TMPDIR/${image1}.export
+
+    rbd journal reset ${journal}
+
+    rbd journal inspect --verbose ${journal} | expect_false grep 'event_type'
+
+    rbd snap purge ${image1}
+    rbd remove ${image1}
+    rbd remove ${image}
+}
+
+
+rbd_assert_eq() {
+    local image=$1
+    local cmd=$2
+    local param=$3
+    local expected_val=$4
+
+    local val=$(rbd --format xml ${cmd} --image ${image} |
+		       $XMLSTARLET sel -t -v "${param}")
+    test "${val}" = "${expected_val}"
+}
+
+test_rbd_create()
+{
+    local image=testrbdcreate$$
+
+    rbd create --image-feature exclusive-lock --image-feature journaling \
+	--journal-pool rbd \
+	--journal-object-size 20M \
+	--journal-splay-width 6 \
+	--size 256 ${image}
+
+    rbd_assert_eq ${image} 'journal info' '//journal/order' 25
+    rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
+    rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
+
+    rbd remove ${image}
+}
+
+test_rbd_copy()
+{
+    local src=testrbdcopys$$
+    rbd create --size 256 ${src}
+
+    local image=testrbdcopy$$
+    rbd copy --image-feature exclusive-lock --image-feature journaling \
+	--journal-pool rbd \
+	--journal-object-size 20M \
+	--journal-splay-width 6 \
+	${src} ${image}
+
+    rbd remove ${src}
+
+    rbd_assert_eq ${image} 'journal info' '//journal/order' 25
+    rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
+    rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
+
+    rbd remove ${image}
+}
+
+test_rbd_clone()
+{
+    local parent=testrbdclonep$$
+    rbd create --image-feature layering --size 256 ${parent}
+    rbd snap create ${parent}@snap
+    rbd snap protect ${parent}@snap
+
+    local image=testrbdclone$$
+    rbd clone --image-feature layering --image-feature exclusive-lock --image-feature journaling \
+	--journal-pool rbd \
+	--journal-object-size 20M \
+	--journal-splay-width 6 \
+	${parent}@snap ${image}
+
+    rbd_assert_eq ${image} 'journal info' '//journal/order' 25
+    rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
+    rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
+
+    rbd remove ${image}
+    rbd snap unprotect ${parent}@snap
+    rbd snap purge ${parent}
+    rbd remove ${parent}
+}
+
+test_rbd_import()
+{
+    local src=testrbdimports$$
+    rbd create --size 256 ${src}
+
+    rbd export ${src} $TMPDIR/${src}.export
+    rbd remove ${src}
+
+    local image=testrbdimport$$
+    rbd import --image-feature exclusive-lock --image-feature journaling \
+	--journal-pool rbd \
+	--journal-object-size 20M \
+	--journal-splay-width 6 \
+	$TMPDIR/${src}.export ${image}
+
+    rbd_assert_eq ${image} 'journal info' '//journal/order' 25
+    rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
+    rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
+
+    rbd remove ${image}
+}
+
+test_rbd_feature()
+{
+    local image=testrbdfeature$$
+
+    rbd create --image-feature exclusive-lock --size 256 ${image}
+
+    rbd feature enable ${image} journaling \
+	--journal-pool rbd \
+	--journal-object-size 20M \
+	--journal-splay-width 6
+
+    rbd_assert_eq ${image} 'journal info' '//journal/order' 25
+    rbd_assert_eq ${image} 'journal info' '//journal/splay_width' 6
+    rbd_assert_eq ${image} 'journal info' '//journal/object_pool' rbd
+
+    rbd remove ${image}
+}
+
+TESTS+=" rbd_journal"
+TESTS+=" rbd_create"
+TESTS+=" rbd_copy"
+TESTS+=" rbd_clone"
+TESTS+=" rbd_import"
+TESTS+=" rbd_feature"
+
+#
+# "main" follows
+#
+
+tests_to_run=()
+
+sanity_check=true
+cleanup=true
+
+while [[ $# -gt 0 ]]; do
+    opt=$1
+
+    case "$opt" in
+	"-l" )
+	    do_list=1
+	    ;;
+	"--no-sanity-check" )
+	    sanity_check=false
+	    ;;
+	"--no-cleanup" )
+	    cleanup=false
+	    ;;
+	"-t" )
+	    shift
+	    if [[ -z "$1" ]]; then
+		echo "missing argument to '-t'"
+		usage ;
+		exit 1
+	    fi
+	    tests_to_run+=" $1"
+	    ;;
+	"-h" )
+	    usage ;
+	    exit 0
+	    ;;
+    esac
+    shift
+done
+
+if [[ $do_list -eq 1 ]]; then
+    list_tests ;
+    exit 0
+fi
+
+TMPDIR=/tmp/rbd_journal$$
+mkdir $TMPDIR
+if $cleanup; then
+    trap "rm -fr $TMPDIR" 0
+fi
+
+if test -z "$tests_to_run" ; then
+    tests_to_run="$TESTS"
+fi
+
+for i in $tests_to_run; do
+    if $sanity_check ; then
+	wait_for_clean
+    fi
+    set -x
+    test_${i}
+    set +x
+done
+if $sanity_check ; then
+    wait_for_clean
+fi
+
+echo OK
diff --git a/qa/workunits/rbd/kernel.sh b/qa/workunits/rbd/kernel.sh
new file mode 100755
index 0000000..5fb6b93
--- /dev/null
+++ b/qa/workunits/rbd/kernel.sh
@@ -0,0 +1,89 @@
+#!/bin/bash -ex
+
+CEPH_SECRET_FILE=${CEPH_SECRET_FILE:-}
+CEPH_ID=${CEPH_ID:-admin}
+SECRET_ARGS=''
+if [ ! -z $CEPH_SECRET_FILE ]; then
+	SECRET_ARGS="--secret $CEPH_SECRET_FILE"
+fi
+
+TMP_FILES="/tmp/img1 /tmp/img1.small /tmp/img1.snap1 /tmp/img1.export /tmp/img1.trunc"
+
+function get_device_dir {
+	local POOL=$1
+	local IMAGE=$2
+	local SNAP=$3
+	rbd showmapped | tail -n +2 | egrep "\s+$POOL\s+$IMAGE\s+$SNAP\s+" | awk '{print $1;}'
+}
+
+function clean_up {
+	[ -e /dev/rbd/rbd/testimg1 at snap1 ] &&
+		sudo rbd unmap /dev/rbd/rbd/testimg1 at snap1
+	if [ -e /dev/rbd/rbd/testimg1 ]; then
+		sudo rbd unmap /dev/rbd/rbd/testimg1
+		rbd snap purge testimg1 || true
+	fi
+	rbd ls | grep testimg1 > /dev/null && rbd rm testimg1 || true
+	sudo rm -f $TMP_FILES
+}
+
+clean_up
+
+trap clean_up INT TERM EXIT
+
+# create an image
+dd if=/bin/sh of=/tmp/img1 bs=1k count=1 seek=10
+dd if=/bin/dd of=/tmp/img1 bs=1k count=10 seek=100
+dd if=/bin/rm of=/tmp/img1 bs=1k count=100 seek=1000
+dd if=/bin/ls of=/tmp/img1 bs=1k seek=10000
+dd if=/bin/ln of=/tmp/img1 bs=1k seek=100000
+dd if=/dev/zero of=/tmp/img1 count=0 seek=150000
+
+# import
+rbd import /tmp/img1 testimg1
+sudo rbd map testimg1 --user $CEPH_ID $SECRET_ARGS
+
+DEV_ID1=$(get_device_dir rbd testimg1 -)
+echo "dev_id1 = $DEV_ID1"
+cat /sys/bus/rbd/devices/$DEV_ID1/size
+cat /sys/bus/rbd/devices/$DEV_ID1/size | grep 76800000
+
+sudo dd if=/dev/rbd/rbd/testimg1 of=/tmp/img1.export
+cmp /tmp/img1 /tmp/img1.export
+
+# snapshot
+rbd snap create testimg1 --snap=snap1
+sudo rbd map --snap=snap1 testimg1 --user $CEPH_ID $SECRET_ARGS
+
+DEV_ID2=$(get_device_dir rbd testimg1 snap1)
+cat /sys/bus/rbd/devices/$DEV_ID2/size | grep 76800000
+
+sudo dd if=/dev/rbd/rbd/testimg1 at snap1 of=/tmp/img1.snap1
+cmp /tmp/img1 /tmp/img1.snap1
+
+# resize
+rbd resize testimg1 --size=40 --allow-shrink
+cat /sys/bus/rbd/devices/$DEV_ID1/size | grep 41943040
+cat /sys/bus/rbd/devices/$DEV_ID2/size | grep 76800000
+
+sudo dd if=/dev/rbd/rbd/testimg1 of=/tmp/img1.small
+cp /tmp/img1 /tmp/img1.trunc
+truncate -s 41943040 /tmp/img1.trunc
+cmp /tmp/img1.trunc /tmp/img1.small
+
+# rollback and check data again
+rbd snap rollback --snap=snap1 testimg1
+cat /sys/bus/rbd/devices/$DEV_ID1/size | grep 76800000
+cat /sys/bus/rbd/devices/$DEV_ID2/size | grep 76800000
+sudo rm -f /tmp/img1.snap1 /tmp/img1.export
+
+sudo dd if=/dev/rbd/rbd/testimg1 at snap1 of=/tmp/img1.snap1
+cmp /tmp/img1 /tmp/img1.snap1
+sudo dd if=/dev/rbd/rbd/testimg1 of=/tmp/img1.export
+cmp /tmp/img1 /tmp/img1.export
+
+# remove snapshot and detect error from mapped snapshot
+rbd snap rm --snap=snap1 testimg1
+sudo dd if=/dev/rbd/rbd/testimg1 at snap1 of=/tmp/img1.snap1 2>&1 | grep 'Input/output error'
+
+echo OK
diff --git a/qa/workunits/rbd/map-snapshot-io.sh b/qa/workunits/rbd/map-snapshot-io.sh
new file mode 100755
index 0000000..a69d848
--- /dev/null
+++ b/qa/workunits/rbd/map-snapshot-io.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# http://tracker.ceph.com/issues/3964
+
+set -ex
+
+rbd create image -s 100
+DEV=$(sudo rbd map image)
+dd if=/dev/zero of=$DEV oflag=direct count=10
+rbd snap create image at s1
+dd if=/dev/zero of=$DEV oflag=direct count=10   # used to fail
+rbd snap rm image at s1
+dd if=/dev/zero of=$DEV oflag=direct count=10
+sudo rbd unmap $DEV
+rbd rm image
+
+echo OK
diff --git a/qa/workunits/rbd/map-unmap.sh b/qa/workunits/rbd/map-unmap.sh
new file mode 100755
index 0000000..ce7d20f
--- /dev/null
+++ b/qa/workunits/rbd/map-unmap.sh
@@ -0,0 +1,44 @@
+#!/bin/bash -ex
+
+RUN_TIME=300		# approximate duration of run (seconds)
+
+[ $# -eq 1 ] && RUN_TIME="$1"
+
+IMAGE_NAME="image-$$"
+IMAGE_SIZE="1024"	# MB
+
+function get_time() {
+	date '+%s'
+}
+
+function times_up() {
+	local end_time="$1"
+
+	test $(get_time) -ge "${end_time}"
+}
+
+function map_unmap() {
+	[ $# -eq 1 ] || exit 99
+	local image_name="$1"
+
+	local dev
+	dev="$(sudo rbd map "${image_name}")"
+	sudo rbd unmap "${dev}"
+}
+
+#### Start
+
+rbd create "${IMAGE_NAME}" --size="${IMAGE_SIZE}"
+
+COUNT=0
+START_TIME=$(get_time)
+END_TIME=$(expr $(get_time) + ${RUN_TIME})
+while ! times_up "${END_TIME}"; do
+	map_unmap "${IMAGE_NAME}"
+	COUNT=$(expr $COUNT + 1)
+done
+ELAPSED=$(expr "$(get_time)" - "${START_TIME}")
+
+rbd rm "${IMAGE_NAME}"
+
+echo "${COUNT} iterations completed in ${ELAPSED} seconds"
diff --git a/qa/workunits/rbd/merge_diff.sh b/qa/workunits/rbd/merge_diff.sh
new file mode 100755
index 0000000..0b6643d
--- /dev/null
+++ b/qa/workunits/rbd/merge_diff.sh
@@ -0,0 +1,474 @@
+#!/bin/bash -ex
+
+pool=rbd
+gen=$pool/gen
+out=$pool/out
+testno=1
+
+mkdir -p merge_diff_test
+pushd merge_diff_test
+
+function expect_false()
+{
+  if "$@"; then return 1; else return 0; fi
+}
+
+function clear_all()
+{
+  fusermount -u mnt || true
+
+  rbd snap purge --no-progress $gen || true
+  rbd rm --no-progress $gen || true
+  rbd snap purge --no-progress $out || true
+  rbd rm --no-progress $out || true
+
+  rm -rf diffs || true
+}
+
+function rebuild()
+{
+  clear_all
+  echo Starting test $testno
+  ((testno++))
+  if [[ "$2" -lt "$1" ]] && [[ "$3" -gt "1" ]]; then
+    rbd create $gen --size 100 --object-size $1 --stripe-unit $2 --stripe-count $3 --image-format $4
+  else
+    rbd create $gen --size 100 --object-size $1 --image-format $4
+  fi
+  rbd create $out --size 1 --object-size 524288
+  mkdir -p mnt diffs
+  # lttng has atexit handlers that need to be fork/clone aware
+  LD_PRELOAD=liblttng-ust-fork.so.0 rbd-fuse -p $pool mnt
+}
+
+function write()
+{
+  dd if=/dev/urandom of=mnt/gen bs=1M conv=notrunc seek=$1 count=$2
+}
+
+function snap()
+{
+  rbd snap create $gen@$1
+}
+
+function resize()
+{
+  rbd resize --no-progress $gen --size $1 --allow-shrink
+}
+
+function export_diff()
+{
+  if [ $2 == "head" ]; then
+    target="$gen"
+  else
+    target="$gen@$2"
+  fi
+  if [ $1 == "null" ]; then
+    rbd export-diff --no-progress $target diffs/$1.$2
+  else
+    rbd export-diff --no-progress $target --from-snap $1 diffs/$1.$2
+  fi
+}
+
+function merge_diff()
+{
+  rbd merge-diff diffs/$1.$2 diffs/$2.$3 diffs/$1.$3
+}
+
+function check()
+{
+  rbd import-diff --no-progress diffs/$1.$2 $out || return -1
+  if [ "$2" == "head" ]; then
+    sum1=`rbd export $gen - | md5sum`
+  else
+    sum1=`rbd export $gen@$2 - | md5sum`
+  fi
+  sum2=`rbd export $out - | md5sum`
+  if [ "$sum1" != "$sum2" ]; then
+    exit -1
+  fi
+  if [ "$2" != "head" ]; then
+    rbd snap ls $out | awk '{print $2}' | grep "^$2\$" || return -1
+  fi
+}
+
+#test f/t header
+rebuild 4194304 4194304 1 2
+write 0 1
+snap a
+write 1 1
+export_diff null a
+export_diff a head
+merge_diff null a head
+check null head
+
+rebuild 4194304 4194304 1 2
+write 0 1
+snap a
+write 1 1
+snap b
+write 2 1
+export_diff null a
+export_diff a b
+export_diff b head
+merge_diff null a b
+check null b
+
+rebuild 4194304 4194304 1 2
+write 0 1
+snap a
+write 1 1
+snap b
+write 2 1
+export_diff null a
+export_diff a b
+export_diff b head
+merge_diff a b head
+check null a
+check a head
+
+rebuild 4194304 4194304 1 2
+write 0 1
+snap a
+write 1 1
+snap b
+write 2 1
+export_diff null a
+export_diff a b
+export_diff b head
+rbd merge-diff diffs/null.a diffs/a.b - | rbd merge-diff - diffs/b.head - > diffs/null.head
+check null head
+
+#data test
+rebuild 4194304 4194304 1 2
+write 4 2
+snap s101
+write 0 3
+write 8 2
+snap s102
+export_diff null s101
+export_diff s101 s102
+merge_diff null s101 s102
+check null s102
+
+rebuild 4194304 4194304 1 2
+write 0 3
+write 2 5
+write 8 2
+snap s201
+write 0 2
+write 6 3
+snap s202
+export_diff null s201
+export_diff s201 s202
+merge_diff null s201 s202
+check null s202
+
+rebuild 4194304 4194304 1 2
+write 0 4
+write 12 6
+snap s301
+write 0 6
+write 10 5
+write 16 4
+snap s302
+export_diff null s301
+export_diff s301 s302
+merge_diff null s301 s302
+check null s302
+
+rebuild 4194304 4194304 1 2
+write 0 12
+write 14 2
+write 18 2
+snap s401
+write 1 2
+write 5 6
+write 13 3
+write 18 2
+snap s402
+export_diff null s401
+export_diff s401 s402
+merge_diff null s401 s402
+check null s402
+
+rebuild 4194304 4194304 1 2
+write 2 4
+write 10 12
+write 27 6
+write 36 4
+snap s501
+write 0 24
+write 28 4
+write 36 4
+snap s502
+export_diff null s501
+export_diff s501 s502
+merge_diff null s501 s502
+check null s502
+
+rebuild 4194304 4194304 1 2
+write 0 8
+resize 5
+snap r1
+resize 20
+write 12 8
+snap r2
+resize 8
+write 4 4
+snap r3
+export_diff null r1
+export_diff r1 r2
+export_diff r2 r3
+merge_diff null r1 r2
+merge_diff null r2 r3
+check null r3
+
+rebuild 4194304 4194304 1 2
+write 0 8
+resize 5
+snap r1
+resize 20
+write 12 8
+snap r2
+resize 8
+write 4 4
+snap r3
+resize 10
+snap r4
+export_diff null r1
+export_diff r1 r2
+export_diff r2 r3
+export_diff r3 r4
+merge_diff null r1 r2
+merge_diff null r2 r3
+merge_diff null r3 r4
+check null r4
+
+# merge diff doesn't yet support fancy striping
+# rebuild 4194304 65536 8 2
+# write 0 32
+# snap r1
+# write 16 32
+# snap r2
+# export_diff null r1
+# export_diff r1 r2
+# expect_false merge_diff null r1 r2
+
+rebuild 4194304 4194304 1 2
+write 0 1
+write 2 1
+write 4 1
+write 6 1
+snap s1
+write 1 1
+write 3 1
+write 5 1
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 1 1
+write 3 1
+write 5 1
+snap s1
+write 0 1
+write 2 1
+write 4 1
+write 6 1
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 3
+write 6 3
+write 12 3
+snap s1
+write 1 1
+write 7 1
+write 13 1
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 3
+write 6 3
+write 12 3
+snap s1
+write 0 1
+write 6 1
+write 12 1
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 3
+write 6 3
+write 12 3
+snap s1
+write 2 1
+write 8 1
+write 14 1
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 1 1
+write 7 1
+write 13 1
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 1
+write 6 1
+write 12 1
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 2 1
+write 8 1
+write 14 1
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 3
+write 6 3
+write 12 3
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 2 4
+write 8 4
+write 14 4
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 4
+write 6 4
+write 12 4
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 6
+write 6 6
+write 12 6
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 3 6
+write 9 6
+write 15 6
+snap s1
+write 0 3
+write 6 3
+write 12 3
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 8
+snap s1
+resize 2
+resize 100
+snap s2
+export_diff null s1
+export_diff s1 s2
+merge_diff null s1 s2
+check null s2
+
+rebuild 4194304 4194304 1 2
+write 0 8
+snap s1
+resize 2
+resize 100
+snap s2
+write 20 2
+snap s3
+export_diff null s1
+export_diff s1 s2
+export_diff s2 s3
+merge_diff s1 s2 s3
+check null s1
+check s1 s3
+
+#addme
+
+clear_all
+popd
+rm -rf merge_diff_test
+
+echo OK
diff --git a/qa/workunits/rbd/notify_master.sh b/qa/workunits/rbd/notify_master.sh
new file mode 100755
index 0000000..3d1b224
--- /dev/null
+++ b/qa/workunits/rbd/notify_master.sh
@@ -0,0 +1,7 @@
+#!/bin/sh -ex
+
+CEPH_REF=${CEPH_REF:-master}
+wget -O test_notify.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=src/test/librbd/test_notify.py"
+
+python test_notify.py master
+exit 0
diff --git a/qa/workunits/rbd/notify_slave.sh b/qa/workunits/rbd/notify_slave.sh
new file mode 100755
index 0000000..e94894a
--- /dev/null
+++ b/qa/workunits/rbd/notify_slave.sh
@@ -0,0 +1,7 @@
+#!/bin/sh -ex
+
+CEPH_REF=${CEPH_REF:-master}
+wget -O test_notify.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=src/test/librbd/test_notify.py"
+
+python test_notify.py slave
+exit 0
diff --git a/qa/workunits/rbd/permissions.sh b/qa/workunits/rbd/permissions.sh
new file mode 100755
index 0000000..643b974
--- /dev/null
+++ b/qa/workunits/rbd/permissions.sh
@@ -0,0 +1,146 @@
+#!/bin/bash -ex
+
+IMAGE_FEATURES="layering,exclusive-lock,object-map,fast-diff"
+
+create_pools() {
+    ceph osd pool create images 100
+    ceph osd pool create volumes 100
+}
+
+delete_pools() {
+    (ceph osd pool delete images images --yes-i-really-really-mean-it || true) >/dev/null 2>&1
+    (ceph osd pool delete volumes volumes --yes-i-really-really-mean-it || true) >/dev/null 2>&1
+
+}
+
+recreate_pools() {
+    delete_pools
+    create_pools
+}
+
+delete_users() {
+    (ceph auth del client.volumes || true) >/dev/null 2>&1
+    (ceph auth del client.images || true) >/dev/null 2>&1
+}
+
+create_users() {
+    ceph auth get-or-create client.volumes mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow r class-read pool images, allow rwx pool volumes' >> $KEYRING
+    ceph auth get-or-create client.images mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool images' >> $KEYRING
+}
+
+expect() {
+
+  set +e
+
+  local expected_ret=$1
+  local ret
+
+  shift
+  cmd=$@
+
+  eval $cmd
+  ret=$?
+
+  set -e
+
+  if [[ $ret -ne $expected_ret ]]; then
+    echo "ERROR: running \'$cmd\': expected $expected_ret got $ret"
+    return 1
+  fi
+
+  return 0
+}
+
+test_images_access() {
+    rbd -k $KEYRING --id images create --image-format 2 --image-feature $IMAGE_FEATURES -s 1 images/foo
+    rbd -k $KEYRING --id images snap create images/foo at snap
+    rbd -k $KEYRING --id images snap protect images/foo at snap
+    rbd -k $KEYRING --id images snap unprotect images/foo at snap
+    rbd -k $KEYRING --id images snap protect images/foo at snap
+    rbd -k $KEYRING --id images export images/foo at snap - >/dev/null
+    expect 16 rbd -k $KEYRING --id images snap rm images/foo at snap
+
+    rbd -k $KEYRING --id volumes clone --image-feature $IMAGE_FEATURES images/foo at snap volumes/child
+    expect 16 rbd -k $KEYRING --id images snap unprotect images/foo at snap
+    expect 1 rbd -k $KEYRING --id volumes snap unprotect images/foo at snap
+    expect 1 rbd -k $KEYRING --id images flatten volumes/child
+    rbd -k $KEYRING --id volumes flatten volumes/child
+    expect 1 rbd -k $KEYRING --id volumes snap unprotect images/foo at snap
+    rbd -k $KEYRING --id images snap unprotect images/foo at snap
+
+    expect 39 rbd -k $KEYRING --id images rm images/foo
+    rbd -k $KEYRING --id images snap rm images/foo at snap
+    rbd -k $KEYRING --id images rm images/foo
+    rbd -k $KEYRING --id volumes rm volumes/child
+}
+
+test_volumes_access() {
+    rbd -k $KEYRING --id images create --image-format 2 --image-feature $IMAGE_FEATURES -s 1 images/foo
+    rbd -k $KEYRING --id images snap create images/foo at snap
+    rbd -k $KEYRING --id images snap protect images/foo at snap
+
+    # commands that work with read-only access
+    rbd -k $KEYRING --id volumes info images/foo at snap
+    rbd -k $KEYRING --id volumes snap ls images/foo
+    rbd -k $KEYRING --id volumes export images/foo - >/dev/null
+    rbd -k $KEYRING --id volumes cp images/foo volumes/foo_copy
+    rbd -k $KEYRING --id volumes rm volumes/foo_copy
+    rbd -k $KEYRING --id volumes children images/foo at snap
+    rbd -k $KEYRING --id volumes lock list images/foo
+
+    # commands that fail with read-only access
+    expect 1 rbd -k $KEYRING --id volumes resize -s 2 images/foo --allow-shrink
+    expect 1 rbd -k $KEYRING --id volumes snap create images/foo at 2
+    expect 1 rbd -k $KEYRING --id volumes snap rollback images/foo at snap
+    expect 1 rbd -k $KEYRING --id volumes snap remove images/foo at snap
+    expect 1 rbd -k $KEYRING --id volumes snap purge images/foo
+    expect 1 rbd -k $KEYRING --id volumes snap unprotect images/foo at snap
+    expect 1 rbd -k $KEYRING --id volumes flatten images/foo
+    expect 1 rbd -k $KEYRING --id volumes lock add images/foo test
+    expect 1 rbd -k $KEYRING --id volumes lock remove images/foo test locker
+    expect 1 rbd -k $KEYRING --id volumes ls rbd
+
+    # create clone and snapshot
+    rbd -k $KEYRING --id volumes clone --image-feature $IMAGE_FEATURES images/foo at snap volumes/child
+    rbd -k $KEYRING --id volumes snap create volumes/child at snap1
+    rbd -k $KEYRING --id volumes snap protect volumes/child at snap1
+    rbd -k $KEYRING --id volumes snap create volumes/child at snap2
+
+    # make sure original snapshot stays protected
+    expect 16 rbd -k $KEYRING --id images snap unprotect images/foo at snap
+    rbd -k $KEYRING --id volumes flatten volumes/child
+    expect 16 rbd -k $KEYRING --id images snap unprotect images/foo at snap
+    rbd -k $KEYRING --id volumes snap rm volumes/child at snap2
+    expect 16 rbd -k $KEYRING --id images snap unprotect images/foo at snap
+    expect 2 rbd -k $KEYRING --id volumes snap rm volumes/child at snap2
+    rbd -k $KEYRING --id volumes snap unprotect volumes/child at snap1
+    expect 16 rbd -k $KEYRING --id images snap unprotect images/foo at snap
+
+    # clean up
+    rbd -k $KEYRING --id volumes snap rm volumes/child at snap1
+    rbd -k $KEYRING --id images snap unprotect images/foo at snap
+    rbd -k $KEYRING --id images snap rm images/foo at snap
+    rbd -k $KEYRING --id images rm images/foo
+    rbd -k $KEYRING --id volumes rm volumes/child
+}
+
+cleanup() {
+    rm -f $KEYRING
+}
+KEYRING=$(mktemp)
+trap cleanup EXIT ERR HUP INT QUIT
+
+delete_users
+create_users
+
+recreate_pools
+test_images_access
+
+recreate_pools
+test_volumes_access
+
+delete_pools
+delete_users
+
+echo OK
+exit 0
diff --git a/qa/workunits/rbd/qemu-iotests.sh b/qa/workunits/rbd/qemu-iotests.sh
new file mode 100755
index 0000000..3d72394
--- /dev/null
+++ b/qa/workunits/rbd/qemu-iotests.sh
@@ -0,0 +1,42 @@
+#!/bin/sh -ex
+
+# Run qemu-iotests against rbd. These are block-level tests that go
+# through qemu but do not involve running a full vm. Note that these
+# require the admin ceph user, as there's no way to pass the ceph user
+# to qemu-iotests currently.
+
+# This will only work with particular qemu versions, like 1.0. Later
+# versions of qemu include qemu-iotests directly in the qemu
+# repository.
+testlist='001 002 003 004 005 008 009 010 011 021 025 032 033 055 077'
+
+git clone https://github.com/qemu/qemu.git
+# use v2.2.0-rc3 (last released version that handles all the tests
+cd qemu
+git checkout 2528043f1f299e0e88cb026f1ca7c40bbb4e1f80
+
+cd tests/qemu-iotests
+mkdir bin
+# qemu-iotests expects a binary called just 'qemu' to be available
+if [ -x '/usr/bin/qemu-system-x86_64' ]
+then
+    QEMU='/usr/bin/qemu-system-x86_64'
+else
+    QEMU='/usr/libexec/qemu-kvm'
+
+    # disable test 055 since qemu-kvm (RHEL/CentOS) doesn't support the
+    # required QMP commands
+    testlist=$(echo ${testlist} | sed "s/ 055//g")
+fi
+ln -s $QEMU bin/qemu
+
+# this is normally generated by configure, but has nothing but a python
+# binary definition, which we don't care about.  for some reason it is
+# not present on trusty.
+touch common.env
+
+# TEST_DIR is the pool for rbd
+TEST_DIR=rbd PATH="$PATH:$PWD/bin" ./check -rbd $testlist
+
+cd ../../..
+rm -rf qemu
diff --git a/qa/workunits/rbd/qemu_dynamic_features.sh b/qa/workunits/rbd/qemu_dynamic_features.sh
new file mode 100755
index 0000000..f237f66
--- /dev/null
+++ b/qa/workunits/rbd/qemu_dynamic_features.sh
@@ -0,0 +1,48 @@
+#!/bin/bash -x
+
+if [[ -z "${IMAGE_NAME}" ]]; then
+  echo image name must be provided
+  exit 1
+fi
+
+is_qemu_running() {
+  rbd status ${IMAGE_NAME} | grep -v "Watchers: none"
+}
+
+wait_for_qemu() {
+  while ! is_qemu_running ; do
+    echo "*** Waiting for QEMU"
+    sleep 30
+  done
+}
+
+wait_for_qemu
+rbd feature disable ${IMAGE_NAME} journaling
+rbd feature disable ${IMAGE_NAME} fast-diff
+rbd feature disable ${IMAGE_NAME} object-map
+rbd feature disable ${IMAGE_NAME} exclusive-lock
+
+while is_qemu_running ; do
+  echo "*** Enabling all features"
+  rbd feature enable ${IMAGE_NAME} exclusive-lock || break
+  rbd feature enable ${IMAGE_NAME} journaling || break
+  rbd feature enable ${IMAGE_NAME} object-map || break
+  rbd feature enable ${IMAGE_NAME} fast-diff || break
+  if is_qemu_running ; then
+    sleep 60
+  fi
+
+  echo "*** Disabling all features"
+  rbd feature disable ${IMAGE_NAME} journaling || break
+  rbd feature disable ${IMAGE_NAME} fast-diff || break
+  rbd feature disable ${IMAGE_NAME} object-map || break
+  rbd feature disable ${IMAGE_NAME} exclusive-lock || break
+  if is_qemu_running ; then
+    sleep 60
+  fi
+done
+
+if is_qemu_running ; then
+    echo "RBD command failed on alive QEMU"
+    exit 1
+fi
diff --git a/qa/workunits/rbd/qemu_rebuild_object_map.sh b/qa/workunits/rbd/qemu_rebuild_object_map.sh
new file mode 100755
index 0000000..c064ee9
--- /dev/null
+++ b/qa/workunits/rbd/qemu_rebuild_object_map.sh
@@ -0,0 +1,36 @@
+#!/bin/bash -ex
+
+if [[ -z "${IMAGE_NAME}" ]]; then
+  echo image name must be provided
+  exit 1
+fi
+
+is_qemu_running() {
+  rbd status ${IMAGE_NAME} | grep -v "Watchers: none"
+}
+
+wait_for_qemu() {
+  while ! is_qemu_running ; do
+    echo "*** Waiting for QEMU"
+    sleep 30
+  done
+}
+
+wait_for_qemu
+rbd feature disable ${IMAGE_NAME} journaling || true
+rbd feature disable ${IMAGE_NAME} fast-diff || true
+rbd feature disable ${IMAGE_NAME} object-map || true
+rbd feature disable ${IMAGE_NAME} exclusive-lock || true
+
+rbd feature enable ${IMAGE_NAME} exclusive-lock
+rbd feature enable ${IMAGE_NAME} object-map
+
+while is_qemu_running ; do
+  echo "*** Rebuilding object map"
+  rbd object-map rebuild ${IMAGE_NAME}
+
+  if is_qemu_running ; then
+    sleep 60
+  fi
+done
+
diff --git a/qa/workunits/rbd/rbd-nbd.sh b/qa/workunits/rbd/rbd-nbd.sh
new file mode 100755
index 0000000..1e08ade
--- /dev/null
+++ b/qa/workunits/rbd/rbd-nbd.sh
@@ -0,0 +1,115 @@
+#!/bin/bash -ex
+
+. $(dirname $0)/../ceph-helpers.sh
+
+POOL=rbd
+IMAGE=testrbdnbd$$
+SUDO=sudo
+SIZE=64
+DATA=
+DEV=
+
+setup()
+{
+    trap cleanup INT TERM EXIT
+    TEMPDIR=`mktemp -d`
+    DATA=${TEMPDIR}/data
+    dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
+    rbd --dest-pool ${POOL} --no-progress import ${DATA} ${IMAGE}
+
+    if [ `id -u` = 0 ]
+    then
+	SUDO=
+    fi
+}
+
+function cleanup()
+{
+    set +e
+    rm -Rf ${TMPDIR}
+    if [ -n "${DEV}" ]
+    then
+	${SUDO} rbd-nbd unmap ${DEV}
+    fi
+    if rbd -p ${POOL} status ${IMAGE} 2>/dev/null; then
+	for s in 0.1 0.2 0.4 0.8 1.6 3.2 6.4 12.8; do
+	    sleep $s
+	    rbd -p ${POOL} status ${IMAGE} | grep 'Watchers: none' && break
+	done
+	rbd -p ${POOL} remove ${IMAGE}
+    fi
+}
+
+function expect_false()
+{
+  if "$@"; then return 1; else return 0; fi
+}
+
+#
+# main
+#
+
+setup
+
+# exit status test
+expect_false rbd-nbd
+expect_false rbd-nbd INVALIDCMD
+if [ `id -u` -ne 0 ]
+then
+    expect_false rbd-nbd map ${IMAGE}
+fi
+expect_false ${SUDO} rbd-nbd map INVALIDIMAGE
+expect_false ${SUDO} rbd-nbd --device INVALIDDEV map ${IMAGE}
+
+# map test using the first unused device
+DEV=`${SUDO} rbd-nbd map ${POOL}/${IMAGE}`
+${SUDO} rbd-nbd list-mapped | grep "^${DEV}$"
+
+# map test specifying the device
+expect_false ${SUDO} rbd-nbd --device ${DEV} map ${POOL}/${IMAGE}
+dev1=${DEV}
+${SUDO} rbd-nbd unmap ${DEV}
+${SUDO} rbd-nbd list-mapped | expect_false grep "^${DEV}$"
+DEV=
+# XXX: race possible when the device is reused by other process
+DEV=`${SUDO} rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
+[ "${DEV}" = "${dev1}" ]
+${SUDO} rbd-nbd list-mapped | grep "^${DEV}$"
+
+# read test
+[ "`dd if=${DATA} bs=1M | md5sum`" = "`${SUDO} dd if=${DEV} bs=1M | md5sum`" ]
+
+# write test
+dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
+${SUDO} dd if=${DATA} of=${DEV} bs=1M oflag=direct
+[ "`dd if=${DATA} bs=1M | md5sum`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5sum`" ]
+
+# trim test
+provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
+  $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
+used=`rbd -p ${POOL} --format xml du ${IMAGE} |
+  $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
+[ "${used}" -eq "${provisioned}" ]
+${SUDO} mkfs.ext4 -E discard ${DEV} # better idea?
+sync
+provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
+  $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
+used=`rbd -p ${POOL} --format xml du ${IMAGE} |
+  $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
+[ "${used}" -lt "${provisioned}" ]
+
+# resize test
+devname=$(basename ${DEV})
+blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
+test -n "${blocks}"
+rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
+rbd info ${POOL}/${IMAGE}
+blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
+test -n "${blocks2}"
+test ${blocks2} -eq $((blocks * 2))
+rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
+blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
+test -n "${blocks2}"
+test ${blocks2} -eq ${blocks}
+
+echo OK
diff --git a/qa/workunits/rbd/rbd_mirror.sh b/qa/workunits/rbd/rbd_mirror.sh
new file mode 100755
index 0000000..fcfae98
--- /dev/null
+++ b/qa/workunits/rbd/rbd_mirror.sh
@@ -0,0 +1,333 @@
+#!/bin/sh
+#
+# rbd_mirror.sh - test rbd-mirror daemon
+#
+# The scripts starts two ("local" and "remote") clusters using mstart.sh script,
+# creates a temporary directory, used for cluster configs, daemon logs, admin
+# socket, temporary files, and launches rbd-mirror daemon.
+#
+
+if [ -n "${CEPH_REF}" ]; then
+  wget -O rbd_mirror_helpers.sh "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=qa/workunits/rbd/rbd_mirror_helpers.sh"
+  . ./rbd_mirror_helpers.sh
+else
+  . $(dirname $0)/rbd_mirror_helpers.sh
+fi
+
+testlog "TEST: add image and test replay"
+start_mirror ${CLUSTER1}
+image=test
+create_image ${CLUSTER2} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+write_image ${CLUSTER2} ${POOL} ${image} 100
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+if [ -z "${RBD_MIRROR_USE_RBD_MIRROR}" ]; then
+  wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'down+unknown'
+fi
+compare_images ${POOL} ${image}
+
+testlog "TEST: stop mirror, add image, start mirror and test replay"
+stop_mirror ${CLUSTER1}
+image1=test1
+create_image ${CLUSTER2} ${POOL} ${image1}
+write_image ${CLUSTER2} ${POOL} ${image1} 100
+start_mirror ${CLUSTER1}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image1}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image1}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image1} 'up+replaying' 'master_position'
+if [ -z "${RBD_MIRROR_USE_RBD_MIRROR}" ]; then
+  wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image1} 'down+unknown'
+fi
+compare_images ${POOL} ${image1}
+
+testlog "TEST: test the first image is replaying after restart"
+write_image ${CLUSTER2} ${POOL} ${image} 100
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${image}
+
+testlog "TEST: stop/start/restart mirror via admin socket"
+admin_daemon ${CLUSTER1} rbd mirror stop
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror start
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror restart
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror stop
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror restart
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror stop ${POOL} ${CLUSTER2}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror start ${POOL}/${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+
+admin_daemon ${CLUSTER1} rbd mirror start
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror start ${POOL} ${CLUSTER2}
+
+admin_daemon ${CLUSTER1} rbd mirror restart ${POOL}/${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+
+admin_daemon ${CLUSTER1} rbd mirror restart ${POOL} ${CLUSTER2}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image1}
+
+admin_daemon ${CLUSTER1} rbd mirror flush
+admin_daemon ${CLUSTER1} rbd mirror status
+
+testlog "TEST: failover and failback"
+start_mirror ${CLUSTER2}
+
+# demote and promote same cluster
+demote_image ${CLUSTER2} ${POOL} ${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+stopped'
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'up+stopped'
+promote_image ${CLUSTER2} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+write_image ${CLUSTER2} ${POOL} ${image} 100
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'up+stopped'
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${image}
+
+# failover
+demote_image ${CLUSTER2} ${POOL} ${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+stopped'
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'up+stopped'
+promote_image ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER2} ${POOL} ${image}
+write_image ${CLUSTER1} ${POOL} ${image} 100
+wait_for_replay_complete ${CLUSTER2} ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+stopped'
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${image}
+
+# failback
+demote_image ${CLUSTER1} ${POOL} ${image}
+wait_for_image_replay_stopped ${CLUSTER2} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'up+stopped'
+promote_image ${CLUSTER2} ${POOL} ${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+write_image ${CLUSTER2} ${POOL} ${image} 100
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${image} 'up+stopped'
+compare_images ${POOL} ${image}
+
+# force promote
+force_promote_image=test_force_promote
+create_image ${CLUSTER2} ${POOL} ${force_promote_image}
+write_image ${CLUSTER2} ${POOL} ${force_promote_image} 100
+wait_for_image_replay_stopped ${CLUSTER2} ${POOL} ${force_promote_image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${force_promote_image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${force_promote_image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${force_promote_image} 'up+replaying' 'master_position'
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${force_promote_image} 'up+stopped'
+promote_image ${CLUSTER1} ${POOL} ${force_promote_image} '--force'
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${force_promote_image}
+wait_for_image_replay_stopped ${CLUSTER2} ${POOL} ${force_promote_image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${force_promote_image} 'up+stopped'
+wait_for_status_in_pool_dir ${CLUSTER2} ${POOL} ${force_promote_image} 'up+stopped'
+write_image ${CLUSTER1} ${POOL} ${force_promote_image} 100
+write_image ${CLUSTER2} ${POOL} ${force_promote_image} 100
+
+testlog "TEST: cloned images"
+parent_image=test_parent
+parent_snap=snap
+create_image ${CLUSTER2} ${PARENT_POOL} ${parent_image}
+write_image ${CLUSTER2} ${PARENT_POOL} ${parent_image} 100
+create_snapshot ${CLUSTER2} ${PARENT_POOL} ${parent_image} ${parent_snap}
+protect_snapshot ${CLUSTER2} ${PARENT_POOL} ${parent_image} ${parent_snap}
+
+clone_image=test_clone
+clone_image ${CLUSTER2} ${PARENT_POOL} ${parent_image} ${parent_snap} ${POOL} ${clone_image}
+write_image ${CLUSTER2} ${POOL} ${clone_image} 100
+
+enable_mirror ${CLUSTER2} ${PARENT_POOL} ${parent_image}
+wait_for_image_replay_started ${CLUSTER1} ${PARENT_POOL} ${parent_image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${PARENT_POOL} ${parent_image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${PARENT_POOL} ${parent_image} 'up+replaying' 'master_position'
+compare_images ${PARENT_POOL} ${parent_image}
+
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${clone_image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${clone_image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${clone_image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${clone_image}
+
+expect_failure "is non-primary" clone_image ${CLUSTER1} ${PARENT_POOL} \
+    ${parent_image} ${parent_snap} ${POOL} ${clone_image}1
+
+testlog "TEST: disable mirroring / delete non-primary image"
+image2=test2
+image3=test3
+image4=test4
+image5=test5
+for i in ${image2} ${image3} ${image4} ${image5}; do
+  create_image ${CLUSTER2} ${POOL} ${i}
+  write_image ${CLUSTER2} ${POOL} ${i} 100
+  create_snapshot ${CLUSTER2} ${POOL} ${i} 'snap1'
+  create_snapshot ${CLUSTER2} ${POOL} ${i} 'snap2'
+  if [ "${i}" = "${image4}" ] || [ "${i}" = "${image5}" ]; then
+    protect_snapshot ${CLUSTER2} ${POOL} ${i} 'snap1'
+    protect_snapshot ${CLUSTER2} ${POOL} ${i} 'snap2'
+  fi
+  write_image ${CLUSTER2} ${POOL} ${i} 100
+  wait_for_image_present ${CLUSTER1} ${POOL} ${i} 'present'
+  wait_for_snap_present ${CLUSTER1} ${POOL} ${i} 'snap2'
+done
+
+set_pool_mirror_mode ${CLUSTER2} ${POOL} 'image'
+for i in ${image2} ${image4}; do
+  disable_mirror ${CLUSTER2} ${POOL} ${i}
+done
+
+unprotect_snapshot ${CLUSTER2} ${POOL} ${image5} 'snap1'
+unprotect_snapshot ${CLUSTER2} ${POOL} ${image5} 'snap2'
+for i in ${image3} ${image5}; do
+  remove_snapshot ${CLUSTER2} ${POOL} ${i} 'snap1'
+  remove_snapshot ${CLUSTER2} ${POOL} ${i} 'snap2'
+  # workaround #16555: before removing make sure it is not still bootstrapped
+  wait_for_image_replay_started ${CLUSTER1} ${POOL} ${i}
+  remove_image_retry ${CLUSTER2} ${POOL} ${i}
+done
+
+for i in ${image2} ${image3} ${image4} ${image5}; do
+  wait_for_image_present ${CLUSTER1} ${POOL} ${i} 'deleted'
+done
+
+set_pool_mirror_mode ${CLUSTER2} ${POOL} 'pool'
+for i in ${image2} ${image4}; do
+  wait_for_image_present ${CLUSTER1} ${POOL} ${i} 'present'
+  wait_for_snap_present ${CLUSTER1} ${POOL} ${i} 'snap2'
+  wait_for_image_replay_started ${CLUSTER1} ${POOL} ${i}
+  wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${i}
+  compare_images ${POOL} ${i}
+done
+
+testlog "TEST: snapshot rename"
+snap_name='snap_rename'
+create_snapshot ${CLUSTER2} ${POOL} ${image2} "${snap_name}_0"
+for i in `seq 1 20`; do
+  rename_snapshot ${CLUSTER2} ${POOL} ${image2} "${snap_name}_$(expr ${i} - 1)" "${snap_name}_${i}"
+done
+wait_for_snap_present ${CLUSTER1} ${POOL} ${image2} "${snap_name}_${i}"
+
+testlog "TEST: disable mirror while daemon is stopped"
+stop_mirror ${CLUSTER1}
+stop_mirror ${CLUSTER2}
+set_pool_mirror_mode ${CLUSTER2} ${POOL} 'image'
+disable_mirror ${CLUSTER2} ${POOL} ${image}
+test_image_present ${CLUSTER1} ${POOL} ${image} 'present'
+start_mirror ${CLUSTER1}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+set_pool_mirror_mode ${CLUSTER2} ${POOL} 'pool'
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'present'
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+
+testlog "TEST: simple image resync"
+request_resync_image ${CLUSTER1} ${POOL} ${image}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${image}
+
+testlog "TEST: image resync while replayer is stopped"
+admin_daemon ${CLUSTER1} rbd mirror stop ${POOL}/${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+request_resync_image ${CLUSTER1} ${POOL} ${image}
+admin_daemon ${CLUSTER1} rbd mirror start ${POOL}/${image}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+admin_daemon ${CLUSTER1} rbd mirror start ${POOL}/${image}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${image}
+
+testlog "TEST: request image resync while daemon is offline"
+stop_mirror ${CLUSTER1}
+request_resync_image ${CLUSTER1} ${POOL} ${image}
+start_mirror ${CLUSTER1}
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+compare_images ${POOL} ${image}
+
+testlog "TEST: client disconnect"
+image=laggy
+create_image ${CLUSTER2} ${POOL} ${image} 128 --journal-object-size 64K
+write_image ${CLUSTER2} ${POOL} ${image} 10
+
+testlog " - replay stopped after disconnect"
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+test -n "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+disconnect_image ${CLUSTER2} ${POOL} ${image}
+test -z "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+error' 'disconnected'
+
+testlog " - replay started after resync requested"
+request_resync_image ${CLUSTER1} ${POOL} ${image}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+test -n "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+compare_images ${POOL} ${image}
+
+testlog " - disconnected after max_concurrent_object_sets reached"
+admin_daemon ${CLUSTER1} rbd mirror stop ${POOL}/${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+test -n "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+set_image_meta ${CLUSTER2} ${POOL} ${image} \
+	       conf_rbd_journal_max_concurrent_object_sets 1
+write_image ${CLUSTER2} ${POOL} ${image} 20 16384
+write_image ${CLUSTER2} ${POOL} ${image} 20 16384
+test -z "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+set_image_meta ${CLUSTER2} ${POOL} ${image} \
+	       conf_rbd_journal_max_concurrent_object_sets 0
+
+testlog " - replay is still stopped (disconnected) after restart"
+admin_daemon ${CLUSTER1} rbd mirror start ${POOL}/${image}
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+error' 'disconnected'
+
+testlog " - replay started after resync requested"
+request_resync_image ${CLUSTER1} ${POOL} ${image}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+test -n "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+compare_images ${POOL} ${image}
+
+testlog " - rbd_mirroring_resync_after_disconnect config option"
+set_image_meta ${CLUSTER1} ${POOL} ${image} \
+	       conf_rbd_mirroring_resync_after_disconnect true
+disconnect_image ${CLUSTER2} ${POOL} ${image}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+test -n "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+compare_images ${POOL} ${image}
+set_image_meta ${CLUSTER1} ${POOL} ${image} \
+	       conf_rbd_mirroring_resync_after_disconnect false
+disconnect_image ${CLUSTER2} ${POOL} ${image}
+test -z "$(get_mirror_position ${CLUSTER2} ${POOL} ${image})"
+wait_for_image_replay_stopped ${CLUSTER1} ${POOL} ${image}
+wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+error' 'disconnected'
+
+echo OK
diff --git a/qa/workunits/rbd/rbd_mirror_helpers.sh b/qa/workunits/rbd/rbd_mirror_helpers.sh
new file mode 100755
index 0000000..78784f5
--- /dev/null
+++ b/qa/workunits/rbd/rbd_mirror_helpers.sh
@@ -0,0 +1,787 @@
+#!/bin/sh
+#
+# rbd_mirror_helpers.sh - shared rbd-mirror daemon helper functions
+#
+# The scripts starts two ("local" and "remote") clusters using mstart.sh script,
+# creates a temporary directory, used for cluster configs, daemon logs, admin
+# socket, temporary files, and launches rbd-mirror daemon.
+#
+# There are several env variables useful when troubleshooting a test failure:
+#
+#  RBD_MIRROR_NOCLEANUP - if not empty, don't run the cleanup (stop processes,
+#                         destroy the clusters and remove the temp directory)
+#                         on exit, so it is possible to check the test state
+#                         after failure.
+#  RBD_MIRROR_TEMDIR    - use this path when creating the temporary directory
+#                         (should not exist) instead of running mktemp(1).
+#
+# The cleanup can be done as a separate step, running the script with
+# `cleanup ${RBD_MIRROR_TEMDIR}' arguments.
+#
+# Note, as other workunits tests, rbd_mirror.sh expects to find ceph binaries
+# in PATH.
+#
+# Thus a typical troubleshooting session:
+#
+# From Ceph src dir (CEPH_SRC_PATH), start the test in NOCLEANUP mode and with
+# TEMPDIR pointing to a known location:
+#
+#   cd $CEPH_SRC_PATH
+#   PATH=$CEPH_SRC_PATH:$PATH
+#   RBD_MIRROR_NOCLEANUP=1 RBD_MIRROR_TEMDIR=/tmp/tmp.rbd_mirror \
+#     ../qa/workunits/rbd/rbd_mirror.sh
+#
+# After the test failure cd to TEMPDIR and check the current state:
+#
+#   cd /tmp/tmp.rbd_mirror
+#   ls
+#   less rbd-mirror.cluster1_daemon.$pid.log
+#   ceph --cluster cluster1 -s
+#   ceph --cluster cluster1 -s
+#   rbd --cluster cluster2 -p mirror ls
+#   rbd --cluster cluster2 -p mirror journal status --image test
+#   ceph --admin-daemon rbd-mirror.cluster1_daemon.cluster1.$pid.asok help
+#   ...
+#
+# Also you can execute commands (functions) from the script:
+#
+#   cd $CEPH_SRC_PATH
+#   export RBD_MIRROR_TEMDIR=/tmp/tmp.rbd_mirror
+#   ../qa/workunits/rbd/rbd_mirror.sh status
+#   ../qa/workunits/rbd/rbd_mirror.sh stop_mirror cluster1
+#   ../qa/workunits/rbd/rbd_mirror.sh start_mirror cluster2
+#   ../qa/workunits/rbd/rbd_mirror.sh flush cluster2
+#   ...
+#
+# Eventually, run the cleanup:
+#
+#   cd $CEPH_SRC_PATH
+#   RBD_MIRROR_TEMDIR=/tmp/tmp.rbd_mirror \
+#     ../qa/workunits/rbd/rbd_mirror.sh cleanup
+#
+
+CLUSTER1=cluster1
+CLUSTER2=cluster2
+POOL=mirror
+PARENT_POOL=mirror_parent
+SRC_DIR=$(readlink -f $(dirname $0)/../../../src)
+TEMPDIR=
+
+# These vars facilitate running this script in an environment with
+# ceph installed from packages, like teuthology. These are not defined
+# by default.
+#
+# RBD_MIRROR_USE_EXISTING_CLUSTER - if set, do not start and stop ceph clusters
+# RBD_MIRROR_USE_RBD_MIRROR - if set, use an existing instance of rbd-mirror
+#                             running as ceph client $CEPH_ID. If empty,
+#                             this script will start and stop rbd-mirror
+
+#
+# Functions
+#
+
+daemon_asok_file()
+{
+    local local_cluster=$1
+    local cluster=$2
+
+    if [ -n "${RBD_MIRROR_USE_RBD_MIRROR}" ]; then
+        echo $(ceph-conf --cluster $local_cluster --name "client.${CEPH_ID}" 'admin socket')
+    else
+        echo "${TEMPDIR}/rbd-mirror.${local_cluster}_daemon.${cluster}.asok"
+    fi
+}
+
+daemon_pid_file()
+{
+    local cluster=$1
+
+    if [ -n "${RBD_MIRROR_USE_RBD_MIRROR}" ]; then
+        echo $(ceph-conf --cluster $cluster --name "client.${CEPH_ID}" 'pid file')
+    else
+        echo "${TEMPDIR}/rbd-mirror.${cluster}_daemon.pid"
+    fi
+}
+
+testlog()
+{
+    echo $(date '+%F %T') $@ | tee -a "${TEMPDIR}/rbd-mirror.test.log"
+}
+
+expect_failure()
+{
+    local expected="$1" ; shift
+    local out=${TEMPDIR}/expect_failure.out
+
+    if "$@" > ${out} 2>&1 ; then
+        cat ${out} >&2
+        return 1
+    fi
+
+    if [ -z "${expected}" ]; then
+	return 0
+    fi
+
+    if ! grep -q "${expected}" ${out} ; then
+        cat ${out} >&2
+        return 1
+    fi
+
+    return 0
+}
+
+setup()
+{
+    local c
+    trap cleanup INT TERM EXIT
+
+    if [ -n "${RBD_MIRROR_TEMDIR}" ]; then
+	mkdir "${RBD_MIRROR_TEMDIR}"
+	TEMPDIR="${RBD_MIRROR_TEMDIR}"
+    else
+	TEMPDIR=`mktemp -d`
+    fi
+
+    if [ -z "${RBD_MIRROR_USE_EXISTING_CLUSTER}" ]; then
+        cd ${SRC_DIR}
+        ./mstart.sh ${CLUSTER1} -n
+        ./mstart.sh ${CLUSTER2} -n
+
+        ln -s $(readlink -f run/${CLUSTER1}/ceph.conf) \
+           ${TEMPDIR}/${CLUSTER1}.conf
+        ln -s $(readlink -f run/${CLUSTER2}/ceph.conf) \
+           ${TEMPDIR}/${CLUSTER2}.conf
+
+        cd ${TEMPDIR}
+    fi
+
+    ceph --cluster ${CLUSTER1} osd pool create ${POOL} 64 64
+    ceph --cluster ${CLUSTER1} osd pool create ${PARENT_POOL} 64 64
+    ceph --cluster ${CLUSTER2} osd pool create ${PARENT_POOL} 64 64
+    ceph --cluster ${CLUSTER2} osd pool create ${POOL} 64 64
+
+    rbd --cluster ${CLUSTER1} mirror pool enable ${POOL} pool
+    rbd --cluster ${CLUSTER2} mirror pool enable ${POOL} pool
+    rbd --cluster ${CLUSTER1} mirror pool enable ${PARENT_POOL} image
+    rbd --cluster ${CLUSTER2} mirror pool enable ${PARENT_POOL} image
+
+    rbd --cluster ${CLUSTER1} mirror pool peer add ${POOL} ${CLUSTER2}
+    rbd --cluster ${CLUSTER2} mirror pool peer add ${POOL} ${CLUSTER1}
+    rbd --cluster ${CLUSTER1} mirror pool peer add ${PARENT_POOL} ${CLUSTER2}
+    rbd --cluster ${CLUSTER2} mirror pool peer add ${PARENT_POOL} ${CLUSTER1}
+}
+
+cleanup()
+{
+    test  -n "${RBD_MIRROR_NOCLEANUP}" && return
+
+    set +e
+
+    stop_mirror "${CLUSTER1}"
+    stop_mirror "${CLUSTER2}"
+
+    if [ -z "${RBD_MIRROR_USE_EXISTING_CLUSTER}" ]; then
+        cd ${SRC_DIR}
+        ./mstop.sh ${CLUSTER1}
+        ./mstop.sh ${CLUSTER2}
+    else
+        ceph --cluster ${CLUSTER1} osd pool rm ${POOL} ${POOL} --yes-i-really-really-mean-it
+        ceph --cluster ${CLUSTER2} osd pool rm ${POOL} ${POOL} --yes-i-really-really-mean-it
+        ceph --cluster ${CLUSTER1} osd pool rm ${PARENT_POOL} ${PARENT_POOL} --yes-i-really-really-mean-it
+        ceph --cluster ${CLUSTER2} osd pool rm ${PARENT_POOL} ${PARENT_POOL} --yes-i-really-really-mean-it
+    fi
+    rm -Rf ${TEMPDIR}
+}
+
+start_mirror()
+{
+    local cluster=$1
+
+    test -n "${RBD_MIRROR_USE_RBD_MIRROR}" && return
+
+    rbd-mirror \
+	--cluster ${cluster} \
+	--pid-file=$(daemon_pid_file "${cluster}") \
+	--log-file=${TEMPDIR}/rbd-mirror.${cluster}_daemon.\$cluster.\$pid.log \
+	--admin-socket=${TEMPDIR}/rbd-mirror.${cluster}_daemon.\$cluster.asok \
+	--rbd-mirror-journal-poll-age=1 \
+	--debug-rbd=30 --debug-journaler=30 \
+	--debug-rbd_mirror=30 \
+	--daemonize=true
+}
+
+stop_mirror()
+{
+    local cluster=$1
+
+    test -n "${RBD_MIRROR_USE_RBD_MIRROR}" && return
+
+    local pid
+    pid=$(cat $(daemon_pid_file "${cluster}") 2>/dev/null) || :
+    if [ -n "${pid}" ]
+    then
+	kill ${pid}
+	for s in 1 2 4 8 16 32; do
+	    sleep $s
+	    ps auxww | awk -v pid=${pid} '$2 == pid {print; exit 1}' && break
+	done
+	ps auxww | awk -v pid=${pid} '$2 == pid {print; exit 1}'
+    fi
+    rm -f $(daemon_asok_file "${cluster}" "${CLUSTER1}")
+    rm -f $(daemon_asok_file "${cluster}" "${CLUSTER2}")
+    rm -f $(daemon_pid_file "${cluster}")
+}
+
+admin_daemon()
+{
+    local cluster=$1 ; shift
+
+    local asok_file=$(daemon_asok_file "${cluster}" "${cluster}")
+    test -S "${asok_file}"
+
+    ceph --admin-daemon ${asok_file} $@
+}
+
+status()
+{
+    local cluster daemon image_pool image
+
+    for cluster in ${CLUSTER1} ${CLUSTER2}
+    do
+	echo "${cluster} status"
+	ceph --cluster ${cluster} -s
+	echo
+
+	for image_pool in ${POOL} ${PARENT_POOL}
+	do
+	    echo "${cluster} ${image_pool} images"
+	    rbd --cluster ${cluster} -p ${image_pool} ls
+	    echo
+
+	    echo "${cluster} ${image_pool} mirror pool status"
+	    rbd --cluster ${cluster} -p ${image_pool} mirror pool status --verbose
+	    echo
+
+	    for image in `rbd --cluster ${cluster} -p ${image_pool} ls 2>/dev/null`
+	    do
+	        echo "image ${image} info"
+	        rbd --cluster ${cluster} -p ${image_pool} info ${image}
+	        echo
+	        echo "image ${image} journal status"
+	        rbd --cluster ${cluster} -p ${image_pool} journal status --image ${image}
+	        echo
+	    done
+	done
+    done
+
+    local ret
+
+    for cluster in "${CLUSTER1}" "${CLUSTER2}"
+    do
+	local pid_file=$(daemon_pid_file ${cluster} )
+	if [ ! -e ${pid_file} ]
+	then
+	    echo "${cluster} rbd-mirror not running or unknown" \
+		 "(${pid_file} not exist)"
+	    continue
+	fi
+
+	local pid
+	pid=$(cat ${pid_file} 2>/dev/null) || :
+	if [ -z "${pid}" ]
+	then
+	    echo "${cluster} rbd-mirror not running or unknown" \
+		 "(can't find pid using ${pid_file})"
+	    ret=1
+	    continue
+	fi
+
+	echo "${daemon} rbd-mirror process in ps output:"
+	if ps auxww |
+		awk -v pid=${pid} 'NR == 1 {print} $2 == pid {print; exit 1}'
+	then
+	    echo
+	    echo "${cluster} rbd-mirror not running" \
+		 "(can't find pid $pid in ps output)"
+	    ret=1
+	    continue
+	fi
+	echo
+
+	local asok_file=$(daemon_asok_file ${cluster} ${cluster})
+	if [ ! -S "${asok_file}" ]
+	then
+	    echo "${cluster} rbd-mirror asok is unknown (${asok_file} not exits)"
+	    ret=1
+	    continue
+	fi
+
+	echo "${cluster} rbd-mirror status"
+	ceph --admin-daemon ${asok_file} rbd mirror status
+	echo
+    done
+
+    return ${ret}
+}
+
+flush()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local cmd="rbd mirror flush"
+
+    if [ -n "${image}" ]
+    then
+       cmd="${cmd} ${pool}/${image}"
+    fi
+
+    admin_daemon "${cluster}" ${cmd}
+}
+
+test_image_replay_state()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local test_state=$4
+    local current_state=stopped
+
+    admin_daemon "${cluster}" help |
+	fgrep "\"rbd mirror status ${pool}/${image}\"" &&
+    admin_daemon "${cluster}" rbd mirror status ${pool}/${image} |
+	grep -i 'state.*Replaying' &&
+    current_state=started
+
+    test "${test_state}" = "${current_state}"
+}
+
+wait_for_image_replay_state()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local state=$4
+    local s
+
+    # TODO: add a way to force rbd-mirror to update replayers
+    for s in 1 2 4 8 8 8 8 8 8 8 8 16 16; do
+	sleep ${s}
+	test_image_replay_state "${cluster}" "${pool}" "${image}" "${state}" && return 0
+    done
+    return 1
+}
+
+wait_for_image_replay_started()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    wait_for_image_replay_state "${cluster}" "${pool}" "${image}" started
+}
+
+wait_for_image_replay_stopped()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    wait_for_image_replay_state "${cluster}" "${pool}" "${image}" stopped
+}
+
+get_position()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local id_regexp=$4
+
+    # Parse line like below, looking for the first position
+    # [id=, commit_position=[positions=[[object_number=1, tag_tid=3, entry_tid=9], [object_number=0, tag_tid=3, entry_tid=8], [object_number=3, tag_tid=3, entry_tid=7], [object_number=2, tag_tid=3, entry_tid=6]]]]
+
+    local status_log=${TEMPDIR}/${CLUSTER2}-${pool}-${image}.status
+    rbd --cluster ${cluster} -p ${pool} journal status --image ${image} |
+	tee ${status_log} >&2
+    sed -nEe 's/^.*\[id='"${id_regexp}"',.*positions=\[\[([^]]*)\],.*state=connected.*$/\1/p' \
+	${status_log}
+}
+
+get_master_position()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    get_position "${cluster}" "${pool}" "${image}" ''
+}
+
+get_mirror_position()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    get_position "${cluster}" "${pool}" "${image}" '..*'
+}
+
+wait_for_replay_complete()
+{
+    local local_cluster=$1
+    local cluster=$2
+    local pool=$3
+    local image=$4
+    local s master_pos mirror_pos last_mirror_pos
+    local master_tag master_entry mirror_tag mirror_entry
+
+    while true; do
+        for s in 0.2 0.4 0.8 1.6 2 2 4 4 8 8 16 16 32 32; do
+	    sleep ${s}
+	    flush "${local_cluster}" "${pool}" "${image}"
+	    master_pos=$(get_master_position "${cluster}" "${pool}" "${image}")
+	    mirror_pos=$(get_mirror_position "${cluster}" "${pool}" "${image}")
+	    test -n "${master_pos}" -a "${master_pos}" = "${mirror_pos}" && return 0
+            test "${mirror_pos}" != "${last_mirror_pos}" && break
+        done
+
+        test "${mirror_pos}" = "${last_mirror_pos}" && return 1
+        last_mirror_pos="${mirror_pos}"
+
+        # handle the case where the mirror is ahead of the master
+        master_tag=$(echo "${master_pos}" | grep -Eo "tag_tid=[0-9]*" | cut -d'=' -f 2)
+        mirror_tag=$(echo "${mirror_pos}" | grep -Eo "tag_tid=[0-9]*" | cut -d'=' -f 2)
+        master_entry=$(echo "${master_pos}" | grep -Eo "entry_tid=[0-9]*" | cut -d'=' -f 2)
+        mirror_entry=$(echo "${mirror_pos}" | grep -Eo "entry_tid=[0-9]*" | cut -d'=' -f 2)
+        test "${master_tag}" = "${mirror_tag}" -a ${master_entry} -le ${mirror_entry} && return 0
+    done
+    return 1
+}
+
+test_status_in_pool_dir()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local state_pattern=$4
+    local description_pattern=$5
+
+    local status_log=${TEMPDIR}/${cluster}-${image}.mirror_status
+    rbd --cluster ${cluster} -p ${pool} mirror image status ${image} |
+	tee ${status_log}
+    grep "state: .*${state_pattern}" ${status_log}
+    grep "description: .*${description_pattern}" ${status_log}
+}
+
+wait_for_status_in_pool_dir()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local state_pattern=$4
+    local description_pattern=$5
+
+    for s in 1 2 4 8 8 8 8 8 8 8 8 16 16; do
+	sleep ${s}
+	test_status_in_pool_dir ${cluster} ${pool} ${image} ${state_pattern} ${description_pattern} && return 0
+    done
+    return 1
+}
+
+create_image()
+{
+    local cluster=$1 ; shift
+    local pool=$1 ; shift
+    local image=$1 ; shift
+    local size=128
+
+    if [ -n "$1" ]; then
+	size=$1
+	shift
+    fi
+
+    rbd --cluster ${cluster} -p ${pool} create --size ${size} \
+	--image-feature layering,exclusive-lock,journaling $@ ${image}
+}
+
+set_image_meta()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local key=$4
+    local val=$5
+
+    rbd --cluster ${cluster} -p ${pool} image-meta set ${image} $key $val
+}
+
+remove_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster=${cluster} -p ${pool} snap purge ${image}
+    rbd --cluster=${cluster} -p ${pool} rm ${image}
+}
+
+remove_image_retry()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    for s in 1 2 4 8 16 32; do
+        remove_image ${cluster} ${pool} ${image} && return 0
+        sleep ${s}
+    done
+    return 1
+}
+
+clone_image()
+{
+    local cluster=$1
+    local parent_pool=$2
+    local parent_image=$3
+    local parent_snap=$4
+    local clone_pool=$5
+    local clone_image=$6
+
+    rbd --cluster ${cluster} clone ${parent_pool}/${parent_image}@${parent_snap} \
+	${clone_pool}/${clone_image} --image-feature layering,exclusive-lock,journaling
+}
+
+disconnect_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster ${cluster} -p ${pool} journal client disconnect \
+	--image ${image}
+}
+
+create_snapshot()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap=$4
+
+    rbd --cluster ${cluster} -p ${pool} snap create ${image}@${snap}
+}
+
+remove_snapshot()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap=$4
+
+    rbd --cluster ${cluster} -p ${pool} snap rm ${image}@${snap}
+}
+
+rename_snapshot()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap=$4
+    local new_snap=$5
+
+    rbd --cluster ${cluster} -p ${pool} snap rename ${image}@${snap} ${image}@${new_snap}
+}
+
+purge_snapshots()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster ${cluster} -p ${pool} snap purge ${image}
+}
+
+protect_snapshot()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap=$4
+
+    rbd --cluster ${cluster} -p ${pool} snap protect ${image}@${snap}
+}
+
+unprotect_snapshot()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap=$4
+
+    rbd --cluster ${cluster} -p ${pool} snap unprotect ${image}@${snap}
+}
+
+wait_for_snap_present()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap_name=$4
+    local s
+
+    for s in 1 2 4 8 8 8 8 8 8 8 8 16 16 16 16 32 32 32 32; do
+	sleep ${s}
+        rbd --cluster ${cluster} -p ${pool} info ${image}@${snap_name} || continue
+        return 0
+    done
+    return 1
+}
+
+write_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local count=$4
+    local size=$5
+
+    test -n "${size}" || size=4096
+
+    rbd --cluster ${cluster} -p ${pool} bench-write ${image} \
+	--io-size ${size} --io-threads 1 --io-total $((size * count)) \
+	--io-pattern rand
+}
+
+stress_write_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local duration=$(awk 'BEGIN {srand(); print int(10 * rand()) + 5}')
+
+    timeout ${duration}s ceph_test_rbd_mirror_random_write \
+	--cluster ${cluster} ${pool} ${image} \
+	--debug-rbd=20 --debug-journaler=20 \
+	2> ${TEMPDIR}/rbd-mirror-random-write.log || true
+}
+
+compare_images()
+{
+    local pool=$1
+    local image=$2
+
+    local rmt_export=${TEMPDIR}/${CLUSTER2}-${pool}-${image}.export
+    local loc_export=${TEMPDIR}/${CLUSTER1}-${pool}-${image}.export
+
+    rm -f ${rmt_export} ${loc_export}
+    rbd --cluster ${CLUSTER2} -p ${pool} export ${image} ${rmt_export}
+    rbd --cluster ${CLUSTER1} -p ${pool} export ${image} ${loc_export}
+    cmp ${rmt_export} ${loc_export}
+    rm -f ${rmt_export} ${loc_export}
+}
+
+demote_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster=${cluster} mirror image demote ${pool}/${image}
+}
+
+promote_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local force=$4
+
+    rbd --cluster=${cluster} mirror image promote ${pool}/${image} ${force}
+}
+
+set_pool_mirror_mode()
+{
+    local cluster=$1
+    local pool=$2
+    local mode=$3
+
+    rbd --cluster=${cluster} -p ${pool} mirror pool enable ${mode}
+}
+
+disable_mirror()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster=${cluster} mirror image disable ${pool}/${image}
+}
+
+enable_mirror()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster=${cluster} mirror image enable ${pool}/${image}
+}
+
+test_image_present()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local test_state=$4
+    local current_state=deleted
+
+    rbd --cluster=${cluster} -p ${pool} ls | grep "^${image}$" &&
+    current_state=present
+
+    test "${test_state}" = "${current_state}"
+}
+
+wait_for_image_present()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local state=$4
+    local s
+
+    # TODO: add a way to force rbd-mirror to update replayers
+    for s in 0.1 1 2 4 8 8 8 8 8 8 8 8 16 16 32 32; do
+	sleep ${s}
+	test_image_present "${cluster}" "${pool}" "${image}" "${state}" && return 0
+    done
+    return 1
+}
+
+request_resync_image()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+
+    rbd --cluster=${cluster} -p ${pool} mirror image resync ${image}
+}
+
+#
+# Main
+#
+
+if [ "$#" -gt 0 ]
+then
+    if [ -z "${RBD_MIRROR_TEMDIR}" ]
+    then
+       echo "RBD_MIRROR_TEMDIR is not set" >&2
+       exit 1
+    fi
+
+    TEMPDIR="${RBD_MIRROR_TEMDIR}"
+    cd ${TEMPDIR}
+    $@
+    exit $?
+fi
+
+set -xe
+
+setup
diff --git a/qa/workunits/rbd/rbd_mirror_stress.sh b/qa/workunits/rbd/rbd_mirror_stress.sh
new file mode 100755
index 0000000..e9ed2ce
--- /dev/null
+++ b/qa/workunits/rbd/rbd_mirror_stress.sh
@@ -0,0 +1,188 @@
+#!/bin/sh
+#
+# rbd_mirror_stress.sh - stress test rbd-mirror daemon
+#
+# The following additional environment variables affect the test:
+#
+#  RBD_MIRROR_REDUCE_WRITES - if not empty, don't run the stress bench write
+#                             tool during the many image test
+#
+
+IMAGE_COUNT=50
+export LOCKDEP=0
+
+if [ -n "${CEPH_REF}" ]; then
+  wget -O rbd_mirror_helpers.sh "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=qa/workunits/rbd/rbd_mirror_helpers.sh"
+  . ./rbd_mirror_helpers.sh
+else
+  . $(dirname $0)/rbd_mirror_helpers.sh
+fi
+
+create_snap()
+{
+    local cluster=$1
+    local pool=$2
+    local image=$3
+    local snap_name=$4
+
+    rbd --cluster ${cluster} -p ${pool} snap create ${image}@${snap_name} \
+	--debug-rbd=20 --debug-journaler=20 2> ${TEMPDIR}/rbd-snap-create.log
+}
+
+compare_image_snaps()
+{
+    local pool=$1
+    local image=$2
+    local snap_name=$3
+
+    local rmt_export=${TEMPDIR}/${CLUSTER2}-${pool}-${image}.export
+    local loc_export=${TEMPDIR}/${CLUSTER1}-${pool}-${image}.export
+
+    rm -f ${rmt_export} ${loc_export}
+    rbd --cluster ${CLUSTER2} -p ${pool} export ${image}@${snap_name} ${rmt_export}
+    rbd --cluster ${CLUSTER1} -p ${pool} export ${image}@${snap_name} ${loc_export}
+    cmp ${rmt_export} ${loc_export}
+    rm -f ${rmt_export} ${loc_export}
+}
+
+wait_for_pool_images()
+{
+    local cluster=$1
+    local pool=$2
+    local image_count=$3
+    local s
+    local count
+    local last_count=0
+
+    while true; do
+        for s in `seq 1 40`; do
+            count=$(rbd --cluster ${cluster} -p ${pool} mirror pool status | grep 'images: ' | cut -d' ' -f 2)
+            test "${count}" = "${image_count}" && return 0
+
+            # reset timeout if making forward progress
+            test $count -gt $last_count && break
+            sleep 30
+        done
+
+        test $count -eq $last_count && return 1
+        $last_count=$count
+    done
+    return 1
+}
+
+wait_for_pool_healthy()
+{
+    local cluster=$1
+    local pool=$2
+    local s
+    local state
+
+    for s in `seq 1 40`; do
+        state=$(rbd --cluster ${cluster} -p ${pool} mirror pool status | grep 'health:' | cut -d' ' -f 2)
+        test "${state}" = "ERROR" && return 1
+        test "${state}" = "OK" && return 0
+	sleep 30
+    done
+    return 1
+}
+
+start_mirror ${CLUSTER1}
+start_mirror ${CLUSTER2}
+
+testlog "TEST: add image and test replay after client crashes"
+image=test
+create_image ${CLUSTER2} ${POOL} ${image} '512M'
+wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+
+for i in `seq 1 10`
+do
+  stress_write_image ${CLUSTER2} ${POOL} ${image}
+
+  wait_for_status_in_pool_dir ${CLUSTER1} ${POOL} ${image} 'up+replaying' 'master_position'
+
+  snap_name="snap${i}"
+  create_snap ${CLUSTER2} ${POOL} ${image} ${snap_name}
+  wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+  wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+  wait_for_snap_present ${CLUSTER1} ${POOL} ${image} ${snap_name}
+  compare_image_snaps ${POOL} ${image} ${snap_name}
+done
+
+for i in `seq 1 10`
+do
+  snap_name="snap${i}"
+  remove_snapshot ${CLUSTER2} ${POOL} ${image} ${snap_name}
+done
+
+remove_image_retry ${CLUSTER2} ${POOL} ${image}
+wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+
+testlog "TEST: create many images"
+snap_name="snap"
+for i in `seq 1 ${IMAGE_COUNT}`
+do
+  image="image_${i}"
+  create_image ${CLUSTER2} ${POOL} ${image} '128M'
+  if [ -n "${RBD_MIRROR_REDUCE_WRITES}" ]; then
+    write_image ${CLUSTER2} ${POOL} ${image} 100
+  else
+    stress_write_image ${CLUSTER2} ${POOL} ${image}
+  fi
+done
+
+wait_for_pool_images ${CLUSTER2} ${POOL} ${IMAGE_COUNT}
+wait_for_pool_healthy ${CLUSTER2} ${POOL}
+
+wait_for_pool_images ${CLUSTER1} ${POOL} ${IMAGE_COUNT}
+wait_for_pool_healthy ${CLUSTER1} ${POOL}
+
+testlog "TEST: compare many images"
+for i in `seq 1 ${IMAGE_COUNT}`
+do
+  image="image_${i}"
+  create_snap ${CLUSTER2} ${POOL} ${image} ${snap_name}
+  wait_for_image_replay_started ${CLUSTER1} ${POOL} ${image}
+  wait_for_replay_complete ${CLUSTER1} ${CLUSTER2} ${POOL} ${image}
+  wait_for_snap_present ${CLUSTER1} ${POOL} ${image} ${snap_name}
+  compare_image_snaps ${POOL} ${image} ${snap_name}
+done
+
+testlog "TEST: delete many images"
+for i in `seq 1 ${IMAGE_COUNT}`
+do
+  image="image_${i}"
+  remove_snapshot ${CLUSTER2} ${POOL} ${image} ${snap_name}
+  remove_image_retry ${CLUSTER2} ${POOL} ${image}
+done
+
+testlog "TEST: image deletions should propagate"
+wait_for_pool_healthy ${CLUSTER1} ${POOL} 0
+for i in `seq 1 ${IMAGE_COUNT}`
+do
+  image="image_${i}"
+  wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+done
+
+testlog "TEST: delete images during bootstrap"
+set_pool_mirror_mode ${CLUSTER1} ${POOL} 'image'
+set_pool_mirror_mode ${CLUSTER2} ${POOL} 'image'
+
+start_mirror ${CLUSTER1}
+image=test
+
+for i in `seq 1 10`
+do
+  image="image_${i}"
+  create_image ${CLUSTER2} ${POOL} ${image} '512M'
+  enable_mirror ${CLUSTER2} ${POOL} ${image}
+
+  stress_write_image ${CLUSTER2} ${POOL} ${image}
+  wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'present'
+
+  disable_mirror ${CLUSTER2} ${POOL} ${image}
+  wait_for_image_present ${CLUSTER1} ${POOL} ${image} 'deleted'
+  purge_snapshots ${CLUSTER2} ${POOL} ${image}
+  remove_image_retry ${CLUSTER2} ${POOL} ${image}
+done
+
+echo OK
diff --git a/qa/workunits/rbd/read-flags.sh b/qa/workunits/rbd/read-flags.sh
new file mode 100755
index 0000000..7c24fde
--- /dev/null
+++ b/qa/workunits/rbd/read-flags.sh
@@ -0,0 +1,60 @@
+#!/bin/bash -ex
+
+# create a snapshot, then export it and check that setting read flags works
+# by looking at --debug-ms output
+
+function clean_up {
+    rm -f test.log || true
+    rbd snap remove test at snap || true
+    rbd rm test || true
+}
+
+function test_read_flags {
+    local IMAGE=$1
+    local SET_BALANCED=$2
+    local SET_LOCALIZED=$3
+    local EXPECT_BALANCED=$4
+    local EXPECT_LOCALIZED=$5
+
+    local EXTRA_ARGS="--log-file test.log --debug-ms 1 --no-log-to-stderr"
+    if [ "$SET_BALANCED" = 'y' ]; then
+	EXTRA_ARGS="$EXTRA_ARGS --rbd-balance-snap-reads"
+    elif [ "$SET_LOCALIZED" = 'y' ]; then
+	EXTRA_ARGS="$EXTRA_ARGS --rbd-localize-snap-reads"
+    fi
+
+    rbd export $IMAGE - $EXTRA_ARGS > /dev/null
+    if [ "$EXPECT_BALANCED" = 'y' ]; then
+	grep -q balance_reads test.log
+    else
+	grep -L balance_reads test.log | grep -q test.log
+    fi
+    if [ "$EXPECT_LOCALIZED" = 'y' ]; then
+	grep -q localize_reads test.log
+    else
+	grep -L localize_reads test.log | grep -q test.log
+    fi
+    rm -f test.log
+
+}
+
+clean_up
+
+trap clean_up INT TERM EXIT
+
+rbd create --image-feature layering -s 10 test
+rbd snap create test at snap
+
+# export from non snapshot with or without settings should not have flags
+test_read_flags test n n n n
+test_read_flags test y y n n
+
+# export from snapshot should have read flags in log if they are set
+test_read_flags test at snap n n n n
+test_read_flags test at snap y n y n
+test_read_flags test at snap n y n y
+
+# balanced_reads happens to take priority over localize_reads
+test_read_flags test at snap y y y n
+
+echo OK
diff --git a/qa/workunits/rbd/run_cli_tests.sh b/qa/workunits/rbd/run_cli_tests.sh
new file mode 100755
index 0000000..93e438f
--- /dev/null
+++ b/qa/workunits/rbd/run_cli_tests.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -ex
+
+wget -q http://download.ceph.com/qa/rbd_cli_tests.pls
+wget -q http://download.ceph.com/qa/RbdLib.pm
+perl rbd_cli_tests.pls --pool test
diff --git a/qa/workunits/rbd/set_ro.py b/qa/workunits/rbd/set_ro.py
new file mode 100755
index 0000000..83c43bf
--- /dev/null
+++ b/qa/workunits/rbd/set_ro.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+import logging
+import subprocess
+import sys
+
+logging.basicConfig(level=logging.DEBUG)
+log = logging.getLogger()
+
+def run_command(args, except_on_error=True):
+    log.debug('running command "%s"', ' '.join(args))
+    proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    out, err = proc.communicate()
+    if out:
+        log.debug('stdout: %s', out)
+    if err:
+        log.debug('stderr: %s', err)
+    if proc.returncode:
+        log.debug('ret: %d', proc.returncode)
+        if except_on_error:
+            raise subprocess.CalledProcessError(proc.returncode, ' '.join(args))
+    return (proc.returncode, out, err)
+
+def setup(image_name):
+    run_command(['rbd', 'create', '-s', '100', image_name])
+    run_command(['rbd', 'snap', 'create', image_name + '@snap'])
+    run_command(['rbd', 'map', image_name])
+    run_command(['rbd', 'map', image_name + '@snap'])
+
+def teardown(image_name, fail_on_error=True):
+    run_command(['rbd', 'unmap', '/dev/rbd/rbd/' + image_name + '@snap'], fail_on_error)
+    run_command(['rbd', 'unmap', '/dev/rbd/rbd/' + image_name], fail_on_error)
+    run_command(['rbd', 'snap', 'rm', image_name + '@snap'], fail_on_error)
+    run_command(['rbd', 'rm', image_name], fail_on_error)
+
+def write(target, expect_fail=False):
+    try:
+        with open(target, 'w', 0) as f:
+            f.write('test')
+            f.flush()
+        assert not expect_fail, 'writing should have failed'
+    except IOError:
+        assert expect_fail, 'writing should not have failed'
+
+def test_ro(image_name):
+    dev = '/dev/rbd/rbd/' + image_name
+    snap_dev = dev + '@snap'
+
+    log.info('basic device is readable')
+    write(dev)
+
+    log.info('basic snapshot is read-only')
+    write(snap_dev, True)
+
+    log.info('cannot set snapshot rw')
+    ret, _, _ = run_command(['blockdev', '--setrw', snap_dev], False)
+    assert ret != 0, 'snapshot was set read-write!'
+    run_command(['udevadm', 'settle'])
+    write(snap_dev, True)
+
+    log.info('set device ro')
+    run_command(['blockdev', '--setro', dev])
+    run_command(['udevadm', 'settle'])
+    write(dev, True)
+
+    log.info('cannot set device rw when in-use')
+    with open(dev, 'r') as f:
+        ret, _, _ = run_command(['blockdev', '--setro', dev], False)
+        assert ret != 0, 'in-use device was set read-only!'
+        run_command(['udevadm', 'settle'])
+
+    write(dev, True)
+    run_command(['blockdev', '--setro', dev])
+    run_command(['udevadm', 'settle'])
+    write(dev, True)
+
+    run_command(['blockdev', '--setrw', dev])
+    run_command(['udevadm', 'settle'])
+    write(dev)
+    run_command(['udevadm', 'settle'])
+    run_command(['blockdev', '--setrw', dev])
+    run_command(['udevadm', 'settle'])
+    write(dev)
+
+    log.info('cannot set device ro when in-use')
+    with open(dev, 'r') as f:
+        ret, _, _ = run_command(['blockdev', '--setro', dev], False)
+        assert ret != 0, 'in-use device was set read-only!'
+        run_command(['udevadm', 'settle'])
+
+    run_command(['rbd', 'unmap', '/dev/rbd/rbd/' + image_name])
+    run_command(['rbd', 'map', '--read-only', image_name])
+
+    log.info('cannot write to newly mapped ro device')
+    write(dev, True)
+
+    log.info('can set ro mapped device rw')
+    run_command(['blockdev', '--setrw', dev])
+    run_command(['udevadm', 'settle'])
+    write(dev)
+
+def main():
+    image_name = 'test1'
+    # clean up any state from previous test runs
+    teardown(image_name, False)
+    setup(image_name)
+
+    test_ro(image_name)
+
+    teardown(image_name)
+
+if __name__ == '__main__':
+    main()
diff --git a/qa/workunits/rbd/simple_big.sh b/qa/workunits/rbd/simple_big.sh
new file mode 100755
index 0000000..70aafda
--- /dev/null
+++ b/qa/workunits/rbd/simple_big.sh
@@ -0,0 +1,12 @@
+#!/bin/sh -ex
+
+mb=100000
+
+rbd create foo --size $mb
+DEV=$(sudo rbd map foo)
+dd if=/dev/zero of=$DEV bs=1M count=$mb
+dd if=$DEV of=/dev/null bs=1M count=$mb
+sudo rbd unmap $DEV
+rbd rm foo
+
+echo OK
diff --git a/qa/workunits/rbd/smalliobench.sh b/qa/workunits/rbd/smalliobench.sh
new file mode 100755
index 0000000..f25fae4
--- /dev/null
+++ b/qa/workunits/rbd/smalliobench.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+NUM="$1"
+GAP="$2"
+DUR="$3"
+
+[ -z "$NUM" ] && NUM=30
+[ -z "$GAP" ] && GAP=5
+[ -z "$DUR" ] && DUR=30
+
+for n in `seq 1 $NUM`; do
+    echo "Starting $n of $NUM ..."
+    ceph_smalliobenchrbd --pool rbd --duration $DUR --disable-detailed-ops 1 &
+    sleep $GAP
+done
+echo "Waiting..."
+wait
+echo "OK"
diff --git a/qa/workunits/rbd/test_admin_socket.sh b/qa/workunits/rbd/test_admin_socket.sh
new file mode 100755
index 0000000..ec8764c
--- /dev/null
+++ b/qa/workunits/rbd/test_admin_socket.sh
@@ -0,0 +1,152 @@
+#!/bin/bash -ex
+
+TMPDIR=/tmp/rbd_test_admin_socket$$
+mkdir $TMPDIR
+trap "rm -fr $TMPDIR" 0
+
+. $(dirname $0)/../ceph-helpers.sh
+
+function expect_false()
+{
+    set -x
+    if "$@"; then return 1; else return 0; fi
+}
+
+function rbd_watch_out_file()
+{
+    echo ${TMPDIR}/rbd_watch_$1.out
+}
+
+function rbd_watch_pid_file()
+{
+    echo ${TMPDIR}/rbd_watch_$1.pid
+}
+
+function rbd_watch_fifo()
+{
+    echo ${TMPDIR}/rbd_watch_$1.fifo
+}
+
+function rbd_watch_asok()
+{
+    echo ${TMPDIR}/rbd_watch_$1.asok
+}
+
+function rbd_get_perfcounter()
+{
+    local image=$1
+    local counter=$2
+    local name
+
+    name=$(ceph --format xml --admin-daemon $(rbd_watch_asok ${image}) \
+		perf schema | $XMLSTARLET el -d3 |
+		  grep "/librbd-.*-${image}/${counter}\$")
+    test -n "${name}" || return 1
+
+    ceph --format xml --admin-daemon $(rbd_watch_asok ${image}) perf dump |
+	$XMLSTARLET sel -t -m "${name}" -v .
+}
+
+function rbd_check_perfcounter()
+{
+    local image=$1
+    local counter=$2
+    local expected_val=$3
+    local val=
+
+    val=$(rbd_get_perfcounter ${image} ${counter})
+
+    test "${val}" -eq "${expected_val}"
+}
+
+function rbd_watch_start()
+{
+    local image=$1
+
+    mkfifo $(rbd_watch_fifo ${image})
+    (cat $(rbd_watch_fifo ${image}) |
+	    rbd watch ${image} > $(rbd_watch_out_file ${image}) 2>&1)&
+
+    # find pid of the started rbd watch process
+    local pid
+    for i in `seq 10`; do
+	pid=$(ps auxww | awk "/[r]bd watch ${image}/ {print \$2}")
+	test -n "${pid}" && break
+	sleep 0.1
+    done
+    test -n "${pid}"
+    echo ${pid} > $(rbd_watch_pid_file ${image})
+
+    # find watcher admin socket
+    local asok=$(ceph-conf admin_socket | sed -E "s/[0-9]+/${pid}/")
+    test -n "${asok}"
+    for i in `seq 10`; do
+	test -S "${asok}" && break
+	sleep 0.1
+    done
+    test -S "${asok}"
+    ln -s "${asok}" $(rbd_watch_asok ${image})
+
+    # configure debug level
+    ceph --admin-daemon "${asok}" config set debug_rbd 20
+
+    # check that watcher is registered
+    rbd status ${image} | expect_false grep "Watchers: none"
+}
+
+function rbd_watch_end()
+{
+    local image=$1
+    local regexp=$2
+
+    # send 'enter' to watch to exit
+    echo > $(rbd_watch_fifo ${image})
+    # just in case it is not terminated
+    kill $(cat $(rbd_watch_pid_file ${image})) || :
+
+    # output rbd watch out file for easier troubleshooting
+    cat $(rbd_watch_out_file ${image})
+
+    # cleanup
+    rm -f $(rbd_watch_fifo ${image}) $(rbd_watch_pid_file ${image}) \
+       $(rbd_watch_out_file ${image}) $(rbd_watch_asok ${image})
+}
+
+wait_for_clean
+
+pool="rbd"
+image=testimg$$
+ceph_admin="ceph --admin-daemon $(rbd_watch_asok ${image})"
+
+rbd create --size 128 ${pool}/${image}
+
+# check rbd cache commands are present in help output
+rbd_cache_flush="rbd cache flush ${pool}/${image}"
+rbd_cache_invalidate="rbd cache invalidate ${pool}/${image}"
+
+rbd_watch_start ${image}
+${ceph_admin} help | fgrep "${rbd_cache_flush}"
+${ceph_admin} help | fgrep "${rbd_cache_invalidate}"
+rbd_watch_end ${image}
+
+# test rbd cache commands with disabled and enabled cache
+for conf_rbd_cache in false true; do
+
+    rbd image-meta set ${image} conf_rbd_cache ${conf_rbd_cache}
+
+    rbd_watch_start ${image}
+
+    rbd_check_perfcounter ${image} flush 0
+    ${ceph_admin} ${rbd_cache_flush}
+    # 'flush' counter should increase regardless if cache is enabled
+    rbd_check_perfcounter ${image} flush 1
+
+    rbd_check_perfcounter ${image} invalidate_cache 0
+    ${ceph_admin} ${rbd_cache_invalidate}
+    # 'invalidate_cache' counter should increase regardless if cache is enabled
+    rbd_check_perfcounter ${image} invalidate_cache 1
+
+    rbd_watch_end ${image}
+done
+
+rbd rm ${image}
diff --git a/qa/workunits/rbd/test_librbd.sh b/qa/workunits/rbd/test_librbd.sh
new file mode 100755
index 0000000..f3999f4
--- /dev/null
+++ b/qa/workunits/rbd/test_librbd.sh
@@ -0,0 +1,9 @@
+#!/bin/sh -e
+
+if [ -n "${VALGRIND}" ]; then
+  valgrind --tool=${VALGRIND} --suppressions=${TESTDIR}/valgrind.supp \
+    ceph_test_librbd
+else
+  ceph_test_librbd
+fi
+exit 0
diff --git a/qa/workunits/rbd/test_librbd_api.sh b/qa/workunits/rbd/test_librbd_api.sh
new file mode 100755
index 0000000..975144b
--- /dev/null
+++ b/qa/workunits/rbd/test_librbd_api.sh
@@ -0,0 +1,4 @@
+#!/bin/sh -e
+
+ceph_test_librbd_api
+exit 0
diff --git a/qa/workunits/rbd/test_librbd_python.sh b/qa/workunits/rbd/test_librbd_python.sh
new file mode 100755
index 0000000..8f02f86
--- /dev/null
+++ b/qa/workunits/rbd/test_librbd_python.sh
@@ -0,0 +1,14 @@
+#!/bin/sh -ex
+
+CEPH_REF=${CEPH_REF:-master}
+#wget -q https://raw.github.com/ceph/ceph/$CEPH_REF/src/test/pybind/test_rbd.py
+wget -O test_rbd.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=src/test/pybind/test_rbd.py" || \
+    wget -O test_rbd.py "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=ref/heads/$CEPH_REF;f=src/test/pybind/test_rbd.py"
+
+if [ -n "${VALGRIND}" ]; then
+  valgrind --tool=${VALGRIND} --suppressions=${TESTDIR}/valgrind.supp \
+    nosetests -v test_rbd
+else
+  nosetests -v test_rbd
+fi
+exit 0
diff --git a/qa/workunits/rbd/test_lock_fence.sh b/qa/workunits/rbd/test_lock_fence.sh
new file mode 100755
index 0000000..7f66478
--- /dev/null
+++ b/qa/workunits/rbd/test_lock_fence.sh
@@ -0,0 +1,49 @@
+#!/bin/bash  -x
+# can't use -e because of background process
+
+IMAGE=rbdrw-image
+LOCKID=rbdrw
+RBDRW=rbdrw.py
+CEPH_REF=${CEPH_REF:-master}
+
+wget -O $RBDRW "https://git.ceph.com/?p=ceph.git;a=blob_plain;hb=$CEPH_REF;f=src/test/librbd/rbdrw.py"
+
+rbd create $IMAGE --size 10 --image-format 2 --image-shared || exit 1
+
+# rbdrw loops doing I/O to $IMAGE after locking with lockid $LOCKID
+python $RBDRW $IMAGE $LOCKID &
+iochild=$!
+
+# give client time to lock and start reading/writing
+LOCKS='{}'
+while [ "$LOCKS" == "{}" ]
+do
+    LOCKS=$(rbd lock list $IMAGE --format json)
+    sleep 1
+done
+
+clientaddr=$(rbd lock list $IMAGE | tail -1 | awk '{print $NF;}')
+clientid=$(rbd lock list $IMAGE | tail -1 | awk '{print $1;}')
+echo "clientaddr: $clientaddr"
+echo "clientid: $clientid"
+
+ceph osd blacklist add $clientaddr || exit 1
+
+wait $iochild
+rbdrw_exitcode=$?
+if [ $rbdrw_exitcode != 108 ]
+then
+	echo "wrong exitcode from rbdrw: $rbdrw_exitcode"
+	exit 1
+else
+	echo "rbdrw stopped with ESHUTDOWN"
+fi
+
+set -e
+ceph osd blacklist rm $clientaddr
+rbd lock remove $IMAGE $LOCKID "$clientid"
+# rbdrw will have exited with an existing watch, so, until #3527 is fixed,
+# hang out until the watch expires
+sleep 30
+rbd rm $IMAGE
+echo OK
diff --git a/qa/workunits/rbd/test_rbd_mirror.sh b/qa/workunits/rbd/test_rbd_mirror.sh
new file mode 100755
index 0000000..725e1d3
--- /dev/null
+++ b/qa/workunits/rbd/test_rbd_mirror.sh
@@ -0,0 +1,9 @@
+#!/bin/sh -e
+
+if [ -n "${VALGRIND}" ]; then
+  valgrind --tool=${VALGRIND} --suppressions=${TESTDIR}/valgrind.supp \
+    ceph_test_rbd_mirror
+else
+  ceph_test_rbd_mirror
+fi
+exit 0
diff --git a/qa/workunits/rbd/test_rbdmap_RBDMAPFILE.sh b/qa/workunits/rbd/test_rbdmap_RBDMAPFILE.sh
new file mode 100755
index 0000000..e5377f4
--- /dev/null
+++ b/qa/workunits/rbd/test_rbdmap_RBDMAPFILE.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+#
+# Regression test for http://tracker.ceph.com/issues/14984
+#
+# When the bug is present, starting the rbdmap service causes
+# a bogus log message to be emitted to the log because the RBDMAPFILE
+# environment variable is not set.
+#
+# When the bug is not present, starting the rbdmap service will emit 
+# no log messages, because /etc/ceph/rbdmap does not contain any lines 
+# that require processing.
+#
+set -ex
+
+which ceph-detect-init >/dev/null || exit 1
+[ "$(ceph-detect-init)" = "systemd" ] || exit 0
+
+echo "TEST: save timestamp for use later with journalctl --since"
+TIMESTAMP=$(date +%Y-%m-%d\ %H:%M:%S)
+
+echo "TEST: assert that rbdmap has not logged anything since boot"
+journalctl -b 0 -t rbdmap | grep 'rbdmap\[[[:digit:]]' && exit 1
+journalctl -b 0 -t init-rbdmap | grep 'rbdmap\[[[:digit:]]' && exit 1
+
+echo "TEST: restart the rbdmap.service"
+sudo systemctl restart rbdmap.service
+
+echo "TEST: ensure that /usr/bin/rbdmap runs to completion"
+until sudo systemctl status rbdmap.service | grep 'active (exited)' ; do 
+    sleep 0.5
+done
+
+echo "TEST: assert that rbdmap has not logged anything since TIMESTAMP"
+journalctl --since "$TIMESTAMP" -t rbdmap  | grep 'rbdmap\[[[:digit:]]' && exit 1
+journalctl --since "$TIMESTAMP" -t init-rbdmap | grep 'rbdmap\[[[:digit:]]' && exit 1
+
+exit 0
diff --git a/qa/workunits/rbd/verify_pool.sh b/qa/workunits/rbd/verify_pool.sh
new file mode 100755
index 0000000..9033343
--- /dev/null
+++ b/qa/workunits/rbd/verify_pool.sh
@@ -0,0 +1,26 @@
+#!/bin/sh -ex
+
+POOL_NAME=rbd_test_validate_pool
+PG_NUM=100
+
+tear_down () {
+  ceph osd pool delete $POOL_NAME $POOL_NAME --yes-i-really-really-mean-it || true
+}
+
+set_up () {
+  tear_down
+  ceph osd pool create $POOL_NAME $PG_NUM
+  ceph osd pool mksnap $POOL_NAME snap
+}
+
+trap tear_down EXIT HUP INT
+set_up
+
+# creating an image in a pool-managed snapshot pool should fail
+rbd create --pool $POOL_NAME --size 1 foo && exit 1 || true
+
+# should succeed if images already exist in the pool
+rados --pool $POOL_NAME create rbd_directory
+rbd create --pool $POOL_NAME --size 1 foo
+
+echo OK
diff --git a/qa/workunits/rename/all.sh b/qa/workunits/rename/all.sh
new file mode 100755
index 0000000..8a493d0
--- /dev/null
+++ b/qa/workunits/rename/all.sh
@@ -0,0 +1,36 @@
+#!/bin/bash -ex
+
+dir=`dirname $0`
+
+CEPH_TOOL='./ceph'
+$CEPH_TOOL || CEPH_TOOL='ceph'
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/prepare.sh
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/pri_nul.sh
+rm ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/rem_nul.sh
+rm ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/pri_pri.sh
+rm ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/rem_pri.sh
+rm ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/rem_rem.sh
+rm ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/pri_nul.sh
+rm -r ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/pri_pri.sh
+rm -r ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/dir_pri_pri.sh
+rm -r ./?/* || true
+
+CEPH_ARGS=$CEPH_ARGS CEPH_TOOL=$CEPH_TOOL $dir/dir_pri_nul.sh
+rm -r ./?/* || true
+
diff --git a/qa/workunits/rename/dir_pri_nul.sh b/qa/workunits/rename/dir_pri_nul.sh
new file mode 100755
index 0000000..dd8106b
--- /dev/null
+++ b/qa/workunits/rename/dir_pri_nul.sh
@@ -0,0 +1,28 @@
+#!/bin/sh -ex
+
+# dir: srcdn=destdn
+mkdir ./a/dir1
+mv ./a/dir1 ./a/dir1.renamed
+
+# dir: diff
+mkdir ./a/dir2
+mv ./a/dir2 ./b/dir2
+
+# dir: diff, child subtree on target
+mkdir -p ./a/dir3/child/foo
+$CEPH_TOOL mds tell 0 export_dir /a/dir3/child 1
+sleep 5
+mv ./a/dir3 ./b/dir3
+
+# dir: diff, child subtree on other
+mkdir -p ./a/dir4/child/foo
+$CEPH_TOOL mds tell 0 export_dir /a/dir4/child 2
+sleep 5
+mv ./a/dir4 ./b/dir4
+
+# dir: witness subtree adjustment
+mkdir -p ./a/dir5/1/2/3/4
+$CEPH_TOOL mds tell 0 export_dir /a/dir5/1/2/3 2
+sleep 5
+mv ./a/dir5 ./b
+
diff --git a/qa/workunits/rename/dir_pri_pri.sh b/qa/workunits/rename/dir_pri_pri.sh
new file mode 100755
index 0000000..de235fc
--- /dev/null
+++ b/qa/workunits/rename/dir_pri_pri.sh
@@ -0,0 +1,11 @@
+#!/bin/sh -ex
+
+# dir, srcdn=destdn
+mkdir ./a/dir1
+mkdir ./a/dir2
+mv -T ./a/dir1 ./a/dir2
+
+# dir, different
+mkdir ./a/dir3
+mkdir ./b/dir4
+mv -T ./a/dir3 ./b/dir4
diff --git a/qa/workunits/rename/plan.txt b/qa/workunits/rename/plan.txt
new file mode 100644
index 0000000..b423b41
--- /dev/null
+++ b/qa/workunits/rename/plan.txt
@@ -0,0 +1,111 @@
+#!/bin/sh
+
+# srcdn         destdn        targeti
+
+## pri auth      null auth     -
+## pri rep       null auth     -
+## rem auth      null auth     -
+## rem rep       null auth     -
+
+#/ pri auth      null rep      - dup of pr_na
+#/ pri rep       null rep      -
+#/ rem auth      null rep      - dup of rr_na
+#/ rem rep       null rep      -
+
+
+## pri auth      pri auth      -
+# pri rep       pri auth      -
+## rem auth      pri auth      -
+# rem rep       pri auth      -
+
+# pri auth      pri rep       -
+# pri rep       pri rep       -
+# rem auth      pri rep       -
+# rem rep       pri rep       -
+
+## pri auth      rem auth      auth
+# pri rep       rem auth      auth
+## rem auth      rem auth      auth
+# rem rep       rem auth      auth
+
+# pri auth      rem rep       auth
+# pri rep       rem rep       auth
+# rem auth      rem rep       auth
+# rem rep       rem rep       auth
+
+# pri auth      rem auth      rep
+# pri rep       rem auth      rep
+# rem auth      rem auth      rep
+# rem rep       rem auth      rep
+
+# pri auth      rem rep       rep
+# pri rep       rem rep       rep
+# rem auth      rem rep       rep
+# rem rep       rem rep       rep
+
+
+types of operations
+
+pri  nul
+  srcdn=destdn
+  diff
+
+rem  nul
+  srci=srcdn=destdn
+  srci=srcdn
+  srcdn=destdn
+  srci=destdn
+  all different
+
+pri  pri
+  srcdn=destdn
+  different
+
+rem  pri
+  srci=srcdn=destdn
+  srci=srcdn
+  srcdn=destdn
+  srci=destdn
+  all different
+
+pri  rem
+  srcdn=destdn=desti
+  srcdn=destdn
+  destdn=desti
+  srcdn=desti
+  all different
+
+rem  rem
+  srci=srcdn=destdn=desti
+  srci=srcdn=destdn
+  srci=srcdn=desti
+  srci=destdn=desti
+  srcdni=destdn=desti
+  srci=srcdn destdn=desti
+  srci=destdn srcdn=desti
+  srci=desti srcdn=destdn
+  srci=srcdn
+  srci=destdn
+  srci=desti
+  srcdn=destdn
+  srcdn=desti
+  destdn=desti
+  all different
+
+
+
+
+
+
+
+
+
+p   n   same
+r   n   same
+p   n   diff
+r   n   diff
+
+p   p   same
+r   p   same
+
+p   r   
diff --git a/qa/workunits/rename/prepare.sh b/qa/workunits/rename/prepare.sh
new file mode 100755
index 0000000..b5ba4ae
--- /dev/null
+++ b/qa/workunits/rename/prepare.sh
@@ -0,0 +1,21 @@
+#!/bin/sh -ex
+
+$CEPH_TOOL mds tell 0 injectargs '--mds-bal-interval 0'
+$CEPH_TOOL mds tell 1 injectargs '--mds-bal-interval 0'
+$CEPH_TOOL mds tell 2 injectargs '--mds-bal-interval 0'
+$CEPH_TOOL mds tell 3 injectargs '--mds-bal-interval 0'
+#$CEPH_TOOL mds tell 4 injectargs '--mds-bal-interval 0'
+
+mkdir -p ./a/a
+mkdir -p ./b/b
+mkdir -p ./c/c
+mkdir -p ./d/d
+
+mount_dir=`df . | grep -o " /.*" | grep -o "/.*"`
+cur_dir=`pwd`
+ceph_dir=${cur_dir##$mount_dir}
+$CEPH_TOOL mds tell 0 export_dir $ceph_dir/b 1
+$CEPH_TOOL mds tell 0 export_dir $ceph_dir/c 2
+$CEPH_TOOL mds tell 0 export_dir $ceph_dir/d 3
+sleep 5
+
diff --git a/qa/workunits/rename/pri_nul.sh b/qa/workunits/rename/pri_nul.sh
new file mode 100755
index 0000000..c40ec1d
--- /dev/null
+++ b/qa/workunits/rename/pri_nul.sh
@@ -0,0 +1,11 @@
+#!/bin/sh -ex
+
+# srcdn=destdn
+touch ./a/file1
+mv ./a/file1 ./a/file1.renamed
+
+# different
+touch ./a/file2
+mv ./a/file2 ./b
+
+
diff --git a/qa/workunits/rename/pri_pri.sh b/qa/workunits/rename/pri_pri.sh
new file mode 100755
index 0000000..b74985f
--- /dev/null
+++ b/qa/workunits/rename/pri_pri.sh
@@ -0,0 +1,12 @@
+#!/bin/sh -ex
+
+# srcdn=destdn
+touch ./a/file1
+touch ./a/file2
+mv ./a/file1 ./a/file2
+
+# different (srcdn != destdn)
+touch ./a/file3
+touch ./b/file4
+mv ./a/file3 ./b/file4
+
diff --git a/qa/workunits/rename/pri_rem.sh b/qa/workunits/rename/pri_rem.sh
new file mode 100755
index 0000000..a1cd03d
--- /dev/null
+++ b/qa/workunits/rename/pri_rem.sh
@@ -0,0 +1,31 @@
+#!/bin/sh -ex
+
+dotest() {
+    src=$1
+    desti=$2
+    destdn=$3
+    n=$4
+
+    touch ./$src/src$n
+    touch ./$desti/desti$n
+    ln ./$desti/desti$n ./$destdn/destdn$n
+
+    mv ./$src/src$n ./$destdn/destdn$n
+}
+
+
+# srcdn=destdn=desti
+dotest 'a' 'a' 'a' 1
+
+# destdn=desti
+dotest 'b' 'a' 'a' 2
+
+# srcdn=destdn
+dotest 'a' 'b' 'a' 3
+
+# srcdn=desti
+dotest 'a' 'a' 'b' 4
+
+# all different
+dotest 'a' 'b' 'c' 5
+
diff --git a/qa/workunits/rename/rem_nul.sh b/qa/workunits/rename/rem_nul.sh
new file mode 100755
index 0000000..a710331
--- /dev/null
+++ b/qa/workunits/rename/rem_nul.sh
@@ -0,0 +1,29 @@
+#!/bin/sh -ex
+
+dotest() {
+    srci=$1
+    srcdn=$2
+    dest=$3
+    n=$4
+
+    touch ./$srci/srci$n
+    ln ./$srci/srci$n ./$srcdn/srcdn$n
+
+    mv ./$srcdn/srcdn$n ./$dest/dest$n
+}
+
+# srci=srcdn=destdn
+dotest 'a' 'a' 'a' 1
+
+# srcdn=destdn
+dotest 'b' 'a' 'a' 2
+
+# srci=destdn
+dotest 'a' 'b' 'a' 3
+
+# srci=srcdn
+dotest 'a' 'a' 'b' 4
+
+# all different
+dotest 'a' 'b' 'c' 5
+
diff --git a/qa/workunits/rename/rem_pri.sh b/qa/workunits/rename/rem_pri.sh
new file mode 100755
index 0000000..501ac5e
--- /dev/null
+++ b/qa/workunits/rename/rem_pri.sh
@@ -0,0 +1,29 @@
+#!/bin/sh -ex
+
+dotest() {
+    srci=$1
+    srcdn=$2
+    dest=$3
+    n=$4
+
+    touch ./$srci/srci$n
+    ln ./$srci/srci$n ./$srcdn/srcdn$n
+    touch ./$dest/dest$n
+
+    mv ./$srcdn/srcdn$n ./$dest/dest$n
+}
+
+# srci=srcdn=destdn
+dotest 'a' 'a' 'a' 1
+
+# srcdn=destdn
+dotest 'b' 'a' 'a' 2
+
+# srci=destdn
+dotest 'a' 'b' 'a' 3
+
+# srci=srcdn
+dotest 'a' 'a' 'b' 4
+
+# all different
+dotest 'a' 'b' 'c' 5
diff --git a/qa/workunits/rename/rem_rem.sh b/qa/workunits/rename/rem_rem.sh
new file mode 100755
index 0000000..80028c5
--- /dev/null
+++ b/qa/workunits/rename/rem_rem.sh
@@ -0,0 +1,61 @@
+#!/bin/sh -ex
+
+dotest() {
+    srci=$1
+    srcdn=$2
+    desti=$3
+    destdn=$4
+    n=$5
+
+    touch ./$srci/srci$n
+    ln ./$srci/srci$n ./$srcdn/srcdn$n
+    touch ./$desti/desti$n
+    ln ./$desti/desti$n ./$destdn/destdn$n
+
+    mv ./$srcdn/srcdn$n ./$destdn/destdn$n
+}
+
+#  srci=srcdn=destdn=desti
+dotest 'a' 'a' 'a' 'a' 1
+
+#  srcdn=destdn=desti
+dotest 'b' 'a' 'a' 'a' 2
+
+#  srci=destdn=desti
+dotest 'a' 'b' 'a' 'a' 3
+
+#  srci=srcdn=destdn
+dotest 'a' 'a' 'b' 'a' 4
+
+#  srci=srcdn=desti
+dotest 'a' 'a' 'a' 'b' 5
+
+#  srci=srcdn destdn=desti
+dotest 'a' 'a' 'b' 'b' 6
+
+#  srci=destdn srcdn=desti
+dotest 'a' 'b' 'b' 'a' 7
+
+#  srci=desti srcdn=destdn
+dotest 'a' 'b' 'a' 'b' 8
+
+#  srci=srcdn
+dotest 'a' 'a' 'b' 'c' 9
+
+#  srci=desti
+dotest 'a' 'b' 'a' 'c' 10
+
+#  srci=destdn
+dotest 'a' 'b' 'c' 'a' 11
+
+#  srcdn=desti
+dotest 'a' 'b' 'b' 'c' 12
+
+#  srcdn=destdn
+dotest 'a' 'b' 'c' 'b' 13
+
+#  destdn=desti
+dotest 'a' 'b' 'c' 'c' 14
+
+#  all different
+dotest 'a' 'b' 'c' 'd' 15
diff --git a/qa/workunits/rest/test.py b/qa/workunits/rest/test.py
new file mode 100755
index 0000000..c93da13
--- /dev/null
+++ b/qa/workunits/rest/test.py
@@ -0,0 +1,417 @@
+#!/usr/bin/python
+
+import exceptions
+import json
+import os
+import requests
+import subprocess
+import sys
+import time
+import uuid
+import xml.etree.ElementTree
+
+BASEURL = os.environ.get('BASEURL', 'http://localhost:5000/api/v0.1')
+
+def fail(r, msg):
+    print >> sys.stderr, 'FAILURE: url ', r.url
+    print >> sys.stderr, msg
+    print >> sys.stderr, 'Response content: ', r.content
+    print >> sys.stderr, 'Headers: ', r.headers
+    sys.exit(1)
+
+def expect(url, method, respcode, contenttype, extra_hdrs=None, data=None):
+    failmsg, r = expect_nofail(url, method, respcode, contenttype, extra_hdrs,
+                               data)
+    if failmsg:
+        fail(r, failmsg)
+    return r
+
+def expect_nofail(url, method, respcode, contenttype, extra_hdrs=None,
+                 data=None):
+
+    fdict = {'get':requests.get, 'put':requests.put}
+    f = fdict[method.lower()]
+    r = f(BASEURL + '/' + url, headers=extra_hdrs, data=data)
+
+    print '{0} {1}: {2} {3}'.format(method, url, contenttype, r.status_code)
+
+    if r.status_code != respcode:
+        return 'expected {0}, got {1}'.format(respcode, r.status_code), r
+
+    r_contenttype = r.headers['content-type']
+
+    if contenttype in ['json', 'xml']:
+        contenttype = 'application/' + contenttype
+    elif contenttype:
+        contenttype = 'text/' + contenttype
+
+    if contenttype and r_contenttype != contenttype:
+        return 'expected {0}, got "{1}"'.format(contenttype, r_contenttype), r
+
+    if contenttype.startswith('application'):
+        if r_contenttype == 'application/json':
+            try:
+                # older requests.py doesn't create r.myjson; create it myself
+                r.myjson = json.loads(r.content)
+                assert(r.myjson != None)
+            except Exception as e:
+                return 'Invalid JSON returned: "{0}"'.format(str(e)), r
+
+        if r_contenttype == 'application/xml':
+            try:
+                # if it's there, squirrel it away for use in the caller
+                r.tree = xml.etree.ElementTree.fromstring(r.content)
+            except Exception as e:
+                return 'Invalid XML returned: "{0}"'.format(str(e)), r
+
+    return '', r
+
+
+JSONHDR={'accept':'application/json'}
+XMLHDR={'accept':'application/xml'}
+
+if __name__ == '__main__':
+    expect('auth/export', 'GET', 200, 'plain')
+    expect('auth/export.json', 'GET', 200, 'json')
+    expect('auth/export.xml', 'GET', 200, 'xml')
+    expect('auth/export', 'GET', 200, 'json', JSONHDR)
+    expect('auth/export', 'GET', 200, 'xml', XMLHDR)
+
+    expect('auth/add?entity=client.xx&'
+           'caps=mon&caps=allow&caps=osd&caps=allow+*', 'PUT', 200, 'json',
+            JSONHDR)
+
+    r = expect('auth/export?entity=client.xx', 'GET', 200, 'plain')
+    # must use text/plain; default is application/x-www-form-urlencoded
+    expect('auth/add?entity=client.xx', 'PUT', 200, 'plain',
+           {'Content-Type':'text/plain'}, data=r.content)
+
+    r = expect('auth/list', 'GET', 200, 'plain')
+    assert('client.xx' in r.content)
+
+    r = expect('auth/list.json', 'GET', 200, 'json')
+    dictlist = r.myjson['output']['auth_dump']
+    xxdict = [d for d in dictlist if d['entity'] == 'client.xx'][0]
+    assert(xxdict)
+    assert('caps' in xxdict)
+    assert('mon' in xxdict['caps'])
+    assert('osd' in xxdict['caps'])
+
+    expect('auth/get-key?entity=client.xx', 'GET', 200, 'json', JSONHDR)
+    expect('auth/print-key?entity=client.xx', 'GET', 200, 'json', JSONHDR)
+    expect('auth/print_key?entity=client.xx', 'GET', 200, 'json', JSONHDR)
+
+    expect('auth/caps?entity=client.xx&caps=osd&caps=allow+rw', 'PUT', 200,
+           'json', JSONHDR)
+    r = expect('auth/list.json', 'GET', 200, 'json')
+    dictlist = r.myjson['output']['auth_dump']
+    xxdict = [d for d in dictlist if d['entity'] == 'client.xx'][0]
+    assert(xxdict)
+    assert('caps' in xxdict)
+    assert(not 'mon' in xxdict['caps'])
+    assert('osd' in xxdict['caps'])
+    assert(xxdict['caps']['osd'] == 'allow rw')
+
+    # export/import/export, compare
+    r = expect('auth/export', 'GET', 200, 'plain')
+    exp1 = r.content
+    assert('client.xx' in exp1)
+    r = expect('auth/import', 'PUT', 200, 'plain',
+               {'Content-Type':'text/plain'}, data=r.content)
+    r2 = expect('auth/export', 'GET', 200, 'plain')
+    assert(exp1 == r2.content)
+    expect('auth/del?entity=client.xx', 'PUT', 200, 'json', JSONHDR)
+
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert('epoch' in r.myjson['output'])
+
+    assert('GLOBAL' in expect('df', 'GET', 200, 'plain').content)
+    assert('CATEGORY' in expect('df?detail=detail', 'GET', 200, 'plain').content)
+    # test param with no value (treated as param=param)
+    assert('CATEGORY' in expect('df?detail', 'GET', 200, 'plain').content)
+
+    r = expect('df', 'GET', 200, 'json', JSONHDR)
+    assert('total_used_bytes' in r.myjson['output']['stats'])
+    r = expect('df', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/stats/stats/total_used_bytes') is not None)
+
+    r = expect('df?detail', 'GET', 200, 'json', JSONHDR)
+    assert('rd_bytes' in r.myjson['output']['pools'][0]['stats'])
+    r = expect('df?detail', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/stats/pools/pool/stats/rd_bytes') is not None)
+
+    expect('fsid', 'GET', 200, 'json', JSONHDR)
+    expect('health', 'GET', 200, 'json', JSONHDR)
+    expect('health?detail', 'GET', 200, 'json', JSONHDR)
+    expect('health?detail', 'GET', 200, 'plain')
+
+    # XXX no ceph -w equivalent yet
+
+    expect('mds/cluster_down', 'PUT', 200, '')
+    expect('mds/cluster_down', 'PUT', 200, '')
+    expect('mds/cluster_up', 'PUT', 200, '')
+    expect('mds/cluster_up', 'PUT', 200, '')
+
+    expect('mds/compat/rm_incompat?feature=4', 'PUT', 200, '')
+    expect('mds/compat/rm_incompat?feature=4', 'PUT', 200, '')
+
+    r = expect('mds/compat/show', 'GET', 200, 'json', JSONHDR)
+    assert('incompat' in r.myjson['output'])
+    r = expect('mds/compat/show', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/mds_compat/incompat') is not None)
+
+    # EEXIST from CLI
+    expect('mds/deactivate?who=2', 'PUT', 400, '')
+
+    r = expect('mds/dump.xml', 'GET', 200, 'xml')
+    assert(r.tree.find('output/mdsmap/created') is not None)
+
+    expect('fs/flag/set?flag_name=enable_multiple&val=true', 'PUT', 200, '')
+    expect('osd/pool/create?pg_num=1&pool=cephfs_metadata', 'PUT', 200, '')
+    expect('osd/pool/create?pg_num=1&pool=cephfs_data', 'PUT', 200, '')
+    expect('fs/new?fs_name=cephfs&metadata=cephfs_metadata&data=cephfs_data', 'PUT', 200, '')
+    expect('osd/pool/create?pool=data2&pg_num=10', 'PUT', 200, '')
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    pools = r.myjson['output']['pools']
+    poolnum = None
+    for p in pools:
+        if p['pool_name'] == 'data2':
+            poolnum = p['pool']
+            assert(p['pg_num'] == 10)
+            break
+    assert(poolnum is not None)
+    expect('mds/add_data_pool?pool={0}'.format(poolnum), 'PUT', 200, '')
+    expect('mds/remove_data_pool?pool={0}'.format(poolnum), 'PUT', 200, '')
+    expect('osd/pool/delete?pool=data2&pool2=data2'
+           '&sure=--yes-i-really-really-mean-it', 'PUT', 200, '')
+    expect('mds/set?var=allow_multimds&val=true&confirm=--yes-i-really-mean-it', 'PUT', 200, '')
+    expect('mds/set_max_mds?maxmds=4', 'PUT', 200, '')
+    expect('mds/set?var=max_mds&val=4', 'PUT', 200, '')
+    expect('mds/set?var=max_file_size&val=1048576', 'PUT', 200, '')
+    expect('mds/set?var=allow_new_snaps&val=true&confirm=--yes-i-really-mean-it', 'PUT', 200, '')
+    expect('mds/set?var=allow_new_snaps&val=0', 'PUT', 200, '')
+    expect('mds/set?var=inline_data&val=true&confirm=--yes-i-really-mean-it', 'PUT', 200, '')
+    expect('mds/set?var=inline_data&val=0', 'PUT', 200, '')
+    r = expect('mds/dump.json', 'GET', 200, 'json')
+    assert(r.myjson['output']['max_mds'] == 4)
+    expect('mds/set_max_mds?maxmds=3', 'PUT', 200, '')
+    r = expect('mds/stat.json', 'GET', 200, 'json')
+    expect('mds/set?var=max_mds&val=2', 'PUT', 200, '')
+    r = expect('mds/stat.json', 'GET', 200, 'json')
+    assert('epoch' in r.myjson['output']['fsmap'])
+    r = expect('mds/stat.xml', 'GET', 200, 'xml')
+    assert(r.tree.find('output/mds_stat/fsmap/epoch') is not None)
+
+    # more content tests below, just check format here
+    expect('mon/dump.json', 'GET', 200, 'json')
+    expect('mon/dump.xml', 'GET', 200, 'xml')
+
+    r = expect('mon/getmap', 'GET', 200, '')
+    assert(len(r.content) != 0)
+    r = expect('mon_status.json', 'GET', 200, 'json')
+    assert('name' in r.myjson['output'])
+    r = expect('mon_status.xml', 'GET', 200, 'xml')
+    assert(r.tree.find('output/mon_status/name') is not None)
+
+    bl = '192.168.0.1:0/1000'
+    expect('osd/blacklist?blacklistop=add&addr=' + bl, 'PUT', 200, '')
+    r = expect('osd/blacklist/ls.json', 'GET', 200, 'json')
+    assert([b for b in r.myjson['output'] if b['addr'] == bl])
+    expect('osd/blacklist?blacklistop=rm&addr=' + bl, 'PUT', 200, '')
+    r = expect('osd/blacklist/ls.json', 'GET', 200, 'json')
+    assert([b for b in r.myjson['output'] if b['addr'] == bl] == [])
+
+    expect('osd/crush/tunables?profile=legacy', 'PUT', 200, '')
+    expect('osd/crush/tunables?profile=bobtail', 'PUT', 200, '')
+
+    expect('osd/scrub?who=0', 'PUT', 200, '')
+    expect('osd/deep-scrub?who=0', 'PUT', 200, '')
+    expect('osd/repair?who=0', 'PUT', 200, '')
+
+    expect('osd/set?key=noup', 'PUT', 200, '')
+
+    expect('osd/down?ids=0', 'PUT', 200, '')
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['osds'][0]['osd'] == 0)
+    assert(r.myjson['output']['osds'][0]['up'] == 0)
+
+    expect('osd/unset?key=noup', 'PUT', 200, '')
+
+    for i in range(0,100):
+        r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+        assert(r.myjson['output']['osds'][0]['osd'] == 0)
+        if r.myjson['output']['osds'][0]['up'] == 1:
+            break
+        else:
+            print >> sys.stderr, "waiting for osd.0 to come back up"
+            time.sleep(10)
+
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['osds'][0]['osd'] == 0)
+    assert(r.myjson['output']['osds'][0]['up'] == 1)
+
+    r = expect('osd/find?id=1', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['osd'] == 1)
+
+    expect('osd/out?ids=1', 'PUT', 200, '')
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['osds'][1]['osd'] == 1)
+    assert(r.myjson['output']['osds'][1]['in'] == 0)
+
+    expect('osd/in?ids=1', 'PUT', 200, '')
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['osds'][1]['osd'] == 1)
+    assert(r.myjson['output']['osds'][1]['in'] == 1)
+
+    r = expect('osd/find?id=0', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['osd'] == 0)
+
+    r = expect('osd/getmaxosd', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/getmaxosd/max_osd') is not None)
+    r = expect('osd/getmaxosd', 'GET', 200, 'json', JSONHDR)
+    saved_maxosd = r.myjson['output']['max_osd']
+    expect('osd/setmaxosd?newmax=10', 'PUT', 200, '')
+    r = expect('osd/getmaxosd', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['max_osd'] == 10)
+    expect('osd/setmaxosd?newmax={0}'.format(saved_maxosd), 'PUT', 200, '')
+    r = expect('osd/getmaxosd', 'GET', 200, 'json', JSONHDR)
+    assert(r.myjson['output']['max_osd'] == saved_maxosd)
+
+    osd_uuid=uuid.uuid1()
+    r = expect('osd/create?uuid={0}'.format(osd_uuid), 'PUT', 200, 'json', JSONHDR)
+    assert('osdid' in r.myjson['output'])
+    osdid = r.myjson['output']['osdid']
+    expect('osd/lost?id={0}'.format(osdid), 'PUT', 400, '')
+    expect('osd/lost?id={0}&sure=--yes-i-really-mean-it'.format(osdid),
+           'PUT', 200, 'json', JSONHDR)
+    expect('osd/rm?ids={0}'.format(osdid), 'PUT', 200, '')
+    r = expect('osd/ls', 'GET', 200, 'json', JSONHDR)
+    assert(isinstance(r.myjson['output'], list))
+    r = expect('osd/ls', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/osds/osd') is not None)
+
+
+    expect('osd/pause', 'PUT', 200, '')
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert('pauserd,pausewr' in r.myjson['output']['flags'])
+    expect('osd/unpause', 'PUT', 200, '')
+    r = expect('osd/dump', 'GET', 200, 'json', JSONHDR)
+    assert('pauserd,pausewr' not in r.myjson['output']['flags'])
+
+    r = expect('osd/tree', 'GET', 200, 'json', JSONHDR)
+    assert('nodes' in r.myjson['output'])
+    r = expect('osd/tree', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/tree/nodes') is not None)
+
+    expect('osd/pool/create?pool=data2&pg_num=10', 'PUT', 200, '')
+    r = expect('osd/lspools', 'GET', 200, 'json', JSONHDR)
+    assert([p for p in r.myjson['output'] if p['poolname'] == 'data2'])
+    expect('osd/pool/rename?srcpool=data2&destpool=data3', 'PUT', 200, '')
+    r = expect('osd/lspools', 'GET', 200, 'json', JSONHDR)
+    assert([p for p in r.myjson['output'] if p['poolname'] == 'data3'])
+    expect('osd/pool/mksnap?pool=data3&snap=datasnap', 'PUT', 200, '')
+    r = subprocess.call('rados -p data3 lssnap | grep -q datasnap', shell=True)
+    assert(r == 0)
+    expect('osd/pool/rmsnap?pool=data3&snap=datasnap', 'PUT', 200, '')
+    expect('osd/pool/delete?pool=data3', 'PUT', 400, '')
+    expect('osd/pool/delete?pool=data3&pool2=data3&sure=--yes-i-really-really-mean-it', 'PUT', 200, '')
+
+    r = expect('osd/stat', 'GET', 200, 'json', JSONHDR)
+    assert('num_up_osds' in r.myjson['output'])
+    r = expect('osd/stat', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/osdmap/num_up_osds') is not None)
+
+    r = expect('osd/ls', 'GET', 200, 'json', JSONHDR)
+    for osdid in r.myjson['output']:
+        expect('tell/osd.{0}/version'.format(osdid), 'GET', 200, '')
+
+    expect('pg/debug?debugop=unfound_objects_exist', 'GET', 200, '')
+    expect('pg/debug?debugop=degraded_pgs_exist', 'GET', 200, '')
+    expect('pg/deep-scrub?pgid=0.0', 'PUT', 200, '')
+    r = expect('pg/dump', 'GET', 200, 'json', JSONHDR)
+    assert('pg_stats_sum' in r.myjson['output'])
+    r = expect('pg/dump', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/pg_map/pg_stats_sum') is not None)
+
+    expect('pg/dump_json', 'GET', 200, 'json', JSONHDR)
+    expect('pg/dump_pools_json', 'GET', 200, 'json', JSONHDR)
+    expect('pg/dump_stuck?stuckops=inactive', 'GET', 200, '')
+    expect('pg/dump_stuck?stuckops=unclean', 'GET', 200, '')
+    expect('pg/dump_stuck?stuckops=stale', 'GET', 200, '')
+
+    r = expect('pg/getmap', 'GET', 200, '')
+    assert(len(r.content) != 0)
+
+    r = expect('pg/map?pgid=0.0', 'GET', 200, 'json', JSONHDR)
+    assert('acting' in r.myjson['output'])
+    assert(r.myjson['output']['pgid'] == '0.0')
+    r = expect('pg/map?pgid=0.0', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/pg_map/acting') is not None)
+    assert(r.tree.find('output/pg_map/pgid').text == '0.0')
+
+    expect('pg/repair?pgid=0.0', 'PUT', 200, '')
+    expect('pg/scrub?pgid=0.0', 'PUT', 200, '')
+
+    expect('pg/set_full_ratio?ratio=0.90', 'PUT', 200, '')
+    r = expect('pg/dump', 'GET', 200, 'json', JSONHDR)
+    assert(float(r.myjson['output']['full_ratio']) == 0.90)
+    expect('pg/set_full_ratio?ratio=0.95', 'PUT', 200, '')
+    expect('pg/set_nearfull_ratio?ratio=0.90', 'PUT', 200, '')
+    r = expect('pg/dump', 'GET', 200, 'json', JSONHDR)
+    assert(float(r.myjson['output']['near_full_ratio']) == 0.90)
+    expect('pg/set_full_ratio?ratio=0.85', 'PUT', 200, '')
+
+    r = expect('pg/stat', 'GET', 200, 'json', JSONHDR)
+    assert('num_pgs' in r.myjson['output'])
+    r = expect('pg/stat', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/pg_summary/num_pgs') is not None)
+
+    expect('tell/0.0/query', 'GET', 200, 'json', JSONHDR)
+    expect('quorum?quorumcmd=enter', 'PUT', 200, 'json', JSONHDR)
+    expect('quorum?quorumcmd=enter', 'PUT', 200, 'xml', XMLHDR)
+    expect('quorum_status', 'GET', 200, 'json', JSONHDR)
+    expect('quorum_status', 'GET', 200, 'xml', XMLHDR)
+
+    # report's CRC needs to be handled
+    # r = expect('report', 'GET', 200, 'json', JSONHDR)
+    # assert('osd_stats' in r.myjson['output'])
+    # r = expect('report', 'GET', 200, 'xml', XMLHDR)
+    # assert(r.tree.find('output/report/osdmap') is not None)
+
+    r = expect('status', 'GET', 200, 'json', JSONHDR)
+    assert('osdmap' in r.myjson['output'])
+    r = expect('status', 'GET', 200, 'xml', XMLHDR)
+    assert(r.tree.find('output/status/osdmap') is not None)
+
+    r = expect('tell/osd.0/version', 'GET', 200, '')
+    assert('ceph version' in r.content)
+    expect('tell/osd.999/version', 'GET', 400, '')
+    expect('tell/osd.foo/version', 'GET', 400, '')
+
+    r = expect('tell/osd.0/dump_pg_recovery_stats', 'GET', 200, '')
+    assert('Started' in r.content)
+
+    expect('osd/reweight?id=0&weight=0.9', 'PUT', 200, '')
+    expect('osd/reweight?id=0&weight=-1', 'PUT', 400, '')
+    expect('osd/reweight?id=0&weight=1', 'PUT', 200, '')
+
+    for v in ['pg_num', 'pgp_num', 'size', 'min_size', 'crash_replay_interval',
+              'crush_ruleset']:
+        r = expect('osd/pool/get.json?pool=rbd&var=' + v, 'GET', 200, 'json')
+        assert(v in r.myjson['output'])
+
+    r = expect('osd/pool/get.json?pool=rbd&var=size', 'GET', 200, 'json')
+    assert(r.myjson['output']['size'] >= 2)
+
+    expect('osd/pool/set?pool=rbd&var=size&val=3', 'PUT', 200, 'plain')
+    r = expect('osd/pool/get.json?pool=rbd&var=size', 'GET', 200, 'json')
+    assert(r.myjson['output']['size'] == 3)
+
+    expect('osd/pool/set?pool=rbd&var=size&val=2', 'PUT', 200, 'plain')
+    r = expect('osd/pool/get.json?pool=rbd&var=size', 'GET', 200, 'json')
+    assert(r.myjson['output']['size'] == 2)
+
+    r = expect('osd/pool/get.json?pool=rbd&var=crush_ruleset', 'GET', 200, 'json')
+    assert(r.myjson['output']['crush_ruleset'] == 0)
+
+    print 'OK'
diff --git a/qa/workunits/restart/test-backtraces.py b/qa/workunits/restart/test-backtraces.py
new file mode 100755
index 0000000..0b173a6
--- /dev/null
+++ b/qa/workunits/restart/test-backtraces.py
@@ -0,0 +1,252 @@
+#!/usr/bin/env python
+
+import subprocess as sub
+from cStringIO import StringIO
+import json
+import os
+import time
+import sys
+import thread
+
+import rados as rados
+import cephfs as cephfs
+
+prefix='testbt'
+
+def get_name(b, i, j):
+    c = '{pre}.{pid}.{i}.{j}'.format(pre=prefix, pid=os.getpid(), i=i, j=j)
+    return c, b + '/' + c
+
+def mkdir(ceph, d):
+    print >>sys.stderr, "mkdir {d}".format(d=d)
+    ceph.mkdir(d, 0755)
+    return ceph.stat(d)['st_ino']
+
+def create(ceph, f):
+    print >>sys.stderr, "creating {f}".format(f=f)
+    fd = ceph.open(f, os.O_CREAT|os.O_RDWR, 0644)
+    ceph.close(fd)
+    return ceph.stat(f)['st_ino']
+
+def set_mds_config_param(ceph, param):
+    with file('/dev/null', 'rb') as devnull:
+        confarg = ''
+        if conf != '':
+            confarg = '-c {c}'.format(c=conf)
+        r = sub.call("ceph {ca} mds tell a injectargs '{p}'".format(ca=confarg, p=param), shell=True, stdout=devnull)
+        if (r != 0):
+            raise
+
+import ConfigParser
+import contextlib
+
+class _TrimIndentFile(object):
+    def __init__(self, fp):
+        self.fp = fp
+
+    def readline(self):
+        line = self.fp.readline()
+        return line.lstrip(' \t')
+
+def _optionxform(s):
+    s = s.replace('_', ' ')
+    s = '_'.join(s.split())
+    return s
+
+def conf_set_kill_mds(location, killnum):
+    print >>sys.stderr, 'setting mds kill config option for {l}.{k}'.format(l=location, k=killnum)
+    print "restart mds a mds_kill_{l}_at {k}".format(l=location, k=killnum)
+    sys.stdout.flush()
+    for l in sys.stdin.readline():
+        if l == 'restarted':
+            break
+
+def flush(ceph, testnum):
+    print >>sys.stderr, 'flushing {t}'.format(t=testnum)
+    set_mds_config_param(ceph, '--mds_log_max_segments 1')
+
+    for i in range(1, 500):
+        f = '{p}.{pid}.{t}.{i}'.format(p=prefix, pid=os.getpid(), t=testnum, i=i)
+        print >>sys.stderr, 'flushing with create {f}'.format(f=f)
+        fd = ceph.open(f, os.O_CREAT | os.O_RDWR, 0644)
+        ceph.close(fd)
+        ceph.unlink(f)
+
+    print >> sys.stderr, 'flush doing shutdown'
+    ceph.shutdown()
+    print >> sys.stderr, 'flush reinitializing ceph'
+    ceph = cephfs.LibCephFS(conffile=conf)
+    print >> sys.stderr, 'flush doing mount'
+    ceph.mount()
+    return ceph
+
+def kill_mds(ceph, location, killnum):
+    print >>sys.stderr, 'killing mds: {l}.{k}'.format(l=location, k=killnum)
+    set_mds_config_param(ceph, '--mds_kill_{l}_at {k}'.format(l=location, k=killnum))
+
+def wait_for_mds(ceph):
+    # wait for restart
+    while True:
+        confarg = ''
+        if conf != '':
+            confarg = '-c {c}'.format(c=conf)
+        r = sub.check_output("ceph {ca} mds stat".format(ca=confarg), shell=True)
+        if r.find('a=up:active'):
+            break
+        time.sleep(1)
+
+def decode(value):
+
+    tmpfile = '/tmp/{p}.{pid}'.format(p=prefix, pid=os.getpid())
+    with open(tmpfile, 'w+') as f:
+      f.write(value)
+
+    p = sub.Popen(
+        [
+            'ceph-dencoder',
+            'import',
+            tmpfile,
+            'type',
+            'inode_backtrace_t',
+            'decode',
+            'dump_json',
+        ],
+        stdin=sub.PIPE,
+        stdout=sub.PIPE,
+      )
+    (stdout, _) = p.communicate(input=value)
+    p.stdin.close()
+    if (p.returncode != 0):
+        raise
+    os.remove(tmpfile)
+    return json.loads(stdout)
+
+class VerifyFailure(Exception):
+    pass
+
+def verify(rados_ioctx, ino, values, pool):
+    print >>sys.stderr, 'getting parent attr for ino: %lx.00000000' % ino
+    savede = None
+    for i in range(1, 20):
+        try:
+            savede = None
+            binbt = rados_ioctx.get_xattr('%lx.00000000' % ino, 'parent')
+        except rados.ObjectNotFound as e:
+            # wait for a bit to let segments get flushed out
+            savede = e
+            time.sleep(10)
+    if savede:
+        raise savede
+
+    bt = decode(binbt)
+
+    if bt['ino'] != ino:
+        raise VerifyFailure('inode mismatch: {bi} != {ino}\n\tbacktrace:\n\t\t{bt}\n\tfailed verify against:\n\t\t{i}, {v}'.format(
+                    bi=bt['ancestors'][ind]['dname'], ino=ino, bt=bt, i=ino, v=values))
+    ind = 0
+    for (n, i) in values:
+        if bt['ancestors'][ind]['dirino'] != i:
+            raise VerifyFailure('ancestor dirino mismatch: {b} != {ind}\n\tbacktrace:\n\t\t{bt}\n\tfailed verify against:\n\t\t{i}, {v}'.format(
+                    b=bt['ancestors'][ind]['dirino'], ind=i, bt=bt, i=ino, v=values))
+        if bt['ancestors'][ind]['dname'] != n:
+            raise VerifyFailure('ancestor dname mismatch: {b} != {n}\n\tbacktrace:\n\t\t{bt}\n\tfailed verify against:\n\t\t{i}, {v}'.format(
+                    b=bt['ancestors'][ind]['dname'], n=n, bt=bt, i=ino, v=values))
+        ind += 1
+
+    if bt['pool'] != pool:
+        raise VerifyFailure('pool mismatch: {btp} != {p}\n\tbacktrace:\n\t\t{bt}\n\tfailed verify against:\n\t\t{i}, {v}'.format(
+                    btp=bt['pool'], p=pool, bt=bt, i=ino, v=values))
+
+def make_abc(ceph, rooti, i):
+    expected_bt = []
+    c, d = get_name("/", i, 0)
+    expected_bt = [(c, rooti)] + expected_bt
+    di = mkdir(ceph, d)
+    c, d = get_name(d, i, 1)
+    expected_bt = [(c, di)] + expected_bt
+    di = mkdir(ceph, d)
+    c, f = get_name(d, i, 2)
+    fi = create(ceph, f)
+    expected_bt = [(c, di)] + expected_bt
+    return fi, expected_bt
+
+test = -1
+if len(sys.argv) > 1:
+    test = int(sys.argv[1])
+
+conf = ''
+if len(sys.argv) > 2:
+    conf = sys.argv[2]
+
+radosobj = rados.Rados(conffile=conf)
+radosobj.connect()
+ioctx = radosobj.open_ioctx('data')
+
+ceph = cephfs.LibCephFS(conffile=conf)
+ceph.mount()
+
+rooti = ceph.stat('/')['st_ino']
+
+test = -1
+if len(sys.argv) > 1:
+    test = int(sys.argv[1])
+
+conf = '/etc/ceph/ceph.conf'
+if len(sys.argv) > 2:
+    conf = sys.argv[2]
+
+# create /a/b/c
+# flush
+# verify
+
+i = 0
+if test < 0 or test == i:
+  print >>sys.stderr, 'Running test %d: basic verify' % i
+  ino, expected_bt = make_abc(ceph, rooti, i)
+  ceph = flush(ceph, i)
+  verify(ioctx, ino, expected_bt, 0)
+
+i += 1
+
+# kill-mds-at-openc-1
+# create /a/b/c
+# restart-mds
+# flush
+# verify
+
+if test < 0 or test == i:
+  print >>sys.stderr, 'Running test %d: kill openc' % i
+  print "restart mds a"
+  sys.stdout.flush()
+  kill_mds(ceph, 'openc', 1)
+  ino, expected_bt = make_abc(ceph, rooti, i)
+  ceph = flush(ceph, i)
+  verify(ioctx, ino, expected_bt, 0)
+
+i += 1
+
+# kill-mds-at-openc-1
+# create /a/b/c
+# restart-mds with kill-mds-at-replay-1
+# restart-mds
+# flush
+# verify
+if test < 0 or test == i:
+  print >>sys.stderr, 'Running test %d: kill openc/replay' % i
+  # these are reversed because we want to prepare the config
+  conf_set_kill_mds('journal_replay', 1)
+  kill_mds(ceph, 'openc', 1)
+  print "restart mds a"
+  sys.stdout.flush()
+  ino, expected_bt = make_abc(ceph, rooti, i)
+  ceph = flush(ceph, i)
+  verify(ioctx, ino, expected_bt, 0)
+
+i += 1
+
+ioctx.close()
+radosobj.shutdown()
+ceph.shutdown()
+
+print "done"
+sys.stdout.flush()
diff --git a/qa/workunits/rgw/s3_bucket_quota.pl b/qa/workunits/rgw/s3_bucket_quota.pl
new file mode 100755
index 0000000..6a4a1a4
--- /dev/null
+++ b/qa/workunits/rgw/s3_bucket_quota.pl
@@ -0,0 +1,393 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+s3_bucket_quota.pl - Script to test the rgw bucket quota functionality using s3 interface. 
+
+=head1 SYNOPSIS
+
+Use:
+        perl s3_bucket_quota.pl [--help]
+
+Examples:
+        perl s3_bucket_quota.pl 
+        or
+        perl s3_bucket_quota.pl  --help
+
+=head1 DESCRIPTION
+
+This script intends to test the rgw bucket quota funcionality using s3 interface 
+and reports the test results
+
+=head1 ARGUMENTS
+
+s3_bucket_quota.pl takes the following arguments:
+   --help
+   (optional) Displays the usage message.
+
+=cut
+
+use Amazon::S3;
+use Data::Dumper;
+#use strict;
+use IO::File;
+use Getopt::Long;
+use Digest::MD5;
+use Pod::Usage();
+use FindBin;
+use lib $FindBin::Bin;
+use s3_utilities;
+use Net::Domain qw(hostfqdn);
+
+my $help;
+
+Getopt::Long::GetOptions(
+    'help' => \$help
+);
+Pod::Usage::pod2usage(-verbose => 1) && exit if ($help);
+
+#== local variables ===
+our $mytestfilename;
+my $mytestfilename1;
+my $logmsg;
+my $kruft;
+my $s3;
+my $hostdom  = $ENV{RGW_FQDN}||hostfqdn();
+my $port     = $ENV{RGW_PORT}||7280;
+our $hostname = "$hostdom:$port";
+our $testfileloc;
+my $rgw_user = "qa_user";
+
+# Function that deletes the user $rgw_user and write to logfile. 
+sub delete_user
+{
+    my $cmd = "$radosgw_admin user rm --uid=$rgw_user";
+    my $cmd_op = get_command_output($cmd);
+    if ($cmd_op !~ /aborting/){
+        print "user $rgw_user deleted\n";
+    } else {
+        print "user $rgw_user NOT deleted\n";
+        return 1;
+    }
+    return 0;
+}
+
+sub quota_set_max_size {
+    my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-size=1048576000`; 
+    if ($set_quota !~ /./){
+      print "quota set for the bucket: $bucketname \n";
+    } else {
+      print "quota set failed for the bucket: $bucketname \n";
+      exit 1;
+    }
+    return 0;
+}
+
+sub quota_set_max_size_zero {
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-size=0`; 
+    if ($set_quota !~ /./){
+      pass ("quota set for the bucket: $bucketname with max size as zero\n");
+    } else {
+      fail ("quota set with max size 0 failed for the bucket: $bucketname \n");
+    }
+    delete_bucket();
+}
+
+sub quota_set_max_objs_zero {
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-objects=0`; 
+    if ($set_quota !~ /./){
+      pass ("quota set for the bucket: $bucketname with max objects as zero\n");
+    } else {
+      fail ("quota set with max objects 0 failed for the bucket: $bucketname \n");
+    }
+    delete_bucket();
+}
+
+sub quota_set_neg_size {
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-size=-1`; 
+    if ($set_quota !~ /./){
+      pass ("quota set for the bucket: $bucketname with max size -1\n");
+    } else {
+      fail ("quota set failed for the bucket: $bucketname with max size -1 \n");
+    }
+    delete_bucket();
+}
+
+sub quota_set_neg_objs {
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-objects=-1`; 
+    if ($set_quota !~ /./){
+      pass ("quota set for the bucket: $bucketname max objects -1 \n");
+    } else {
+      fail ("quota set failed for the bucket: $bucketname \n with max objects -1");
+    }
+    delete_bucket();
+}
+
+sub quota_set_user_objs {
+    my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=bucket`; 
+    my $set_quota1 = `$radosgw_admin quota set --bucket=$bucketname --max-objects=1`; 
+    if ($set_quota1 !~ /./){
+      print "bucket quota max_objs set for the given user: $bucketname \n";
+    } else {
+      print "bucket quota max_objs set failed for the given user: $bucketname \n";
+      exit 1;
+    }
+    return 0;
+}
+
+sub quota_set_user_size {
+    my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=bucket`; 
+    my $set_quota1 = `$radosgw_admin quota set --bucket=$bucketname --max-size=1048576000`; 
+    if ($set_quota1 !~ /./){
+      print "bucket quota max size set for the given user: $bucketname \n";
+    } else {
+      print "bucket quota max size set failed for the user: $bucketname \n";
+      exit 1;
+    }
+    return 0;
+}
+
+sub quota_set_max_obj {
+    # set max objects 
+    my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-objects=1`; 
+    if ($set_quota !~ /./){ 
+      print "quota set for the bucket: $bucketname \n"; 
+    } else {
+      print "quota set failed for the bucket: $bucketname \n"; 
+     exit 1;
+    }
+    return 0;
+}
+
+sub quota_enable {
+    my $en_quota = `$radosgw_admin quota enable --bucket=$bucketname`; 
+    if ($en_quota !~ /./){ 
+      print "quota enabled for the bucket: $bucketname \n"; 
+    } else {
+      print "quota enable failed for the bucket: $bucketname \n"; 
+      exit 1;
+    }
+    return 0;
+}
+
+sub quota_disable {
+    my $dis_quota = `$radosgw_admin quota disable --bucket=$bucketname`; 
+    if ($dis_quota !~ /./){ 
+      print "quota disabled for the bucket: $bucketname \n"; 
+    } else {
+      print "quota disable failed for the bucket: $bucketname \n"; 
+      exit 1;
+    }
+    return 0;
+}
+
+# upload a file to the bucket
+sub upload_file {
+    print "adding file to bucket: $mytestfilename\n";
+    ($bucket->add_key_filename( $mytestfilename, $testfileloc,
+        { content_type => 'text/plain', },
+    ) and (print "upload file successful\n" ) and return 0 ) or (return 1);
+}
+
+# delete the bucket
+sub delete_bucket {
+   #($bucket->delete_key($mytestfilename1) and print "delete keys on bucket succeeded second time\n" ) or die $s3->err . "delete keys on bucket failed second time\n" . $s3->errstr;
+   ($bucket->delete_bucket) and (print "bucket delete succeeded \n") or die $s3->err . "delete bucket failed\n" . $s3->errstr;
+}
+
+# set bucket quota with max_objects and verify 
+sub test_max_objects {
+    my $size = '10Mb';
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_max_obj();
+    quota_enable();
+    my $ret_value = upload_file();
+    if ($ret_value == 0){
+        pass ( "Test max objects passed" );
+    } else {
+        fail ( "Test max objects failed" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# Set bucket quota for specific user and ensure max objects set for the user is validated
+sub test_max_objects_per_user{
+    my $size = '10Mb';
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_user_objs();
+    quota_enable();
+    my $ret_value = upload_file();
+    if ($ret_value == 0){
+        pass ( "Test max objects for the given user passed" );
+    } else {
+        fail ( "Test max objects for the given user failed" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota with max_objects and try to exceed the max_objects and verify 
+sub test_beyond_max_objs {
+    my $size = "10Mb";
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_max_obj();
+    quota_enable();
+    upload_file();
+    my $ret_value = readd_file();
+    if ($ret_value == 1){
+        pass ( "set max objects and test beyond max objects passed" );
+    } else {
+        fail ( "set max objects and test beyond max objects failed" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota for a user with max_objects and try to exceed the max_objects and verify 
+sub test_beyond_max_objs_user {
+    my $size = "10Mb";
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_user_objs();
+    quota_enable();
+    upload_file();
+    my $ret_value = readd_file();
+    if ($ret_value == 1){
+        pass ( "set max objects for a given user and test beyond max objects passed" );
+    } else {
+        fail ( "set max objects for a given user and test beyond max objects failed" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota for max size and ensure it is validated
+sub test_quota_size {
+    my $ret_value;
+    my $size = "2Gb";
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_max_size();    
+    quota_enable();
+    my $ret_value = upload_file();
+    if ($ret_value == 1) {
+        pass ( "set max size and ensure that objects upload beyond max size is not entertained" );
+        my $retdel = delete_keys($mytestfilename);
+        if ($retdel == 0) {
+            print "delete objects successful \n";
+            my $size1 = "1Gb";
+            create_file($size1);
+            my $ret_val1 = upload_file(); 
+            if ($ret_val1 == 0) {
+                pass ( "set max size and ensure that the max size is in effect" );
+            } else {
+                fail ( "set max size and ensure the max size takes effect" );
+            }
+        }
+    } else {
+        fail ( "set max size and ensure that objects beyond max size is not allowed" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota for max size for a given user and ensure it is validated
+sub test_quota_size_user {
+    my $ret_value;
+    my $size = "2Gb";
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_user_size();
+    quota_enable();
+    my $ret_value = upload_file();
+    if ($ret_value == 1) {
+        pass ( "set max size for a given user and ensure that objects upload beyond max size is not entertained" );
+        my $retdel = delete_keys($mytestfilename);
+        if ($retdel == 0) {
+            print "delete objects successful \n";
+            my $size1 = "1Gb";
+            create_file($size1);
+            my $ret_val1 = upload_file();
+            if ($ret_val1 == 0) {
+                pass ( "set max size for a given user and ensure that the max size is in effect" );
+            } else {
+                fail ( "set max size for a given user and ensure the max size takes effect" );
+            }
+        }
+    } else {
+        fail ( "set max size for a given user and ensure that objects beyond max size is not allowed" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota size but disable quota and verify
+sub test_quota_size_disabled {
+    my $ret_value;
+    my $size = "2Gb";
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_max_size();
+    quota_disable();
+    my $ret_value = upload_file();
+    if ($ret_value == 0) {
+        pass ( "bucket quota size doesnt take effect when quota is disabled" );
+    } else {
+        fail ( "bucket quota size doesnt take effect when quota is disabled" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota size for a given user but disable quota and verify
+sub test_quota_size_disabled_user {
+    my $ret_value;
+    my $size = "2Gb";
+    create_file($size);
+    run_s3($rgw_user);
+    quota_set_user_size();
+    quota_disable();
+    my $ret_value = upload_file();
+    if ($ret_value == 0) {
+        pass ( "bucket quota size for a given user doesnt take effect when quota is disabled" );
+    } else {
+        fail ( "bucket quota size for a given user doesnt take effect when quota is disabled" );
+    }
+    delete_user();
+    delete_keys($mytestfilename);
+    delete_bucket();
+}
+
+# set bucket quota for specified user and verify
+
+#== Main starts here===
+ceph_os_info();
+test_max_objects();
+test_max_objects_per_user();
+test_beyond_max_objs();
+test_beyond_max_objs_user();
+quota_set_max_size_zero();
+quota_set_max_objs_zero();
+quota_set_neg_objs();
+quota_set_neg_size();
+test_quota_size(); 
+test_quota_size_user();
+test_quota_size_disabled();
+test_quota_size_disabled_user();
+
+print "OK";
diff --git a/qa/workunits/rgw/s3_multipart_upload.pl b/qa/workunits/rgw/s3_multipart_upload.pl
new file mode 100755
index 0000000..5bf7af2
--- /dev/null
+++ b/qa/workunits/rgw/s3_multipart_upload.pl
@@ -0,0 +1,151 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+s3_multipart_upload.pl - Script to test rgw multipart upload using s3 interface.
+
+=head1 SYNOPSIS
+
+Use:
+        perl s3_multipart_upload.pl [--help]
+
+Examples:
+        perl s3_multipart_upload.pl
+        or
+        perl s3_multipart_upload.pl  --help
+
+=head1 DESCRIPTION
+
+This script intends to test the rgw multipart upload followed by a download
+and verify checksum using s3 interface and reports test results
+
+=head1 ARGUMENTS
+
+s3_multipart_upload.pl takes the following arguments:
+   --help
+   (optional) Displays the usage message.
+
+=cut
+
+use Amazon::S3;
+use Data::Dumper;
+use IO::File;
+use Getopt::Long;
+use Digest::MD5;
+use Pod::Usage();
+use FindBin;
+use lib $FindBin::Bin;
+use s3_utilities;
+use Net::Domain qw(hostfqdn);
+
+my $help;
+
+Getopt::Long::GetOptions(
+    'help' => \$help
+);
+Pod::Usage::pod2usage(-verbose => 1) && exit if ($help);
+
+#== local variables ===
+my $s3;
+my $hostdom  = $ENV{RGW_FQDN}||hostfqdn();
+my $port     = $ENV{RGW_PORT}||7280;
+our $hostname = "$hostdom:$port";
+our $testfileloc;
+our $mytestfilename;
+
+# upload a file to the bucket
+sub upload_file {
+    my ($fsize, $i) = @_;
+    create_file($fsize, $i);
+    print "adding file to bucket $bucketname: $mytestfilename\n";
+    ($bucket->add_key_filename( $mytestfilename, $testfileloc,
+        { content_type => 'text/plain', },
+    ) and (print "upload file successful\n" ) and return 0 ) or (print "upload failed\n" and return 1);
+}
+
+# delete the bucket
+sub delete_bucket {
+   ($bucket->delete_bucket) and (print "bucket delete succeeded \n") or die $s3->err . "delete bucket failed\n" . $s3->errstr;
+}
+
+# Function to perform multipart upload of given file size to the user bucket via s3 interface
+sub multipart_upload
+{
+    my ($size, $parts) = @_;
+    # generate random user every time
+    my $user = rand();
+    # Divide the file size in to equal parts and upload to bucket in multiple parts
+    my $fsize = ($size/$parts);
+    my $fsize1;
+    run_s3($user);
+    if ($parts == 10){
+        $fsize1 = '100Mb';
+    } elsif ($parts == 100){
+        $fsize1 = '10Mb';
+    }
+    foreach my $i(1..$parts){
+       print "uploading file - part $i \n";
+       upload_file($fsize1, $i);
+    }
+    fetch_file_from_bucket($fsize1, $parts);
+    compare_cksum($fsize1, $parts);
+    purge_data($user);
+}
+
+# Function to download the files from bucket to verify there is no data corruption
+sub fetch_file_from_bucket
+{
+    # fetch file from the bucket
+    my ($fsize, $parts) = @_;
+    foreach my $i(1..$parts){
+    my $src_file = "$fsize.$i";
+    my $dest_file = "/tmp/downloadfile.$i";
+    print
+      "Downloading $src_file from bucket to $dest_file \n";
+    $response =
+      $bucket->get_key_filename( $src_file, GET,
+        $dest_file )
+      or die $s3->err . ": " . $s3->errstr;
+    }
+}
+
+# Compare the source file with destination file and verify checksum to ensure
+# the files are not corrupted
+sub compare_cksum
+{
+    my ($fsize, $parts)=@_;
+    my $md5    = Digest::MD5->new;
+    my $flag = 0;
+    foreach my $i (1..$parts){
+        my $src_file = "/tmp/"."$fsize".".$i";
+        my $dest_file = "/tmp/downloadfile".".$i";
+        open( FILE, $src_file )
+         or die "Error: Could not open $src_file for MD5 checksum...";
+        open( DLFILE, $dest_file )
+         or die "Error: Could not open $dest_file for MD5 checksum.";
+        binmode(FILE);
+        binmode(DLFILE);
+        my $md5sum   = $md5->addfile(*FILE)->hexdigest;
+        my $md5sumdl = $md5->addfile(*DLFILE)->hexdigest;
+        close FILE;
+        close DLFILE;
+        # compare the checksums
+        if ( $md5sum eq $md5sumdl ) {
+            $flag++;
+        }
+    }
+    if ($flag == $parts){
+       pass("checksum verification for multipart upload passed" );
+    }else{
+       fail("checksum verification for multipart upload failed" );
+    }
+}
+
+#== Main starts here===
+ceph_os_info();
+check();
+# The following test runs multi part upload of file size 1Gb in 10 parts
+multipart_upload('1048576000', 10);
+# The following test runs multipart upload of 1 Gb file in 100 parts
+multipart_upload('1048576000', 100);
+print "OK";
diff --git a/qa/workunits/rgw/s3_user_quota.pl b/qa/workunits/rgw/s3_user_quota.pl
new file mode 100755
index 0000000..fbda89a
--- /dev/null
+++ b/qa/workunits/rgw/s3_user_quota.pl
@@ -0,0 +1,191 @@
+#! /usr/bin/perl
+
+=head1 NAME
+
+s3_user_quota.pl - Script to test the rgw user quota functionality using s3 interface.
+
+=head1 SYNOPSIS
+
+Use:
+        perl s3_user_quota.pl [--help]
+
+Examples:
+        perl s3_user_quota.pl
+        or
+        perl s3_user_quota.pl  --help
+
+=head1 DESCRIPTION
+
+This script intends to test the rgw user quota funcionality using s3 interface
+and reports the test results
+
+=head1 ARGUMENTS
+
+s3_user_quota.pl takes the following arguments:
+   --help
+   (optional) Displays the usage message.
+
+=cut
+
+use Amazon::S3;
+use Data::Dumper;
+use IO::File;
+use Getopt::Long;
+use Digest::MD5;
+use Pod::Usage();
+use FindBin;
+use lib $FindBin::Bin;
+use s3_utilities;
+use Net::Domain qw(hostfqdn);
+
+my $help;
+
+Getopt::Long::GetOptions(
+    'help' => \$help
+);
+Pod::Usage::pod2usage(-verbose => 1) && exit if ($help);
+
+#== local variables ===
+our $mytestfilename;
+my $mytestfilename1;
+my $logmsg;
+my $kruft;
+my $s3;
+my $hostdom  = $ENV{RGW_FQDN}||hostfqdn();
+my $port     = $ENV{RGW_PORT}||7280;
+our $hostname = "$hostdom:$port";
+our $testfileloc;
+our $cnt;
+
+sub quota_set_max_size_per_user {
+    my ($maxsize, $size1,$rgw_user) = @_;
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=user --max-size=$maxsize`;
+    if (($set_quota !~ /./)&&($maxsize == 0)){
+      my $ret = test_max_objs($size1, $rgw_user);
+      if ($ret == 1){
+         pass("quota set for user: $rgw_user with max_size=$maxsize passed" );
+      }else {
+         fail("quota set for user: $rgw_user with max_size=$maxsize failed" );
+      }
+    } elsif (($set_quota !~ /./) && ($maxsize != 0)) {
+      my $ret = test_max_objs($size1, $rgw_user);
+      if ($ret == 0){
+         pass("quota set for user: $rgw_user with max_size=$maxsize passed" );
+      }else {
+         fail("quota set for user: $rgw_user with max_size=$maxsize failed" );
+      }
+    }
+    delete_keys($mytestfilename);
+    purge_data($rgw_user);
+    return 0;
+}
+
+sub max_size_per_user {
+    my ($maxsize, $size1,$rgw_user) = @_;
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=user --max-size=$maxsize`;
+    if (($set_quota !~ /./) && ($maxsize != 0)) {
+      my $ret = test_max_objs($size1, $rgw_user);
+      if ($ret == 0){
+         $cnt++;
+      }
+    }
+    return $cnt;
+}
+
+sub quota_set_max_obj_per_user {
+    # set max objects
+    my ($maxobjs, $size1, $rgw_user) = @_;
+    run_s3($rgw_user);
+    my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=user --max-objects=$maxobjs`;
+    if (($set_quota !~ /./) && ($maxobjs == 0)){
+      my $ret = test_max_objs($size1, $rgw_user);
+      if ($ret == 1){
+         pass("quota set for user: $rgw_user with max_objects=$maxobjs passed" );
+      }else {
+         fail("quota set for user: $rgw_user with max_objects=$maxobjs failed" );
+      }
+    } elsif (($set_quota !~ /./) && ($maxobjs == 1)) {
+      my $ret = test_max_objs($size1, $rgw_user);
+      if ($ret == 0){
+         pass("quota set for user: $rgw_user with max_objects=$maxobjs passed" );
+      }else {
+         fail("quota set for user: $rgw_user with max_objects=$maxobjs failed" );
+      }
+    }
+    delete_keys($mytestfilename);
+    purge_data($rgw_user);
+}
+ 
+sub quota_enable_user {
+    my ($rgw_user) = @_;
+    my $en_quota = `$radosgw_admin quota enable --uid=$rgw_user --quota-scope=user`;
+    if ($en_quota !~ /./){
+      print "quota enabled for the user $rgw_user \n";
+    } else {
+      print "quota enable failed for the user $rgw_user \n";
+      exit 1;
+    }
+    return 0;
+}
+
+sub quota_disable_user {
+    my $dis_quota = `$radosgw_admin quota disable --uid=$rgw_user --quota-scope=user`;
+    if ($dis_quota !~ /./){
+      print "quota disabled for the user $rgw_user \n";
+    } else {
+      print "quota disable failed for the user $rgw_user \n";
+      exit 1;
+    }
+    return 0;
+}
+
+# upload a file to the bucket
+sub upload_file {
+    print "adding file to bucket $bucketname: $mytestfilename\n";
+    ($bucket->add_key_filename( $mytestfilename, $testfileloc,
+        { content_type => 'text/plain', },
+    ) and (print "upload file successful\n" ) and return 0 ) or (return 1);
+}
+
+# delete the bucket
+sub delete_bucket {
+   ($bucket->delete_bucket) and (print "bucket delete succeeded \n") or die $s3->err . "delete bucket failed\n" . $s3->errstr;
+}
+
+#Function to upload the given file size to bucket and verify
+sub test_max_objs {
+    my ($size, $rgw_user) = @_;
+    create_file($size);
+    quota_enable_user($rgw_user);
+    my $ret_value = upload_file();
+    return $ret_value;
+}
+
+# set user quota and ensure it is validated
+sub test_user_quota_max_size{
+    my ($max_buckets,$size, $fsize) = @_;
+    my $usr = rand();
+    foreach my $i (1..$max_buckets){
+       my $ret_value = max_size_per_user($size, $fsize, $usr );
+    }
+    if ($ret_value == $max_buckets){
+       fail( "user quota max size for $usr failed on $max_buckets buckets" );
+    } else {
+       pass( "user quota max size for $usr passed on $max_buckets buckets" );
+    }
+    delete_keys($mytestfilename);
+    purge_data($usr);
+}
+
+#== Main starts here===
+ceph_os_info();
+check();
+quota_set_max_obj_per_user('0', '10Mb', 'usr1');
+quota_set_max_obj_per_user('1', '10Mb', 'usr2');
+quota_set_max_size_per_user(0, '10Mb', 'usr1');
+quota_set_max_size_per_user(1048576000, '1Gb', 'usr2');
+test_user_quota_max_size(3,1048576000,'100Mb');
+test_user_quota_max_size(2,1048576000, '1Gb');
+print "OK";
diff --git a/qa/workunits/rgw/s3_utilities.pm b/qa/workunits/rgw/s3_utilities.pm
new file mode 100644
index 0000000..8492dd3
--- /dev/null
+++ b/qa/workunits/rgw/s3_utilities.pm
@@ -0,0 +1,220 @@
+# Common subroutines shared by the s3 testing code
+my $sec;
+my $min;
+my $hour;
+my $mon;
+my $year;
+my $mday;
+my $wday;
+my $yday;
+my $isdst;
+my $PASS_CNT = 0;
+my $FAIL_CNT = 0;
+
+our $radosgw_admin = $ENV{RGW_ADMIN}||"sudo radosgw-admin";
+
+# function to get the current time stamp from the test set up
+sub get_timestamp {
+   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+   if ($mon < 10) { $mon = "0$mon"; }
+   if ($hour < 10) { $hour = "0$hour"; }
+   if ($min < 10) { $min = "0$min"; }
+   if ($sec < 10) { $sec = "0$sec"; }
+   $year=$year+1900;
+   return $year . '_' . $mon . '_' . $mday . '_' . $hour . '_' . $min . '_' . $sec;
+}
+
+# Function to check if radosgw is already running
+sub get_status {
+    my $service = "radosgw";
+    my $cmd = "pgrep $service";
+    my $status = get_cmd_op($cmd);
+    if ($status =~ /\d+/ ){
+        return 0;
+    }
+    return 1;
+}
+
+# function to execute the command and return output
+sub get_cmd_op
+{
+    my $cmd = shift;
+    my $excmd = `$cmd`;
+    return $excmd;
+}
+
+#Function that executes the CLI commands and returns the output of the command
+sub get_command_output {
+    my $cmd_output = shift;
+    open( FH, ">>$test_log" );
+    print FH "\"$cmd_output\"\n";
+    my $exec_cmd = `$cmd_output 2>&1`;
+    print FH "$exec_cmd\n";
+    close(FH);
+    return $exec_cmd;
+}
+
+# Function to get the hostname
+sub get_hostname
+{
+    my $cmd = "hostname";
+    my $get_host = get_command_output($cmd);
+    chomp($get_host);
+    return($get_host);
+}
+
+sub pass {
+    my ($comment) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border2();
+    print "Test case: $TC_CNT PASSED - $comment \n";
+    print_border2();
+    $PASS_CNT++;
+}
+
+sub fail {
+    my ($comment) = @_;
+    print "Comment required." unless length $comment;
+    chomp $comment;
+    print_border2();
+    print "Test case: $TC_CNT FAILED - $comment \n";
+    print_border2();
+    $FAIL_CNT++;
+}
+
+sub print_border2 {
+    print "~" x 90 . "\n";
+}
+
+# Function to create the user "qa_user" and extract the user access_key and secret_key of the user
+sub get_user_info
+{
+    my ($rgw_user) = @_;
+    my $cmd = "$radosgw_admin user create --uid=$rgw_user --display-name=$rgw_user";
+    my $cmd_op = get_command_output($cmd);
+    if ($cmd_op !~ /keys/){
+        return (0,0);
+    }
+    my @get_user = (split/\n/,$cmd_op);
+    foreach (@get_user) {
+        if ($_ =~ /access_key/ ){
+            $get_acc_key = $_;
+        } elsif ($_ =~ /secret_key/ ){
+            $get_sec_key = $_;
+        }
+    }
+    my $access_key = $get_acc_key;
+    my $acc_key = (split /:/, $access_key)[1];
+    $acc_key =~ s/\\//g;
+    $acc_key =~ s/ //g;
+    $acc_key =~ s/"//g;
+    $acc_key =~ s/,//g;
+    my $secret_key = $get_sec_key;
+    my $sec_key = (split /:/, $secret_key)[1];
+    $sec_key =~ s/\\//g;
+    $sec_key =~ s/ //g;
+    $sec_key =~ s/"//g;
+    $sec_key =~ s/,//g;
+    return ($acc_key, $sec_key);
+}
+
+# Function that deletes the given user and all associated user data 
+sub purge_data
+{
+    my ($rgw_user) = @_;
+    my $cmd = "$radosgw_admin user rm --uid=$rgw_user --purge-data";
+    my $cmd_op = get_command_output($cmd);
+    if ($cmd_op !~ /./){
+        print "user $rgw_user deleted\n";
+    } else {
+        print "user $rgw_user NOT deleted\n";
+        return 1;
+    }
+    return 0;
+}
+
+# Function to get the Ceph and distro info
+sub ceph_os_info
+{
+        my $ceph_v = get_command_output ( "ceph -v" );
+        my @ceph_arr = split(" ",$ceph_v);
+        $ceph_v = "Ceph Version:   $ceph_arr[2]";
+        my $os_distro = get_command_output ( "lsb_release -d" );
+        my @os_arr = split(":",$os_distro);
+        $os_distro = "Linux Flavor:$os_arr[1]";
+        return ($ceph_v, $os_distro);
+}
+
+# Execute the test case based on the input to the script
+sub create_file {
+    my ($file_size, $part) = @_;
+    my $cnt;
+    $mytestfilename = "$file_size.$part"; 
+    $testfileloc = "/tmp/".$mytestfilename;
+    if ($file_size == '10Mb'){
+        $cnt = 1;
+    } elsif ($file_size == '100Mb'){
+        $cnt = 10;
+    } elsif ($file_size == '500Mb'){
+        $cnt = 50;
+    } elsif ($file_size == '1Gb'){
+        $cnt = 100;
+    } elsif ($file_size == '2Gb'){
+        $cnt = 200;
+    } 
+    my $ret = system("dd if=/dev/zero of=$testfileloc bs=10485760 count=$cnt");
+    if ($ret) { exit 1 };
+    return 0;
+}
+
+sub run_s3
+{
+# Run tests for the S3 functionality
+    # Modify access key and secret key to suit the user account
+    my ($user) = @_;
+    our ( $access_key, $secret_key ) = get_user_info($user);
+    if ( ($access_key) && ($secret_key) ) {
+       $s3 = Amazon::S3->new(
+            {
+                aws_access_key_id     => $access_key,
+                aws_secret_access_key => $secret_key,
+                host                  => $hostname,
+                secure                => 0,
+                retry                 => 1,
+            }
+      );
+    }
+
+our $bucketname = 'buck_'.get_timestamp();
+# create a new bucket (the test bucket)
+our $bucket = $s3->add_bucket( { bucket => $bucketname } )
+      or die $s3->err. "bucket $bucketname create failed\n". $s3->errstr;
+    print "Bucket Created: $bucketname \n";
+    return 0;
+}
+
+# delete keys
+sub delete_keys {
+   (($bucket->delete_key($_[0])) and return 0) or return 1;
+}
+
+# Readd the file back to bucket 
+sub readd_file {
+    system("dd if=/dev/zero of=/tmp/10MBfile1 bs=10485760 count=1");
+    $mytestfilename1 = '10MBfile1';
+    print "readding file to bucket: $mytestfilename1\n";
+    ((($bucket->add_key_filename( $mytestfilename1, $testfileloc,
+        { content_type => 'text/plain', },
+    )) and (print "readding file success\n") and return 0) or (return 1));
+}
+
+# check if rgw service is already running
+sub check
+{
+    my $state = get_status();
+    if ($state) {
+        exit 1;
+    }
+}
+1
diff --git a/qa/workunits/suites/blogbench.sh b/qa/workunits/suites/blogbench.sh
new file mode 100755
index 0000000..17c91c8
--- /dev/null
+++ b/qa/workunits/suites/blogbench.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+set -e
+
+echo "getting blogbench"
+wget http://download.ceph.com/qa/blogbench-1.0.tar.bz2
+#cp /home/gregf/src/blogbench-1.0.tar.bz2 .
+tar -xvf blogbench-1.0.tar.bz2
+cd blogbench*
+echo "making blogbench"
+./configure
+make
+cd src
+mkdir blogtest_in
+echo "running blogbench"
+./blogbench -d blogtest_in
diff --git a/qa/workunits/suites/bonnie.sh b/qa/workunits/suites/bonnie.sh
new file mode 100755
index 0000000..698ba9c
--- /dev/null
+++ b/qa/workunits/suites/bonnie.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+set -e
+
+bonnie_bin=`which bonnie++`
+[ $? -eq 1 ] && bonnie_bin=/usr/sbin/bonnie++
+
+uid_flags=""
+[ "`id -u`" == "0" ] && uid_flags="-u root"
+
+$bonnie_bin $uid_flags -n 100
diff --git a/qa/workunits/suites/cephfs_journal_tool_smoke.sh b/qa/workunits/suites/cephfs_journal_tool_smoke.sh
new file mode 100755
index 0000000..fe9b60a
--- /dev/null
+++ b/qa/workunits/suites/cephfs_journal_tool_smoke.sh
@@ -0,0 +1,89 @@
+#!/bin/bash
+
+set -e
+set -x
+
+export BIN="${BIN:-cephfs-journal-tool}"
+export JOURNAL_FILE=/tmp/journal.bin
+export JSON_OUTPUT=/tmp/json.tmp
+export BINARY_OUTPUT=/tmp/binary.tmp
+
+if [ -d $BINARY_OUTPUT ] ; then
+    rm -rf $BINARY_OUTPUT
+fi
+
+# Check that the import/export stuff really works as expected
+# first because it's used as the reset method between
+# following checks.
+echo "Testing that export/import cycle preserves state"
+HEADER_STATE=`$BIN header get`
+EVENT_LIST=`$BIN event get list`
+$BIN journal export $JOURNAL_FILE
+$BIN journal import $JOURNAL_FILE
+NEW_HEADER_STATE=`$BIN header get`
+NEW_EVENT_LIST=`$BIN event get list`
+
+if [ ! "$HEADER_STATE" = "$NEW_HEADER_STATE" ] ; then
+    echo "Import failed to preserve header state"
+    echo $HEADER_STATE
+    echo $NEW_HEADER_STATE
+    exit -1
+fi
+
+if [ ! "$EVENT_LIST" = "$NEW_EVENT_LIST" ] ; then
+    echo "Import failed to preserve event state"
+    echo $EVENT_LIST
+    echo $NEW_EVENT_LIST
+    exit -1
+fi
+
+echo "Testing 'journal' commands..."
+
+# Simplest thing: print the vital statistics of the journal
+$BIN journal inspect
+$BIN header get
+
+# Make a copy of the journal in its original state
+$BIN journal export $JOURNAL_FILE
+if [ ! -s $JOURNAL_FILE ] ; then
+    echo "Export to $JOURNAL_FILE failed"
+    exit -1
+fi
+
+# Can we execute a journal reset?
+$BIN journal reset
+$BIN journal inspect
+$BIN header get
+
+# Can we import what we exported?
+$BIN journal import $JOURNAL_FILE
+
+echo "Testing 'event' commands..."
+$BIN event get summary
+$BIN event get --type=UPDATE --path=/ --inode=0 --frag=0x100 summary
+$BIN event get json --path $JSON_OUTPUT
+if [ ! -s $JSON_OUTPUT ] ; then
+    echo "Export to $JSON_OUTPUT failed"
+    exit -1
+fi
+$BIN event get binary --path $BINARY_OUTPUT
+if [ ! -s $BINARY_OUTPUT ] ; then
+    echo "Export to $BINARY_OUTPUT failed"
+    exit -1
+fi
+$BIN event apply summary
+$BIN event splice summary
+
+echo "Rolling back journal to original state..."
+$BIN journal import $JOURNAL_FILE
+
+echo "Testing 'header' commands..."
+
+$BIN header get
+$BIN header set write_pos 123
+$BIN header set expire_pos 123
+$BIN header set trimmed_pos 123
+
+echo "Rolling back journal to original state..."
+$BIN journal import $JOURNAL_FILE
+
diff --git a/qa/workunits/suites/dbench-short.sh b/qa/workunits/suites/dbench-short.sh
new file mode 100755
index 0000000..7297d83
--- /dev/null
+++ b/qa/workunits/suites/dbench-short.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+
+set -e
+
+dbench 1
diff --git a/qa/workunits/suites/dbench.sh b/qa/workunits/suites/dbench.sh
new file mode 100755
index 0000000..ea2be1c
--- /dev/null
+++ b/qa/workunits/suites/dbench.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+set -e
+
+dbench 1
+dbench 10
diff --git a/qa/workunits/suites/ffsb.sh b/qa/workunits/suites/ffsb.sh
new file mode 100755
index 0000000..9ed66ab
--- /dev/null
+++ b/qa/workunits/suites/ffsb.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+set -e
+
+mydir=`dirname $0`
+
+wget http://download.ceph.com/qa/ffsb.tar.bz2
+tar jxvf ffsb.tar.bz2
+cd ffsb-*
+./configure
+make
+cd ..
+mkdir tmp
+cd tmp
+
+for f in $mydir/*.ffsb
+do
+    ../ffsb-*/ffsb $f
+done
+cd ..
+rm -r tmp ffsb*
+
diff --git a/qa/workunits/suites/fio.sh b/qa/workunits/suites/fio.sh
new file mode 100755
index 0000000..04e0645
--- /dev/null
+++ b/qa/workunits/suites/fio.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+set -x
+
+gen_fio_file() {
+  iter=$1
+  f=$2
+  cat > randio-$$-${iter}.fio <<EOF
+[randio]
+blocksize_range=32m:128m
+blocksize_unaligned=1
+filesize=10G:20G
+readwrite=randrw
+runtime=300
+size=20G
+filename=${f}
+EOF
+}
+
+sudo apt-get -y install fio
+for i in $(seq 1 20); do
+  fcount=$(ls donetestfile* 2>/dev/null | wc -l)
+  donef="foo"
+  fiof="bar"
+  if test ${fcount} -gt 0; then
+     # choose random file
+     r=$[ ${RANDOM} % ${fcount} ]
+     testfiles=( $(ls donetestfile*) )
+     donef=${testfiles[${r}]}
+     fiof=$(echo ${donef} | sed -e "s|done|fio|")
+     gen_fio_file $i ${fiof}
+  else
+     fiof=fiotestfile.$$.$i
+     donef=donetestfile.$$.$i
+     gen_fio_file $i ${fiof}
+  fi
+
+  sudo rm -f ${donef}
+  sudo fio randio-$$-$i.fio
+  sudo ln ${fiof} ${donef}
+  ls -la
+done
diff --git a/qa/workunits/suites/fsstress.sh b/qa/workunits/suites/fsstress.sh
new file mode 100755
index 0000000..92e123b
--- /dev/null
+++ b/qa/workunits/suites/fsstress.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+BIN_PATH=${TESTDIR}/fsstress/ltp-full-20091231/testcases/kernel/fs/fsstress/fsstress
+
+path=`pwd`
+trap "rm -rf ${TESTDIR}/fsstress" EXIT
+mkdir -p ${TESTDIR}/fsstress
+cd ${TESTDIR}/fsstress
+wget -q -O ${TESTDIR}/fsstress/ltp-full.tgz http://download.ceph.com/qa/ltp-full-20091231.tgz
+tar xzf ${TESTDIR}/fsstress/ltp-full.tgz
+rm ${TESTDIR}/fsstress/ltp-full.tgz
+cd ${TESTDIR}/fsstress/ltp-full-20091231/testcases/kernel/fs/fsstress
+make
+cd $path
+
+command="${BIN_PATH} -d fsstress-`hostname`$$ -l 1 -n 1000 -p 10 -v"
+
+echo "Starting fsstress $command"
+mkdir fsstress`hostname`-$$
+$command
diff --git a/qa/workunits/suites/fsx.sh b/qa/workunits/suites/fsx.sh
new file mode 100755
index 0000000..8a34806
--- /dev/null
+++ b/qa/workunits/suites/fsx.sh
@@ -0,0 +1,16 @@
+#!/bin/sh -x
+
+set -e
+
+git clone git://git.ceph.com/xfstests.git
+cd xfstests
+git checkout b7fd3f05d6a7a320d13ff507eda2e5b183cae180
+make
+cd ..
+cp xfstests/ltp/fsx .
+
+OPTIONS="-z"  # don't use zero range calls; not supported by cephfs
+
+./fsx $OPTIONS  1MB -N 50000 -p 10000 -l 1048576
+./fsx $OPTIONS  10MB -N 50000 -p 10000 -l 10485760
+./fsx $OPTIONS 100MB -N 50000 -p 10000 -l 104857600
diff --git a/qa/workunits/suites/fsync-tester.sh b/qa/workunits/suites/fsync-tester.sh
new file mode 100755
index 0000000..345fbde
--- /dev/null
+++ b/qa/workunits/suites/fsync-tester.sh
@@ -0,0 +1,12 @@
+#!/bin/sh -x
+
+set -e
+
+wget http://download.ceph.com/qa/fsync-tester.c
+gcc fsync-tester.c -o fsync-tester
+
+./fsync-tester
+
+echo $PATH
+whereis lsof
+lsof
diff --git a/qa/workunits/suites/iogen.sh b/qa/workunits/suites/iogen.sh
new file mode 100755
index 0000000..d159bde
--- /dev/null
+++ b/qa/workunits/suites/iogen.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+set -e
+
+echo "getting iogen"
+wget http://download.ceph.com/qa/iogen_3.1p0.tar
+tar -xvzf iogen_3.1p0.tar
+cd iogen*
+echo "making iogen"
+make
+echo "running iogen"
+./iogen -n 5 -s 2g
+echo "sleep for 10 min"
+sleep 600
+echo "stopping iogen"
+./iogen -k
+
+echo "OK"
diff --git a/qa/workunits/suites/iozone-sync.sh b/qa/workunits/suites/iozone-sync.sh
new file mode 100755
index 0000000..c094952
--- /dev/null
+++ b/qa/workunits/suites/iozone-sync.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+set -e
+
+# basic tests of O_SYNC, O_DSYNC, O_RSYNC
+# test O_SYNC
+iozone -c -e -s 512M -r 1M -t 1 -F osync1 -i 0 -i 1 -o
+# test O_DSYNC
+iozone -c -e -s 512M -r 1M -t 1 -F odsync1 -i 0 -i 1 -+D
+# test O_RSYNC
+iozone -c -e -s 512M -r 1M -t 1 -F orsync1 -i 0 -i 1 -+r
+
+# test same file with O_SYNC in one process, buffered in the other
+# the sync test starts first, so the buffered test should blow
+# past it and 
+iozone -c -e -s 512M -r 1M -t 1 -F osync2 -i 0 -i 1 -o &
+sleep 1
+iozone -c -e -s 512M -r 256K -t 1 -F osync2 -i 0
+wait $!
+
+# test same file with O_SYNC from different threads
+iozone -c -e -s 512M -r 1M -t 2 -F osync3 -i 2 -o
diff --git a/qa/workunits/suites/iozone.sh b/qa/workunits/suites/iozone.sh
new file mode 100755
index 0000000..f2a9dce
--- /dev/null
+++ b/qa/workunits/suites/iozone.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+set -e
+
+iozone -c -e -s 1024M -r 16K -t 1 -F f1 -i 0 -i 1
+iozone -c -e -s 1024M -r 1M -t 1 -F f2 -i 0 -i 1
+iozone -c -e -s 10240M -r 1M -t 1 -F f3 -i 0 -i 1
diff --git a/qa/workunits/suites/pjd.sh b/qa/workunits/suites/pjd.sh
new file mode 100755
index 0000000..125ef43
--- /dev/null
+++ b/qa/workunits/suites/pjd.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+set -e
+
+#wget http://ceph.com/qa/pjd-fstest-20090130-RC-open24.tgz
+wget http://download.ceph.com/qa/pjd-fstest-20090130-RC-aclfixes.tgz
+tar zxvf pjd*.tgz
+cd pjd*
+make clean
+make
+cd ..
+mkdir tmp
+cd tmp
+# must be root!
+sudo prove -r -v --exec 'bash -x' ../pjd*/tests
+cd ..
+rm -rf tmp pjd*
+
diff --git a/qa/workunits/suites/random_write.32.ffsb b/qa/workunits/suites/random_write.32.ffsb
new file mode 100644
index 0000000..ba83e47
--- /dev/null
+++ b/qa/workunits/suites/random_write.32.ffsb
@@ -0,0 +1,48 @@
+# Large file random writes.
+# 1024 files, 100MB per file.
+
+time=300  # 5 min
+alignio=1
+
+[filesystem0]
+        location=.
+        num_files=128
+        min_filesize=104857600  # 100 MB
+        max_filesize=104857600
+        reuse=1
+[end0]
+
+[threadgroup0]
+        num_threads=32
+
+        write_random=1
+        write_weight=1
+
+        write_size=5242880  # 5 MB
+        write_blocksize=4096
+
+        [stats]
+                enable_stats=1
+                enable_range=1
+
+                msec_range    0.00      0.01
+                msec_range    0.01      0.02
+                msec_range    0.02      0.05
+                msec_range    0.05      0.10
+                msec_range    0.10      0.20
+                msec_range    0.20      0.50
+                msec_range    0.50      1.00
+                msec_range    1.00      2.00
+                msec_range    2.00      5.00
+                msec_range    5.00     10.00
+                msec_range   10.00     20.00
+                msec_range   20.00     50.00
+                msec_range   50.00    100.00
+                msec_range  100.00    200.00
+                msec_range  200.00    500.00
+                msec_range  500.00   1000.00
+                msec_range 1000.00   2000.00
+                msec_range 2000.00   5000.00
+                msec_range 5000.00  10000.00
+        [end]
+[end0]
diff --git a/qa/workunits/true.sh b/qa/workunits/true.sh
new file mode 100755
index 0000000..296ef78
--- /dev/null
+++ b/qa/workunits/true.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+true
diff --git a/selinux/Makefile.in b/selinux/Makefile.in
index a2307c3..973c997 100644
--- a/selinux/Makefile.in
+++ b/selinux/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,7 +14,17 @@
 
 @SET_MAKE@
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -79,7 +89,6 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = selinux
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/ac_prog_jar.m4 \
@@ -98,6 +107,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/acconfig.h
 CONFIG_CLEAN_FILES =
@@ -122,13 +132,13 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -214,6 +224,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -312,6 +323,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -347,7 +359,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign selinux/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign selinux/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -527,6 +538,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
 	tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 ceph.pp: ceph.te ceph.fc ceph.if
 	$(MAKE) -j1 -f $(datadir)/selinux/devel/Makefile ceph.pp
diff --git a/share/id_dsa_drop.ceph.com b/share/id_dsa_drop.ceph.com
deleted file mode 100644
index 3efc985..0000000
--- a/share/id_dsa_drop.ceph.com
+++ /dev/null
@@ -1,12 +0,0 @@
------BEGIN DSA PRIVATE KEY-----
-MIIBugIBAAKBgQDv8F/WToUDOc2HRWUOqtq5ilORE+5P53yZUo7ugr8XD3wM0H7Q
-IIl9F9fizwUtL2gh3n1BnBxmPhkVU6VYsiDpn1P3dWvRmf+jyqPuk+b185L0Erb8
-QsExADv6v33Yyd+9i5oTI988Rm1VWY6QhP7neW6yMPt2noi1TwleLm6z2wIVAKHL
-ciT2S0w/dbTFQDFHSEOCAif3AoGAHwOYd8YEInrcBrXPFJuPFbQKr8ceO3/ItY0r
-/W/L92nXUJbdl1JEt2KfkdwaxkBhlYT7E1JR5MRoTNBTEMCFjHxemZCdH+03+Jzq
-+RAQ28p77przbqOFaMuZuQoGlqMy3gYrhnPRGEJGjh+pkhMePqUPCCKFtRntNzlH
-lDh4uOACgYBLGpqu3Pthhd4fnawv8Md16gc/p1Vg/5vyAzi9Gshhgf1hXvFHdeJv
-AN/5mgE/Ekg7fqeNUhui9LYkuuOMgP267naGkAAgxV3bbiy439Vj8SzXdOQk4agA
-YgebWkmJrdMtUSzeBYBkqBZTZODvQwCmYdR6INuNuZtA+rHgKwiAHQIUZak7aJD8
-y4kap9GmduDYmp6/JxU=
------END DSA PRIVATE KEY-----
diff --git a/share/id_dsa_drop.ceph.com.pub b/share/id_dsa_drop.ceph.com.pub
deleted file mode 100644
index e7e5383..0000000
--- a/share/id_dsa_drop.ceph.com.pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-dss AAAAB3NzaC1kc3MAAACBAO/wX9ZOhQM5zYdFZQ6q2rmKU5ET7k/nfJlSju6CvxcPfAzQftAgiX0X1+LPBS0vaCHefUGcHGY+GRVTpViyIOmfU/d1a9GZ/6PKo+6T5vXzkvQStvxCwTEAO/q/fdjJ372LmhMj3zxGbVVZjpCE/ud5brIw+3aeiLVPCV4ubrPbAAAAFQChy3Ik9ktMP3W0xUAxR0hDggIn9wAAAIAfA5h3xgQietwGtc8Um48VtAqvxx47f8i1jSv9b8v3addQlt2XUkS3Yp+R3BrGQGGVhPsTUlHkxGhM0FMQwIWMfF6ZkJ0f7Tf4nOr5EBDbynvumvNuo4Voy5m5CgaWozLeBiuGc9EYQkaOH6mSEx4+pQ8IIoW1Ge03OUeUOHi44AAAAIBLGpqu3Pthhd4fnawv8Md16gc/p1Vg/5vyAzi9Gshhgf1hXvFHdeJvAN/5mgE/Ekg7fqeNUhui9LYk [...]
diff --git a/share/id_rsa_drop.ceph.com b/share/id_rsa_drop.ceph.com
new file mode 100644
index 0000000..78dc7da
--- /dev/null
+++ b/share/id_rsa_drop.ceph.com
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEA6H/ykb30TtYaK8DbaFH5gOHO1E5zs9M5rRNpx5oSC5K3qj7j
+PmWJqFtL+kGxD19IqmYVzAun9auwwObIYtNqr/trD7G9I8W2MYYo/CmJlv/anoBE
+R+fQxkcsPQ8TB3RHBFHR2NnJmOAn3dSt5BRdjzQCL3MMCENq7J2zmF1OcATAAjuK
+kYvp/dunFqmn6GVDjgUWcd12Oz67dVlykjLDCF6cLqup0YM2dZ/mMAUQkGPJytpZ
+4O9Pk9MdXy4LIvJEfQyRWf9fMXWmjEjn7xYFoMbQn+078Fxqv3z2pxB0DU2u94ur
+ep4l7NATtuLoF0qrTYqxxmJi2PDhVMkpeaFQWQIDAQABAoIBAGgzT8e51pCurDQH
+z03Fz4jPqx7Dul9Rv3uuQ65NguDk9KO8Y6RHZZaqtDaI0o4NKkgUUJiOcMxOEn2h
+8RU5o4sTpzv1cMtjhPBVLHE3PI8MRDLdUbzYTF1Q8Ka85s5kcp+g++ewVAXMEJH/
+C6A48GWJ7aDOcwoRDQ7W7vLOfqT84U8on97jn1vMA30ZzailQUqvfgOHUldoQlrc
+6SnBuPnyIozIlir1+seRiNJJ17Dx7sr3nMr3c2Ugvw5ZDSCJ5PmJxZZwl+I6v2kM
+372lOHnp7u0Ii6aOeX69RvWx2CeA2sw1miMfe/b5sjOm4B4PPGwj4knbxHmVs8W4
+GTaJWjECgYEA9pAbTDBQQfvsqwnR4W/e6R1azKa0hTL9dSZBxLQjrPaHhRQsrZbE
+AudL9cfx5ucmoiX++/wVHUpU9nGhZfdvpISCPuVtTnY26Ug7UsKxf2no5gSyKQi+
+xmj0+V9/a1tGD4jdAeRRqhBLR4p1aOWZlCOgaXEq/2w021KBykkzkNcCgYEA8WYL
+5F4QnZaqRosAVPhOw7ovSPclQ70aLX56V3QMwuyLXPqIuKJBFhVHxLl97meB+hrY
+/4gmLW+hvud7dlW88A5x/sgwLy1dMgY0EJEjhVmsk+kni2ZKNsmXGuwUI1qefYk+
+l4WM4k1+5Tp32mw7i5PByQhKVWXh3318ekorkk8CgYEAyzf7R9CKVdhOOKrfUe/i
+ykBnlkXQg/iC7wuZKYdP4D9Rc14tdOXOqJX7BZjGyIm8TekDQK2EuZ+KZ5VAccp/
+Ohn9P9nZPdIxcBUY0B2oLlwcmXlFXozWsLHRN7h+TP3twOANSIHmzUSgx1ZXbx3O
+d0rl7AJabivBZQOb9h5fYgECgYAcS7vlHumPr1NyRWTakOiapL5aLS4fDJF+965b
+hezhBF0pnuxbyBkc/42UD7IlOdjQekkpWsou1UD+YZ/lNROah/bwyIJtZUHhVTzR
+HFIvlV1XUSMjge/9EBA4RafupPai/G1r0Wm8NR1EvV/DKKCqMb2rVN9xtymMyubG
+Zt9InQKBgQDd2TIVDXbPWsnh9EU893uQrLHLDJ5Xu1dcvKX8yvFDihwUrP6ycq9O
+zopzAWu8Fdm0vFEyImwkPPhEJ5kSLQW8T3RJVKQpZ1tgz8sZRXoaTOI+u9w28REc
+2/ABV6x6DknKI9qiQU4sM5hY5pweFtKDIwJFBqWtgFQR0NBoll7JHA==
+-----END RSA PRIVATE KEY-----
diff --git a/share/id_rsa_drop.ceph.com.pub b/share/id_rsa_drop.ceph.com.pub
new file mode 100644
index 0000000..5130a1c
--- /dev/null
+++ b/share/id_rsa_drop.ceph.com.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDof/KRvfRO1horwNtoUfmA4c7UTnOz0zmtE2nHmhILkreqPuM+ZYmoW0v6QbEPX0iqZhXMC6f1q7DA5shi02qv+2sPsb0jxbYxhij8KYmW/9qegERH59DGRyw9DxMHdEcEUdHY2cmY4Cfd1K3kFF2PNAIvcwwIQ2rsnbOYXU5wBMACO4qRi+n926cWqafoZUOOBRZx3XY7Prt1WXKSMsMIXpwuq6nRgzZ1n+YwBRCQY8nK2lng70+T0x1fLgsi8kR9DJFZ/18xdaaMSOfvFgWgxtCf7TvwXGq/fPanEHQNTa73i6t6niXs0BO24ugXSqtNirHGYmLY8OFUySl5oVBZ public_ceph_post_key_2016-08-19
diff --git a/src/.git_version b/src/.git_version
index 8c04d7c..d126034 100644
--- a/src/.git_version
+++ b/src/.git_version
@@ -1,2 +1,2 @@
-ecc23778eb545d8dd55e2e4735b53cc93f92e65b
-v10.2.3
+c461ee19ecbc0c5c330aca20f7392c9a00730367
+v10.2.5
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..ca03194
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,1297 @@
+include(GetGitRevisionDescription)
+
+enable_language(C ASM)
+set(bindir ${CMAKE_INSTALL_PREFIX}/bin)
+set(sbindir ${CMAKE_INSTALL_PREFIX}/sbin)
+set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
+set(sysconfdir ${CMAKE_INSTALL_PREFIX}/etc)
+set(pkgdatadir ${CMAKE_INSTALL_PREFIX}/share)
+set(prefix ${CMAKE_INSTALL_PREFIX})
+
+add_definitions("-DCEPH_LIBDIR=\"${libdir}\"")
+add_definitions("-DCEPH_PKGLIBDIR=\"${libdir}\"")
+add_definitions("-DHAVE_CONFIG_H -D__CEPH__ -D_FILE_OFFSET_BITS=64 -D_REENTRANT -D_THREAD_SAFE -D__STDC_FORMAT_MACROS -D_GNU_SOURCE")
+
+set(CMAKE_ASM_COMPILER  ${PROJECT_SOURCE_DIR}/src/yasm-wrapper)
+set(CMAKE_ASM_FLAGS "-f elf64")
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -rdynamic -Wall -Wtype-limits -Wignored-qualifiers -Winit-self -Wpointer-arith -Werror=format-security -fno-strict-aliasing -fsigned-char -fPIC")
+
+execute_process(
+  COMMAND yasm -f elf64 ${CMAKE_SOURCE_DIR}/src/common/crc32c_intel_fast_asm.S -o /dev/null
+  RESULT_VARIABLE no_yasm
+  OUTPUT_QUIET)
+if(no_yasm)
+  message(STATUS " we do not have a modern/working yasm")
+else(no_yasm)
+  message(STATUS " we have a modern and working yasm")
+  execute_process(
+    COMMAND uname -m
+    OUTPUT_VARIABLE arch
+    OUTPUT_STRIP_TRAILING_WHITESPACE)
+  if(arch STREQUAL "x86_64")
+    message(STATUS " we are x84_64")
+    set(save_quiet ${CMAKE_REQUIRED_QUIET})
+    set(CMAKE_REQUIRED_QUIET true)
+    include(CheckCXXSourceCompiles)
+    check_cxx_source_compiles("
+      #if defined(__x86_64__) && defined(__ILP32__)
+      #error x32
+      #endif
+      int main() {}
+      " not_arch_x32)
+    set(CMAKE_REQUIRED_QUIET ${save_quiet})
+    if(not_arch_x32)
+      message(STATUS " we are not x32")
+      set(HAVE_GOOD_YASM_ELF64 1)
+      add_definitions("-DHAVE_GOOD_YASM_ELF64")
+      execute_process(COMMAND yasm -f elf64 -i
+        ${CMAKE_SOURCE_DIR}/src/erasure-code/isa/isa-l/include/
+        ${CMAKE_SOURCE_DIR}/src/erasure-code/isa/isa-l/erasure_code/gf_vect_dot_prod_avx2.asm.s
+        -o /dev/null
+        RESULT_VARIABLE rc
+        OUTPUT_QUIET)
+      if(NOT rc)
+        set(HAVE_BETTER_YASM_ELF64 1)
+        add_definitions("-DHAVE_BETTER_YASM_ELF64")
+        message(STATUS " yasm can also build the isa-l stuff")
+      endif(NOT rc)
+    else(not_arch_x32)
+      message(STATUS " we are x32; no yasm for you")
+    endif(not_arch_x32)
+  else(arch STREQUAL "x86_64")
+    message(STATUS " we are not x86_64 && !x32")
+  endif(arch STREQUAL "x86_64")
+endif(no_yasm)
+
+
+set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -ftemplate-depth-1024 -Wno-invalid-offsetof -Wnon-virtual-dtor -Wno-invalid-offsetof -Wstrict-null-sentinel -Woverloaded-virtual")
+
+# require c++11
+include(CheckCXXCompilerFlag)
+CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
+if (COMPILER_SUPPORTS_CXX11)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+else()
+  message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support.")
+endif()
+
+
+set(EXTRALIBS uuid rt dl ${ATOMIC_OPS_LIBRARIES})
+
+if(${WITH_PROFILER})
+  list(APPEND EXTRALIBS profiler)
+endif(${WITH_PROFILER})
+
+if(USE_NSS)
+  if(NSS_FOUND)
+    if(NSPR_FOUND)
+      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${NSS_INCLUDE_DIR} -I${NSPR_INCLUDE_DIR}")
+    endif(NSPR_FOUND)
+  endif(NSS_FOUND)
+endif(USE_NSS)
+
+set(GCOV_PREFIX_STRIP 4)
+
+option(ENABLE_GIT_VERSION "build Ceph with git version string" ON)
+if(${ENABLE_GIT_VERSION})
+  get_git_head_revision(GIT_REFSPEC CEPH_GIT_VER)
+  git_describe(CEPH_GIT_NICE_VER --always)
+else(${ENABLE_GIT_VERSION})
+  set(CEPH_GIT_VER "no_version")
+  set(CEPH_GIT_NICE_VER "Development")
+endif(${ENABLE_GIT_VERSION})
+
+# Python stuff
+find_package(PythonInterp 2 QUIET)
+if(NOT PYTHONINTERP_FOUND)
+  message(FATAL_ERROR "Python 2 interpreter not found.")
+endif(NOT PYTHONINTERP_FOUND)
+
+# if CMAKE_INSTALL_PREFIX is an empty string, must replace
+# it with "/" to make PYTHON_INSTALL_TEMPLATE an absolute path to be
+# consistent with all other installation paths.
+if(CMAKE_INSTALL_PREFIX)
+  set(PYTHON_INSTALL_TEMPLATE "${CMAKE_INSTALL_PREFIX}")
+else(CMAKE_INSTALL_PREFIX)
+  set(PYTHON_INSTALL_TEMPLATE "/")
+endif(CMAKE_INSTALL_PREFIX)
+
+execute_process(
+  COMMAND
+  ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='${PYTHON_INSTALL_TEMPLATE}')"
+  OUTPUT_VARIABLE PYTHON_INSTDIR
+  OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+if(HAVE_XIO)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${Xio_INCLUDE_DIR}")
+  list(APPEND EXTRALIBS ${Xio_LIBRARY} ibverbs rdmacm pthread rt)
+endif(HAVE_XIO)
+
+# sort out which allocator to use
+if(Tcmalloc_FOUND)
+  set(ALLOC_LIBS tcmalloc)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
+  set(TCMALLOC_srcs perfglue/heap_profiler.cc)
+elseif(NOT Tcmalloc_FOUND AND JEMALLOC_FOUND)
+  set(ALLOC_LIBS jemalloc)
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
+  set(TCMALLOC_srcs perfglue/disabled_heap_profiler.cc)
+elseif(${ALLOCATOR} STREQUAL "libc")
+  set(TCMALLOC_srcs perfglue/disabled_heap_profiler.cc)
+endif()
+
+# tcmalloc heap profiler
+set(heap_profiler_files ${TCMALLOC_srcs})
+add_library(heap_profiler_objs OBJECT ${heap_profiler_files})
+
+# Common infrastructure
+configure_file(
+  ${CMAKE_SOURCE_DIR}/src/ceph_ver.h.in.cmake
+  ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h
+  @ONLY)
+
+set(arch_files
+  arch/arm.c
+  arch/intel.c
+  arch/probe.cc)
+
+set(auth_files
+  auth/AuthAuthorizeHandler.cc
+  auth/AuthClientHandler.cc
+  auth/AuthSessionHandler.cc
+  auth/AuthMethodList.cc
+  auth/cephx/CephxAuthorizeHandler.cc
+  auth/cephx/CephxClientHandler.cc
+  auth/cephx/CephxProtocol.cc
+  auth/cephx/CephxSessionHandler.cc
+  auth/none/AuthNoneAuthorizeHandler.cc
+  auth/unknown/AuthUnknownAuthorizeHandler.cc
+  auth/Crypto.cc
+  auth/KeyRing.cc
+  auth/RotatingKeyRing.cc)
+
+set(mds_files)
+list(APPEND mds_files
+  mds/MDSMap.cc
+  mds/FSMap.cc
+  mds/inode_backtrace.cc
+  mds/mdstypes.cc)
+
+set(crush_srcs
+  crush/builder.c
+  crush/mapper.c
+  crush/crush.c
+  crush/hash.c
+  crush/CrushWrapper.cc
+  crush/CrushCompiler.cc
+  crush/CrushTester.cc)
+
+add_library(crush STATIC ${crush_srcs})
+
+add_subdirectory(json_spirit)
+
+include_directories("${CMAKE_SOURCE_DIR}/src/xxHash")
+
+set(xio_common_srcs)
+if(HAVE_XIO)
+  list(APPEND xio_common_srcs
+    msg/xio/XioConnection.cc
+    msg/xio/XioMsg.cc
+    msg/xio/XioPool.cc
+    msg/xio/XioMessenger.cc
+    msg/xio/XioPortal.cc
+    msg/xio/QueueStrategy.cc)
+endif(HAVE_XIO)
+
+if(HAVE_GOOD_YASM_ELF64)
+  set(yasm_srcs
+    common/crc32c_intel_fast_asm.S
+    common/crc32c_intel_fast_zero_asm.S)
+endif(HAVE_GOOD_YASM_ELF64)
+
+set(libcommon_files
+  ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h
+  ceph_ver.c
+  common/AsyncOpTracker.cc
+  common/DecayCounter.cc
+  common/LogClient.cc
+  common/LogEntry.cc
+  common/PrebufferedStreambuf.cc
+  common/BackTrace.cc
+  common/perf_counters.cc
+  common/mutex_debug.cc
+  common/Mutex.cc
+  common/OutputDataSocket.cc
+  common/admin_socket.cc
+  common/admin_socket_client.cc
+  common/bloom_filter.cc
+  common/Readahead.cc
+  ${crush_srcs}
+  common/cmdparse.cc
+  common/escape.c
+  common/io_priority.cc
+  common/Clock.cc
+  common/ceph_time.cc
+  common/Throttle.cc
+  common/Timer.cc
+  common/Finisher.cc
+  common/environment.cc
+  common/sctp_crc32.c
+  common/crc32c.cc
+  common/crc32c_intel_baseline.c
+  common/crc32c_intel_fast.c
+  ${yasm_srcs}
+  xxHash/xxhash.c
+  common/assert.cc
+  common/run_cmd.cc
+  common/WorkQueue.cc
+  common/ConfUtils.cc
+  common/MemoryModel.cc
+  common/fd.cc
+  common/xattr.c
+  common/str_list.cc
+  common/str_map.cc
+  common/snap_types.cc
+  common/errno.cc
+  common/TrackedOp.cc
+  common/SloppyCRCMap.cc
+  common/types.cc
+  common/TextTable.cc
+  log/Log.cc
+  log/SubsystemMap.cc
+  mon/MonCap.cc
+  mon/MonClient.cc
+  mon/MonMap.cc
+  msg/simple/Accepter.cc
+  msg/simple/DispatchQueue.cc
+  msg/Message.cc
+  osd/ECMsgTypes.cc
+  osd/HitSet.cc
+  common/RefCountedObj.cc
+  msg/Messenger.cc
+  msg/simple/Pipe.cc
+  msg/simple/PipeConnection.cc
+  msg/simple/SimpleMessenger.cc
+  msg/async/AsyncConnection.cc
+  msg/async/AsyncMessenger.cc
+  msg/async/Event.cc
+  msg/async/EventEpoll.cc
+  msg/async/EventSelect.cc
+  msg/async/net_handler.cc
+  ${xio_common_srcs}
+  msg/msg_types.cc
+  common/hobject.cc
+  osd/OSDMap.cc
+  common/histogram.cc
+  osd/osd_types.cc
+  common/blkdev.cc
+  common/common_init.cc
+  common/pipe.c
+  common/ceph_argparse.cc
+  common/ceph_context.cc
+  common/buffer.cc
+  common/code_environment.cc
+  common/dout.cc
+  common/signal.cc
+  common/simple_spin.cc
+  common/Thread.cc
+  common/Formatter.cc
+  common/HTMLFormatter.cc
+  common/HeartbeatMap.cc
+  common/PluginRegistry.cc
+  common/ceph_fs.cc
+  common/ceph_hash.cc
+  common/ceph_strings.cc
+  common/ceph_frag.cc
+  common/config.cc
+  common/utf8.c
+  common/mime.c
+  common/strtol.cc
+  common/page.cc
+  common/lockdep.cc
+  common/version.cc
+  common/hex.cc
+  common/entity_name.cc
+  common/ceph_crypto.cc
+  common/ceph_crypto_cms.cc
+  common/ceph_json.cc
+  common/ipaddr.cc
+  common/pick_address.cc
+  common/address_helper.cc
+  common/linux_version.c
+  common/TracepointProvider.cc
+  common/Cycles.cc
+  common/scrub_types.cc
+  osdc/Striper.cc
+  osdc/Objecter.cc
+  common/Graylog.cc
+  common/fs_types.cc
+  ${arch_files}
+  ${auth_files}
+  ${mds_files})
+set(mon_common_files
+  auth/AuthSessionHandler.cc
+  auth/cephx/CephxSessionHandler.cc
+  erasure-code/ErasureCodePlugin.cc)
+add_library(mon_common_objs OBJECT ${mon_common_files})
+set(common_mountcephfs_files
+  common/armor.c
+  common/safe_io.c
+  common/module.c
+  common/addr_parsing.c)
+add_library(common_mountcephfs_objs OBJECT
+  ${common_mountcephfs_files})
+
+if(${HAVE_GPERFTOOLS})
+  list(APPEND libcommon_files
+    perfglue/cpu_profiler.cc)
+else()
+  list(APPEND libcommon_files
+    perfglue/disabled_stubs.cc)
+endif(${HAVE_GPERFTOOLS})
+
+if(${ENABLE_SHARED})
+  list(APPEND libcommon_files
+    $<TARGET_OBJECTS:global_common_objs>)
+endif(${ENABLE_SHARED})
+
+add_library(common STATIC ${libcommon_files}
+  $<TARGET_OBJECTS:mon_common_objs>
+  $<TARGET_OBJECTS:common_mountcephfs_objs>)
+
+set_source_files_properties(${CMAKE_SOURCE_DIR}/src/ceph_ver.c
+  ${CMAKE_SOURCE_DIR}/src/common/version.cc
+  ${CMAKE_SOURCE_DIR}/src/test/encoding/ceph_dencoder.cc
+  APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_BINARY_DIR}/src/include/ceph_ver.h)
+
+if(${HAVE_GPERFTOOLS})
+  target_link_libraries(common profiler)
+endif(${HAVE_GPERFTOOLS})
+
+add_library(common_utf8 STATIC common/utf8.c)
+
+target_link_libraries(common json_spirit common_utf8 erasure_code rt uuid ${CRYPTO_LIBS} ${Boost_LIBRARIES} ${BLKID_LIBRARIES} ${EXECINFO_LIBRARIES})
+
+if(${WITH_LTTNG})
+  add_subdirectory(tracing)
+endif(${WITH_LTTNG})
+
+set(libglobal_srcs
+  global/global_init.cc
+  global/pidfile.cc
+  global/signal_handler.cc)
+set(global_common_files
+  global/global_context.cc)
+add_library(global_common_objs OBJECT ${global_common_files})
+add_library(global STATIC ${libglobal_srcs}
+  $<TARGET_OBJECTS:global_common_objs>)
+target_link_libraries(global common ${CMAKE_THREAD_LIBS_INIT} ${CRYPTO_LIBS}
+  ${EXTRALIBS})
+if(${WITH_LTTNG})
+  target_link_libraries(global lttng-ust dl)
+endif(${WITH_LTTNG})
+if(${ENABLE_SHARED})
+  set_target_properties(global PROPERTIES
+    OUTPUT_NAME ceph-global VERSION "1.0.0" SOVERSION "1")
+endif(${ENABLE_SHARED})
+
+# rados object classes
+add_subdirectory(cls)
+
+# RADOS client/library
+set(osdc_files
+  osdc/Objecter.cc
+  osdc/Filer.cc)
+set(osdc_rbd_files
+  osdc/ObjectCacher.cc
+  osdc/Striper.cc)
+add_library(osdc_rbd_objs OBJECT ${osdc_rbd_files})
+add_library(osdc STATIC ${osdc_files} $<TARGET_OBJECTS:osdc_rbd_objs>)
+
+set(librados_srcs
+  librados/librados.cc
+  librados/RadosClient.cc
+  librados/IoCtxImpl.cc
+  librados/snap_set_diff.cc
+  librados/RadosXattrIter.cc
+  )
+add_library(librados ${CEPH_SHARED} ${librados_srcs}
+  $<TARGET_OBJECTS:cls_references_objs>
+  $<TARGET_OBJECTS:common_util_obj>)
+add_dependencies(librados osdc)
+# LINK_PRIVATE instead of PRIVATE is used to backward compatibility with cmake 2.8.11
+target_link_libraries(librados LINK_PRIVATE osdc osd os global common cls_lock_client
+  ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS})
+if(${ENABLE_SHARED})
+  set_target_properties(librados PROPERTIES OUTPUT_NAME rados VERSION 2.0.0
+    SOVERSION 2)
+endif(${ENABLE_SHARED})
+
+add_library(librados_api STATIC common/buffer.cc librados/librados.cc)
+
+install(FILES include/rados/librados.h
+  include/rados/rados_types.h
+  include/rados/rados_types.hpp
+  include/rados/librados.hpp
+  include/buffer.h
+  include/buffer_fwd.h
+  include/page.h
+  include/crc32c.h
+  DESTINATION include/rados)
+install(TARGETS librados DESTINATION lib)
+
+add_subdirectory(libradosstriper)
+
+add_executable(ceph_scratchtool tools/scratchtool.c)
+target_link_libraries(ceph_scratchtool librados global)
+install(TARGETS ceph_scratchtool DESTINATION bin/debug)
+
+add_executable(ceph_scratchtoolpp tools/scratchtoolpp.cc)
+target_link_libraries(ceph_scratchtoolpp librados global)
+install(TARGETS ceph_scratchtoolpp DESTINATION bin/debug)
+
+add_executable(ceph_radosacl tools/radosacl.cc)
+target_link_libraries(ceph_radosacl librados global)
+install(TARGETS ceph_radosacl DESTINATION bin/debug)
+
+add_executable(ceph-osdomap-tool tools/ceph_osdomap_tool.cc)
+target_link_libraries(ceph-osdomap-tool os global ${Boost_PROGRAM_OPTIONS_LIBRARY})
+install(TARGETS ceph-osdomap-tool DESTINATION bin)
+
+add_executable(ceph-monstore-tool tools/ceph_monstore_tool.cc)
+target_link_libraries(ceph-monstore-tool os global ${Boost_PROGRAM_OPTIONS_LIBRARY})
+install(TARGETS ceph-monstore-tool DESTINATION bin)
+
+add_executable(ceph-objectstore-tool
+  tools/ceph_objectstore_tool.cc
+  tools/rebuild_mondb.cc
+  tools/RadosDump.cc
+  $<TARGET_OBJECTS:common_util_obj>)
+target_link_libraries(ceph-objectstore-tool tcmalloc osd os global ${Boost_PROGRAM_OPTIONS_LIBRARY} fuse dl)
+install(TARGETS ceph-objectstore-tool DESTINATION bin)
+
+
+set(rados_srcs
+  tools/rados/rados.cc
+  tools/RadosDump.cc
+  tools/rados/RadosImport.cc
+  tools/rados/PoolDump.cc
+  common/obj_bencher.cc)
+add_executable(rados ${rados_srcs})
+target_link_libraries(rados librados global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} libradosstriper)
+
+if (WITH_CEPHFS)
+  set(cephfs_journal_tool_srcs
+    tools/cephfs/cephfs-journal-tool.cc
+    tools/cephfs/JournalTool.cc
+    tools/cephfs/JournalFilter.cc
+    tools/cephfs/JournalScanner.cc
+    tools/cephfs/EventOutput.cc
+    tools/cephfs/Dumper.cc
+    tools/cephfs/Resetter.cc
+    tools/cephfs/RoleSelector.cc
+    tools/cephfs/MDSUtility.cc)
+  add_executable(cephfs-journal-tool ${cephfs_journal_tool_srcs})
+  target_link_libraries(cephfs-journal-tool librados mds osdc global
+                        ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+  set(cephfs_table_tool_srcs
+    tools/cephfs/cephfs-table-tool.cc
+    tools/cephfs/TableTool.cc
+    tools/cephfs/RoleSelector.cc
+    tools/cephfs/MDSUtility.cc)
+  add_executable(cephfs-table-tool ${cephfs_table_tool_srcs})
+  target_link_libraries(cephfs-table-tool librados mds osdc global
+                        ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+  set(cephfs_data_scan_srcs
+    tools/cephfs/cephfs-data-scan.cc
+    tools/cephfs/DataScan.cc
+    tools/cephfs/RoleSelector.cc
+    tools/cephfs/MDSUtility.cc)
+  add_executable(cephfs-data-scan ${cephfs_data_scan_srcs})
+  target_link_libraries(cephfs-data-scan librados mds osdc global
+                        cls_cephfs_client
+                        ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+endif (WITH_CEPHFS)
+
+set(librados_config_srcs
+  librados-config.cc)
+add_executable(librados-config ${librados_config_srcs})
+target_link_libraries(librados-config librados global ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS})
+
+install(TARGETS rados librados-config DESTINATION bin)
+
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/
+  DESTINATION ${PYTHON_INSTDIR})
+
+add_subdirectory(pybind)
+add_subdirectory(ceph-disk)
+add_subdirectory(ceph-detect-init)
+
+## dencoder
+set(dencoder_srcs
+  test/encoding/ceph_dencoder.cc
+  $<TARGET_OBJECTS:krbd_objs>
+  common/secret.c
+  common/TextTable.cc
+  )
+if(${WITH_RADOSGW})
+  list(APPEND dencoder_srcs
+    rgw/rgw_dencoder.cc
+  )
+  set(DENCODER_EXTRALIBS
+    rgw_a
+    cls_version_client
+    cls_log_client
+    cls_refcount_client
+    cls_user_client
+    cls_statelog_client
+    cls_rgw_client
+    curl
+    expat
+    fcgi
+    resolv
+  )
+endif(${WITH_RADOSGW})
+if(${WITH_RBD})
+  set(DENCODER_EXTRALIBS
+      ${DENCODER_EXTRALIBS}
+      rbd_replay_types)
+endif(${WITH_RBD})
+
+add_executable(ceph-dencoder ${dencoder_srcs})
+target_link_libraries(ceph-dencoder
+  librados
+  librbd
+  global
+  osd
+  mds
+  mon
+  osdc
+  journal
+  ${DENCODER_EXTRALIBS}
+  cls_lock_client
+  cls_refcount_client
+  cls_log_client
+  cls_statelog_client
+  cls_version_client
+  cls_replica_log_client
+  cls_kvs
+  cls_user_client
+  cls_journal_client
+  cls_timeindex_client
+  blkid
+  udev
+  keyutils
+  rbd_replay
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+# Monitor
+set(lib_mon_srcs
+  auth/cephx/CephxKeyServer.cc
+  auth/cephx/CephxServiceHandler.cc
+  auth/AuthServiceHandler.cc
+  ${osd_mon_files} mon/Paxos.cc
+  mon/PaxosService.cc
+  mon/OSDMonitor.cc
+  mon/MDSMonitor.cc
+  mon/MonmapMonitor.cc
+  mon/LogMonitor.cc
+  mon/AuthMonitor.cc
+  mon/Elector.cc
+  mon/HealthMonitor.cc
+  ${os_mon_files}
+  mon/DataHealthService.cc
+  mon/PGMonitor.cc
+  mon/PGMap.cc
+  mon/ConfigKeyService.cc)
+
+set(common_util_src
+  common/util.cc)
+add_library(common_util_obj OBJECT ${common_util_src})
+add_library(mon STATIC ${lib_mon_srcs} $<TARGET_OBJECTS:mon_common_objs>
+  $<TARGET_OBJECTS:kv_objs> $<TARGET_OBJECTS:osd_mon_objs>
+  $<TARGET_OBJECTS:common_util_obj> $<TARGET_OBJECTS:heap_profiler_objs>)
+target_link_libraries(mon ${ALLOC_LIBS})
+
+set(ceph_mon_srcs
+  ceph_mon.cc
+  common/TextTable.cc)
+add_executable(ceph-mon ${ceph_mon_srcs})
+add_dependencies(ceph-mon erasure_code_plugins)
+      target_link_libraries(ceph-mon mon common os global ${EXTRALIBS}
+  ${CMAKE_DL_LIBS})
+install(TARGETS ceph-mon DESTINATION bin)
+
+# OSD
+if(${HAVE_XFS})
+  set(libos_xfs_srcs
+    os/filestore/XfsFileStoreBackend.cc
+    os/fs/XFS.cc)
+endif(${HAVE_XFS})
+set(libos_srcs
+  os/ObjectStore.cc
+  os/Transaction.cc
+  os/filestore/chain_xattr.cc
+  os/filestore/BtrfsFileStoreBackend.cc
+  os/filestore/DBObjectMap.cc
+  os/filestore/FileJournal.cc
+  os/filestore/FileStore.cc
+  os/filestore/JournalThrottle.cc
+  os/filestore/GenericFileStoreBackend.cc
+  os/filestore/JournalingObjectStore.cc
+  os/filestore/HashIndex.cc
+  os/filestore/IndexManager.cc
+  os/filestore/LFNIndex.cc
+  os/filestore/WBThrottle.cc
+  os/filestore/ZFSFileStoreBackend.cc
+  os/memstore/MemStore.cc
+  os/kstore/KStore.cc
+  os/kstore/kstore_types.cc
+  os/bluestore/kv.cc
+  os/bluestore/Allocator.cc
+  os/bluestore/BlockDevice.cc
+  os/bluestore/BlueFS.cc
+  os/bluestore/bluefs_types.cc
+  os/bluestore/BlueRocksEnv.cc
+  os/bluestore/BlueStore.cc
+  os/bluestore/bluestore_types.cc
+  os/bluestore/FreelistManager.cc
+  os/bluestore/KernelDevice.cc
+  os/bluestore/StupidAllocator.cc
+  os/fs/FS.cc
+  ${libos_xfs_srcs})
+if(${HAVE_LIBFUSE})
+  list(APPEND libos_srcs
+    os/FuseStore.cc)
+endif(${HAVE_LIBFUSE})
+if(WITH_SPDK)
+  list(APPEND libos_srcs
+    os/bluestore/NVMEDevice.cc)
+endif(WITH_SPDK)
+
+if(WITH_SPDK)
+  add_custom_target(build_spdk
+    COMMAND
+    $(MAKE) DPDK_INC_DIR=${DPDK_INCLUDE_DIR}
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/spdk/lib
+    COMMENT "spdk building")
+  # TODO: should use add_library(spdk INTERFACE IMPORTED) instead in new cmake,
+  # if INTERFACE is supported.
+  foreach(lib nvme memory util)
+    add_library(spdk_${lib} STATIC IMPORTED)
+    add_dependencies(spdk_${lib} build_spdk)
+    set_target_properties(spdk_${lib} PROPERTIES
+      IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/src/spdk/lib/${lib}/libspdk_${lib}.a"
+      INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/spdk/include")
+    list(APPEND SPDK_LIBRARIES spdk_${lib})
+  endforeach()
+endif(WITH_SPDK)
+
+# make rocksdb statically
+add_custom_target(build_rocksdb
+    COMMAND
+    PORTABLE=1 $(MAKE) static_lib EXTRA_CXXFLAGS='-fPIC -Wno-unused-variable'
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/rocksdb
+    COMMENT "rocksdb building")
+
+# add a imported library for librocksdb.a
+add_library(rocksdb STATIC IMPORTED)
+set_property(TARGET rocksdb PROPERTY IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/src/rocksdb/librocksdb.a")
+add_dependencies(rocksdb build_rocksdb)
+set(ROCKSDB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/src/rocksdb/include)
+
+add_subdirectory(kv)
+
+add_library(os STATIC ${libos_srcs} $<TARGET_OBJECTS:kv_objs>)
+if(${HAVE_LIBAIO})
+  target_link_libraries(os aio)
+endif(${HAVE_LIBAIO})
+if(${HAVE_LIBFUSE})
+  target_link_libraries(os ${FUSE_LIBRARIES})
+endif(${HAVE_LIBFUSE})
+if(WITH_SPDK)
+  target_link_libraries(os
+    ${SPDK_LIBRARIES}
+    ${DPDK_LIBRARIES}
+    ${PCIACCESS_LIBRARIES})
+  target_include_directories(os
+    PRIVATE
+    ${DPDK_INCLUDE_DIR}
+    ${PCIACCESS_INCLUDE_DIR})
+endif(WITH_SPDK)
+target_link_libraries(os kv)
+
+set(cls_references_files objclass/class_api.cc)
+add_library(cls_references_objs OBJECT ${cls_references_files})
+
+set(osdc_osd_srcs
+  osdc/Objecter.cc
+  osdc/Striper.cc)
+
+set(osd_srcs
+  osd/OSD.cc
+  osd/Watch.cc
+  osd/ClassHandler.cc
+  osd/OpRequest.cc
+  osd/PG.cc
+  osd/PGLog.cc
+  osd/ReplicatedPG.cc
+  osd/ReplicatedBackend.cc
+  osd/ECBackend.cc
+  osd/ECTransaction.cc
+  osd/PGBackend.cc
+  osd/OSDCap.cc
+  osd/Watch.cc
+  osd/ClassHandler.cc
+  osd/OpRequest.cc
+  common/TrackedOp.cc
+  osd/SnapMapper.cc
+  osd/ScrubStore.cc
+  osd/osd_types.cc
+  osd/ECUtil.cc
+  objclass/class_api.cc
+  ${osdc_osd_srcs})
+set(osd_mon_files
+  mon/Monitor.cc)
+add_library(osd_mon_objs OBJECT ${osd_mon_files})
+add_library(osd STATIC ${osd_srcs} $<TARGET_OBJECTS:osd_mon_objs>
+  $<TARGET_OBJECTS:cls_references_objs> $<TARGET_OBJECTS:heap_profiler_objs>)
+target_link_libraries(osd dl leveldb ${ALLOC_LIBS})
+
+set(ceph_osd_srcs
+  ceph_osd.cc
+  objclass/class_api.cc)
+add_executable(ceph-osd ${ceph_osd_srcs}
+  $<TARGET_OBJECTS:common_util_obj>)
+add_dependencies(ceph-osd erasure_code_plugins)
+target_link_libraries(ceph-osd osd os global ${BLKID_LIBRARIES})
+if(${HAVE_LIBFUSE})
+  target_link_libraries(ceph-osd ${FUSE_LIBRARIES})
+endif(${HAVE_LIBFUSE})
+install(TARGETS ceph-osd DESTINATION bin)
+
+# MDS
+if(${WITH_MDS})
+  set(mds_srcs
+    mds/Capability.cc
+    mds/MDSDaemon.cc
+    mds/MDSRank.cc
+    mds/Beacon.cc
+    mds/flock.cc
+    mds/locks.c
+    mds/journal.cc
+    mds/Server.cc
+    mds/Mutation.cc
+    mds/MDCache.cc
+    mds/RecoveryQueue.cc
+    mds/StrayManager.cc
+    mds/Locker.cc
+    mds/Migrator.cc
+    mds/MDBalancer.cc
+    mds/CDentry.cc
+    mds/CDir.cc
+    mds/CInode.cc
+    mds/LogEvent.cc
+    mds/MDSTable.cc
+    mds/InoTable.cc
+    mds/JournalPointer.cc
+    mds/MDSTableClient.cc
+    mds/MDSTableServer.cc
+    mds/ScrubStack.cc
+    mds/DamageTable.cc
+    mds/SimpleLock.cc
+    mds/SnapRealm.cc
+    mds/SnapServer.cc
+    mds/snap.cc
+    mds/SessionMap.cc
+    mds/MDSContext.cc
+    mds/MDSAuthCaps.cc
+    mds/MDLog.cc
+    ${CMAKE_SOURCE_DIR}/src/common/TrackedOp.cc
+    ${CMAKE_SOURCE_DIR}/src/osdc/Journaler.cc)
+  add_library(mds ${mds_srcs}
+    $<TARGET_OBJECTS:heap_profiler_objs>)
+  target_link_libraries(mds ${ALLOC_LIBS})
+  set(ceph_mds_srcs
+    ceph_mds.cc)
+  add_executable(ceph-mds ${ceph_mds_srcs}
+    $<TARGET_OBJECTS:common_util_obj>)
+  target_link_libraries(ceph-mds mds osdc ${CMAKE_DL_LIBS} global
+    ${Boost_THREAD_LIBRARY})
+  install(TARGETS ceph-mds DESTINATION bin)
+endif(${WITH_MDS})
+
+add_subdirectory(erasure-code)
+
+set(crushtool_srcs
+    tools/crushtool.cc)
+add_executable(crushtool ${crushtool_srcs})
+target_link_libraries(crushtool global)
+install(TARGETS crushtool DESTINATION bin)
+
+# Support/Tools
+add_subdirectory(gmock)
+add_subdirectory(test)
+set(cephfs_srcs cephfs.cc)
+add_executable(cephfstool ${cephfs_srcs})
+target_link_libraries(cephfstool common ${EXTRALIBS})
+set_target_properties(cephfstool PROPERTIES OUTPUT_NAME cephfs)
+install(TARGETS cephfstool DESTINATION bin)
+
+add_subdirectory(compressor)
+
+add_executable(ceph-client-debug tools/ceph-client-debug.cc)
+target_link_libraries(ceph-client-debug cephfs librados global common)
+install(TARGETS ceph-client-debug DESTINATION bin/debug)
+
+add_executable(ceph-kvstore-tool tools/ceph_kvstore_tool.cc)
+target_link_libraries(ceph-kvstore-tool os global ${UNITTEST_CXX_FLAGS})
+install(TARGETS ceph-kvstore-tool DESTINATION bin)
+
+set(ceph_conf_srcs
+  tools/ceph_conf.cc)
+add_executable(ceph-conf ${ceph_conf_srcs})
+target_link_libraries(ceph-conf global)
+install(TARGETS ceph-conf DESTINATION bin)
+
+set(monmaptool_srcs
+  tools/monmaptool.cc)
+add_executable(monmaptool ${monmaptool_srcs})
+target_link_libraries(monmaptool global)
+install(TARGETS monmaptool DESTINATION bin)
+
+set(osdomaptool_srcs
+  tools/osdmaptool.cc)
+add_executable(osdmaptool ${osdomaptool_srcs})
+target_link_libraries(osdmaptool global)
+install(TARGETS osdmaptool DESTINATION bin)
+
+set(ceph_psim_srcs
+  tools/psim.cc)
+add_executable(ceph-psim ${ceph_psim_srcs})
+target_link_libraries(ceph-psim global)
+install(TARGETS ceph-psim DESTINATION bin)
+
+set(ceph_authtool_srcs
+  tools/ceph_authtool.cc)
+add_executable(ceph-authtool ${ceph_authtool_srcs})
+target_link_libraries(ceph-authtool global ${EXTRALIBS} ${CRYPTO_LIBS})
+install(TARGETS ceph-authtool DESTINATION bin)
+
+configure_file(${CMAKE_SOURCE_DIR}/src/ceph-coverage.in
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-coverage @ONLY)
+
+configure_file(${CMAKE_SOURCE_DIR}/src/ceph-debugpack.in
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-debugpack @ONLY)
+
+configure_file(${CMAKE_SOURCE_DIR}/src/ceph.in
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph @ONLY)
+
+configure_file(${CMAKE_SOURCE_DIR}/src/ceph-crush-location.in
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-crush-location @ONLY)
+
+configure_file(${CMAKE_SOURCE_DIR}/src/init-ceph.in
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/init-ceph @ONLY)
+
+install(PROGRAMS
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-debugpack
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ceph-coverage
+  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/init-ceph
+  ${CMAKE_SOURCE_DIR}/src/ceph-run
+  ${CMAKE_SOURCE_DIR}/src/vstart.sh
+  ${CMAKE_SOURCE_DIR}/src/ceph-clsinfo
+  DESTINATION bin)
+
+install(FILES
+  ${CMAKE_SOURCE_DIR}/doc/start/ceph.conf
+  DESTINATION ${sysconfdir}/ceph/ RENAME ceph.conf.example)
+
+install(PROGRAMS
+  ${CMAKE_SOURCE_DIR}/src/ceph_common.sh
+  DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/ceph)
+
+install(PROGRAMS
+  ${CMAKE_SOURCE_DIR}/src/ceph-create-keys
+#  ${CMAKE_SOURCE_DIR}/src/ceph-disk
+  ${CMAKE_SOURCE_DIR}/src/ceph-disk-udev
+  DESTINATION sbin)
+
+set(parse_secret_files
+  common/secret.c)
+add_library(parse_secret_objs OBJECT ${parse_secret_files})
+
+if(WITH_LIBCEPHFS)
+  set(libclient_srcs
+    client/Client.cc
+    client/Dentry.cc
+    client/Inode.cc
+    client/MetaRequest.cc
+    client/ClientSnapRealm.cc
+    client/MetaSession.cc
+    client/Trace.cc
+    client/posix_acl.cc)
+  add_library(client ${libclient_srcs})
+  target_link_libraries(client osdc mds)
+  set(libcephfs_srcs libcephfs.cc)
+  add_library(cephfs ${CEPH_SHARED} ${libcephfs_srcs}
+    $<TARGET_OBJECTS:cls_references_objs>
+    $<TARGET_OBJECTS:common_util_obj>)
+  target_link_libraries(cephfs LINK_PRIVATE client osdc osd os global common cls_lock_client
+    ${BLKID_LIBRARIES}
+    ${CRYPTO_LIBS} ${EXTRALIBS})
+if(${ENABLE_SHARED})
+  set_target_properties(cephfs PROPERTIES OUTPUT_NAME cephfs VERSION 1.0.0
+    SOVERSION 1)
+endif(${ENABLE_SHARED})
+  install(TARGETS cephfs DESTINATION lib)
+  install(DIRECTORY
+    "${CMAKE_SOURCE_DIR}/src/include/cephfs"
+    DESTINATION include)
+  set(ceph_syn_srcs
+    ceph_syn.cc
+    client/SyntheticClient.cc)
+  add_executable(ceph-syn ${ceph_syn_srcs})
+  target_link_libraries(ceph-syn client global)
+
+  set(mount_ceph_srcs
+    mount/mount.ceph.c)
+  add_executable(mount.ceph ${mount_ceph_srcs}
+    $<TARGET_OBJECTS:parse_secret_objs>
+    $<TARGET_OBJECTS:common_mountcephfs_objs>)
+  target_link_libraries(mount.ceph keyutils)
+
+  install(TARGETS ceph-syn DESTINATION bin)
+  install(TARGETS mount.ceph DESTINATION ${CMAKE_INSTALL_SBINDIR})
+
+  if(HAVE_LIBFUSE)
+    set(ceph_fuse_srcs
+      ceph_fuse.cc
+      client/fuse_ll.cc)
+    add_executable(ceph-fuse ${ceph_fuse_srcs})
+    target_link_libraries(ceph-fuse ${ALLOC_LIBS} ${FUSE_LIBRARIES} client global)
+    set_target_properties(ceph-fuse PROPERTIES COMPILE_FLAGS "-I${FUSE_INCLUDE_DIRS}")
+    install(TARGETS ceph-fuse DESTINATION bin)
+    install(PROGRAMS mount.fuse.ceph DESTINATION ${CMAKE_INSTALL_SBINDIR})
+  endif(HAVE_LIBFUSE)
+endif(WITH_LIBCEPHFS)
+
+set(journal_srcs
+  journal/AsyncOpTracker.cc
+  journal/Entry.cc
+  journal/Future.cc
+  journal/FutureImpl.cc
+  journal/Journaler.cc
+  journal/JournalMetadata.cc
+  journal/JournalPlayer.cc
+  journal/JournalRecorder.cc
+  journal/JournalTrimmer.cc
+  journal/ObjectPlayer.cc
+  journal/ObjectRecorder.cc
+  journal/Utils.cc)
+add_library(journal ${journal_srcs})
+
+add_library(krbd_objs OBJECT krbd.cc)
+
+if(${WITH_RBD})
+  add_subdirectory(librbd)
+
+  set(rbd_mirror_internal
+    tools/rbd_mirror/ClusterWatcher.cc
+    tools/rbd_mirror/ImageReplayer.cc
+    tools/rbd_mirror/ImageDeleter.cc
+    tools/rbd_mirror/ImageSync.cc
+    tools/rbd_mirror/ImageSyncThrottler.cc
+    tools/rbd_mirror/Mirror.cc
+    tools/rbd_mirror/PoolWatcher.cc
+    tools/rbd_mirror/Replayer.cc
+    tools/rbd_mirror/Threads.cc
+    tools/rbd_mirror/types.cc
+    tools/rbd_mirror/image_replayer/BootstrapRequest.cc
+    tools/rbd_mirror/image_replayer/CloseImageRequest.cc
+    tools/rbd_mirror/image_replayer/CreateImageRequest.cc
+    tools/rbd_mirror/image_replayer/OpenImageRequest.cc
+    tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc
+    tools/rbd_mirror/image_replayer/ReplayStatusFormatter.cc
+    tools/rbd_mirror/image_sync/ImageCopyRequest.cc
+    tools/rbd_mirror/image_sync/ObjectCopyRequest.cc
+    tools/rbd_mirror/image_sync/SnapshotCopyRequest.cc
+    tools/rbd_mirror/image_sync/SnapshotCreateRequest.cc
+    tools/rbd_mirror/image_sync/SyncPointCreateRequest.cc
+    tools/rbd_mirror/image_sync/SyncPointPruneRequest.cc)
+  add_library(rbd_mirror_internal STATIC ${rbd_mirror_internal})
+  
+  add_executable(rbd-mirror
+    tools/rbd_mirror/main.cc
+    common/ContextCompletion.cc)
+  target_link_libraries(rbd-mirror
+    rbd_mirror_internal
+    rbd_internal
+    rbd_api
+    rbd_types
+    journal
+    librados
+    osdc
+    cls_rbd_client
+    cls_lock_client
+    cls_journal_client
+    global)
+
+  set(rbd_srcs
+    tools/rbd/rbd.cc
+    tools/rbd/ArgumentTypes.cc
+    tools/rbd/IndentStream.cc
+    tools/rbd/OptionPrinter.cc
+    tools/rbd/Shell.cc
+    tools/rbd/Utils.cc
+    tools/rbd/action/BenchWrite.cc
+    tools/rbd/action/Children.cc
+    tools/rbd/action/Clone.cc
+    tools/rbd/action/Copy.cc
+    tools/rbd/action/Create.cc
+    tools/rbd/action/Diff.cc
+    tools/rbd/action/DiskUsage.cc
+    tools/rbd/action/Export.cc
+    tools/rbd/action/ExportDiff.cc
+    tools/rbd/action/Feature.cc
+    tools/rbd/action/Flatten.cc
+    tools/rbd/action/ImageMeta.cc
+    tools/rbd/action/Import.cc
+    tools/rbd/action/ImportDiff.cc
+    tools/rbd/action/Info.cc
+    tools/rbd/action/Journal.cc
+    tools/rbd/action/Kernel.cc
+    tools/rbd/action/List.cc
+    tools/rbd/action/Lock.cc
+    tools/rbd/action/MergeDiff.cc
+    tools/rbd/action/MirrorPool.cc
+    tools/rbd/action/MirrorImage.cc
+    tools/rbd/action/Nbd.cc
+    tools/rbd/action/ObjectMap.cc
+    tools/rbd/action/Remove.cc
+    tools/rbd/action/Rename.cc
+    tools/rbd/action/Resize.cc
+    tools/rbd/action/Snap.cc
+    tools/rbd/action/Status.cc
+    tools/rbd/action/Watch.cc
+    common/TextTable.cc)
+  add_executable(rbd ${rbd_srcs} $<TARGET_OBJECTS:common_util_obj>
+    $<TARGET_OBJECTS:parse_secret_objs>)
+  set_target_properties(rbd PROPERTIES OUTPUT_NAME rbd)
+  target_link_libraries(rbd librbd librados global common keyutils udev
+    ${Boost_REGEX_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY}
+    ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+  install(TARGETS rbd DESTINATION bin)
+  install(PROGRAMS ${CMAKE_SOURCE_DIR}/src/ceph-rbdnamer DESTINATION bin)
+  install(PROGRAMS ${CMAKE_SOURCE_DIR}/src/rbdmap DESTINATION bin)
+  add_subdirectory(rbd_replay)
+endif(${WITH_RBD})
+
+# RadosGW
+if(${WITH_KVS})
+  set(kvs_srcs
+    key_value_store/cls_kvs.cc)
+  add_library(cls_kvs SHARED ${kvs_srcs})
+  set_target_properties(cls_kvs PROPERTIES VERSION "1.0.0" SOVERSION "1")
+  install(TARGETS cls_kvs DESTINATION lib/rados-classes)
+endif(${WITH_KVS})
+
+if(${WITH_RADOSGW})
+
+  set(rgw_a_srcs
+    rgw/rgw_acl.cc
+    rgw/rgw_acl_s3.cc
+    rgw/rgw_acl_swift.cc
+    rgw/rgw_auth_s3.cc
+    rgw/rgw_basic_types.cc
+    rgw/rgw_bucket.cc
+    rgw/rgw_cache.cc
+    rgw/rgw_client_io.cc
+    rgw/rgw_common.cc
+    rgw/rgw_cors.cc
+    rgw/rgw_cors_s3.cc
+    rgw/rgw_dencoder.cc
+    rgw/rgw_env.cc
+    rgw/rgw_fcgi.cc
+    rgw/rgw_formats.cc
+    rgw/rgw_frontend.cc
+    rgw/rgw_gc.cc
+    rgw/rgw_http_client.cc
+    rgw/rgw_json_enc.cc
+    rgw/rgw_keystone.cc
+    rgw/rgw_ldap.cc
+    rgw/rgw_loadgen.cc
+    rgw/rgw_log.cc
+    rgw/rgw_metadata.cc
+    rgw/rgw_multi.cc
+    rgw/rgw_multi_del.cc
+    rgw/rgw_sync.cc
+    rgw/rgw_data_sync.cc
+    rgw/rgw_period_history.cc
+    rgw/rgw_period_puller.cc
+    rgw/rgw_period_pusher.cc
+    rgw/rgw_realm_reloader.cc
+    rgw/rgw_realm_watcher.cc
+    rgw/rgw_coroutine.cc
+    rgw/rgw_cr_rados.cc
+    rgw/rgw_object_expirer_core.cc
+    rgw/rgw_op.cc
+    rgw/rgw_os_lib.cc
+    rgw/rgw_policy_s3.cc
+    rgw/rgw_process.cc
+    rgw/rgw_quota.cc
+    rgw/rgw_rados.cc
+    rgw/rgw_replica_log.cc
+    rgw/rgw_request.cc
+    rgw/rgw_resolve.cc
+    rgw/rgw_rest_bucket.cc
+    rgw/rgw_rest.cc
+    rgw/rgw_rest_client.cc
+    rgw/rgw_rest_config.cc
+    rgw/rgw_rest_conn.cc
+    rgw/rgw_rest_log.cc
+    rgw/rgw_rest_metadata.cc
+    rgw/rgw_rest_opstate.cc
+    rgw/rgw_rest_realm.cc
+    rgw/rgw_rest_replica_log.cc
+    rgw/rgw_rest_s3.cc
+    rgw/rgw_rest_swift.cc
+    rgw/rgw_rest_usage.cc
+    rgw/rgw_rest_user.cc
+    rgw/rgw_swift_auth.cc
+    rgw/rgw_swift.cc
+    rgw/rgw_tools.cc
+    rgw/rgw_usage.cc
+    rgw/rgw_user.cc
+    rgw/rgw_website.cc
+    rgw/rgw_xml.cc
+    rgw/rgw_xml_enc.cc
+    )
+
+  set(civetweb_common_files civetweb/src/civetweb.c)
+  add_library(civetweb_common_objs OBJECT ${civetweb_common_files})
+  target_include_directories(civetweb_common_objs PUBLIC
+	"${CMAKE_SOURCE_DIR}/src/civetweb/include")
+  if(HAVE_OPENSSL)
+  set_property(TARGET civetweb_common_objs
+	       APPEND PROPERTY COMPILE_DEFINITIONS NO_SSL_DL=1)
+  target_include_directories(civetweb_common_objs PUBLIC
+	"${OPENSSL_INCLUDE_DIR}")
+  else(HAVE_OPENSSL)
+  endif(HAVE_OPENSSL)
+
+  add_library(rgw_a STATIC ${rgw_a_srcs})
+  target_link_libraries(rgw_a librados cls_rgw_client cls_refcount_client
+    cls_log_client cls_statelog_client cls_timeindex_client cls_version_client
+    cls_replica_log_client cls_user_client curl global expat)
+
+  if(HAVE_BOOST_ASIO_COROUTINE)
+    target_compile_definitions(rgw_a PUBLIC "HAVE_BOOST_ASIO_COROUTINE")
+  endif()
+
+  set(radosgw_srcs
+    rgw/rgw_fcgi_process.cc
+    rgw/rgw_loadgen_process.cc
+    rgw/rgw_civetweb.cc
+    rgw/rgw_civetweb_frontend.cc
+    rgw/rgw_civetweb_log.cc
+    rgw/rgw_main.cc)
+
+  set(radosgw_admin_srcs
+    rgw/rgw_admin.cc
+    rgw/rgw_orphan.cc)
+
+  set(radosgw_token_srcs
+    rgw/rgw_token.cc)
+
+  set(radosgw_object_expirer_srcs
+    rgw/rgw_object_expirer.cc)
+
+  set(librgw_srcs
+    rgw/librgw.cc
+    rgw/rgw_file.cc
+    )
+
+  add_library(rgw SHARED ${librgw_srcs})
+  target_link_libraries(rgw LINK_PRIVATE
+    rgw_a
+    librados
+    cls_rgw_client
+    cls_lock_client
+    cls_refcount_client
+    cls_log_client
+    cls_statelog_client
+    cls_timeindex_client
+    cls_version_client
+    cls_replica_log_client
+    cls_user_client
+    curl expat global
+    resolv)
+  set_target_properties(rgw PROPERTIES OUTPUT_NAME rgw VERSION 2.0.0
+    SOVERSION 1)
+
+  install(TARGETS rgw DESTINATION lib)
+  install(FILES
+    include/rados/librgw.h
+    include/rados/rgw_file.h
+  DESTINATION include/rados)
+
+  add_executable(radosgw ${radosgw_srcs}  $<TARGET_OBJECTS:civetweb_common_objs>)
+  target_link_libraries(radosgw rgw_a librados
+    cls_rgw_client cls_lock_client cls_refcount_client
+    cls_log_client cls_statelog_client cls_timeindex_client
+    cls_version_client cls_replica_log_client cls_user_client
+    curl expat global fcgi resolv ${OPENSSL_LIBRARIES} ${BLKID_LIBRARIES} ${OPENLDAP_LIBS}
+    ${ALLOC_LIBS})
+  install(TARGETS radosgw DESTINATION bin)
+
+  add_executable(radosgw-admin ${radosgw_admin_srcs})
+  target_link_libraries(radosgw-admin rgw_a librados
+    cls_rgw_client cls_lock_client cls_refcount_client
+    cls_log_client cls_statelog_client cls_timeindex_client
+    cls_version_client cls_replica_log_client cls_user_client
+    curl expat global fcgi resolv ${OPENSSL_LIBRARIES} ${BLKID_LIBRARIES})
+
+  install(TARGETS radosgw-admin DESTINATION bin)
+
+  add_executable(radosgw-token ${radosgw_token_srcs})
+  target_link_libraries(radosgw-token librados
+    global ${ALLOC_LIBS})
+  install(TARGETS radosgw-token DESTINATION bin)
+
+  add_executable(radosgw-object-expirer ${radosgw_object_expirer_srcs})
+  target_link_libraries(radosgw-object-expirer rgw_a librados
+    cls_rgw_client cls_lock_client cls_refcount_client
+    cls_log_client cls_statelog_client cls_timeindex_client
+    cls_version_client cls_replica_log_client cls_user_client
+    curl expat global fcgi resolv)
+  install(TARGETS radosgw-object-expirer DESTINATION bin)
+endif(${WITH_RADOSGW})
+
+# Everything you need to spin up a cluster with vstart.sh
+add_custom_target(vstart DEPENDS
+    ceph-osd
+    ceph-mon
+    ceph-mds
+    ceph-authtool
+    ceph-conf
+    monmaptool
+    crushtool)
+
+# Everything you need to run CephFS tests
+add_custom_target(cephfs_testing DEPENDS
+    vstart
+    rados
+    cython_modules
+    cephfs
+    cls_cephfs
+    ceph-fuse
+    ceph-dencoder
+    cephfs-journal-tool
+    cephfs-data-scan
+    cephfs-table-tool)
diff --git a/src/Makefile.am b/src/Makefile.am
index a11325e..a3d0ecd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -139,6 +139,7 @@ EXTRA_DIST += \
 	yasm-wrapper
 
 EXTRA_DIST += \
+	CMakeLists.txt \
 	unittest_bufferlist.sh
 
 
diff --git a/src/Makefile.in b/src/Makefile.in
index 892aa1a..055214b 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -83,53 +83,6 @@ POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
-DIST_COMMON = $(srcdir)/Makefile-env.am $(srcdir)/arch/Makefile.am \
-	$(srcdir)/auth/Makefile.am $(srcdir)/brag/Makefile.am \
-	$(srcdir)/ceph-detect-init/Makefile.am \
-	$(srcdir)/ceph-disk/Makefile.am $(srcdir)/crush/Makefile.am \
-	$(srcdir)/kv/Makefile.am $(srcdir)/mon/Makefile.am \
-	$(srcdir)/mds/Makefile.am $(srcdir)/mds/Makefile-client.am \
-	$(srcdir)/mds/Makefile-server.am $(srcdir)/os/Makefile.am \
-	$(srcdir)/osd/Makefile.am $(srcdir)/erasure-code/Makefile.am \
-	$(srcdir)/erasure-code/jerasure/Makefile.am \
-	$(srcdir)/erasure-code/lrc/Makefile.am \
-	$(srcdir)/erasure-code/shec/Makefile.am \
-	$(srcdir)/erasure-code/isa/Makefile.am \
-	$(srcdir)/compressor/Makefile.am \
-	$(srcdir)/compressor/zlib/Makefile.am \
-	$(srcdir)/compressor/snappy/Makefile.am \
-	$(srcdir)/osdc/Makefile.am $(srcdir)/client/Makefile.am \
-	$(srcdir)/global/Makefile.am $(srcdir)/json_spirit/Makefile.am \
-	$(srcdir)/log/Makefile.am $(srcdir)/perfglue/Makefile.am \
-	$(srcdir)/common/Makefile.am $(srcdir)/msg/Makefile.am \
-	$(srcdir)/messages/Makefile.am $(srcdir)/include/Makefile.am \
-	$(srcdir)/librados/Makefile.am \
-	$(srcdir)/libradosstriper/Makefile.am \
-	$(srcdir)/journal/Makefile.am $(srcdir)/librbd/Makefile.am \
-	$(srcdir)/rgw/Makefile.am $(srcdir)/cls/Makefile.am \
-	$(srcdir)/cls/Makefile-client.am \
-	$(srcdir)/cls/Makefile-server.am \
-	$(srcdir)/key_value_store/Makefile.am \
-	$(srcdir)/rbd_replay/Makefile.am $(srcdir)/test/Makefile.am \
-	$(srcdir)/test/erasure-code/Makefile.am \
-	$(srcdir)/test/messenger/Makefile.am \
-	$(srcdir)/test/compressor/Makefile.am \
-	$(srcdir)/test/Makefile-client.am \
-	$(srcdir)/test/Makefile-server.am $(srcdir)/tools/Makefile.am \
-	$(srcdir)/tools/Makefile-client.am \
-	$(srcdir)/tools/Makefile-server.am \
-	$(srcdir)/Makefile-rocksdb.am $(srcdir)/Makefile-spdk.am \
-	$(srcdir)/tracing/Makefile.am $(srcdir)/pybind/Makefile.am \
-	$(srcdir)/pybind/rados/Makefile.am \
-	$(srcdir)/pybind/rbd/Makefile.am \
-	$(srcdir)/pybind/cephfs/Makefile.am \
-	$(srcdir)/Makefile-client.am $(srcdir)/Makefile-server.am \
-	$(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(srcdir)/acconfig.h.in $(dist_bin_SCRIPTS) \
-	$(top_srcdir)/depcomp $(am__python_PYTHON_DIST) \
-	$(top_srcdir)/py-compile $(dist_noinst_DATA) \
-	$(am__noinst_HEADERS_DIST) $(top_srcdir)/test-driver README \
-	TODO
 bin_PROGRAMS = $(am__EXEEXT_28) $(am__EXEEXT_29) $(am__EXEEXT_30) \
 	$(am__EXEEXT_31) $(am__EXEEXT_32) $(am__EXEEXT_33) \
 	$(am__EXEEXT_34) $(am__EXEEXT_35) $(am__EXEEXT_36) \
@@ -431,10 +384,11 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @WITH_BETTER_YASM_ELF64_TRUE at am__append_88 = libisa.la
 @LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE at am__append_89 = -export-symbols-regex '.*__erasure_code_.*'
 @WITH_BETTER_YASM_ELF64_TRUE at am__append_90 = libec_isa.la
- at LINUX_TRUE@am__append_91 = -export-symbols-regex '.*__compressor_.*'
+ at WITH_BETTER_YASM_ELF64_TRUE@am__append_91 = erasure-code/isa/CMakeLists.txt
 @LINUX_TRUE at am__append_92 = -export-symbols-regex '.*__compressor_.*'
- at ENABLE_CLIENT_TRUE@am__append_93 = libclient.la
- at ENABLE_CLIENT_TRUE@am__append_94 = \
+ at LINUX_TRUE@am__append_93 = -export-symbols-regex '.*__compressor_.*'
+ at ENABLE_CLIENT_TRUE@am__append_94 = libclient.la
+ at ENABLE_CLIENT_TRUE@am__append_95 = \
 @ENABLE_CLIENT_TRUE@	client/Client.h \
 @ENABLE_CLIENT_TRUE@	client/Dentry.h \
 @ENABLE_CLIENT_TRUE@	client/Dir.h \
@@ -451,52 +405,52 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@	client/posix_acl.h \
 @ENABLE_CLIENT_TRUE@	client/UserGroups.h
 
- at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE at am__append_95 = libclient_fuse.la
- at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE at am__append_96 = client/fuse_ll.h
- at ENABLE_CLIENT_TRUE@am__append_97 = ceph_test_ioctls
- at WITH_TCMALLOC_TRUE@am__append_98 = perfglue/heap_profiler.cc
- at WITH_TCMALLOC_TRUE@am__append_99 = -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
+ at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE at am__append_96 = libclient_fuse.la
+ at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE at am__append_97 = client/fuse_ll.h
+ at ENABLE_CLIENT_TRUE@am__append_98 = ceph_test_ioctls
+ at WITH_TCMALLOC_TRUE@am__append_99 = perfglue/heap_profiler.cc
 @WITH_TCMALLOC_TRUE at am__append_100 = -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
- at WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_TRUE at am__append_101 = perfglue/heap_profiler.cc
- at WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_TRUE at am__append_102 = -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
+ at WITH_TCMALLOC_TRUE@am__append_101 = -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
+ at WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_TRUE at am__append_102 = perfglue/heap_profiler.cc
 @WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_TRUE at am__append_103 = -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
- at WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_FALSE at am__append_104 = perfglue/disabled_heap_profiler.cc
- at WITH_PROFILER_TRUE@am__append_105 = perfglue/cpu_profiler.cc
- at WITH_PROFILER_FALSE@am__append_106 = perfglue/disabled_stubs.cc
- at ENABLE_SERVER_TRUE@am__append_107 = \
+ at WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_TRUE at am__append_104 = -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free
+ at WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_FALSE at am__append_105 = perfglue/disabled_heap_profiler.cc
+ at WITH_PROFILER_TRUE@am__append_106 = perfglue/cpu_profiler.cc
+ at WITH_PROFILER_FALSE@am__append_107 = perfglue/disabled_stubs.cc
+ at ENABLE_SERVER_TRUE@am__append_108 = \
 @ENABLE_SERVER_TRUE@	common/xattr.c \
 @ENABLE_SERVER_TRUE@	common/ipaddr.cc \
 @ENABLE_SERVER_TRUE@	common/ceph_json.cc \
 @ENABLE_SERVER_TRUE@	common/util.cc \
 @ENABLE_SERVER_TRUE@	common/pick_address.cc
 
- at LINUX_TRUE@am__append_108 = \
+ at LINUX_TRUE@am__append_109 = \
 @LINUX_TRUE@	common/linux_version.c
 
- at SOLARIS_TRUE@am__append_109 = \
+ at SOLARIS_TRUE@am__append_110 = \
 @SOLARIS_TRUE@        common/solaris_errno.cc
 
- at AIX_TRUE@am__append_110 = \
+ at AIX_TRUE@am__append_111 = \
 @AIX_TRUE@        common/aix_errno.cc
 
- at ENABLE_XIO_TRUE@am__append_111 = \
+ at ENABLE_XIO_TRUE@am__append_112 = \
 @ENABLE_XIO_TRUE@	common/address_helper.cc
 
- at WITH_GOOD_YASM_ELF64_TRUE@am__append_112 = common/crc32c_intel_fast_asm.S common/crc32c_intel_fast_zero_asm.S
- at HAVE_ARMV8_CRC_TRUE@am__append_113 = libcommon_crc_aarch64.la
+ at WITH_GOOD_YASM_ELF64_TRUE@am__append_113 = common/crc32c_intel_fast_asm.S common/crc32c_intel_fast_zero_asm.S
 @HAVE_ARMV8_CRC_TRUE at am__append_114 = libcommon_crc_aarch64.la
- at LINUX_TRUE@am__append_115 = -lrt -lblkid
- at ENABLE_XIO_TRUE@am__append_116 = \
+ at HAVE_ARMV8_CRC_TRUE@am__append_115 = libcommon_crc_aarch64.la
+ at LINUX_TRUE@am__append_116 = -lrt -lblkid
+ at ENABLE_XIO_TRUE@am__append_117 = \
 @ENABLE_XIO_TRUE@	common/address_helper.h
 
- at LINUX_TRUE@am__append_117 = libsecret.la
- at LINUX_TRUE@am__append_118 = msg/async/EventEpoll.cc
- at DARWIN_TRUE@am__append_119 = msg/async/EventKqueue.cc
- at FREEBSD_TRUE@am__append_120 = msg/async/EventKqueue.cc
- at LINUX_TRUE@am__append_121 = msg/async/EventEpoll.h
- at DARWIN_TRUE@am__append_122 = msg/async/EventKqueue.h
- at FREEBSD_TRUE@am__append_123 = msg/async/EventKqueue.h
- at ENABLE_XIO_TRUE@am__append_124 = \
+ at LINUX_TRUE@am__append_118 = libsecret.la
+ at LINUX_TRUE@am__append_119 = msg/async/EventEpoll.cc
+ at DARWIN_TRUE@am__append_120 = msg/async/EventKqueue.cc
+ at FREEBSD_TRUE@am__append_121 = msg/async/EventKqueue.cc
+ at LINUX_TRUE@am__append_122 = msg/async/EventEpoll.h
+ at DARWIN_TRUE@am__append_123 = msg/async/EventKqueue.h
+ at FREEBSD_TRUE@am__append_124 = msg/async/EventKqueue.h
+ at ENABLE_XIO_TRUE@am__append_125 = \
 @ENABLE_XIO_TRUE@	msg/xio/QueueStrategy.cc \
 @ENABLE_XIO_TRUE@	msg/xio/XioConnection.cc \
 @ENABLE_XIO_TRUE@	msg/xio/XioMessenger.cc \
@@ -504,7 +458,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_XIO_TRUE@	msg/xio/XioPortal.cc \
 @ENABLE_XIO_TRUE@	msg/xio/XioPool.cc
 
- at ENABLE_XIO_TRUE@am__append_125 = \
+ at ENABLE_XIO_TRUE@am__append_126 = \
 @ENABLE_XIO_TRUE@	msg/xio/DispatchStrategy.h \
 @ENABLE_XIO_TRUE@	msg/xio/FastStrategy.h \
 @ENABLE_XIO_TRUE@	msg/xio/QueueStrategy.h \
@@ -516,22 +470,22 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_XIO_TRUE@	msg/xio/XioPortal.h \
 @ENABLE_XIO_TRUE@	msg/xio/XioSubmit.h
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_126 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_127 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/include/rados/librgw.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/include/rados/rgw_file.h
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_127 =  \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_128 =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados_internal.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados_api.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	libjournal.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_128 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_129 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados_internal.la libcls_lock_client.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(LIBOSDC) $(LIBCOMMON_DEPS)
 
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE at am__append_129 = -fvisibility=hidden -fvisibility-inlines-hidden
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE at am__append_130 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=ALL'
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_131 = librados.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_132 = \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE at am__append_130 = -fvisibility=hidden -fvisibility-inlines-hidden
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE at am__append_131 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=ALL'
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_132 = librados.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_133 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados/snap_set_diff.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados/AioCompletionImpl.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados/IoCtxImpl.h \
@@ -540,14 +494,13 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados/RadosXattrIter.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados/ListObjectImpl.h
 
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_133 = -export-symbols-regex '^radosstriper_.*'
- at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_134 = libradosstriper.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_135 = \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_134 = -export-symbols-regex '^radosstriper_.*'
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_135 = libradosstriper.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_136 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	libradosstriper/RadosStriperImpl.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	libradosstriper/MultiAioCompletionImpl.h
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_136 = \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/AsyncOpTracker.h \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_137 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Entry.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Future.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/FutureImpl.h \
@@ -564,12 +517,12 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Settings.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Utils.h
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_137 = libjournal.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_138 = librbd_internal.la \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_138 = libjournal.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_139 = librbd_internal.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd_api.la
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_139 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=ALL'
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_140 = librbd.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_141 = \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_140 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=ALL'
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_141 = librbd.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_142 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/AioCompletion.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/AioImageRequest.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/AioImageRequestWQ.h \
@@ -607,6 +560,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/image/SetSnapRequest.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/image_watcher/Notifier.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/image_watcher/NotifyLockOwner.h \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/journal/DisabledPolicy.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/journal/Policy.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/journal/Replay.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd/journal/StandardPolicy.h \
@@ -638,7 +592,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 
 
 # inject rgw stuff in the decoder testcase
- at ENABLE_CLIENT_TRUE@am__append_142 = \
+ at ENABLE_CLIENT_TRUE@am__append_143 = \
 @ENABLE_CLIENT_TRUE@	rgw/rgw_dencoder.cc \
 @ENABLE_CLIENT_TRUE@	rgw/rgw_acl.cc \
 @ENABLE_CLIENT_TRUE@	rgw/rgw_basic_types.cc \
@@ -647,7 +601,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@	rgw/rgw_json_enc.cc \
 @ENABLE_CLIENT_TRUE@	rgw/rgw_keystone.cc
 
- at ENABLE_CLIENT_TRUE@am__append_143 = -lcurl -lexpat \
+ at ENABLE_CLIENT_TRUE@am__append_144 = -lcurl -lexpat \
 @ENABLE_CLIENT_TRUE@	libcls_version_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_log_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_refcount_client.la \
@@ -661,9 +615,9 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@	libcls_user_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_numops_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_journal_client.la
- at ENABLE_CLIENT_TRUE@@WITH_OPENLDAP_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_144 = rgw/rgw_ldap.cc
+ at ENABLE_CLIENT_TRUE@@WITH_OPENLDAP_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_145 = rgw/rgw_ldap.cc
 # noinst_LTLIBRARIES += librgw.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_145 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_146 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	$(LIBRADOS) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	libcls_rgw_client.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	libcls_log_client.la \
@@ -680,16 +634,16 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	-lfcgi \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	-ldl
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_146 = librgw.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_147 = -lssl -lcrypto
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_148 = libcivetweb.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_149 = radosgw \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_147 = librgw.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_148 = -lssl -lcrypto
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_149 = libcivetweb.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_150 = radosgw \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	radosgw-admin \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	radosgw-token \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	radosgw-object-expirer
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_150 = ceph_rgw_multiparser \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_151 = ceph_rgw_multiparser \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	ceph_rgw_jsonparser
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_151 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_152 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_acl.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_acl_s3.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_acl_swift.h \
@@ -775,7 +729,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	civetweb/include/civetweb_conf.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	civetweb/src/md5.h
 
- at ENABLE_CLIENT_TRUE@am__append_152 = libcls_lock_client.la \
+ at ENABLE_CLIENT_TRUE@am__append_153 = libcls_lock_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_refcount_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_version_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_log_client.la \
@@ -787,7 +741,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@	libcls_cephfs_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_numops_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_journal_client.la
- at ENABLE_CLIENT_TRUE@am__append_153 = \
+ at ENABLE_CLIENT_TRUE@am__append_154 = \
 @ENABLE_CLIENT_TRUE@	cls/lock/cls_lock_types.h \
 @ENABLE_CLIENT_TRUE@	cls/lock/cls_lock_ops.h \
 @ENABLE_CLIENT_TRUE@	cls/lock/cls_lock_client.h \
@@ -823,7 +777,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@	cls/journal/cls_journal_client.h \
 @ENABLE_CLIENT_TRUE@	cls/journal/cls_journal_types.h
 
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_154 = libcls_hello.la \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_155 = libcls_hello.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libcls_numops.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libcls_rbd.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libcls_lock.la \
@@ -837,13 +791,13 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libcls_rgw.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libcls_cephfs.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libcls_journal.la
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_155 = libcls_kvs.la
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_156 = \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_156 = libcls_kvs.la
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_157 = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	key_value_store/key_value_structure.h \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	key_value_store/kv_flat_btree_async.h \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	key_value_store/kvs_arg_types.h
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_157 = rbd_replay/ActionTypes.h \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_158 = rbd_replay/ActionTypes.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd_replay/actions.hpp \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd_replay/BoundedBuffer.hpp \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd_replay/BufferReader.h \
@@ -853,27 +807,27 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd_replay/rbd_loc.hpp \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd_replay/rbd_replay_debug.hpp \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd_replay/Replayer.hpp
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_158 = librbd_replay_types.la \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_159 = librbd_replay_types.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd_replay.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd_replay_ios.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_159 = librbd_replay_types.la
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_160 = rbd-replay
- at ENABLE_CLIENT_TRUE@@WITH_BABELTRACE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_161 = rbd-replay-prep
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_162 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_160 = librbd_replay_types.la
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_161 = rbd-replay
+ at ENABLE_CLIENT_TRUE@@WITH_BABELTRACE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_162 = rbd-replay-prep
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_163 = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/test-erasure-code.sh \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/test-erasure-eio.sh
 
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_163 = test/erasure-code/ceph_erasure_code_benchmark.h \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_164 = test/erasure-code/ceph_erasure_code_benchmark.h \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/ceph_erasure_code_benchmark.h \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/ErasureCodeExample.h
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_164 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_165 = ceph_erasure_code_benchmark \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_165 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_166 = ceph_erasure_code_benchmark \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	ceph_erasure_code
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_166 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_167 = ceph_erasure_code_non_regression
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_168 = -ldl
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_169 = -export-symbols-regex '.*__erasure_code_.*'
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_170 = libec_example.la \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_167 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_168 = ceph_erasure_code_non_regression
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_169 = -ldl
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_170 = -export-symbols-regex '.*__erasure_code_.*'
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_171 = libec_example.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libec_missing_entry_point.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libec_missing_version.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libec_hangs.la \
@@ -887,7 +841,6 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libec_test_shec_sse4.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libec_test_shec_sse3.la \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	libec_test_shec_generic.la
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_171 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_172 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_173 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_174 = -export-symbols-regex '.*__erasure_code_.*'
@@ -896,19 +849,20 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_177 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_178 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_179 = -export-symbols-regex '.*__erasure_code_.*'
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_180 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_181 = unittest_erasure_code_plugin \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_180 = -export-symbols-regex '.*__erasure_code_.*'
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_181 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_182 = unittest_erasure_code_plugin \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code_jerasure \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code_plugin_jerasure
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_182 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_183 = -ldl
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at am__append_184 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at am__append_185 = unittest_erasure_code_isa \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_184 = -ldl
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at am__append_185 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at am__append_186 = unittest_erasure_code_isa \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code_plugin_isa
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at am__append_186 = -ldl
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_187 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_188 =  \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at am__append_187 = -ldl
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_188 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_189 =  \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code_lrc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code_plugin_lrc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_erasure_code_shec \
@@ -922,61 +876,61 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_compression_plugin_snappy \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_compression_zlib \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_compression_plugin_zlib
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_189 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_190 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_191 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_192 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_193 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_194 = -ldl
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_195 = -export-symbols-regex '.*__erasure_code_.*'
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_195 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_196 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_197 = -export-symbols-regex '.*__erasure_code_.*'
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_198 = -export-symbols-regex '.*__erasure_code_.*'
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at am__append_199 = test/messenger/message_helper.h \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_199 = -export-symbols-regex '.*__erasure_code_.*'
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at am__append_200 = test/messenger/message_helper.h \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/simple_dispatcher.h \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/xio_dispatcher.h
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE at am__append_200 = -ldl
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE at am__append_201 = -ldl
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at am__append_202 = simple_server \
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE at am__append_202 = -ldl
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at am__append_203 = simple_server \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	simple_client xio_server \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	xio_client
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE at am__append_203 = -ldl
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE at am__append_204 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_205 = test/compressor/compressor_example.h
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_206 = libceph_example.la
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_207 = -ldl
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@@LINUX_TRUE at am__append_205 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_206 = test/compressor/compressor_example.h
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_207 = libceph_example.la
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_208 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_209 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_210 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_211 = -ldl
- at COMPILER_HAS_VTA_TRUE@@ENABLE_CLIENT_TRUE at am__append_212 = -fno-var-tracking-assignments
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_212 = -ldl
 @COMPILER_HAS_VTA_TRUE@@ENABLE_CLIENT_TRUE at am__append_213 = -fno-var-tracking-assignments
- at ENABLE_CLIENT_TRUE@@WITH_RBD_TRUE at am__append_214 = -DWITH_RBD
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE at am__append_215 = -DWITH_RADOSGW
- at ENABLE_CLIENT_TRUE@am__append_216 = ceph-dencoder
- at ENABLE_CLIENT_TRUE@am__append_217 = \
+ at COMPILER_HAS_VTA_TRUE@@ENABLE_CLIENT_TRUE at am__append_214 = -fno-var-tracking-assignments
+ at ENABLE_CLIENT_TRUE@@WITH_RBD_TRUE at am__append_215 = -DWITH_RBD
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE at am__append_216 = -DWITH_RADOSGW
+ at ENABLE_CLIENT_TRUE@am__append_217 = ceph-dencoder
+ at ENABLE_CLIENT_TRUE@am__append_218 = \
 @ENABLE_CLIENT_TRUE@	test/encoding/test_ceph_time.h
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_218 = libradostest.la \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_219 = libradostest.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	librados_test_stub.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	libjournal_test_mock.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_219 = ceph_test_rados \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_220 = ceph_test_rados \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_test_mutate
- at ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOS_TRUE at am__append_220 = test_build_librados
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_221 =  \
+ at ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOS_TRUE at am__append_221 = test_build_librados
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_222 =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_smalliobench \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_omapbench \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_objectstore_bench
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE at am__append_222 = ceph_kvstorebench \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE at am__append_223 = ceph_kvstorebench \
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_list_parallel \
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_open_pools_parallel \
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_delete_pools_parallel \
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_watch_notify
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_223 =  \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_224 =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	unittest_librados \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	unittest_librados_config \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	unittest_journal
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_224 =  \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_225 =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_multi_stress_watch \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_test_cls_rbd \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_test_cls_refcount \
@@ -1005,7 +959,7 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_api_lock \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_api_tmap_migrate \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_test_stress_watch
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_225 = test/librados_test_stub/LibradosTestStub.h \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_226 = test/librados_test_stub/LibradosTestStub.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados_test_stub/MockTestMemIoCtxImpl.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados_test_stub/MockTestMemRadosClient.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados_test_stub/TestClassHandler.h \
@@ -1015,19 +969,19 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados_test_stub/TestMemIoCtxImpl.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados_test_stub/TestIoCtxImpl.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/journal/mock/MockJournaler.h
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_226 = ceph_smalliobenchrbd \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_227 = ceph_smalliobenchrbd \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	ceph_test_librbd \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	ceph_test_librbd_api \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	ceph_test_rbd_mirror \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	ceph_test_rbd_mirror_random_write
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_227 = unittest_rbd_replay
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_228 = librbd_test.la \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_228 = unittest_rbd_replay
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_229 = librbd_test.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd_test_mock.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	librbd_mirror_test.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_229 = unittest_librbd \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_230 = unittest_librbd \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	unittest_rbd_mirror
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_230 = test/run-rbd-unit-tests.sh
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_231 = test/librbd/test_fixture.h \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_231 = test/run-rbd-unit-tests.sh
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_232 = test/librbd/test_fixture.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	test/librbd/test_mock_fixture.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	test/librbd/test_support.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	test/librbd/mock/MockAioImageRequestWQ.h \
@@ -1044,23 +998,23 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	test/librbd/object_map/mock/MockInvalidateRequest.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	test/rbd_mirror/test_fixture.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	test/rbd_mirror/test_mock_fixture.h
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_232 = ceph_test_librbd_fsx
- at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_233 = libradosstripertest.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_234 = ceph_test_rados_striper_api_io \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_233 = ceph_test_librbd_fsx
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_234 = libradosstripertest.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at am__append_235 = ceph_test_rados_striper_api_io \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_striper_api_aio \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	ceph_test_rados_striper_api_striping
- at ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_235 = test_build_libcephfs
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_236 = unittest_encoding \
+ at ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_236 = test_build_libcephfs
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_237 = unittest_encoding \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	unittest_base64 \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	unittest_run_cmd \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	unittest_simple_spin \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	unittest_libcephfs_config
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_237 = test/libcephfs/flock.cc
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_238 = ceph_test_libcephfs \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_238 = test/libcephfs/flock.cc
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_239 = ceph_test_libcephfs \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	ceph_test_c_headers
- at CLANG_FALSE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_239 = -Werror -Wold-style-declaration
- at ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_240 = test_build_librgw
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_241 = ceph_test_cors \
+ at CLANG_FALSE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_240 = -Werror -Wold-style-declaration
+ at ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_241 = test_build_librgw
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at am__append_242 = ceph_test_cors \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	ceph_test_rgw_manifest \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	ceph_test_rgw_period_history \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	ceph_test_rgw_obj \
@@ -1073,20 +1027,20 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	librgw_file_gp \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	librgw_file_aw \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	librgw_file_nfsns
- at ENABLE_SERVER_TRUE@am__append_242 = ceph_test_async_driver \
+ at ENABLE_SERVER_TRUE@am__append_243 = ceph_test_async_driver \
 @ENABLE_SERVER_TRUE@	ceph_test_msgr ceph_test_trans \
 @ENABLE_SERVER_TRUE@	ceph_test_mon_workloadgen \
 @ENABLE_SERVER_TRUE@	ceph_test_mon_msg ceph_perf_objectstore \
 @ENABLE_SERVER_TRUE@	ceph_perf_local ceph_perf_msgr_server \
 @ENABLE_SERVER_TRUE@	ceph_perf_msgr_client
- at ENABLE_SERVER_TRUE@am__append_243 = test/perf_helper.h
- at ENABLE_SERVER_TRUE@@LINUX_TRUE at am__append_244 =  \
+ at ENABLE_SERVER_TRUE@am__append_244 = test/perf_helper.h
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE at am__append_245 =  \
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@	ceph_test_objectstore \
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@	ceph_test_keyvaluedb \
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@	ceph_test_filestore
- at ENABLE_SERVER_TRUE@@LINUX_TRUE at am__append_245 = unittest_bluefs \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE at am__append_246 = unittest_bluefs \
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@	unittest_bluestore_types
- at ENABLE_SERVER_TRUE@am__append_246 =  \
+ at ENABLE_SERVER_TRUE@am__append_247 =  \
 @ENABLE_SERVER_TRUE@	ceph_test_objectstore_workloadgen \
 @ENABLE_SERVER_TRUE@	ceph_test_filestore_idempotent \
 @ENABLE_SERVER_TRUE@	ceph_test_filestore_idempotent_sequence \
@@ -1094,47 +1048,47 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_SERVER_TRUE@	ceph_test_object_map \
 @ENABLE_SERVER_TRUE@	ceph_test_keyvaluedb_atomicity \
 @ENABLE_SERVER_TRUE@	ceph_test_keyvaluedb_iterators
- at ENABLE_SERVER_TRUE@am__append_247 = unittest_transaction
- at ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE at am__append_248 = ceph_smalliobenchfs \
+ at ENABLE_SERVER_TRUE@am__append_248 = unittest_transaction
+ at ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE at am__append_249 = ceph_smalliobenchfs \
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE@	ceph_smalliobenchdumb \
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_RADOS_TRUE@	ceph_tpbench
- at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_249 = ceph_test_keys
- at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_250 = get_command_descriptions
- at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_251 =  \
+ at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_250 = ceph_test_keys
+ at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_251 = get_command_descriptions
+ at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_252 =  \
 @ENABLE_SERVER_TRUE@@WITH_MON_TRUE@	unittest_mon_moncap \
 @ENABLE_SERVER_TRUE@@WITH_MON_TRUE@	unittest_mon_pgmap
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_252 =  \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_253 =  \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_ecbackend \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_osdscrub \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_pglog \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_hitset \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_osd_osdcap \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	unittest_pageset
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_253 = -ldl
 @ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_254 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_255 = ceph_test_snap_mapper
- at ENABLE_SERVER_TRUE@@WITH_SLIBROCKSDB_TRUE at am__append_256 = unittest_rocksdb_option_static
- at ENABLE_SERVER_TRUE@@WITH_DLIBROCKSDB_TRUE at am__append_257 = unittest_rocksdb_option
- at ENABLE_SERVER_TRUE@am__append_258 = unittest_chain_xattr \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_255 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_256 = ceph_test_snap_mapper
+ at ENABLE_SERVER_TRUE@@WITH_SLIBROCKSDB_TRUE at am__append_257 = unittest_rocksdb_option_static
+ at ENABLE_SERVER_TRUE@@WITH_DLIBROCKSDB_TRUE at am__append_258 = unittest_rocksdb_option
+ at ENABLE_SERVER_TRUE@am__append_259 = unittest_chain_xattr \
 @ENABLE_SERVER_TRUE@	unittest_lfnindex
- at ENABLE_SERVER_TRUE@@WITH_MDS_TRUE at am__append_259 = unittest_mds_authcap
- at WITH_BUILD_TESTS_TRUE@am__append_260 = test_build_libcommon
- at LINUX_TRUE@am__append_261 = libsystest.la
- at SOLARIS_TRUE@am__append_262 = \
+ at ENABLE_SERVER_TRUE@@WITH_MDS_TRUE at am__append_260 = unittest_mds_authcap
+ at WITH_BUILD_TESTS_TRUE@am__append_261 = test_build_libcommon
+ at LINUX_TRUE@am__append_262 = libsystest.la
+ at SOLARIS_TRUE@am__append_263 = \
 @SOLARIS_TRUE@	-lsocket -lnsl
 
- at LINUX_TRUE@am__append_263 = unittest_blkdev
- at LINUX_TRUE@am__append_264 = ceph_test_get_blkdev_size
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_265 =  \
+ at LINUX_TRUE@am__append_264 = unittest_blkdev
+ at LINUX_TRUE@am__append_265 = ceph_test_get_blkdev_size
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_266 =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_scratchtool \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_scratchtoolpp \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	ceph_radosacl
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_266 = rados
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_267 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_267 = rados
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_268 = \
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/action/Kernel.cc \
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/action/Nbd.cc
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_268 = tools/rbd/ArgumentTypes.h \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_269 = tools/rbd/ArgumentTypes.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/IndentStream.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/OptionPrinter.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/Shell.h \
@@ -1165,26 +1119,26 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd_mirror/image_sync/SnapshotCreateRequest.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd_mirror/image_sync/SyncPointCreateRequest.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd_mirror/image_sync/SyncPointPruneRequest.h
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_269 = $(LIBKRBD)
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_270 = rbd
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_271 = rbd-nbd
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_272 = librbd_mirror_internal.la
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_273 = rbd-mirror
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_274 = ceph-client-debug
- at ENABLE_SERVER_TRUE@am__append_275 = ceph-osdomap-tool \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_270 = $(LIBKRBD)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_271 = rbd
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_272 = rbd-nbd
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_273 = librbd_mirror_internal.la
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_274 = rbd-mirror
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_275 = ceph-client-debug
+ at ENABLE_SERVER_TRUE@am__append_276 = ceph-osdomap-tool \
 @ENABLE_SERVER_TRUE@	ceph-monstore-tool ceph-kvstore-tool
- at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_276 = -ldl
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_277 = ceph-objectstore-tool
- at ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE at am__append_278 = cephfs-journal-tool \
+ at ENABLE_SERVER_TRUE@@LINUX_TRUE@@WITH_OSD_TRUE at am__append_277 = -ldl
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_278 = ceph-objectstore-tool
+ at ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE at am__append_279 = cephfs-journal-tool \
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@	cephfs-table-tool \
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@	cephfs-data-scan
- at WITH_LTTNG_TRUE@am__append_279 = \
+ at WITH_LTTNG_TRUE@am__append_280 = \
 @WITH_LTTNG_TRUE@	libosd_tp.la \
 @WITH_LTTNG_TRUE@	libos_tp.la \
 @WITH_LTTNG_TRUE@	librados_tp.la \
 @WITH_LTTNG_TRUE@	librbd_tp.la
 
- at WITH_LTTNG_TRUE@am__append_280 = \
+ at WITH_LTTNG_TRUE@am__append_281 = \
 @WITH_LTTNG_TRUE@	tracing/librados.h \
 @WITH_LTTNG_TRUE@	tracing/librbd.h \
 @WITH_LTTNG_TRUE@	tracing/objectstore.h \
@@ -1192,63 +1146,75 @@ check_PROGRAMS = $(am__EXEEXT_63) $(am__EXEEXT_64) \
 @WITH_LTTNG_TRUE@	tracing/osd.h \
 @WITH_LTTNG_TRUE@	tracing/pg.h
 
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_281 = $(srcdir)/pybind/rados/setup.py $(srcdir)/pybind/rados/rados.pyx $(srcdir)/pybind/rados/rados.pxd
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_282 = rados-pybind-all
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_283 = rados-pybind-clean
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_284 = rados-pybind-install-exec
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_285 = $(srcdir)/pybind/rbd/setup.py $(srcdir)/pybind/rbd/rbd.pyx
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_286 = rbd-pybind-all
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_287 = rbd-pybind-clean
- at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_288 = rbd-pybind-install-exec
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_289 = $(srcdir)/pybind/cephfs/setup.py $(srcdir)/pybind/cephfs/cephfs.pyx
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_290 = cephfs-pybind-all
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_291 = cephfs-pybind-clean
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_292 = cephfs-pybind-install-exec
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_282 = \
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/pybind/rados/CMakeLists.txt \
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/pybind/rados/setup.py \
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/pybind/rados/rados.pyx $(srcdir)/pybind/rados/rados.pxd
+
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_283 = rados-pybind-all
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_284 = rados-pybind-clean
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_285 = rados-pybind-install-exec
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_286 = \
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(srcdir)/pybind/rbd/CMakeLists.txt \
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(srcdir)/pybind/rbd/setup.py \
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(srcdir)/pybind/rbd/rbd.pyx
+
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_287 = rbd-pybind-all
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_288 = rbd-pybind-clean
+ at ENABLE_CLIENT_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_289 = rbd-pybind-install-exec
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_290 = \
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/pybind/cephfs/CMakeLists.txt \
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/pybind/cephfs/setup.py \
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/pybind/cephfs/cephfs.pyx
+
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_291 = cephfs-pybind-all
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_292 = cephfs-pybind-clean
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_CYTHON_TRUE@@WITH_RADOS_TRUE at am__append_293 = cephfs-pybind-install-exec
 TESTS = $(am__EXEEXT_63) $(check_SCRIPTS)
- at ENABLE_CLIENT_TRUE@am__append_293 = \
+ at ENABLE_CLIENT_TRUE@am__append_294 = \
 @ENABLE_CLIENT_TRUE@	pybind/ceph_argparse.py \
 @ENABLE_CLIENT_TRUE@	pybind/ceph_daemon.py
 
- at ENABLE_CLIENT_TRUE@am__append_294 = ceph-syn
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_295 = \
+ at ENABLE_CLIENT_TRUE@am__append_295 = ceph-syn
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_296 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/bash_completion/rados \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/bash_completion/radosgw-admin
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_296 = librados-config
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_297 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am__append_297 = librados-config
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_298 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(srcdir)/bash_completion/rbd
 
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_298 = \
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_299 = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	ceph-rbdnamer \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	rbd-replay-many \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@        rbdmap
 
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_299 = libkrbd.la
- at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE at am__append_300 = ceph-fuse
- at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE at am__append_301 = mount.fuse.ceph
- at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_302 = rbd-fuse
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_303 = cephfs
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_304 = mount.ceph
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_305 = pybind/ceph_volume_client.py
- at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_306 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=libcommon.a'
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_307 = libcephfs.la
- at ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_308 = libcephfs_jni.la
- at ENABLE_SERVER_TRUE@am__append_309 = ceph-run ceph-rest-api \
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_300 = libkrbd.la
+ at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE at am__append_301 = ceph-fuse
+ at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE at am__append_302 = mount.fuse.ceph
+ at ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am__append_303 = rbd-fuse
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_304 = cephfs
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_305 = mount.ceph
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_306 = pybind/ceph_volume_client.py
+ at ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_307 = -Xcompiler -Xlinker -Xcompiler '--exclude-libs=libcommon.a'
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_308 = libcephfs.la
+ at ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_309 = libcephfs_jni.la
+ at ENABLE_SERVER_TRUE@am__append_310 = ceph-run ceph-rest-api \
 @ENABLE_SERVER_TRUE@	ceph-debugpack ceph-crush-location \
 @ENABLE_SERVER_TRUE@	ceph-coverage
- at ENABLE_SERVER_TRUE@am__append_310 = pybind/ceph_rest_api.py
- at ENABLE_SERVER_TRUE@am__append_311 = ceph-coverage init-ceph
- at ENABLE_SERVER_TRUE@am__append_312 = init-ceph
- at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_313 = ceph-mon
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_314 = \
+ at ENABLE_SERVER_TRUE@am__append_311 = pybind/ceph_rest_api.py
+ at ENABLE_SERVER_TRUE@am__append_312 = ceph-coverage init-ceph
+ at ENABLE_SERVER_TRUE@am__append_313 = init-ceph
+ at ENABLE_SERVER_TRUE@@WITH_MON_TRUE at am__append_314 = ceph-mon
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_315 = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	ceph-disk-udev
 
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_315 = \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_316 = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	ceph-clsinfo
 
- at ENABLE_SERVER_TRUE@@WITH_LTTNG_TRUE@@WITH_OSD_TRUE at am__append_316 = $(LIBOSD_TP)
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_317 = ceph-osd
- at ENABLE_SERVER_TRUE@@WITH_MDS_TRUE at am__append_318 = ceph-mds
+ at ENABLE_SERVER_TRUE@@WITH_LTTNG_TRUE@@WITH_OSD_TRUE at am__append_317 = $(LIBOSD_TP)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am__append_318 = ceph-osd
+ at ENABLE_SERVER_TRUE@@WITH_MDS_TRUE at am__append_319 = ceph-mds
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
@@ -1268,6 +1234,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(dist_bin_SCRIPTS) \
+	$(am__python_PYTHON_DIST) $(dist_noinst_DATA) \
+	$(am__noinst_HEADERS_DIST) $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = acconfig.h
 CONFIG_CLEAN_FILES =
@@ -1901,7 +1870,7 @@ libcls_version_client_la_OBJECTS =  \
 	$(am_libcls_version_client_la_OBJECTS)
 @ENABLE_CLIENT_TRUE at am_libcls_version_client_la_rpath =
 am__DEPENDENCIES_5 = libcommon_internal.la libcommon_crc.la \
-	$(am__append_113) $(LIBERASURE_CODE) $(LIBCOMPRESSOR) \
+	$(am__append_114) $(LIBERASURE_CODE) $(LIBCOMPRESSOR) \
 	$(LIBMSG) $(LIBAUTH) $(LIBCRUSH) $(LIBJSON_SPIRIT) $(LIBLOG) \
 	$(LIBARCH) $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 libcommon_la_DEPENDENCIES = $(am__DEPENDENCIES_5)
@@ -1935,10 +1904,11 @@ libcommon_crc_aarch64_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 @HAVE_ARMV8_CRC_TRUE at am_libcommon_crc_aarch64_la_rpath =
 libcommon_internal_la_LIBADD =
 am__libcommon_internal_la_SOURCES_DIST = ceph_ver.c \
-	common/DecayCounter.cc common/LogClient.cc common/LogEntry.cc \
-	common/Graylog.cc common/PrebufferedStreambuf.cc \
-	common/SloppyCRCMap.cc common/BackTrace.cc \
-	common/perf_counters.cc common/mutex_debug.cc common/Mutex.cc \
+	common/AsyncOpTracker.cc common/DecayCounter.cc \
+	common/LogClient.cc common/LogEntry.cc common/Graylog.cc \
+	common/PrebufferedStreambuf.cc common/SloppyCRCMap.cc \
+	common/BackTrace.cc common/perf_counters.cc \
+	common/mutex_debug.cc common/Mutex.cc \
 	common/OutputDataSocket.cc common/admin_socket.cc \
 	common/admin_socket_client.cc common/cmdparse.cc \
 	common/escape.c common/io_priority.cc common/ceph_time.cc \
@@ -1978,7 +1948,8 @@ am__libcommon_internal_la_SOURCES_DIST = ceph_ver.c \
 @SOLARIS_TRUE at am__objects_16 = common/solaris_errno.lo
 @AIX_TRUE at am__objects_17 = common/aix_errno.lo
 @ENABLE_XIO_TRUE at am__objects_18 = common/address_helper.lo
-am_libcommon_internal_la_OBJECTS = ceph_ver.lo common/DecayCounter.lo \
+am_libcommon_internal_la_OBJECTS = ceph_ver.lo \
+	common/AsyncOpTracker.lo common/DecayCounter.lo \
 	common/LogClient.lo common/LogEntry.lo common/Graylog.lo \
 	common/PrebufferedStreambuf.lo common/SloppyCRCMap.lo \
 	common/BackTrace.lo common/perf_counters.lo \
@@ -2597,13 +2568,13 @@ libisa_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
 	$@
 @WITH_BETTER_YASM_ELF64_TRUE at am_libisa_la_rpath =
 libjournal_la_LIBADD =
-am__libjournal_la_SOURCES_DIST = journal/AsyncOpTracker.cc \
-	journal/Entry.cc journal/Future.cc journal/FutureImpl.cc \
-	journal/Journaler.cc journal/JournalMetadata.cc \
-	journal/JournalPlayer.cc journal/JournalRecorder.cc \
-	journal/JournalTrimmer.cc journal/ObjectPlayer.cc \
-	journal/ObjectRecorder.cc journal/Utils.cc
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am_libjournal_la_OBJECTS = journal/AsyncOpTracker.lo \
+am__libjournal_la_SOURCES_DIST = journal/Entry.cc journal/Future.cc \
+	journal/FutureImpl.cc journal/Journaler.cc \
+	journal/JournalMetadata.cc journal/JournalPlayer.cc \
+	journal/JournalRecorder.cc journal/JournalTrimmer.cc \
+	journal/ObjectPlayer.cc journal/ObjectRecorder.cc \
+	journal/Utils.cc
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at am_libjournal_la_OBJECTS =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Entry.lo \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Future.lo \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/FutureImpl.lo \
@@ -3625,8 +3596,8 @@ am__DEPENDENCIES_17 = librgw.la $(am__DEPENDENCIES_1)
 @ENABLE_CLIENT_TRUE@	libcls_user_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_numops_client.la \
 @ENABLE_CLIENT_TRUE@	libcls_journal_client.la
-am__DEPENDENCIES_19 = $(am__append_49) $(am__append_137) \
-	$(am__DEPENDENCIES_18) $(am__append_159)
+am__DEPENDENCIES_19 = $(am__append_49) $(am__append_138) \
+	$(am__DEPENDENCIES_18) $(am__append_160)
 @ENABLE_CLIENT_TRUE at ceph_dencoder_DEPENDENCIES =  \
 @ENABLE_CLIENT_TRUE@	$(am__DEPENDENCIES_17) $(LIBRADOS) \
 @ENABLE_CLIENT_TRUE@	$(LIBRBD_TYPES) $(LIBOSD_TYPES) \
@@ -3690,8 +3661,10 @@ ceph_monstore_tool_OBJECTS = $(am_ceph_monstore_tool_OBJECTS)
 @ENABLE_SERVER_TRUE@	$(am__DEPENDENCIES_10) \
 @ENABLE_SERVER_TRUE@	$(am__DEPENDENCIES_1)
 am__ceph_objectstore_tool_SOURCES_DIST =  \
-	tools/ceph_objectstore_tool.cc tools/RadosDump.cc
+	tools/ceph_objectstore_tool.cc tools/rebuild_mondb.cc \
+	tools/rebuild_mondb.h tools/RadosDump.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at am_ceph_objectstore_tool_OBJECTS = tools/ceph_objectstore_tool.$(OBJEXT) \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	tools/rebuild_mondb.$(OBJEXT) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	tools/RadosDump.$(OBJEXT)
 ceph_objectstore_tool_OBJECTS = $(am_ceph_objectstore_tool_OBJECTS)
 am__DEPENDENCIES_24 = libosd.a $(am__DEPENDENCIES_1) $(LIBOSDC) \
@@ -5172,7 +5145,7 @@ rbd_OBJECTS = $(am_rbd_OBJECTS)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__DEPENDENCIES_10) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__DEPENDENCIES_1) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__DEPENDENCIES_1) \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_269)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_270)
 am__rbd_fuse_SOURCES_DIST = rbd_fuse/rbd-fuse.cc
 @ENABLE_CLIENT_TRUE@@WITH_FUSE_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at am_rbd_fuse_OBJECTS = rbd_fuse/rbd_fuse-rbd-fuse.$(OBJEXT)
 rbd_fuse_OBJECTS = $(am_rbd_fuse_OBJECTS)
@@ -7738,10 +7711,11 @@ am__noinst_HEADERS_DIST = arch/intel.h arch/arm.h arch/probe.h \
 	common/bloom_filter.hpp common/sctp_crc32.h \
 	common/crc32c_intel_baseline.h common/crc32c_intel_fast.h \
 	common/crc32c_aarch64.h common/cohort_lru.h common/sstring.hh \
-	xxHash/xxhash.h common/BackTrace.h common/RefCountedObj.h \
-	common/HeartbeatMap.h common/LogClient.h common/LogEntry.h \
-	common/Graylog.h common/Preforker.h common/SloppyCRCMap.h \
-	common/WorkQueue.h common/OpQueue.h common/PrioritizedQueue.h \
+	xxHash/xxhash.h common/AsyncOpTracker.h common/BackTrace.h \
+	common/RefCountedObj.h common/HeartbeatMap.h \
+	common/LogClient.h common/LogEntry.h common/Graylog.h \
+	common/Preforker.h common/SloppyCRCMap.h common/WorkQueue.h \
+	common/OpQueue.h common/PrioritizedQueue.h \
 	common/WeightedPriorityQueue.h common/ceph_argparse.h \
 	common/ceph_context.h common/xattr.h common/blkdev.h \
 	common/compiler_extensions.h common/debug.h common/dout.h \
@@ -7889,9 +7863,8 @@ am__noinst_HEADERS_DIST = arch/intel.h arch/arm.h arch/probe.h \
 	librados/PoolAsyncCompletionImpl.h librados/RadosClient.h \
 	librados/RadosXattrIter.h librados/ListObjectImpl.h \
 	libradosstriper/RadosStriperImpl.h \
-	libradosstriper/MultiAioCompletionImpl.h \
-	journal/AsyncOpTracker.h journal/Entry.h journal/Future.h \
-	journal/FutureImpl.h journal/Journaler.h \
+	libradosstriper/MultiAioCompletionImpl.h journal/Entry.h \
+	journal/Future.h journal/FutureImpl.h journal/Journaler.h \
 	journal/JournalMetadata.h journal/JournalMetadataListener.h \
 	journal/JournalPlayer.h journal/JournalRecorder.h \
 	journal/JournalTrimmer.h journal/ObjectPlayer.h \
@@ -7916,7 +7889,8 @@ am__noinst_HEADERS_DIST = arch/intel.h arch/arm.h arch/probe.h \
 	librbd/image/RefreshParentRequest.h \
 	librbd/image/RefreshRequest.h librbd/image/SetSnapRequest.h \
 	librbd/image_watcher/Notifier.h \
-	librbd/image_watcher/NotifyLockOwner.h librbd/journal/Policy.h \
+	librbd/image_watcher/NotifyLockOwner.h \
+	librbd/journal/DisabledPolicy.h librbd/journal/Policy.h \
 	librbd/journal/Replay.h librbd/journal/StandardPolicy.h \
 	librbd/journal/Types.h librbd/journal/TypeTraits.h \
 	librbd/mirroring_watcher/Types.h \
@@ -8298,6 +8272,50 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
 	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile-client.am \
+	$(srcdir)/Makefile-env.am $(srcdir)/Makefile-rocksdb.am \
+	$(srcdir)/Makefile-server.am $(srcdir)/Makefile-spdk.am \
+	$(srcdir)/Makefile.in $(srcdir)/acconfig.h.in \
+	$(srcdir)/arch/Makefile.am $(srcdir)/auth/Makefile.am \
+	$(srcdir)/brag/Makefile.am \
+	$(srcdir)/ceph-detect-init/Makefile.am \
+	$(srcdir)/ceph-disk/Makefile.am $(srcdir)/client/Makefile.am \
+	$(srcdir)/cls/Makefile-client.am \
+	$(srcdir)/cls/Makefile-server.am $(srcdir)/cls/Makefile.am \
+	$(srcdir)/common/Makefile.am $(srcdir)/compressor/Makefile.am \
+	$(srcdir)/compressor/snappy/Makefile.am \
+	$(srcdir)/compressor/zlib/Makefile.am \
+	$(srcdir)/crush/Makefile.am $(srcdir)/erasure-code/Makefile.am \
+	$(srcdir)/erasure-code/isa/Makefile.am \
+	$(srcdir)/erasure-code/jerasure/Makefile.am \
+	$(srcdir)/erasure-code/lrc/Makefile.am \
+	$(srcdir)/erasure-code/shec/Makefile.am \
+	$(srcdir)/global/Makefile.am $(srcdir)/include/Makefile.am \
+	$(srcdir)/journal/Makefile.am \
+	$(srcdir)/json_spirit/Makefile.am \
+	$(srcdir)/key_value_store/Makefile.am $(srcdir)/kv/Makefile.am \
+	$(srcdir)/librados/Makefile.am \
+	$(srcdir)/libradosstriper/Makefile.am \
+	$(srcdir)/librbd/Makefile.am $(srcdir)/log/Makefile.am \
+	$(srcdir)/mds/Makefile-client.am \
+	$(srcdir)/mds/Makefile-server.am $(srcdir)/mds/Makefile.am \
+	$(srcdir)/messages/Makefile.am $(srcdir)/mon/Makefile.am \
+	$(srcdir)/msg/Makefile.am $(srcdir)/os/Makefile.am \
+	$(srcdir)/osd/Makefile.am $(srcdir)/osdc/Makefile.am \
+	$(srcdir)/perfglue/Makefile.am $(srcdir)/pybind/Makefile.am \
+	$(srcdir)/pybind/cephfs/Makefile.am \
+	$(srcdir)/pybind/rados/Makefile.am \
+	$(srcdir)/pybind/rbd/Makefile.am \
+	$(srcdir)/rbd_replay/Makefile.am $(srcdir)/rgw/Makefile.am \
+	$(srcdir)/test/Makefile-client.am \
+	$(srcdir)/test/Makefile-server.am $(srcdir)/test/Makefile.am \
+	$(srcdir)/test/compressor/Makefile.am \
+	$(srcdir)/test/erasure-code/Makefile.am \
+	$(srcdir)/test/messenger/Makefile.am \
+	$(srcdir)/tools/Makefile-client.am \
+	$(srcdir)/tools/Makefile-server.am $(srcdir)/tools/Makefile.am \
+	$(srcdir)/tracing/Makefile.am $(top_srcdir)/depcomp \
+	$(top_srcdir)/py-compile $(top_srcdir)/test-driver README TODO
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -8344,11 +8362,10 @@ ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@ $(AM_COMMON_CFLAGS) -ftemplate-depth-1024 \
 	-Wnon-virtual-dtor -Wno-invalid-offsetof $(am__append_7) \
-	$(am__append_10) $(am__append_13) $(am__append_100) \
-	$(am__append_103)
+	$(am__append_10) $(am__append_13) $(am__append_101) \
+	$(am__append_104)
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -8434,6 +8451,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -8532,6 +8550,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -8549,10 +8568,11 @@ top_srcdir = @top_srcdir@
 AUTOMAKE_OPTIONS = gnu subdir-objects
 SUBDIRS = ocf java
 DIST_SUBDIRS = gmock ocf java
-BUILT_SOURCES = $(am__append_280) $(am__append_312)
+BUILT_SOURCES = $(am__append_281) $(am__append_313)
 
 # extra bits
 EXTRA_DIST = $(am__append_32) ceph-detect-init/AUTHORS.rst \
+	ceph-detect-init/CMakeLists.txt \
 	ceph-detect-init/ceph_detect_init/centos/__init__.py \
 	ceph-detect-init/ceph_detect_init/exc.py \
 	ceph-detect-init/ceph_detect_init/main.py \
@@ -8579,12 +8599,41 @@ EXTRA_DIST = $(am__append_32) ceph-detect-init/AUTHORS.rst \
 	ceph-detect-init/run-tox.sh ceph-detect-init/setup.py \
 	ceph-detect-init/test-requirements.txt \
 	ceph-detect-init/tests/test_all.py ceph-detect-init/tox.ini \
-	ceph-disk/AUTHORS.rst ceph-disk/ceph_disk/__init__.py \
-	ceph-disk/ceph_disk/main.py ceph-disk/Makefile.am \
-	ceph-disk/MANIFEST.in ceph-disk/README.rst \
-	ceph-disk/requirements.txt ceph-disk/run-tox.sh \
-	ceph-disk/setup.py ceph-disk/test-requirements.txt \
-	ceph-disk/tests/test_main.py ceph-disk/tox.ini \
+	ceph-disk/AUTHORS.rst ceph-disk/CMakeLists.txt \
+	ceph-disk/ceph_disk/__init__.py ceph-disk/ceph_disk/main.py \
+	ceph-disk/Makefile.am ceph-disk/MANIFEST.in \
+	ceph-disk/README.rst ceph-disk/requirements.txt \
+	ceph-disk/run-tox.sh ceph-disk/setup.py \
+	ceph-disk/test-requirements.txt ceph-disk/tests/test_main.py \
+	ceph-disk/tox.ini kv/CMakeLists.txt \
+	erasure-code/jerasure/CMakeLists.txt \
+	erasure-code/lrc/CMakeLists.txt \
+	erasure-code/shec/CMakeLists.txt $(am__append_91) \
+	erasure-code/CMakeLists.txt compressor/zlib/CMakeLists.txt \
+	compressor/snappy/CMakeLists.txt compressor/CMakeLists.txt \
+	json_spirit/CMakeLists.txt libradosstriper/CMakeLists.txt \
+	librbd/CMakeLists.txt cls/CMakeLists.txt \
+	rbd_replay/CMakeLists.txt test/CMakeLists.txt \
+	test/ObjectMap/CMakeLists.txt test/bench/CMakeLists.txt \
+	test/cls_hello/CMakeLists.txt test/cls_lock/CMakeLists.txt \
+	test/cls_log/CMakeLists.txt test/cls_numops/CMakeLists.txt \
+	test/cls_rbd/CMakeLists.txt test/cls_refcount/CMakeLists.txt \
+	test/cls_replica_log/CMakeLists.txt \
+	test/cls_rgw/CMakeLists.txt test/cls_statelog/CMakeLists.txt \
+	test/cls_version/CMakeLists.txt test/common/CMakeLists.txt \
+	test/crush/CMakeLists.txt test/encoding/CMakeLists.txt \
+	test/filestore/CMakeLists.txt test/fs/CMakeLists.txt \
+	test/journal/CMakeLists.txt test/libcephfs/CMakeLists.txt \
+	test/librados/CMakeLists.txt \
+	test/librados_test_stub/CMakeLists.txt \
+	test/libradosstriper/CMakeLists.txt test/librbd/CMakeLists.txt \
+	test/mds/CMakeLists.txt test/mon/CMakeLists.txt \
+	test/msgr/CMakeLists.txt test/objectstore/CMakeLists.txt \
+	test/os/CMakeLists.txt test/osd/CMakeLists.txt \
+	test/osdc/CMakeLists.txt test/pybind/CMakeLists.txt \
+	test/rbd_mirror/CMakeLists.txt test/rgw/CMakeLists.txt \
+	test/system/CMakeLists.txt test/erasure-code/CMakeLists.txt \
+	test/messenger/CMakeLists.txt test/compressor/CMakeLists.txt \
 	$(srcdir)/test/python/brag-client/setup.py \
 	$(srcdir)/test/python/brag-client/tox.ini \
 	$(srcdir)/test/python/brag-client/tests/test_ceph_brag.py \
@@ -9240,8 +9289,9 @@ EXTRA_DIST = $(am__append_32) ceph-detect-init/AUTHORS.rst \
 	spdk/include/spdk/pci.h spdk/include/spdk/vtophys.h \
 	spdk/include/spdk/queue_extras.h spdk/include/spdk/file.h \
 	spdk/include/spdk/assert.h spdk/include/spdk/barrier.h \
-	spdk/include/spdk/mmio.h tracing/tracing-common.h \
-	$(am__append_281) $(am__append_285) $(am__append_289) \
+	spdk/include/spdk/mmio.h tracing/CMakeLists.txt \
+	tracing/tracing-common.h $(am__append_282) $(am__append_286) \
+	$(am__append_290) pybind/CMakeLists.txt \
 	$(srcdir)/$(shell_scripts:%=%.in) $(srcdir)/vstart.sh \
 	$(srcdir)/stop.sh ceph-run $(srcdir)/ceph-osd-prestart.sh \
 	$(srcdir)/ceph_common.sh $(srcdir)/init-radosgw \
@@ -9270,7 +9320,7 @@ EXTRA_DIST = $(am__append_32) ceph-detect-init/AUTHORS.rst \
 	$(srcdir)/upstart/rbdmap.conf ceph.in ceph-disk-udev \
 	ceph-create-keys ceph-rest-api ceph-crush-location \
 	mount.fuse.ceph rbd-replay-many rbdmap etc-rbdmap yasm-wrapper \
-	unittest_bufferlist.sh
+	CMakeLists.txt unittest_bufferlist.sh
 CLEANFILES = $(BUILT_SOURCES) $(shell_scripts) ceph_ver.h \
 	sample.fetch_config
 dist_noinst_DATA = tracing/librados.tp tracing/librbd.tp \
@@ -9350,7 +9400,7 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	compressor/AsyncCompressor.h compressor/CompressionPlugin.h \
 	osdc/Filer.h osdc/Journaler.h osdc/ObjectCacher.h \
 	osdc/Objecter.h osdc/Striper.h osdc/WritebackHandler.h \
-	$(am__append_94) $(am__append_96) global/pidfile.h \
+	$(am__append_95) $(am__append_97) global/pidfile.h \
 	global/global_init.h global/global_context.h \
 	global/signal_handler.h json_spirit/json_spirit.h \
 	json_spirit/json_spirit_error_position.h \
@@ -9367,10 +9417,11 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	common/bloom_filter.hpp common/sctp_crc32.h \
 	common/crc32c_intel_baseline.h common/crc32c_intel_fast.h \
 	common/crc32c_aarch64.h common/cohort_lru.h common/sstring.hh \
-	xxHash/xxhash.h common/BackTrace.h common/RefCountedObj.h \
-	common/HeartbeatMap.h common/LogClient.h common/LogEntry.h \
-	common/Graylog.h common/Preforker.h common/SloppyCRCMap.h \
-	common/WorkQueue.h common/OpQueue.h common/PrioritizedQueue.h \
+	xxHash/xxhash.h common/AsyncOpTracker.h common/BackTrace.h \
+	common/RefCountedObj.h common/HeartbeatMap.h \
+	common/LogClient.h common/LogEntry.h common/Graylog.h \
+	common/Preforker.h common/SloppyCRCMap.h common/WorkQueue.h \
+	common/OpQueue.h common/PrioritizedQueue.h \
 	common/WeightedPriorityQueue.h common/ceph_argparse.h \
 	common/ceph_context.h common/xattr.h common/blkdev.h \
 	common/compiler_extensions.h common/debug.h common/dout.h \
@@ -9405,7 +9456,7 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	common/TracepointProvider.h common/event_socket.h \
 	common/PluginRegistry.h common/scrub_types.h \
 	common/ceph_time.h common/ceph_timer.h common/align.h \
-	common/mutex_debug.h common/shunique_lock.h $(am__append_116) \
+	common/mutex_debug.h common/shunique_lock.h $(am__append_117) \
 	common/secret.h msg/Connection.h msg/Dispatcher.h \
 	msg/Message.h msg/Messenger.h msg/SimplePolicyMessenger.h \
 	msg/msg_types.h msg/simple/Accepter.h \
@@ -9414,7 +9465,7 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	msg/async/AsyncConnection.h msg/async/AsyncMessenger.h \
 	msg/async/Event.h msg/async/EventEpoll.h \
 	msg/async/EventSelect.h msg/async/net_handler.h \
-	$(am__append_125) messages/MAuth.h messages/MAuthReply.h \
+	$(am__append_126) messages/MAuth.h messages/MAuthReply.h \
 	messages/MCacheExpire.h messages/MClientCaps.h \
 	messages/MClientCapRelease.h messages/MClientLease.h \
 	messages/MClientReconnect.h messages/MClientReply.h \
@@ -9508,12 +9559,12 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	include/util.h include/stat.h include/on_exit.h \
 	include/memory.h include/rados/memory.h \
 	include/unordered_set.h include/unordered_map.h \
-	include/timegm.h include/event_type.h $(am__append_132) \
-	$(am__append_135) $(am__append_136) $(am__append_141) \
-	$(am__append_151) $(am__append_153) $(am__append_156) \
-	$(am__append_157) $(am__append_163) $(am__append_199) \
-	$(am__append_205) $(am__append_217) $(am__append_225) \
-	$(am__append_231) $(am__append_243) test/bench/backend.h \
+	include/timegm.h include/event_type.h $(am__append_133) \
+	$(am__append_136) $(am__append_137) $(am__append_142) \
+	$(am__append_152) $(am__append_154) $(am__append_157) \
+	$(am__append_158) $(am__append_164) $(am__append_200) \
+	$(am__append_206) $(am__append_218) $(am__append_226) \
+	$(am__append_232) $(am__append_244) test/bench/backend.h \
 	test/bench/bencher.h test/bench/detailed_stat_collector.h \
 	test/bench/distribution.h test/bench/dumb_backend.h \
 	test/bench/rados_backend.h test/bench/rbd_backend.h \
@@ -9536,7 +9587,7 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	test/system/st_rados_list_objects.h \
 	test/system/st_rados_notify.h test/system/st_rados_watch.h \
 	test/system/systest_runnable.h test/system/systest_settings.h \
-	test/unit.h test/journal/RadosTestFixture.h $(am__append_268) \
+	test/unit.h test/journal/RadosTestFixture.h $(am__append_269) \
 	tools/cephfs/JournalTool.h tools/cephfs/JournalScanner.h \
 	tools/cephfs/JournalFilter.h tools/cephfs/EventOutput.h \
 	tools/cephfs/Resetter.h tools/cephfs/Dumper.h \
@@ -9548,42 +9599,42 @@ noinst_HEADERS = arch/intel.h arch/arm.h arch/probe.h \
 	bash_completion/ceph bash_completion/rados bash_completion/rbd \
 	bash_completion/radosgw-admin mount/canonicalize.c \
 	mount/mtab.c objclass/objclass.h
-bin_SCRIPTS = $(am__append_31) $(am__append_298) $(am__append_309) \
-	$(am__append_315)
-sbin_SCRIPTS = $(am__append_301)
+bin_SCRIPTS = $(am__append_31) $(am__append_299) $(am__append_310) \
+	$(am__append_316)
+sbin_SCRIPTS = $(am__append_302)
 su_sbin_SCRIPTS = 
 dist_bin_SCRIPTS = 
-lib_LTLIBRARIES = $(am__append_131) $(am__append_134) \
-	$(am__append_140) $(am__append_146) $(am__append_279) \
-	$(am__append_307) $(am__append_308)
+lib_LTLIBRARIES = $(am__append_132) $(am__append_135) \
+	$(am__append_141) $(am__append_147) $(am__append_280) \
+	$(am__append_308) $(am__append_309)
 noinst_LTLIBRARIES = libarch.la libauth.la libcrush.la libmon_types.la \
 	$(am__append_50) libosd_types.la $(am__append_88) \
 	liberasure_code.la libcompressor.la libosdc.la \
-	$(am__append_93) $(am__append_95) libglobal.la \
+	$(am__append_94) $(am__append_96) libglobal.la \
 	libjson_spirit.la liblog.la libperfglue.la \
-	libcommon_internal.la libcommon_crc.la $(am__append_114) \
-	libcommon.la $(am__append_117) libmsg.la $(am__append_127) \
-	librbd_types.la $(am__append_138) $(am__append_148) \
-	$(am__append_152) $(am__append_158) $(am__append_218) \
-	$(am__append_228) $(am__append_233) $(am__append_261) \
-	$(am__append_272) $(am__append_299)
+	libcommon_internal.la libcommon_crc.la $(am__append_115) \
+	libcommon.la $(am__append_118) libmsg.la $(am__append_128) \
+	librbd_types.la $(am__append_139) $(am__append_149) \
+	$(am__append_153) $(am__append_159) $(am__append_219) \
+	$(am__append_229) $(am__append_234) $(am__append_262) \
+	$(am__append_273) $(am__append_300)
 noinst_LIBRARIES = $(am__append_33) $(am__append_46) libos_types.a \
 	$(am__append_58) $(am__append_62) $(am__append_68)
-radoslib_LTLIBRARIES = $(am__append_154) $(am__append_155)
+radoslib_LTLIBRARIES = $(am__append_155) $(am__append_156)
 
 # like bin_PROGRAMS, but these targets are only built for debug builds
-bin_DEBUGPROGRAMS = $(am__append_97) $(am__append_150) \
-	$(am__append_165) $(am__append_219) $(am__append_220) \
-	$(am__append_221) $(am__append_222) $(am__append_224) \
-	$(am__append_226) $(am__append_232) $(am__append_234) \
-	$(am__append_235) $(am__append_238) $(am__append_240) \
-	$(am__append_241) $(am__append_242) $(am__append_244) \
-	$(am__append_246) $(am__append_248) $(am__append_249) \
-	$(am__append_255) ceph_test_timers ceph_test_signal_handlers \
-	ceph_test_rewrite_latency ceph_test_crypto $(am__append_260) \
+bin_DEBUGPROGRAMS = $(am__append_98) $(am__append_151) \
+	$(am__append_166) $(am__append_220) $(am__append_221) \
+	$(am__append_222) $(am__append_223) $(am__append_225) \
+	$(am__append_227) $(am__append_233) $(am__append_235) \
+	$(am__append_236) $(am__append_239) $(am__append_241) \
+	$(am__append_242) $(am__append_243) $(am__append_245) \
+	$(am__append_247) $(am__append_249) $(am__append_250) \
+	$(am__append_256) ceph_test_timers ceph_test_signal_handlers \
+	ceph_test_rewrite_latency ceph_test_crypto $(am__append_261) \
 	ceph_bench_log ceph_test_objectcacher_stress \
-	ceph_test_cfuse_cache_invalidate $(am__append_264) \
-	$(am__append_265) $(am__append_274) $(am__append_275) \
+	ceph_test_cfuse_cache_invalidate $(am__append_265) \
+	$(am__append_266) $(am__append_275) $(am__append_276) \
 	ceph_psim
 
 # like sbin_SCRIPTS but can be used to install to e.g. /usr/sbin
@@ -9593,12 +9644,12 @@ ceph_sbindir = $(sbindir)
 su_sbindir = /sbin
 
 # C/C++ tests to build and executed will be appended to this
-check_TESTPROGRAMS = $(am__append_181) $(am__append_185) \
-	$(am__append_188) $(am__append_223) $(am__append_227) \
-	$(am__append_236) $(am__append_245) $(am__append_247) \
-	$(am__append_251) $(am__append_252) $(am__append_256) \
-	$(am__append_257) $(am__append_258) $(am__append_259) \
-	unittest_addrs $(am__append_263) unittest_bloom_filter \
+check_TESTPROGRAMS = $(am__append_182) $(am__append_186) \
+	$(am__append_189) $(am__append_224) $(am__append_228) \
+	$(am__append_237) $(am__append_246) $(am__append_248) \
+	$(am__append_252) $(am__append_253) $(am__append_257) \
+	$(am__append_258) $(am__append_259) $(am__append_260) \
+	unittest_addrs $(am__append_264) unittest_bloom_filter \
 	unittest_histogram unittest_prioritized_queue \
 	unittest_weighted_priority_queue unittest_str_map \
 	unittest_mutex_debug unittest_shunique_lock \
@@ -9660,7 +9711,7 @@ check_TESTPROGRAMS = $(am__append_181) $(am__append_185) \
 # GNU Library Public License for more details.
 #
 check_SCRIPTS = ceph-detect-init/run-tox.sh ceph-disk/run-tox.sh \
-	$(am__append_162) $(am__append_230) \
+	$(am__append_163) $(am__append_231) \
 	test/ceph_objectstore_tool.py test/test-ceph-helpers.sh \
 	test/cephtool-test-osd.sh test/cephtool-test-mon.sh \
 	test/cephtool-test-mds.sh test/cephtool-test-rados.sh \
@@ -9716,7 +9767,7 @@ AM_COMMON_CFLAGS = \
 	-fsigned-char
 
 AM_CFLAGS = $(AM_COMMON_CFLAGS) $(am__append_6) $(am__append_12) \
-	$(am__append_99) $(am__append_102)
+	$(am__append_100) $(am__append_103)
 AM_CPPFLAGS = $(AM_COMMON_CPPFLAGS)
 
 # note: this is position dependant, it affects the -l options that
@@ -9781,29 +9832,29 @@ CEPH_GLOBAL = $(LIBGLOBAL) $(LIBCOMMON) $(PTHREAD_LIBS) -lm $(CRYPTO_LIBS) $(EXT
 
 # important; libmsg before libauth!
 LIBCOMMON_DEPS = libcommon_internal.la libcommon_crc.la \
-	$(am__append_113) $(LIBERASURE_CODE) $(LIBCOMPRESSOR) \
+	$(am__append_114) $(LIBERASURE_CODE) $(LIBCOMPRESSOR) \
 	$(LIBMSG) $(LIBAUTH) $(LIBCRUSH) $(LIBJSON_SPIRIT) $(LIBLOG) \
-	$(LIBARCH) $(BOOST_RANDOM_LIBS) -luuid $(am__append_115)
-LIBRADOS_DEPS = $(am__append_128)
-LIBRGW_DEPS = $(am__append_145)
-LIBCIVETWEB_DEPS = $(am__append_147)
+	$(LIBARCH) $(BOOST_RANDOM_LIBS) -luuid $(am__append_116)
+LIBRADOS_DEPS = $(am__append_129)
+LIBRGW_DEPS = $(am__append_146)
+LIBCIVETWEB_DEPS = $(am__append_148)
 
 # This is used by the dencoder test
 
 # Do not use TCMALLOC with dencoder
 DENCODER_SOURCES = $(am__append_48) perfglue/disabled_heap_profiler.cc \
-	perfglue/disabled_stubs.cc $(am__append_142)
-DENCODER_DEPS = $(am__append_49) $(am__append_137) $(am__append_143) \
-	$(am__append_159)
+	perfglue/disabled_stubs.cc $(am__append_143)
+DENCODER_DEPS = $(am__append_49) $(am__append_138) $(am__append_144) \
+	$(am__append_160)
 radoslibdir = $(libdir)/rados-classes
-LOCAL_ALL = ceph-detect-init-all ceph-disk-all $(am__append_282) \
-	$(am__append_286) $(am__append_290)
-LOCAL_CLEAN = ceph-detect-init-clean ceph-disk-clean $(am__append_283) \
-	$(am__append_287) $(am__append_291) base-clean-local
+LOCAL_ALL = ceph-detect-init-all ceph-disk-all $(am__append_283) \
+	$(am__append_287) $(am__append_291)
+LOCAL_CLEAN = ceph-detect-init-clean ceph-disk-clean $(am__append_284) \
+	$(am__append_288) $(am__append_292) base-clean-local
 LOCAL_INSTALLDATA = ceph-detect-init-install-data \
 	ceph-disk-install-data base-install-data-local
-LOCAL_INSTALLEXEC = $(am__append_284) $(am__append_288) \
-	$(am__append_292)
+LOCAL_INSTALLEXEC = $(am__append_285) $(am__append_289) \
+	$(am__append_293)
 libarch_la_SOURCES = \
 	arch/intel.c \
 	arch/arm.c \
@@ -9973,7 +10024,7 @@ erasure_codelib_LTLIBRARIES = libec_jerasure_generic.la \
 	libec_jerasure.la libec_lrc.la libec_shec_generic.la \
 	$(am__append_81) $(am__append_83) $(am__append_85) \
 	libec_shec.la $(am__append_90)
-check_LTLIBRARIES = $(am__append_170)
+check_LTLIBRARIES = $(am__append_171)
 jerasure_sources = \
   erasure-code/ErasureCode.cc \
   erasure-code/jerasure/jerasure/src/cauchy.c \
@@ -10280,7 +10331,7 @@ liberasure_code_la_DEPENDENCIES = $(erasure_codelib_LTLIBRARIES)
 @LINUX_TRUE at liberasure_code_la_LIBADD = -ldl
 compressorlibdir = $(pkglibdir)/compressor
 compressorlib_LTLIBRARIES = libceph_zlib.la libceph_snappy.la \
-	$(am__append_206)
+	$(am__append_207)
 zlib_sources = \
   compressor/Compressor.cc \
   compressor/zlib/CompressionPluginZlib.cc \
@@ -10291,7 +10342,7 @@ libceph_zlib_la_CFLAGS = ${AM_CFLAGS}
 libceph_zlib_la_CXXFLAGS = ${AM_CXXFLAGS} 
 libceph_zlib_la_LIBADD = $(LIBCRUSH) $(PTHREAD_LIBS) $(EXTRALIBS)
 libceph_zlib_la_LDFLAGS = ${AM_LDFLAGS} -lz -version-info 2:0:0 \
-	$(am__append_91)
+	$(am__append_92)
 snappy_sources = \
   compressor/Compressor.cc \
   compressor/snappy/CompressionPluginSnappy.cc
@@ -10305,7 +10356,7 @@ libceph_snappy_la_CXXFLAGS = ${AM_CXXFLAGS} \
 
 libceph_snappy_la_LIBADD = $(LIBCRUSH) $(PTHREAD_LIBS) $(EXTRALIBS)
 libceph_snappy_la_LDFLAGS = ${AM_LDFLAGS} -lsnappy -version-info 2:0:0 \
-	$(am__append_92)
+	$(am__append_93)
 libcompressor_la_SOURCES = \
 	compressor/Compressor.cc \
 	compressor/AsyncCompressor.cc
@@ -10351,17 +10402,17 @@ liblog_la_SOURCES = \
 	log/Log.cc \
 	log/SubsystemMap.cc
 
-libperfglue_la_SOURCES = $(am__append_98) $(am__append_101) \
-	$(am__append_104) $(am__append_105) $(am__append_106)
+libperfglue_la_SOURCES = $(am__append_99) $(am__append_102) \
+	$(am__append_105) $(am__append_106) $(am__append_107)
 @WITH_TCMALLOC_FALSE@@WITH_TCMALLOC_MINIMAL_TRUE at libperfglue_la_LIBADD = -ltcmalloc_minimal
 @WITH_TCMALLOC_TRUE at libperfglue_la_LIBADD = -ltcmalloc
 
 # these should go out of libcommon_internal
-libcommon_internal_la_SOURCES = ceph_ver.c common/DecayCounter.cc \
-	common/LogClient.cc common/LogEntry.cc common/Graylog.cc \
-	common/PrebufferedStreambuf.cc common/SloppyCRCMap.cc \
-	common/BackTrace.cc common/perf_counters.cc \
-	common/mutex_debug.cc common/Mutex.cc \
+libcommon_internal_la_SOURCES = ceph_ver.c common/AsyncOpTracker.cc \
+	common/DecayCounter.cc common/LogClient.cc common/LogEntry.cc \
+	common/Graylog.cc common/PrebufferedStreambuf.cc \
+	common/SloppyCRCMap.cc common/BackTrace.cc \
+	common/perf_counters.cc common/mutex_debug.cc common/Mutex.cc \
 	common/OutputDataSocket.cc common/admin_socket.cc \
 	common/admin_socket_client.cc common/cmdparse.cc \
 	common/escape.c common/io_priority.cc common/ceph_time.cc \
@@ -10386,9 +10437,9 @@ libcommon_internal_la_SOURCES = ceph_ver.c common/DecayCounter.cc \
 	common/bloom_filter.cc common/module.c common/Readahead.cc \
 	common/Cycles.cc common/ContextCompletion.cc \
 	common/TracepointProvider.cc common/PluginRegistry.cc \
-	common/scrub_types.cc common/blkdev.cc $(am__append_107) \
-	$(am__append_108) $(am__append_109) $(am__append_110) \
-	$(am__append_111) mon/MonCap.cc mon/MonClient.cc mon/MonMap.cc \
+	common/scrub_types.cc common/blkdev.cc $(am__append_108) \
+	$(am__append_109) $(am__append_110) $(am__append_111) \
+	$(am__append_112) mon/MonCap.cc mon/MonClient.cc mon/MonMap.cc \
 	osd/OSDMap.cc osd/osd_types.cc osd/ECMsgTypes.cc osd/HitSet.cc \
 	mds/MDSMap.cc mds/FSMap.cc mds/inode_backtrace.cc \
 	mds/mdstypes.cc mds/flock.cc
@@ -10396,10 +10447,10 @@ libcommon_internal_la_SOURCES = ceph_ver.c common/DecayCounter.cc \
 # inject crc in common
 libcommon_crc_la_SOURCES = common/sctp_crc32.c common/crc32c.cc \
 	common/crc32c_intel_baseline.c common/crc32c_intel_fast.c \
-	$(am__append_112)
+	$(am__append_113)
 @WITH_GOOD_YASM_ELF64_TRUE at libcommon_crc_la_LIBTOOLFLAGS = --tag=CC
 @HAVE_ARMV8_CRC_TRUE at libcommon_crc_aarch64_la_SOURCES = common/crc32c_aarch64.c
- at HAVE_ARMV8_CRC_TRUE@libcommon_crc_aarch64_la_CFLAGS = $(AM_CFLAGS) $(ARM_CRC_FLAGS)
+ at HAVE_ARMV8_CRC_TRUE@libcommon_crc_aarch64_la_CFLAGS = $(AM_CFLAGS) $(ARM_ARCH_FLAGS)
 libcommon_la_SOURCES = common/buffer.cc
 libcommon_la_LIBADD = $(LIBCOMMON_DEPS)
 libsecret_la_SOURCES = common/secret.c
@@ -10410,9 +10461,9 @@ libmsg_la_SOURCES = msg/Message.cc msg/Messenger.cc msg/msg_types.cc \
 	msg/simple/SimpleMessenger.cc msg/async/AsyncConnection.cc \
 	msg/async/AsyncMessenger.cc msg/async/Event.cc \
 	msg/async/net_handler.cc msg/async/EventSelect.cc \
-	$(am__append_118) $(am__append_119) $(am__append_120) \
-	$(am__append_121) $(am__append_122) $(am__append_123) \
-	$(am__append_124)
+	$(am__append_119) $(am__append_120) $(am__append_121) \
+	$(am__append_122) $(am__append_123) $(am__append_124) \
+	$(am__append_125)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at rados_includedir = $(includedir)/rados
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at rados_include_DATA = $(srcdir)/include/rados/librados.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/include/rados/rados_types.h \
@@ -10423,7 +10474,7 @@ libmsg_la_SOURCES = msg/Message.cc msg/Messenger.cc msg/msg_types.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/include/page.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/include/crc32c.h \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(srcdir)/include/memory.h \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(am__append_126)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(am__append_127)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at librbd_includedir = $(includedir)/rbd
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at librbd_include_DATA = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(srcdir)/include/rbd/features.h \
@@ -10455,12 +10506,12 @@ libmsg_la_SOURCES = msg/Message.cc msg/Messenger.cc msg/msg_types.cc \
 # We need this to avoid basename conflicts with the librados build tests in test/Makefile.am
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at librados_la_CXXFLAGS =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	${AM_CXXFLAGS} \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(am__append_129)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(am__append_130)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at librados_la_LIBADD = $(LIBRADOS_DEPS) $(PTHREAD_LIBS) $(CRYPTO_LIBS) $(EXTRALIBS)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at librados_la_LDFLAGS =  \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	${AM_LDFLAGS} \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	-version-info 2:0:0 \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(am__append_130)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	$(am__append_131)
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at libradosstriper_la_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	libradosstriper/libradosstriper.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	libradosstriper/RadosStriperImpl.cc \
@@ -10474,9 +10525,8 @@ libmsg_la_SOURCES = msg/Message.cc msg/Messenger.cc msg/msg_types.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE at libradosstriper_la_LDFLAGS = ${AM_LDFLAGS} \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	-version-info \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	1:0:0 \
- at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	$(am__append_133)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSSTRIPER_TRUE@@WITH_RADOS_TRUE@	$(am__append_134)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at libjournal_la_SOURCES = \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/AsyncOpTracker.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Entry.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/Future.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	journal/FutureImpl.cc \
@@ -10570,7 +10620,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at librbd_la_LDFLAGS = ${AM_LDFLAGS} \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	-version-info \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	1:0:0 \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_139)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_140)
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at librbd_la_CXXFLAGS = -fvisibility=hidden -fvisibility-inlines-hidden
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at librgw_la_SOURCES = rgw/rgw_acl.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_acl_s3.cc \
@@ -10640,7 +10690,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_xml.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_xml_enc.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	rgw/rgw_website.cc \
- at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	$(am__append_144)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	$(am__append_145)
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at librgw_la_CXXFLAGS = -Woverloaded-virtual -fPIC -I$(srcdir)/xxHash \
 @ENABLE_CLIENT_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	${AM_CXXFLAGS}
 
@@ -10844,7 +10894,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(BOOST_PROGRAM_OPTIONS_LIBS) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_164)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_165)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at ceph_erasure_code_non_regression_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/ceph_erasure_code_non_regression.cc
 
@@ -10852,7 +10902,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(BOOST_PROGRAM_OPTIONS_LIBS) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_166)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_167)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at ceph_erasure_code_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/ceph_erasure_code.cc
 
@@ -10860,7 +10910,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(BOOST_PROGRAM_OPTIONS_LIBS) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_168)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_169)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_example_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	erasure-code/ErasureCode.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/ErasureCodePluginExample.cc
@@ -10872,7 +10922,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_169)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_170)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_missing_entry_point_la_SOURCES = test/erasure-code/ErasureCodePluginMissingEntryPoint.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_missing_entry_point_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_missing_entry_point_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10881,7 +10931,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_171)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_172)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_missing_version_la_SOURCES = test/erasure-code/ErasureCodePluginMissingVersion.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_missing_version_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_missing_version_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10890,7 +10940,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_172)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_173)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_hangs_la_SOURCES = test/erasure-code/ErasureCodePluginHangs.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_hangs_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_hangs_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10899,7 +10949,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_173)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_174)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_fail_to_initialize_la_SOURCES = test/erasure-code/ErasureCodePluginFailToInitialize.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_fail_to_initialize_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_fail_to_initialize_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10908,7 +10958,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_174)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_175)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_fail_to_register_la_SOURCES = test/erasure-code/ErasureCodePluginFailToRegister.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_fail_to_register_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_fail_to_register_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10917,7 +10967,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_175)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_176)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_neon_la_SOURCES = test/erasure-code/TestJerasurePluginNEON.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_neon_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_neon_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10926,7 +10976,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_176)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_177)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_sse4_la_SOURCES = test/erasure-code/TestJerasurePluginSSE4.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_sse4_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_sse4_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10935,7 +10985,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_177)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_178)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_sse3_la_SOURCES = test/erasure-code/TestJerasurePluginSSE3.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_sse3_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_sse3_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10944,7 +10994,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_178)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_179)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_generic_la_SOURCES = test/erasure-code/TestJerasurePluginGeneric.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_generic_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_jerasure_generic_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -10953,7 +11003,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_179)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_180)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_plugin_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	erasure-code/ErasureCode.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodePlugin.cc 
@@ -10963,7 +11013,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_180)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_181)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	erasure-code/ErasureCode.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCode.cc
@@ -10986,7 +11036,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_182)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_183)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_plugin_jerasure_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodePluginJerasure.cc
 
@@ -10995,7 +11045,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_183)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_184)
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_isa_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	erasure-code/ErasureCode.cc \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeIsa.cc
@@ -11007,7 +11057,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	libisa.la \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(LIBERASURE_CODE) \
- at ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(am__append_184)
+ at ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(am__append_185)
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_plugin_isa_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	erasure-code/ErasureCode.cc \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodePluginIsa.cc
@@ -11018,7 +11068,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(LIBERASURE_CODE) \
- at ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(am__append_186)
+ at ENABLE_SERVER_TRUE@@WITH_BETTER_YASM_ELF64_TRUE@@WITH_OSD_TRUE@	$(am__append_187)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_lrc_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeLrc.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${lrc_sources}
@@ -11028,7 +11078,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_187)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_188)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_plugin_lrc_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodePluginLrc.cc
 
@@ -11037,7 +11087,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_189)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_190)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_shec_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeShec.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${shec_sources}
@@ -11058,7 +11108,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_190)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_191)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_shec_all_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeShec_all.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${shec_sources}
@@ -11079,7 +11129,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_191)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_192)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_shec_thread_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeShec_thread.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${shec_sources}
@@ -11100,7 +11150,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_192)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_193)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_shec_arguments_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeShec_arguments.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${shec_sources}
@@ -11121,7 +11171,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_193)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_194)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_plugin_shec_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@        test/erasure-code/TestErasureCodePluginShec.cc
 
@@ -11130,7 +11180,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_194)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_195)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_neon_la_SOURCES = test/erasure-code/TestShecPluginNEON.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_neon_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_neon_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -11139,7 +11189,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_195)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_196)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_sse4_la_SOURCES = test/erasure-code/TestShecPluginSSE4.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_sse4_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_sse4_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -11148,7 +11198,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_196)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_197)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_sse3_la_SOURCES = test/erasure-code/TestShecPluginSSE3.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_sse3_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_sse3_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -11157,7 +11207,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_197)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_198)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_generic_la_SOURCES = test/erasure-code/TestShecPluginGeneric.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_generic_la_CFLAGS = ${AM_CFLAGS}
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libec_test_shec_generic_la_CXXFLAGS = ${AM_CXXFLAGS}
@@ -11166,7 +11216,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${AM_LDFLAGS} -module \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-avoid-version -shared \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	-rpath /nowhere \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_198)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_199)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_erasure_code_example_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	erasure-code/ErasureCode.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/erasure-code/TestErasureCodeExample.cc
@@ -11184,7 +11234,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(PTHREAD_LIBS) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(EXTRALIBS) \
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_200)
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_201)
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at simple_client_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/simple_client.cc \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/simple_dispatcher.cc
@@ -11196,7 +11246,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(PTHREAD_LIBS) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(EXTRALIBS) \
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_201)
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_202)
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at xio_server_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/xio_server.cc \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/xio_dispatcher.cc
@@ -11208,7 +11258,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(PTHREAD_LIBS) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(EXTRALIBS) \
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_203)
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_204)
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE at xio_client_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/xio_client.cc \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	test/messenger/xio_dispatcher.cc
@@ -11220,7 +11270,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(PTHREAD_LIBS) \
 @ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(EXTRALIBS) \
- at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_204)
+ at ENABLE_SERVER_TRUE@@ENABLE_XIO_TRUE@	$(am__append_205)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at libceph_example_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	compressor/Compressor.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/compressor/compressor_plugin_example.cc
@@ -11238,7 +11288,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_207)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_208)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_snappy_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/compressor/test_compression_snappy.cc \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	${snappy_sources}
@@ -11248,7 +11298,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_208)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_209)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_snappy_LDFLAGS = -lsnappy
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_plugin_snappy_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/compressor/test_compression_plugin_snappy.cc \
@@ -11260,7 +11310,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBCOMPRESSOR) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_209)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_210)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_plugin_snappy_LDFLAGS = -lsnappy
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_zlib_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/compressor/test_compression_zlib.cc \
@@ -11271,7 +11321,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBCOMMON) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_210)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_211)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_zlib_LDFLAGS = -lz
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_plugin_zlib_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	test/compressor/test_compression_plugin_zlib.cc \
@@ -11283,7 +11333,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBCOMPRESSOR) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_211)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_212)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_compression_plugin_zlib_LDFLAGS = -lz
 
 # This should use LIBMDS_TYPES once it exists
@@ -11304,10 +11354,10 @@ librbd_types_la_SOURCES = \
 
 # These should always use explicit _CFLAGS/_CXXFLAGS so avoid basename conflicts
 @ENABLE_CLIENT_TRUE at ceph_dencoder_CFLAGS = ${AM_CFLAGS} \
- at ENABLE_CLIENT_TRUE@	$(am__append_212)
+ at ENABLE_CLIENT_TRUE@	$(am__append_213)
 @ENABLE_CLIENT_TRUE at ceph_dencoder_CXXFLAGS = ${AM_CXXFLAGS} \
- at ENABLE_CLIENT_TRUE@	$(am__append_213) $(am__append_214) \
- at ENABLE_CLIENT_TRUE@	$(am__append_215)
+ at ENABLE_CLIENT_TRUE@	$(am__append_214) $(am__append_215) \
+ at ENABLE_CLIENT_TRUE@	$(am__append_216)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE at libradostest_la_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados/test.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@	test/librados/TestCase.cc
@@ -11746,7 +11796,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	test/libcephfs/multiclient.cc \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	test/libcephfs/access.cc \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	test/libcephfs/acl.cc \
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	$(am__append_237)
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	$(am__append_238)
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at ceph_test_libcephfs_LDADD = $(LIBRADOS) $(LIBCEPHFS) $(LIBCOMMON) $(UNITTEST_LDADD)
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at ceph_test_libcephfs_CXXFLAGS = $(UNITTEST_CXXFLAGS)
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at unittest_encoding_SOURCES = test/encoding.cc
@@ -11769,7 +11819,7 @@ librbd_types_la_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	-Wignored-qualifiers \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	-Wold-style-definition \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	-Wtype-limits \
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	$(am__append_239)
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	$(am__append_240)
 @ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE at test_build_librgw_SOURCES = \
 @ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	test/buildtest_skeleton.cc \
 @ENABLE_CLIENT_TRUE@@WITH_BUILD_TESTS_TRUE@@WITH_RADOSGW_TRUE@@WITH_RADOS_TRUE@	$(librgw_la_SOURCES)
@@ -11997,13 +12047,13 @@ librbd_types_la_SOURCES = \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_osdscrub_LDADD =  \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_253)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_254)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_pglog_SOURCES = test/osd/TestPGLog.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_pglog_CXXFLAGS = $(UNITTEST_CXXFLAGS)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_pglog_LDADD = $(LIBOSD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(UNITTEST_LDADD) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_254)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_255)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_hitset_SOURCES = test/osd/hitset.cc
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_hitset_CXXFLAGS = $(UNITTEST_CXXFLAGS)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at unittest_hitset_LDADD = $(LIBOSD) $(UNITTEST_LDADD) $(CEPH_GLOBAL)
@@ -12070,7 +12120,7 @@ UNITTEST_CXXFLAGS = \
 UNITTEST_LDADD = $(top_builddir)/src/gmock/lib/libgmock_main.la \
 	$(top_builddir)/src/gmock/lib/libgmock.la \
 	$(top_builddir)/src/gmock/gtest/lib/libgtest.la \
-	$(PTHREAD_LIBS) $(am__append_262)
+	$(PTHREAD_LIBS) $(am__append_263)
 unittest_addrs_SOURCES = test/test_addrs.cc
 unittest_addrs_CXXFLAGS = $(UNITTEST_CXXFLAGS)
 unittest_addrs_LDADD = $(UNITTEST_LDADD) $(CEPH_GLOBAL)
@@ -12313,7 +12363,7 @@ ceph_test_cfuse_cache_invalidate_SOURCES = test/test_cfuse_cache_invalidate.cc
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/action/Snap.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/action/Status.cc \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	tools/rbd/action/Watch.cc \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_267)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_268)
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at rbd_LDADD = libjournal.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	libcls_journal_client.la \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	libcls_rbd_client.la \
@@ -12324,7 +12374,7 @@ ceph_test_cfuse_cache_invalidate_SOURCES = test/test_cfuse_cache_invalidate.cc
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(BOOST_REGEX_LIBS) \
 @ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(BOOST_PROGRAM_OPTIONS_LIBS) \
- at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_269)
+ at ENABLE_CLIENT_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE@	$(am__append_270)
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at rbd_nbd_SOURCES = tools/rbd_nbd/rbd-nbd.cc
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at rbd_nbd_CXXFLAGS = $(AM_CXXFLAGS)
 @ENABLE_CLIENT_TRUE@@LINUX_TRUE@@WITH_RADOS_TRUE@@WITH_RBD_TRUE at rbd_nbd_LDADD = $(LIBRBD) $(LIBRADOS) $(CEPH_GLOBAL) $(BOOST_REGEX_LIBS)
@@ -12382,12 +12432,17 @@ ceph_test_cfuse_cache_invalidate_SOURCES = test/test_cfuse_cache_invalidate.cc
 @ENABLE_SERVER_TRUE at ceph_kvstore_tool_CXXFLAGS = $(UNITTEST_CXXFLAGS)
 @ENABLE_SERVER_TRUE@@WITH_MON_TRUE at ceph_monstore_update_crushdir = $(libdir)/ceph
 @ENABLE_SERVER_TRUE@@WITH_MON_TRUE at ceph_monstore_update_crush_SCRIPTS = tools/ceph-monstore-update-crush.sh
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at ceph_objectstore_tool_SOURCES = tools/ceph_objectstore_tool.cc tools/RadosDump.cc
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at ceph_objectstore_tool_SOURCES = \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	tools/ceph_objectstore_tool.cc \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	tools/rebuild_mondb.cc \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	tools/rebuild_mondb.h \
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	tools/RadosDump.cc
+
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at ceph_objectstore_tool_LDADD =  \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBOS) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(BOOST_PROGRAM_OPTIONS_LIBS) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_276)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_277)
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE at cephfs_journal_tool_SOURCES = \
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@	tools/cephfs/cephfs-journal-tool.cc \
 @ENABLE_CLIENT_TRUE@@ENABLE_SERVER_TRUE@@WITH_MDS_TRUE@@WITH_RADOS_TRUE@	tools/cephfs/JournalTool.cc \
@@ -12493,7 +12548,7 @@ editpaths = sed \
 	-e 's|@@GCOV_PREFIX_STRIP[@][@]|$(GCOV_PREFIX_STRIP)|g'
 
 shell_scripts = ceph-debugpack ceph-post-file ceph-crush-location \
-	$(am__append_311)
+	$(am__append_312)
 doc_DATA = $(srcdir)/sample.ceph.conf sample.fetch_config
 
 # various scripts in $(libexecdir)
@@ -12513,11 +12568,11 @@ AM_TESTS_ENVIRONMENT = export CEPH_ROOT="$(abs_top_srcdir)"; export \
 	PATH="$(abs_srcdir):$$PATH";
 
 # pybind
-python_PYTHON = $(am__append_293) $(am__append_305) $(am__append_310)
+python_PYTHON = $(am__append_294) $(am__append_306) $(am__append_311)
 @ENABLE_CLIENT_TRUE at bash_completiondir = $(sysconfdir)/bash_completion.d
 @ENABLE_CLIENT_TRUE at bash_completion_DATA =  \
 @ENABLE_CLIENT_TRUE@	$(srcdir)/bash_completion/ceph \
- at ENABLE_CLIENT_TRUE@	$(am__append_295) $(am__append_297)
+ at ENABLE_CLIENT_TRUE@	$(am__append_296) $(am__append_298)
 @ENABLE_CLIENT_TRUE at ceph_syn_SOURCES = ceph_syn.cc \
 @ENABLE_CLIENT_TRUE@	client/SyntheticClient.cc # uses g_conf.. \
 @ENABLE_CLIENT_TRUE@	needs cleanup
@@ -12546,7 +12601,7 @@ python_PYTHON = $(am__append_293) $(am__append_305) $(am__append_310)
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	1:0:0 \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	-export-symbols-regex \
 @ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	'^ceph_.*' \
- at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	$(am__append_306)
+ at ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE@	$(am__append_307)
 
 # jni library (java source is in src/java)
 @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at libcephfs_jni_la_SOURCES = \
@@ -12559,7 +12614,7 @@ python_PYTHON = $(am__append_293) $(am__append_305) $(am__append_310)
 @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at libcephfs_jni_la_CPPFLAGS = $(JDK_CPPFLAGS) $(AM_CPPFLAGS)
 @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at libcephfs_jni_la_LDFLAGS = ${AM_LDFLAGS} -version-info 1:0:0
 @ENABLE_SERVER_TRUE at ceph_sbin_SCRIPTS = ceph-create-keys \
- at ENABLE_SERVER_TRUE@	$(am__append_314)
+ at ENABLE_SERVER_TRUE@	$(am__append_315)
 @ENABLE_SERVER_TRUE@@WITH_MON_TRUE at ceph_mon_SOURCES = ceph_mon.cc
 @ENABLE_SERVER_TRUE@@WITH_MON_TRUE at ceph_mon_LDADD = $(LIBMON) $(LIBOS) $(CEPH_GLOBAL) $(LIBCOMMON) $(LIBAUTH) $(LIBCOMMON) $(LIBMON_TYPES)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE at ceph_osd_SOURCES = ceph_osd.cc
@@ -12567,7 +12622,7 @@ python_PYTHON = $(am__append_293) $(am__append_305) $(am__append_310)
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOSD) $(LIBOSD_TYPES) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(LIBOS_TYPES) $(LIBOS) \
 @ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(CEPH_GLOBAL) $(LIBCOMMON) \
- at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_316)
+ at ENABLE_SERVER_TRUE@@WITH_OSD_TRUE@	$(am__append_317)
 @ENABLE_SERVER_TRUE@@WITH_MDS_TRUE at ceph_mds_SOURCES = ceph_mds.cc
 @ENABLE_SERVER_TRUE@@WITH_MDS_TRUE at ceph_mds_LDADD = $(LIBMDS) $(LIBOSDC) $(CEPH_GLOBAL) $(LIBCOMMON)
 @ENABLE_COVERAGE_TRUE@@ENABLE_SERVER_TRUE at COV_DIR = $(DESTDIR)$(libdir)/ceph/coverage
@@ -12590,7 +12645,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/Makefile-env.am $(srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --gnu src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -12599,7 +12653,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(srcdir)/Makefile-env.am $(srcdir)/arch/Makefile.am $(srcdir)/auth/Makefile.am $(srcdir)/brag/Makefile.am $(srcdir)/ceph-detect-init/Makefile.am $(srcdir)/ceph-disk/Makefile.am $(srcdir)/crush/Makefile.am $(srcdir)/kv/Makefile.am $(srcdir)/mon/Makefile.am $(srcdir)/mds/Makefile.am $(srcdir)/mds/Makefile-client.am $(srcdir)/mds/Makefile-server.am $(srcdir)/os/Makefile.am $(srcdir)/osd/Makefile.am $(srcdir)/erasure-code/Makefile.am $(srcdir)/erasure-code/jerasure/Makefile.am $(srcdir)/era [...]
+$(srcdir)/Makefile-env.am $(srcdir)/arch/Makefile.am $(srcdir)/auth/Makefile.am $(srcdir)/brag/Makefile.am $(srcdir)/ceph-detect-init/Makefile.am $(srcdir)/ceph-disk/Makefile.am $(srcdir)/crush/Makefile.am $(srcdir)/kv/Makefile.am $(srcdir)/mon/Makefile.am $(srcdir)/mds/Makefile.am $(srcdir)/mds/Makefile-client.am $(srcdir)/mds/Makefile-server.am $(srcdir)/os/Makefile.am $(srcdir)/osd/Makefile.am $(srcdir)/erasure-code/Makefile.am $(srcdir)/erasure-code/jerasure/Makefile.am $(srcdir)/era [...]
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -13521,6 +13575,8 @@ common/libcommon_crc_aarch64_la-crc32c_aarch64.lo:  \
 
 libcommon_crc_aarch64.la: $(libcommon_crc_aarch64_la_OBJECTS) $(libcommon_crc_aarch64_la_DEPENDENCIES) $(EXTRA_libcommon_crc_aarch64_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(libcommon_crc_aarch64_la_LINK) $(am_libcommon_crc_aarch64_la_rpath) $(libcommon_crc_aarch64_la_OBJECTS) $(libcommon_crc_aarch64_la_LIBADD) $(LIBS)
+common/AsyncOpTracker.lo: common/$(am__dirstamp) \
+	common/$(DEPDIR)/$(am__dirstamp)
 common/DecayCounter.lo: common/$(am__dirstamp) \
 	common/$(DEPDIR)/$(am__dirstamp)
 common/LogClient.lo: common/$(am__dirstamp) \
@@ -14626,8 +14682,6 @@ journal/$(am__dirstamp):
 journal/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) journal/$(DEPDIR)
 	@: > journal/$(DEPDIR)/$(am__dirstamp)
-journal/AsyncOpTracker.lo: journal/$(am__dirstamp) \
-	journal/$(DEPDIR)/$(am__dirstamp)
 journal/Entry.lo: journal/$(am__dirstamp) \
 	journal/$(DEPDIR)/$(am__dirstamp)
 journal/Future.lo: journal/$(am__dirstamp) \
@@ -15854,6 +15908,8 @@ ceph-monstore-tool$(EXEEXT): $(ceph_monstore_tool_OBJECTS) $(ceph_monstore_tool_
 	$(AM_V_CXXLD)$(CXXLINK) $(ceph_monstore_tool_OBJECTS) $(ceph_monstore_tool_LDADD) $(LIBS)
 tools/ceph_objectstore_tool.$(OBJEXT): tools/$(am__dirstamp) \
 	tools/$(DEPDIR)/$(am__dirstamp)
+tools/rebuild_mondb.$(OBJEXT): tools/$(am__dirstamp) \
+	tools/$(DEPDIR)/$(am__dirstamp)
 tools/RadosDump.$(OBJEXT): tools/$(am__dirstamp) \
 	tools/$(DEPDIR)/$(am__dirstamp)
 
@@ -19117,6 +19173,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at cls/version/$(DEPDIR)/cls_version.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at cls/version/$(DEPDIR)/cls_version_client.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at cls/version/$(DEPDIR)/cls_version_types.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/AsyncOpTracker.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/BackTrace.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/Clock.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at common/$(DEPDIR)/ConfUtils.Plo at am__quote@
@@ -19546,7 +19603,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at global/$(DEPDIR)/signal_handler.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at java/native/$(DEPDIR)/libcephfs_jni_la-JniConstants.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at java/native/$(DEPDIR)/libcephfs_jni_la-libcephfs_jni.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at journal/$(DEPDIR)/AsyncOpTracker.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at journal/$(DEPDIR)/Entry.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at journal/$(DEPDIR)/Future.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at journal/$(DEPDIR)/FutureImpl.Plo at am__quote@
@@ -20357,6 +20413,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at tools/$(DEPDIR)/osdmaptool.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at tools/$(DEPDIR)/psim.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at tools/$(DEPDIR)/radosacl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at tools/$(DEPDIR)/rebuild_mondb.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at tools/$(DEPDIR)/scratchtool.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at tools/$(DEPDIR)/scratchtoolpp.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at tools/cephfs/$(DEPDIR)/DataScan.Po at am__quote@
@@ -30988,7 +31045,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -32625,6 +32682,8 @@ uninstall-am: uninstall-bash_completionDATA uninstall-binPROGRAMS \
 	uninstall-sbinSCRIPTS uninstall-su_sbinPROGRAMS \
 	uninstall-su_sbinSCRIPTS uninstall-submanDATA
 
+.PRECIOUS: Makefile
+
 
 # display the output of failed check_SCRIPTS after a failed make check
 export VERBOSE = true
diff --git a/src/acconfig.h.in b/src/acconfig.h.in
index 7641adb..5655d79 100644
--- a/src/acconfig.h.in
+++ b/src/acconfig.h.in
@@ -440,8 +440,7 @@
 /* Define to 1 if the system has the type `__u8'. */
 #undef HAVE___U8
 
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
 
 /* Defined if you do not have atomic_ops */
diff --git a/src/auth/Crypto.h b/src/auth/Crypto.h
index 3bfc5aa..478f073 100644
--- a/src/auth/Crypto.h
+++ b/src/auth/Crypto.h
@@ -107,10 +107,12 @@ public:
   int create(CephContext *cct, int type);
   int encrypt(CephContext *cct, const bufferlist& in, bufferlist& out,
 	       std::string *error) const {
+    assert(ckh); // Bad key?
     return ckh->encrypt(in, out, error);
   }
   int decrypt(CephContext *cct, const bufferlist& in, bufferlist& out,
 	       std::string *error) const {
+    assert(ckh); // Bad key?
     return ckh->decrypt(in, out, error);
   }
 
diff --git a/src/auth/cephx/CephxClientHandler.cc b/src/auth/cephx/CephxClientHandler.cc
index ff32a42..7c1f550 100644
--- a/src/auth/cephx/CephxClientHandler.cc
+++ b/src/auth/cephx/CephxClientHandler.cc
@@ -46,6 +46,12 @@ int CephxClientHandler::build_request(bufferlist& bl) const
       return -ENOENT;
     }
 
+    // is the key OK?
+    if (!secret.get_secret().length()) {
+      ldout(cct, 20) << "secret for entity " << cct->_conf->name << " is invalid" << dendl;
+      return -EINVAL;
+    }
+
     CephXAuthenticate req;
     get_random_bytes((char *)&req.client_challenge, sizeof(req.client_challenge));
     std::string error;
diff --git a/src/auth/cephx/CephxProtocol.cc b/src/auth/cephx/CephxProtocol.cc
index f2a00dd..0e668c6 100644
--- a/src/auth/cephx/CephxProtocol.cc
+++ b/src/auth/cephx/CephxProtocol.cc
@@ -60,7 +60,10 @@ bool cephx_build_service_ticket_blob(CephContext *cct, CephXSessionAuthInfo& inf
 	   << " ticket_info.ticket.name=" << ticket_info.ticket.name.to_str() << dendl;
   blob.secret_id = info.secret_id;
   std::string error;
-  encode_encrypt_enc_bl(cct, ticket_info, info.service_secret, blob.blob, error);
+  if (!info.service_secret.get_secret().length())
+    error = "invalid key";  // Bad key?
+  else
+    encode_encrypt_enc_bl(cct, ticket_info, info.service_secret, blob.blob, error);
   if (!error.empty()) {
     ldout(cct, -1) << "cephx_build_service_ticket_blob failed with error "
 	  << error << dendl;
@@ -428,7 +431,10 @@ bool cephx_verify_authorizer(CephContext *cct, KeyStore *keys,
     }
   }
   std::string error;
-  decode_decrypt_enc_bl(cct, ticket_info, service_secret, ticket.blob, error);
+  if (!service_secret.get_secret().length())
+    error = "invalid key";  // Bad key?
+  else
+    decode_decrypt_enc_bl(cct, ticket_info, service_secret, ticket.blob, error);
   if (!error.empty()) {
     ldout(cct, 0) << "verify_authorizer could not decrypt ticket info: error: "
       << error << dendl;
diff --git a/src/ceph-create-keys b/src/ceph-create-keys
index f9cc219..8031b2f 100755
--- a/src/ceph-create-keys
+++ b/src/ceph-create-keys
@@ -92,24 +92,41 @@ def get_key(cluster, mon_id):
                 os.fchmod(f.fileno(), 0600)
                 os.fchown(f.fileno(), get_ceph_uid(), get_ceph_gid())
                 LOG.info('Talking to monitor...')
-                returncode = subprocess.call(
-                    args=[
-                        'ceph',
+
+                args_prefix = [
+                        "ceph",
                         '--cluster={cluster}'.format(cluster=cluster),
                         '--name=mon.',
                         '--keyring=/var/lib/ceph/mon/{cluster}-{mon_id}/keyring'.format(
                             cluster=cluster,
                             mon_id=mon_id,
                             ),
+                        ]
+
+                # First try getting the key if it already exists, to handle
+                # the case where it exists but doesn't match the caps
+                # we would pass into get-or-create.
+                returncode = subprocess.call(
+                    args=args_prefix + [
                         'auth',
-                        'get-or-create',
+                        'get',
                         'client.admin',
-                        'mon', 'allow *',
-                        'osd', 'allow *',
-                        'mds', 'allow *',
                         ],
                     stdout=f,
                     )
+                if returncode == errno.ENOENT:
+                    returncode = subprocess.call(
+                        args=args_prefix + [
+                            'auth',
+                            'get-or-create',
+                            'client.admin',
+                            'mon', 'allow *',
+                            'osd', 'allow *',
+                            'mds', 'allow *',
+                            ],
+                        stdout=f,
+                        )
+
             if returncode != 0:
                 if returncode == errno.EPERM or returncode == errno.EACCES:
                     LOG.info('Cannot get or create admin key, permission denied')
diff --git a/src/ceph-detect-init/CMakeLists.txt b/src/ceph-detect-init/CMakeLists.txt
new file mode 100644
index 0000000..1fb2440
--- /dev/null
+++ b/src/ceph-detect-init/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_custom_target(ceph-detect-init
+  COMMAND
+  ${CMAKE_SOURCE_DIR}/src/tools/setup-virtualenv.sh ${CMAKE_BINARY_DIR}/ceph-detect-init-virtualenv &&
+  virtualenv/bin/pip install --no-index --use-wheel --find-links=file:${CMAKE_SOURCE_DIR}/src/ceph-detect-init/wheelhouse -e .
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/ceph-detect-init
+  COMMENT "ceph-detect-init is being created")
diff --git a/src/ceph-detect-init/Makefile.am b/src/ceph-detect-init/Makefile.am
index 8ddcb1e..3926ac4 100644
--- a/src/ceph-detect-init/Makefile.am
+++ b/src/ceph-detect-init/Makefile.am
@@ -22,6 +22,7 @@ check_SCRIPTS += ceph-detect-init/run-tox.sh
 
 EXTRA_DIST += \
 	ceph-detect-init/AUTHORS.rst \
+	ceph-detect-init/CMakeLists.txt \
 	ceph-detect-init/ceph_detect_init/centos/__init__.py \
 	ceph-detect-init/ceph_detect_init/exc.py \
 	ceph-detect-init/ceph_detect_init/main.py \
diff --git a/src/ceph-disk/CMakeLists.txt b/src/ceph-disk/CMakeLists.txt
new file mode 100644
index 0000000..a298bb1
--- /dev/null
+++ b/src/ceph-disk/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_custom_target(ceph-disk
+  COMMAND
+  ${CMAKE_SOURCE_DIR}/src/tools/setup-virtualenv.sh ${CMAKE_BINARY_DIR}/ceph-disk-virtualenv &&
+  virtualenv/bin/pip install --no-index --use-wheel --find-links=file:${CMAKE_SOURCE_DIR}/src/ceph-disk/wheelhouse -e .
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/ceph-disk
+  COMMENT "ceph-disk is being created")
diff --git a/src/ceph-disk/Makefile.am b/src/ceph-disk/Makefile.am
index 9006303..a853287 100644
--- a/src/ceph-disk/Makefile.am
+++ b/src/ceph-disk/Makefile.am
@@ -17,6 +17,7 @@ check_SCRIPTS += ceph-disk/run-tox.sh
 
 EXTRA_DIST += \
 	ceph-disk/AUTHORS.rst \
+	ceph-disk/CMakeLists.txt \
 	ceph-disk/ceph_disk/__init__.py \
 	ceph-disk/ceph_disk/main.py \
 	ceph-disk/Makefile.am \
diff --git a/src/ceph-disk/ceph_disk/main.py b/src/ceph-disk/ceph_disk/main.py
index 807733c..8937427 100755
--- a/src/ceph-disk/ceph_disk/main.py
+++ b/src/ceph-disk/ceph_disk/main.py
@@ -18,6 +18,8 @@
 # GNU Library Public License for more details.
 #
 
+from __future__ import print_function
+
 import argparse
 import base64
 import errno
@@ -36,7 +38,6 @@ import time
 import shlex
 import pwd
 import grp
-import types
 import textwrap
 
 CEPH_OSD_ONDISK_MAGIC = 'ceph osd volume v026'
@@ -242,19 +243,20 @@ CEPH_PREF_USER = None
 CEPH_PREF_GROUP = None
 
 
-class filelock(object):
+class FileLock(object):
     def __init__(self, fn):
         self.fn = fn
         self.fd = None
 
-    def acquire(self):
+    def __enter__(self):
         assert not self.fd
-        self.fd = file(self.fn, 'w')
+        self.fd = os.open(self.fn, os.O_WRONLY | os.O_CREAT)
         fcntl.lockf(self.fd, fcntl.LOCK_EX)
 
-    def release(self):
+    def __exit__(self, exc_type, exc_val, exc_tb):
         assert self.fd
         fcntl.lockf(self.fd, fcntl.LOCK_UN)
+        os.close(self.fd)
         self.fd = None
 
 
@@ -264,8 +266,8 @@ class Error(Exception):
     """
 
     def __str__(self):
-        doc = self.__doc__.strip()
-        return ': '.join([doc] + [str(a) for a in self.args])
+        doc = _bytes2str(self.__doc__.strip())
+        return ': '.join([doc] + [_bytes2str(a) for a in self.args])
 
 
 class MountError(Error):
@@ -323,11 +325,8 @@ def is_systemd():
     """
     Detect whether systemd is running
     """
-    with file('/proc/1/comm', 'rb') as i:
-        for line in i:
-            if 'systemd' in line:
-                return True
-    return False
+    with open('/proc/1/comm', 'r') as f:
+        return 'systemd' in f.read()
 
 
 def is_upstart():
@@ -335,9 +334,7 @@ def is_upstart():
     Detect whether upstart is running
     """
     (out, err, _) = command(['init', '--version'])
-    if 'upstart' in out:
-        return True
-    return False
+    return 'upstart' in out
 
 
 def maybe_mkdir(*a, **kw):
@@ -351,7 +348,7 @@ def maybe_mkdir(*a, **kw):
         os.unlink(*a)
     try:
         os.mkdir(*a, **kw)
-    except OSError, e:
+    except OSError as e:
         if e.errno == errno.EEXIST:
             pass
         else:
@@ -360,10 +357,7 @@ def maybe_mkdir(*a, **kw):
 
 def which(executable):
     """find the location of an executable"""
-    if 'PATH' in os.environ:
-        envpath = os.environ['PATH']
-    else:
-        envpath = os.defpath
+    envpath = os.environ.get('PATH') or os.defpath
     PATH = envpath.split(os.pathsep)
 
     locations = PATH + [
@@ -387,7 +381,7 @@ def _get_command_executable(arguments):
     Return the full path for an executable, raise if the executable is not
     found. If the executable has already a full path do not perform any checks.
     """
-    if arguments[0].startswith('/'):  # an absolute path
+    if os.path.isabs(arguments[0]):  # an absolute path
         return arguments
     executable = which(arguments[0])
     if not executable:
@@ -413,7 +407,9 @@ def command(arguments, **kwargs):
     This returns the output of the command and the return code of the
     process in a tuple: (output, returncode).
     """
-    arguments = _get_command_executable(arguments)
+
+    arguments = list(map(_bytes2str, _get_command_executable(arguments)))
+
     LOG.info('Running command: %s' % ' '.join(arguments))
     process = subprocess.Popen(
         arguments,
@@ -421,7 +417,12 @@ def command(arguments, **kwargs):
         stderr=subprocess.PIPE,
         **kwargs)
     out, err = process.communicate()
-    return out, err, process.returncode
+
+    return _bytes2str(out), _bytes2str(err), process.returncode
+
+
+def _bytes2str(string):
+    return string.decode('utf-8') if isinstance(string, bytes) else string
 
 
 def command_check_call(arguments):
@@ -583,7 +584,7 @@ def get_dev_size(dev, size='megabytes'):
     try:
         device_size = os.lseek(fd, 0, os.SEEK_END)
         divider = dividers.get(size, 1024 * 1024)  # default to megabytes
-        return device_size / divider
+        return device_size // divider
     except Exception as error:
         LOG.warning('failed to get size of %s: %s' % (dev, str(error)))
     finally:
@@ -759,17 +760,17 @@ def is_mounted(dev):
     Check if the given device is mounted.
     """
     dev = os.path.realpath(dev)
-    with file('/proc/mounts', 'rb') as proc_mounts:
+    with open('/proc/mounts', 'rb') as proc_mounts:
         for line in proc_mounts:
             fields = line.split()
             if len(fields) < 3:
                 continue
             mounts_dev = fields[0]
             path = fields[1]
-            if mounts_dev.startswith('/') and os.path.exists(mounts_dev):
+            if os.path.isabs(mounts_dev) and os.path.exists(mounts_dev):
                 mounts_dev = os.path.realpath(mounts_dev)
                 if mounts_dev == dev:
-                    return path
+                    return _bytes2str(path)
     return None
 
 
@@ -834,6 +835,8 @@ def must_be_one_line(line):
     :raises: TruncatedLineError or TooManyLinesError
     :return: Content of the line, or None if line isn't valid.
     """
+    line = _bytes2str(line)
+
     if line[-1:] != '\n':
         raise TruncatedLineError(line)
     line = line[:-1]
@@ -852,7 +855,7 @@ def read_one_line(parent, name):
     """
     path = os.path.join(parent, name)
     try:
-        line = file(path, 'rb').read()
+        line = open(path, 'rb').read()
     except IOError as e:
         if e.errno == errno.ENOENT:
             return None
@@ -879,8 +882,8 @@ def write_one_line(parent, name, text):
     """
     path = os.path.join(parent, name)
     tmp = '{path}.{pid}.tmp'.format(path=path, pid=os.getpid())
-    with file(tmp, 'wb') as tmp_file:
-        tmp_file.write(text + '\n')
+    with open(tmp, 'wb') as tmp_file:
+        tmp_file.write(text.encode('utf-8') + b'\n')
         os.fsync(tmp_file.fileno())
     path_set_context(tmp)
     os.rename(tmp, path)
@@ -972,7 +975,7 @@ def get_ceph_user():
             pwd.getpwnam(CEPH_PREF_USER)
             return CEPH_PREF_USER
         except KeyError:
-            print "No such user: " + CEPH_PREF_USER
+            print("No such user:", CEPH_PREF_USER)
             sys.exit(2)
     else:
         try:
@@ -990,7 +993,7 @@ def get_ceph_group():
             grp.getgrnam(CEPH_PREF_GROUP)
             return CEPH_PREF_GROUP
         except KeyError:
-            print "No such group: " + CEPH_PREF_GROUP
+            print("No such group:", CEPH_PREF_GROUP)
             sys.exit(2)
     else:
         try:
@@ -1017,7 +1020,7 @@ def _check_output(args=None, **kwargs):
         error = subprocess.CalledProcessError(ret, cmd)
         error.output = out + err
         raise error
-    return out
+    return _bytes2str(out)
 
 
 def get_conf(cluster, variable):
@@ -1160,7 +1163,7 @@ def _dmcrypt_map(
     if dev:
         return dev
 
-    if isinstance(key, types.TupleType):
+    if isinstance(key, tuple):
         # legacy, before lockbox
         assert os.path.exists(key[0])
         keypath = key[0]
@@ -1412,7 +1415,7 @@ def update_partition(dev, description):
     partprobe_ok = False
     error = 'unknown error'
     partprobe = _get_command_executable(['partprobe'])[0]
-    for i in (1, 2, 3, 4, 5):
+    for i in range(5):
         command_check_call(['udevadm', 'settle', '--timeout=600'])
         try:
             _check_output(['flock', '-s', dev, partprobe, dev])
@@ -1446,9 +1449,9 @@ def zap(dev):
         # isn't too thorough.
         lba_size = 4096
         size = 33 * lba_size
-        with file(dev, 'wb') as dev_file:
+        with open(dev, 'wb') as dev_file:
             dev_file.seek(-size, os.SEEK_END)
-            dev_file.write(size * '\0')
+            dev_file.write(size * b'\0')
 
         command_check_call(
             [
@@ -1775,9 +1778,8 @@ class Prepare(object):
         return parser
 
     def prepare(self):
-        prepare_lock.acquire()
-        self.prepare_locked()
-        prepare_lock.release()
+        with prepare_lock:
+            self.prepare_locked()
 
     @staticmethod
     def factory(args):
@@ -1902,6 +1904,7 @@ class PrepareSpace(object):
                 raise Error('%s is not a block device' % name.capitalize,
                             getattr(args, name))
             self.type = self.FILE
+            return
 
         raise Error('%s %s is neither a block device nor regular file' %
                     (name.capitalize, getattr(args, name)))
@@ -1960,13 +1963,13 @@ class PrepareSpace(object):
         if getattr(self.args, space_uuid) is not None:
             write_one_line(path, space_uuid,
                            getattr(self.args, space_uuid))
-
-    def populate_data_path_device(self, path):
-        self.populate_data_path_file(path)
         if self.space_symlink is not None:
             adjust_symlink(self.space_symlink,
                            os.path.join(path, self.name))
 
+    def populate_data_path_device(self, path):
+        self.populate_data_path_file(path)
+
         if self.space_dmcrypt is not None:
             adjust_symlink(self.space_dmcrypt,
                            os.path.join(path, self.name + '_dmcrypt'))
@@ -1987,21 +1990,23 @@ class PrepareSpace(object):
             raise Error('unexpected type ', self.type)
 
     def prepare_file(self):
-        if not os.path.exists(getattr(self.args, self.name)):
+        space_filename = getattr(self.args, self.name)
+        if not os.path.exists(space_filename):
             LOG.debug('Creating %s file %s with size 0'
                       ' (ceph-osd will resize and allocate)',
                       self.name,
-                      getattr(self.args, self.name))
-            with file(getattr(self.args, self.name), 'wb') as space_file:
-                pass
+                      space_filename)
+            space_file = open(space_filename, 'wb')
+            space_file.close()
+            path_set_context(space_filename)
 
         LOG.debug('%s is file %s',
                   self.name.capitalize(),
-                  getattr(self.args, self.name))
+                  space_filename)
         LOG.warning('OSD will not be hot-swappable if %s is '
                     'not the same device as the osd data' %
                     self.name)
-        self.space_symlink = space_file
+        self.space_symlink = space_filename
 
     def prepare_device(self):
         reusing_partition = False
@@ -3118,7 +3123,7 @@ def mount_activate(
                 fstype=fstype,
                 mount_options=mount_options,
             )
-        return (cluster, osd_id)
+        return cluster, osd_id
 
     except:
         LOG.error('Failed to activate')
@@ -3168,7 +3173,7 @@ def activate_dir(
                     raise Error('unable to create symlink %s -> %s'
                                 % (canonical, path))
 
-    return (cluster, osd_id)
+    return cluster, osd_id
 
 
 def find_cluster_by_uuid(_uuid):
@@ -3187,7 +3192,7 @@ def find_cluster_by_uuid(_uuid):
         try:
             fsid = get_fsid(cluster)
         except Error as e:
-            if e.message != 'getting cluster uuid from configuration failed':
+            if 'getting cluster uuid from configuration failed' not in str(e):
                 raise e
             no_fsid.append(cluster)
         else:
@@ -3261,8 +3266,9 @@ def activate(
                 init = init_get()
 
         LOG.debug('Marking with init system %s', init)
-        with file(os.path.join(path, init), 'w'):
-            pass
+        init_path = os.path.join(path, init)
+        with open(init_path, 'w'):
+            path_set_context(init_path)
 
     # remove markers for others, just in case.
     for other in INIT_SYSTEMS:
@@ -3297,8 +3303,7 @@ def main_activate(args):
         LOG.info('suppressed activate request on %s', args.path)
         return
 
-    activate_lock.acquire()  # noqa
-    try:
+    with activate_lock:
         mode = os.stat(args.path).st_mode
         if stat.S_ISBLK(mode):
             if (is_partition(args.path) and
@@ -3328,6 +3333,13 @@ def main_activate(args):
         else:
             raise Error('%s is not a directory or block device' % args.path)
 
+        # exit with 0 if the journal device is not up, yet
+        # journal device will do the activation
+        osd_journal = '{path}/journal'.format(path=osd_data)
+        if os.path.islink(osd_journal) and not os.access(osd_journal, os.F_OK):
+            LOG.info("activate: Journal not present, not starting, yet")
+            return
+
         if (not args.no_start_daemon and args.mark_init == 'none'):
             command_check_call(
                 [
@@ -3335,7 +3347,7 @@ def main_activate(args):
                     '--cluster={cluster}'.format(cluster=cluster),
                     '--id={osd_id}'.format(osd_id=osd_id),
                     '--osd-data={path}'.format(path=osd_data),
-                    '--osd-journal={path}/journal'.format(path=osd_data),
+                    '--osd-journal={journal}'.format(journal=osd_journal),
                 ],
             )
 
@@ -3347,16 +3359,10 @@ def main_activate(args):
                 osd_id=osd_id,
             )
 
-    finally:
-        activate_lock.release()  # noqa
-
 
 def main_activate_lockbox(args):
-    activate_lock.acquire()  # noqa
-    try:
+    with activate_lock:
         main_activate_lockbox_protected(args)
-    finally:
-        activate_lock.release()  # noqa
 
 
 def main_activate_lockbox_protected(args):
@@ -3445,11 +3451,8 @@ def _remove_osd_directory_files(mounted_path, cluster):
 
 
 def main_deactivate(args):
-    activate_lock.acquire()  # noqa
-    try:
+    with activate_lock:
         main_deactivate_locked(args)
-    finally:
-        activate_lock.release()  # noqa
 
 
 def main_deactivate_locked(args):
@@ -3572,7 +3575,7 @@ def _remove_lockbox(uuid):
     command(['umount', canonical])
     for name in os.listdir(lockbox):
         path = os.path.join(lockbox, name)
-        if (os.path.islink(path) and os.readlink(path) == canonical):
+        if os.path.islink(path) and os.readlink(path) == canonical:
             os.unlink(path)
 
 
@@ -3602,16 +3605,13 @@ def destroy_lookup_device(args, predicate, description):
             else:
                 dmcrypt = False
             if predicate(partition):
-                return (dmcrypt, partition)
+                return dmcrypt, partition
     raise Error('found no device matching ', description)
 
 
 def main_destroy(args):
-    activate_lock.acquire()  # noqa
-    try:
+    with activate_lock:
         main_destroy_locked(args)
-    finally:
-        activate_lock.release()  # noqa
 
 
 def main_destroy_locked(args):
@@ -3713,8 +3713,7 @@ def main_activate_space(name, args):
     osd_id = None
     osd_uuid = None
     dev = None
-    activate_lock.acquire()  # noqa
-    try:
+    with activate_lock:
         if args.dmcrypt:
             dev = dmcrypt_map(args.dev, args.dmcrypt_key_dir)
         else:
@@ -3730,6 +3729,12 @@ def main_activate_space(name, args):
             LOG.info('suppressed activate request on %s', path)
             return
 
+        # warn and exit with 0 if the data device is not up, yet
+        # data device will do the activation
+        if not os.access(path, os.F_OK):
+            LOG.info("activate: OSD device not present, not starting, yet")
+            return
+
         (cluster, osd_id) = mount_activate(
             dev=path,
             activate_key_template=args.activate_key_template,
@@ -3744,9 +3749,6 @@ def main_activate_space(name, args):
             osd_id=osd_id,
         )
 
-    finally:
-        activate_lock.release()  # noqa
-
 
 ###########################
 
@@ -3774,30 +3776,29 @@ def main_activate_all(args):
                 continue
 
             LOG.info('Activating %s', path)
-            activate_lock.acquire()  # noqa
-            try:
-                # never map dmcrypt cyphertext devices
-                (cluster, osd_id) = mount_activate(
-                    dev=path,
-                    activate_key_template=args.activate_key_template,
-                    init=args.mark_init,
-                    dmcrypt=False,
-                    dmcrypt_key_dir='',
-                )
-                start_daemon(
-                    cluster=cluster,
-                    osd_id=osd_id,
-                )
-
-            except Exception as e:
-                print >> sys.stderr, '{prog}: {msg}'.format(
-                    prog=args.prog,
-                    msg=e,
-                )
-                err = True
+            with activate_lock:
+                try:
+                    # never map dmcrypt cyphertext devices
+                    (cluster, osd_id) = mount_activate(
+                        dev=path,
+                        activate_key_template=args.activate_key_template,
+                        init=args.mark_init,
+                        dmcrypt=False,
+                        dmcrypt_key_dir='',
+                    )
+                    start_daemon(
+                        cluster=cluster,
+                        osd_id=osd_id,
+                    )
+
+                except Exception as e:
+                    print(
+                        '{prog}: {msg}'.format(prog=args.prog, msg=e),
+                        file=sys.stderr
+                    )
+
+                    err = True
 
-            finally:
-                activate_lock.release()  # noqa
     if err:
         raise Error('One or more partitions failed to activate')
 
@@ -3806,13 +3807,13 @@ def main_activate_all(args):
 
 def is_swap(dev):
     dev = os.path.realpath(dev)
-    with file('/proc/swaps', 'rb') as proc_swaps:
+    with open('/proc/swaps', 'rb') as proc_swaps:
         for line in proc_swaps.readlines()[1:]:
             fields = line.split()
             if len(fields) < 3:
                 continue
             swaps_dev = fields[0]
-            if swaps_dev.startswith('/') and os.path.exists(swaps_dev):
+            if os.path.isabs(swaps_dev) and os.path.exists(swaps_dev):
                 swaps_dev = os.path.realpath(swaps_dev)
                 if swaps_dev == dev:
                     return True
@@ -3822,8 +3823,8 @@ def is_swap(dev):
 def get_oneliner(base, name):
     path = os.path.join(base, name)
     if os.path.isfile(path):
-        with open(path, 'r') as _file:
-            return _file.readline().rstrip()
+        with open(path, 'rb') as _file:
+            return _bytes2str(_file.readline().rstrip())
     return None
 
 
@@ -3851,7 +3852,7 @@ def split_dev_base_partnum(dev):
         b = block_path(dev)
         partnum = open(os.path.join(b, 'partition')).read().strip()
         base = get_partition_base(dev)
-    return (base, partnum)
+    return base, partnum
 
 
 def get_partition_type(part):
@@ -4113,7 +4114,7 @@ def list_devices():
 
     uuid_map = {}
     space_map = {}
-    for base, parts in sorted(partmap.iteritems()):
+    for base, parts in sorted(partmap.items()):
         for p in parts:
             dev = get_dev_path(p)
             part_uuid = get_partition_uuid(dev)
@@ -4152,7 +4153,7 @@ def list_devices():
               str(uuid_map) + ", space_map = " + str(space_map))
 
     devices = []
-    for base, parts in sorted(partmap.iteritems()):
+    for base, parts in sorted(partmap.items()):
         if parts:
             disk = {'path': get_dev_path(base)}
             partitions = []
@@ -4171,11 +4172,8 @@ def list_devices():
 
 
 def main_list(args):
-    activate_lock.acquire()  # noqa
-    try:
+    with activate_lock:
         main_list_protected(args)
-    finally:
-        activate_lock.release()  # noqa
 
 
 def main_list_protected(args):
@@ -4195,11 +4193,11 @@ def main_list_protected(args):
     else:
         selected_devices = devices
     if args.format == 'json':
-        print json.dumps(selected_devices)
+        print(json.dumps(selected_devices))
     else:
         output = list_format_plain(selected_devices)
         if output:
-            print output
+            print(output)
 
 
 ###########################
@@ -4237,7 +4235,7 @@ def set_suppress(path):
         raise Error('not a block device', path)
     base = get_dev_name(disk)
 
-    with file(SUPPRESS_PREFIX + base, 'w') as f:  # noqa
+    with open(SUPPRESS_PREFIX + base, 'w') as f:  # noqa
         pass
     LOG.info('set suppress flag on %s', base)
 
@@ -4415,10 +4413,10 @@ def setup_statedir(dir):
         os.mkdir(STATEDIR + "/tmp")
 
     global prepare_lock
-    prepare_lock = filelock(STATEDIR + '/tmp/ceph-disk.prepare.lock')
+    prepare_lock = FileLock(STATEDIR + '/tmp/ceph-disk.prepare.lock')
 
     global activate_lock
-    activate_lock = filelock(STATEDIR + '/tmp/ceph-disk.activate.lock')
+    activate_lock = FileLock(STATEDIR + '/tmp/ceph-disk.activate.lock')
 
     global SUPPRESS_PREFIX
     SUPPRESS_PREFIX = STATEDIR + '/tmp/suppress-activate.'
@@ -4540,7 +4538,7 @@ def make_trigger_parser(subparsers):
     trigger_parser.add_argument(
         '--sync',
         action='store_true', default=None,
-        help=('do operation synchronously; do not trigger systemd'),
+        help='do operation synchronously; do not trigger systemd',
     )
     trigger_parser.set_defaults(
         func=main_trigger,
diff --git a/src/ceph-disk/tests/test_main.py b/src/ceph-disk/tests/test_main.py
index f59824c..d76a5d8 100644
--- a/src/ceph-disk/tests/test_main.py
+++ b/src/ceph-disk/tests/test_main.py
@@ -21,6 +21,11 @@ import tempfile
 import unittest
 from ceph_disk import main
 
+try:
+    import builtins
+except:
+    import __builtin__ as builtins
+
 
 def fail_to_mount(dev, fstype, options):
     raise main.MountError(dev + " mount fail")
@@ -147,7 +152,7 @@ class TestCephDisk(object):
             main.PTYPE['plain']['osd']['ready']: 'plain',
             main.PTYPE['luks']['osd']['ready']: 'luks',
         }
-        for (ptype, type) in ptype2type.iteritems():
+        for (ptype, type) in ptype2type.items():
             for holders in ((), ("dm_0",), ("dm_0", "dm_1")):
                 dev = {
                     'dmcrypt': {
@@ -175,7 +180,7 @@ class TestCephDisk(object):
             main.PTYPE['plain']['journal']['ready']: 'plain',
             main.PTYPE['luks']['journal']['ready']: 'luks',
         }
-        for (ptype, type) in ptype2type.iteritems():
+        for (ptype, type) in ptype2type.items():
             for holders in ((), ("dm_0",)):
                 dev = {
                     'path': '/dev/Xda2',
@@ -314,7 +319,7 @@ class TestCephDisk(object):
             main.PTYPE['plain']['osd']['ready']: 'plain',
             main.PTYPE['luks']['osd']['ready']: 'LUKS',
         }
-        for (partition_type, type) in partition_type2type.iteritems():
+        for (partition_type, type) in partition_type2type.items():
             #
             # dmcrypt data partition with one holder
             #
@@ -682,7 +687,7 @@ class TestCephDiskDeactivateAndDestroy(unittest.TestCase):
     def setup_class(self):
         main.setup_logging(verbose=True, log_stdout=False)
 
-    @patch('__builtin__.open')
+    @patch('{0}.open'.format(builtins.__name__))
     def test_main_deactivate(self, mock_open):
         data = tempfile.mkdtemp()
         main.setup_statedir(data)
diff --git a/src/ceph-disk/tox.ini b/src/ceph-disk/tox.ini
index ef8b8d0..dc3ce41 100644
--- a/src/ceph-disk/tox.ini
+++ b/src/ceph-disk/tox.ini
@@ -20,4 +20,4 @@ commands = coverage run --append --source=ceph_disk {envbindir}/py.test -vv test
            coverage report --omit=*test*,*tox* --show-missing
 
 [testenv:flake8]
-commands = flake8 --ignore=H105,H405 ceph_disk tests
+commands = flake8 --ignore=H105,H405,E127 ceph_disk tests
diff --git a/src/ceph-osd-prestart.sh b/src/ceph-osd-prestart.sh
index 314ea18..e68565e 100644
--- a/src/ceph-osd-prestart.sh
+++ b/src/ceph-osd-prestart.sh
@@ -18,6 +18,13 @@ if [ -z "$id"  ]; then
 fi
 
 data="/var/lib/ceph/osd/${cluster:-ceph}-$id"
+
+# assert data directory exists - see http://tracker.ceph.com/issues/17091
+if [ ! -d "$data" ]; then
+    echo "OSD data directory $data does not exist; bailing out." 1>&2
+    exit 1
+fi
+
 journal="$data/journal"
 
 update="$(ceph-conf --cluster=${cluster:-ceph} --name=osd.$id --lookup osd_crush_update_on_start || :)"
diff --git a/src/ceph-post-file.in b/src/ceph-post-file.in
index b278e8a..3c9884a 100755
--- a/src/ceph-post-file.in
+++ b/src/ceph-post-file.in
@@ -1,13 +1,13 @@
 #!/bin/bash -e
 
 # If these files exist, assume we are a source install.
-if [[ -f ../share/known_hosts_drop.ceph.com && -f ../share/id_dsa_drop.ceph.com ]]
+if [[ -f ../share/known_hosts_drop.ceph.com && -f ../share/id_rsa_drop.ceph.com ]]
     then # running from source install
        known_hosts=../share/known_hosts_drop.ceph.com
-       ssh_key=../share/id_dsa_drop.ceph.com
+       ssh_key=../share/id_rsa_drop.ceph.com
     else # running from a pkg install
        known_hosts=@datadir@/known_hosts_drop.ceph.com
-       ssh_key=@datadir@/id_dsa_drop.ceph.com
+       ssh_key=@datadir@/id_rsa_drop.ceph.com
 fi
 
 function usage() {
@@ -39,7 +39,7 @@ Options:
   -k|--known_hosts <path>    known_hosts file
                                [Default: /usr/share/ceph/known_hosts_drop.ceph.com]
   -i <path>         Ssh identity file
-                      [Default: /usr/share/ceph/id_dsa_drop.ceph.com]
+                      [Default: /usr/share/ceph/id_rsa_drop.ceph.com]
   -h|--help         Show this usage information
 "
 }
@@ -150,7 +150,8 @@ EOF
 done
 
 # no UserKnownHostsFile so that we don't try to record the IP hash key
-# GLobalKnownHostsFile so that we are verifying that this is the real drop.ceph.com
+# GlobalKnownHostsFile so that we are verifying that this is the real drop.ceph.com
+# IdentitiesOnly=yes forces sftp to ignore any keys offered by ssh-agent
 
 cp "$ssh_key" "$t4"
 cp "${ssh_key}.pub" "$t4.pub"
@@ -160,6 +161,7 @@ sftp -o "IdentityFile=$t4" \
     -oCheckHostIP=no \
     -oGlobalKnownHostsFile=$known_hosts \
     -oBatchMode=no \
+    -oIdentitiesOnly=yes \
     -b $t1 -- $remote
 
 echo "$0: copy the upload id below to share with a dev:
diff --git a/src/client/Client.cc b/src/client/Client.cc
index b465cad..112bf40 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -371,6 +371,7 @@ void Client::tear_down_cache()
 
 inodeno_t Client::get_root_ino()
 {
+  Mutex::Locker l(client_lock);
   if (use_faked_inos())
     return root->faked_ino;
   else
@@ -379,6 +380,7 @@ inodeno_t Client::get_root_ino()
 
 Inode *Client::get_root()
 {
+  Mutex::Locker l(client_lock);
   root->ll_get();
   return root;
 }
@@ -898,18 +900,14 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
 
     in->dirstat = st->dirstat;
     in->rstat = st->rstat;
+    in->quota = st->quota;
+    in->layout = st->layout;
 
     if (in->is_dir()) {
       in->dir_layout = st->dir_layout;
       ldout(cct, 20) << " dir hash is " << (int)in->dir_layout.dl_dir_hash << dendl;
     }
 
-    if (st->quota.is_enable() ^ in->quota.is_enable())
-      invalidate_quota_tree(in);
-    in->quota = st->quota;
-
-    in->layout = st->layout;
-
     update_inode_file_bits(in, st->truncate_seq, st->truncate_size, st->size,
 			   st->time_warp_seq, st->ctime, st->mtime, st->atime,
 			   st->inline_version, st->inline_data,
@@ -1147,7 +1145,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
 		   << ", readdir_start " << readdir_start << dendl;
 
     if (diri->snapid != CEPH_SNAPDIR &&
-	fg.is_leftmost() && readdir_offset == 2) {
+	fg.is_leftmost() && readdir_offset == 2 && readdir_start.empty()) {
       dirp->release_count = diri->dir_release_count;
       dirp->ordered_count = diri->dir_ordered_count;
       dirp->start_shared_gen = diri->shared_gen;
@@ -1241,6 +1239,7 @@ void Client::insert_readdir_results(MetaRequest *request, MetaSession *session,
 Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
 {
   MClientReply *reply = request->reply;
+  int op = request->get_op();
 
   ldout(cct, 10) << "insert_trace from " << request->sent_stamp << " mds." << session->mds_num
 	   << " is_target=" << (int)reply->head.is_target
@@ -1265,14 +1264,14 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
     }
 
     if (d && reply->get_result() == 0) {
-      if (request->head.op == CEPH_MDS_OP_RENAME) {
+      if (op == CEPH_MDS_OP_RENAME) {
 	// rename
 	Dentry *od = request->old_dentry();
 	ldout(cct, 10) << " unlinking rename src dn " << od << " for traceless reply" << dendl;
 	assert(od);
 	unlink(od, true, true);  // keep dir, dentry
-      } else if (request->head.op == CEPH_MDS_OP_RMDIR ||
-		 request->head.op == CEPH_MDS_OP_UNLINK) {
+      } else if (op == CEPH_MDS_OP_RMDIR ||
+		 op == CEPH_MDS_OP_UNLINK) {
 	// unlink, rmdir
 	ldout(cct, 10) << " unlinking unlink/rmdir dn " << d << " for traceless reply" << dendl;
 	unlink(d, true, true);  // keep dir, dentry
@@ -1311,7 +1310,6 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
   if (reply->head.is_target) {
     ist.decode(p, features);
     if (cct->_conf->client_debug_getattr_caps) {
-      int op = request->get_op();
       unsigned wanted = 0;
       if (op == CEPH_MDS_OP_GETATTR || op == CEPH_MDS_OP_LOOKUP)
 	wanted = request->head.args.getattr.mask;
@@ -1326,15 +1324,15 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
     in = add_update_inode(&ist, request->sent_stamp, session);
   }
 
+  Inode *diri = NULL;
   if (reply->head.is_dentry) {
-    Inode *diri = add_update_inode(&dirst, request->sent_stamp, session);
+    diri = add_update_inode(&dirst, request->sent_stamp, session);
     update_dir_dist(diri, &dst);  // dir stat info is attached to ..
 
     if (in) {
       Dir *dir = diri->open_dir();
       insert_dentry_inode(dir, dname, &dlease, in, request->sent_stamp, session,
-                          ((request->head.op == CEPH_MDS_OP_RENAME) ?
-                                        request->old_dentry() : NULL));
+                          (op == CEPH_MDS_OP_RENAME) ? request->old_dentry() : NULL);
     } else {
       if (diri->dir && diri->dir->dentries.count(dname)) {
 	Dentry *dn = diri->dir->dentries[dname];
@@ -1345,14 +1343,14 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
 	}
       }
     }
-  } else if (reply->head.op == CEPH_MDS_OP_LOOKUPSNAP ||
-	     reply->head.op == CEPH_MDS_OP_MKSNAP) {
+  } else if (op == CEPH_MDS_OP_LOOKUPSNAP ||
+	     op == CEPH_MDS_OP_MKSNAP) {
     ldout(cct, 10) << " faking snap lookup weirdness" << dendl;
     // fake it for snap lookup
     vinodeno_t vino = ist.vino;
     vino.snapid = CEPH_SNAPDIR;
     assert(inode_map.count(vino));
-    Inode *diri = inode_map[vino];
+    diri = inode_map[vino];
     
     string dname = request->path.last_dentry();
     
@@ -1372,9 +1370,13 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
   }
 
   if (in) {
-    if (reply->head.op == CEPH_MDS_OP_READDIR ||
-	reply->head.op == CEPH_MDS_OP_LSSNAP)
+    if (op == CEPH_MDS_OP_READDIR ||
+	op == CEPH_MDS_OP_LSSNAP) {
       insert_readdir_results(request, session, in);
+    } else if (op == CEPH_MDS_OP_LOOKUPNAME) {
+      // hack: return parent inode instead
+      in = diri;
+    }
 
     if (request->dentry() == NULL && in != request->inode()) {
       // pin the target inode if its parent dentry is not pinned
@@ -1552,7 +1554,7 @@ int Client::verify_reply_trace(int r,
     *pcreated = got_created_ino;
 
   if (request->target) {
-    ptarget->swap(request->target);
+    *ptarget = request->target;
     ldout(cct, 20) << "make_request target is " << *ptarget->get() << dendl;
   } else {
     if (got_created_ino && (p = inode_map.find(vinodeno_t(created_ino, CEPH_NOSNAP))) != inode_map.end()) {
@@ -1571,7 +1573,7 @@ int Client::verify_reply_trace(int r,
 			 << " got_ino " << got_created_ino
 			 << " ino " << created_ino
 			 << dendl;
-	  r = _do_lookup(d->dir->parent_inode, d->name, &target, uid, gid);
+	  r = _do_lookup(d->dir->parent_inode, d->name, request->regetattr_mask, &target, uid, gid);
 	} else {
 	  // if the dentry is not linked, just do our best. see #5021.
 	  assert(0 == "how did this happen?  i want logs!");
@@ -2126,6 +2128,8 @@ void Client::send_request(MetaRequest *request, MetaSession *session,
   }
   if (request->got_unsafe) {
     r->set_replayed_op();
+    if (request->target)
+      r->head.ino = request->target->ino;
   } else {
     encode_cap_releases(request, mds);
     if (drop_cap_releases) // we haven't send cap reconnect yet, drop cap releases
@@ -2840,7 +2844,6 @@ void Client::put_inode(Inode *in, int n)
     ldout(cct, 10) << "put_inode deleting " << *in << dendl;
     bool unclean = objectcacher->release_set(&in->oset);
     assert(!unclean);
-    put_qtree(in);
     inode_map.erase(in->vino());
     if (use_faked_inos())
       _release_faked_ino(in);
@@ -2947,7 +2950,6 @@ void Client::unlink(Dentry *dn, bool keepdir, bool keepdentry)
 
   // unlink from inode
   if (in) {
-    invalidate_quota_tree(in.get());
     if (in->is_dir()) {
       if (in->dir)
 	dn->put(); // dir -> dn pin
@@ -3923,6 +3925,8 @@ public:
 
 void Client::_invalidate_kernel_dcache()
 {
+  if (unmounting)
+    return;
   if (can_invalidate_dentries && dentry_invalidate_cb && root->dir) {
     for (ceph::unordered_map<string, Dentry*>::iterator p = root->dir->dentries.begin();
 	 p != root->dir->dentries.end();
@@ -4487,8 +4491,6 @@ void Client::handle_quota(MClientQuota *m)
     in = inode_map[vino];
 
     if (in) {
-      if (in->quota.is_enable() ^ m->quota.is_enable())
-	invalidate_quota_tree(in);
       in->quota = m->quota;
       in->rstat = m->rstat;
     }
@@ -5208,7 +5210,7 @@ int Client::may_delete(Inode *dir, const char *name, int uid, int gid)
   /* 'name == NULL' means rmsnap */
   if (uid != 0 && name && (dir->mode & S_ISVTX)) {
     InodeRef otherin;
-    r = _lookup(dir, name, &otherin, uid, gid);
+    r = _lookup(dir, name, CEPH_CAP_AUTH_SHARED, &otherin, uid, gid);
     if (r < 0)
       goto out;
     if (dir->uid != (uid_t)uid && otherin->uid != (uid_t)uid)
@@ -5651,9 +5653,10 @@ void Client::unmount()
   
   while (!ll_unclosed_fh_set.empty()) {
     set<Fh*>::iterator it = ll_unclosed_fh_set.begin();
-    ll_unclosed_fh_set.erase(*it);
-    ldout(cct, 0) << " destroyed lost open file " << *it << " on " << *((*it)->inode) << dendl;
-    _release_fh(*it);
+    Fh *fh = *it;
+    ll_unclosed_fh_set.erase(fh);
+    ldout(cct, 0) << " destroyed lost open file " << fh << " on " << *(fh->inode) << dendl;
+    _release_fh(fh);
   }
 
   while (!opened_dirs.empty()) {
@@ -5837,7 +5840,7 @@ void Client::renew_caps(MetaSession *session)
 // ===============================================================
 // high level (POSIXy) interface
 
-int Client::_do_lookup(Inode *dir, const string& name, InodeRef *target,
+int Client::_do_lookup(Inode *dir, const string& name, int mask, InodeRef *target,
 		       int uid, int gid)
 {
   int op = dir->snapid == CEPH_SNAPDIR ? CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP;
@@ -5848,9 +5851,8 @@ int Client::_do_lookup(Inode *dir, const string& name, InodeRef *target,
   req->set_filepath(path);
   req->set_inode(dir);
   if (cct->_conf->client_debug_getattr_caps && op == CEPH_MDS_OP_LOOKUP)
-      req->head.args.getattr.mask = DEBUG_GETATTR_CAPS;
-  else
-      req->head.args.getattr.mask = 0;
+      mask |= DEBUG_GETATTR_CAPS;
+  req->head.args.getattr.mask = mask;
 
   ldout(cct, 10) << "_do_lookup on " << path << dendl;
 
@@ -5859,8 +5861,8 @@ int Client::_do_lookup(Inode *dir, const string& name, InodeRef *target,
   return r;
 }
 
-int Client::_lookup(Inode *dir, const string& dname, InodeRef *target,
-		    int uid, int gid)
+int Client::_lookup(Inode *dir, const string& dname, int mask,
+		    InodeRef *target, int uid, int gid)
 {
   int r = 0;
   Dentry *dn = NULL;
@@ -5902,7 +5904,7 @@ int Client::_lookup(Inode *dir, const string& dname, InodeRef *target,
 	     << " seq " << dn->lease_seq
 	     << dendl;
 
-    if (!dn->inode || dn->inode->is_any_caps()) {
+    if (!dn->inode || dn->inode->caps_issued_mask(mask)) {
       // is dn lease valid?
       utime_t now = ceph_clock_now(cct);
       if (dn->lease_mds >= 0 &&
@@ -5921,8 +5923,9 @@ int Client::_lookup(Inode *dir, const string& dname, InodeRef *target,
       }
       // dir lease?
       if (dir->caps_issued_mask(CEPH_CAP_FILE_SHARED)) {
-	if (dn->cap_shared_gen == dir->shared_gen)
-	  goto hit_dn;
+	if (dn->cap_shared_gen == dir->shared_gen &&
+	    (!dn->inode || dn->inode->caps_issued_mask(mask)))
+	      goto hit_dn;
 	if (!dn->inode && (dir->flags & I_COMPLETE)) {
 	  ldout(cct, 10) << "_lookup concluded ENOENT locally for "
 			 << *dir << " dn '" << dname << "'" << dendl;
@@ -5941,7 +5944,7 @@ int Client::_lookup(Inode *dir, const string& dname, InodeRef *target,
     }
   }
 
-  r = _do_lookup(dir, dname, target, uid, gid);
+  r = _do_lookup(dir, dname, mask, target, uid, gid);
   goto done;
 
  hit_dn:
@@ -6011,6 +6014,7 @@ int Client::path_walk(const filepath& origpath, InodeRef *end, bool followsym,
   ldout(cct, 10) << "path_walk " << path << dendl;
 
   int symlinks = 0;
+  int caps = 0;
 
   unsigned i=0;
   while (i < path.depth() && cur) {
@@ -6022,8 +6026,9 @@ int Client::path_walk(const filepath& origpath, InodeRef *end, bool followsym,
       int r = may_lookup(cur.get(), uid, gid);
       if (r < 0)
 	return r;
+      caps = CEPH_CAP_AUTH_SHARED;
     }
-    int r = _lookup(cur.get(), dname, &next, uid, gid);
+    int r = _lookup(cur.get(), dname, caps, &next, uid, gid);
     if (r < 0)
       return r;
     // only follow trailing symlink if followsym.  always follow
@@ -6207,7 +6212,7 @@ int Client::mkdirs(const char *relpath, mode_t mode)
   //get through existing parts of path
   filepath path(relpath);
   unsigned int i;
-  int r=0;
+  int r = 0, caps = 0;
   InodeRef cur, next;
   cur = cwd;
   for (i=0; i<path.depth(); ++i) {
@@ -6215,8 +6220,9 @@ int Client::mkdirs(const char *relpath, mode_t mode)
       r = may_lookup(cur.get(), uid, gid);
       if (r < 0)
 	break;
+      caps = CEPH_CAP_AUTH_SHARED;
     }
-    r = _lookup(cur.get(), path[i].c_str(), &next, uid, gid);
+    r = _lookup(cur.get(), path[i].c_str(), caps, &next, uid, gid);
     if (r < 0)
       break;
     cur.swap(next);
@@ -6639,7 +6645,7 @@ int Client::fill_stat(Inode *in, struct stat *st, frag_info_t *dirstat, nest_inf
   st->st_nlink = in->nlink;
   st->st_uid = in->uid;
   st->st_gid = in->gid;
-  if (in->ctime.sec() > in->mtime.sec()) {
+  if (in->ctime > in->mtime) {
     stat_set_ctime_sec(st, in->ctime.sec());
     stat_set_ctime_nsec(st, in->ctime.nsec());
   } else {
@@ -8856,7 +8862,7 @@ int Client::statfs(const char *path, struct statvfs *stbuf)
   // quota but we can see a parent of it that does have a quota, we'll
   // respect that one instead.
   assert(root != nullptr);
-  Inode *quota_root = get_quota_root(root);
+  Inode *quota_root = root->quota.is_enable() ? root : get_quota_root(root);
 
   // get_quota_root should always give us something if client quotas are
   // enabled
@@ -9437,7 +9443,7 @@ int Client::ll_lookup(Inode *parent, const char *name, struct stat *attr,
   string dname(name);
   InodeRef in;
 
-  r = _lookup(parent, dname, &in, uid, gid);
+  r = _lookup(parent, dname, CEPH_STAT_CAP_INODE_ALL, &in, uid, gid);
   if (r < 0) {
     attr->st_ino = 0;
     goto out;
@@ -10760,7 +10766,7 @@ int Client::_unlink(Inode *dir, const char *name, int uid, int gid)
   req->dentry_drop = CEPH_CAP_FILE_SHARED;
   req->dentry_unless = CEPH_CAP_FILE_EXCL;
 
-  res = _lookup(dir, name, &otherin, uid, gid);
+  res = _lookup(dir, name, 0, &otherin, uid, gid);
   if (res < 0)
     goto fail;
   req->set_other_inode(otherin.get());
@@ -10823,7 +10829,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid)
   int res = get_or_create(dir, name, &de);
   if (res < 0)
     goto fail;
-  res = _lookup(dir, name, &in, uid, gid);
+  res = _lookup(dir, name, 0, &in, uid, gid);
   if (res < 0)
     goto fail;
   if (req->get_op() == CEPH_MDS_OP_RMDIR) {
@@ -10920,13 +10926,13 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch
     req->dentry_unless = CEPH_CAP_FILE_EXCL;
 
     InodeRef oldin, otherin;
-    res = _lookup(fromdir, fromname, &oldin, uid, gid);
+    res = _lookup(fromdir, fromname, 0, &oldin, uid, gid);
     if (res < 0)
       goto fail;
     req->set_old_inode(oldin.get());
     req->old_inode_drop = CEPH_CAP_LINK_SHARED;
 
-    res = _lookup(todir, toname, &otherin, uid, gid);
+    res = _lookup(todir, toname, 0, &otherin, uid, gid);
     if (res != 0 && res != -ENOENT) {
       goto fail;
     } else if (res == 0) {
@@ -11262,7 +11268,7 @@ int Client::ll_create(Inode *parent, const char *name, mode_t mode,
 
   bool created = false;
   InodeRef in;
-  int r = _lookup(parent, name, &in, uid, gid);
+  int r = _lookup(parent, name, CEPH_STAT_CAP_INODE_ALL, &in, uid, gid);
 
   if (r == 0 && (flags & O_CREAT) && (flags & O_EXCL))
     return -EEXIST;
@@ -12035,88 +12041,73 @@ bool Client::ms_get_authorizer(int dest_type, AuthAuthorizer **authorizer, bool
   return true;
 }
 
-void Client::put_qtree(Inode *in)
-{
-  QuotaTree *qtree = in->qtree;
-  if (qtree) {
-    qtree->invalidate();
-    in->qtree = NULL;
-  }
-}
-
-void Client::invalidate_quota_tree(Inode *in)
-{
-  QuotaTree *qtree = in->qtree;
-  if (qtree) {
-    ldout(cct, 10) << "invalidate quota tree node " << *in << dendl;
-    if (qtree->parent_ref()) {
-      assert(in->is_dir());
-      ldout(cct, 15) << "invalidate quota tree ancestor " << *in << dendl;
-      Inode *ancestor = qtree->ancestor()->in();
-      if (ancestor)
-        put_qtree(ancestor);
-    }
-    put_qtree(in);
-  }
-}
-
 Inode *Client::get_quota_root(Inode *in)
 {
   if (!cct->_conf->client_quota)
     return NULL;
 
-  QuotaTree *ancestor = NULL;
-  QuotaTree *parent = NULL;
+  Inode *cur = in;
+  utime_t now = ceph_clock_now(cct);
 
-  vector<Inode*> inode_list;
-  while (in) {
-    if (in->qtree && in->qtree->ancestor()->in()) {
-      ancestor = in->qtree->ancestor();
-      parent = in->qtree;
+  while (cur) {
+    if (cur != in && cur->quota.is_enable())
       break;
-    }
-
-    inode_list.push_back(in);
-
-    if (!in->dn_set.empty())
-      in = in->get_first_parent()->dir->parent_inode;
-    else if (root_parents.count(in))
-      in = root_parents[in].get();
-    else
-      in = NULL;
-  }
-
-  if (!in) {
-    assert(!parent && !ancestor);
-    assert(root_ancestor->qtree == NULL);
-    root_ancestor->qtree = ancestor = new QuotaTree(root_ancestor);
-    ancestor->set_ancestor(ancestor);
-    parent = ancestor;
-  }
-  assert(parent && ancestor);
 
-  for (vector<Inode*>::reverse_iterator iter = inode_list.rbegin();
-       iter != inode_list.rend(); ++iter) {
-    Inode *cur = *iter;
+    Inode *parent_in = NULL;
+    if (!cur->dn_set.empty()) {
+      for (auto p = cur->dn_set.begin(); p != cur->dn_set.end(); ++p) {
+	Dentry *dn = *p;
+	if (dn->lease_mds >= 0 &&
+	    dn->lease_ttl > now &&
+	    mds_sessions.count(dn->lease_mds)) {
+	  parent_in = dn->dir->parent_inode;
+	} else {
+	  Inode *diri = dn->dir->parent_inode;
+	  if (diri->caps_issued_mask(CEPH_CAP_FILE_SHARED) &&
+	      diri->shared_gen == dn->cap_shared_gen) {
+	    parent_in = dn->dir->parent_inode;
+	  }
+	}
+	if (parent_in)
+	  break;
+      }
+    } else if (root_parents.count(cur)) {
+      parent_in = root_parents[cur].get();
+    }
 
-    if (!cur->qtree)
-      cur->qtree = new QuotaTree(cur);
+    if (parent_in) {
+      cur = parent_in;
+      continue;
+    }
 
-    cur->qtree->set_parent(parent);
-    if (parent->in()->quota.is_enable())
-      ancestor = parent;
-    cur->qtree->set_ancestor(ancestor);
+    if (cur == root_ancestor)
+      break;
 
-    ldout(cct, 20) << "link quota tree " << cur->ino
-                   << " to parent (" << parent->in()->ino << ")"
-                   << " ancestor (" << ancestor->in()->ino << ")" << dendl;
+    MetaRequest *req = new MetaRequest(CEPH_MDS_OP_LOOKUPNAME);
+    filepath path(cur->ino);
+    req->set_filepath(path);
+    req->set_inode(cur);
+
+    InodeRef parent_ref;
+    int ret = make_request(req, -1, -1, &parent_ref);
+    if (ret < 0) {
+      ldout(cct, 1) << __func__ << " " << in->vino()
+		    << " failed to find parent of " << cur->vino()
+		    << " err " << ret <<  dendl;
+      // FIXME: what to do?
+      cur = root_ancestor;
+      break;
+    }
 
-    parent = cur->qtree;
-    if (cur->quota.is_enable())
-      ancestor = cur->qtree;
+    now = ceph_clock_now(cct);
+    if (cur == in)
+      cur = parent_ref.get();
+    else
+      cur = in; // start over
   }
 
-  return ancestor->in();
+  ldout(cct, 10) << __func__ << " " << in->vino() << " -> " << cur->vino() << dendl;
+  return cur;
 }
 
 /**
diff --git a/src/client/Client.h b/src/client/Client.h
index 8417946..7129cab 100644
--- a/src/client/Client.h
+++ b/src/client/Client.h
@@ -563,10 +563,7 @@ protected:
 
   int authenticate();
 
-  void put_qtree(Inode *in);
-  void invalidate_quota_tree(Inode *in);
   Inode* get_quota_root(Inode *in);
-
   bool check_quota_condition(
       Inode *in,
       std::function<bool (const Inode &)> test);
@@ -756,8 +753,8 @@ private:
 
   // internal interface
   //   call these with client_lock held!
-  int _do_lookup(Inode *dir, const string& name, InodeRef *target, int uid, int gid);
-  int _lookup(Inode *dir, const string& dname, InodeRef *target, int uid, int gid);
+  int _do_lookup(Inode *dir, const string& name, int mask, InodeRef *target, int uid, int gid);
+  int _lookup(Inode *dir, const string& dname, int mask, InodeRef *target, int uid, int gid);
 
   int _link(Inode *in, Inode *dir, const char *name, int uid=-1, int gid=-1, InodeRef *inp = 0);
   int _unlink(Inode *dir, const char *name, int uid=-1, int gid=-1);
diff --git a/src/client/Inode.cc b/src/client/Inode.cc
index 51c9d62..0dca7bd 100644
--- a/src/client/Inode.cc
+++ b/src/client/Inode.cc
@@ -9,7 +9,7 @@
 #include "ClientSnapRealm.h"
 #include "UserGroups.h"
 
-ostream& operator<<(ostream &out, Inode &in)
+ostream& operator<<(ostream &out, const Inode &in)
 {
   out << in.vino() << "("
       << "faked_ino=" << in.faked_ino
@@ -23,7 +23,7 @@ ostream& operator<<(ostream &out, Inode &in)
       << " caps=" << ccap_string(in.caps_issued());
   if (!in.caps.empty()) {
     out << "(";
-    for (map<mds_rank_t,Cap*>::iterator p = in.caps.begin(); p != in.caps.end(); ++p) {
+    for (auto p = in.caps.begin(); p != in.caps.end(); ++p) {
       if (p != in.caps.begin())
         out << ',';
       out << p->first << '=' << ccap_string(p->second->issued);
@@ -147,7 +147,7 @@ bool Inode::is_any_caps()
   return !caps.empty() || snap_caps;
 }
 
-bool Inode::cap_is_valid(Cap* cap)
+bool Inode::cap_is_valid(Cap* cap) const
 {
   /*cout << "cap_gen     " << cap->session-> cap_gen << std::endl
     << "session gen " << cap->gen << std::endl
@@ -160,11 +160,11 @@ bool Inode::cap_is_valid(Cap* cap)
   return false;
 }
 
-int Inode::caps_issued(int *implemented)
+int Inode::caps_issued(int *implemented) const
 {
   int c = snap_caps;
   int i = 0;
-  for (map<mds_rank_t,Cap*>::iterator it = caps.begin();
+  for (map<mds_rank_t,Cap*>::const_iterator it = caps.begin();
        it != caps.end();
        ++it)
     if (cap_is_valid(it->second)) {
diff --git a/src/client/Inode.h b/src/client/Inode.h
index 1f2e36d..c54dcc4 100644
--- a/src/client/Inode.h
+++ b/src/client/Inode.h
@@ -74,80 +74,6 @@ struct CapSnap {
   void dump(Formatter *f) const;
 };
 
-class QuotaTree {
-private:
-  Inode *_in;
-
-  int _ancestor_ref;
-  QuotaTree *_ancestor;
-  int _parent_ref;
-  QuotaTree *_parent;
-
-  void _put()
-  {
-    if (!_in && !_ancestor_ref && !_parent_ref) {
-      set_parent(NULL);
-      set_ancestor(NULL);
-      delete this;
-    }
-  }
-  ~QuotaTree() {}
-public:
-  explicit QuotaTree(Inode *i) :
-    _in(i),
-    _ancestor_ref(0),
-    _ancestor(NULL),
-    _parent_ref(0),
-    _parent(NULL)
-  { assert(i); }
-
-  Inode *in() { return _in; }
-
-  int ancestor_ref() { return _ancestor_ref; }
-  int parent_ref() { return _parent_ref; }
-
-  QuotaTree *ancestor() { return _ancestor; }
-  void set_ancestor(QuotaTree *ancestor)
-  {
-    if (ancestor == _ancestor)
-      return;
-
-    if (_ancestor) {
-      --_ancestor->_ancestor_ref;
-      _ancestor->_put();
-    }
-    _ancestor = ancestor;
-    if (_ancestor)
-      ++_ancestor->_ancestor_ref;
-  }
-
-  QuotaTree *parent() { return _parent; }
-  void set_parent(QuotaTree *parent)
-  {
-    if (parent == _parent)
-      return;
-
-    if (_parent) {
-      --_parent->_parent_ref;
-      _parent->_put();
-    }
-    _parent = parent;
-    if (parent)
-      ++_parent->_parent_ref;
-  }
-
-  void invalidate()
-  {
-    if (!_in)
-      return;
-
-    _in = NULL;
-    set_ancestor(NULL);
-    set_parent(NULL);
-    _put();
-  }
-};
-
 // inode flags
 #define I_COMPLETE	1
 #define I_DIR_ORDERED	2
@@ -217,7 +143,6 @@ struct Inode {
   unsigned flags;
 
   quota_info_t quota;
-  QuotaTree* qtree;
 
   bool is_complete_and_ordered() {
     static const unsigned wants = I_COMPLETE | I_DIR_ORDERED;
@@ -300,7 +225,7 @@ struct Inode {
       rdev(0), mode(0), uid(0), gid(0), nlink(0),
       size(0), truncate_seq(1), truncate_size(-1),
       time_warp_seq(0), max_size(0), version(0), xattr_version(0),
-      inline_version(0), flags(0), qtree(NULL),
+      inline_version(0), flags(0),
       dir(0), dir_release_count(1), dir_ordered_count(1),
       dir_hashed(false), dir_replicated(false), auth_cap(NULL),
       cap_dirtier_uid(-1), cap_dirtier_gid(-1),
@@ -319,7 +244,7 @@ struct Inode {
   }
   ~Inode() { }
 
-  vinodeno_t vino() { return vinodeno_t(ino, snapid); }
+  vinodeno_t vino() const { return vinodeno_t(ino, snapid); }
 
   struct Compare {
     bool operator() (Inode* const & left, Inode* const & right) {
@@ -339,8 +264,8 @@ struct Inode {
   void get_cap_ref(int cap);
   int put_cap_ref(int cap);
   bool is_any_caps();
-  bool cap_is_valid(Cap* cap);
-  int caps_issued(int *implemented = 0);
+  bool cap_is_valid(Cap* cap) const;
+  int caps_issued(int *implemented = 0) const;
   void touch_cap(Cap *cap);
   void try_touch_cap(mds_rank_t mds);
   bool caps_issued_mask(unsigned mask);
@@ -358,6 +283,6 @@ struct Inode {
   void dump(Formatter *f) const;
 };
 
-ostream& operator<<(ostream &out, Inode &in);
+ostream& operator<<(ostream &out, const Inode &in);
 
 #endif
diff --git a/src/cls/CMakeLists.txt b/src/cls/CMakeLists.txt
new file mode 100644
index 0000000..37cfbca
--- /dev/null
+++ b/src/cls/CMakeLists.txt
@@ -0,0 +1,130 @@
+## Rados object classes
+
+# cls_hello
+add_library(cls_hello SHARED hello/cls_hello.cc)
+set_target_properties(cls_hello PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_hello DESTINATION lib/rados-classes)
+
+# cls_rbd
+if (WITH_RBD)
+  add_library(cls_rbd SHARED rbd/cls_rbd.cc rbd/cls_rbd_types.cc)
+  set_target_properties(cls_rbd PROPERTIES VERSION "1.0.0" SOVERSION "1")
+  install(TARGETS cls_rbd DESTINATION lib/rados-classes)
+
+  add_library(cls_rbd_client rbd/cls_rbd_client.cc rbd/cls_rbd_types.cc)
+endif (WITH_RBD)
+
+# cls_lock
+add_library(cls_lock SHARED lock/cls_lock.cc)
+set_target_properties(cls_lock PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_lock DESTINATION lib/rados-classes)
+
+add_library(cls_lock_client
+  lock/cls_lock_client.cc
+  lock/cls_lock_types.cc
+  lock/cls_lock_ops.cc)
+
+# cls_refcount
+add_library(cls_refcount SHARED
+  refcount/cls_refcount.cc
+  refcount/cls_refcount_ops.cc
+  ${CMAKE_SOURCE_DIR}/src/common/ceph_json.cc)
+target_link_libraries(cls_refcount json_spirit)
+set_target_properties(cls_refcount PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_refcount DESTINATION lib/rados-classes)
+
+add_library(cls_refcount_client
+  refcount/cls_refcount_client.cc
+  refcount/cls_refcount_ops.cc)
+
+# cls_version
+add_library(cls_version SHARED version/cls_version.cc)
+set_target_properties(cls_version PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_version DESTINATION lib/rados-classes)
+
+add_library(cls_version_client
+  version/cls_version_client.cc
+  version/cls_version_types.cc)
+
+# cls_log
+add_library(cls_log SHARED log/cls_log.cc)
+set_target_properties(cls_log PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_log DESTINATION lib/rados-classes)
+
+add_library(cls_log_client log/cls_log_client.cc)
+
+# cls_statelog
+add_library(cls_statelog SHARED statelog/cls_statelog.cc)
+set_target_properties(cls_statelog PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_statelog DESTINATION lib/rados-classes)
+
+add_library(cls_statelog_client statelog/cls_statelog_client.cc)
+
+# cls_timeindex
+add_library(cls_timeindex SHARED timeindex/cls_timeindex.cc)
+set_target_properties(cls_timeindex PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_timeindex DESTINATION lib/rados-classes)
+
+add_library(cls_timeindex_client timeindex/cls_timeindex_client.cc)
+
+# cls_replica_log
+add_library(cls_replica_log SHARED replica_log/cls_replica_log.cc)
+set_target_properties(cls_replica_log PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_replica_log DESTINATION lib/rados-classes)
+
+add_library(cls_replica_log_client
+  replica_log/cls_replica_log_types.cc
+  replica_log/cls_replica_log_ops.cc
+  replica_log/cls_replica_log_client.cc)
+
+# cls_user
+add_library(cls_user SHARED user/cls_user.cc)
+set_target_properties(cls_user PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_user DESTINATION lib/rados-classes)
+
+add_library(cls_user_client
+  user/cls_user_client.cc
+  user/cls_user_types.cc
+  user/cls_user_ops.cc)
+
+# cls_journal
+add_library(cls_journal SHARED
+  journal/cls_journal.cc
+  journal/cls_journal_types.cc)
+set_target_properties(cls_journal PROPERTIES VERSION "1.0.0" SOVERSION "1")
+install(TARGETS cls_journal DESTINATION lib/rados-classes)
+
+add_library(cls_journal_client
+  journal/cls_journal_client.cc
+  journal/cls_journal_types.cc)
+
+# cls_rgw
+if (WITH_RADOSGW)
+  add_library(cls_rgw SHARED
+    rgw/cls_rgw.cc
+    rgw/cls_rgw_ops.cc
+    rgw/cls_rgw_types.cc
+    ${CMAKE_SOURCE_DIR}/src/common/ceph_json.cc)
+  target_link_libraries(cls_rgw json_spirit)
+  set_target_properties(cls_rgw PROPERTIES VERSION "1.0.0" SOVERSION "1")
+  install(TARGETS cls_rgw DESTINATION lib/rados-classes)
+
+  add_library(cls_rgw_client
+    rgw/cls_rgw_client.cc
+    rgw/cls_rgw_types.cc
+    rgw/cls_rgw_ops.cc)
+endif (WITH_RADOSGW)
+
+# cls_cephfs
+if (WITH_CEPHFS)
+  add_library(cls_cephfs SHARED
+    cephfs/cls_cephfs.cc)
+  set_target_properties(cls_cephfs PROPERTIES VERSION "1.0.0" SOVERSION "1")
+  install(TARGETS cls_cephfs DESTINATION lib/rados-classes)
+
+  add_library(cls_cephfs_client
+    cephfs/cls_cephfs_client.cc)
+endif (WITH_CEPHFS)
+
+add_library(cls_numops_client STATIC numops/cls_numops_client.cc)
+
diff --git a/src/cls/Makefile.am b/src/cls/Makefile.am
index bac67e9..bb9ec94 100644
--- a/src/cls/Makefile.am
+++ b/src/cls/Makefile.am
@@ -5,3 +5,5 @@ endif
 if ENABLE_SERVER
 include cls/Makefile-server.am
 endif
+
+EXTRA_DIST += cls/CMakeLists.txt
diff --git a/src/cls/cephfs/cls_cephfs.cc b/src/cls/cephfs/cls_cephfs.cc
index 8f54e3a..6e81a53 100644
--- a/src/cls/cephfs/cls_cephfs.cc
+++ b/src/cls/cephfs/cls_cephfs.cc
@@ -29,7 +29,7 @@ cls_method_handle_t h_accumulate_inode_metadata;
 
 
 
-std::ostream &operator<<(std::ostream &out, ObjCeiling &in)
+std::ostream &operator<<(std::ostream &out, const ObjCeiling &in)
 {
   out << "id: " << in.id << " size: " << in.size;
   return out;
diff --git a/src/cls/journal/cls_journal_client.cc b/src/cls/journal/cls_journal_client.cc
index 50549dc..be60527 100644
--- a/src/cls/journal/cls_journal_client.cc
+++ b/src/cls/journal/cls_journal_client.cc
@@ -289,13 +289,18 @@ void client_update_data(librados::ObjectWriteOperation *op,
 
 int client_update_state(librados::IoCtx &ioctx, const std::string &oid,
                         const std::string &id, cls::journal::ClientState state) {
+  librados::ObjectWriteOperation op;
+  client_update_state(&op, id, state);
+  return ioctx.operate(oid, &op);
+}
+
+void client_update_state(librados::ObjectWriteOperation *op,
+                         const std::string &id,
+                         cls::journal::ClientState state) {
   bufferlist bl;
   ::encode(id, bl);
   ::encode(static_cast<uint8_t>(state), bl);
-
-  librados::ObjectWriteOperation op;
-  op.exec("journal", "client_update_state", bl);
-  return ioctx.operate(oid, &op);
+  op->exec("journal", "client_update_state", bl);
 }
 
 int client_unregister(librados::IoCtx &ioctx, const std::string &oid,
diff --git a/src/cls/journal/cls_journal_client.h b/src/cls/journal/cls_journal_client.h
index 94ba4b2..e854395 100644
--- a/src/cls/journal/cls_journal_client.h
+++ b/src/cls/journal/cls_journal_client.h
@@ -51,6 +51,9 @@ void client_update_data(librados::ObjectWriteOperation *op,
                         const std::string &id, const bufferlist &data);
 int client_update_state(librados::IoCtx &ioctx, const std::string &oid,
                         const std::string &id, cls::journal::ClientState state);
+void client_update_state(librados::ObjectWriteOperation *op,
+                         const std::string &id,
+                         cls::journal::ClientState state);
 
 int client_unregister(librados::IoCtx &ioctx, const std::string &oid,
                       const std::string &id);
diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc
index c430adf..6adc31f 100644
--- a/src/cls/rbd/cls_rbd.cc
+++ b/src/cls/rbd/cls_rbd.cc
@@ -409,6 +409,9 @@ int set_features(cls_method_context_t hctx, bufferlist *in, bufferlist *out)
     return r;
   }
 
+  // newer clients might attempt to mask off features we don't support
+  mask &= RBD_FEATURES_ALL;
+
   uint64_t enabled_features = features & mask;
   if ((enabled_features & RBD_FEATURES_MUTABLE) != enabled_features) {
     CLS_ERR("Attempting to enable immutable feature: %" PRIu64,
diff --git a/src/cls/rgw/cls_rgw_ops.h b/src/cls/rgw/cls_rgw_ops.h
index 7d8ad2d..15a638a 100644
--- a/src/cls/rgw/cls_rgw_ops.h
+++ b/src/cls/rgw/cls_rgw_ops.h
@@ -937,5 +937,4 @@ struct cls_rgw_bi_log_list_ret {
 };
 WRITE_CLASS_ENCODER(cls_rgw_bi_log_list_ret)
 
-
-#endif
+#endif /* CEPH_CLS_RGW_OPS_H */
diff --git a/src/common/AsyncOpTracker.cc b/src/common/AsyncOpTracker.cc
new file mode 100644
index 0000000..2219a7f
--- /dev/null
+++ b/src/common/AsyncOpTracker.cc
@@ -0,0 +1,53 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#include "common/AsyncOpTracker.h"
+#include "include/assert.h"
+#include "include/Context.h"
+
+AsyncOpTracker::AsyncOpTracker()
+  : m_lock("AsyncOpTracker::m_lock", false, false) {
+}
+
+AsyncOpTracker::~AsyncOpTracker() {
+  Mutex::Locker locker(m_lock);
+  assert(m_pending_ops == 0);
+}
+
+void AsyncOpTracker::start_op() {
+  Mutex::Locker locker(m_lock);
+  ++m_pending_ops;
+}
+
+void AsyncOpTracker::finish_op() {
+  Context *on_finish = nullptr;
+  {
+    Mutex::Locker locker(m_lock);
+    assert(m_pending_ops > 0);
+    if (--m_pending_ops == 0) {
+      std::swap(on_finish, m_on_finish);
+    }
+  }
+
+  if (on_finish != nullptr) {
+    on_finish->complete(0);
+  }
+}
+
+void AsyncOpTracker::wait_for_ops(Context *on_finish) {
+  {
+    Mutex::Locker locker(m_lock);
+    assert(m_on_finish == nullptr);
+    if (m_pending_ops > 0) {
+      m_on_finish = on_finish;
+      return;
+    }
+  }
+  on_finish->complete(0);
+}
+
+bool AsyncOpTracker::empty() {
+  Mutex::Locker locker(m_lock);
+  return (m_pending_ops == 0);
+}
+
diff --git a/src/common/AsyncOpTracker.h b/src/common/AsyncOpTracker.h
new file mode 100644
index 0000000..fccc9f9
--- /dev/null
+++ b/src/common/AsyncOpTracker.h
@@ -0,0 +1,31 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_ASYNC_OP_TRACKER_H
+#define CEPH_ASYNC_OP_TRACKER_H
+
+#include "include/int_types.h"
+#include "common/Mutex.h"
+
+struct Context;
+
+class AsyncOpTracker {
+public:
+  AsyncOpTracker();
+  ~AsyncOpTracker();
+
+  void start_op();
+  void finish_op();
+
+  void wait_for_ops(Context *on_finish);
+
+  bool empty();
+
+private:
+  Mutex m_lock;
+  uint32_t m_pending_ops = 0;
+  Context *m_on_finish = nullptr;
+
+};
+
+#endif // CEPH_ASYNC_OP_TRACKER_H
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
index 8b30eea..86df75d 100644
--- a/src/common/Makefile.am
+++ b/src/common/Makefile.am
@@ -1,5 +1,6 @@
 libcommon_internal_la_SOURCES = \
 	ceph_ver.c \
+	common/AsyncOpTracker.cc \
 	common/DecayCounter.cc \
 	common/LogClient.cc \
 	common/LogEntry.cc \
@@ -144,7 +145,7 @@ noinst_LTLIBRARIES += libcommon_crc.la
 
 if HAVE_ARMV8_CRC
 libcommon_crc_aarch64_la_SOURCES = common/crc32c_aarch64.c
-libcommon_crc_aarch64_la_CFLAGS = $(AM_CFLAGS) $(ARM_CRC_FLAGS)
+libcommon_crc_aarch64_la_CFLAGS = $(AM_CFLAGS) $(ARM_ARCH_FLAGS)
 LIBCOMMON_DEPS += libcommon_crc_aarch64.la
 noinst_LTLIBRARIES += libcommon_crc_aarch64.la
 endif
@@ -178,6 +179,7 @@ libcommon_la_LIBADD = $(LIBCOMMON_DEPS)
 noinst_LTLIBRARIES += libcommon.la
 
 noinst_HEADERS += \
+	common/AsyncOpTracker.h \
 	common/BackTrace.h \
 	common/RefCountedObj.h \
 	common/HeartbeatMap.h \
diff --git a/src/common/TextTable.cc b/src/common/TextTable.cc
index 4aef2f9..3c09fde 100644
--- a/src/common/TextTable.cc
+++ b/src/common/TextTable.cc
@@ -62,7 +62,7 @@ pad(string s, int width, TextTable::Align align)
   return string(lpad, ' ') + s + string(rpad, ' ');
 }
 
-std::ostream &operator<<(std::ostream& out, TextTable &t)
+std::ostream &operator<<(std::ostream &out, const TextTable &t)
 {
   for (unsigned int i = 0; i < t.col.size(); i++) {
     TextTable::TextTableColumn col = t.col[i];
diff --git a/src/common/TextTable.h b/src/common/TextTable.h
index d17b265..102e16f 100644
--- a/src/common/TextTable.h
+++ b/src/common/TextTable.h
@@ -49,10 +49,12 @@ private:
   };
 
   std::vector<TextTableColumn> col;	// column definitions
-  std::vector<std::vector<std::string> > row;	// row data array
   unsigned int curcol, currow;		// col, row being inserted into
   unsigned int indent;			// indent width when rendering
 
+protected:
+  std::vector<std::vector<std::string> > row;	// row data array
+
 public:
   TextTable(): curcol(0), currow(0), indent(0) {}
   ~TextTable() {}
@@ -147,7 +149,7 @@ public:
    * Render table to ostream (i.e. cout << table)
    */
 
-  friend std::ostream &operator<<(std::ostream& out, TextTable &t);
+  friend std::ostream &operator<<(std::ostream &out, const TextTable &t);
 
   /**
    * clear: Reset everything in a TextTable except column defs
diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc
index c8dab36..38a4e20 100644
--- a/src/common/ceph_context.cc
+++ b/src/common/ceph_context.cc
@@ -583,8 +583,10 @@ void CephContext::put() {
 
 void CephContext::init_crypto()
 {
-  ceph::crypto::init(this);
-  _crypto_inited = true;
+  if (!_crypto_inited) {
+    ceph::crypto::init(this);
+    _crypto_inited = true;
+  }
 }
 
 void CephContext::start_service_thread()
diff --git a/src/common/ceph_json.cc b/src/common/ceph_json.cc
index d1d33a9..52be842 100644
--- a/src/common/ceph_json.cc
+++ b/src/common/ceph_json.cc
@@ -40,7 +40,7 @@ JSONObj *JSONObjIter::operator*()
 }
 
 // does not work, FIXME
-ostream& operator<<(ostream& out, JSONObj& obj) {
+ostream& operator<<(ostream &out, const JSONObj &obj) {
    out << obj.name << ": " << obj.data_string;
    return out;
 }
diff --git a/src/common/ceph_json.h b/src/common/ceph_json.h
index a812d7a..6748349 100644
--- a/src/common/ceph_json.h
+++ b/src/common/ceph_json.h
@@ -73,7 +73,8 @@ public:
   JSONObjIter find_first(const string& name);
   JSONObj *find_obj(const string& name);
 
-  friend ostream& operator<<(ostream& out, JSONObj& obj); // does not work, FIXME
+  friend ostream& operator<<(ostream &out,
+			     const JSONObj &obj); // does not work, FIXME
 
   bool is_array();
   bool is_object();
diff --git a/src/common/ceph_timer.h b/src/common/ceph_timer.h
index ae95eb2..6323be6 100644
--- a/src/common/ceph_timer.h
+++ b/src/common/ceph_timer.h
@@ -58,7 +58,7 @@ namespace ceph {
 
     template <class TC>
     class timer {
-      typedef set_member_hook<link_mode<normal_link> > sh;
+      using sh = set_member_hook<link_mode<normal_link> >;
 
       struct event {
 	typename TC::time_point t;
@@ -89,15 +89,19 @@ namespace ceph {
 	}
       };
 
-      set<event,
-	  member_hook<event, sh, &event::schedule_link>,
-	  constant_time_size<false>,
-	  compare<SchedCompare> > schedule;
+      using schedule_type = set<event,
+				member_hook<event, sh, &event::schedule_link>,
+				constant_time_size<false>,
+				compare<SchedCompare> >;
 
-      set<event,
-	  member_hook<event, sh, &event::event_link>,
-	  constant_time_size<false>,
-	  compare<EventCompare> > events;
+      schedule_type schedule;
+
+      using event_set_type = set<event,
+				 member_hook<event, sh, &event::event_link>,
+				 constant_time_size<false>,
+				 compare<EventCompare> >;
+
+      event_set_type events;
 
       std::mutex lock;
       using lock_guard = std::lock_guard<std::mutex>;
@@ -231,6 +235,30 @@ namespace ceph {
 	return e.id;
       }
 
+      // Adjust the timeout of a currently-scheduled event (relative)
+      bool adjust_event(uint64_t id, typename TC::duration duration) {
+	return adjust_event(id, TC::now() + duration);
+      }
+
+      // Adjust the timeout of a currently-scheduled event (absolute)
+      bool adjust_event(uint64_t id, typename TC::time_point when) {
+	std::lock_guard<std::mutex> l(lock);
+
+	event key(id);
+	typename event_set_type::iterator it = events.find(key);
+
+	if (it == events.end())
+	  return false;
+
+	event& e = *it;
+
+	schedule.erase(e);
+	e.t = when;
+	schedule.insert(e);
+
+	return true;
+      }
+
       // Cancel an event. If the event has already come and gone (or you
       // never submitted it) you will receive false. Otherwise you will
       // receive true and it is guaranteed the event will not execute.
diff --git a/src/common/common_init.h b/src/common/common_init.h
index 1184222..6ef4a90 100644
--- a/src/common/common_init.h
+++ b/src/common/common_init.h
@@ -39,7 +39,7 @@ enum common_init_flags_t {
   CINIT_FLAG_NO_DAEMON_ACTIONS = 0x8,
 
   // don't drop privileges
-  CINIT_FLAG_DEFER_DROP_PRIVILEGES = 0x16,
+  CINIT_FLAG_DEFER_DROP_PRIVILEGES = 0x10,
 };
 
 /*
diff --git a/src/common/config.cc b/src/common/config.cc
index 622e237..d27bfbf 100644
--- a/src/common/config.cc
+++ b/src/common/config.cc
@@ -994,7 +994,7 @@ int md_config_t::set_val_raw(const char *val, const config_option *opt)
       return 0;
     case OPT_U32: {
       std::string err;
-      int f = strict_si_cast<int>(val, &err);
+      int f = strict_si_cast<uint32_t>(val, &err);
       if (!err.empty())
 	return -EINVAL;
       *(uint32_t*)opt->conf_ptr(this) = f;
diff --git a/src/common/config_opts.h b/src/common/config_opts.h
index 7be4231..3795f0e 100644
--- a/src/common/config_opts.h
+++ b/src/common/config_opts.h
@@ -524,7 +524,6 @@ OPTION(mds_inject_traceless_reply_probability, OPT_DOUBLE, 0) /* percentage
 OPTION(mds_wipe_sessions, OPT_BOOL, 0)
 OPTION(mds_wipe_ino_prealloc, OPT_BOOL, 0)
 OPTION(mds_skip_ino, OPT_INT, 0)
-OPTION(max_mds, OPT_INT, 1)
 OPTION(mds_standby_for_name, OPT_STR, "")
 OPTION(mds_standby_for_rank, OPT_INT, -1)
 OPTION(mds_standby_for_fscid, OPT_INT, -1)
@@ -1173,6 +1172,7 @@ OPTION(rbd_enable_alloc_hint, OPT_BOOL, true) // when writing a object, it will
 OPTION(rbd_tracing, OPT_BOOL, false) // true if LTTng-UST tracepoints should be enabled
 OPTION(rbd_validate_pool, OPT_BOOL, true) // true if empty pools should be validated for RBD compatibility
 OPTION(rbd_validate_names, OPT_BOOL, true) // true if image specs should be validated
+OPTION(rbd_mirroring_resync_after_disconnect, OPT_BOOL, false) // automatically start image resync after mirroring is disconnected due to being laggy
 
 /*
  * The following options change the behavior for librbd's image creation methods that
@@ -1213,6 +1213,7 @@ OPTION(rbd_journal_object_flush_bytes, OPT_INT, 0) // maximum number of pending
 OPTION(rbd_journal_object_flush_age, OPT_DOUBLE, 0) // maximum age (in seconds) for pending commits
 OPTION(rbd_journal_pool, OPT_STR, "") // pool for journal objects
 OPTION(rbd_journal_max_payload_bytes, OPT_U32, 16384) // maximum journal payload size before splitting
+OPTION(rbd_journal_max_concurrent_object_sets, OPT_INT, 0) // maximum number of object sets a journal client can be behind before it is automatically unregistered
 
 /**
  * RBD Mirror options
@@ -1299,6 +1300,8 @@ OPTION(rgw_ldap_dnattr, OPT_STR, "uid")
 OPTION(rgw_ldap_secret, OPT_STR, "/etc/openldap/secret")
 /* rgw_s3_auth_use_ldap  use LDAP for RGW auth? */
 OPTION(rgw_s3_auth_use_ldap, OPT_BOOL, false)
+/* rgw_ldap_searchfilter  LDAP search filter */
+OPTION(rgw_ldap_searchfilter, OPT_STR, "")
 
 OPTION(rgw_admin_entry, OPT_STR, "admin")  // entry point for which a url is considered an admin request
 OPTION(rgw_enforce_swift_acls, OPT_BOOL, true)
@@ -1324,6 +1327,9 @@ OPTION(rgw_nfs_lru_lanes, OPT_INT, 5)
 OPTION(rgw_nfs_lru_lane_hiwat, OPT_INT, 911)
 OPTION(rgw_nfs_fhcache_partitions, OPT_INT, 3)
 OPTION(rgw_nfs_fhcache_size, OPT_INT, 2017) /* 3*2017=6051 */
+OPTION(rgw_nfs_write_completion_interval_s, OPT_INT, 10) /* stateless (V3)
+							  * commit
+							  * delay */
 
 OPTION(rgw_zone, OPT_STR, "") // zone name
 OPTION(rgw_zone_root_pool, OPT_STR, ".rgw.root")    // pool where zone specific info is stored
diff --git a/src/common/crc32c_aarch64.c b/src/common/crc32c_aarch64.c
index d33827d..d2be6dd 100644
--- a/src/common/crc32c_aarch64.c
+++ b/src/common/crc32c_aarch64.c
@@ -2,6 +2,9 @@
 #include "include/int_types.h"
 #include "common/crc32c_aarch64.h"
 
+/* Request crc extension capabilities from the assembler */
+asm(".arch_extension crc");
+
 #define CRC32CX(crc, value) __asm__("crc32cx %w[c], %w[c], %x[v]":[c]"+r"(crc):[v]"r"(value))
 #define CRC32CW(crc, value) __asm__("crc32cw %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))
 #define CRC32CH(crc, value) __asm__("crc32ch %w[c], %w[c], %w[v]":[c]"+r"(crc):[v]"r"(value))
diff --git a/src/common/hobject.h b/src/common/hobject.h
index 69bb611..9be84c5 100644
--- a/src/common/hobject.h
+++ b/src/common/hobject.h
@@ -138,6 +138,14 @@ public:
     return ret;
   }
 
+  hobject_t get_object_boundary() const {
+    if (is_max())
+      return *this;
+    hobject_t ret = *this;
+    ret.snap = 0;
+    return ret;
+  }
+
   /// @return head version of this hobject_t
   hobject_t get_head() const {
     hobject_t ret(*this);
@@ -162,14 +170,14 @@ public:
     return snap == CEPH_NOSNAP;
   }
 
-  /// @return true if object is neither head nor snapdir
+  /// @return true if object is neither head nor snapdir nor max
   bool is_snap() const {
-    return (snap != CEPH_NOSNAP) && (snap != CEPH_SNAPDIR);
+    return !is_max() && !is_head() && !is_snapdir();
   }
 
   /// @return true iff the object should have a snapset in it's attrs
   bool has_snapset() const {
-    return !is_snap();
+    return is_head() || is_snapdir();
   }
 
   /* Do not use when a particular hash function is needed */
diff --git a/src/common/strtol.cc b/src/common/strtol.cc
index f43d661..321521d 100644
--- a/src/common/strtol.cc
+++ b/src/common/strtol.cc
@@ -186,12 +186,10 @@ T strict_si_cast(const char *str, std::string *err)
 }
 
 template int strict_si_cast<int>(const char *str, std::string *err);
-
+template long strict_si_cast<long>(const char *str, std::string *err);
 template long long strict_si_cast<long long>(const char *str, std::string *err);
-
-template int64_t strict_si_cast<int64_t>(const char *str, std::string *err);
-
 template uint64_t strict_si_cast<uint64_t>(const char *str, std::string *err);
+template uint32_t strict_si_cast<uint32_t>(const char *str, std::string *err);
 
 uint64_t strict_sistrtoll(const char *str, std::string *err)
 {
diff --git a/src/compressor/CMakeLists.txt b/src/compressor/CMakeLists.txt
new file mode 100644
index 0000000..0cef856
--- /dev/null
+++ b/src/compressor/CMakeLists.txt
@@ -0,0 +1,19 @@
+
+set(compressor_srcs 
+  Compressor.cc
+  AsyncCompressor.cc)
+add_library(compressor STATIC ${compressor_srcs})
+target_link_libraries(compressor common snappy ${CMAKE_DL_LIBS})
+
+## compressor plugins
+
+set(compressorlibdir ${LIBRARY_OUTPUT_PATH}/compressor)
+
+add_subdirectory(snappy)
+add_subdirectory(zlib)
+
+add_library(compressor_objs OBJECT Compressor.cc)
+
+add_custom_target(compressor_plugins DEPENDS
+    ceph_snappy
+    ceph_zlib)
diff --git a/src/compressor/Makefile.am b/src/compressor/Makefile.am
index 9deda3c..4d42803 100644
--- a/src/compressor/Makefile.am
+++ b/src/compressor/Makefile.am
@@ -19,3 +19,5 @@ noinst_HEADERS += \
 	compressor/AsyncCompressor.h \
     compressor/CompressionPlugin.h
 
+
+EXTRA_DIST += compressor/CMakeLists.txt
diff --git a/src/compressor/snappy/CMakeLists.txt b/src/compressor/snappy/CMakeLists.txt
new file mode 100644
index 0000000..43cb61e
--- /dev/null
+++ b/src/compressor/snappy/CMakeLists.txt
@@ -0,0 +1,14 @@
+# snappy
+
+# absolute path because $snappy_sources used outside of this directory
+set(snappy_sources
+  ${CMAKE_SOURCE_DIR}/src/compressor/snappy/CompressionPluginSnappy.cc
+  $<TARGET_OBJECTS:compressor_objs>
+)
+
+add_library(ceph_snappy SHARED ${snappy_sources})
+add_dependencies(ceph_snappy ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ceph_snappy ${EXTRALIBS})
+set_target_properties(ceph_snappy PROPERTIES VERSION 2.14.0 SOVERSION 2)
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lsnappy")
+install(TARGETS ceph_snappy DESTINATION lib/compressor)
diff --git a/src/compressor/snappy/Makefile.am b/src/compressor/snappy/Makefile.am
index 49d3db0..427cea5 100644
--- a/src/compressor/snappy/Makefile.am
+++ b/src/compressor/snappy/Makefile.am
@@ -20,3 +20,5 @@ libceph_snappy_la_LDFLAGS += -export-symbols-regex '.*__compressor_.*'
 endif
 
 compressorlib_LTLIBRARIES += libceph_snappy.la
+
+EXTRA_DIST += compressor/snappy/CMakeLists.txt
diff --git a/src/compressor/zlib/CMakeLists.txt b/src/compressor/zlib/CMakeLists.txt
new file mode 100644
index 0000000..cacf307
--- /dev/null
+++ b/src/compressor/zlib/CMakeLists.txt
@@ -0,0 +1,14 @@
+# zlib
+
+set(zlib_sources
+  CompressionPluginZlib.cc
+  CompressionZlib.cc
+  $<TARGET_OBJECTS:compressor_objs>
+)
+
+add_library(ceph_zlib SHARED ${zlib_sources})
+add_dependencies(ceph_zlib ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ceph_zlib ${EXTRALIBS})
+set_target_properties(ceph_zlib PROPERTIES VERSION 2.14.0 SOVERSION 2)
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lz")
+install(TARGETS ceph_zlib DESTINATION lib/compressor)
diff --git a/src/compressor/zlib/Makefile.am b/src/compressor/zlib/Makefile.am
index 250f396..623cdcd 100644
--- a/src/compressor/zlib/Makefile.am
+++ b/src/compressor/zlib/Makefile.am
@@ -19,3 +19,5 @@ libceph_zlib_la_LDFLAGS += -export-symbols-regex '.*__compressor_.*'
 endif
 
 compressorlib_LTLIBRARIES += libceph_zlib.la
+
+EXTRA_DIST += compressor/zlib/CMakeLists.txt
diff --git a/src/crush/CrushTester.cc b/src/crush/CrushTester.cc
index 2ebe8c2..a879171 100644
--- a/src/crush/CrushTester.cc
+++ b/src/crush/CrushTester.cc
@@ -4,6 +4,7 @@
 #include "include/stringify.h"
 #include "CrushTester.h"
 #include "CrushTreeDumper.h"
+#include "include/ceph_features.h"
 
 #include <algorithm>
 #include <stdlib.h>
@@ -383,7 +384,7 @@ int CrushTester::test_with_crushtool(const char *crushtool_cmd,
   }
 
   bufferlist bl;
-  ::encode(crush, bl);
+  ::encode(crush, bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
   bl.write_fd(crushtool.get_stdin());
   crushtool.close_stdin();
   bl.clear();
diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc
index 3450b48..1727670 100644
--- a/src/crush/CrushWrapper.cc
+++ b/src/crush/CrushWrapper.cc
@@ -1118,7 +1118,7 @@ int CrushWrapper::remove_rule(int ruleno)
   return 0;
 }
 
-void CrushWrapper::encode(bufferlist& bl, bool lean) const
+void CrushWrapper::encode(bufferlist& bl, uint64_t features) const
 {
   assert(crush);
 
@@ -1209,7 +1209,9 @@ void CrushWrapper::encode(bufferlist& bl, bool lean) const
   ::encode(crush->chooseleaf_vary_r, bl);
   ::encode(crush->straw_calc_version, bl);
   ::encode(crush->allowed_bucket_algs, bl);
-  ::encode(crush->chooseleaf_stable, bl);
+  if (features & CEPH_FEATURE_CRUSH_TUNABLES5) {
+    ::encode(crush->chooseleaf_stable, bl);
+  }
 }
 
 static void decode_32_or_64_string_map(map<int32_t,string>& m, bufferlist::iterator& blp)
diff --git a/src/crush/CrushWrapper.h b/src/crush/CrushWrapper.h
index 1f9c878..07c32e1 100644
--- a/src/crush/CrushWrapper.h
+++ b/src/crush/CrushWrapper.h
@@ -22,6 +22,7 @@ extern "C" {
 
 #include "include/err.h"
 #include "include/encoding.h"
+#include "include/ceph_features.h"
 
 
 #include "common/Mutex.h"
@@ -1094,6 +1095,32 @@ public:
     for (int i=0; i<numrep; i++)
       out[i] = rawout[i];
   }
+  
+  bool check_crush_rule(int ruleset, int type, int size,  ostream& ss) {
+   
+    assert(crush);    
+
+    __u32 i;
+    for (i = 0; i < crush->max_rules; i++) {
+      if (crush->rules[i] &&
+          crush->rules[i]->mask.ruleset == ruleset &&
+          crush->rules[i]->mask.type == type) {
+
+        if (crush->rules[i]->mask.min_size <= size &&
+            crush->rules[i]->mask.max_size >= size) {
+          return true;
+        } else if (size < crush->rules[i]->mask.min_size) {
+          ss << "pool size is smaller than the crush rule min size";
+          return false;
+        } else {
+          ss << "pool size is bigger than the crush rule max size";
+          return false;
+        }
+      }
+    }
+
+    return false;
+  }
 
   int read_from_file(const char *fn) {
     bufferlist bl;
@@ -1106,11 +1133,11 @@ public:
   }
   int write_to_file(const char *fn) {
     bufferlist bl;
-    encode(bl);
+    encode(bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
     return bl.write_file(fn);
   }
 
-  void encode(bufferlist &bl, bool lean=false) const;
+  void encode(bufferlist &bl, uint64_t features) const;
   void decode(bufferlist::iterator &blp);
   void decode_crush_bucket(crush_bucket** bptr, bufferlist::iterator &blp);
   void dump(Formatter *f) const;
@@ -1130,6 +1157,6 @@ public:
   static bool is_valid_crush_loc(CephContext *cct,
 				 const map<string,string>& loc);
 };
-WRITE_CLASS_ENCODER(CrushWrapper)
+WRITE_CLASS_ENCODER_FEATURES(CrushWrapper)
 
 #endif
diff --git a/src/crush/builder.c b/src/crush/builder.c
index 387c8be..9331f6d 100644
--- a/src/crush/builder.c
+++ b/src/crush/builder.c
@@ -1015,7 +1015,8 @@ int crush_remove_tree_bucket_item(struct crush_bucket_tree *bucket, int item)
 
 		if (bucket->h.items[i] != item)
 			continue;
-		
+
+		bucket->h.items[i] = 0;
 		node = crush_calc_tree_node(i);
 		weight = bucket->node_weights[node];
 		bucket->node_weights[node] = 0;
diff --git a/src/erasure-code/CMakeLists.txt b/src/erasure-code/CMakeLists.txt
new file mode 100644
index 0000000..0f406bc
--- /dev/null
+++ b/src/erasure-code/CMakeLists.txt
@@ -0,0 +1,91 @@
+## erasure code plugins
+
+set(erasure_codelibdir ${LIBRARY_OUTPUT_PATH}/erasure-code)
+
+## detect sse support
+
+# create a tmp file with an empty main()
+set(sse_srcs "${CMAKE_BINARY_DIR}/src/erasure-code/jerasure/tmp_sse.c")
+file(WRITE ${sse_srcs} "void main() {}")
+
+# try each -msse flag
+try_compile(INTEL_SSE ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-msse")
+try_compile(INTEL_SSE2 ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-msse2")
+try_compile(INTEL_SSE3 ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-msse3")
+try_compile(INTEL_SSSE3 ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-mssse3")
+try_compile(INTEL_SSE4_1 ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-msse4.1")
+try_compile(INTEL_SSE4_2 ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-msse4.2")
+try_compile(ARM_NEON ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-mfpu=neon")
+try_compile(ARM_NEON2 ${CMAKE_BINARY_DIR} ${sse_srcs}
+  COMPILE_DEFINITIONS "-march=armv8-a+simd")
+
+# clean up tmp file
+file(REMOVE ${sse_srcs})
+
+if(ARM_NEON OR ARM_NEON2)
+  if(ARM_NEON)
+    set(ARM_NEON_FLAGS "-mfpu=neon")
+  else(ARM_NEON)
+    set(ARM_NEON_FLAGS "-march=armv8-a+simd")
+  endif(ARM_NEON)
+else(ARM_NEON OR ARM_NEON2)
+  message(STATUS "Skipping target ec_jerasure_neon & ec_shec_neon: Architecture not ARM")
+endif(ARM_NEON OR ARM_NEON2)
+
+if(INTEL_SSE)
+  set(SSE3_FLAGS "-msse")
+  if (INTEL_SSE2)
+    set(SSE3_FLAGS "${SSE3_FLAGS} -msse2")
+  endif (INTEL_SSE2)
+  if (INTEL_SSE3)
+    set(SSE3_FLAGS "${SSE3_FLAGS} -msse3")
+  endif (INTEL_SSE3)
+  if (INTEL_SSSE3)
+    set(SSE3_FLAGS "${SSE3_FLAGS} -mssse3")
+  endif (INTEL_SSSE3)
+else(INTEL_SSE)
+  message(STATUS "Skipping target ec_jerasure_sse3 & ec_shec_sse3: -msse not supported")
+endif(INTEL_SSE)
+
+if(INTEL_SSE4_1)
+  set(SSE4_FLAGS "${SSE3_FLAGS} -msse4.1")
+  if (INTEL_SSE4_2)
+    set(SSE4_FLAGS "${SSE4_FLAGS} -msse4.2")
+  endif (INTEL_SSE4_2)
+else(INTEL_SSE4_1)
+  message(STATUS "Skipping target ec_jerasure_sse4 & ec_shec_sse4: -msse4.1 not supported")
+endif(INTEL_SSE4_1)
+
+#jerasure subdir must be before shec so jerasure & neon obj libs are declared
+include_directories(jerasure/jerasure/include)
+include_directories(jerasure/gf-complete/include)
+include_directories(jerasure)
+add_subdirectory(jerasure)
+add_subdirectory(lrc)
+add_subdirectory(shec)
+
+if (HAVE_BETTER_YASM_ELF64)
+  add_subdirectory(isa)
+  set(EC_ISA_LIB ec_isa)
+endif (HAVE_BETTER_YASM_ELF64)
+
+add_library(erasure_code ErasureCodePlugin.cc)
+target_link_libraries(erasure_code dl)
+add_dependencies(erasure_code ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+
+add_library(erasure_code_objs OBJECT ErasureCode.cc)
+
+add_custom_target(erasure_code_plugins DEPENDS
+    ${EC_ISA_LIB}
+    ec_lrc
+    ec_jerasure_sse3
+    ec_jerasure_sse4
+    ec_jerasure)
+
diff --git a/src/erasure-code/Makefile.am b/src/erasure-code/Makefile.am
index 224e67b..e150556 100644
--- a/src/erasure-code/Makefile.am
+++ b/src/erasure-code/Makefile.am
@@ -26,3 +26,5 @@ noinst_HEADERS += \
 	erasure-code/ErasureCode.h \
 	erasure-code/ErasureCodeInterface.h \
 	erasure-code/ErasureCodePlugin.h
+
+EXTRA_DIST += erasure-code/CMakeLists.txt
diff --git a/src/erasure-code/isa/CMakeLists.txt b/src/erasure-code/isa/CMakeLists.txt
new file mode 100644
index 0000000..9234274
--- /dev/null
+++ b/src/erasure-code/isa/CMakeLists.txt
@@ -0,0 +1,58 @@
+# ISA
+
+include_directories(isa-l/include)
+
+set(isa_srcs
+  isa-l/erasure_code/ec_base.c
+  isa-l/erasure_code/gf_2vect_dot_prod_sse.asm.s
+  isa-l/erasure_code/gf_3vect_dot_prod_sse.asm.s
+  isa-l/erasure_code/gf_4vect_dot_prod_sse.asm.s
+  isa-l/erasure_code/gf_5vect_dot_prod_sse.asm.s
+  isa-l/erasure_code/gf_6vect_dot_prod_sse.asm.s
+  isa-l/erasure_code/gf_vect_dot_prod_sse.asm.s
+  isa-l/erasure_code/gf_2vect_mad_avx2.asm.s
+  isa-l/erasure_code/gf_3vect_mad_avx2.asm.s
+  isa-l/erasure_code/gf_4vect_mad_avx2.asm.s
+  isa-l/erasure_code/gf_5vect_mad_avx2.asm.s
+  isa-l/erasure_code/gf_6vect_mad_avx2.asm.s
+  isa-l/erasure_code/gf_vect_mad_avx2.asm.s
+  isa-l/erasure_code/ec_highlevel_func.c
+  isa-l/erasure_code/gf_2vect_mad_avx.asm.s
+  isa-l/erasure_code/gf_3vect_mad_avx.asm.s
+  isa-l/erasure_code/gf_4vect_mad_avx.asm.s
+  isa-l/erasure_code/gf_5vect_mad_avx.asm.s
+  isa-l/erasure_code/gf_6vect_mad_avx.asm.s
+  isa-l/erasure_code/gf_vect_mad_avx.asm.s
+  isa-l/erasure_code/ec_multibinary.asm.s
+  isa-l/erasure_code/gf_2vect_mad_sse.asm.s
+  isa-l/erasure_code/gf_3vect_mad_sse.asm.s
+  isa-l/erasure_code/gf_4vect_mad_sse.asm.s
+  isa-l/erasure_code/gf_5vect_mad_sse.asm.s
+  isa-l/erasure_code/gf_6vect_mad_sse.asm.s
+  isa-l/erasure_code/gf_vect_mad_sse.asm.s
+  isa-l/erasure_code/gf_2vect_dot_prod_avx2.asm.s
+  isa-l/erasure_code/gf_3vect_dot_prod_avx2.asm.s
+  isa-l/erasure_code/gf_4vect_dot_prod_avx2.asm.s
+  isa-l/erasure_code/gf_5vect_dot_prod_avx2.asm.s
+  isa-l/erasure_code/gf_6vect_dot_prod_avx2.asm.s
+  isa-l/erasure_code/gf_vect_dot_prod_avx2.asm.s
+  isa-l/erasure_code/gf_vect_mul_avx.asm.s
+  isa-l/erasure_code/gf_2vect_dot_prod_avx.asm.s
+  isa-l/erasure_code/gf_3vect_dot_prod_avx.asm.s
+  isa-l/erasure_code/gf_4vect_dot_prod_avx.asm.s
+  isa-l/erasure_code/gf_5vect_dot_prod_avx.asm.s
+  isa-l/erasure_code/gf_6vect_dot_prod_avx.asm.s
+  isa-l/erasure_code/gf_vect_dot_prod_avx.asm.s
+  isa-l/erasure_code/gf_vect_mul_sse.asm.s
+  ErasureCodeIsa.cc
+  ErasureCodeIsaTableCache.cc
+  ErasureCodePluginIsa.cc
+  xor_op.cc
+  $<TARGET_OBJECTS:erasure_code_objs>
+)
+
+add_library(ec_isa SHARED ${isa_srcs})
+add_dependencies(ec_isa ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_isa ${EXTRALIBS})
+set_target_properties(ec_isa PROPERTIES VERSION 2.14.0 SOVERSION 2)
+install(TARGETS ec_isa DESTINATION lib/erasure-code)
diff --git a/src/erasure-code/isa/Makefile.am b/src/erasure-code/isa/Makefile.am
index 6bbb37c..971b736 100644
--- a/src/erasure-code/isa/Makefile.am
+++ b/src/erasure-code/isa/Makefile.am
@@ -75,3 +75,5 @@ libec_isa_la_LDFLAGS += -export-symbols-regex '.*__erasure_code_.*'
 endif
 
 erasure_codelib_LTLIBRARIES += libec_isa.la
+
+EXTRA_DIST += erasure-code/isa/CMakeLists.txt
diff --git a/src/erasure-code/jerasure/CMakeLists.txt b/src/erasure-code/jerasure/CMakeLists.txt
new file mode 100644
index 0000000..92380b8
--- /dev/null
+++ b/src/erasure-code/jerasure/CMakeLists.txt
@@ -0,0 +1,95 @@
+# jerasure plugin
+
+set(jerasure_obj_srcs
+  jerasure/src/cauchy.c
+  jerasure/src/galois.c
+  jerasure/src/jerasure.c
+  jerasure/src/liberation.c
+  jerasure/src/reed_sol.c
+  gf-complete/src/gf_wgen.c
+  gf-complete/src/gf_method.c
+  gf-complete/src/gf_w16.c
+  gf-complete/src/gf.c
+  gf-complete/src/gf_w32.c
+  gf-complete/src/gf_w64.c
+  gf-complete/src/gf_w128.c
+  gf-complete/src/gf_general.c
+  gf-complete/src/gf_w4.c
+  gf-complete/src/gf_rand.c
+  gf-complete/src/gf_w8.c
+  )
+add_library(jerasure_objs OBJECT ${jerasure_obj_srcs})
+
+add_library(ec_jerasure_objs OBJECT
+  ErasureCodePluginJerasure.cc
+  ErasureCodeJerasure.cc
+  )
+
+add_library(ec_jerasure_generic SHARED 
+  $<TARGET_OBJECTS:ec_jerasure_objs>
+  $<TARGET_OBJECTS:jerasure_objs>
+  $<TARGET_OBJECTS:erasure_code_objs>
+  )
+add_dependencies(ec_jerasure_generic ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_jerasure_generic crush ${EXTRALIBS})
+set_target_properties(ec_jerasure_generic PROPERTIES VERSION 2.0.0 SOVERSION 2)
+install(TARGETS ec_jerasure_generic DESTINATION lib/erasure-code)
+
+# ec_jerasure_neon
+#TODO:build libec_jerasure_neon library on an ARM machine
+if(ARM_NEON OR ARM_NEON2)
+  set(neon_objs_srcs
+    gf-complete/src/neon/gf_w4_neon.c
+    gf-complete/src/neon/gf_w8_neon.c
+    gf-complete/src/neon/gf_w16_neon.c
+    gf-complete/src/neon/gf_w32_neon.c
+    gf-complete/src/neon/gf_w64_neon.c)
+  add_library(neon_objs OBJECT ${neon_objs_srcs})
+
+  set(jerasure_neon_srcs
+    $<TARGET_OBJECTS:ec_jerasure_objs>
+    $<TARGET_OBJECTS:jerasure_objs>
+    $<TARGET_OBJECTS:neon_objs>
+    $<TARGET_OBJECTS:erasure_code_objs>
+    )
+  add_library(ec_jerasure_neon SHARED ${jerasure_neon_srcs})
+  add_dependencies(ec_jerasure_neon ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+  target_link_libraries(ec_jerasure_neon crush pthread ${EXTRALIBS})
+  set_target_properties(ec_jerasure_neon PROPERTIES VERSION 2.0.0 SOVERSION 2
+    COMPILE_FLAGS ${ARM_NEON_FLAGS})
+  install(TARGETS ec_jerasure_neon DESTINATION lib/erasure-code)
+endif(ARM_NEON OR ARM_NEON2)
+
+# ec_jerasure_sse3
+if(INTEL_SSE)
+  add_library(ec_jerasure_sse3 SHARED 
+    $<TARGET_OBJECTS:jerasure_objs>
+    $<TARGET_OBJECTS:ec_jerasure_objs>
+    $<TARGET_OBJECTS:erasure_code_objs>
+    )
+  add_dependencies(ec_jerasure_sse3 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+  target_link_libraries(ec_jerasure_sse3 crush ${EXTRALIBS})
+  set_target_properties(ec_jerasure_sse3 PROPERTIES VERSION 2.0.0 SOVERSION 2
+    COMPILE_FLAGS ${SSE3_FLAGS})
+  install(TARGETS ec_jerasure_sse3 DESTINATION lib/erasure-code)
+endif(INTEL_SSE)
+
+# ec_jerasure_sse4
+if(INTEL_SSE4_1)
+  add_library(ec_jerasure_sse4 SHARED 
+    $<TARGET_OBJECTS:jerasure_objs>
+    $<TARGET_OBJECTS:ec_jerasure_objs>
+    $<TARGET_OBJECTS:erasure_code_objs>
+    )
+  add_dependencies(ec_jerasure_sse4 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+  target_link_libraries(ec_jerasure_sse4 crush ${EXTRALIBS})
+  set_target_properties(ec_jerasure_sse4 PROPERTIES VERSION 2.0.0 SOVERSION 2
+    COMPILE_FLAGS ${SSE4_FLAGS})
+  install(TARGETS ec_jerasure_sse4 DESTINATION lib/erasure-code)
+endif(INTEL_SSE4_1)
+
+add_library(ec_jerasure SHARED ErasureCodePluginSelectJerasure.cc)
+add_dependencies(ec_jerasure ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_jerasure ${EXTRALIBS})
+set_target_properties(ec_jerasure PROPERTIES VERSION 2.0.0 SOVERSION 2)
+install(TARGETS ec_jerasure DESTINATION lib/erasure-code)
diff --git a/src/erasure-code/jerasure/Makefile.am b/src/erasure-code/jerasure/Makefile.am
index adcb95d..6ffe3ed 100644
--- a/src/erasure-code/jerasure/Makefile.am
+++ b/src/erasure-code/jerasure/Makefile.am
@@ -146,3 +146,5 @@ endif
 erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc: ./ceph_ver.h
 
 erasure_codelib_LTLIBRARIES += libec_jerasure.la
+
+EXTRA_DIST += erasure-code/jerasure/CMakeLists.txt
diff --git a/src/erasure-code/lrc/CMakeLists.txt b/src/erasure-code/lrc/CMakeLists.txt
new file mode 100644
index 0000000..cd9e923
--- /dev/null
+++ b/src/erasure-code/lrc/CMakeLists.txt
@@ -0,0 +1,14 @@
+# lrc plugin
+
+set(lrc_srcs
+  ErasureCodePluginLrc.cc
+  ErasureCodeLrc.cc
+  $<TARGET_OBJECTS:erasure_code_objs>
+  ${CMAKE_SOURCE_DIR}/src/common/str_map.cc
+)
+
+add_library(ec_lrc SHARED ${lrc_srcs})
+add_dependencies(ec_lrc ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_lrc crush json_spirit)
+set_target_properties(ec_lrc PROPERTIES VERSION 1.0.0 SOVERSION 1)
+install(TARGETS ec_lrc DESTINATION lib/erasure-code)
diff --git a/src/erasure-code/lrc/Makefile.am b/src/erasure-code/lrc/Makefile.am
index 44c47d5..0f91406 100644
--- a/src/erasure-code/lrc/Makefile.am
+++ b/src/erasure-code/lrc/Makefile.am
@@ -19,3 +19,5 @@ libec_lrc_la_LDFLAGS += -export-symbols-regex '.*__erasure_code_.*'
 endif
 
 erasure_codelib_LTLIBRARIES += libec_lrc.la
+
+EXTRA_DIST += erasure-code/lrc/CMakeLists.txt
diff --git a/src/erasure-code/shec/CMakeLists.txt b/src/erasure-code/shec/CMakeLists.txt
new file mode 100644
index 0000000..49d2954
--- /dev/null
+++ b/src/erasure-code/shec/CMakeLists.txt
@@ -0,0 +1,67 @@
+#shec plugin
+
+include_directories(.)
+
+set(shec_objs_srcs
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc 
+  ErasureCodePluginShec.cc 
+  ErasureCodeShec.cc 
+  ErasureCodeShecTableCache.cc 
+  determinant.c 
+  )
+
+add_library(shec_objs OBJECT ${shec_objs_srcs})
+
+add_library(ec_shec_generic SHARED 
+  $<TARGET_OBJECTS:jerasure_objs>
+  $<TARGET_OBJECTS:shec_objs>)
+target_link_libraries(ec_shec_generic crush pthread)
+add_dependencies(ec_shec_generic ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+set_target_properties(ec_shec_generic PROPERTIES VERSION 1.0.0 SOVERSION 1)
+install(TARGETS ec_shec_generic DESTINATION lib/erasure-code)
+
+# ec_shec_neon
+#TODO:build libec_shec_neon library on an ARM machine
+if(ARM_NEON OR ARM_NEON2)
+  set(shec_neon_srcs
+    $<TARGET_OBJECTS:shec_objs>
+    $<TARGET_OBJECTS:jerasure_objs>
+    $<TARGET_OBJECTS:neon_objs>
+    )
+  add_library(ec_shec_neon SHARED ${shec_neon_srcs})
+  add_dependencies(ec_shec_neon ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+  target_link_libraries(ec_shec_neon ${EXTRALIBS})
+  set_target_properties(ec_shec_neon PROPERTIES VERSION 2.0.0 SOVERSION 2
+    COMPILE_FLAGS ${ARM_NEON_FLAGS})
+  install(TARGETS ec_shec_neon DESTINATION lib/erasure-code)
+endif(ARM_NEON OR ARM_NEON2)
+
+# ec_shec_sse3
+if(INTEL_SSE)
+  add_library(ec_shec_sse3 SHARED 
+    $<TARGET_OBJECTS:jerasure_objs>
+    $<TARGET_OBJECTS:shec_objs>)
+  add_dependencies(ec_shec_sse3 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+  target_link_libraries(ec_shec_sse3 crush ${EXTRALIBS})
+  set_target_properties(ec_shec_sse3 PROPERTIES VERSION 2.0.0 SOVERSION 2
+    COMPILE_FLAGS ${SSE3_FLAGS})
+  install(TARGETS ec_shec_sse3 DESTINATION lib/erasure-code)
+endif(INTEL_SSE)
+
+# ec_shec_sse4
+if(INTEL_SSE4_1)
+  add_library(ec_shec_sse4 SHARED 
+    $<TARGET_OBJECTS:jerasure_objs>
+    $<TARGET_OBJECTS:shec_objs>)
+  add_dependencies(ec_shec_sse4 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+  target_link_libraries(ec_shec_sse4 crush ${EXTRALIBS})
+  set_target_properties(ec_shec_sse4 PROPERTIES VERSION 2.0.0 SOVERSION 2
+    COMPILE_FLAGS ${SSE4_FLAGS})
+  install(TARGETS ec_shec_sse4 DESTINATION lib/erasure-code)
+endif(INTEL_SSE4_1)
+
+add_library(ec_shec SHARED ErasureCodePluginSelectShec.cc)
+add_dependencies(ec_shec ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_shec ${EXTRALIBS})
+set_target_properties(ec_shec PROPERTIES VERSION 2.0.0 SOVERSION 2)
+install(TARGETS ec_shec DESTINATION lib/erasure-code)
diff --git a/src/erasure-code/shec/Makefile.am b/src/erasure-code/shec/Makefile.am
index 6b658d5..cd93132 100644
--- a/src/erasure-code/shec/Makefile.am
+++ b/src/erasure-code/shec/Makefile.am
@@ -160,3 +160,5 @@ endif
 erasure-code/shec/ErasureCodePluginSelectShec.cc: ./ceph_ver.h
 
 erasure_codelib_LTLIBRARIES += libec_shec.la
+
+EXTRA_DIST += erasure-code/shec/CMakeLists.txt
diff --git a/src/gmock/Makefile.in b/src/gmock/Makefile.in
index e1f406a..4c43153 100644
--- a/src/gmock/Makefile.in
+++ b/src/gmock/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -18,7 +18,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -88,26 +98,14 @@ check_PROGRAMS = test/gmock-spec-builders_test$(EXEEXT) \
 @HAVE_PYTHON_TRUE at am__append_1 = test/gmock_fused_test
 @HAVE_PYTHON_TRUE at am__append_2 = test/gmock_fused_test
 subdir = .
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(top_srcdir)/configure $(am__configure_deps) \
-	$(top_srcdir)/build-aux/config.h.in \
-	$(top_srcdir)/scripts/gmock-config.in \
-	$(top_srcdir)/build-aux/depcomp $(pkginclude_HEADERS) \
-	$(pkginclude_internal_HEADERS) \
-	$(top_srcdir)/build-aux/test-driver README build-aux/compile \
-	build-aux/config.guess build-aux/config.sub build-aux/depcomp \
-	build-aux/install-sh build-aux/missing build-aux/ltmain.sh \
-	$(top_srcdir)/build-aux/compile \
-	$(top_srcdir)/build-aux/config.guess \
-	$(top_srcdir)/build-aux/config.sub \
-	$(top_srcdir)/build-aux/install-sh \
-	$(top_srcdir)/build-aux/ltmain.sh \
-	$(top_srcdir)/build-aux/missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/gtest/m4/acx_pthread.m4 \
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(pkginclude_HEADERS) \
+	$(pkginclude_internal_HEADERS) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
@@ -456,6 +454,19 @@ TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
 	$(TEST_LOG_FLAGS)
 DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+	$(top_srcdir)/build-aux/compile \
+	$(top_srcdir)/build-aux/config.guess \
+	$(top_srcdir)/build-aux/config.h.in \
+	$(top_srcdir)/build-aux/config.sub \
+	$(top_srcdir)/build-aux/depcomp \
+	$(top_srcdir)/build-aux/install-sh \
+	$(top_srcdir)/build-aux/ltmain.sh \
+	$(top_srcdir)/build-aux/missing \
+	$(top_srcdir)/build-aux/test-driver \
+	$(top_srcdir)/scripts/gmock-config.in README build-aux/compile \
+	build-aux/config.guess build-aux/config.sub build-aux/depcomp \
+	build-aux/install-sh build-aux/ltmain.sh build-aux/missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -547,6 +558,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -620,6 +632,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -770,7 +783,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -1155,7 +1167,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1382,15 +1394,15 @@ dist-xz: distdir
 	$(am__post_remove_distdir)
 
 dist-tarZ: distdir
-	@echo WARNING: "Support for shar distribution archives is" \
-	               "deprecated." >&2
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__post_remove_distdir)
 
 dist-shar: distdir
-	@echo WARNING: "Support for distribution archives compressed with" \
-		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
@@ -1425,17 +1437,17 @@ distcheck: dist
 	esac
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_inst
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
 	chmod a-w $(distdir)
 	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
 	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	    --srcdir=.. --prefix="$$dc_install_base" \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -1643,6 +1655,8 @@ uninstall-am: uninstall-pkgincludeHEADERS \
 	uninstall-pkgincludeHEADERS \
 	uninstall-pkginclude_internalHEADERS
 
+.PRECIOUS: Makefile
+
 
 @HAVE_PYTHON_TRUE@  # Tests that fused gmock files compile and work.
 
diff --git a/src/gmock/aclocal.m4 b/src/gmock/aclocal.m4
index bed39b9..1c87fd9 100644
--- a/src/gmock/aclocal.m4
+++ b/src/gmock/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -22,9 +22,7 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -32,36 +30,30 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # modifications, as long as this notice is preserved.
 
 m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ])
 
-# serial 57 LT_INIT
+# serial 58 LT_INIT
 
 
 # LT_PREREQ(VERSION)
@@ -89,7 +81,7 @@ esac
 # LT_INIT([OPTIONS])
 # ------------------
 AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -113,7 +105,7 @@ dnl Parse OPTIONS
 _LT_SET_OPTIONS([$0], [$1])
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -133,26 +125,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
 dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
 
 
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
 # _LT_CC_BASENAME(CC)
 # -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
 m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
 ])
 
 
 # _LT_FILEUTILS_DEFAULTS
 # ----------------------
 # It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
 m4_defun([_LT_FILEUTILS_DEFAULTS],
 [: ${CP="cp -f"}
 : ${MV="mv -f"}
@@ -199,15 +208,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
 m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
 
 _LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 ])
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -220,7 +230,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -231,14 +241,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -291,21 +301,21 @@ no_glob_subst='s/\*/\\\*/g'
 
 # _LT_PROG_LTMAIN
 # ---------------
-# Note that this code is called both from `configure', and `config.status'
+# Note that this code is called both from 'configure', and 'config.status'
 # now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
 # so we pass a copy along to make sure it has a sensible value anyway.
 m4_defun([_LT_PROG_LTMAIN],
 [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
 _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 ])# _LT_PROG_LTMAIN
 
 
 
 # So that we can recreate a full libtool script including additional
 # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
+# in macros and then make a single call at the end using the 'libtool'
 # label.
 
 
@@ -437,8 +447,8 @@ m4_define([_lt_decl_all_varnames],
 
 # _LT_CONFIG_STATUS_DECLARE([VARNAME])
 # ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
 [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
@@ -462,7 +472,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
 # Output comment and list of tags supported by the script
 m4_defun([_LT_LIBTOOL_TAGS],
 [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
+available_tags='_LT_TAGS'dnl
 ])
 
 
@@ -490,7 +500,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
 # _LT_LIBTOOL_CONFIG_VARS
 # -----------------------
 # Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
 # script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
 # section) are produced by _LT_LIBTOOL_TAG_VARS.
 m4_defun([_LT_LIBTOOL_CONFIG_VARS],
@@ -516,8 +526,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
 # Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
 # variables for single and double quote escaping we saved from calls
 # to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
 # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
 m4_defun([_LT_CONFIG_COMMANDS],
 [AC_PROVIDE_IFELSE([LT_OUTPUT],
@@ -563,7 +573,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_quote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -576,7 +586,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_dquote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -592,7 +602,7 @@ _LT_OUTPUT_LIBTOOL_INIT
 # Generate a child script FILE with all initialization necessary to
 # reuse the environment learned by the parent script, and make the
 # file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
+# '#!' sequence but before initialization text begins.  After this
 # macro, additional text can be appended to FILE to form the body of
 # the child script.  The macro ends with non-zero status if the
 # file could not be fully written (such as if the disk is full).
@@ -614,7 +624,7 @@ AS_SHELL_SANITIZE
 _AS_PREPARE
 exec AS_MESSAGE_FD>&1
 _ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
 m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
@@ -637,7 +647,7 @@ exec AS_MESSAGE_LOG_FD>>config.log
 } >&AS_MESSAGE_LOG_FD
 
 lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
 for use in further configure time tests before the real libtool is
 generated.
 
@@ -659,7 +669,7 @@ Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
-while test $[#] != 0
+while test 0 != $[#]
 do
   case $[1] in
     --version | --v* | -V )
@@ -672,10 +682,10 @@ do
       lt_cl_silent=: ;;
 
     -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
 
     *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
   esac
   shift
 done
@@ -701,7 +711,7 @@ chmod +x "$CONFIG_LT"
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec AS_MESSAGE_LOG_FD>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -721,27 +731,31 @@ m4_defun([_LT_CONFIG],
 _LT_CONFIG_SAVE_COMMANDS([
   m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
   m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
 _LT_COPYING
 _LT_LIBTOOL_TAGS
 
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
 # ### BEGIN LIBTOOL CONFIG
 _LT_LIBTOOL_CONFIG_VARS
 _LT_LIBTOOL_TAG_VARS
@@ -749,13 +763,24 @@ _LT_LIBTOOL_TAG_VARS
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -772,8 +797,6 @@ _LT_EOF
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  _LT_PROG_REPLACE_SHELLFNS
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -791,7 +814,6 @@ _LT_EOF
 [m4_if([$1], [], [
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'], [])
 ])dnl /_LT_CONFIG_SAVE_COMMANDS
@@ -988,7 +1010,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 
     AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -1006,7 +1028,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1024,7 +1046,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
       AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
 	[lt_cv_ld_exported_symbols_list=yes],
 	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
     ])
 
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
@@ -1046,7 +1068,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1056,32 +1078,32 @@ _LT_EOF
     ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -1101,29 +1123,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
     m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                   [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
     m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 ],[])
   else
@@ -1143,7 +1165,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
 # Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
+if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
@@ -1161,7 +1183,7 @@ else
     _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
   fi],[])
   if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
   fi
   ])
   aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
@@ -1181,8 +1203,8 @@ m4_define([_LT_SHELL_INIT],
 # -----------------------
 # Find how we can fake an echo command that does not interpret backslash.
 # In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
 [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
@@ -1210,10 +1232,10 @@ fi
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
-    $ECHO "$*" 
+    $ECHO "$*"
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) AC_MSG_RESULT([printf]) ;;
   print*) AC_MSG_RESULT([print -r]) ;;
   *) AC_MSG_RESULT([cat]) ;;
@@ -1239,16 +1261,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
 AC_DEFUN([_LT_WITH_SYSROOT],
 [AC_MSG_CHECKING([for sysroot])
 AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
 [], [with_sysroot=no])
 
 dnl lt_sysroot will always be passed unquoted.  We quote it here
 dnl in case the user passed a directory name.
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -1258,14 +1281,14 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_RESULT([$with_sysroot])
    AC_MSG_ERROR([The sysroot must be an absolute path.])
    ;;
 esac
 
  AC_MSG_RESULT([${lt_sysroot:-no}])
 _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
+[dependent libraries, and where our libraries should be installed.])])
 
 # _LT_ENABLE_LOCK
 # ---------------
@@ -1273,31 +1296,33 @@ m4_defun([_LT_ENABLE_LOCK],
 [AC_ARG_ENABLE([libtool-lock],
   [AS_HELP_STRING([--disable-libtool-lock],
     [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -1326,9 +1351,46 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1347,10 +1409,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 		;;
 	    esac
 	    ;;
-	  powerpc64le-*)
+	  powerpc64le-*linux*)
 	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  powerpc64-*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -1369,10 +1431,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  powerpcle-*)
+	  powerpcle-*linux*)
 	    LD="${LD-ld} -m elf64lppc"
 	    ;;
-	  powerpc-*)
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -1390,19 +1452,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
     [AC_LANG_PUSH(C)
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
      AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1410,7 +1473,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -1419,7 +1482,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -1435,7 +1498,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 ])# _LT_ENABLE_LOCK
 
 
@@ -1454,11 +1517,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      [echo conftest.$ac_objext > conftest.lst
       lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -1466,7 +1529,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      ])
   ])
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -1497,7 +1560,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -1533,7 +1596,7 @@ AC_CACHE_CHECK([$1], [$2],
   [$2=no
    m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -1560,7 +1623,7 @@ AC_CACHE_CHECK([$1], [$2],
    $RM conftest*
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$5], , :, [$5])
 else
     m4_if([$6], , :, [$6])
@@ -1582,7 +1645,7 @@ AC_DEFUN([_LT_LINKER_OPTION],
 m4_require([_LT_DECL_SED])dnl
 AC_CACHE_CHECK([$1], [$2],
   [$2=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $3"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -1601,10 +1664,10 @@ AC_CACHE_CHECK([$1], [$2],
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$4], , :, [$4])
 else
     m4_if([$5], , :, [$5])
@@ -1625,7 +1688,7 @@ AC_DEFUN([LT_CMD_MAX_LEN],
 AC_MSG_CHECKING([the maximum length of command line arguments])
 AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -1665,7 +1728,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1716,22 +1779,22 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-	test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -1747,7 +1810,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   esac
 ])
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
 else
   AC_MSG_RESULT(none)
@@ -1775,7 +1838,7 @@ m4_defun([_LT_HEADER_DLFCN],
 # ----------------------------------------------------------------
 m4_defun([_LT_TRY_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
+if test yes = "$cross_compiling"; then :
   [$4]
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -1822,9 +1885,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -1850,7 +1913,7 @@ int main ()
   return status;
 }]
 _LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -1871,7 +1934,7 @@ rm -fr conftest*
 # ------------------
 AC_DEFUN([LT_SYS_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
+if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -1881,44 +1944,52 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ])
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
+	  [lt_cv_dlopen=shl_load],
       [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
 	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
+	      [lt_cv_dlopen=dlopen],
 	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
 	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
 	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
 	      ])
 	    ])
 	  ])
@@ -1927,21 +1998,21 @@ else
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     AC_CACHE_CHECK([whether a program can dlopen itself],
@@ -1951,7 +2022,7 @@ else
 	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
     ])
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
 	  lt_cv_dlopen_self_static, [dnl
@@ -1961,9 +2032,9 @@ else
       ])
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -2055,8 +2126,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS],
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 _LT_COMPILER_C_O([$1])
 
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   AC_MSG_CHECKING([if we can lock with hard links])
   hard_links=yes
@@ -2066,8 +2137,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" !=
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
     need_locks=warn
   fi
 else
@@ -2094,8 +2165,8 @@ objdir=$lt_cv_objdir
 _LT_DECL([], [objdir], [0],
          [The name of the directory that contains temporary libtool files])dnl
 m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
 ])# _LT_CHECK_OBJDIR
 
 
@@ -2107,15 +2178,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
 _LT_TAGVAR(hardcode_action, $1)=
 if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
    test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
 
   # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
     # Linking always hardcodes the temporary library directory.
     _LT_TAGVAR(hardcode_action, $1)=relink
   else
@@ -2129,12 +2200,12 @@ else
 fi
 AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
 
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -2158,7 +2229,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
@@ -2176,6 +2247,47 @@ _LT_DECL([], [striplib], [1])
 ])# _LT_CMD_STRIPLIB
 
 
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x at S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
 # _LT_SYS_DYNAMIC_LINKER([TAG])
 # -----------------------------
 # PORTME Fill in your ld.so characteristics
@@ -2186,17 +2298,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
 	[], [
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -2212,28 +2325,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -2247,7 +2367,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -2256,7 +2376,7 @@ fi])
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -2273,14 +2393,17 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[[4-9]]*)
@@ -2288,41 +2411,91 @@ aix[[4-9]]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[[01]] | aix4.[[01]].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -2332,18 +2505,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -2351,8 +2524,8 @@ beos*)
 bsdi[[45]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -2364,7 +2537,7 @@ bsdi[[45]]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -2373,8 +2546,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -2390,17 +2563,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
 m4_if([$1], [],[
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -2409,8 +2582,8 @@ m4_if([$1], [],[
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -2437,7 +2610,7 @@ m4_if([$1], [],[
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -2450,8 +2623,8 @@ m4_if([$1], [],[
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -2464,7 +2637,7 @@ m4_if([$1], [],[
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -2477,8 +2650,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -2491,8 +2664,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2510,12 +2683,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -2545,10 +2719,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -2566,14 +2740,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -2581,8 +2756,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -2591,8 +2766,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -2605,8 +2780,8 @@ interix[[3-9]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2617,7 +2792,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -2625,8 +2800,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -2645,8 +2820,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -2655,13 +2830,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2686,7 +2881,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -2718,12 +2918,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -2733,7 +2933,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -2742,58 +2942,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -2804,8 +3014,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -2815,11 +3025,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -2827,8 +3037,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -2849,24 +3059,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -2884,7 +3094,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -2892,8 +3102,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2902,20 +3112,30 @@ uts4*)
   ;;
 esac
 AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
 _LT_DECL([], [variables_saved_for_relink], [1],
     [Variables whose values should be saved in libtool wrapper scripts and
     restored at link time])
@@ -2948,39 +3168,41 @@ _LT_DECL([], [hardcode_into_libs], [0],
     [Whether we should hardcode library paths into libraries])
 _LT_DECL([], [sys_lib_search_path_spec], [2],
     [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
 ])# _LT_SYS_DYNAMIC_LINKER
 
 
 # _LT_PATH_TOOL_PREFIX(TOOL)
 # --------------------------
-# find a file program which can recognize shared library
+# find a file program that can recognize shared library
 AC_DEFUN([_LT_PATH_TOOL_PREFIX],
 [m4_require([_LT_DECL_EGREP])dnl
 AC_MSG_CHECKING([for $1])
 AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
 [case $MAGIC_CMD in
 [[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
 dnl $ac_dummy forces splitting on constant user-supplied paths.
 dnl POSIX.2 word splitting is done only on the output of word expansions,
 dnl not every word.  This closes a longstanding sh security hole.
   ac_dummy="m4_if([$2], , $PATH, [$2])"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -3003,11 +3225,11 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   AC_MSG_RESULT($MAGIC_CMD)
 else
@@ -3025,7 +3247,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
 
 # _LT_PATH_MAGIC
 # --------------
-# find a file program which can recognize a shared library
+# find a file program that can recognize a shared library
 m4_defun([_LT_PATH_MAGIC],
 [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
 if test -z "$lt_cv_path_MAGIC_CMD"; then
@@ -3052,16 +3274,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
 	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
+    [test no = "$withval" || with_gnu_ld=yes],
     [with_gnu_ld=no])dnl
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by $CC])
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -3075,7 +3297,7 @@ if test "$GCC" = yes; then
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -3086,37 +3308,37 @@ if test "$GCC" = yes; then
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   AC_MSG_CHECKING([for GNU ld])
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
 AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi])
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
@@ -3170,13 +3392,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -3187,6 +3409,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
 ])# _LT_CMD_RELOAD
 
 
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
 # _LT_CHECK_MAGIC_METHOD
 # ----------------------
 # how to check for library dependencies
@@ -3202,13 +3461,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[[4-9]]*)
@@ -3235,8 +3494,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -3332,8 +3590,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
@@ -3386,6 +3644,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 ])
 
@@ -3426,33 +3687,38 @@ AC_DEFUN([LT_PATH_NM],
 AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -3463,21 +3729,21 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
     # Let the user override the test.
   else
     AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -3485,8 +3751,8 @@ else
     esac
   fi
   AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -3532,8 +3798,8 @@ lt_cv_sharedlib_from_linklib_cmd,
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -3545,7 +3811,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 ])
@@ -3572,13 +3838,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool
     lt_cv_path_mainfest_tool=yes
   fi
   rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
 ])# _LT_PATH_MANIFEST_TOOL
 
 
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
 # LT_LIB_M
 # --------
 # check for math library
@@ -3590,11 +3871,11 @@ case $host in
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
   AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
   ;;
 *)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
   ;;
 esac
 AC_SUBST([LIBM])
@@ -3613,7 +3894,7 @@ m4_defun([_LT_COMPILER_NO_RTTI],
 
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
@@ -3665,7 +3946,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[[ABCDGISTW]]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[[ABCDEGRST]]'
   fi
   ;;
@@ -3698,14 +3979,44 @@ case `$NM -V 2>&1` in
   symcode='[[ABCDGIRSTW]]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -3723,21 +4034,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx]"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -3777,11 +4091,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT@&t at _DLSYM_CONST
 #else
@@ -3807,7 +4121,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -3827,9 +4141,9 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -3850,7 +4164,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -3877,12 +4191,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
     [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
 _LT_DECL([global_symbol_to_c_name_address],
     [lt_cv_sys_global_symbol_to_c_name_address], [1],
     [Transform the output of nm in a C name address pair])
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
 _LT_DECL([], [nm_file_list_spec], [1],
     [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3898,17 +4216,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)=
 
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -3919,8 +4238,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -3936,6 +4255,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -3985,7 +4309,7 @@ m4_if([$1], [CXX], [
     case $host_os in
       aix[[4-9]]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	else
@@ -4026,14 +4350,14 @@ m4_if([$1], [CXX], [
 	case $cc_basename in
 	  CC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -4070,7 +4394,7 @@ m4_if([$1], [CXX], [
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
 	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
@@ -4215,17 +4539,18 @@ m4_if([$1], [CXX], [
   fi
 ],
 [
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -4236,8 +4561,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -4254,6 +4579,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -4324,7 +4654,7 @@ m4_if([$1], [CXX], [
     case $host_os in
     aix*)
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       else
@@ -4332,11 +4662,30 @@ m4_if([$1], [CXX], [
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -4352,7 +4701,7 @@ m4_if([$1], [CXX], [
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -4363,7 +4712,7 @@ m4_if([$1], [CXX], [
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4388,6 +4737,12 @@ m4_if([$1], [CXX], [
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -4485,7 +4840,7 @@ m4_if([$1], [CXX], [
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
@@ -4514,7 +4869,7 @@ m4_if([$1], [CXX], [
   fi
 ])
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     _LT_TAGVAR(lt_prog_compiler_pic, $1)=
     ;;
@@ -4580,17 +4935,21 @@ m4_if([$1], [CXX], [
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -4639,9 +4998,9 @@ m4_if([$1], [CXX], [
   # included in the symbol list
   _LT_TAGVAR(include_expsyms, $1)=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -4657,7 +5016,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -4665,7 +5024,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -4678,7 +5037,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -4700,24 +5059,24 @@ dnl Note also adjust exclude_expsyms for C++ above.
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       _LT_TAGVAR(whole_archive_flag_spec, $1)=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -4730,7 +5089,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     case $host_os in
     aix[[3-9]]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
@@ -4749,7 +5108,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -4765,7 +5124,7 @@ _LT_EOF
 	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4775,7 +5134,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -4783,61 +5142,89 @@ _LT_EOF
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
 
     haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -4848,42 +5235,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -4897,8 +5289,8 @@ _LT_EOF
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -4916,8 +5308,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4929,7 +5321,7 @@ _LT_EOF
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -4944,9 +5336,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -4963,15 +5355,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
     esac
 
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
       runpath_var=
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
       _LT_TAGVAR(export_dynamic_flag_spec, $1)=
@@ -4987,7 +5379,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	_LT_TAGVAR(hardcode_direct, $1)=unsupported
@@ -4995,34 +5387,57 @@ _LT_EOF
       ;;
 
     aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -5041,13 +5456,21 @@ _LT_EOF
       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[[012]]|aix4.[[012]].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -5066,62 +5489,80 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
-	_LT_TAGVAR(link_all_deplibs, $1)=no
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
 	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	  fi
 	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 3 [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -5130,7 +5571,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -5160,16 +5601,17 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -5178,18 +5620,18 @@ _LT_EOF
 	# Don't use ranlib
 	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -5198,7 +5640,7 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -5248,33 +5690,33 @@ _LT_EOF
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_direct, $1)=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5282,25 +5724,25 @@ _LT_EOF
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 	m4_if($1, [], [
@@ -5308,14 +5750,14 @@ _LT_EOF
 	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
 	  _LT_LINKER_OPTION([if $CC understands -b],
 	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
 	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	case $host_cpu in
@@ -5326,7 +5768,7 @@ _LT_EOF
 	*)
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -5337,16 +5779,16 @@ _LT_EOF
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
 	# This should be the same for all languages, so no per-tag cache variable.
 	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
 	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   AC_LINK_IFELSE(
 	     [AC_LANG_SOURCE(
 	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
@@ -5359,21 +5801,32 @@ _LT_EOF
       end]])])],
 	      [lt_cv_irix_exported_symbol=yes],
 	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(inherit_rpath, $1)=yes
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -5388,7 +5841,7 @@ _LT_EOF
     newsos6)
       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
@@ -5396,27 +5849,19 @@ _LT_EOF
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	fi
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5427,33 +5872,53 @@ _LT_EOF
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -5464,24 +5929,24 @@ _LT_EOF
 
     solaris*)
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -5491,11 +5956,11 @@ _LT_EOF
       solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	fi
@@ -5505,10 +5970,10 @@ _LT_EOF
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -5557,43 +6022,43 @@ _LT_EOF
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -5608,17 +6073,17 @@ _LT_EOF
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
 	;;
       esac
     fi
   fi
 ])
 AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
 _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
 
@@ -5635,7 +6100,7 @@ x|xyes)
   # Assume -lc should be added
   _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $_LT_TAGVAR(archive_cmds, $1) in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -5715,12 +6180,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary])
 _LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
     library is relocated])
 _LT_TAGDECL([], [hardcode_minus_L], [0],
     [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -5761,10 +6226,10 @@ dnl    [Compiler flag to generate thread safe objects])
 # ------------------------
 # Ensure that the configuration variables for a C compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_C_CONFIG],
 [m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
+lt_save_CC=$CC
 AC_LANG_PUSH(C)
 
 # Source file extension for C test sources.
@@ -5800,18 +6265,18 @@ if test -n "$compiler"; then
   LT_SYS_DLOPEN_SELF
   _LT_CMD_STRIPLIB
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   AC_MSG_CHECKING([if libtool supports shared libraries])
   AC_MSG_RESULT([$can_build_shared])
 
   AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -5819,8 +6284,12 @@ if test -n "$compiler"; then
     ;;
 
   aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -5828,13 +6297,13 @@ if test -n "$compiler"; then
 
   AC_MSG_CHECKING([whether to build static libraries])
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   AC_MSG_RESULT([$enable_static])
 
   _LT_CONFIG($1)
 fi
 AC_LANG_POP
-CC="$lt_save_CC"
+CC=$lt_save_CC
 ])# _LT_LANG_C_CONFIG
 
 
@@ -5842,14 +6311,14 @@ CC="$lt_save_CC"
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_CXX_CONFIG],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   AC_PROG_CXXCPP
 else
   _lt_caught_CXX_error=yes
@@ -5891,7 +6360,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -5933,35 +6402,35 @@ if test "$_lt_caught_CXX_error" != yes; then
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
     else
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
       LT_PATH_LD
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           _LT_TAGVAR(whole_archive_flag_spec, $1)=
         fi
@@ -5997,18 +6466,30 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=no
         ;;
       aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -6018,6 +6499,13 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -6036,13 +6524,21 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
         _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[[012]]|aix4.[[012]].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -6060,64 +6556,84 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
           _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
 	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	    fi
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -6127,7 +6643,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  _LT_TAGVAR(ld_shlibs, $1)=no
 	fi
@@ -6155,57 +6671,58 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 	  # Don't use ranlib
 	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  _LT_TAGVAR(always_export_symbols, $1)=no
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -6216,6 +6733,34 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_DARWIN_LINKER_FEATURES($1)
 	;;
 
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -6251,14 +6796,14 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         ;;
 
       hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
         _LT_TAGVAR(hardcode_direct, $1)=yes
         _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
 				             # but as the default
@@ -6270,7 +6815,7 @@ if test "$_lt_caught_CXX_error" != yes; then
             _LT_TAGVAR(ld_shlibs, $1)=no
             ;;
           aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -6279,11 +6824,11 @@ if test "$_lt_caught_CXX_error" != yes; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
@@ -6293,15 +6838,15 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
               ;;
           esac
         fi
@@ -6327,13 +6872,13 @@ if test "$_lt_caught_CXX_error" != yes; then
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -6344,20 +6889,20 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -6372,22 +6917,22 @@ if test "$_lt_caught_CXX_error" != yes; then
       interix[[3-9]]*)
 	_LT_TAGVAR(hardcode_direct, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -6396,17 +6941,17 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    _LT_TAGVAR(link_all_deplibs, $1)=yes
 	    ;;
         esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
@@ -6419,8 +6964,8 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -6429,10 +6974,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -6446,59 +6991,59 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
 	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -6512,18 +7057,18 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -6531,10 +7076,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      _LT_TAGVAR(compiler_needs_object, $1)=yes
 
 	      # Not sure whether something based on
@@ -6592,22 +7137,17 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -6623,9 +7163,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	    # Archives containing C++ object files must be created using
@@ -6643,17 +7183,17 @@ if test "$_lt_caught_CXX_error" != yes; then
           cxx*)
 	    case $host in
 	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
 		;;
 	    esac
@@ -6668,21 +7208,21 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -6728,9 +7268,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
 	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
 	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -6738,7 +7278,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -6755,30 +7295,30 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -6786,11 +7326,11 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -6799,52 +7339,52 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
 	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
 	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
 	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
+              '"$_LT_TAGVAR(reload_cmds, $1)"
 	    ;;
 	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -6875,10 +7415,10 @@ if test "$_lt_caught_CXX_error" != yes; then
     esac
 
     AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -6905,7 +7445,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
@@ -6927,13 +7467,14 @@ AC_REQUIRE([_LT_DECL_SED])
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
   esac
 } # func_stripname_cnf
 ])# _LT_FUNC_STRIPNAME_CNF
 
+
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
@@ -7017,13 +7558,13 @@ if AC_TRY_EVAL(ac_compile); then
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -7039,16 +7580,16 @@ if AC_TRY_EVAL(ac_compile); then
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
 	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -7056,9 +7597,9 @@ if AC_TRY_EVAL(ac_compile); then
 	 esac
        else
 	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
 	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
 	 fi
        fi
        prev=
@@ -7073,15 +7614,15 @@ if AC_TRY_EVAL(ac_compile); then
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
+	   _LT_TAGVAR(predep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
 	 fi
        else
 	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	   _LT_TAGVAR(postdep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
 	 fi
@@ -7112,51 +7653,6 @@ interix[[3-9]]*)
   _LT_TAGVAR(postdep_objects,$1)=
   _LT_TAGVAR(postdeps,$1)=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 ])
 
@@ -7165,7 +7661,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in
 esac
  _LT_TAGVAR(compiler_lib_search_dirs, $1)=
 if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 _LT_TAGDECL([], [compiler_lib_search_dirs], [1],
     [The directories searched by this compiler when creating a shared library])
@@ -7185,10 +7681,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_F77_CONFIG],
 [AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
+if test -z "$F77" || test no = "$F77"; then
   _lt_disable_F77=yes
 fi
 
@@ -7225,7 +7721,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the F77 compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
+if test yes != "$_lt_disable_F77"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7247,7 +7743,7 @@ if test "$_lt_disable_F77" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
@@ -7261,21 +7757,25 @@ if test "$_lt_disable_F77" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7283,11 +7783,11 @@ if test "$_lt_disable_F77" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7304,9 +7804,9 @@ if test "$_lt_disable_F77" != yes; then
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
@@ -7316,11 +7816,11 @@ AC_LANG_POP
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_FC_CONFIG],
 [AC_LANG_PUSH(Fortran)
 
-if test -z "$FC" || test "X$FC" = "Xno"; then
+if test -z "$FC" || test no = "$FC"; then
   _lt_disable_FC=yes
 fi
 
@@ -7357,7 +7857,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the FC compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
+if test yes != "$_lt_disable_FC"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7379,7 +7879,7 @@ if test "$_lt_disable_FC" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
@@ -7395,21 +7895,25 @@ if test "$_lt_disable_FC" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7417,11 +7921,11 @@ if test "$_lt_disable_FC" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7441,7 +7945,7 @@ if test "$_lt_disable_FC" != yes; then
   GCC=$lt_save_GCC
   CC=$lt_save_CC
   CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
+fi # test yes != "$_lt_disable_FC"
 
 AC_LANG_POP
 ])# _LT_LANG_FC_CONFIG
@@ -7451,7 +7955,7 @@ AC_LANG_POP
 # --------------------------
 # Ensure that the configuration variables for the GNU Java Compiler compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GCJ_CONFIG],
 [AC_REQUIRE([LT_PROG_GCJ])dnl
 AC_LANG_SAVE
@@ -7485,7 +7989,7 @@ CC=${GCJ-"gcj"}
 CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # GCJ did not exist at the time GCC didn't implicitly link libc in.
@@ -7518,7 +8022,7 @@ CFLAGS=$lt_save_CFLAGS
 # --------------------------
 # Ensure that the configuration variables for the GNU Go compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GO_CONFIG],
 [AC_REQUIRE([LT_PROG_GO])dnl
 AC_LANG_SAVE
@@ -7552,7 +8056,7 @@ CC=${GOC-"gccgo"}
 CFLAGS=$GOFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # Go did not exist at the time GCC didn't implicitly link libc in.
@@ -7585,7 +8089,7 @@ CFLAGS=$lt_save_CFLAGS
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_RC_CONFIG],
 [AC_REQUIRE([LT_PROG_RC])dnl
 AC_LANG_SAVE
@@ -7601,7 +8105,7 @@ _LT_TAGVAR(objext, $1)=$objext
 lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
 
 # Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+lt_simple_link_test_code=$lt_simple_compile_test_code
 
 # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 _LT_TAG_COMPILER
@@ -7611,7 +8115,7 @@ _LT_COMPILER_BOILERPLATE
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
 lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
@@ -7640,7 +8144,7 @@ AC_DEFUN([LT_PROG_GCJ],
 [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
   [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
     [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
       AC_SUBST(GCJFLAGS)])])[]dnl
 ])
 
@@ -7749,7 +8253,7 @@ lt_ac_count=0
 # Add /usr/xpg4/bin/sed as it is typically found on Solaris
 # along with /bin/sed that truncates output.
 for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
+  test ! -f "$lt_ac_sed" && continue
   cat /dev/null > conftest.in
   lt_ac_count=0
   echo $ECHO_N "0123456789$ECHO_C" >conftest.in
@@ -7766,9 +8270,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
     $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
     cmp -s conftest.out conftest.nl || break
     # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
+    test 10 -lt "$lt_ac_count" && break
     lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
       lt_ac_max=$lt_ac_count
       lt_cv_path_SED=$lt_ac_sed
     fi
@@ -7792,27 +8296,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], [])
 # Find out whether the shell is Bourne or XSI compatible,
 # or has some other useful features.
 m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
   lt_unset=false
@@ -7836,102 +8320,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
 ])# _LT_CHECK_SHELL_FEATURES
 
 
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
 # _LT_PATH_CONVERSION_FUNCTIONS
 # -----------------------------
-# Determine which file name conversion functions should be used by
+# Determine what file name conversion functions should be used by
 # func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
 # for certain cross-compile configurations and native mingw.
 m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
@@ -7998,15 +8389,15 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
 
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 7 ltoptions.m4
+# serial 8 ltoptions.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -8027,7 +8418,7 @@ m4_define([_LT_SET_OPTION],
 [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
 m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
         _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
 ])
 
 
@@ -8073,13 +8464,15 @@ m4_if([$1],[LT_INIT],[
   dnl
   dnl If no reference was made to various pairs of opposing options, then
   dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
   dnl archives by default:
   _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
   _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
   ])
 ])# _LT_SET_OPTIONS
 
@@ -8107,7 +8500,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
 [_LT_SET_OPTION([LT_INIT], [dlopen])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
+put the 'dlopen' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -8143,7 +8536,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
 _LT_SET_OPTION([LT_INIT], [win32-dll])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
+put the 'win32-dll' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -8152,9 +8545,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
 
 # _LT_ENABLE_SHARED([DEFAULT])
 # ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_SHARED],
 [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([shared],
@@ -8167,14 +8560,14 @@ AC_ARG_ENABLE([shared],
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
@@ -8206,9 +8599,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
 
 # _LT_ENABLE_STATIC([DEFAULT])
 # ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_STATIC],
 [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([static],
@@ -8221,14 +8614,14 @@ AC_ARG_ENABLE([static],
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
@@ -8260,9 +8653,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
 
 # _LT_ENABLE_FAST_INSTALL([DEFAULT])
 # ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_FAST_INSTALL],
 [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([fast-install],
@@ -8275,14 +8668,14 @@ AC_ARG_ENABLE([fast-install],
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
@@ -8299,14 +8692,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
+the 'fast-install' option into LT_INIT's first parameter.])
 ])
 
 AU_DEFUN([AC_DISABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
+the 'disable-fast-install' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -8314,11 +8707,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
 dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 
 
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
 # _LT_WITH_PIC([MODE])
 # --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
 # LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
     [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
@@ -8329,19 +8775,17 @@ m4_define([_LT_WITH_PIC],
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+    [pic_mode=m4_default([$1], [default])])
 
 _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
 ])# _LT_WITH_PIC
@@ -8354,7 +8798,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
 [_LT_SET_OPTION([LT_INIT], [pic-only])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
+put the 'pic-only' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -8377,7 +8821,8 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience],
 
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -8410,7 +8855,7 @@ m4_define([_lt_join],
 # ------------
 # Manipulate m4 lists.
 # These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
+# Autoconf-2.59, which quotes differently.
 m4_define([lt_car], [[$1]])
 m4_define([lt_cdr],
 [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
@@ -8421,7 +8866,7 @@ m4_define([lt_unquote], $1)
 
 # lt_append(MACRO-NAME, STRING, [SEPARATOR])
 # ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
 # Note that neither SEPARATOR nor STRING are expanded; they are appended
 # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
 # No SEPARATOR is output if MACRO-NAME was previously undefined (different
@@ -8501,7 +8946,7 @@ m4_define([lt_dict_filter],
 
 # ltversion.m4 -- version numbers			-*- Autoconf -*-
 #
-#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -8510,22 +8955,23 @@ m4_define([lt_dict_filter],
 
 # @configure_input@
 
-# serial 3337 ltversion.m4
+# serial 4179 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
 
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
@@ -8536,7 +8982,7 @@ _LT_DECL(, macro_revision, 0)
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
 # which have later been changed to m4_define as they aren't part of the
 # exported API, or moved to Autoconf or Automake where they belong.
 #
@@ -8550,7 +8996,7 @@ _LT_DECL(, macro_revision, 0)
 # included after everything else.  This provides aclocal with the
 # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
 # because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
 #
 # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
 # Yes, that means every name once taken will need to remain here until
@@ -8622,7 +9068,7 @@ m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
 m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
 m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
 
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8634,10 +9080,10 @@ m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.14'
+[am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.14.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -8653,14 +9099,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.14.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8705,15 +9151,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8744,7 +9189,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -8935,7 +9380,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9011,7 +9456,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9101,8 +9546,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -9175,7 +9620,11 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
@@ -9204,7 +9653,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9215,7 +9664,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -9225,7 +9674,7 @@ if test x"${install_sh}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9246,7 +9695,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9296,7 +9745,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9335,7 +9784,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9364,7 +9813,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9411,7 +9860,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9646,7 +10095,7 @@ for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
 sys.exit(sys.hexversion < minverhex)"
   AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9665,7 +10114,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9746,7 +10195,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9806,7 +10255,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9834,7 +10283,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -9853,7 +10302,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/src/gmock/build-aux/compile b/src/gmock/build-aux/compile
index 531136b..a85b723 100755
--- a/src/gmock/build-aux/compile
+++ b/src/gmock/build-aux/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey at cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/src/gmock/build-aux/config.guess b/src/gmock/build-aux/config.guess
index b79252d..1659250 100755
--- a/src/gmock/build-aux/config.guess
+++ b/src/gmock/build-aux/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-06-10'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@ timestamp='2013-06-10'
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 #
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
 	LIBC=gnu
 	#endif
 	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
 	;;
 esac
 
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -235,6 +249,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -579,8 +596,9 @@ EOF
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -826,7 +844,7 @@ EOF
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
     i*:windows32*:*)
@@ -932,6 +950,9 @@ EOF
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -969,10 +990,10 @@ EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or1k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
 	exit ;;
-    or32:Linux:*:*)
+    or32:Linux:*:* | or1k*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
@@ -1020,7 +1041,7 @@ EOF
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1260,16 +1281,26 @@ EOF
 	if test "$UNAME_PROCESSOR" = unknown ; then
 	    UNAME_PROCESSOR=powerpc
 	fi
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		case $UNAME_PROCESSOR in
-		    i386) UNAME_PROCESSOR=x86_64 ;;
-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		esac
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
 	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
 	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
@@ -1361,154 +1392,6 @@ EOF
 	exit ;;
 esac
 
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
 cat >&2 <<EOF
 $0: unable to guess system type
 
diff --git a/src/gmock/build-aux/config.h.in b/src/gmock/build-aux/config.h.in
index 843b5b1..6ea2e69 100644
--- a/src/gmock/build-aux/config.h.in
+++ b/src/gmock/build-aux/config.h.in
@@ -33,8 +33,7 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
 
 /* Name of package */
diff --git a/src/gmock/build-aux/config.sub b/src/gmock/build-aux/config.sub
index 9633db7..1acc966 100755
--- a/src/gmock/build-aux/config.sub
+++ b/src/gmock/build-aux/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-08-10'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ timestamp='2013-08-10'
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -68,7 +68,7 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,7 +117,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
@@ -255,16 +255,18 @@ case $basic_machine in
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
 	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
 	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
@@ -282,8 +284,10 @@ case $basic_machine in
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipsr5900 | mipsr5900el \
@@ -295,14 +299,14 @@ case $basic_machine in
 	| nds32 | nds32le | nds32be \
 	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -310,6 +314,7 @@ case $basic_machine in
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -324,7 +329,10 @@ case $basic_machine in
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -369,18 +377,20 @@ case $basic_machine in
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
 	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
@@ -400,8 +410,10 @@ case $basic_machine in
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipsr5900-* | mipsr5900el-* \
@@ -413,16 +425,18 @@ case $basic_machine in
 	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -430,6 +444,7 @@ case $basic_machine in
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -506,6 +521,9 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-aros
 		;;
+        asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -767,6 +785,9 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -822,6 +843,10 @@ case $basic_machine in
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -1354,7 +1379,7 @@ case $os in
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
@@ -1367,14 +1392,14 @@ case $os in
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1592,9 +1617,6 @@ case $basic_machine in
 	mips*-*)
 		os=-elf
 		;;
-	or1k-*)
-		os=-elf
-		;;
 	or32-*)
 		os=-coff
 		;;
diff --git a/src/gmock/build-aux/depcomp b/src/gmock/build-aux/depcomp
index 4ebd5b3..fc98710 100755
--- a/src/gmock/build-aux/depcomp
+++ b/src/gmock/build-aux/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/src/gmock/build-aux/install-sh b/src/gmock/build-aux/install-sh
index 377bb86..59990a1 100755
--- a/src/gmock/build-aux/install-sh
+++ b/src/gmock/build-aux/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2011-11-20.07; # UTC
+scriptversion=2014-09-12.12; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='	'
 nl='
 '
-IFS=" ""	$nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,46 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-	shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-	shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-	# Protect names problematic for 'test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)	shift
-	break;;
+    --) shift
+        break;;
 
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -208,6 +204,15 @@ if test $# -eq 0; then
 fi
 
 if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
   do_exit='(exit $ret); exit $ret'
   trap "ret=129; $do_exit" 1
   trap "ret=130; $do_exit" 2
@@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -269,41 +274,15 @@ do
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -314,74 +293,81 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -391,53 +377,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -472,15 +456,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -493,24 +474,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
diff --git a/src/gmock/build-aux/ltmain.sh b/src/gmock/build-aux/ltmain.sh
index a356aca..147d758 100644
--- a/src/gmock/build-aux/ltmain.sh
+++ b/src/gmock/build-aux/ltmain.sh
@@ -1,9 +1,12 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
 
-# libtool (GNU libtool) 2.4.2
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
@@ -23,881 +26,2112 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1"
-TIMESTAMP=""
-package_revision=1.3337
+VERSION="2.4.6 Debian-2.4.6-0.1"
+package_revision=2.4.6
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
 fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
 
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
 do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
 	fi"
 done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
 
-$lt_unset CDPATH
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
 
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
 
 
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
 
 : ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
 
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
 
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
 
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
 
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
 
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
 
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
 
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
 
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
 
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
 
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
 
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
 
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
 
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
 
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
 
-# Make sure we have an absolute path for reexecution:
+# Make sure we have an absolute progpath for reexecution:
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
-     progdir=$func_dirname_result
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
      progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
   *)
-     save_IFS="$IFS"
+     _G_IFS=$IFS
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
-       IFS="$save_IFS"
+       IFS=$_G_IFS
        test -x "$progdir/$progname" && break
      done
-     IFS="$save_IFS"
+     IFS=$_G_IFS
      test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
 
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
 
-# Standard options:
 opt_dry_run=false
-opt_help=false
 opt_quiet=false
 opt_verbose=false
-opt_warning=:
 
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
 
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
 
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
 
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
 
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
 
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
 
-    # bash bug again:
-    :
-}
 
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
 {
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset=''
+        tc_bold='';   tc_standout=''
+        tc_red='';   tc_green=''
+        tc_blue='';  tc_cyan=''
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
 
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
+    require_term_colors=:
 }
-help="Try \`$progname --help' for more information."  ## default
 
 
-# func_grep expression filename
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
+    $debug_cmd
+
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
-# func_mkdir_p directory-path
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
-    my_directory_path="$1"
-    my_dir_list=
+    $debug_cmd
 
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+    _G_directory_path=$1
+    _G_dir_list=
 
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
       esac
 
       # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
+      while test ! -d "$_G_directory_path"; do
         # ...make a list in topmost first order.  Use a colon delimited
 	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
+        _G_dir_list=$_G_directory_path:$_G_dir_list
 
         # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
+        case $_G_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
       done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
 
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
+        $MKDIR "$_G_dir" 2>/dev/null || :
       done
-      IFS="$save_mkdir_p_IFS"
+      IFS=$func_mkdir_p_IFS
 
       # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
     fi
 }
 
 
-# func_mktempdir [string]
+# func_mktempdir [BASENAME]
+# -------------------------
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
+# given, BASENAME is the basename for that directory.
 func_mktempdir ()
 {
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
 
-    if test "$opt_dry_run" = ":"; then
+    if test : = "$opt_dry_run"; then
       # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
+      _G_tmpdir=$_G_template-$$
     else
 
       # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
 
-      if test ! -d "$my_tmpdir"; then
+      if test ! -d "$_G_tmpdir"; then
         # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
 
-        save_mktempdir_umask=`umask`
+        func_mktempdir_umask=`umask`
         umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
     fi
 
-    $ECHO "$my_tmpdir"
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
+
+    case $1 in
+      *[\\\`\"]*)
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    esac
+
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        _G_arg=\"$_G_arg\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+    $debug_cmd
+
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
 }
 
 
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
 {
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
+    $debug_cmd
 
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
+
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
 }
 
 
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
 {
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
+    $debug_cmd
 
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
+    func_parse_options_result=
 
-    func_quote_for_expand_result="$my_arg"
-}
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
 
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
 
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
 }
 
 
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
 {
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+    $debug_cmd
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
+    func_run_hooks func_validate_options ${1+"$@"}
 
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
 }
 
 
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $opt_debug
 
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# / /
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
 
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
 {
-    $opt_debug
+    $debug_cmd
 
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
 }
 
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
 func_help ()
 {
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-	:print
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-	p
-	d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
 }
 
-# func_missing_arg argname
+
+# func_missing_arg ARGNAME
+# ------------------------
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
-    $opt_debug
+    $debug_cmd
 
-    func_error "missing argument for $1."
+    func_error "Missing argument for '$1'."
     exit_cmd=exit
 }
 
 
-# func_split_short_opt shortopt
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
 {
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+    $debug_cmd
 
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
 
 
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
 {
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
+    $debug_cmd
 
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
 
-exit_cmd=:
 
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
 
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
 
+    exit $?
+}
 
 
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
 
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
 
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
 {
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
+    $debug_cmd
 
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
+    _G_message=$*
 
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
 
-# func_arith arithmetic-term...
-func_arith ()
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
 {
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
+    $debug_cmd
 
+    $warning_func ${1+"$@"}
+}
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
 
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
 
-# func_lo2o object
-func_lo2o ()
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
 {
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname (GNU libtool) 2.4.6
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool at gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
 
 
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
 
 
-# func_fatal_configuration arg...
+# func_fatal_configuration ARG...
+# -------------------------------
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
 }
 
 
 # func_config
+# -----------
 # Display the configuration for all the tags in this script.
 func_config ()
 {
@@ -915,17 +2149,19 @@ func_config ()
     exit $?
 }
 
+
 # func_features
+# -------------
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       echo "enable static libraries"
     else
       echo "disable static libraries"
@@ -934,314 +2170,350 @@ func_features ()
     exit $?
 }
 
-# func_enable_tag tagname
+
+# func_enable_tag TAGNAME
+# -----------------------
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
-  # Global variable:
-  tagname="$1"
+    # Global variable:
+    tagname=$1
 
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
 
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
 
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
     *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
 }
 
+
 # func_check_version_match
+# ------------------------
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      else
-        cat >&2 <<_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
-    fi
+      fi
 
-    exit $EXIT_MISMATCH
-  fi
+      exit $EXIT_MISMATCH
+    fi
 }
 
 
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
 
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
 
+    nonopt=
+    preserve_args=
 
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
 
 
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
 {
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)	opt_debug='set -x'
-			func_echo "enabling shell trace mode"
-			$opt_debug
-			;;
-      --dry-run|--dryrun|-n)
-			opt_dry_run=:
-			;;
-      --config)
-			opt_config=:
-func_config
-			;;
-      --dlopen|-dlopen)
-			optarg="$1"
-			opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-			shift
-			;;
-      --preserve-dup-deps)
-			opt_preserve_dup_deps=:
-			;;
-      --features)
-			opt_features=:
-func_features
-			;;
-      --finish)
-			opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-			;;
-      --help)
-			opt_help=:
-			;;
-      --help-all)
-			opt_help_all=:
-opt_help=': help-all'
-			;;
-      --mode)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-			shift
-			;;
-      --no-silent|--no-quiet)
-			opt_silent=false
-func_append preserve_args " $opt"
-			;;
-      --no-warning|--no-warn)
-			opt_warning=false
-func_append preserve_args " $opt"
-			;;
-      --no-verbose)
-			opt_verbose=false
-func_append preserve_args " $opt"
-			;;
-      --silent|--quiet)
-			opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-			;;
-      --verbose|-v)
-			opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-			;;
-      --tag)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-			shift
-			;;
-
-      -\?|-h)		func_usage				;;
-      --help)		func_help				;;
-      --version)	func_version				;;
-
-      # Separate optargs to long options:
-      --*=*)
-			func_split_long_opt "$opt"
-			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-			func_split_short_opt "$opt"
-			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      --)		break					;;
-      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
-      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
-    esac
-  done
+    $debug_cmd
 
-  # Validate options:
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
 
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
 
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
 
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
 
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
 
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
     fi
 
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
 
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
 
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
 
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
 
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
 }
+func_add_hook func_validate_options libtool_validate_options
 
 
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
 
 
 ## ----------- ##
 ##    Main.    ##
 ## ----------- ##
 
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
 # func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
+# fatal anyway.  Works if 'file' does not exist.
 func_lalib_unsafe_p ()
 {
     lalib_p=no
@@ -1249,13 +2521,13 @@ func_lalib_unsafe_p ()
 	for lalib_p_l in 1 2 3 4
 	do
 	    read lalib_p_line
-	    case "$lalib_p_line" in
+	    case $lalib_p_line in
 		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
 	    esac
 	done
 	exec 0<&5 5<&-
     fi
-    test "$lalib_p" = yes
+    test yes = "$lalib_p"
 }
 
 # func_ltwrapper_script_p file
@@ -1264,7 +2536,8 @@ func_lalib_unsafe_p ()
 # determined imposters.
 func_ltwrapper_script_p ()
 {
-    func_lalib_p "$1"
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_ltwrapper_executable_p file
@@ -1289,7 +2562,7 @@ func_ltwrapper_scriptname ()
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
 }
 
 # func_ltwrapper_p file
@@ -1308,11 +2581,13 @@ func_ltwrapper_p ()
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
-    $opt_debug
+    $debug_cmd
+
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
-      IFS=$save_ifs
+      IFS=$sp$nl
       eval cmd=\"$cmd\"
+      IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
@@ -1324,10 +2599,11 @@ func_execute_cmds ()
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
+# 'FILE.' does not work on cygwin managed mounts.
 func_source ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $1 in
     */* | *\\*)	. "$1" ;;
     *)		. "./$1" ;;
@@ -1354,10 +2630,10 @@ func_resolve_sysroot ()
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
-  case "$lt_sysroot:$1" in
+  case $lt_sysroot:$1 in
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
+    func_replace_sysroot_result='='$func_stripname_result
     ;;
   *)
     # Including no sysroot.
@@ -1374,7 +2650,8 @@ func_replace_sysroot ()
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
-    $opt_debug
+    $debug_cmd
+
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
@@ -1393,7 +2670,7 @@ func_infer_tag ()
 	for z in $available_tags; do
 	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
 	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
 	    CC_quoted=
 	    for arg in $CC; do
 	      # Double-quote args containing other shell metacharacters.
@@ -1418,7 +2695,7 @@ func_infer_tag ()
 	# line option must be used.
 	if test -z "$tagname"; then
 	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
+	  func_fatal_error "specify a tag with '--tag'"
 #	else
 #	  func_verbose "using $tagname tagged configuration"
 	fi
@@ -1434,15 +2711,15 @@ func_infer_tag ()
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
     else
       write_lobj=none
     fi
 
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
     else
       write_oldobj=none
     fi
@@ -1450,7 +2727,7 @@ func_write_libtool_object ()
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -1462,7 +2739,7 @@ pic_object=$write_lobj
 non_pic_object=$write_oldobj
 
 EOF
-      $MV "${write_libobj}T" "${write_libobj}"
+      $MV "${write_libobj}T" "$write_libobj"
     }
 }
 
@@ -1482,8 +2759,9 @@ EOF
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
@@ -1491,9 +2769,9 @@ func_convert_core_file_wine_to_w32 ()
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
+        $SED -e "$sed_naive_backslashify"`
     else
       func_convert_core_file_wine_to_w32_result=
     fi
@@ -1514,18 +2792,19 @@ func_convert_core_file_wine_to_w32 ()
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
+  func_convert_core_path_wine_to_w32_result=
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
@@ -1554,7 +2833,8 @@ func_convert_core_path_wine_to_w32 ()
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
@@ -1563,7 +2843,7 @@ func_cygpath ()
     fi
   else
     func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
   fi
 }
 #end: func_cygpath
@@ -1574,10 +2854,11 @@ func_cygpath ()
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
 }
 #end: func_convert_core_msys_to_w32
 
@@ -1588,13 +2869,14 @@ func_convert_core_msys_to_w32 ()
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
     func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
+    func_error "  '$1'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
-    func_to_host_file_result="$1"
+    func_to_host_file_result=$1
   fi
 }
 # end func_convert_file_check
@@ -1606,10 +2888,11 @@ func_convert_file_check ()
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
+    func_error "  '$3'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
@@ -1618,7 +2901,7 @@ func_convert_path_check ()
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
-      func_to_host_path_result="$3"
+      func_to_host_path_result=$3
     fi
   fi
 }
@@ -1630,9 +2913,10 @@ func_convert_path_check ()
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
-  $opt_debug
+  $debug_cmd
+
   case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
     ;;
   esac
   case $4 in
@@ -1646,7 +2930,7 @@ func_convert_path_front_back_pathsep ()
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
-# invoked via `$to_host_file_cmd ARG'
+# invoked via '$to_host_file_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
@@ -1657,7 +2941,8 @@ func_convert_path_front_back_pathsep ()
 # in func_to_host_file_result.
 func_to_host_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
@@ -1669,7 +2954,8 @@ func_to_host_file ()
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
@@ -1687,7 +2973,7 @@ func_to_tool_file ()
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
-  func_to_host_file_result="$1"
+  func_to_host_file_result=$1
 }
 # end func_convert_file_noop
 
@@ -1698,11 +2984,12 @@ func_convert_file_noop ()
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1714,8 +3001,9 @@ func_convert_file_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
@@ -1731,11 +3019,12 @@ func_convert_file_cygwin_to_w32 ()
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1747,12 +3036,13 @@ func_convert_file_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1765,13 +3055,14 @@ func_convert_file_msys_to_cygwin ()
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1781,7 +3072,7 @@ func_convert_file_nix_to_cygwin ()
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
-# invoked via `$to_host_path_cmd ARG'
+# invoked via '$to_host_path_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
@@ -1805,10 +3096,11 @@ func_convert_file_nix_to_cygwin ()
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
   fi
 }
 
@@ -1818,7 +3110,8 @@ func_init_to_host_path_cmd ()
 # in func_to_host_path_result.
 func_to_host_path ()
 {
-  $opt_debug
+  $debug_cmd
+
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
@@ -1829,7 +3122,7 @@ func_to_host_path ()
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
-  func_to_host_path_result="$1"
+  func_to_host_path_result=$1
 }
 # end func_convert_path_noop
 
@@ -1840,8 +3133,9 @@ func_convert_path_noop ()
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
@@ -1849,7 +3143,7 @@ func_convert_path_msys_to_w32 ()
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1863,8 +3157,9 @@ func_convert_path_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
@@ -1883,14 +3178,15 @@ func_convert_path_cygwin_to_w32 ()
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1904,15 +3200,16 @@ func_convert_path_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1927,8 +3224,9 @@ func_convert_path_msys_to_cygwin ()
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
@@ -1937,7 +3235,7 @@ func_convert_path_nix_to_cygwin ()
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1946,13 +3244,31 @@ func_convert_path_nix_to_cygwin ()
 # end func_convert_path_nix_to_cygwin
 
 
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
 # func_mode_compile arg...
 func_mode_compile ()
 {
-    $opt_debug
+    $debug_cmd
+
     # Get the compilation command and the source file.
     base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
@@ -1965,12 +3281,12 @@ func_mode_compile ()
       case $arg_mode in
       arg  )
 	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
+	lastarg=$arg
 	arg_mode=normal
 	;;
 
       target )
-	libobj="$arg"
+	libobj=$arg
 	arg_mode=normal
 	continue
 	;;
@@ -1980,7 +3296,7 @@ func_mode_compile ()
 	case $arg in
 	-o)
 	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
+	    func_fatal_error "you cannot specify '-o' more than once"
 	  arg_mode=target
 	  continue
 	  ;;
@@ -2009,12 +3325,12 @@ func_mode_compile ()
 	  func_stripname '-Wc,' '' "$arg"
 	  args=$func_stripname_result
 	  lastarg=
-	  save_ifs="$IFS"; IFS=','
+	  save_ifs=$IFS; IFS=,
 	  for arg in $args; do
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 	    func_append_quoted lastarg "$arg"
 	  done
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
 	  func_stripname ' ' '' "$lastarg"
 	  lastarg=$func_stripname_result
 
@@ -2027,8 +3343,8 @@ func_mode_compile ()
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
+	  lastarg=$srcfile
+	  srcfile=$arg
 	  ;;
 	esac  #  case $arg
 	;;
@@ -2043,13 +3359,13 @@ func_mode_compile ()
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      func_fatal_error "you must specify a target with \`-o'"
+      func_fatal_error "you must specify a target with '-o'"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
 	func_basename "$srcfile"
-	libobj="$func_basename_result"
+	libobj=$func_basename_result
       }
       ;;
     esac
@@ -2069,7 +3385,7 @@ func_mode_compile ()
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      func_fatal_error "cannot determine name of library object from '$libobj'"
       ;;
     esac
 
@@ -2078,8 +3394,8 @@ func_mode_compile ()
     for arg in $later; do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	continue
 	;;
@@ -2105,17 +3421,17 @@ func_mode_compile ()
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
@@ -2127,16 +3443,16 @@ func_mode_compile ()
       pic_mode=default
       ;;
     esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
     else
       output_obj=
       need_locks=no
@@ -2145,12 +3461,12 @@ func_mode_compile ()
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
+    if test yes = "$need_locks"; then
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
-    elif test "$need_locks" = warn; then
+    elif test warn = "$need_locks"; then
       if test -f "$lockfile"; then
 	$ECHO "\
 *** ERROR, $lockfile exists and contains:
@@ -2158,7 +3474,7 @@ func_mode_compile ()
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2180,11 +3496,11 @@ compiler."
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
-      if test "$pic_mode" != no; then
+      if test no != "$pic_mode"; then
 	command="$base_compile $qsrcfile $pic_flag"
       else
 	# Don't build PIC code
@@ -2201,7 +3517,7 @@ compiler."
       func_show_eval_locale "$command"	\
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2212,7 +3528,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2228,20 +3544,20 @@ compiler."
       fi
 
       # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
+      if test yes = "$suppress_opt"; then
 	suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
 	# Don't build PIC code
 	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
-      if test "$compiler_c_o" = yes; then
+      if test yes = "$compiler_c_o"; then
 	func_append command " -o $obj"
       fi
 
@@ -2250,7 +3566,7 @@ compiler."
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2261,7 +3577,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2281,7 +3597,7 @@ compiler."
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
+      if test no != "$need_locks"; then
 	removelist=$lockfile
         $RM "$lockfile"
       fi
@@ -2291,7 +3607,7 @@ compiler."
 }
 
 $opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
@@ -2311,7 +3627,7 @@ func_mode_help ()
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
@@ -2330,16 +3646,16 @@ This mode accepts the following additional options:
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
   -Wc,FLAG          pass FLAG directly to the compiler
 
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
         ;;
 
       execute)
@@ -2352,7 +3668,7 @@ This mode accepts the following additional options:
 
   -dlopen FILE      add the directory containing FILE to the library path
 
-This mode sets the library path environment variable according to \`-dlopen'
+This mode sets the library path environment variable according to '-dlopen'
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
@@ -2371,7 +3687,7 @@ Complete the installation of libtool libraries.
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
+the '--dry-run' option if you just want to see what would be executed."
         ;;
 
       install)
@@ -2381,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed."
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
+either the 'install' or 'cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
@@ -2407,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially:
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
@@ -2421,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially:
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
@@ -2441,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially:
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
-All other options (arguments beginning with \`-') are ignored.
+All other options (arguments beginning with '-') are ignored.
 
-Every other argument is treated as a filename.  Files ending in \`.la' are
+Every other argument is treated as a filename.  Files ending in '.la' are
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
 required, except when creating a convenience library.
 
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
 
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
 is created, otherwise an executable program is created."
         ;;
 
@@ -2465,7 +3782,7 @@ is created, otherwise an executable program is created."
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
@@ -2473,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
+        func_fatal_help "invalid operation mode '$opt_mode'"
         ;;
     esac
 
     echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
+    $ECHO "Try '$progname --help' for more information about other modes."
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
-  if test "$opt_help" = :; then
+  if test : = "$opt_help"; then
     func_mode_help
   else
     {
@@ -2491,7 +3808,7 @@ if $opt_help; then
       for opt_mode in compile link execute install finish uninstall clean; do
 	func_mode_help
       done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
@@ -2499,7 +3816,7 @@ if $opt_help; then
 	func_mode_help
       done
     } |
-    sed '1d
+    $SED '1d
       /^When reporting/,/^Report/{
 	H
 	d
@@ -2516,16 +3833,17 @@ fi
 # func_mode_execute arg...
 func_mode_execute ()
 {
-    $opt_debug
+    $debug_cmd
+
     # The first argument is the command name.
-    cmd="$nonopt"
+    cmd=$nonopt
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
+	|| func_fatal_help "'$file' is not a file"
 
       dir=
       case $file in
@@ -2535,7 +3853,7 @@ func_mode_execute ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
 
 	# Read the libtool library.
 	dlname=
@@ -2546,18 +3864,18 @@ func_mode_execute ()
 	if test -z "$dlname"; then
 	  # Warn if it was a shared library.
 	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	    func_warning "'$file' was not linked with '-export-dynamic'"
 	  continue
 	fi
 
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 
 	if test -f "$dir/$objdir/$dlname"; then
 	  func_append dir "/$objdir"
 	else
 	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
 	  fi
 	fi
 	;;
@@ -2565,18 +3883,18 @@ func_mode_execute ()
       *.lo)
 	# Just add the directory containing the .lo file.
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	;;
 
       *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+      test -n "$absdir" && dir=$absdir
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
@@ -2588,7 +3906,7 @@ func_mode_execute ()
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
-    libtool_execute_magic="$magic"
+    libtool_execute_magic=$magic
 
     # Check if any of the arguments is a wrapper script.
     args=
@@ -2601,12 +3919,12 @@ func_mode_execute ()
 	if func_ltwrapper_script_p "$file"; then
 	  func_source "$file"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	elif func_ltwrapper_executable_p "$file"; then
 	  func_ltwrapper_scriptname "$file"
 	  func_source "$func_ltwrapper_scriptname_result"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	fi
 	;;
       esac
@@ -2614,7 +3932,15 @@ func_mode_execute ()
       func_append_quoted args "$file"
     done
 
-    if test "X$opt_dry_run" = Xfalse; then
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
       if test -n "$shlibpath_var"; then
 	# Export the shlibpath_var.
 	eval "export $shlibpath_var"
@@ -2631,25 +3957,18 @@ func_mode_execute ()
       done
 
       # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
+      exec_cmd=\$cmd$args
     fi
 }
 
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
-    $opt_debug
+    $debug_cmd
+
     libs=
     libdirs=
     admincmds=
@@ -2663,11 +3982,11 @@ func_mode_finish ()
 	if func_lalib_unsafe_p "$opt"; then
 	  func_append libs " $opt"
 	else
-	  func_warning "\`$opt' is not a valid libtool archive"
+	  func_warning "'$opt' is not a valid libtool archive"
 	fi
 
       else
-	func_fatal_error "invalid argument \`$opt'"
+	func_fatal_error "invalid argument '$opt'"
       fi
     done
 
@@ -2682,12 +4001,12 @@ func_mode_finish ()
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
-	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
 	    > $tmpdir/tmp-la
 	  mv -f $tmpdir/tmp-la $lib
 	done
@@ -2712,7 +4031,7 @@ func_mode_finish ()
     fi
 
     # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
+    $opt_quiet && exit $EXIT_SUCCESS
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
@@ -2723,27 +4042,27 @@ func_mode_finish ()
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
-	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
 	echo "     during execution"
       fi
       if test -n "$runpath_var"; then
-	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
 	echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
 	libdir=LIBDIR
 	eval flag=\"$hardcode_libdir_flag_spec\"
 
-	$ECHO "   - use the \`$flag' linker flag"
+	$ECHO "   - use the '$flag' linker flag"
       fi
       if test -n "$admincmds"; then
 	$ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
-	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
       fi
       echo
 
@@ -2762,18 +4081,20 @@ func_mode_finish ()
     exit $EXIT_SUCCESS
 }
 
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
-    $opt_debug
+    $debug_cmd
+
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
        # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
@@ -2800,7 +4121,7 @@ func_mode_install ()
     opts=
     prev=
     install_type=
-    isdir=no
+    isdir=false
     stripme=
     no_mode=:
     for arg
@@ -2813,7 +4134,7 @@ func_mode_install ()
       fi
 
       case $arg in
-      -d) isdir=yes ;;
+      -d) isdir=: ;;
       -f)
 	if $install_cp; then :; else
 	  prev=$arg
@@ -2831,7 +4152,7 @@ func_mode_install ()
       *)
 	# If the previous option needed an argument, then skip it.
 	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
 	    arg2=$install_override_mode
 	    no_mode=false
 	  fi
@@ -2856,7 +4177,7 @@ func_mode_install ()
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
+      func_fatal_help "the '$prev' option requires an argument"
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
@@ -2878,19 +4199,19 @@ func_mode_install ()
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
+      destdir=$func_dirname_result
+      destname=$func_basename_result
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
+	func_fatal_help "'$dest' is not a directory"
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -2899,7 +4220,7 @@ func_mode_install ()
 	case $file in
 	*.lo) ;;
 	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  func_fatal_help "'$destdir' must be an absolute directory name"
 	  ;;
 	esac
       done
@@ -2908,7 +4229,7 @@ func_mode_install ()
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     staticlibs=
     future_libdirs=
@@ -2928,7 +4249,7 @@ func_mode_install ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
+	  || func_fatal_help "'$file' is not a valid libtool archive"
 
 	library_names=
 	old_library=
@@ -2950,7 +4271,7 @@ func_mode_install ()
 	fi
 
 	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	func_append dir "$objdir"
 
 	if test -n "$relink_command"; then
@@ -2964,7 +4285,7 @@ func_mode_install ()
 	  # are installed into $libdir/../bin (currently, that works fine)
 	  # but it's something to keep an eye on.
 	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
 
 	  if test -n "$inst_prefix_dir"; then
 	    # Stick the inst_prefix_dir data into the link command.
@@ -2973,29 +4294,36 @@ func_mode_install ()
 	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
 	  fi
 
-	  func_warning "relinking \`$file'"
+	  func_warning "relinking '$file'"
 	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
 	fi
 
 	# See the names of the shared library.
 	set dummy $library_names; shift
 	if test -n "$1"; then
-	  realname="$1"
+	  realname=$1
 	  shift
 
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
 
 	  # Install the shared library and build the symlinks.
 	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
 	      'exit $?'
-	  tstripme="$stripme"
+	  tstripme=$stripme
 	  case $host_os in
 	  cygwin* | mingw* | pw32* | cegcc*)
 	    case $realname in
 	    *.dll.a)
-	      tstripme=""
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
 	      ;;
 	    esac
 	    ;;
@@ -3006,7 +4334,7 @@ func_mode_install ()
 
 	  if test "$#" -gt 0; then
 	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
 	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
 	    # so we also need to try rm && ln -s.
 	    for linkname
@@ -3017,14 +4345,14 @@ func_mode_install ()
 	  fi
 
 	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
+	  lib=$destdir/$realname
 	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
 	# Install the pseudo-library for information purposes.
 	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
+	name=$func_basename_result
+	instname=$dir/${name}i
 	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
 	# Maybe install the static library, too.
@@ -3036,11 +4364,11 @@ func_mode_install ()
 
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# Deduce the name of the destination old-style object file.
@@ -3050,11 +4378,11 @@ func_mode_install ()
 	  staticdest=$func_lo2o_result
 	  ;;
 	*.$objext)
-	  staticdest="$destfile"
+	  staticdest=$destfile
 	  destfile=
 	  ;;
 	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
 	  ;;
 	esac
 
@@ -3063,7 +4391,7 @@ func_mode_install ()
 	  func_show_eval "$install_prog $file $destfile" 'exit $?'
 
 	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
+	if test yes = "$build_old_libs"; then
 	  # Deduce the name of the old-style object file.
 	  func_lo2o "$file"
 	  staticobj=$func_lo2o_result
@@ -3075,23 +4403,23 @@ func_mode_install ()
       *)
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# If the file is missing, and there is a .exe on the end, strip it
 	# because it is most likely a libtool script we actually want to
 	# install
-	stripped_ext=""
+	stripped_ext=
 	case $file in
 	  *.exe)
 	    if test ! -f "$file"; then
 	      func_stripname '' '.exe' "$file"
 	      file=$func_stripname_result
-	      stripped_ext=".exe"
+	      stripped_ext=.exe
 	    fi
 	    ;;
 	esac
@@ -3119,19 +4447,19 @@ func_mode_install ()
 
 	  # Check the variables that should have been set.
 	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
 
-	  finalize=yes
+	  finalize=:
 	  for lib in $notinst_deplibs; do
 	    # Check to see that each library is installed.
 	    libdir=
 	    if test -f "$lib"; then
 	      func_source "$lib"
 	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
 	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
 	    fi
 	  done
 
@@ -3139,29 +4467,29 @@ func_mode_install ()
 	  func_source "$wrapper"
 
 	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
+	  if test no = "$fast_install" && test -n "$relink_command"; then
 	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
+	      if $finalize; then
 	        tmpdir=`func_mktempdir`
 		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
 	        # Replace the output file specification.
 	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
-	        $opt_silent || {
+	        $opt_quiet || {
 	          func_quote_for_expand "$relink_command"
 		  eval "func_echo $func_quote_for_expand_result"
 	        }
 	        if eval "$relink_command"; then :
 	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
+		  func_error "error: relink '$file' with the above command before installing it"
 		  $opt_dry_run || ${RM}r "$tmpdir"
 		  continue
 	        fi
-	        file="$outputname"
+	        file=$outputname
 	      else
-	        func_warning "cannot relink \`$file'"
+	        func_warning "cannot relink '$file'"
 	      fi
 	    }
 	  else
@@ -3198,10 +4526,10 @@ func_mode_install ()
 
     for file in $staticlibs; do
       func_basename "$file"
-      name="$func_basename_result"
+      name=$func_basename_result
 
       # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      oldlib=$destdir/$name
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
@@ -3216,18 +4544,18 @@ func_mode_install ()
     done
 
     test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
+      func_warning "remember to run '$progname --finish$future_libdirs'"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
     else
       exit $EXIT_SUCCESS
     fi
 }
 
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
@@ -3235,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"}
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
     my_dlsyms=
 
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
+	my_dlsyms=${my_outputname}S.c
       else
 	func_error "not configured to extract global symbols from dlpreopened files"
       fi
@@ -3255,7 +4584,7 @@ func_generate_dlsyms ()
       "") ;;
       *.c)
 	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
+	nlist=$output_objdir/$my_outputname.nm
 
 	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
@@ -3263,34 +4592,36 @@ func_generate_dlsyms ()
 	func_verbose "creating $output_objdir/$my_dlsyms"
 
 	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* External symbol declarations for the compiler. */\
 "
 
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
 
 	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
@@ -3298,7 +4629,7 @@ extern \"C\" {
 	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	  for progfile in $progfiles; do
 	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
 	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
 	  done
 
@@ -3318,10 +4649,10 @@ extern \"C\" {
 
 	  # Prepare the list of exported symbols
 	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
+	    export_symbols=$output_objdir/$outputname.exp
 	    $opt_dry_run || {
 	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
 	      case $host in
 	      *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
@@ -3331,7 +4662,7 @@ extern \"C\" {
 	    }
 	  else
 	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
 	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	      case $host in
@@ -3345,22 +4676,22 @@ extern \"C\" {
 	fi
 
 	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_verbose "extracting global C symbols from '$dlprefile'"
 	  func_basename "$dlprefile"
-	  name="$func_basename_result"
+	  name=$func_basename_result
           case $host in
 	    *cygwin* | *mingw* | *cegcc* )
 	      # if an import library, we need to obtain dlname
 	      if func_win32_import_lib_p "$dlprefile"; then
 	        func_tr_sh "$dlprefile"
 	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
-	        dlprefile_dlbasename=""
+	        dlprefile_dlbasename=
 	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
 	          # Use subshell, to avoid clobbering current variable values
 	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-	          if test -n "$dlprefile_dlname" ; then
+	          if test -n "$dlprefile_dlname"; then
 	            func_basename "$dlprefile_dlname"
-	            dlprefile_dlbasename="$func_basename_result"
+	            dlprefile_dlbasename=$func_basename_result
 	          else
 	            # no lafile. user explicitly requested -dlpreopen <import library>.
 	            $sharedlib_from_linklib_cmd "$dlprefile"
@@ -3368,7 +4699,7 @@ extern \"C\" {
 	          fi
 	        fi
 	        $opt_dry_run || {
-	          if test -n "$dlprefile_dlbasename" ; then
+	          if test -n "$dlprefile_dlbasename"; then
 	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
 	          else
 	            func_warning "Could not compute DLL name from $name"
@@ -3424,6 +4755,11 @@ extern \"C\" {
 	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
 
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
 	  echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
@@ -3432,11 +4768,30 @@ typedef struct {
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
 
 	  case $need_lib_prefix in
 	  no)
@@ -3478,9 +4833,7 @@ static const void *lt_preloaded_setup() {
 	  *-*-hpux*)
 	    pic_flag_for_symtable=" $pic_flag"  ;;
 	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
 	    ;;
 	  esac
 	  ;;
@@ -3497,10 +4850,10 @@ static const void *lt_preloaded_setup() {
 	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
 	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
 
 	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	symfileobj=$output_objdir/${my_outputname}S.$objext
 	case $host in
 	*cygwin* | *mingw* | *cegcc* )
 	  if test -f "$output_objdir/$my_outputname.def"; then
@@ -3518,7 +4871,7 @@ static const void *lt_preloaded_setup() {
 	esac
 	;;
       *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
 	;;
       esac
     else
@@ -3532,6 +4885,32 @@ static const void *lt_preloaded_setup() {
     fi
 }
 
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
@@ -3541,8 +4920,9 @@ static const void *lt_preloaded_setup() {
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
-  $opt_debug
-  win32_libid_type="unknown"
+  $debug_cmd
+
+  win32_libid_type=unknown
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
@@ -3552,16 +4932,29 @@ func_win32_libid ()
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-	$SED -n -e '
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
 	    1,100{
 		/ I /{
-		    s,.*,import,
+		    s|.*|import|
 		    p
 		    q
 		}
 	    }'`
+	;;
+      esac
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
@@ -3593,7 +4986,8 @@ func_win32_libid ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
-  $opt_debug
+  $debug_cmd
+
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
@@ -3610,7 +5004,8 @@ func_cygming_dll_for_implib ()
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
-  $opt_debug
+  $debug_cmd
+
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
@@ -3646,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core ()
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
@@ -3658,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core ()
     $SED -e '/^\./d;/^.\./d;q'
 }
 
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
@@ -3695,16 +5066,17 @@ func_cygming_ms_implib_p ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
+  elif func_cygming_ms_implib_p "$1"; then
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
-    sharedlib_from_linklib_result=""
+    sharedlib_from_linklib_result=
   fi
 }
 
@@ -3712,10 +5084,11 @@ func_cygming_dll_for_implib_fallback ()
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
@@ -3724,7 +5097,7 @@ func_extract_an_archive ()
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
 		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
+    if test yes = "$lock_old_archive_extraction"; then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
@@ -3738,22 +5111,23 @@ func_extract_an_archive ()
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
-    $opt_debug
-    my_gentop="$1"; shift
+    $debug_cmd
+
+    my_gentop=$1; shift
     my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
 	*) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
+      my_xlib=$func_basename_result
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
@@ -3765,7 +5139,7 @@ func_extract_archives ()
 	esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
 
       func_mkdir_p "$my_xdir"
 
@@ -3778,22 +5152,23 @@ func_extract_archives ()
 	  cd $my_xdir || exit $?
 	  darwin_archive=$my_xabs
 	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
 	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
 	  if test -n "$darwin_arches"; then
 	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
 	    darwin_arch=
 	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
 	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
 	    done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
 	    darwin_file=
 	    darwin_files=
 	    for darwin_file in $darwin_filelist; do
@@ -3815,7 +5190,7 @@ func_extract_archives ()
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
-    func_extract_archives_result="$my_oldobjs"
+    func_extract_archives_result=$my_oldobjs
 }
 
 
@@ -3830,7 +5205,7 @@ func_extract_archives ()
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
+# will assume that the directory where it is stored is
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
@@ -3841,7 +5216,7 @@ func_emit_wrapper ()
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
@@ -3898,9 +5273,9 @@ _LTECHO_EOF'
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
+# /script/ and the wrapper /executable/ that is used only on
 # windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
+# (application programs are unlikely to have options that match
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
@@ -3933,7 +5308,7 @@ func_parse_lt_options ()
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
   fi
 }
 
@@ -3944,7 +5319,7 @@ func_lt_dump_args ()
   lt_dump_args_N=1;
   for lt_arg
   do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
@@ -3958,7 +5333,7 @@ func_exec_program_core ()
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
@@ -3968,7 +5343,7 @@ func_exec_program_core ()
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
@@ -4043,13 +5418,13 @@ func_exec_program ()
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
-	if test "$fast_install" = yes; then
+	if test yes = "$fast_install"; then
 	  $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
@@ -4066,7 +5441,7 @@ func_exec_program ()
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
-	$ECHO \"\$relink_command_output\" >&2
+	\$ECHO \"\$relink_command_output\" >&2
 	$RM \"\$progdir/\$file\"
 	exit 1
       fi
@@ -4101,7 +5476,7 @@ func_exec_program ()
 	fi
 
 	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
 	  $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
@@ -4121,7 +5496,7 @@ func_exec_program ()
     fi
   else
     # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
@@ -4140,7 +5515,7 @@ func_emit_cwrapperexe_src ()
 	cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
@@ -4175,47 +5550,45 @@ EOF
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
+#if defined __MINGW32__
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
-/* #elif defined (other platforms) ... */
+/* #elif defined other_platform || defined ... */
 #endif
 
 /* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
+#if defined _MSC_VER
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
+#elif defined __MINGW32__
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
+/* #elif defined other platforms ... */
 #endif
 
-#if defined(PATH_MAX)
+#if defined PATH_MAX
 # define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
+#elif defined MAXPATHLEN
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
@@ -4234,8 +5607,8 @@ int setenv (const char *, const char *, int);
 # define PATH_SEPARATOR ':'
 #endif
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
@@ -4268,10 +5641,10 @@ int setenv (const char *, const char *, int);
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
+  if (stale) { free (stale); stale = 0; } \
 } while (0)
 
-#if defined(LT_DEBUGWRAPPER)
+#if defined LT_DEBUGWRAPPER
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
@@ -4300,11 +5673,16 @@ void lt_dump_script (FILE *f);
 EOF
 
 	    cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
               func_to_host_path "$temp_rpath"
 	      cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
@@ -4328,7 +5706,7 @@ const char * EXE_PATH_VALUE   = "";
 EOF
 	    fi
 
-	    if test "$fast_install" = yes; then
+	    if test yes = "$fast_install"; then
 	      cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
@@ -4357,12 +5735,12 @@ main (int argc, char *argv[])
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
-  intptr_t rval = 127;
+  int rval = 127;
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
+  newargz = XMALLOC (char *, (size_t) argc + 1);
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
@@ -4371,10 +5749,10 @@ main (int argc, char *argv[])
   newargc=0;
   for (i = 1; i < argc; i++)
     {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
+      if (STREQ (argv[i], dumpscript_opt))
 	{
 EOF
-	    case "$host" in
+	    case $host in
 	      *mingw* | *cygwin* )
 		# make stdout use "unix" line endings
 		echo "          setmode(1,_O_BINARY);"
@@ -4385,12 +5763,12 @@ EOF
 	  lt_dump_script (stdout);
 	  return 0;
 	}
-      if (strcmp (argv[i], debug_opt) == 0)
+      if (STREQ (argv[i], debug_opt))
 	{
           lt_debug = 1;
           continue;
 	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+      if (STREQ (argv[i], ltwrapper_option_prefix))
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
@@ -4413,7 +5791,7 @@ EOF
 EOF
 	    cat <<EOF
   /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
 EOF
 	    cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
@@ -4524,7 +5902,7 @@ EOF
 		cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
@@ -4569,7 +5947,7 @@ base_name (const char *name)
 {
   const char *base;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
@@ -4628,7 +6006,7 @@ find_executable (const char *wrapper)
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
-  int tmp_len;
+  size_t tmp_len;
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
@@ -4638,7 +6016,7 @@ find_executable (const char *wrapper)
     return NULL;
 
   /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
@@ -4656,7 +6034,7 @@ find_executable (const char *wrapper)
 	    return concat_name;
 	  XFREE (concat_name);
 	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
     }
 #endif
 
@@ -4679,7 +6057,7 @@ find_executable (const char *wrapper)
 	      for (q = p; *q; q++)
 		if (IS_PATH_SEPARATOR (*q))
 		  break;
-	      p_len = q - p;
+	      p_len = (size_t) (q - p);
 	      p_next = (*q == '\0' ? q : q + 1);
 	      if (p_len == 0)
 		{
@@ -4798,7 +6176,7 @@ strendzap (char *str, const char *pat)
   if (patlen <= len)
     {
       str += len - patlen;
-      if (strcmp (str, pat) == 0)
+      if (STREQ (str, pat))
 	*str = '\0';
     }
   return str;
@@ -4863,7 +6241,7 @@ lt_setenv (const char *name, const char *value)
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
-    int len = strlen (name) + 1 + strlen (value) + 1;
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
@@ -4880,8 +6258,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
   char *new_value;
   if (orig_value && *orig_value)
     {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
@@ -4912,10 +6290,10 @@ lt_update_exe_path (const char *name, const char *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
         {
-          new_value[len-1] = '\0';
+          new_value[--len] = '\0';
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
@@ -5082,27 +6460,47 @@ EOF
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
-    $opt_debug
+    $debug_cmd
+
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
 # func_mode_link arg...
 func_mode_link ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
+      # what system we are compiling for in order to pass an extra
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
+      # to make a dll that has undefined symbols, in which case not
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
@@ -5146,10 +6544,11 @@ func_mode_link ()
     module=no
     no_install=no
     objs=
+    os2dllname=
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
-    preload=no
+    preload=false
     prev=
     prevarg=
     release=
@@ -5161,7 +6560,7 @@ func_mode_link ()
     vinfo=
     vinfo_number=no
     weak_libs=
-    single_module="${wl}-single_module"
+    single_module=$wl-single_module
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
@@ -5169,15 +6568,15 @@ func_mode_link ()
     do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	break
 	;;
       -all-static | -static | -static-libtool-libs)
 	case $arg in
 	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
 	    func_warning "complete static linking is impossible in this configuration"
 	  fi
 	  if test -n "$link_static_flag"; then
@@ -5210,7 +6609,7 @@ func_mode_link ()
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
-      arg="$1"
+      arg=$1
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
@@ -5227,21 +6626,21 @@ func_mode_link ()
 
 	case $prev in
 	bindir)
-	  bindir="$arg"
+	  bindir=$arg
 	  prev=
 	  continue
 	  ;;
 	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
+	  $preload || {
 	    # Add the symbol object into the linking commands.
 	    func_append compile_command " @SYMFILE@"
 	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
+	    preload=:
+	  }
 	  case $arg in
 	  *.la | *.lo) ;;  # We handle these cases below.
 	  force)
-	    if test "$dlself" = no; then
+	    if test no = "$dlself"; then
 	      dlself=needless
 	      export_dynamic=yes
 	    fi
@@ -5249,9 +6648,9 @@ func_mode_link ()
 	    continue
 	    ;;
 	  self)
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
 	      dlself=yes
 	    else
 	      dlself=needless
@@ -5261,7 +6660,7 @@ func_mode_link ()
 	    continue
 	    ;;
 	  *)
-	    if test "$prev" = dlfiles; then
+	    if test dlfiles = "$prev"; then
 	      func_append dlfiles " $arg"
 	    else
 	      func_append dlprefiles " $arg"
@@ -5272,14 +6671,14 @@ func_mode_link ()
 	  esac
 	  ;;
 	expsyms)
-	  export_symbols="$arg"
+	  export_symbols=$arg
 	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
+	    || func_fatal_error "symbol file '$arg' does not exist"
 	  prev=
 	  continue
 	  ;;
 	expsyms_regex)
-	  export_symbols_regex="$arg"
+	  export_symbols_regex=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5297,7 +6696,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	inst_prefix)
-	  inst_prefix_dir="$arg"
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
 	  prev=
 	  continue
 	  ;;
@@ -5321,21 +6726,21 @@ func_mode_link ()
 
 		if test -z "$pic_object" ||
 		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
 		fi
 
 		# Extract subdirectory from the argument.
 		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
+		xdir=$func_dirname_result
 
-		if test "$pic_object" != none; then
+		if test none != "$pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
+		  pic_object=$xdir$pic_object
 
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		      func_append dlfiles " $pic_object"
 		      prev=
 		      continue
@@ -5346,7 +6751,7 @@ func_mode_link ()
 		  fi
 
 		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
+		  if test dlprefiles = "$prev"; then
 		    # Preload the old-style object.
 		    func_append dlprefiles " $pic_object"
 		    prev=
@@ -5354,23 +6759,23 @@ func_mode_link ()
 
 		  # A PIC object.
 		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
+		  arg=$pic_object
 		fi
 
 		# Non-PIC object.
-		if test "$non_pic_object" != none; then
+		if test none != "$non_pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
+		  non_pic_object=$xdir$non_pic_object
 
 		  # A standard non-PIC object
 		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
 		  fi
 		else
 		  # If the PIC object exists, use it instead.
 		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
+		  non_pic_object=$pic_object
 		  func_append non_pic_objects " $non_pic_object"
 		fi
 	      else
@@ -5378,7 +6783,7 @@ func_mode_link ()
 		if $opt_dry_run; then
 		  # Extract subdirectory from the argument.
 		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
+		  xdir=$func_dirname_result
 
 		  func_lo2o "$arg"
 		  pic_object=$xdir$objdir/$func_lo2o_result
@@ -5386,24 +6791,29 @@ func_mode_link ()
 		  func_append libobjs " $pic_object"
 		  func_append non_pic_objects " $non_pic_object"
 	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
+		  func_fatal_error "'$arg' is not a valid libtool object"
 		fi
 	      fi
 	    done
 	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
+	    func_fatal_error "link input file '$arg' does not exist"
 	  fi
 	  arg=$save_arg
 	  prev=
 	  continue
 	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
 	precious_regex)
-	  precious_files_regex="$arg"
+	  precious_files_regex=$arg
 	  prev=
 	  continue
 	  ;;
 	release)
-	  release="-$arg"
+	  release=-$arg
 	  prev=
 	  continue
 	  ;;
@@ -5415,7 +6825,7 @@ func_mode_link ()
 	    func_fatal_error "only absolute run-paths are allowed"
 	    ;;
 	  esac
-	  if test "$prev" = rpath; then
+	  if test rpath = "$prev"; then
 	    case "$rpath " in
 	    *" $arg "*) ;;
 	    *) func_append rpath " $arg" ;;
@@ -5430,7 +6840,7 @@ func_mode_link ()
 	  continue
 	  ;;
 	shrext)
-	  shrext_cmds="$arg"
+	  shrext_cmds=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5470,7 +6880,7 @@ func_mode_link ()
 	esac
       fi # test -n "$prev"
 
-      prevarg="$arg"
+      prevarg=$arg
 
       case $arg in
       -all-static)
@@ -5484,7 +6894,7 @@ func_mode_link ()
 
       -allow-undefined)
 	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
 	;;
 
       -avoid-version)
@@ -5516,7 +6926,7 @@ func_mode_link ()
 	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
 	  func_fatal_error "more than one -exported-symbols argument is not allowed"
 	fi
-	if test "X$arg" = "X-export-symbols"; then
+	if test X-export-symbols = "X$arg"; then
 	  prev=expsyms
 	else
 	  prev=expsyms_regex
@@ -5550,9 +6960,9 @@ func_mode_link ()
 	func_stripname "-L" '' "$arg"
 	if test -z "$func_stripname_result"; then
 	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
+	    func_fatal_error "require no space between '-L' and '$1'"
 	  else
-	    func_fatal_error "need path for \`-L' option"
+	    func_fatal_error "need path for '-L' option"
 	  fi
 	fi
 	func_resolve_sysroot "$func_stripname_result"
@@ -5563,8 +6973,8 @@ func_mode_link ()
 	*)
 	  absdir=`cd "$dir" && pwd`
 	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
 	  ;;
 	esac
 	case "$deplibs " in
@@ -5599,7 +7009,7 @@ func_mode_link ()
 	;;
 
       -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
 	    # These systems don't actually have a C or math library (as such)
@@ -5607,11 +7017,11 @@ func_mode_link ()
 	    ;;
 	  *-*-os2*)
 	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
 	    # Rhapsody C and math libraries are in the System framework
@@ -5620,16 +7030,16 @@ func_mode_link ()
 	    ;;
 	  *-*-sco3.2v5* | *-*-sco5v6*)
 	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
 	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  esac
-	elif test "X$arg" = "X-lc_r"; then
+	elif test X-lc_r = "X$arg"; then
 	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	   # Do not include libc_r directly, use -pthread flag.
 	   continue
 	   ;;
@@ -5639,6 +7049,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
       -module)
 	module=yes
 	continue
@@ -5668,7 +7083,7 @@ func_mode_link ()
 	;;
 
       -multi_module)
-	single_module="${wl}-multi_module"
+	single_module=$wl-multi_module
 	continue
 	;;
 
@@ -5682,8 +7097,8 @@ func_mode_link ()
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
 	  # The PATH hackery in wrapper scripts is required on Windows
 	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
 	  fast_install=no
 	  ;;
 	*) no_install=yes ;;
@@ -5701,6 +7116,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
       -o) prev=output ;;
 
       -precious-files-regex)
@@ -5788,14 +7208,14 @@ func_mode_link ()
 	func_stripname '-Wc,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $func_quote_for_eval_result"
 	  func_append compiler_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5804,15 +7224,15 @@ func_mode_link ()
 	func_stripname '-Wl,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $wl$func_quote_for_eval_result"
 	  func_append compiler_flags " $wl$func_quote_for_eval_result"
 	  func_append linker_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5835,7 +7255,7 @@ func_mode_link ()
       # -msg_* for osf cc
       -msg_*)
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -5847,25 +7267,49 @@ func_mode_link ()
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       *.$objext)
@@ -5886,21 +7330,21 @@ func_mode_link ()
 
 	  if test -z "$pic_object" ||
 	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
 	  fi
 
 	  # Extract subdirectory from the argument.
 	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
+	  xdir=$func_dirname_result
 
-	  if test "$pic_object" != none; then
+	  test none = "$pic_object" || {
 	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
+	    pic_object=$xdir$pic_object
 
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		func_append dlfiles " $pic_object"
 		prev=
 		continue
@@ -5911,7 +7355,7 @@ func_mode_link ()
 	    fi
 
 	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      # Preload the old-style object.
 	      func_append dlprefiles " $pic_object"
 	      prev=
@@ -5919,23 +7363,23 @@ func_mode_link ()
 
 	    # A PIC object.
 	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
+	    arg=$pic_object
+	  }
 
 	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
+	  if test none != "$non_pic_object"; then
 	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
+	    non_pic_object=$xdir$non_pic_object
 
 	    # A standard non-PIC object
 	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
 	    fi
 	  else
 	    # If the PIC object exists, use it instead.
 	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
+	    non_pic_object=$pic_object
 	    func_append non_pic_objects " $non_pic_object"
 	  fi
 	else
@@ -5943,7 +7387,7 @@ func_mode_link ()
 	  if $opt_dry_run; then
 	    # Extract subdirectory from the argument.
 	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
+	    xdir=$func_dirname_result
 
 	    func_lo2o "$arg"
 	    pic_object=$xdir$objdir/$func_lo2o_result
@@ -5951,7 +7395,7 @@ func_mode_link ()
 	    func_append libobjs " $pic_object"
 	    func_append non_pic_objects " $non_pic_object"
 	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
+	    func_fatal_error "'$arg' is not a valid libtool object"
 	  fi
 	fi
 	;;
@@ -5967,11 +7411,11 @@ func_mode_link ()
 	# A libtool-controlled library.
 
 	func_resolve_sysroot "$arg"
-	if test "$prev" = dlfiles; then
+	if test dlfiles = "$prev"; then
 	  # This library was specified with -dlopen.
 	  func_append dlfiles " $func_resolve_sysroot_result"
 	  prev=
-	elif test "$prev" = dlprefiles; then
+	elif test dlprefiles = "$prev"; then
 	  # The library was specified with -dlpreopen.
 	  func_append dlprefiles " $func_resolve_sysroot_result"
 	  prev=
@@ -5986,7 +7430,7 @@ func_mode_link ()
 	# Unknown arguments in both finalize_command and compile_command need
 	# to be aesthetically quoted because they are evaled later.
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
       esac # arg
 
@@ -5998,9 +7442,9 @@ func_mode_link ()
     done # argument parsing loop
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
+      func_fatal_help "the '$prevarg' option requires an argument"
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
@@ -6009,20 +7453,23 @@ func_mode_link ()
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
     func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
+    output_objdir=$func_dirname_result$objdir
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
@@ -6045,7 +7492,7 @@ func_mode_link ()
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
+      if $opt_preserve_dup_deps; then
 	case "$libs " in
 	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	esac
@@ -6053,7 +7500,7 @@ func_mode_link ()
       func_append libs " $deplib"
     done
 
-    if test "$linkmode" = lib; then
+    if test lib = "$linkmode"; then
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
@@ -6085,7 +7532,7 @@ func_mode_link ()
 	  case $file in
 	  *.la) ;;
 	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
 	    ;;
 	  esac
 	done
@@ -6093,7 +7540,7 @@ func_mode_link ()
     prog)
 	compile_deplibs=
 	finalize_deplibs=
-	alldeplibs=no
+	alldeplibs=false
 	newdlfiles=
 	newdlprefiles=
 	passes="conv scan dlopen dlpreopen link"
@@ -6105,32 +7552,32 @@ func_mode_link ()
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
+      if test lib,link = "$linkmode,$pass"; then
 	## FIXME: Find the place where the list is rebuilt in the wrong
 	##        order, and fix it there properly
         tmp_deplibs=
 	for deplib in $deplibs; do
 	  tmp_deplibs="$deplib $tmp_deplibs"
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
       fi
 
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
 	deplibs=
       fi
-      if test "$linkmode" = prog; then
+      if test prog = "$linkmode"; then
 	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
 	link)
 	  libs="$deplibs %DEPLIBS%"
 	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
 	  ;;
 	esac
       fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+      if test lib,dlpreopen = "$linkmode,$pass"; then
 	# Collect and forward deplibs of preopened libtool libs
 	for lib in $dlprefiles; do
 	  # Ignore non-libtool-libs
@@ -6151,26 +7598,26 @@ func_mode_link ()
 	    esac
 	  done
 	done
-	libs="$dlprefiles"
+	libs=$dlprefiles
       fi
-      if test "$pass" = dlopen; then
+      if test dlopen = "$pass"; then
 	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
+	save_deplibs=$deplibs
 	deplibs=
       fi
 
       for deplib in $libs; do
 	lib=
-	found=no
+	found=false
 	case $deplib in
 	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    func_append compiler_flags " $deplib"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6180,13 +7627,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
 	    continue
 	  fi
 	  func_stripname '-l' '' "$deplib"
 	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
 	  else
 	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
@@ -6194,31 +7641,22 @@ func_mode_link ()
 	  for searchdir in $searchdirs; do
 	    for search_ext in .la $std_shrext .so .a; do
 	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
+	      lib=$searchdir/lib$name$search_ext
 	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
+		if test .la = "$search_ext"; then
+		  found=:
 		else
-		  found=no
+		  found=false
 		fi
 		break 2
 	      fi
 	    done
 	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
+	  if $found; then
+	    # deplib is a libtool library
 	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
 	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 	      case " $predeps $postdeps " in
 	      *" $deplib "*)
 		if func_lalib_p "$lib"; then
@@ -6226,19 +7664,19 @@ func_mode_link ()
 		  old_library=
 		  func_source "$lib"
 		  for l in $old_library $library_names; do
-		    ll="$l"
+		    ll=$l
 		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
 		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
+		    ladir=$func_dirname_result
 		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
+		    if test prog,link = "$linkmode,$pass"; then
 		      compile_deplibs="$deplib $compile_deplibs"
 		      finalize_deplibs="$deplib $finalize_deplibs"
 		    else
 		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
 		    fi
 		    continue
 		  fi
@@ -6247,15 +7685,25 @@ func_mode_link ()
 	      *) ;;
 	      esac
 	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
 	  fi
 	  ;; # -l
 	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6268,18 +7716,18 @@ func_mode_link ()
 	  case $linkmode in
 	  lib)
 	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
+	    test conv = "$pass" && continue
 	    newdependency_libs="$deplib $newdependency_libs"
 	    func_stripname '-L' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  prog)
-	    if test "$pass" = conv; then
+	    if test conv = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	      continue
 	    fi
-	    if test "$pass" = scan; then
+	    if test scan = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6290,13 +7738,13 @@ func_mode_link ()
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
+	    func_warning "'-L' is ignored for archives/objects"
 	    ;;
 	  esac # linkmode
 	  continue
 	  ;; # -L
 	-R*)
-	  if test "$pass" = link; then
+	  if test link = "$pass"; then
 	    func_stripname '-R' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    dir=$func_resolve_sysroot_result
@@ -6314,7 +7762,7 @@ func_mode_link ()
 	  lib=$func_resolve_sysroot_result
 	  ;;
 	*.$libext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
 	    continue
 	  fi
@@ -6325,21 +7773,26 @@ func_mode_link ()
 	    case " $dlpreconveniencelibs " in
 	    *" $deplib "*) ;;
 	    *)
-	      valid_a_lib=no
+	      valid_a_lib=false
 	      case $deplibs_check_method in
 		match_pattern*)
 		  set dummy $deplibs_check_method; shift
 		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
 		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
+		    valid_a_lib=:
 		  fi
 		;;
 		pass_all)
-		  valid_a_lib=yes
+		  valid_a_lib=:
 		;;
 	      esac
-	      if test "$valid_a_lib" != yes; then
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
 		echo
 		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
 		echo "*** I have the capability to make that library automatically link in when"
@@ -6347,18 +7800,13 @@ func_mode_link ()
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because the file extensions .$libext of this argument makes me believe"
 		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
 	      fi
 	      ;;
 	    esac
 	    continue
 	    ;;
 	  prog)
-	    if test "$pass" != link; then
+	    if test link != "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6369,10 +7817,10 @@ func_mode_link ()
 	  esac # linkmode
 	  ;; # *.$libext
 	*.lo | *.$objext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
 	      # If there is no dlopen support or we're linking statically,
 	      # we need to preload.
 	      func_append newdlprefiles " $deplib"
@@ -6385,22 +7833,20 @@ func_mode_link ()
 	  continue
 	  ;;
 	%DEPLIBS%)
-	  alldeplibs=yes
+	  alldeplibs=:
 	  continue
 	  ;;
 	esac # case $deplib
 
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
 
 	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
+	ladir=$func_dirname_result
 
 	dlname=
 	dlopen=
@@ -6430,19 +7876,19 @@ func_mode_link ()
 	  done
 	fi
 	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
 	  test -n "$dlopen" && func_append dlfiles " $dlopen"
 	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
 	fi
 
-	if test "$pass" = conv; then
+	if test conv = "$pass"; then
 	  # Only check for convenience libraries
 	  deplibs="$lib $deplibs"
 	  if test -z "$libdir"; then
 	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
+	      func_fatal_error "cannot find name of link library for '$lib'"
 	    fi
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
@@ -6450,15 +7896,15 @@ func_mode_link ()
 	    tmp_libs=
 	    for deplib in $dependency_libs; do
 	      deplibs="$deplib $deplibs"
-	      if $opt_preserve_dup_deps ; then
+	      if $opt_preserve_dup_deps; then
 		case "$tmp_libs " in
 		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 		esac
 	      fi
 	      func_append tmp_libs " $deplib"
 	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
 	  fi
 	  continue
 	fi # $pass = conv
@@ -6467,26 +7913,26 @@ func_mode_link ()
 	# Get the name of the library we link against.
 	linklib=
 	if test -n "$old_library" &&
-	   { test "$prefer_static_libs" = yes ||
-	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
 	  linklib=$old_library
 	else
 	  for l in $old_library $library_names; do
-	    linklib="$l"
+	    linklib=$l
 	  done
 	fi
 	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
+	  func_fatal_error "cannot find name of link library for '$lib'"
 	fi
 
 	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
 	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
 	    # If there is no dlname, no dlopen support or we're linking
 	    # statically, we need to preload.  We also need to preload any
 	    # dependent libraries so libltdl's deplib preloader doesn't
@@ -6500,40 +7946,40 @@ func_mode_link ()
 
 	# We need an absolute path.
 	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
 	*)
 	  abs_ladir=`cd "$ladir" && pwd`
 	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "cannot determine absolute directory name of '$ladir'"
 	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
+	    abs_ladir=$ladir
 	  fi
 	  ;;
 	esac
 	func_basename "$lib"
-	laname="$func_basename_result"
+	laname=$func_basename_result
 
 	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
+	if test yes = "$installed"; then
 	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
 	  else
-	    dir="$lt_sysroot$libdir"
-	    absdir="$lt_sysroot$libdir"
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
 	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
 	else
 	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
+	    dir=$ladir
+	    absdir=$abs_ladir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  fi
@@ -6542,11 +7988,11 @@ func_mode_link ()
 	name=$func_stripname_result
 
 	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
 	  fi
-	  case "$host" in
+	  case $host in
 	    # special handling for platforms with PE-DLLs.
 	    *cygwin* | *mingw* | *cegcc* )
 	      # Linker will automatically link against shared library if both
@@ -6590,9 +8036,9 @@ func_mode_link ()
 
 	if test -z "$libdir"; then
 	  # Link the convenience library
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
+	  elif test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$dir/$old_library $compile_deplibs"
 	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
 	  else
@@ -6602,14 +8048,14 @@ func_mode_link ()
 	fi
 
 
-	if test "$linkmode" = prog && test "$pass" != link; then
+	if test prog = "$linkmode" && test link != "$pass"; then
 	  func_append newlib_search_path " $ladir"
 	  deplibs="$lib $deplibs"
 
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
 	  fi
 
 	  tmp_libs=
@@ -6621,14 +8067,14 @@ func_mode_link ()
 		 ;;
 	    esac
 	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
+	    if $linkalldeplibs; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      # Need to hardcode shared library paths
 	      # or/and link against static libraries
 	      newdependency_libs="$deplib $newdependency_libs"
 	    fi
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	      esac
@@ -6638,15 +8084,15 @@ func_mode_link ()
 	  continue
 	fi # $linkmode = prog...
 
-	if test "$linkmode,$pass" = "prog,link"; then
+	if test prog,link = "$linkmode,$pass"; then
 	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
 	       test -z "$old_library"; }; then
 	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
 	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
+	      case $temp_rpath: in
 	      *"$absdir:"*) ;;
 	      *) func_append temp_rpath "$absdir:" ;;
 	      esac
@@ -6675,9 +8121,9 @@ func_mode_link ()
 	    esac
 	  fi # $linkmode,$pass = prog,link...
 
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
 		 test -n "$library_names"; }; }; then
 	    # We only need to search for static libraries
 	    continue
@@ -6686,19 +8132,19 @@ func_mode_link ()
 
 	link_static=no # Whether the deplib will be linked statically
 	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
+	if test built = "$use_static_libs" && test yes = "$installed"; then
 	  use_static_libs=no
 	fi
 	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
 	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
 	      # No point in relinking DLLs because paths are not encoded
 	      func_append notinst_deplibs " $lib"
 	      need_relink=no
 	    ;;
 	  *)
-	    if test "$installed" = no; then
+	    if test no = "$installed"; then
 	      func_append notinst_deplibs " $lib"
 	      need_relink=yes
 	    fi
@@ -6708,24 +8154,24 @@ func_mode_link ()
 
 	  # Warn about portability, can't link against -module's on some
 	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
+	  dlopenmodule=
 	  for dlpremoduletest in $dlprefiles; do
 	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
+	      dlopenmodule=$dlpremoduletest
 	      break
 	    fi
 	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
 	    echo
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
 	    else
 	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
 	    fi
 	    $ECHO "*** $linklib is not portable!"
 	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
 	    # Hardcode the library path.
 	    # Skip directories that are in the system default run-time
 	    # search path.
@@ -6753,43 +8199,43 @@ func_mode_link ()
 	    # figure out the soname
 	    set dummy $library_names
 	    shift
-	    realname="$1"
+	    realname=$1
 	    shift
 	    libname=`eval "\\$ECHO \"$libname_spec\""`
 	    # use dlname if we got it. it's perfectly good, no?
 	    if test -n "$dlname"; then
-	      soname="$dlname"
+	      soname=$dlname
 	    elif test -n "$soname_spec"; then
 	      # bleh windows
 	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
+	      *cygwin* | mingw* | *cegcc* | *os2*)
 	        func_arith $current - $age
 		major=$func_arith_result
-		versuffix="-$major"
+		versuffix=-$major
 		;;
 	      esac
 	      eval soname=\"$soname_spec\"
 	    else
-	      soname="$realname"
+	      soname=$realname
 	    fi
 
 	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
+	    soroot=$soname
 	    func_basename "$soroot"
-	    soname="$func_basename_result"
+	    soname=$func_basename_result
 	    func_stripname 'lib' '.dll' "$soname"
 	    newlib=libimp-$func_stripname_result.a
 
 	    # If the library has no export list, then create one now
 	    if test -f "$output_objdir/$soname-def"; then :
 	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_verbose "extracting exported symbol list from '$soname'"
 	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
 	    fi
 
 	    # Create $newlib
 	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
+	      func_verbose "generating import library for '$soname'"
 	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
 	    fi
 	    # make sure the library variables are pointing to the new library
@@ -6797,58 +8243,58 @@ func_mode_link ()
 	    linklib=$newlib
 	  fi # test -n "$old_archive_from_expsyms_cmds"
 
-	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    lib_linked=yes
 	    case $hardcode_action in
 	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
 		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
 		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
+		    *-*-unixware7*) add_dir=-L$dir ;;
 		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
+		    # if the lib is a (non-dlopened) module then we cannot
 		    # link against it, someone is ignoring the earlier warnings
 		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
+			 $GREP ": [^:]* bundle" >/dev/null; then
 		      if test "X$dlopenmodule" != "X$lib"; then
 			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
+			if test -z "$old_library"; then
 			  echo
 			  echo "*** And there doesn't seem to be a static archive available"
 			  echo "*** The link will probably fail, sorry"
 			else
-			  add="$dir/$old_library"
+			  add=$dir/$old_library
 			fi
 		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
+			add=$dir/$old_library
 		      fi
 		    fi
 		esac
-	      elif test "$hardcode_minus_L" = no; then
+	      elif test no = "$hardcode_minus_L"; then
 		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
+		*-*-sunos*) add_shlibpath=$dir ;;
 		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
 	      ;;
 	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
 		# Try looking first in the location we're being installed to.
 		if test -n "$inst_prefix_dir"; then
 		  case $libdir in
@@ -6857,10 +8303,10 @@ func_mode_link ()
 		      ;;
 		  esac
 		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
@@ -6868,7 +8314,7 @@ func_mode_link ()
 	    *) lib_linked=no ;;
 	    esac
 
-	    if test "$lib_linked" != yes; then
+	    if test yes != "$lib_linked"; then
 	      func_fatal_configuration "unsupported hardcode properties"
 	    fi
 
@@ -6878,15 +8324,15 @@ func_mode_link ()
 	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
 	      esac
 	    fi
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
 	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
 	    else
 	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
 	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
 		case :$finalize_shlibpath: in
 		*":$libdir:"*) ;;
 		*) func_append finalize_shlibpath "$libdir:" ;;
@@ -6895,33 +8341,33 @@ func_mode_link ()
 	    fi
 	  fi
 
-	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
 	      case :$finalize_shlibpath: in
 	      *":$libdir:"*) ;;
 	      *) func_append finalize_shlibpath "$libdir:" ;;
 	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
 	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
 	      else
-		add="$libdir/$linklib"
+		add=$libdir/$linklib
 	      fi
 	    else
 	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
+	      add_dir=-L$libdir
 	      # Try looking first in the location we're being installed to.
 	      if test -n "$inst_prefix_dir"; then
 		case $libdir in
@@ -6930,10 +8376,10 @@ func_mode_link ()
 		    ;;
 		esac
 	      fi
-	      add="-l$name"
+	      add=-l$name
 	    fi
 
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
 	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
 	    else
@@ -6941,43 +8387,43 @@ func_mode_link ()
 	      test -n "$add" && deplibs="$add $deplibs"
 	    fi
 	  fi
-	elif test "$linkmode" = prog; then
+	elif test prog = "$linkmode"; then
 	  # Here we assume that one of hardcode_direct or hardcode_minus_L
 	  # is not unsupported.  This is valid on all known static and
 	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
 	    compile_deplibs="$dir/$linklib $compile_deplibs"
 	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
 	  else
 	    compile_deplibs="-l$name -L$dir $compile_deplibs"
 	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
 	  fi
-	elif test "$build_libtool_libs" = yes; then
+	elif test yes = "$build_libtool_libs"; then
 	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
+	  if test pass_all != "$deplibs_check_method"; then
 	    # We're trying link a shared library against a static one
 	    # but the system doesn't support it.
 
 	    # Just print a warning and add the library to dependency_libs so
 	    # that the program can be linked against the static library.
 	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
 	    echo "*** I have the capability to make that library automatically link in when"
 	    echo "*** you link to this library.  But I can only do this if you have a"
 	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
+	    if test yes = "$module"; then
 	      echo "*** But as you try to build a module library, libtool will still create "
 	      echo "*** a static module, that should work as long as the dlopening application"
 	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
 	      if test -z "$global_symbol_pipe"; then
 		echo
 		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	      fi
-	      if test "$build_old_libs" = no; then
+	      if test no = "$build_old_libs"; then
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -6990,11 +8436,11 @@ func_mode_link ()
 	  fi
 	fi # link shared/static library?
 
-	if test "$linkmode" = lib; then
+	if test lib = "$linkmode"; then
 	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
 	    # Extract -R from dependency_libs
 	    temp_deplibs=
 	    for libdir in $dependency_libs; do
@@ -7008,12 +8454,12 @@ func_mode_link ()
 	      *) func_append temp_deplibs " $libdir";;
 	      esac
 	    done
-	    dependency_libs="$temp_deplibs"
+	    dependency_libs=$temp_deplibs
 	  fi
 
 	  func_append newlib_search_path " $absdir"
 	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
 	  # ... and its dependency_libs
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
@@ -7023,7 +8469,7 @@ func_mode_link ()
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
@@ -7032,12 +8478,12 @@ func_mode_link ()
 	    func_append tmp_libs " $func_resolve_sysroot_result"
 	  done
 
-	  if test "$link_all_deplibs" != no; then
+	  if test no != "$link_all_deplibs"; then
 	    # Add the search paths of all dependency libraries
 	    for deplib in $dependency_libs; do
 	      path=
 	      case $deplib in
-	      -L*) path="$deplib" ;;
+	      -L*) path=$deplib ;;
 	      *.la)
 	        func_resolve_sysroot "$deplib"
 	        deplib=$func_resolve_sysroot_result
@@ -7045,12 +8491,12 @@ func_mode_link ()
 		dir=$func_dirname_result
 		# We need an absolute path.
 		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
 		*)
 		  absdir=`cd "$dir" && pwd`
 		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
 		  fi
 		  ;;
 		esac
@@ -7058,35 +8504,35 @@ func_mode_link ()
 		case $host in
 		*-*-darwin*)
 		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
 		      depdepl=$tmp
 		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                       if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
-		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
 		      path=
 		    fi
 		  fi
 		  ;;
 		*)
-		  path="-L$absdir/$objdir"
+		  path=-L$absdir/$objdir
 		  ;;
 		esac
 		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
 		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
 		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
+		    func_warning "'$deplib' seems to be moved"
 
-		  path="-L$absdir"
+		  path=-L$absdir
 		fi
 		;;
 	      esac
@@ -7098,23 +8544,23 @@ func_mode_link ()
 	  fi # link_all_deplibs != no
 	fi # linkmode = lib
       done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
 	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
 	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
 	else
 	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	fi
       fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
 	# Link the dlpreopened libraries before other libraries
 	for deplib in $save_deplibs; do
 	  deplibs="$deplib $deplibs"
 	done
       fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
 	  # Make sure lib_search_path contains only unique directories.
 	  lib_search_path=
 	  for dir in $newlib_search_path; do
@@ -7124,12 +8570,12 @@ func_mode_link ()
 	    esac
 	  done
 	  newlib_search_path=
-	fi
+	}
 
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
+	if test prog,link = "$linkmode,$pass"; then
 	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
 	fi
 	for var in $vars dependency_libs; do
 	  # Add libraries to $var in reverse order
@@ -7187,62 +8633,93 @@ func_mode_link ()
 	  eval $var=\"$tmp_libs\"
 	done # for var
       fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
-      for i in $dependency_libs ; do
+      for i in $dependency_libs; do
 	case " $predeps $postdeps $compiler_lib_search_path " in
 	*" $i "*)
-	  i=""
+	  i=
 	  ;;
 	esac
-	if test -n "$i" ; then
+	if test -n "$i"; then
 	  func_append tmp_libs " $i"
 	fi
       done
       dependency_libs=$tmp_libs
     done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
     fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
     fi
 
     case $linkmode in
     oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+	func_warning "'-l' and '-L' are ignored for archives" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
+	func_warning "'-rpath' is ignored for archives"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
+	func_warning "'-R' is ignored for archives"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
+	func_warning "'-version-info/-version-number' is ignored for archives"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
+	func_warning "'-release' is ignored for archives"
 
       test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
+	func_warning "'-export-symbols' is ignored for archives"
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
-      oldlibs="$output"
+      oldlibs=$output
       func_append objs "$old_deplibs"
       ;;
 
     lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
+      # Make sure we only generate libraries of the form 'libNAME.la'.
       case $outputname in
       lib*)
 	func_stripname 'lib' '.la' "$outputname"
@@ -7251,10 +8728,10 @@ func_mode_link ()
 	eval libname=\"$libname_spec\"
 	;;
       *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
 
-	if test "$need_lib_prefix" != no; then
+	if test no != "$need_lib_prefix"; then
 	  # Add the "lib" prefix for modules if required
 	  func_stripname '' '.la' "$outputname"
 	  name=$func_stripname_result
@@ -7268,8 +8745,8 @@ func_mode_link ()
       esac
 
       if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
 	else
 	  echo
 	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
@@ -7278,21 +8755,21 @@ func_mode_link ()
 	fi
       fi
 
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
 
       set dummy $rpath
       shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
 
-      install_libdir="$1"
+      install_libdir=$1
 
       oldlibs=
       if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
+	if test yes = "$build_libtool_libs"; then
 	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
+	  # Some compilers have problems with a '.al' extension so
 	  # convenience libraries should have the same extension an
 	  # archive normally would.
 	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
@@ -7301,20 +8778,20 @@ func_mode_link ()
 	fi
 
 	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
 
 	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
+	  func_warning "'-release' is ignored for convenience libraries"
       else
 
 	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
+	save_ifs=$IFS; IFS=:
 	set dummy $vinfo 0 0 0
 	shift
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
+	  func_fatal_help "too many parameters to '-version-info'"
 
 	# convert absolute version numbers to libtool ages
 	# this retains compatibility with .la files and attempts
@@ -7322,45 +8799,45 @@ func_mode_link ()
 
 	case $vinfo_number in
 	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
 	  #
 	  # There are really only two kinds -- those that
 	  # use the current revision as the major version
 	  # and those that subtract age and use age as
 	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
+	  # that has an extra 1 added just for fun
 	  #
 	  case $version_type in
 	  # correct linux to gnu/linux during the next big refactor
-	  darwin|linux|osf|windows|none)
+	  darwin|freebsd-elf|linux|osf|windows|none)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
+	    age=$number_minor
+	    revision=$number_revision
 	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
 	    ;;
 	  irix|nonstopux)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
+	    age=$number_minor
+	    revision=$number_minor
 	    lt_irix_increment=no
 	    ;;
 	  *)
-	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    func_fatal_configuration "$modename: unknown library version type '$version_type'"
 	    ;;
 	  esac
 	  ;;
 	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
+	  current=$1
+	  revision=$2
+	  age=$3
 	  ;;
 	esac
 
@@ -7368,30 +8845,30 @@ func_mode_link ()
 	case $current in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $revision in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $age in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	fi
 
 	# Calculate the version variables.
@@ -7406,26 +8883,36 @@ func_mode_link ()
 	  # verstring for coding it into the library header
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  # Darwin ld doesn't like 0 for these options...
 	  func_arith $current + 1
 	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
 	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
 	  ;;
 
 	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
+	  if test no = "$lt_irix_increment"; then
 	    func_arith $current - $age
 	  else
 	    func_arith $current - $age + 1
@@ -7436,69 +8923,74 @@ func_mode_link ()
 	    nonstopux) verstring_prefix=nonstopux ;;
 	    *)         verstring_prefix=sgi ;;
 	  esac
-	  verstring="$verstring_prefix$major.$revision"
+	  verstring=$verstring_prefix$major.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$revision
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $revision - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
+	    verstring=$verstring_prefix$major.$iface:$verstring
 	  done
 
-	  # Before this point, $major must not contain `.'.
+	  # Before this point, $major must not contain '.'.
 	  major=.$major
-	  versuffix="$major.$revision"
+	  versuffix=$major.$revision
 	  ;;
 
 	linux) # correct to gnu/linux during the next big refactor
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	osf)
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$age
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $current - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
+	    verstring=$verstring:$iface.0
 	  done
 
 	  # Make executables depend on our current version.
-	  func_append verstring ":${current}.0"
+	  func_append verstring ":$current.0"
 	  ;;
 
 	qnx)
-	  major=".$current"
-	  versuffix=".$current"
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
 	  ;;
 
 	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	windows)
 	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
+	  # extension on DOS 8.3 file systems.
 	  func_arith $current - $age
 	  major=$func_arith_result
-	  versuffix="-$major"
+	  versuffix=-$major
 	  ;;
 
 	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  func_fatal_configuration "unknown library version type '$version_type'"
 	  ;;
 	esac
 
@@ -7512,42 +9004,45 @@ func_mode_link ()
 	    verstring=
 	    ;;
 	  *)
-	    verstring="0.0"
+	    verstring=0.0
 	    ;;
 	  esac
-	  if test "$need_version" = no; then
+	  if test no = "$need_version"; then
 	    versuffix=
 	  else
-	    versuffix=".0.0"
+	    versuffix=.0.0
 	  fi
 	fi
 
 	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
+	if test yes,no = "$avoid_version,$need_version"; then
 	  major=
 	  versuffix=
-	  verstring=""
+	  verstring=
 	fi
 
 	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
 	  fi
 	else
 	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
+	  allow_undefined_flag=$no_undefined_flag
 	fi
 
       fi
 
-      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_generate_dlsyms "$libname" "$libname" :
       func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
+      test " " = "$libobjs" && libobjs=
 
-      if test "$opt_mode" != relink; then
+      if test relink != "$opt_mode"; then
 	# Remove our outputs, but don't remove object files since they
 	# may have been created when compiling PIC objects.
 	removelist=
@@ -7556,8 +9051,8 @@ func_mode_link ()
 	  case $p in
 	    *.$objext | *.gcno)
 	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
 		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
 		 then
 		   continue
@@ -7573,11 +9068,11 @@ func_mode_link ()
       fi
 
       # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
 	func_append oldlibs " $output_objdir/$libname.$libext"
 
 	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
@@ -7598,13 +9093,13 @@ func_mode_link ()
 	  *) func_append finalize_rpath " $libdir" ;;
 	  esac
 	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
 	  dependency_libs="$temp_xrpath $dependency_libs"
 	fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
+      old_dlfiles=$dlfiles
       dlfiles=
       for lib in $old_dlfiles; do
 	case " $dlprefiles $dlfiles " in
@@ -7614,7 +9109,7 @@ func_mode_link ()
       done
 
       # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
+      old_dlprefiles=$dlprefiles
       dlprefiles=
       for lib in $old_dlprefiles; do
 	case "$dlprefiles " in
@@ -7623,7 +9118,7 @@ func_mode_link ()
 	esac
       done
 
-      if test "$build_libtool_libs" = yes; then
+      if test yes = "$build_libtool_libs"; then
 	if test -n "$rpath"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
@@ -7647,7 +9142,7 @@ func_mode_link ()
 	    ;;
 	  *)
 	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
+	    if test yes = "$build_libtool_need_lc"; then
 	      func_append deplibs " -lc"
 	    fi
 	    ;;
@@ -7663,9 +9158,9 @@ func_mode_link ()
 	# I'm not sure if I'm treating the release correctly.  I think
 	# release should show up in the -l (ie -lgmp5) so we don't want to
 	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
+	release=
+	versuffix=
+	major=
 	newdeplibs=
 	droppeddeps=no
 	case $deplibs_check_method in
@@ -7694,20 +9189,20 @@ EOF
 	      -l*)
 		func_stripname -l '' "$i"
 		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		  case " $predeps $postdeps " in
 		  *" $i "*)
 		    func_append newdeplibs " $i"
-		    i=""
+		    i=
 		    ;;
 		  esac
 		fi
-		if test -n "$i" ; then
+		if test -n "$i"; then
 		  libname=`eval "\\$ECHO \"$libname_spec\""`
 		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		  set dummy $deplib_matches; shift
 		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		    func_append newdeplibs " $i"
 		  else
 		    droppeddeps=yes
@@ -7737,20 +9232,20 @@ EOF
 		$opt_dry_run || $RM conftest
 		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
 		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		    case " $predeps $postdeps " in
 		    *" $i "*)
 		      func_append newdeplibs " $i"
-		      i=""
+		      i=
 		      ;;
 		    esac
 		  fi
-		  if test -n "$i" ; then
+		  if test -n "$i"; then
 		    libname=`eval "\\$ECHO \"$libname_spec\""`
 		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		    set dummy $deplib_matches; shift
 		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		      func_append newdeplibs " $i"
 		    else
 		      droppeddeps=yes
@@ -7787,24 +9282,24 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		if test -n "$file_magic_glob"; then
 		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
 		else
 		  libnameglob=$libname
 		fi
-		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  if test "$want_nocaseglob" = yes; then
+		  if test yes = "$want_nocaseglob"; then
 		    shopt -s nocaseglob
 		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
 		    $nocaseglob
@@ -7822,25 +9317,25 @@ EOF
 		      # We might still enter an endless loop, since a link
 		      # loop can be closed while we follow links,
 		      # but so what?
-		      potlib="$potent_lib"
+		      potlib=$potent_lib
 		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
 			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
 			esac
 		      done
 		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
 			 $SED -e 10q |
 			 $EGREP "$file_magic_regex" > /dev/null; then
 			func_append newdeplibs " $a_deplib"
-			a_deplib=""
+			a_deplib=
 			break 2
 		      fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7848,7 +9343,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7871,30 +9366,30 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
 		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    potlib=$potent_lib # see symlink-check above in file_magic test
 		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
 		       $EGREP "$match_pattern_regex" > /dev/null; then
 		      func_append newdeplibs " $a_deplib"
-		      a_deplib=""
+		      a_deplib=
 		      break 2
 		    fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7902,7 +9397,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7918,18 +9413,18 @@ EOF
 	  done # Gone through all deplibs.
 	  ;;
 	none | unknown | *)
-	  newdeplibs=""
+	  newdeplibs=
 	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
 	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
 	    done
 	  fi
 	  case $tmp_deplibs in
 	  *[!\	\ ]*)
 	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
+	    if test none = "$deplibs_check_method"; then
 	      echo "*** Warning: inter-library dependencies are not supported in this platform."
 	    else
 	      echo "*** Warning: inter-library dependencies are not known to be supported."
@@ -7953,8 +9448,8 @@ EOF
 	  ;;
 	esac
 
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
 	    echo
 	    echo "*** Warning: libtool could not satisfy all declared inter-library"
 	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
@@ -7963,12 +9458,12 @@ EOF
 	    if test -z "$global_symbol_pipe"; then
 	      echo
 	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
 	      build_libtool_libs=module
 	      build_old_libs=yes
 	    else
@@ -7979,14 +9474,14 @@ EOF
 	    echo "*** automatically added whenever a program is linked with this library"
 	    echo "*** or is declared to -dlopen it."
 
-	    if test "$allow_undefined" = no; then
+	    if test no = "$allow_undefined"; then
 	      echo
 	      echo "*** Since this library must not contain undefined symbols,"
 	      echo "*** because either the platform does not support them or"
 	      echo "*** it was explicitly requested with -no-undefined,"
 	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -8032,7 +9527,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      deplibs="$new_libs"
+      deplibs=$new_libs
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
@@ -8040,25 +9535,25 @@ EOF
       dlname=
 
       # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	# Remove ${wl} instances when linking with ld.
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
 	# FIXME: should test the right _cmds variable.
 	case $archive_cmds in
 	  *\$LD\ *) wl= ;;
         esac
-	if test "$hardcode_into_libs" = yes; then
+	if test yes = "$hardcode_into_libs"; then
 	  # Hardcode the library paths
 	  hardcode_libdirs=
 	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
 	  for libdir in $rpath; do
 	    if test -n "$hardcode_libdir_flag_spec"; then
 	      if test -n "$hardcode_libdir_separator"; then
 		func_replace_sysroot "$libdir"
 		libdir=$func_replace_sysroot_result
 		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
+		  hardcode_libdirs=$libdir
 		else
 		  # Just accumulate the unique libdirs.
 		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8083,7 +9578,7 @@ EOF
 	  # Substitute the hardcoded libdirs into the rpath.
 	  if test -n "$hardcode_libdir_separator" &&
 	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
+	    libdir=$hardcode_libdirs
 	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
 	  fi
 	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
@@ -8097,8 +9592,8 @@ EOF
 	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
 	fi
 
-	shlibpath="$finalize_shlibpath"
-	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
 	if test -n "$shlibpath"; then
 	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
 	fi
@@ -8108,19 +9603,19 @@ EOF
 	eval library_names=\"$library_names_spec\"
 	set dummy $library_names
 	shift
-	realname="$1"
+	realname=$1
 	shift
 
 	if test -n "$soname_spec"; then
 	  eval soname=\"$soname_spec\"
 	else
-	  soname="$realname"
+	  soname=$realname
 	fi
 	if test -z "$dlname"; then
 	  dlname=$soname
 	fi
 
-	lib="$output_objdir/$realname"
+	lib=$output_objdir/$realname
 	linknames=
 	for link
 	do
@@ -8134,7 +9629,7 @@ EOF
 	delfiles=
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
 	  func_append delfiles " $export_symbols"
 	fi
 
@@ -8143,31 +9638,31 @@ EOF
 	cygwin* | mingw* | cegcc*)
 	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
 	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	    func_dll_def_p "$export_symbols" || {
 	      # and it's NOT already a .def file. Must figure out
 	      # which of the given symbols are data symbols and tag
 	      # them as such. So, trigger use of export_symbols_cmds.
 	      # export_symbols gets reassigned inside the "prepare
 	      # the list of exported symbols" if statement, so the
 	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
+	      orig_export_symbols=$export_symbols
 	      export_symbols=
 	      always_export_symbols=yes
-	    fi
+	    }
 	  fi
 	  ;;
 	esac
 
 	# Prepare the list of exported symbols
 	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
 	    $opt_dry_run || $RM $export_symbols
 	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd1 in $cmds; do
-	      IFS="$save_ifs"
+	      IFS=$save_ifs
 	      # Take the normal branch if the nm_file_list_spec branch
 	      # doesn't work or if tool conversion is not needed.
 	      case $nm_file_list_spec~$to_tool_file_cmd in
@@ -8181,7 +9676,7 @@ EOF
 		  try_normal_branch=no
 		  ;;
 	      esac
-	      if test "$try_normal_branch" = yes \
+	      if test yes = "$try_normal_branch" \
 		 && { test "$len" -lt "$max_cmd_len" \
 		      || test "$max_cmd_len" -le -1; }
 	      then
@@ -8192,7 +9687,7 @@ EOF
 		output_la=$func_basename_result
 		save_libobjs=$libobjs
 		save_output=$output
-		output=${output_objdir}/${output_la}.nm
+		output=$output_objdir/$output_la.nm
 		func_to_tool_file "$output"
 		libobjs=$nm_file_list_spec$func_to_tool_file_result
 		func_append delfiles " $output"
@@ -8215,8 +9710,8 @@ EOF
 		break
 	      fi
 	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
@@ -8224,16 +9719,16 @@ EOF
 	fi
 
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	fi
 
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
 	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
 	  # though. Also, the filter scales superlinearly with the number of
 	  # global variables. join(1) would be nice here, but unfortunately
 	  # isn't a blessed tool.
@@ -8252,11 +9747,11 @@ EOF
 	    ;;
 	  esac
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
 
 	if test -n "$convenience"; then
 	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
+	    test yes = "$compiler_needs_object" &&
 	    test -z "$libobjs"; then
 	    # extract the archives, so we have objects to list.
 	    # TODO: could optimize this to just extract one archive.
@@ -8267,7 +9762,7 @@ EOF
 	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
 	    test "X$libobjs" = "X " && libobjs=
 	  else
-	    gentop="$output_objdir/${outputname}x"
+	    gentop=$output_objdir/${outputname}x
 	    func_append generated " $gentop"
 
 	    func_extract_archives $gentop $convenience
@@ -8276,18 +9771,18 @@ EOF
 	  fi
 	fi
 
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
 	  eval flag=\"$thread_safe_flag_spec\"
 	  func_append linker_flags " $flag"
 	fi
 
 	# Make a backup of the uninstalled library when relinking
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
 	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
+	if test yes = "$module" && test -n "$module_cmds"; then
 	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	    eval test_cmds=\"$module_expsym_cmds\"
 	    cmds=$module_expsym_cmds
@@ -8305,7 +9800,7 @@ EOF
 	  fi
 	fi
 
-	if test "X$skipped_export" != "X:" &&
+	if test : != "$skipped_export" &&
 	   func_len " $test_cmds" &&
 	   len=$func_len_result &&
 	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
@@ -8338,8 +9833,8 @@ EOF
 	  last_robj=
 	  k=1
 
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
 	    func_verbose "creating GNU ld script: $output"
 	    echo 'INPUT (' > $output
 	    for obj in $save_libobjs
@@ -8351,14 +9846,14 @@ EOF
 	    func_append delfiles " $output"
 	    func_to_tool_file "$output"
 	    output=$func_to_tool_file_result
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
 	    func_verbose "creating linker input file list: $output"
 	    : > $output
 	    set x $save_libobjs
 	    shift
 	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
+	    if test yes = "$compiler_needs_object"; then
 	      firstobj="$1 "
 	      shift
 	    fi
@@ -8373,7 +9868,7 @@ EOF
 	  else
 	    if test -n "$save_libobjs"; then
 	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
+	      output=$output_objdir/$output_la-$k.$objext
 	      eval test_cmds=\"$reload_cmds\"
 	      func_len " $test_cmds"
 	      len0=$func_len_result
@@ -8385,13 +9880,13 @@ EOF
 		func_len " $obj"
 		func_arith $len + $func_len_result
 		len=$func_arith_result
-		if test "X$objlist" = X ||
+		if test -z "$objlist" ||
 		   test "$len" -lt "$max_cmd_len"; then
 		  func_append objlist " $obj"
 		else
 		  # The command $test_cmds is almost too long, add a
 		  # command to the queue.
-		  if test "$k" -eq 1 ; then
+		  if test 1 -eq "$k"; then
 		    # The first file doesn't have a previous command to add.
 		    reload_objs=$objlist
 		    eval concat_cmds=\"$reload_cmds\"
@@ -8401,10 +9896,10 @@ EOF
 		    reload_objs="$objlist $last_robj"
 		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
 		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  last_robj=$output_objdir/$output_la-$k.$objext
 		  func_arith $k + 1
 		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
+		  output=$output_objdir/$output_la-$k.$objext
 		  objlist=" $obj"
 		  func_len " $last_robj"
 		  func_arith $len0 + $func_len_result
@@ -8416,9 +9911,9 @@ EOF
 	      # files will link in the last one created.
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
 	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
 	      func_append delfiles " $output"
 
@@ -8426,9 +9921,9 @@ EOF
 	      output=
 	    fi
 
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
 	      $opt_dry_run || $RM $export_symbols
 	      libobjs=$output
 	      # Append the command to create the export file.
@@ -8437,16 +9932,16 @@ EOF
 	      if test -n "$last_robj"; then
 		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
-	    fi
+	    }
 
 	    test -n "$save_libobjs" &&
 	      func_verbose "creating a temporary reloadable object file: $output"
 
 	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
+	      IFS=$save_ifs
+	      $opt_quiet || {
 		  func_quote_for_expand "$cmd"
 		  eval "func_echo $func_quote_for_expand_result"
 	      }
@@ -8454,7 +9949,7 @@ EOF
 		lt_exit=$?
 
 		# Restore the uninstalled library and exit
-		if test "$opt_mode" = relink; then
+		if test relink = "$opt_mode"; then
 		  ( cd "$output_objdir" && \
 		    $RM "${realname}T" && \
 		    $MV "${realname}U" "$realname" )
@@ -8463,7 +9958,7 @@ EOF
 		exit $lt_exit
 	      }
 	    done
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 
 	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
@@ -8471,18 +9966,18 @@ EOF
 	    fi
 	  fi
 
-          if ${skipped_export-false}; then
+          ${skipped_export-false} && {
 	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	    fi
 
 	    if test -n "$orig_export_symbols"; then
 	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
 	      # though. Also, the filter scales superlinearly with the number of
 	      # global variables. join(1) would be nice here, but unfortunately
 	      # isn't a blessed tool.
@@ -8491,7 +9986,7 @@ EOF
 	      export_symbols=$output_objdir/$libname.def
 	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	    fi
-	  fi
+	  }
 
 	  libobjs=$output
 	  # Restore the value of output.
@@ -8505,7 +10000,7 @@ EOF
 	  # value of $libobjs for piecewise linking.
 
 	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test yes = "$module" && test -n "$module_cmds"; then
 	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	      cmds=$module_expsym_cmds
 	    else
@@ -8527,7 +10022,7 @@ EOF
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -8535,11 +10030,12 @@ EOF
 	  test "X$libobjs" = "X " && libobjs=
 	fi
 
-	save_ifs="$IFS"; IFS='~'
+	save_ifs=$IFS; IFS='~'
 	for cmd in $cmds; do
-	  IFS="$save_ifs"
+	  IFS=$sp$nl
 	  eval cmd=\"$cmd\"
-	  $opt_silent || {
+	  IFS=$save_ifs
+	  $opt_quiet || {
 	    func_quote_for_expand "$cmd"
 	    eval "func_echo $func_quote_for_expand_result"
 	  }
@@ -8547,7 +10043,7 @@ EOF
 	    lt_exit=$?
 
 	    # Restore the uninstalled library and exit
-	    if test "$opt_mode" = relink; then
+	    if test relink = "$opt_mode"; then
 	      ( cd "$output_objdir" && \
 	        $RM "${realname}T" && \
 		$MV "${realname}U" "$realname" )
@@ -8556,10 +10052,10 @@ EOF
 	    exit $lt_exit
 	  }
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	# Restore the uninstalled library and exit
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
 	  if test -n "$convenience"; then
@@ -8579,39 +10075,39 @@ EOF
 	done
 
 	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
+	if test yes = "$module" || test yes = "$export_dynamic"; then
 	  # On all known operating systems, these are identical.
-	  dlname="$soname"
+	  dlname=$soname
 	fi
       fi
       ;;
 
     obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+	func_warning "'-l' and '-L' are ignored for objects" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
+	func_warning "'-rpath' is ignored for objects"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
+	func_warning "'-R' is ignored for objects"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
+	func_warning "'-version-info' is ignored for objects"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
+	func_warning "'-release' is ignored for objects"
 
       case $output in
       *.lo)
 	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
 
 	libobj=$output
 	func_lo2o "$libobj"
@@ -8619,7 +10115,7 @@ EOF
 	;;
       *)
 	libobj=
-	obj="$output"
+	obj=$output
 	;;
       esac
 
@@ -8632,17 +10128,19 @@ EOF
       # the extraction.
       reload_conv_objs=
       gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
       if test -n "$convenience"; then
 	if test -n "$whole_archive_flag_spec"; then
 	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
 	else
-	  gentop="$output_objdir/${obj}x"
+	  gentop=$output_objdir/${obj}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $convenience
@@ -8651,12 +10149,12 @@ EOF
       fi
 
       # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
 
       # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
 
-      output="$obj"
+      output=$obj
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
@@ -8668,7 +10166,7 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$build_libtool_libs" != yes; then
+      test yes = "$build_libtool_libs" || {
 	if test -n "$gentop"; then
 	  func_show_eval '${RM}r "$gentop"'
 	fi
@@ -8678,12 +10176,12 @@ EOF
 	# $show "echo timestamp > $libobj"
 	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
 	exit $EXIT_SUCCESS
-      fi
+      }
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
 	# Only do commands if we really have different PIC objects.
 	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
+	output=$libobj
 	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
@@ -8700,16 +10198,14 @@ EOF
 	          output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
+	func_warning "'-version-info' is ignored for programs"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
+	func_warning "'-release' is ignored for programs"
 
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
@@ -8723,11 +10219,11 @@ EOF
       *-*-darwin*)
 	# Don't allow lazy linking, it breaks C++ global constructors
 	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
+	if test CXX = "$tagname"; then
 	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
 	    10.[0123])
-	      func_append compile_command " ${wl}-bind_at_load"
-	      func_append finalize_command " ${wl}-bind_at_load"
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
 	    ;;
 	  esac
 	fi
@@ -8763,7 +10259,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      compile_deplibs="$new_libs"
+      compile_deplibs=$new_libs
 
 
       func_append compile_command " $compile_deplibs"
@@ -8787,7 +10283,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8810,7 +10306,7 @@ EOF
 	fi
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$libdir:"*) ;;
 	  ::) dllsearchpath=$libdir;;
@@ -8827,10 +10323,10 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      compile_rpath="$rpath"
+      compile_rpath=$rpath
 
       rpath=
       hardcode_libdirs=
@@ -8838,7 +10334,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8863,45 +10359,43 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      finalize_rpath="$rpath"
+      finalize_rpath=$rpath
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
 	# Transform all the library objects into standard objects.
 	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
 	func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
-      wrappers_required=yes
+      wrappers_required=:
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
+        wrappers_required=false
         ;;
       *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
+        test yes = "$build_libtool_libs" || wrappers_required=false
         ;;
       *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
         fi
         ;;
       esac
-      if test "$wrappers_required" = no; then
+      $wrappers_required || {
 	# Replace the output file specification.
 	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
+	link_command=$compile_command$compile_rpath
 
 	# We have no uninstalled library dependencies, so finalize right now.
 	exit_status=0
@@ -8914,12 +10408,12 @@ EOF
 	fi
 
 	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
 	fi
 
 	exit $exit_status
-      fi
+      }
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
 	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
@@ -8949,9 +10443,9 @@ EOF
 	fi
       fi
 
-      if test "$no_install" = yes; then
+      if test yes = "$no_install"; then
 	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
+	link_command=$compile_var$compile_command$compile_rpath
 	# Replace the output file specification.
 	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
 	# Delete the old output file.
@@ -8968,27 +10462,28 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
 
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
@@ -9045,8 +10540,8 @@ EOF
 	    func_dirname_and_basename "$output" "" "."
 	    output_name=$func_basename_result
 	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
 	    $RM $cwrappersource $cwrapper
 	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
@@ -9067,7 +10562,7 @@ EOF
 	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
 	    $opt_dry_run || {
 	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
+	      if test "x$build" = "x$host"; then
 		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
 		func_emit_wrapper no > $func_ltwrapper_scriptname_result
@@ -9090,25 +10585,27 @@ EOF
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
 	  build_libtool_libs=no
-	else
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
 	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    func_append oldobjs " $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
 
       if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
+	gentop=$output_objdir/${outputname}x
 	func_append generated " $gentop"
 
 	func_extract_archives $gentop $addlibs
@@ -9116,13 +10613,13 @@ EOF
       fi
 
       # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
 	cmds=$old_archive_from_new_cmds
       else
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -9143,7 +10640,7 @@ EOF
 	  :
 	else
 	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 	  func_mkdir_p "$gentop"
 	  save_oldobjs=$oldobjs
@@ -9152,7 +10649,7 @@ EOF
 	  for obj in $save_oldobjs
 	  do
 	    func_basename "$obj"
-	    objbase="$func_basename_result"
+	    objbase=$func_basename_result
 	    case " $oldobjs " in
 	    " ") oldobjs=$obj ;;
 	    *[\ /]"$objbase "*)
@@ -9221,18 +10718,18 @@ EOF
 	    else
 	      # the above command should be used before it gets too long
 	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
+	      if test "$obj" = "$last_oldobj"; then
 		RANLIB=$save_RANLIB
 	      fi
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
 	      objlist=
 	      len=$len0
 	    fi
 	  done
 	  RANLIB=$save_RANLIB
 	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
+	  if test -z "$oldobjs"; then
 	    eval cmds=\"\$concat_cmds\"
 	  else
 	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
@@ -9249,7 +10746,7 @@ EOF
     case $output in
     *.la)
       old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      test yes = "$build_old_libs" && old_library=$libname.$libext
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
@@ -9264,31 +10761,31 @@ EOF
 	fi
       done
       # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
+      if test yes = "$hardcode_automatic"; then
 	relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
 	for installed in no yes; do
-	  if test "$installed" = yes; then
+	  if test yes = "$installed"; then
 	    if test -z "$install_libdir"; then
 	      break
 	    fi
-	    output="$output_objdir/$outputname"i
+	    output=$output_objdir/${outputname}i
 	    # Replace all uninstalled libtool libraries with the installed ones
 	    newdependency_libs=
 	    for deplib in $dependency_libs; do
 	      case $deplib in
 	      *.la)
 		func_basename "$deplib"
-		name="$func_basename_result"
+		name=$func_basename_result
 		func_resolve_sysroot "$deplib"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
 		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      -L*)
@@ -9304,23 +10801,23 @@ EOF
 	      *) func_append newdependency_libs " $deplib" ;;
 	      esac
 	    done
-	    dependency_libs="$newdependency_libs"
+	    dependency_libs=$newdependency_libs
 	    newdlfiles=
 
 	    for lib in $dlfiles; do
 	      case $lib in
 	      *.la)
 	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      *) func_append newdlfiles " $lib" ;;
 	      esac
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
@@ -9330,34 +10827,34 @@ EOF
 		# didn't already link the preopened objects directly into
 		# the library:
 		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      esac
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  else
 	    newdlfiles=
 	    for lib in $dlfiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlfiles " $abs"
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlprefiles " $abs"
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  fi
 	  $RM $output
 	  # place dlname in correct position for cygwin
@@ -9373,10 +10870,9 @@ EOF
 	  case $host,$output,$installed,$module,$dlname in
 	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
 	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
+	      if test -n "$bindir"; then
 		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
+		tdlname=$func_relative_path_result/$dlname
 	      else
 		# Otherwise fall back on heuristic.
 		tdlname=../bin/$dlname
@@ -9385,7 +10881,7 @@ EOF
 	  esac
 	  $ECHO > $output "\
 # $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -9399,7 +10895,7 @@ library_names='$library_names'
 # The name of the static archive.
 old_library='$old_library'
 
-# Linker flags that can not go in dependency_libs.
+# Linker flags that cannot go in dependency_libs.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
@@ -9425,7 +10921,7 @@ dlpreopen='$dlprefiles'
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
+	  if test no,yes = "$installed,$need_relink"; then
 	    $ECHO >> $output "\
 relink_command=\"$relink_command\""
 	  fi
@@ -9440,27 +10936,29 @@ relink_command=\"$relink_command\""
     exit $EXIT_SUCCESS
 }
 
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
-    $opt_debug
-    RM="$nonopt"
+    $debug_cmd
+
+    RM=$nonopt
     files=
-    rmforce=
+    rmforce=false
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     for arg
     do
       case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
+      -f) func_append RM " $arg"; rmforce=: ;;
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
@@ -9473,18 +10971,18 @@ func_mode_uninstall ()
 
     for file in $files; do
       func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	odir="$objdir"
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
       else
-	odir="$dir/$objdir"
+	odir=$dir/$objdir
       fi
       func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
 
       # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
+      if test clean = "$opt_mode"; then
 	case " $rmdirs " in
 	  *" $odir "*) ;;
 	  *) func_append rmdirs " $odir" ;;
@@ -9499,11 +10997,11 @@ func_mode_uninstall ()
       elif test -d "$file"; then
 	exit_status=1
 	continue
-      elif test "$rmforce" = yes; then
+      elif $rmforce; then
 	continue
       fi
 
-      rmfiles="$file"
+      rmfiles=$file
 
       case $name in
       *.la)
@@ -9517,7 +11015,7 @@ func_mode_uninstall ()
 	  done
 	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
-	  case "$opt_mode" in
+	  case $opt_mode in
 	  clean)
 	    case " $library_names " in
 	    *" $dlname "*) ;;
@@ -9528,12 +11026,12 @@ func_mode_uninstall ()
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
@@ -9549,21 +11047,19 @@ func_mode_uninstall ()
 	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
+	  if test -n "$pic_object" && test none != "$pic_object"; then
 	    func_append rmfiles " $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
 	    func_append rmfiles " $dir/$non_pic_object"
 	  fi
 	fi
 	;;
 
       *)
-	if test "$opt_mode" = clean ; then
+	if test clean = "$opt_mode"; then
 	  noexename=$name
 	  case $file in
 	  *.exe)
@@ -9590,12 +11086,12 @@ func_mode_uninstall ()
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
-	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
 	      func_append rmfiles " $odir/lt-$name"
 	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
 	    fi
 	  fi
 	fi
@@ -9604,7 +11100,7 @@ func_mode_uninstall ()
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
-    # Try to remove the ${objdir}s in the directories where we deleted files
+    # Try to remove the $objdir's in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
 	func_show_eval "rmdir $dir >/dev/null 2>&1"
@@ -9614,16 +11110,17 @@ func_mode_uninstall ()
     exit $exit_status
 }
 
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
 
 test -z "$opt_mode" && {
-  help="$generic_help"
+  help=$generic_help
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
+  func_fatal_help "invalid operation mode '$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
@@ -9634,7 +11131,7 @@ exit $exit_status
 
 
 # The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
+# where we disable both kinds of libraries.  Given conflicting
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
@@ -9657,5 +11154,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # mode:shell-script
 # sh-indentation:2
 # End:
-# vi:sw=2
-
diff --git a/src/gmock/build-aux/missing b/src/gmock/build-aux/missing
index db98974..f62bbae 100755
--- a/src/gmock/build-aux/missing
+++ b/src/gmock/build-aux/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/src/gmock/build-aux/test-driver b/src/gmock/build-aux/test-driver
index d306056..8e575b0 100755
--- a/src/gmock/build-aux/test-driver
+++ b/src/gmock/build-aux/test-driver
@@ -3,7 +3,7 @@
 
 scriptversion=2013-07-13.22; # UTC
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -106,11 +106,14 @@ trap "st=143; $do_exit" 15
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
+
 if test $enable_hard_errors = no && test $estatus -eq 99; then
-  estatus=1
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
 fi
 
-case $estatus:$expect_failure in
+case $tweaked_estatus:$expect_failure in
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
@@ -119,6 +122,12 @@ case $estatus:$expect_failure in
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 
diff --git a/src/gmock/configure b/src/gmock/configure
index 04e603a..be52680 100755
--- a/src/gmock/configure
+++ b/src/gmock/configure
@@ -655,6 +655,7 @@ HAVE_PYTHON_TRUE
 PYTHON
 CXXCPP
 CPP
+LT_SYS_LIBRARY_PATH
 OTOOL64
 OTOOL
 LIPO
@@ -753,6 +754,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -781,6 +783,7 @@ enable_shared
 enable_static
 with_pic
 enable_fast_install
+with_aix_soname
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
@@ -799,6 +802,7 @@ CPPFLAGS
 CXX
 CXXFLAGS
 CCC
+LT_SYS_LIBRARY_PATH
 CPP
 CXXCPP
 GTEST_CONFIG
@@ -845,6 +849,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1097,6 +1102,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1234,7 +1248,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1387,6 +1401,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1447,9 +1462,12 @@ Optional Packages:
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
   --with-pthreads         use pthreads (default is yes)
   --with-gtest            Specifies how to find the gtest package. If no
                           arguments are given, the default behavior, a system
@@ -1468,6 +1486,8 @@ Some influential environment variables:
               you have headers in a nonstandard directory <include dir>
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
   CPP         C preprocessor
   CXXCPP      C++ preprocessor
   GTEST_CONFIG
@@ -2338,7 +2358,7 @@ ac_config_files="$ac_config_files scripts/gmock-config"
 # Initialize Automake with various options. We require at least v1.9, prevent
 # pedantic complaints about package files, and enable various distribution
 # targets.
-am__api_version='1.14'
+am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -2510,8 +2530,8 @@ test "$program_suffix" != NONE &&
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
@@ -2530,7 +2550,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -2858,8 +2878,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -2917,6 +2937,7 @@ END
   fi
 fi
 
+
 # Check for programs used in building Google Test.
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -4356,8 +4377,8 @@ esac
 
 
 
-macro_version='2.4.2'
-macro_revision='1.3337'
+macro_version='2.4.6'
+macro_revision='2.4.6'
 
 
 
@@ -4371,7 +4392,7 @@ macro_revision='1.3337'
 
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
@@ -4491,7 +4512,7 @@ func_echo_all ()
     $ECHO ""
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
 $as_echo "printf" >&6; } ;;
   print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
@@ -4814,19 +4835,19 @@ test -z "$GREP" && GREP=grep
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -4840,7 +4861,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -4851,7 +4872,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -4862,32 +4883,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -4930,33 +4951,38 @@ if ${lt_cv_path_NM+:} false; then :
 else
   if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -4967,15 +4993,15 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
 $as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
@@ -5081,9 +5107,9 @@ esac
   fi
 fi
 
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -5091,8 +5117,8 @@ fi
     esac
   fi
 
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -5143,7 +5169,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then :
   $as_echo_n "(cached) " >&6
 else
     i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -5183,7 +5209,7 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -5234,22 +5260,22 @@ else
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-	test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -5267,7 +5293,7 @@ else
 
 fi
 
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
 $as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
@@ -5285,30 +5311,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
@@ -5431,13 +5433,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -5565,13 +5567,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[4-9]*)
@@ -5598,8 +5600,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -5695,8 +5696,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
@@ -5749,6 +5750,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 
 fi
@@ -5906,8 +5910,8 @@ else
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -5919,7 +5923,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 
@@ -6074,7 +6078,7 @@ if ac_fn_cxx_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
@@ -6082,7 +6086,7 @@ if ac_fn_cxx_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -6095,7 +6099,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
 $as_echo "$lt_cv_ar_at_file" >&6; }
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -6312,7 +6316,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -6402,7 +6406,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[ABCDEGRST]'
   fi
   ;;
@@ -6435,14 +6439,44 @@ case `$NM -V 2>&1` in
   symcode='[ABCDGIRSTW]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -6460,21 +6494,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -6522,11 +6559,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
@@ -6552,7 +6589,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -6572,13 +6609,13 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
 	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -6599,7 +6636,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -6652,6 +6689,16 @@ fi
 
 
 
+
+
+
+
+
+
+
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
 $as_echo_n "checking for sysroot... " >&6; }
 
@@ -6664,9 +6711,9 @@ fi
 
 
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -6676,8 +6723,8 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
    as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
    ;;
 esac
@@ -6689,19 +6736,100 @@ $as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
 
 # Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then :
   enableval=$enable_libtool_lock;
 fi
 
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -6710,24 +6838,25 @@ ia64-*-hpux*)
   test $ac_status = 0; }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -6756,9 +6885,50 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -6781,10 +6951,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 		;;
 	    esac
 	    ;;
-	  powerpc64le-*)
+	  powerpc64le-*linux*)
 	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  powerpc64-*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -6803,10 +6973,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  powerpcle-*)
+	  powerpcle-*linux*)
 	    LD="${LD-ld} -m elf64lppc"
 	    ;;
-	  powerpc-*)
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -6824,7 +6994,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
 $as_echo_n "checking whether the C compiler needs -belf... " >&6; }
@@ -6864,13 +7034,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
 $as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -6882,7 +7053,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -6891,7 +7062,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -6907,7 +7078,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
@@ -7018,7 +7189,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
 $as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 
@@ -7521,7 +7692,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -7539,7 +7710,7 @@ else
 	  cat conftest.err >&5
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&5
@@ -7578,7 +7749,7 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
@@ -7607,7 +7778,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&5
@@ -7620,32 +7791,32 @@ fi
 $as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -7653,6 +7824,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
     ;;
   esac
 
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -7937,9 +8143,9 @@ done
 
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
   esac
 } # func_stripname_cnf
 
@@ -7966,14 +8172,14 @@ if test "${enable_shared+set}" = set; then :
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -7997,14 +8203,14 @@ if test "${enable_static+set}" = set; then :
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8028,14 +8234,14 @@ if test "${with_pic+set}" = set; then :
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8043,8 +8249,6 @@ else
 fi
 
 
-test -z "$pic_mode" && pic_mode=default
-
 
 
 
@@ -8060,14 +8264,14 @@ if test "${enable_fast_install+set}" = set; then :
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8081,11 +8285,63 @@ fi
 
 
 
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
 
 
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -8134,7 +8390,7 @@ test -z "$LN_S" && LN_S="ln -s"
 
 
 
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -8173,7 +8429,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -8184,14 +8440,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -8200,15 +8456,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
 test -z "$LD" && LD=ld
 test -z "$ac_objext" && ac_objext=o
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
 # Only perform the check for file, if the check method requires it
@@ -8223,22 +8472,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8261,13 +8510,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8289,22 +8538,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8327,13 +8576,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8354,7 +8603,7 @@ esac
 
 # Use C for the default configuration in the libtool script
 
-lt_save_CC="$CC"
+lt_save_CC=$CC
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -8412,7 +8661,7 @@ if test -n "$compiler"; then
 
 lt_prog_compiler_no_builtin_flag=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
@@ -8428,7 +8677,7 @@ else
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -8458,7 +8707,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
     :
@@ -8476,17 +8725,18 @@ lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
 
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     lt_prog_compiler_wl='-Wl,'
     lt_prog_compiler_static='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       fi
+      lt_prog_compiler_pic='-fPIC'
       ;;
 
     amigaos*)
@@ -8497,8 +8747,8 @@ lt_prog_compiler_static=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -8514,6 +8764,11 @@ lt_prog_compiler_static=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -8584,7 +8839,7 @@ lt_prog_compiler_static=
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       else
@@ -8592,10 +8847,29 @@ lt_prog_compiler_static=
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -8611,7 +8885,7 @@ lt_prog_compiler_static=
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      lt_prog_compiler_static='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -8622,7 +8896,7 @@ lt_prog_compiler_static=
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	lt_prog_compiler_wl='-Wl,'
 	lt_prog_compiler_pic='-KPIC'
@@ -8647,6 +8921,12 @@ lt_prog_compiler_static=
 	lt_prog_compiler_pic='-PIC'
 	lt_prog_compiler_static='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -8744,7 +9024,7 @@ lt_prog_compiler_static=
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	lt_prog_compiler_pic='-Kconform_pic'
 	lt_prog_compiler_static='-Bstatic'
       fi
@@ -8773,7 +9053,7 @@ lt_prog_compiler_static=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic=
     ;;
@@ -8805,7 +9085,7 @@ else
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -8835,7 +9115,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
     case $lt_prog_compiler_pic in
      "" | " "*) ;;
      *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
@@ -8867,7 +9147,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -8886,13 +9166,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
 $as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works"; then
     :
 else
     lt_prog_compiler_static=
@@ -9012,8 +9292,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -9025,9 +9305,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -9070,9 +9350,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # included in the symbol list
   include_expsyms=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -9087,7 +9367,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -9095,7 +9375,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -9108,7 +9388,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -9130,24 +9410,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       whole_archive_flag_spec=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -9160,7 +9440,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
@@ -9179,7 +9459,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9195,7 +9475,7 @@ _LT_EOF
 	allow_undefined_flag=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9205,7 +9485,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
@@ -9213,61 +9493,89 @@ _LT_EOF
       exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	ld_shlibs=no
       fi
       ;;
 
     haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       link_all_deplibs=yes
       ;;
 
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -9278,42 +9586,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  whole_archive_flag_spec=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
 	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -9327,8 +9640,8 @@ _LT_EOF
 	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -9346,8 +9659,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9359,7 +9672,7 @@ _LT_EOF
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -9374,9 +9687,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    ld_shlibs=no
 	  fi
@@ -9393,15 +9706,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
       ;;
     esac
 
-    if test "$ld_shlibs" = no; then
+    if test no = "$ld_shlibs"; then
       runpath_var=
       hardcode_libdir_flag_spec=
       export_dynamic_flag_spec=
@@ -9417,7 +9730,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	hardcode_direct=unsupported
@@ -9425,34 +9738,57 @@ _LT_EOF
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -9471,13 +9807,21 @@ _LT_EOF
       hardcode_direct_absolute=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[012]|aix4.[012].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -9496,36 +9840,42 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
-	link_all_deplibs=no
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      export_dynamic_flag_spec='${wl}-bexpall'
+      export_dynamic_flag_spec='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
+        if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -9560,7 +9910,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -9568,17 +9918,17 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
 	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
+	 if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -9613,7 +9963,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -9621,21 +9971,33 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    whole_archive_flag_spec='$convenience'
 	  fi
 	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) >  [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -9644,7 +10006,7 @@ fi
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9674,16 +10036,17 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
 	enable_shared_with_static_runtimes=yes
@@ -9692,18 +10055,18 @@ fi
 	# Don't use ranlib
 	old_postinstall_cmds='chmod 644 $oldlib'
 	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -9712,7 +10075,7 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -9731,24 +10094,24 @@ fi
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec=''
   fi
   link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
+  allow_undefined_flag=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
 
   else
   ld_shlibs=no
@@ -9790,33 +10153,33 @@ fi
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_direct=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
+      export_dynamic_flag_spec='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 	hardcode_direct=yes
 	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
+	export_dynamic_flag_spec='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	hardcode_minus_L=yes
@@ -9824,25 +10187,25 @@ fi
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 
@@ -9854,7 +10217,7 @@ if ${lt_cv_prog_compiler__b+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -b"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -9873,14 +10236,14 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
 $as_echo "$lt_cv_prog_compiler__b" >&6; }
 
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 else
     archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
 fi
@@ -9888,8 +10251,8 @@ fi
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 
 	case $host_cpu in
@@ -9900,7 +10263,7 @@ fi
 	*)
 	  hardcode_direct=yes
 	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
+	  export_dynamic_flag_spec='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -9911,8 +10274,8 @@ fi
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
@@ -9922,8 +10285,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >
 if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo (void) { return 0; }
@@ -9935,24 +10298,35 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
+           LDFLAGS=$save_LDFLAGS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
 $as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	link_all_deplibs=no
       else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       inherit_rpath=yes
       link_all_deplibs=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -9967,7 +10341,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     newsos6)
       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_shlibpath_var=no
       ;;
@@ -9975,27 +10349,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	hardcode_direct=yes
 	hardcode_shlibpath_var=no
 	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
 	fi
       else
 	ld_shlibs=no
@@ -10006,33 +10372,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	hardcode_libdir_flag_spec='-rpath $libdir'
@@ -10043,24 +10429,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
     solaris*)
       no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -10070,11 +10456,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
 	fi
@@ -10084,10 +10470,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -10136,43 +10522,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
+      no_undefined_flag='$wl-z,text'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
+      export_dynamic_flag_spec='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -10187,10 +10573,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	export_dynamic_flag_spec='$wl-Blargedynsym'
 	;;
       esac
     fi
@@ -10198,7 +10584,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
 $as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+test no = "$ld_shlibs" && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
 
@@ -10224,7 +10610,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -10439,14 +10825,14 @@ esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -10462,28 +10848,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -10497,7 +10890,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -10506,7 +10899,7 @@ fi
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -10523,14 +10916,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -10538,41 +10933,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -10582,18 +11027,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -10601,8 +11046,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -10614,7 +11059,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -10623,8 +11068,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -10640,17 +11085,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -10659,8 +11104,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -10687,7 +11132,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -10700,8 +11145,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -10714,7 +11159,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -10727,8 +11172,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -10741,8 +11186,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -10760,12 +11205,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -10795,10 +11241,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -10816,14 +11262,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -10831,8 +11278,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -10841,8 +11288,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -10855,8 +11302,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -10867,7 +11314,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -10875,8 +11322,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -10895,8 +11342,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -10905,13 +11352,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -10955,7 +11422,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -10987,12 +11459,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -11002,7 +11474,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -11011,58 +11483,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -11073,8 +11555,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -11084,11 +11566,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -11096,8 +11578,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -11118,24 +11600,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -11153,7 +11635,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -11161,8 +11643,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11172,20 +11654,35 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
 
 
 
@@ -11282,15 +11779,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
+   test yes = "$hardcode_automatic"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
+  if test no != "$hardcode_direct" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action=relink
   else
@@ -11305,12 +11802,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
 $as_echo "$hardcode_action" >&6; }
 
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -11320,7 +11817,7 @@ fi
 
 
 
-  if test "x$enable_dlopen" != xyes; then
+  if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -11330,23 +11827,23 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 if ${ac_cv_lib_dl_dlopen+:} false; then :
@@ -11384,10 +11881,10 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
 
-    lt_cv_dlopen="dyld"
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
 
@@ -11395,10 +11892,18 @@ fi
 
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
 if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
+  lt_cv_dlopen=shl_load
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
 $as_echo_n "checking for shl_load in -ldld... " >&6; }
@@ -11437,11 +11942,11 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
 $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
 if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
 else
   ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
 if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
+  lt_cv_dlopen=dlopen
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -11480,7 +11985,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
 $as_echo_n "checking for dlopen in -lsvld... " >&6; }
@@ -11519,7 +12024,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
 $as_echo "$ac_cv_lib_svld_dlopen" >&6; }
 if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
 $as_echo_n "checking for dld_link in -ldld... " >&6; }
@@ -11558,7 +12063,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
 $as_echo "$ac_cv_lib_dld_dld_link" >&6; }
 if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
 fi
 
 
@@ -11579,21 +12084,21 @@ fi
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
@@ -11601,7 +12106,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -11648,9 +12153,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -11680,7 +12185,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -11700,14 +12205,14 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
 $as_echo "$lt_cv_dlopen_self" >&6; }
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self_static+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self_static=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -11754,9 +12259,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -11786,7 +12291,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -11807,9 +12312,9 @@ fi
 $as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -11853,7 +12358,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -11881,7 +12386,7 @@ fi
 
 
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
 $as_echo_n "checking if libtool supports shared libraries... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
@@ -11889,13 +12394,13 @@ $as_echo "$can_build_shared" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
 $as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -11903,8 +12408,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -11914,7 +12423,7 @@ $as_echo "$enable_shared" >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
 $as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
 $as_echo "$enable_static" >&6; }
 
@@ -11928,11 +12437,11 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-CC="$lt_save_CC"
+CC=$lt_save_CC
 
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -12111,7 +12620,7 @@ objext_CXX=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -12172,46 +12681,39 @@ $RM -r conftest*
   CFLAGS=$CXXFLAGS
   compiler=$CC
   compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
     else
       lt_prog_compiler_no_builtin_flag_CXX=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
 
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -12225,7 +12727,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -12236,7 +12738,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -12247,32 +12749,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -12308,22 +12810,22 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           whole_archive_flag_spec_CXX=
         fi
@@ -12360,18 +12862,30 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         ld_shlibs_CXX=no
         ;;
       aix[4-9]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -12381,6 +12895,13 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -12399,13 +12920,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         hardcode_direct_absolute_CXX=yes
         hardcode_libdir_separator_CXX=':'
         link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[012]|aix4.[012].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -12423,36 +12952,44 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
+          if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -12487,7 +13024,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
@@ -12495,18 +13032,18 @@ fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
 	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
-	    if test "${lt_cv_aix_libpath+set}" = set; then
+	    if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -12541,7 +13078,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
@@ -12549,22 +13086,34 @@ fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    no_undefined_flag_CXX=' $wl-bernotok'
+	    allow_undefined_flag_CXX=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      whole_archive_flag_spec_CXX='$convenience'
 	    fi
 	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_sy [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -12574,7 +13123,7 @@ fi
 	  allow_undefined_flag_CXX=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  ld_shlibs_CXX=no
 	fi
@@ -12602,57 +13151,58 @@ fi
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
 	  enable_shared_with_static_runtimes_CXX=yes
 	  # Don't use ranlib
 	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
 	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
 	  allow_undefined_flag_CXX=unsupported
 	  always_export_symbols_CXX=no
 	  enable_shared_with_static_runtimes_CXX=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    ld_shlibs_CXX=no
 	  fi
@@ -12666,27 +13216,27 @@ fi
   hardcode_direct_CXX=no
   hardcode_automatic_CXX=yes
   hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec_CXX=''
   fi
   link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 
   else
@@ -12695,6 +13245,34 @@ fi
 
 	;;
 
+      os2*)
+	hardcode_libdir_flag_spec_CXX='-L$libdir'
+	hardcode_minus_L_CXX=yes
+	allow_undefined_flag_CXX=unsupported
+	shrext_cmds=.dll
+	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	enable_shared_with_static_runtimes_CXX=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -12730,14 +13308,14 @@ fi
         ;;
 
       haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
         ;;
 
       hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
         hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
+        export_dynamic_flag_spec_CXX='$wl-E'
         hardcode_direct_CXX=yes
         hardcode_minus_L_CXX=yes # Not in the search PATH,
 				             # but as the default
@@ -12749,7 +13327,7 @@ fi
             ld_shlibs_CXX=no
             ;;
           aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -12758,11 +13336,11 @@ fi
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               ld_shlibs_CXX=no
@@ -12772,15 +13350,15 @@ fi
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
 	  hardcode_libdir_separator_CXX=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
+	      export_dynamic_flag_spec_CXX='$wl-E'
               ;;
           esac
         fi
@@ -12806,13 +13384,13 @@ fi
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -12823,20 +13401,20 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -12851,22 +13429,22 @@ fi
       interix[3-9]*)
 	hardcode_direct_CXX=no
 	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
+	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -12875,17 +13453,17 @@ fi
 	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    link_all_deplibs_CXX=yes
 	    ;;
         esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
         hardcode_libdir_separator_CXX=:
         inherit_rpath_CXX=yes
         ;;
@@ -12898,8 +13476,8 @@ fi
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -12908,10 +13486,10 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -12925,59 +13503,59 @@ fi
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
 	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
@@ -12991,18 +13569,18 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -13010,10 +13588,10 @@ fi
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      compiler_needs_object_CXX=yes
 
 	      # Not sure whether something based on
@@ -13071,22 +13649,17 @@ fi
         ld_shlibs_CXX=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  hardcode_direct_CXX=yes
 	  hardcode_shlibpath_var_CXX=no
 	  hardcode_direct_absolute_CXX=yes
 	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='$wl-E'
+	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -13102,9 +13675,9 @@ fi
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
 	    hardcode_libdir_separator_CXX=:
 
 	    # Archives containing C++ object files must be created using
@@ -13122,17 +13695,17 @@ fi
           cxx*)
 	    case $host in
 	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
 		;;
 	    esac
@@ -13147,21 +13720,21 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
 	      hardcode_libdir_separator_CXX=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -13207,9 +13780,9 @@ fi
 	    # Sun C++ 4.2, 5.x and Centerline C++
             archive_cmds_need_lc_CXX=yes
 	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    hardcode_libdir_flag_spec_CXX='-R$libdir'
 	    hardcode_shlibpath_var_CXX=no
@@ -13217,7 +13790,7 @@ fi
 	      solaris2.[0-5] | solaris2.[0-5].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -13234,30 +13807,30 @@ fi
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -13265,11 +13838,11 @@ fi
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[0-5] | solaris2.[0-5].*) ;;
 		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -13278,52 +13851,52 @@ fi
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
+      no_undefined_flag_CXX='$wl-z,text'
       archive_cmds_need_lc_CXX=no
       hardcode_shlibpath_var_CXX=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	no_undefined_flag_CXX='$wl-z,text'
+	allow_undefined_flag_CXX='$wl-z,nodefs'
 	archive_cmds_need_lc_CXX=no
 	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
 	hardcode_libdir_separator_CXX=':'
 	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	export_dynamic_flag_spec_CXX='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-	      '"$old_archive_cmds_CXX"
+              '"$old_archive_cmds_CXX"
 	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-	      '"$reload_cmds_CXX"
+              '"$reload_cmds_CXX"
 	    ;;
 	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -13355,10 +13928,10 @@ fi
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
 
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
+    GCC_CXX=$GXX
+    LD_CXX=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -13402,13 +13975,13 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -13424,16 +13997,16 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
+	     compiler_lib_search_path_CXX=$prev$p
 	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -13441,9 +14014,9 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 	 esac
        else
 	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
+	   postdeps_CXX=$prev$p
 	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	   postdeps_CXX="${postdeps_CXX} $prev$p"
 	 fi
        fi
        prev=
@@ -13458,15 +14031,15 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
+	   predep_objects_CXX=$p
 	 else
 	   predep_objects_CXX="$predep_objects_CXX $p"
 	 fi
        else
 	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
+	   postdep_objects_CXX=$p
 	 else
 	   postdep_objects_CXX="$postdep_objects_CXX $p"
 	 fi
@@ -13496,51 +14069,6 @@ interix[3-9]*)
   postdep_objects_CXX=
   postdeps_CXX=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 
 
@@ -13549,7 +14077,7 @@ case " $postdeps_CXX " in
 esac
  compiler_lib_search_dirs_CXX=
 if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 
 
@@ -13588,17 +14116,18 @@ lt_prog_compiler_static_CXX=
 
 
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     lt_prog_compiler_wl_CXX='-Wl,'
     lt_prog_compiler_static_CXX='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static_CXX='-Bstatic'
       fi
+      lt_prog_compiler_pic_CXX='-fPIC'
       ;;
 
     amigaos*)
@@ -13609,8 +14138,8 @@ lt_prog_compiler_static_CXX=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -13625,6 +14154,11 @@ lt_prog_compiler_static_CXX=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_CXX='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -13674,7 +14208,7 @@ lt_prog_compiler_static_CXX=
     case $host_os in
       aix[4-9]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  lt_prog_compiler_static_CXX='-Bstatic'
 	else
@@ -13714,14 +14248,14 @@ lt_prog_compiler_static_CXX=
 	case $cc_basename in
 	  CC*)
 	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      lt_prog_compiler_pic_CXX='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -13758,7 +14292,7 @@ lt_prog_compiler_static_CXX=
 	    lt_prog_compiler_pic_CXX='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    lt_prog_compiler_wl_CXX='-Wl,'
 	    lt_prog_compiler_pic_CXX='-KPIC'
 	    lt_prog_compiler_static_CXX='-static'
@@ -13903,7 +14437,7 @@ lt_prog_compiler_static_CXX=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic_CXX=
     ;;
@@ -13935,7 +14469,7 @@ else
   lt_cv_prog_compiler_pic_works_CXX=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -13965,7 +14499,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
     case $lt_prog_compiler_pic_CXX in
      "" | " "*) ;;
      *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
@@ -13991,7 +14525,7 @@ if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -14010,13 +14544,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
     :
 else
     lt_prog_compiler_static_CXX=
@@ -14130,8 +14664,8 @@ $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -14143,9 +14677,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -14162,17 +14696,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   case $host_os in
   aix[4-9]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
+    export_symbols_cmds_CXX=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -14195,7 +14733,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+test no = "$ld_shlibs_CXX" && can_build_shared=no
 
 with_gnu_ld_CXX=$with_gnu_ld
 
@@ -14212,7 +14750,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc_CXX=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds_CXX in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -14340,7 +14878,7 @@ $as_echo_n "checking dynamic linker characteristics... " >&6; }
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -14357,14 +14895,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -14372,41 +14912,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -14416,18 +15006,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -14435,8 +15025,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -14448,7 +15038,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -14457,8 +15047,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -14474,16 +15064,16 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -14492,8 +15082,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -14520,7 +15110,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -14533,8 +15123,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -14547,7 +15137,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -14560,8 +15150,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -14573,8 +15163,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -14592,12 +15182,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -14627,10 +15218,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -14648,14 +15239,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -14663,8 +15255,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -14673,8 +15265,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -14687,8 +15279,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -14699,7 +15291,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -14707,8 +15299,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -14727,8 +15319,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -14737,13 +15329,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -14787,7 +15399,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -14819,12 +15436,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -14834,7 +15451,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -14843,58 +15460,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -14905,8 +15532,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -14916,11 +15543,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -14928,8 +15555,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -14950,24 +15577,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -14985,7 +15612,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -14993,8 +15620,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -15004,20 +15631,32 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
 
 
 
@@ -15060,15 +15699,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action_CXX=
 if test -n "$hardcode_libdir_flag_spec_CXX" ||
    test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+   test yes = "$hardcode_automatic_CXX"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
+  if test no != "$hardcode_direct_CXX" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action_CXX=relink
   else
@@ -15083,12 +15722,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
 $as_echo "$hardcode_action_CXX" >&6; }
 
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -15111,7 +15750,7 @@ fi
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
@@ -16654,6 +17293,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
@@ -16703,10 +17343,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -16771,7 +17414,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -16876,9 +17520,12 @@ CFLAGS \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
 nm_file_list_spec \
+lt_cv_truncate_bin \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
@@ -16944,7 +17591,7 @@ postdeps_CXX \
 compiler_lib_search_path_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -16971,7 +17618,8 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
 reload_cmds_CXX \
 old_archive_cmds_CXX \
 old_archive_from_new_cmds_CXX \
@@ -16985,7 +17633,7 @@ prelink_cmds_CXX \
 postlink_cmds_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -16994,19 +17642,16 @@ postlink_cmds_CXX; do
 done
 
 ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
 
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'
 
@@ -17719,55 +18364,53 @@ $as_echo X"$file" |
  ;;
     "libtool":C)
 
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # The names of the tagged configurations supported by this script.
-available_tags="CXX "
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
 
 # ### BEGIN LIBTOOL CONFIG
 
@@ -17787,6 +18430,9 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
@@ -17904,18 +18550,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
 lt_sysroot=$lt_sysroot
 
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
@@ -18006,8 +18661,11 @@ hardcode_into_libs=$hardcode_into_libs
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
@@ -18100,13 +18758,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
@@ -18172,13 +18830,72 @@ compiler_lib_search_path=$lt_compiler_lib_search_path
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -18187,7 +18904,7 @@ _LT_EOF
   esac
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
@@ -18197,165 +18914,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -18442,13 +19000,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
diff --git a/src/gmock/gtest/Makefile.in b/src/gmock/gtest/Makefile.in
index 1dc844f..87f521f 100644
--- a/src/gmock/gtest/Makefile.in
+++ b/src/gmock/gtest/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -19,7 +19,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -91,21 +101,6 @@ check_PROGRAMS = samples/sample1_unittest$(EXEEXT) \
 @HAVE_PYTHON_TRUE at am__append_1 = test/fused_gtest_test
 @HAVE_PYTHON_TRUE at am__append_2 = test/fused_gtest_test
 subdir = .
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(top_srcdir)/configure $(am__configure_deps) \
-	$(top_srcdir)/build-aux/config.h.in \
-	$(top_srcdir)/scripts/gtest-config.in \
-	$(top_srcdir)/build-aux/depcomp $(pkginclude_HEADERS) \
-	$(pkginclude_internal_HEADERS) \
-	$(top_srcdir)/build-aux/test-driver README build-aux/compile \
-	build-aux/config.guess build-aux/config.sub build-aux/depcomp \
-	build-aux/install-sh build-aux/missing build-aux/ltmain.sh \
-	$(top_srcdir)/build-aux/compile \
-	$(top_srcdir)/build-aux/config.guess \
-	$(top_srcdir)/build-aux/config.sub \
-	$(top_srcdir)/build-aux/install-sh \
-	$(top_srcdir)/build-aux/ltmain.sh \
-	$(top_srcdir)/build-aux/missing
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
 	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
@@ -113,6 +108,9 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
 	$(top_srcdir)/m4/acx_pthread.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(pkginclude_HEADERS) \
+	$(pkginclude_internal_HEADERS) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
@@ -461,6 +459,19 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
 	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+	$(top_srcdir)/build-aux/compile \
+	$(top_srcdir)/build-aux/config.guess \
+	$(top_srcdir)/build-aux/config.h.in \
+	$(top_srcdir)/build-aux/config.sub \
+	$(top_srcdir)/build-aux/depcomp \
+	$(top_srcdir)/build-aux/install-sh \
+	$(top_srcdir)/build-aux/ltmain.sh \
+	$(top_srcdir)/build-aux/missing \
+	$(top_srcdir)/build-aux/test-driver \
+	$(top_srcdir)/scripts/gtest-config.in README build-aux/compile \
+	build-aux/config.guess build-aux/config.sub build-aux/depcomp \
+	build-aux/install-sh build-aux/ltmain.sh build-aux/missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -521,6 +532,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -594,6 +606,7 @@ pdfdir = @pdfdir@
 prefix = @prefix@
 program_transform_name = @program_transform_name@
 psdir = @psdir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -814,7 +827,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -1217,7 +1229,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1426,15 +1438,15 @@ dist-xz: distdir
 	$(am__post_remove_distdir)
 
 dist-tarZ: distdir
-	@echo WARNING: "Support for shar distribution archives is" \
-	               "deprecated." >&2
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__post_remove_distdir)
 
 dist-shar: distdir
-	@echo WARNING: "Support for distribution archives compressed with" \
-		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
@@ -1469,17 +1481,17 @@ distcheck: dist
 	esac
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_inst
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
 	chmod a-w $(distdir)
 	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
 	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	    --srcdir=.. --prefix="$$dc_install_base" \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -1686,6 +1698,8 @@ uninstall-am: uninstall-m4dataDATA uninstall-pkgincludeHEADERS \
 	uninstall-am uninstall-m4dataDATA uninstall-pkgincludeHEADERS \
 	uninstall-pkginclude_internalHEADERS
 
+.PRECIOUS: Makefile
+
 
 # Build rules for putting fused Google Test files into the distribution
 # package. The user can also create those files by manually running
diff --git a/src/gmock/gtest/aclocal.m4 b/src/gmock/gtest/aclocal.m4
index 8f34cf4..a83ad2f 100644
--- a/src/gmock/gtest/aclocal.m4
+++ b/src/gmock/gtest/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.14'
+[am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.14.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.14.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -103,15 +103,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -142,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -333,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -409,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -499,8 +498,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -573,7 +572,11 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
@@ -602,7 +605,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -613,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -623,7 +626,7 @@ if test x"${install_sh}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -644,7 +647,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -694,7 +697,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -733,7 +736,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -762,7 +765,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -809,7 +812,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1044,7 +1047,7 @@ for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
 sys.exit(sys.hexversion < minverhex)"
   AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1063,7 +1066,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1144,7 +1147,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1204,7 +1207,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1232,7 +1235,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1251,7 +1254,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/src/gmock/gtest/build-aux/compile b/src/gmock/gtest/build-aux/compile
index 531136b..a85b723 100755
--- a/src/gmock/gtest/build-aux/compile
+++ b/src/gmock/gtest/build-aux/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey at cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/src/gmock/gtest/build-aux/config.guess b/src/gmock/gtest/build-aux/config.guess
index b79252d..1659250 100755
--- a/src/gmock/gtest/build-aux/config.guess
+++ b/src/gmock/gtest/build-aux/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-06-10'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@ timestamp='2013-06-10'
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 #
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
 	LIBC=gnu
 	#endif
 	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
 	;;
 esac
 
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -235,6 +249,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -579,8 +596,9 @@ EOF
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -826,7 +844,7 @@ EOF
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
     i*:windows32*:*)
@@ -932,6 +950,9 @@ EOF
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -969,10 +990,10 @@ EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or1k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
 	exit ;;
-    or32:Linux:*:*)
+    or32:Linux:*:* | or1k*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
@@ -1020,7 +1041,7 @@ EOF
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1260,16 +1281,26 @@ EOF
 	if test "$UNAME_PROCESSOR" = unknown ; then
 	    UNAME_PROCESSOR=powerpc
 	fi
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		case $UNAME_PROCESSOR in
-		    i386) UNAME_PROCESSOR=x86_64 ;;
-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		esac
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
 	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
 	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
@@ -1361,154 +1392,6 @@ EOF
 	exit ;;
 esac
 
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
 cat >&2 <<EOF
 $0: unable to guess system type
 
diff --git a/src/gmock/gtest/build-aux/config.h.in b/src/gmock/gtest/build-aux/config.h.in
index 843b5b1..6ea2e69 100644
--- a/src/gmock/gtest/build-aux/config.h.in
+++ b/src/gmock/gtest/build-aux/config.h.in
@@ -33,8 +33,7 @@
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
 
 /* Name of package */
diff --git a/src/gmock/gtest/build-aux/config.sub b/src/gmock/gtest/build-aux/config.sub
index 9633db7..1acc966 100755
--- a/src/gmock/gtest/build-aux/config.sub
+++ b/src/gmock/gtest/build-aux/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-08-10'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ timestamp='2013-08-10'
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -68,7 +68,7 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,7 +117,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
@@ -255,16 +255,18 @@ case $basic_machine in
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
 	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
 	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
@@ -282,8 +284,10 @@ case $basic_machine in
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipsr5900 | mipsr5900el \
@@ -295,14 +299,14 @@ case $basic_machine in
 	| nds32 | nds32le | nds32be \
 	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -310,6 +314,7 @@ case $basic_machine in
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -324,7 +329,10 @@ case $basic_machine in
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -369,18 +377,20 @@ case $basic_machine in
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
 	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
@@ -400,8 +410,10 @@ case $basic_machine in
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipsr5900-* | mipsr5900el-* \
@@ -413,16 +425,18 @@ case $basic_machine in
 	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -430,6 +444,7 @@ case $basic_machine in
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -506,6 +521,9 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-aros
 		;;
+        asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -767,6 +785,9 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -822,6 +843,10 @@ case $basic_machine in
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -1354,7 +1379,7 @@ case $os in
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
@@ -1367,14 +1392,14 @@ case $os in
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1592,9 +1617,6 @@ case $basic_machine in
 	mips*-*)
 		os=-elf
 		;;
-	or1k-*)
-		os=-elf
-		;;
 	or32-*)
 		os=-coff
 		;;
diff --git a/src/gmock/gtest/build-aux/depcomp b/src/gmock/gtest/build-aux/depcomp
index 4ebd5b3..fc98710 100755
--- a/src/gmock/gtest/build-aux/depcomp
+++ b/src/gmock/gtest/build-aux/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/src/gmock/gtest/build-aux/install-sh b/src/gmock/gtest/build-aux/install-sh
index 377bb86..59990a1 100755
--- a/src/gmock/gtest/build-aux/install-sh
+++ b/src/gmock/gtest/build-aux/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2011-11-20.07; # UTC
+scriptversion=2014-09-12.12; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='	'
 nl='
 '
-IFS=" ""	$nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,46 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-	shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-	shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-	# Protect names problematic for 'test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)	shift
-	break;;
+    --) shift
+        break;;
 
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -208,6 +204,15 @@ if test $# -eq 0; then
 fi
 
 if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
   do_exit='(exit $ret); exit $ret'
   trap "ret=129; $do_exit" 1
   trap "ret=130; $do_exit" 2
@@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -269,41 +274,15 @@ do
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -314,74 +293,81 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -391,53 +377,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -472,15 +456,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -493,24 +474,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
diff --git a/src/gmock/gtest/build-aux/ltmain.sh b/src/gmock/gtest/build-aux/ltmain.sh
index a356aca..147d758 100644
--- a/src/gmock/gtest/build-aux/ltmain.sh
+++ b/src/gmock/gtest/build-aux/ltmain.sh
@@ -1,9 +1,12 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
 
-# libtool (GNU libtool) 2.4.2
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
@@ -23,881 +26,2112 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION="2.4.2 Debian-2.4.2-1.7ubuntu1"
-TIMESTAMP=""
-package_revision=1.3337
+VERSION="2.4.6 Debian-2.4.6-0.1"
+package_revision=2.4.6
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
 fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
 
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
 do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
 	fi"
 done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
 
-$lt_unset CDPATH
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
 
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
 
 
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
 
 : ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
 
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
 
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
 
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
 
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
 
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
 
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
 
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
 
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
 
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
 
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
 
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
 
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
 
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
 
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
 
-# Make sure we have an absolute path for reexecution:
+# Make sure we have an absolute progpath for reexecution:
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
-     progdir=$func_dirname_result
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
      progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
   *)
-     save_IFS="$IFS"
+     _G_IFS=$IFS
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
-       IFS="$save_IFS"
+       IFS=$_G_IFS
        test -x "$progdir/$progname" && break
      done
-     IFS="$save_IFS"
+     IFS=$_G_IFS
      test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
 
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
 
-# Standard options:
 opt_dry_run=false
-opt_help=false
 opt_quiet=false
 opt_verbose=false
-opt_warning=:
 
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
 
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
 
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
 
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
 
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
 
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
 
-    # bash bug again:
-    :
-}
 
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
 {
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset=''
+        tc_bold='';   tc_standout=''
+        tc_red='';   tc_green=''
+        tc_blue='';  tc_cyan=''
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
 
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
+    require_term_colors=:
 }
-help="Try \`$progname --help' for more information."  ## default
 
 
-# func_grep expression filename
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
+    $debug_cmd
+
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
-# func_mkdir_p directory-path
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
-    my_directory_path="$1"
-    my_dir_list=
+    $debug_cmd
 
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+    _G_directory_path=$1
+    _G_dir_list=
 
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
+
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
       esac
 
       # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
+      while test ! -d "$_G_directory_path"; do
         # ...make a list in topmost first order.  Use a colon delimited
 	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
+        _G_dir_list=$_G_directory_path:$_G_dir_list
 
         # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
+        case $_G_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
       done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
 
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
+        $MKDIR "$_G_dir" 2>/dev/null || :
       done
-      IFS="$save_mkdir_p_IFS"
+      IFS=$func_mkdir_p_IFS
 
       # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
     fi
 }
 
 
-# func_mktempdir [string]
+# func_mktempdir [BASENAME]
+# -------------------------
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
+# given, BASENAME is the basename for that directory.
 func_mktempdir ()
 {
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
 
-    if test "$opt_dry_run" = ":"; then
+    if test : = "$opt_dry_run"; then
       # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
+      _G_tmpdir=$_G_template-$$
     else
 
       # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
 
-      if test ! -d "$my_tmpdir"; then
+      if test ! -d "$_G_tmpdir"; then
         # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
 
-        save_mktempdir_umask=`umask`
+        func_mktempdir_umask=`umask`
         umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
+    fi
+
+    $ECHO "$_G_tmpdir"
+}
+
+
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
+{
+    $debug_cmd
+
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
+        ;;
+      *)
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
+    esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
     fi
 
-    $ECHO "$my_tmpdir"
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
+}
+
+
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    $debug_cmd
+
+    case $1 in
+      *[\\\`\"]*)
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        _G_arg=$1 ;;
+    esac
+
+    case $_G_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        _G_arg=\"$_G_arg\"
+        ;;
+    esac
+
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
+}
+
+
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
+{
+    $debug_cmd
+
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
+
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
 }
 
 
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
 {
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
+    $debug_cmd
 
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
-        ;;
-      *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
-    esac
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
+
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
 }
 
 
-# func_quote_for_expand arg
-# Aesthetically quote ARG to be evaled later; same as above,
-# but do not quote variable references.
-func_quote_for_expand ()
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
 {
-    case $1 in
-      *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
-      *)
-        my_arg="$1" ;;
-    esac
+    $debug_cmd
 
-    case $my_arg in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting and command substitution for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
-        ;;
-    esac
+    func_parse_options_result=
 
-    func_quote_for_expand_result="$my_arg"
-}
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
 
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
 
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
-{
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
 }
 
 
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
 {
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+    $debug_cmd
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
-}
+    func_run_hooks func_validate_options ${1+"$@"}
 
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
-{
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
 }
 
 
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
-{
-    $opt_debug
 
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# / /
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
-}
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
 
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
 {
-    $opt_debug
+    $debug_cmd
 
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
 }
 
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
 func_help ()
 {
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-	:print
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-	p
-	d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
 }
 
-# func_missing_arg argname
+
+# func_missing_arg ARGNAME
+# ------------------------
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
-    $opt_debug
+    $debug_cmd
 
-    func_error "missing argument for $1."
+    func_error "Missing argument for '$1'."
     exit_cmd=exit
 }
 
 
-# func_split_short_opt shortopt
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
 {
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+    $debug_cmd
 
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
 
 
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
 {
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
+    $debug_cmd
 
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
 
-exit_cmd=:
 
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
 
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
 
+    exit $?
+}
 
 
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
 
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
 
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
 {
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
+    $debug_cmd
 
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
+    _G_message=$*
 
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
 
-# func_arith arithmetic-term...
-func_arith ()
+
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
 {
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
+    $debug_cmd
 
+    $warning_func ${1+"$@"}
+}
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
-{
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
 
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
 
-# func_lo2o object
-func_lo2o ()
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
 {
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname (GNU libtool) 2.4.6
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool at gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
 
 
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
+
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
 
 
-# func_fatal_configuration arg...
+# func_fatal_configuration ARG...
+# -------------------------------
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
 }
 
 
 # func_config
+# -----------
 # Display the configuration for all the tags in this script.
 func_config ()
 {
@@ -915,17 +2149,19 @@ func_config ()
     exit $?
 }
 
+
 # func_features
+# -------------
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       echo "enable static libraries"
     else
       echo "disable static libraries"
@@ -934,314 +2170,350 @@ func_features ()
     exit $?
 }
 
-# func_enable_tag tagname
+
+# func_enable_tag TAGNAME
+# -----------------------
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
-  # Global variable:
-  tagname="$1"
+    # Global variable:
+    tagname=$1
 
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
 
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
 
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
     *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
 }
 
+
 # func_check_version_match
+# ------------------------
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      else
-        cat >&2 <<_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
-    fi
+      fi
 
-    exit $EXIT_MISMATCH
-  fi
+      exit $EXIT_MISMATCH
+    fi
 }
 
 
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
 
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
 
+    nonopt=
+    preserve_args=
 
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
 
 
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
 {
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)	opt_debug='set -x'
-			func_echo "enabling shell trace mode"
-			$opt_debug
-			;;
-      --dry-run|--dryrun|-n)
-			opt_dry_run=:
-			;;
-      --config)
-			opt_config=:
-func_config
-			;;
-      --dlopen|-dlopen)
-			optarg="$1"
-			opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-			shift
-			;;
-      --preserve-dup-deps)
-			opt_preserve_dup_deps=:
-			;;
-      --features)
-			opt_features=:
-func_features
-			;;
-      --finish)
-			opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-			;;
-      --help)
-			opt_help=:
-			;;
-      --help-all)
-			opt_help_all=:
-opt_help=': help-all'
-			;;
-      --mode)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-			shift
-			;;
-      --no-silent|--no-quiet)
-			opt_silent=false
-func_append preserve_args " $opt"
-			;;
-      --no-warning|--no-warn)
-			opt_warning=false
-func_append preserve_args " $opt"
-			;;
-      --no-verbose)
-			opt_verbose=false
-func_append preserve_args " $opt"
-			;;
-      --silent|--quiet)
-			opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-			;;
-      --verbose|-v)
-			opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-			;;
-      --tag)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-			shift
-			;;
-
-      -\?|-h)		func_usage				;;
-      --help)		func_help				;;
-      --version)	func_version				;;
-
-      # Separate optargs to long options:
-      --*=*)
-			func_split_long_opt "$opt"
-			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-			func_split_short_opt "$opt"
-			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      --)		break					;;
-      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
-      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
-    esac
-  done
+    $debug_cmd
 
-  # Validate options:
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
 
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
 
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
 
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
 
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
 
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
     fi
 
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
 
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
 
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
+
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
+
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
 
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
 
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
 }
+func_add_hook func_validate_options libtool_validate_options
 
 
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
+
 
 
 ## ----------- ##
 ##    Main.    ##
 ## ----------- ##
 
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
 # func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
+# fatal anyway.  Works if 'file' does not exist.
 func_lalib_unsafe_p ()
 {
     lalib_p=no
@@ -1249,13 +2521,13 @@ func_lalib_unsafe_p ()
 	for lalib_p_l in 1 2 3 4
 	do
 	    read lalib_p_line
-	    case "$lalib_p_line" in
+	    case $lalib_p_line in
 		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
 	    esac
 	done
 	exec 0<&5 5<&-
     fi
-    test "$lalib_p" = yes
+    test yes = "$lalib_p"
 }
 
 # func_ltwrapper_script_p file
@@ -1264,7 +2536,8 @@ func_lalib_unsafe_p ()
 # determined imposters.
 func_ltwrapper_script_p ()
 {
-    func_lalib_p "$1"
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_ltwrapper_executable_p file
@@ -1289,7 +2562,7 @@ func_ltwrapper_scriptname ()
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
 }
 
 # func_ltwrapper_p file
@@ -1308,11 +2581,13 @@ func_ltwrapper_p ()
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
-    $opt_debug
+    $debug_cmd
+
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
-      IFS=$save_ifs
+      IFS=$sp$nl
       eval cmd=\"$cmd\"
+      IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
@@ -1324,10 +2599,11 @@ func_execute_cmds ()
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
+# 'FILE.' does not work on cygwin managed mounts.
 func_source ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $1 in
     */* | *\\*)	. "$1" ;;
     *)		. "./$1" ;;
@@ -1354,10 +2630,10 @@ func_resolve_sysroot ()
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
-  case "$lt_sysroot:$1" in
+  case $lt_sysroot:$1 in
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
+    func_replace_sysroot_result='='$func_stripname_result
     ;;
   *)
     # Including no sysroot.
@@ -1374,7 +2650,8 @@ func_replace_sysroot ()
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
-    $opt_debug
+    $debug_cmd
+
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
@@ -1393,7 +2670,7 @@ func_infer_tag ()
 	for z in $available_tags; do
 	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
 	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
 	    CC_quoted=
 	    for arg in $CC; do
 	      # Double-quote args containing other shell metacharacters.
@@ -1418,7 +2695,7 @@ func_infer_tag ()
 	# line option must be used.
 	if test -z "$tagname"; then
 	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
+	  func_fatal_error "specify a tag with '--tag'"
 #	else
 #	  func_verbose "using $tagname tagged configuration"
 	fi
@@ -1434,15 +2711,15 @@ func_infer_tag ()
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
     else
       write_lobj=none
     fi
 
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
     else
       write_oldobj=none
     fi
@@ -1450,7 +2727,7 @@ func_write_libtool_object ()
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -1462,7 +2739,7 @@ pic_object=$write_lobj
 non_pic_object=$write_oldobj
 
 EOF
-      $MV "${write_libobj}T" "${write_libobj}"
+      $MV "${write_libobj}T" "$write_libobj"
     }
 }
 
@@ -1482,8 +2759,9 @@ EOF
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
@@ -1491,9 +2769,9 @@ func_convert_core_file_wine_to_w32 ()
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
+        $SED -e "$sed_naive_backslashify"`
     else
       func_convert_core_file_wine_to_w32_result=
     fi
@@ -1514,18 +2792,19 @@ func_convert_core_file_wine_to_w32 ()
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
+  func_convert_core_path_wine_to_w32_result=
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
@@ -1554,7 +2833,8 @@ func_convert_core_path_wine_to_w32 ()
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
@@ -1563,7 +2843,7 @@ func_cygpath ()
     fi
   else
     func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
   fi
 }
 #end: func_cygpath
@@ -1574,10 +2854,11 @@ func_cygpath ()
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
 }
 #end: func_convert_core_msys_to_w32
 
@@ -1588,13 +2869,14 @@ func_convert_core_msys_to_w32 ()
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
     func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
+    func_error "  '$1'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
-    func_to_host_file_result="$1"
+    func_to_host_file_result=$1
   fi
 }
 # end func_convert_file_check
@@ -1606,10 +2888,11 @@ func_convert_file_check ()
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
+    func_error "  '$3'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
@@ -1618,7 +2901,7 @@ func_convert_path_check ()
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
-      func_to_host_path_result="$3"
+      func_to_host_path_result=$3
     fi
   fi
 }
@@ -1630,9 +2913,10 @@ func_convert_path_check ()
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
-  $opt_debug
+  $debug_cmd
+
   case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
     ;;
   esac
   case $4 in
@@ -1646,7 +2930,7 @@ func_convert_path_front_back_pathsep ()
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
-# invoked via `$to_host_file_cmd ARG'
+# invoked via '$to_host_file_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
@@ -1657,7 +2941,8 @@ func_convert_path_front_back_pathsep ()
 # in func_to_host_file_result.
 func_to_host_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
@@ -1669,7 +2954,8 @@ func_to_host_file ()
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
@@ -1687,7 +2973,7 @@ func_to_tool_file ()
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
-  func_to_host_file_result="$1"
+  func_to_host_file_result=$1
 }
 # end func_convert_file_noop
 
@@ -1698,11 +2984,12 @@ func_convert_file_noop ()
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1714,8 +3001,9 @@ func_convert_file_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
@@ -1731,11 +3019,12 @@ func_convert_file_cygwin_to_w32 ()
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1747,12 +3036,13 @@ func_convert_file_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1765,13 +3055,14 @@ func_convert_file_msys_to_cygwin ()
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1781,7 +3072,7 @@ func_convert_file_nix_to_cygwin ()
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
-# invoked via `$to_host_path_cmd ARG'
+# invoked via '$to_host_path_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
@@ -1805,10 +3096,11 @@ func_convert_file_nix_to_cygwin ()
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
   fi
 }
 
@@ -1818,7 +3110,8 @@ func_init_to_host_path_cmd ()
 # in func_to_host_path_result.
 func_to_host_path ()
 {
-  $opt_debug
+  $debug_cmd
+
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
@@ -1829,7 +3122,7 @@ func_to_host_path ()
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
-  func_to_host_path_result="$1"
+  func_to_host_path_result=$1
 }
 # end func_convert_path_noop
 
@@ -1840,8 +3133,9 @@ func_convert_path_noop ()
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
@@ -1849,7 +3143,7 @@ func_convert_path_msys_to_w32 ()
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1863,8 +3157,9 @@ func_convert_path_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
@@ -1883,14 +3178,15 @@ func_convert_path_cygwin_to_w32 ()
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1904,15 +3200,16 @@ func_convert_path_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1927,8 +3224,9 @@ func_convert_path_msys_to_cygwin ()
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
@@ -1937,7 +3235,7 @@ func_convert_path_nix_to_cygwin ()
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1946,13 +3244,31 @@ func_convert_path_nix_to_cygwin ()
 # end func_convert_path_nix_to_cygwin
 
 
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
 # func_mode_compile arg...
 func_mode_compile ()
 {
-    $opt_debug
+    $debug_cmd
+
     # Get the compilation command and the source file.
     base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
@@ -1965,12 +3281,12 @@ func_mode_compile ()
       case $arg_mode in
       arg  )
 	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
+	lastarg=$arg
 	arg_mode=normal
 	;;
 
       target )
-	libobj="$arg"
+	libobj=$arg
 	arg_mode=normal
 	continue
 	;;
@@ -1980,7 +3296,7 @@ func_mode_compile ()
 	case $arg in
 	-o)
 	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
+	    func_fatal_error "you cannot specify '-o' more than once"
 	  arg_mode=target
 	  continue
 	  ;;
@@ -2009,12 +3325,12 @@ func_mode_compile ()
 	  func_stripname '-Wc,' '' "$arg"
 	  args=$func_stripname_result
 	  lastarg=
-	  save_ifs="$IFS"; IFS=','
+	  save_ifs=$IFS; IFS=,
 	  for arg in $args; do
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 	    func_append_quoted lastarg "$arg"
 	  done
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
 	  func_stripname ' ' '' "$lastarg"
 	  lastarg=$func_stripname_result
 
@@ -2027,8 +3343,8 @@ func_mode_compile ()
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
+	  lastarg=$srcfile
+	  srcfile=$arg
 	  ;;
 	esac  #  case $arg
 	;;
@@ -2043,13 +3359,13 @@ func_mode_compile ()
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      func_fatal_error "you must specify a target with \`-o'"
+      func_fatal_error "you must specify a target with '-o'"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
 	func_basename "$srcfile"
-	libobj="$func_basename_result"
+	libobj=$func_basename_result
       }
       ;;
     esac
@@ -2069,7 +3385,7 @@ func_mode_compile ()
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      func_fatal_error "cannot determine name of library object from '$libobj'"
       ;;
     esac
 
@@ -2078,8 +3394,8 @@ func_mode_compile ()
     for arg in $later; do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	continue
 	;;
@@ -2105,17 +3421,17 @@ func_mode_compile ()
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
@@ -2127,16 +3443,16 @@ func_mode_compile ()
       pic_mode=default
       ;;
     esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
     else
       output_obj=
       need_locks=no
@@ -2145,12 +3461,12 @@ func_mode_compile ()
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
+    if test yes = "$need_locks"; then
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
-    elif test "$need_locks" = warn; then
+    elif test warn = "$need_locks"; then
       if test -f "$lockfile"; then
 	$ECHO "\
 *** ERROR, $lockfile exists and contains:
@@ -2158,7 +3474,7 @@ func_mode_compile ()
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2180,11 +3496,11 @@ compiler."
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
-      if test "$pic_mode" != no; then
+      if test no != "$pic_mode"; then
 	command="$base_compile $qsrcfile $pic_flag"
       else
 	# Don't build PIC code
@@ -2201,7 +3517,7 @@ compiler."
       func_show_eval_locale "$command"	\
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2212,7 +3528,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2228,20 +3544,20 @@ compiler."
       fi
 
       # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
+      if test yes = "$suppress_opt"; then
 	suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
 	# Don't build PIC code
 	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
-      if test "$compiler_c_o" = yes; then
+      if test yes = "$compiler_c_o"; then
 	func_append command " -o $obj"
       fi
 
@@ -2250,7 +3566,7 @@ compiler."
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2261,7 +3577,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2281,7 +3597,7 @@ compiler."
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
+      if test no != "$need_locks"; then
 	removelist=$lockfile
         $RM "$lockfile"
       fi
@@ -2291,7 +3607,7 @@ compiler."
 }
 
 $opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
@@ -2311,7 +3627,7 @@ func_mode_help ()
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
@@ -2330,16 +3646,16 @@ This mode accepts the following additional options:
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
   -Wc,FLAG          pass FLAG directly to the compiler
 
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
         ;;
 
       execute)
@@ -2352,7 +3668,7 @@ This mode accepts the following additional options:
 
   -dlopen FILE      add the directory containing FILE to the library path
 
-This mode sets the library path environment variable according to \`-dlopen'
+This mode sets the library path environment variable according to '-dlopen'
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
@@ -2371,7 +3687,7 @@ Complete the installation of libtool libraries.
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
+the '--dry-run' option if you just want to see what would be executed."
         ;;
 
       install)
@@ -2381,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed."
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
+either the 'install' or 'cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
@@ -2407,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially:
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
@@ -2421,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially:
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
@@ -2441,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially:
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
-All other options (arguments beginning with \`-') are ignored.
+All other options (arguments beginning with '-') are ignored.
 
-Every other argument is treated as a filename.  Files ending in \`.la' are
+Every other argument is treated as a filename.  Files ending in '.la' are
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
 required, except when creating a convenience library.
 
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
 
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
 is created, otherwise an executable program is created."
         ;;
 
@@ -2465,7 +3782,7 @@ is created, otherwise an executable program is created."
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
@@ -2473,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
+        func_fatal_help "invalid operation mode '$opt_mode'"
         ;;
     esac
 
     echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
+    $ECHO "Try '$progname --help' for more information about other modes."
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
-  if test "$opt_help" = :; then
+  if test : = "$opt_help"; then
     func_mode_help
   else
     {
@@ -2491,7 +3808,7 @@ if $opt_help; then
       for opt_mode in compile link execute install finish uninstall clean; do
 	func_mode_help
       done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
@@ -2499,7 +3816,7 @@ if $opt_help; then
 	func_mode_help
       done
     } |
-    sed '1d
+    $SED '1d
       /^When reporting/,/^Report/{
 	H
 	d
@@ -2516,16 +3833,17 @@ fi
 # func_mode_execute arg...
 func_mode_execute ()
 {
-    $opt_debug
+    $debug_cmd
+
     # The first argument is the command name.
-    cmd="$nonopt"
+    cmd=$nonopt
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
+	|| func_fatal_help "'$file' is not a file"
 
       dir=
       case $file in
@@ -2535,7 +3853,7 @@ func_mode_execute ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
 
 	# Read the libtool library.
 	dlname=
@@ -2546,18 +3864,18 @@ func_mode_execute ()
 	if test -z "$dlname"; then
 	  # Warn if it was a shared library.
 	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	    func_warning "'$file' was not linked with '-export-dynamic'"
 	  continue
 	fi
 
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 
 	if test -f "$dir/$objdir/$dlname"; then
 	  func_append dir "/$objdir"
 	else
 	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
 	  fi
 	fi
 	;;
@@ -2565,18 +3883,18 @@ func_mode_execute ()
       *.lo)
 	# Just add the directory containing the .lo file.
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	;;
 
       *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+      test -n "$absdir" && dir=$absdir
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
@@ -2588,7 +3906,7 @@ func_mode_execute ()
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
-    libtool_execute_magic="$magic"
+    libtool_execute_magic=$magic
 
     # Check if any of the arguments is a wrapper script.
     args=
@@ -2601,12 +3919,12 @@ func_mode_execute ()
 	if func_ltwrapper_script_p "$file"; then
 	  func_source "$file"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	elif func_ltwrapper_executable_p "$file"; then
 	  func_ltwrapper_scriptname "$file"
 	  func_source "$func_ltwrapper_scriptname_result"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	fi
 	;;
       esac
@@ -2614,7 +3932,15 @@ func_mode_execute ()
       func_append_quoted args "$file"
     done
 
-    if test "X$opt_dry_run" = Xfalse; then
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
       if test -n "$shlibpath_var"; then
 	# Export the shlibpath_var.
 	eval "export $shlibpath_var"
@@ -2631,25 +3957,18 @@ func_mode_execute ()
       done
 
       # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
+      exec_cmd=\$cmd$args
     fi
 }
 
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
-    $opt_debug
+    $debug_cmd
+
     libs=
     libdirs=
     admincmds=
@@ -2663,11 +3982,11 @@ func_mode_finish ()
 	if func_lalib_unsafe_p "$opt"; then
 	  func_append libs " $opt"
 	else
-	  func_warning "\`$opt' is not a valid libtool archive"
+	  func_warning "'$opt' is not a valid libtool archive"
 	fi
 
       else
-	func_fatal_error "invalid argument \`$opt'"
+	func_fatal_error "invalid argument '$opt'"
       fi
     done
 
@@ -2682,12 +4001,12 @@ func_mode_finish ()
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
-	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
 	    > $tmpdir/tmp-la
 	  mv -f $tmpdir/tmp-la $lib
 	done
@@ -2712,7 +4031,7 @@ func_mode_finish ()
     fi
 
     # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
+    $opt_quiet && exit $EXIT_SUCCESS
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
@@ -2723,27 +4042,27 @@ func_mode_finish ()
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
-	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
 	echo "     during execution"
       fi
       if test -n "$runpath_var"; then
-	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
 	echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
 	libdir=LIBDIR
 	eval flag=\"$hardcode_libdir_flag_spec\"
 
-	$ECHO "   - use the \`$flag' linker flag"
+	$ECHO "   - use the '$flag' linker flag"
       fi
       if test -n "$admincmds"; then
 	$ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
-	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
       fi
       echo
 
@@ -2762,18 +4081,20 @@ func_mode_finish ()
     exit $EXIT_SUCCESS
 }
 
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
-    $opt_debug
+    $debug_cmd
+
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
        # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
@@ -2800,7 +4121,7 @@ func_mode_install ()
     opts=
     prev=
     install_type=
-    isdir=no
+    isdir=false
     stripme=
     no_mode=:
     for arg
@@ -2813,7 +4134,7 @@ func_mode_install ()
       fi
 
       case $arg in
-      -d) isdir=yes ;;
+      -d) isdir=: ;;
       -f)
 	if $install_cp; then :; else
 	  prev=$arg
@@ -2831,7 +4152,7 @@ func_mode_install ()
       *)
 	# If the previous option needed an argument, then skip it.
 	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
 	    arg2=$install_override_mode
 	    no_mode=false
 	  fi
@@ -2856,7 +4177,7 @@ func_mode_install ()
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
+      func_fatal_help "the '$prev' option requires an argument"
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
@@ -2878,19 +4199,19 @@ func_mode_install ()
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
+      destdir=$func_dirname_result
+      destname=$func_basename_result
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
+	func_fatal_help "'$dest' is not a directory"
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -2899,7 +4220,7 @@ func_mode_install ()
 	case $file in
 	*.lo) ;;
 	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  func_fatal_help "'$destdir' must be an absolute directory name"
 	  ;;
 	esac
       done
@@ -2908,7 +4229,7 @@ func_mode_install ()
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     staticlibs=
     future_libdirs=
@@ -2928,7 +4249,7 @@ func_mode_install ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
+	  || func_fatal_help "'$file' is not a valid libtool archive"
 
 	library_names=
 	old_library=
@@ -2950,7 +4271,7 @@ func_mode_install ()
 	fi
 
 	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	func_append dir "$objdir"
 
 	if test -n "$relink_command"; then
@@ -2964,7 +4285,7 @@ func_mode_install ()
 	  # are installed into $libdir/../bin (currently, that works fine)
 	  # but it's something to keep an eye on.
 	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
 
 	  if test -n "$inst_prefix_dir"; then
 	    # Stick the inst_prefix_dir data into the link command.
@@ -2973,29 +4294,36 @@ func_mode_install ()
 	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
 	  fi
 
-	  func_warning "relinking \`$file'"
+	  func_warning "relinking '$file'"
 	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
 	fi
 
 	# See the names of the shared library.
 	set dummy $library_names; shift
 	if test -n "$1"; then
-	  realname="$1"
+	  realname=$1
 	  shift
 
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
 
 	  # Install the shared library and build the symlinks.
 	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
 	      'exit $?'
-	  tstripme="$stripme"
+	  tstripme=$stripme
 	  case $host_os in
 	  cygwin* | mingw* | pw32* | cegcc*)
 	    case $realname in
 	    *.dll.a)
-	      tstripme=""
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
 	      ;;
 	    esac
 	    ;;
@@ -3006,7 +4334,7 @@ func_mode_install ()
 
 	  if test "$#" -gt 0; then
 	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
 	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
 	    # so we also need to try rm && ln -s.
 	    for linkname
@@ -3017,14 +4345,14 @@ func_mode_install ()
 	  fi
 
 	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
+	  lib=$destdir/$realname
 	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
 	# Install the pseudo-library for information purposes.
 	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
+	name=$func_basename_result
+	instname=$dir/${name}i
 	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
 	# Maybe install the static library, too.
@@ -3036,11 +4364,11 @@ func_mode_install ()
 
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# Deduce the name of the destination old-style object file.
@@ -3050,11 +4378,11 @@ func_mode_install ()
 	  staticdest=$func_lo2o_result
 	  ;;
 	*.$objext)
-	  staticdest="$destfile"
+	  staticdest=$destfile
 	  destfile=
 	  ;;
 	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
 	  ;;
 	esac
 
@@ -3063,7 +4391,7 @@ func_mode_install ()
 	  func_show_eval "$install_prog $file $destfile" 'exit $?'
 
 	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
+	if test yes = "$build_old_libs"; then
 	  # Deduce the name of the old-style object file.
 	  func_lo2o "$file"
 	  staticobj=$func_lo2o_result
@@ -3075,23 +4403,23 @@ func_mode_install ()
       *)
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# If the file is missing, and there is a .exe on the end, strip it
 	# because it is most likely a libtool script we actually want to
 	# install
-	stripped_ext=""
+	stripped_ext=
 	case $file in
 	  *.exe)
 	    if test ! -f "$file"; then
 	      func_stripname '' '.exe' "$file"
 	      file=$func_stripname_result
-	      stripped_ext=".exe"
+	      stripped_ext=.exe
 	    fi
 	    ;;
 	esac
@@ -3119,19 +4447,19 @@ func_mode_install ()
 
 	  # Check the variables that should have been set.
 	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
 
-	  finalize=yes
+	  finalize=:
 	  for lib in $notinst_deplibs; do
 	    # Check to see that each library is installed.
 	    libdir=
 	    if test -f "$lib"; then
 	      func_source "$lib"
 	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
 	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
 	    fi
 	  done
 
@@ -3139,29 +4467,29 @@ func_mode_install ()
 	  func_source "$wrapper"
 
 	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
+	  if test no = "$fast_install" && test -n "$relink_command"; then
 	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
+	      if $finalize; then
 	        tmpdir=`func_mktempdir`
 		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
 	        # Replace the output file specification.
 	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
-	        $opt_silent || {
+	        $opt_quiet || {
 	          func_quote_for_expand "$relink_command"
 		  eval "func_echo $func_quote_for_expand_result"
 	        }
 	        if eval "$relink_command"; then :
 	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
+		  func_error "error: relink '$file' with the above command before installing it"
 		  $opt_dry_run || ${RM}r "$tmpdir"
 		  continue
 	        fi
-	        file="$outputname"
+	        file=$outputname
 	      else
-	        func_warning "cannot relink \`$file'"
+	        func_warning "cannot relink '$file'"
 	      fi
 	    }
 	  else
@@ -3198,10 +4526,10 @@ func_mode_install ()
 
     for file in $staticlibs; do
       func_basename "$file"
-      name="$func_basename_result"
+      name=$func_basename_result
 
       # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      oldlib=$destdir/$name
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
@@ -3216,18 +4544,18 @@ func_mode_install ()
     done
 
     test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
+      func_warning "remember to run '$progname --finish$future_libdirs'"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
     else
       exit $EXIT_SUCCESS
     fi
 }
 
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
@@ -3235,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"}
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
     my_dlsyms=
 
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
+	my_dlsyms=${my_outputname}S.c
       else
 	func_error "not configured to extract global symbols from dlpreopened files"
       fi
@@ -3255,7 +4584,7 @@ func_generate_dlsyms ()
       "") ;;
       *.c)
 	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
+	nlist=$output_objdir/$my_outputname.nm
 
 	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
@@ -3263,34 +4592,36 @@ func_generate_dlsyms ()
 	func_verbose "creating $output_objdir/$my_dlsyms"
 
 	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* External symbol declarations for the compiler. */\
 "
 
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
 
 	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
@@ -3298,7 +4629,7 @@ extern \"C\" {
 	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	  for progfile in $progfiles; do
 	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
 	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
 	  done
 
@@ -3318,10 +4649,10 @@ extern \"C\" {
 
 	  # Prepare the list of exported symbols
 	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
+	    export_symbols=$output_objdir/$outputname.exp
 	    $opt_dry_run || {
 	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
 	      case $host in
 	      *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
@@ -3331,7 +4662,7 @@ extern \"C\" {
 	    }
 	  else
 	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
 	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	      case $host in
@@ -3345,22 +4676,22 @@ extern \"C\" {
 	fi
 
 	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_verbose "extracting global C symbols from '$dlprefile'"
 	  func_basename "$dlprefile"
-	  name="$func_basename_result"
+	  name=$func_basename_result
           case $host in
 	    *cygwin* | *mingw* | *cegcc* )
 	      # if an import library, we need to obtain dlname
 	      if func_win32_import_lib_p "$dlprefile"; then
 	        func_tr_sh "$dlprefile"
 	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
-	        dlprefile_dlbasename=""
+	        dlprefile_dlbasename=
 	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
 	          # Use subshell, to avoid clobbering current variable values
 	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-	          if test -n "$dlprefile_dlname" ; then
+	          if test -n "$dlprefile_dlname"; then
 	            func_basename "$dlprefile_dlname"
-	            dlprefile_dlbasename="$func_basename_result"
+	            dlprefile_dlbasename=$func_basename_result
 	          else
 	            # no lafile. user explicitly requested -dlpreopen <import library>.
 	            $sharedlib_from_linklib_cmd "$dlprefile"
@@ -3368,7 +4699,7 @@ extern \"C\" {
 	          fi
 	        fi
 	        $opt_dry_run || {
-	          if test -n "$dlprefile_dlbasename" ; then
+	          if test -n "$dlprefile_dlbasename"; then
 	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
 	          else
 	            func_warning "Could not compute DLL name from $name"
@@ -3424,6 +4755,11 @@ extern \"C\" {
 	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
 
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
 	  echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
@@ -3432,11 +4768,30 @@ typedef struct {
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
 
 	  case $need_lib_prefix in
 	  no)
@@ -3478,9 +4833,7 @@ static const void *lt_preloaded_setup() {
 	  *-*-hpux*)
 	    pic_flag_for_symtable=" $pic_flag"  ;;
 	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
 	    ;;
 	  esac
 	  ;;
@@ -3497,10 +4850,10 @@ static const void *lt_preloaded_setup() {
 	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
 	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
 
 	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	symfileobj=$output_objdir/${my_outputname}S.$objext
 	case $host in
 	*cygwin* | *mingw* | *cegcc* )
 	  if test -f "$output_objdir/$my_outputname.def"; then
@@ -3518,7 +4871,7 @@ static const void *lt_preloaded_setup() {
 	esac
 	;;
       *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
 	;;
       esac
     else
@@ -3532,6 +4885,32 @@ static const void *lt_preloaded_setup() {
     fi
 }
 
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
@@ -3541,8 +4920,9 @@ static const void *lt_preloaded_setup() {
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
-  $opt_debug
-  win32_libid_type="unknown"
+  $debug_cmd
+
+  win32_libid_type=unknown
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
@@ -3552,16 +4932,29 @@ func_win32_libid ()
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-	$SED -n -e '
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
 	    1,100{
 		/ I /{
-		    s,.*,import,
+		    s|.*|import|
 		    p
 		    q
 		}
 	    }'`
+	;;
+      esac
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
@@ -3593,7 +4986,8 @@ func_win32_libid ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
-  $opt_debug
+  $debug_cmd
+
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
@@ -3610,7 +5004,8 @@ func_cygming_dll_for_implib ()
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
-  $opt_debug
+  $debug_cmd
+
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
@@ -3646,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core ()
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
@@ -3658,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core ()
     $SED -e '/^\./d;/^.\./d;q'
 }
 
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
@@ -3695,16 +5066,17 @@ func_cygming_ms_implib_p ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
+  elif func_cygming_ms_implib_p "$1"; then
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
-    sharedlib_from_linklib_result=""
+    sharedlib_from_linklib_result=
   fi
 }
 
@@ -3712,10 +5084,11 @@ func_cygming_dll_for_implib_fallback ()
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
@@ -3724,7 +5097,7 @@ func_extract_an_archive ()
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
 		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
+    if test yes = "$lock_old_archive_extraction"; then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
@@ -3738,22 +5111,23 @@ func_extract_an_archive ()
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
-    $opt_debug
-    my_gentop="$1"; shift
+    $debug_cmd
+
+    my_gentop=$1; shift
     my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
 	*) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
+      my_xlib=$func_basename_result
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
@@ -3765,7 +5139,7 @@ func_extract_archives ()
 	esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
 
       func_mkdir_p "$my_xdir"
 
@@ -3778,22 +5152,23 @@ func_extract_archives ()
 	  cd $my_xdir || exit $?
 	  darwin_archive=$my_xabs
 	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
 	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
 	  if test -n "$darwin_arches"; then
 	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
 	    darwin_arch=
 	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
 	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
 	    done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
 	    darwin_file=
 	    darwin_files=
 	    for darwin_file in $darwin_filelist; do
@@ -3815,7 +5190,7 @@ func_extract_archives ()
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
-    func_extract_archives_result="$my_oldobjs"
+    func_extract_archives_result=$my_oldobjs
 }
 
 
@@ -3830,7 +5205,7 @@ func_extract_archives ()
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
+# will assume that the directory where it is stored is
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
@@ -3841,7 +5216,7 @@ func_emit_wrapper ()
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
@@ -3898,9 +5273,9 @@ _LTECHO_EOF'
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
+# /script/ and the wrapper /executable/ that is used only on
 # windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
+# (application programs are unlikely to have options that match
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
@@ -3933,7 +5308,7 @@ func_parse_lt_options ()
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
   fi
 }
 
@@ -3944,7 +5319,7 @@ func_lt_dump_args ()
   lt_dump_args_N=1;
   for lt_arg
   do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
@@ -3958,7 +5333,7 @@ func_exec_program_core ()
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
@@ -3968,7 +5343,7 @@ func_exec_program_core ()
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
@@ -4043,13 +5418,13 @@ func_exec_program ()
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
-	if test "$fast_install" = yes; then
+	if test yes = "$fast_install"; then
 	  $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
@@ -4066,7 +5441,7 @@ func_exec_program ()
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
-	$ECHO \"\$relink_command_output\" >&2
+	\$ECHO \"\$relink_command_output\" >&2
 	$RM \"\$progdir/\$file\"
 	exit 1
       fi
@@ -4101,7 +5476,7 @@ func_exec_program ()
 	fi
 
 	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
 	  $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
@@ -4121,7 +5496,7 @@ func_exec_program ()
     fi
   else
     # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
@@ -4140,7 +5515,7 @@ func_emit_cwrapperexe_src ()
 	cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
@@ -4175,47 +5550,45 @@ EOF
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
+#if defined __MINGW32__
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
-/* #elif defined (other platforms) ... */
+/* #elif defined other_platform || defined ... */
 #endif
 
 /* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
+#if defined _MSC_VER
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
+#elif defined __MINGW32__
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
+/* #elif defined other platforms ... */
 #endif
 
-#if defined(PATH_MAX)
+#if defined PATH_MAX
 # define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
+#elif defined MAXPATHLEN
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
@@ -4234,8 +5607,8 @@ int setenv (const char *, const char *, int);
 # define PATH_SEPARATOR ':'
 #endif
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
@@ -4268,10 +5641,10 @@ int setenv (const char *, const char *, int);
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
+  if (stale) { free (stale); stale = 0; } \
 } while (0)
 
-#if defined(LT_DEBUGWRAPPER)
+#if defined LT_DEBUGWRAPPER
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
@@ -4300,11 +5673,16 @@ void lt_dump_script (FILE *f);
 EOF
 
 	    cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
               func_to_host_path "$temp_rpath"
 	      cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
@@ -4328,7 +5706,7 @@ const char * EXE_PATH_VALUE   = "";
 EOF
 	    fi
 
-	    if test "$fast_install" = yes; then
+	    if test yes = "$fast_install"; then
 	      cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
@@ -4357,12 +5735,12 @@ main (int argc, char *argv[])
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
-  intptr_t rval = 127;
+  int rval = 127;
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
+  newargz = XMALLOC (char *, (size_t) argc + 1);
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
@@ -4371,10 +5749,10 @@ main (int argc, char *argv[])
   newargc=0;
   for (i = 1; i < argc; i++)
     {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
+      if (STREQ (argv[i], dumpscript_opt))
 	{
 EOF
-	    case "$host" in
+	    case $host in
 	      *mingw* | *cygwin* )
 		# make stdout use "unix" line endings
 		echo "          setmode(1,_O_BINARY);"
@@ -4385,12 +5763,12 @@ EOF
 	  lt_dump_script (stdout);
 	  return 0;
 	}
-      if (strcmp (argv[i], debug_opt) == 0)
+      if (STREQ (argv[i], debug_opt))
 	{
           lt_debug = 1;
           continue;
 	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+      if (STREQ (argv[i], ltwrapper_option_prefix))
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
@@ -4413,7 +5791,7 @@ EOF
 EOF
 	    cat <<EOF
   /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
 EOF
 	    cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
@@ -4524,7 +5902,7 @@ EOF
 		cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
@@ -4569,7 +5947,7 @@ base_name (const char *name)
 {
   const char *base;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
@@ -4628,7 +6006,7 @@ find_executable (const char *wrapper)
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
-  int tmp_len;
+  size_t tmp_len;
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
@@ -4638,7 +6016,7 @@ find_executable (const char *wrapper)
     return NULL;
 
   /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
@@ -4656,7 +6034,7 @@ find_executable (const char *wrapper)
 	    return concat_name;
 	  XFREE (concat_name);
 	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
     }
 #endif
 
@@ -4679,7 +6057,7 @@ find_executable (const char *wrapper)
 	      for (q = p; *q; q++)
 		if (IS_PATH_SEPARATOR (*q))
 		  break;
-	      p_len = q - p;
+	      p_len = (size_t) (q - p);
 	      p_next = (*q == '\0' ? q : q + 1);
 	      if (p_len == 0)
 		{
@@ -4798,7 +6176,7 @@ strendzap (char *str, const char *pat)
   if (patlen <= len)
     {
       str += len - patlen;
-      if (strcmp (str, pat) == 0)
+      if (STREQ (str, pat))
 	*str = '\0';
     }
   return str;
@@ -4863,7 +6241,7 @@ lt_setenv (const char *name, const char *value)
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
-    int len = strlen (name) + 1 + strlen (value) + 1;
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
@@ -4880,8 +6258,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
   char *new_value;
   if (orig_value && *orig_value)
     {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
@@ -4912,10 +6290,10 @@ lt_update_exe_path (const char *name, const char *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
         {
-          new_value[len-1] = '\0';
+          new_value[--len] = '\0';
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
@@ -5082,27 +6460,47 @@ EOF
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
-    $opt_debug
+    $debug_cmd
+
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
 # func_mode_link arg...
 func_mode_link ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
+      # what system we are compiling for in order to pass an extra
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
+      # to make a dll that has undefined symbols, in which case not
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
@@ -5146,10 +6544,11 @@ func_mode_link ()
     module=no
     no_install=no
     objs=
+    os2dllname=
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
-    preload=no
+    preload=false
     prev=
     prevarg=
     release=
@@ -5161,7 +6560,7 @@ func_mode_link ()
     vinfo=
     vinfo_number=no
     weak_libs=
-    single_module="${wl}-single_module"
+    single_module=$wl-single_module
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
@@ -5169,15 +6568,15 @@ func_mode_link ()
     do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	break
 	;;
       -all-static | -static | -static-libtool-libs)
 	case $arg in
 	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
 	    func_warning "complete static linking is impossible in this configuration"
 	  fi
 	  if test -n "$link_static_flag"; then
@@ -5210,7 +6609,7 @@ func_mode_link ()
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
-      arg="$1"
+      arg=$1
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
@@ -5227,21 +6626,21 @@ func_mode_link ()
 
 	case $prev in
 	bindir)
-	  bindir="$arg"
+	  bindir=$arg
 	  prev=
 	  continue
 	  ;;
 	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
+	  $preload || {
 	    # Add the symbol object into the linking commands.
 	    func_append compile_command " @SYMFILE@"
 	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
+	    preload=:
+	  }
 	  case $arg in
 	  *.la | *.lo) ;;  # We handle these cases below.
 	  force)
-	    if test "$dlself" = no; then
+	    if test no = "$dlself"; then
 	      dlself=needless
 	      export_dynamic=yes
 	    fi
@@ -5249,9 +6648,9 @@ func_mode_link ()
 	    continue
 	    ;;
 	  self)
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
 	      dlself=yes
 	    else
 	      dlself=needless
@@ -5261,7 +6660,7 @@ func_mode_link ()
 	    continue
 	    ;;
 	  *)
-	    if test "$prev" = dlfiles; then
+	    if test dlfiles = "$prev"; then
 	      func_append dlfiles " $arg"
 	    else
 	      func_append dlprefiles " $arg"
@@ -5272,14 +6671,14 @@ func_mode_link ()
 	  esac
 	  ;;
 	expsyms)
-	  export_symbols="$arg"
+	  export_symbols=$arg
 	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
+	    || func_fatal_error "symbol file '$arg' does not exist"
 	  prev=
 	  continue
 	  ;;
 	expsyms_regex)
-	  export_symbols_regex="$arg"
+	  export_symbols_regex=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5297,7 +6696,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	inst_prefix)
-	  inst_prefix_dir="$arg"
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
 	  prev=
 	  continue
 	  ;;
@@ -5321,21 +6726,21 @@ func_mode_link ()
 
 		if test -z "$pic_object" ||
 		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
 		fi
 
 		# Extract subdirectory from the argument.
 		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
+		xdir=$func_dirname_result
 
-		if test "$pic_object" != none; then
+		if test none != "$pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
+		  pic_object=$xdir$pic_object
 
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		      func_append dlfiles " $pic_object"
 		      prev=
 		      continue
@@ -5346,7 +6751,7 @@ func_mode_link ()
 		  fi
 
 		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
+		  if test dlprefiles = "$prev"; then
 		    # Preload the old-style object.
 		    func_append dlprefiles " $pic_object"
 		    prev=
@@ -5354,23 +6759,23 @@ func_mode_link ()
 
 		  # A PIC object.
 		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
+		  arg=$pic_object
 		fi
 
 		# Non-PIC object.
-		if test "$non_pic_object" != none; then
+		if test none != "$non_pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
+		  non_pic_object=$xdir$non_pic_object
 
 		  # A standard non-PIC object
 		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
 		  fi
 		else
 		  # If the PIC object exists, use it instead.
 		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
+		  non_pic_object=$pic_object
 		  func_append non_pic_objects " $non_pic_object"
 		fi
 	      else
@@ -5378,7 +6783,7 @@ func_mode_link ()
 		if $opt_dry_run; then
 		  # Extract subdirectory from the argument.
 		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
+		  xdir=$func_dirname_result
 
 		  func_lo2o "$arg"
 		  pic_object=$xdir$objdir/$func_lo2o_result
@@ -5386,24 +6791,29 @@ func_mode_link ()
 		  func_append libobjs " $pic_object"
 		  func_append non_pic_objects " $non_pic_object"
 	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
+		  func_fatal_error "'$arg' is not a valid libtool object"
 		fi
 	      fi
 	    done
 	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
+	    func_fatal_error "link input file '$arg' does not exist"
 	  fi
 	  arg=$save_arg
 	  prev=
 	  continue
 	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
 	precious_regex)
-	  precious_files_regex="$arg"
+	  precious_files_regex=$arg
 	  prev=
 	  continue
 	  ;;
 	release)
-	  release="-$arg"
+	  release=-$arg
 	  prev=
 	  continue
 	  ;;
@@ -5415,7 +6825,7 @@ func_mode_link ()
 	    func_fatal_error "only absolute run-paths are allowed"
 	    ;;
 	  esac
-	  if test "$prev" = rpath; then
+	  if test rpath = "$prev"; then
 	    case "$rpath " in
 	    *" $arg "*) ;;
 	    *) func_append rpath " $arg" ;;
@@ -5430,7 +6840,7 @@ func_mode_link ()
 	  continue
 	  ;;
 	shrext)
-	  shrext_cmds="$arg"
+	  shrext_cmds=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5470,7 +6880,7 @@ func_mode_link ()
 	esac
       fi # test -n "$prev"
 
-      prevarg="$arg"
+      prevarg=$arg
 
       case $arg in
       -all-static)
@@ -5484,7 +6894,7 @@ func_mode_link ()
 
       -allow-undefined)
 	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
 	;;
 
       -avoid-version)
@@ -5516,7 +6926,7 @@ func_mode_link ()
 	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
 	  func_fatal_error "more than one -exported-symbols argument is not allowed"
 	fi
-	if test "X$arg" = "X-export-symbols"; then
+	if test X-export-symbols = "X$arg"; then
 	  prev=expsyms
 	else
 	  prev=expsyms_regex
@@ -5550,9 +6960,9 @@ func_mode_link ()
 	func_stripname "-L" '' "$arg"
 	if test -z "$func_stripname_result"; then
 	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
+	    func_fatal_error "require no space between '-L' and '$1'"
 	  else
-	    func_fatal_error "need path for \`-L' option"
+	    func_fatal_error "need path for '-L' option"
 	  fi
 	fi
 	func_resolve_sysroot "$func_stripname_result"
@@ -5563,8 +6973,8 @@ func_mode_link ()
 	*)
 	  absdir=`cd "$dir" && pwd`
 	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
 	  ;;
 	esac
 	case "$deplibs " in
@@ -5599,7 +7009,7 @@ func_mode_link ()
 	;;
 
       -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
 	    # These systems don't actually have a C or math library (as such)
@@ -5607,11 +7017,11 @@ func_mode_link ()
 	    ;;
 	  *-*-os2*)
 	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
 	    # Rhapsody C and math libraries are in the System framework
@@ -5620,16 +7030,16 @@ func_mode_link ()
 	    ;;
 	  *-*-sco3.2v5* | *-*-sco5v6*)
 	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
 	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  esac
-	elif test "X$arg" = "X-lc_r"; then
+	elif test X-lc_r = "X$arg"; then
 	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	   # Do not include libc_r directly, use -pthread flag.
 	   continue
 	   ;;
@@ -5639,6 +7049,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
       -module)
 	module=yes
 	continue
@@ -5668,7 +7083,7 @@ func_mode_link ()
 	;;
 
       -multi_module)
-	single_module="${wl}-multi_module"
+	single_module=$wl-multi_module
 	continue
 	;;
 
@@ -5682,8 +7097,8 @@ func_mode_link ()
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
 	  # The PATH hackery in wrapper scripts is required on Windows
 	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
 	  fast_install=no
 	  ;;
 	*) no_install=yes ;;
@@ -5701,6 +7116,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
       -o) prev=output ;;
 
       -precious-files-regex)
@@ -5788,14 +7208,14 @@ func_mode_link ()
 	func_stripname '-Wc,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $func_quote_for_eval_result"
 	  func_append compiler_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5804,15 +7224,15 @@ func_mode_link ()
 	func_stripname '-Wl,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $wl$func_quote_for_eval_result"
 	  func_append compiler_flags " $wl$func_quote_for_eval_result"
 	  func_append linker_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5835,7 +7255,7 @@ func_mode_link ()
       # -msg_* for osf cc
       -msg_*)
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -5847,25 +7267,49 @@ func_mode_link ()
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       *.$objext)
@@ -5886,21 +7330,21 @@ func_mode_link ()
 
 	  if test -z "$pic_object" ||
 	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
 	  fi
 
 	  # Extract subdirectory from the argument.
 	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
+	  xdir=$func_dirname_result
 
-	  if test "$pic_object" != none; then
+	  test none = "$pic_object" || {
 	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
+	    pic_object=$xdir$pic_object
 
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		func_append dlfiles " $pic_object"
 		prev=
 		continue
@@ -5911,7 +7355,7 @@ func_mode_link ()
 	    fi
 
 	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      # Preload the old-style object.
 	      func_append dlprefiles " $pic_object"
 	      prev=
@@ -5919,23 +7363,23 @@ func_mode_link ()
 
 	    # A PIC object.
 	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
+	    arg=$pic_object
+	  }
 
 	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
+	  if test none != "$non_pic_object"; then
 	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
+	    non_pic_object=$xdir$non_pic_object
 
 	    # A standard non-PIC object
 	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
 	    fi
 	  else
 	    # If the PIC object exists, use it instead.
 	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
+	    non_pic_object=$pic_object
 	    func_append non_pic_objects " $non_pic_object"
 	  fi
 	else
@@ -5943,7 +7387,7 @@ func_mode_link ()
 	  if $opt_dry_run; then
 	    # Extract subdirectory from the argument.
 	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
+	    xdir=$func_dirname_result
 
 	    func_lo2o "$arg"
 	    pic_object=$xdir$objdir/$func_lo2o_result
@@ -5951,7 +7395,7 @@ func_mode_link ()
 	    func_append libobjs " $pic_object"
 	    func_append non_pic_objects " $non_pic_object"
 	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
+	    func_fatal_error "'$arg' is not a valid libtool object"
 	  fi
 	fi
 	;;
@@ -5967,11 +7411,11 @@ func_mode_link ()
 	# A libtool-controlled library.
 
 	func_resolve_sysroot "$arg"
-	if test "$prev" = dlfiles; then
+	if test dlfiles = "$prev"; then
 	  # This library was specified with -dlopen.
 	  func_append dlfiles " $func_resolve_sysroot_result"
 	  prev=
-	elif test "$prev" = dlprefiles; then
+	elif test dlprefiles = "$prev"; then
 	  # The library was specified with -dlpreopen.
 	  func_append dlprefiles " $func_resolve_sysroot_result"
 	  prev=
@@ -5986,7 +7430,7 @@ func_mode_link ()
 	# Unknown arguments in both finalize_command and compile_command need
 	# to be aesthetically quoted because they are evaled later.
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
       esac # arg
 
@@ -5998,9 +7442,9 @@ func_mode_link ()
     done # argument parsing loop
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
+      func_fatal_help "the '$prevarg' option requires an argument"
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
@@ -6009,20 +7453,23 @@ func_mode_link ()
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
     func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
+    output_objdir=$func_dirname_result$objdir
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
@@ -6045,7 +7492,7 @@ func_mode_link ()
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
+      if $opt_preserve_dup_deps; then
 	case "$libs " in
 	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	esac
@@ -6053,7 +7500,7 @@ func_mode_link ()
       func_append libs " $deplib"
     done
 
-    if test "$linkmode" = lib; then
+    if test lib = "$linkmode"; then
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
@@ -6085,7 +7532,7 @@ func_mode_link ()
 	  case $file in
 	  *.la) ;;
 	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
 	    ;;
 	  esac
 	done
@@ -6093,7 +7540,7 @@ func_mode_link ()
     prog)
 	compile_deplibs=
 	finalize_deplibs=
-	alldeplibs=no
+	alldeplibs=false
 	newdlfiles=
 	newdlprefiles=
 	passes="conv scan dlopen dlpreopen link"
@@ -6105,32 +7552,32 @@ func_mode_link ()
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
+      if test lib,link = "$linkmode,$pass"; then
 	## FIXME: Find the place where the list is rebuilt in the wrong
 	##        order, and fix it there properly
         tmp_deplibs=
 	for deplib in $deplibs; do
 	  tmp_deplibs="$deplib $tmp_deplibs"
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
       fi
 
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
 	deplibs=
       fi
-      if test "$linkmode" = prog; then
+      if test prog = "$linkmode"; then
 	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
 	link)
 	  libs="$deplibs %DEPLIBS%"
 	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
 	  ;;
 	esac
       fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+      if test lib,dlpreopen = "$linkmode,$pass"; then
 	# Collect and forward deplibs of preopened libtool libs
 	for lib in $dlprefiles; do
 	  # Ignore non-libtool-libs
@@ -6151,26 +7598,26 @@ func_mode_link ()
 	    esac
 	  done
 	done
-	libs="$dlprefiles"
+	libs=$dlprefiles
       fi
-      if test "$pass" = dlopen; then
+      if test dlopen = "$pass"; then
 	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
+	save_deplibs=$deplibs
 	deplibs=
       fi
 
       for deplib in $libs; do
 	lib=
-	found=no
+	found=false
 	case $deplib in
 	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    func_append compiler_flags " $deplib"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6180,13 +7627,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
 	    continue
 	  fi
 	  func_stripname '-l' '' "$deplib"
 	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
 	  else
 	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
@@ -6194,31 +7641,22 @@ func_mode_link ()
 	  for searchdir in $searchdirs; do
 	    for search_ext in .la $std_shrext .so .a; do
 	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
+	      lib=$searchdir/lib$name$search_ext
 	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
+		if test .la = "$search_ext"; then
+		  found=:
 		else
-		  found=no
+		  found=false
 		fi
 		break 2
 	      fi
 	    done
 	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
+	  if $found; then
+	    # deplib is a libtool library
 	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
 	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 	      case " $predeps $postdeps " in
 	      *" $deplib "*)
 		if func_lalib_p "$lib"; then
@@ -6226,19 +7664,19 @@ func_mode_link ()
 		  old_library=
 		  func_source "$lib"
 		  for l in $old_library $library_names; do
-		    ll="$l"
+		    ll=$l
 		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
 		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
+		    ladir=$func_dirname_result
 		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
+		    if test prog,link = "$linkmode,$pass"; then
 		      compile_deplibs="$deplib $compile_deplibs"
 		      finalize_deplibs="$deplib $finalize_deplibs"
 		    else
 		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
 		    fi
 		    continue
 		  fi
@@ -6247,15 +7685,25 @@ func_mode_link ()
 	      *) ;;
 	      esac
 	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
 	  fi
 	  ;; # -l
 	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6268,18 +7716,18 @@ func_mode_link ()
 	  case $linkmode in
 	  lib)
 	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
+	    test conv = "$pass" && continue
 	    newdependency_libs="$deplib $newdependency_libs"
 	    func_stripname '-L' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  prog)
-	    if test "$pass" = conv; then
+	    if test conv = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	      continue
 	    fi
-	    if test "$pass" = scan; then
+	    if test scan = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6290,13 +7738,13 @@ func_mode_link ()
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
+	    func_warning "'-L' is ignored for archives/objects"
 	    ;;
 	  esac # linkmode
 	  continue
 	  ;; # -L
 	-R*)
-	  if test "$pass" = link; then
+	  if test link = "$pass"; then
 	    func_stripname '-R' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    dir=$func_resolve_sysroot_result
@@ -6314,7 +7762,7 @@ func_mode_link ()
 	  lib=$func_resolve_sysroot_result
 	  ;;
 	*.$libext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
 	    continue
 	  fi
@@ -6325,21 +7773,26 @@ func_mode_link ()
 	    case " $dlpreconveniencelibs " in
 	    *" $deplib "*) ;;
 	    *)
-	      valid_a_lib=no
+	      valid_a_lib=false
 	      case $deplibs_check_method in
 		match_pattern*)
 		  set dummy $deplibs_check_method; shift
 		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
 		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
+		    valid_a_lib=:
 		  fi
 		;;
 		pass_all)
-		  valid_a_lib=yes
+		  valid_a_lib=:
 		;;
 	      esac
-	      if test "$valid_a_lib" != yes; then
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
 		echo
 		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
 		echo "*** I have the capability to make that library automatically link in when"
@@ -6347,18 +7800,13 @@ func_mode_link ()
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because the file extensions .$libext of this argument makes me believe"
 		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
 	      fi
 	      ;;
 	    esac
 	    continue
 	    ;;
 	  prog)
-	    if test "$pass" != link; then
+	    if test link != "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6369,10 +7817,10 @@ func_mode_link ()
 	  esac # linkmode
 	  ;; # *.$libext
 	*.lo | *.$objext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
 	      # If there is no dlopen support or we're linking statically,
 	      # we need to preload.
 	      func_append newdlprefiles " $deplib"
@@ -6385,22 +7833,20 @@ func_mode_link ()
 	  continue
 	  ;;
 	%DEPLIBS%)
-	  alldeplibs=yes
+	  alldeplibs=:
 	  continue
 	  ;;
 	esac # case $deplib
 
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
 
 	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
+	ladir=$func_dirname_result
 
 	dlname=
 	dlopen=
@@ -6430,19 +7876,19 @@ func_mode_link ()
 	  done
 	fi
 	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
 	  test -n "$dlopen" && func_append dlfiles " $dlopen"
 	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
 	fi
 
-	if test "$pass" = conv; then
+	if test conv = "$pass"; then
 	  # Only check for convenience libraries
 	  deplibs="$lib $deplibs"
 	  if test -z "$libdir"; then
 	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
+	      func_fatal_error "cannot find name of link library for '$lib'"
 	    fi
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
@@ -6450,15 +7896,15 @@ func_mode_link ()
 	    tmp_libs=
 	    for deplib in $dependency_libs; do
 	      deplibs="$deplib $deplibs"
-	      if $opt_preserve_dup_deps ; then
+	      if $opt_preserve_dup_deps; then
 		case "$tmp_libs " in
 		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 		esac
 	      fi
 	      func_append tmp_libs " $deplib"
 	    done
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
 	  fi
 	  continue
 	fi # $pass = conv
@@ -6467,26 +7913,26 @@ func_mode_link ()
 	# Get the name of the library we link against.
 	linklib=
 	if test -n "$old_library" &&
-	   { test "$prefer_static_libs" = yes ||
-	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
 	  linklib=$old_library
 	else
 	  for l in $old_library $library_names; do
-	    linklib="$l"
+	    linklib=$l
 	  done
 	fi
 	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
+	  func_fatal_error "cannot find name of link library for '$lib'"
 	fi
 
 	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
 	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
 	    # If there is no dlname, no dlopen support or we're linking
 	    # statically, we need to preload.  We also need to preload any
 	    # dependent libraries so libltdl's deplib preloader doesn't
@@ -6500,40 +7946,40 @@ func_mode_link ()
 
 	# We need an absolute path.
 	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
 	*)
 	  abs_ladir=`cd "$ladir" && pwd`
 	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "cannot determine absolute directory name of '$ladir'"
 	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
+	    abs_ladir=$ladir
 	  fi
 	  ;;
 	esac
 	func_basename "$lib"
-	laname="$func_basename_result"
+	laname=$func_basename_result
 
 	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
+	if test yes = "$installed"; then
 	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
 	  else
-	    dir="$lt_sysroot$libdir"
-	    absdir="$lt_sysroot$libdir"
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
 	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
 	else
 	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
+	    dir=$ladir
+	    absdir=$abs_ladir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  fi
@@ -6542,11 +7988,11 @@ func_mode_link ()
 	name=$func_stripname_result
 
 	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
 	  fi
-	  case "$host" in
+	  case $host in
 	    # special handling for platforms with PE-DLLs.
 	    *cygwin* | *mingw* | *cegcc* )
 	      # Linker will automatically link against shared library if both
@@ -6590,9 +8036,9 @@ func_mode_link ()
 
 	if test -z "$libdir"; then
 	  # Link the convenience library
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
+	  elif test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$dir/$old_library $compile_deplibs"
 	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
 	  else
@@ -6602,14 +8048,14 @@ func_mode_link ()
 	fi
 
 
-	if test "$linkmode" = prog && test "$pass" != link; then
+	if test prog = "$linkmode" && test link != "$pass"; then
 	  func_append newlib_search_path " $ladir"
 	  deplibs="$lib $deplibs"
 
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
 	  fi
 
 	  tmp_libs=
@@ -6621,14 +8067,14 @@ func_mode_link ()
 		 ;;
 	    esac
 	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
+	    if $linkalldeplibs; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      # Need to hardcode shared library paths
 	      # or/and link against static libraries
 	      newdependency_libs="$deplib $newdependency_libs"
 	    fi
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	      esac
@@ -6638,15 +8084,15 @@ func_mode_link ()
 	  continue
 	fi # $linkmode = prog...
 
-	if test "$linkmode,$pass" = "prog,link"; then
+	if test prog,link = "$linkmode,$pass"; then
 	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
 	       test -z "$old_library"; }; then
 	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
 	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
+	      case $temp_rpath: in
 	      *"$absdir:"*) ;;
 	      *) func_append temp_rpath "$absdir:" ;;
 	      esac
@@ -6675,9 +8121,9 @@ func_mode_link ()
 	    esac
 	  fi # $linkmode,$pass = prog,link...
 
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
 		 test -n "$library_names"; }; }; then
 	    # We only need to search for static libraries
 	    continue
@@ -6686,19 +8132,19 @@ func_mode_link ()
 
 	link_static=no # Whether the deplib will be linked statically
 	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
+	if test built = "$use_static_libs" && test yes = "$installed"; then
 	  use_static_libs=no
 	fi
 	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
 	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
 	      # No point in relinking DLLs because paths are not encoded
 	      func_append notinst_deplibs " $lib"
 	      need_relink=no
 	    ;;
 	  *)
-	    if test "$installed" = no; then
+	    if test no = "$installed"; then
 	      func_append notinst_deplibs " $lib"
 	      need_relink=yes
 	    fi
@@ -6708,24 +8154,24 @@ func_mode_link ()
 
 	  # Warn about portability, can't link against -module's on some
 	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
+	  dlopenmodule=
 	  for dlpremoduletest in $dlprefiles; do
 	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
+	      dlopenmodule=$dlpremoduletest
 	      break
 	    fi
 	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
 	    echo
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
 	    else
 	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
 	    fi
 	    $ECHO "*** $linklib is not portable!"
 	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
 	    # Hardcode the library path.
 	    # Skip directories that are in the system default run-time
 	    # search path.
@@ -6753,43 +8199,43 @@ func_mode_link ()
 	    # figure out the soname
 	    set dummy $library_names
 	    shift
-	    realname="$1"
+	    realname=$1
 	    shift
 	    libname=`eval "\\$ECHO \"$libname_spec\""`
 	    # use dlname if we got it. it's perfectly good, no?
 	    if test -n "$dlname"; then
-	      soname="$dlname"
+	      soname=$dlname
 	    elif test -n "$soname_spec"; then
 	      # bleh windows
 	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
+	      *cygwin* | mingw* | *cegcc* | *os2*)
 	        func_arith $current - $age
 		major=$func_arith_result
-		versuffix="-$major"
+		versuffix=-$major
 		;;
 	      esac
 	      eval soname=\"$soname_spec\"
 	    else
-	      soname="$realname"
+	      soname=$realname
 	    fi
 
 	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
+	    soroot=$soname
 	    func_basename "$soroot"
-	    soname="$func_basename_result"
+	    soname=$func_basename_result
 	    func_stripname 'lib' '.dll' "$soname"
 	    newlib=libimp-$func_stripname_result.a
 
 	    # If the library has no export list, then create one now
 	    if test -f "$output_objdir/$soname-def"; then :
 	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_verbose "extracting exported symbol list from '$soname'"
 	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
 	    fi
 
 	    # Create $newlib
 	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
+	      func_verbose "generating import library for '$soname'"
 	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
 	    fi
 	    # make sure the library variables are pointing to the new library
@@ -6797,58 +8243,58 @@ func_mode_link ()
 	    linklib=$newlib
 	  fi # test -n "$old_archive_from_expsyms_cmds"
 
-	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    lib_linked=yes
 	    case $hardcode_action in
 	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
 		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
 		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
+		    *-*-unixware7*) add_dir=-L$dir ;;
 		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
+		    # if the lib is a (non-dlopened) module then we cannot
 		    # link against it, someone is ignoring the earlier warnings
 		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
+			 $GREP ": [^:]* bundle" >/dev/null; then
 		      if test "X$dlopenmodule" != "X$lib"; then
 			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
+			if test -z "$old_library"; then
 			  echo
 			  echo "*** And there doesn't seem to be a static archive available"
 			  echo "*** The link will probably fail, sorry"
 			else
-			  add="$dir/$old_library"
+			  add=$dir/$old_library
 			fi
 		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
+			add=$dir/$old_library
 		      fi
 		    fi
 		esac
-	      elif test "$hardcode_minus_L" = no; then
+	      elif test no = "$hardcode_minus_L"; then
 		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
+		*-*-sunos*) add_shlibpath=$dir ;;
 		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
 	      ;;
 	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
 		# Try looking first in the location we're being installed to.
 		if test -n "$inst_prefix_dir"; then
 		  case $libdir in
@@ -6857,10 +8303,10 @@ func_mode_link ()
 		      ;;
 		  esac
 		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
@@ -6868,7 +8314,7 @@ func_mode_link ()
 	    *) lib_linked=no ;;
 	    esac
 
-	    if test "$lib_linked" != yes; then
+	    if test yes != "$lib_linked"; then
 	      func_fatal_configuration "unsupported hardcode properties"
 	    fi
 
@@ -6878,15 +8324,15 @@ func_mode_link ()
 	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
 	      esac
 	    fi
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
 	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
 	    else
 	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
 	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
 		case :$finalize_shlibpath: in
 		*":$libdir:"*) ;;
 		*) func_append finalize_shlibpath "$libdir:" ;;
@@ -6895,33 +8341,33 @@ func_mode_link ()
 	    fi
 	  fi
 
-	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
 	      case :$finalize_shlibpath: in
 	      *":$libdir:"*) ;;
 	      *) func_append finalize_shlibpath "$libdir:" ;;
 	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
 	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
 	      else
-		add="$libdir/$linklib"
+		add=$libdir/$linklib
 	      fi
 	    else
 	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
+	      add_dir=-L$libdir
 	      # Try looking first in the location we're being installed to.
 	      if test -n "$inst_prefix_dir"; then
 		case $libdir in
@@ -6930,10 +8376,10 @@ func_mode_link ()
 		    ;;
 		esac
 	      fi
-	      add="-l$name"
+	      add=-l$name
 	    fi
 
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
 	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
 	    else
@@ -6941,43 +8387,43 @@ func_mode_link ()
 	      test -n "$add" && deplibs="$add $deplibs"
 	    fi
 	  fi
-	elif test "$linkmode" = prog; then
+	elif test prog = "$linkmode"; then
 	  # Here we assume that one of hardcode_direct or hardcode_minus_L
 	  # is not unsupported.  This is valid on all known static and
 	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
 	    compile_deplibs="$dir/$linklib $compile_deplibs"
 	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
 	  else
 	    compile_deplibs="-l$name -L$dir $compile_deplibs"
 	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
 	  fi
-	elif test "$build_libtool_libs" = yes; then
+	elif test yes = "$build_libtool_libs"; then
 	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
+	  if test pass_all != "$deplibs_check_method"; then
 	    # We're trying link a shared library against a static one
 	    # but the system doesn't support it.
 
 	    # Just print a warning and add the library to dependency_libs so
 	    # that the program can be linked against the static library.
 	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
 	    echo "*** I have the capability to make that library automatically link in when"
 	    echo "*** you link to this library.  But I can only do this if you have a"
 	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
+	    if test yes = "$module"; then
 	      echo "*** But as you try to build a module library, libtool will still create "
 	      echo "*** a static module, that should work as long as the dlopening application"
 	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
 	      if test -z "$global_symbol_pipe"; then
 		echo
 		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	      fi
-	      if test "$build_old_libs" = no; then
+	      if test no = "$build_old_libs"; then
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -6990,11 +8436,11 @@ func_mode_link ()
 	  fi
 	fi # link shared/static library?
 
-	if test "$linkmode" = lib; then
+	if test lib = "$linkmode"; then
 	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
 	    # Extract -R from dependency_libs
 	    temp_deplibs=
 	    for libdir in $dependency_libs; do
@@ -7008,12 +8454,12 @@ func_mode_link ()
 	      *) func_append temp_deplibs " $libdir";;
 	      esac
 	    done
-	    dependency_libs="$temp_deplibs"
+	    dependency_libs=$temp_deplibs
 	  fi
 
 	  func_append newlib_search_path " $absdir"
 	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
 	  # ... and its dependency_libs
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
@@ -7023,7 +8469,7 @@ func_mode_link ()
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
@@ -7032,12 +8478,12 @@ func_mode_link ()
 	    func_append tmp_libs " $func_resolve_sysroot_result"
 	  done
 
-	  if test "$link_all_deplibs" != no; then
+	  if test no != "$link_all_deplibs"; then
 	    # Add the search paths of all dependency libraries
 	    for deplib in $dependency_libs; do
 	      path=
 	      case $deplib in
-	      -L*) path="$deplib" ;;
+	      -L*) path=$deplib ;;
 	      *.la)
 	        func_resolve_sysroot "$deplib"
 	        deplib=$func_resolve_sysroot_result
@@ -7045,12 +8491,12 @@ func_mode_link ()
 		dir=$func_dirname_result
 		# We need an absolute path.
 		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
 		*)
 		  absdir=`cd "$dir" && pwd`
 		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
 		  fi
 		  ;;
 		esac
@@ -7058,35 +8504,35 @@ func_mode_link ()
 		case $host in
 		*-*-darwin*)
 		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
 		      depdepl=$tmp
 		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                       if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
-		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
 		      path=
 		    fi
 		  fi
 		  ;;
 		*)
-		  path="-L$absdir/$objdir"
+		  path=-L$absdir/$objdir
 		  ;;
 		esac
 		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
 		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
 		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
+		    func_warning "'$deplib' seems to be moved"
 
-		  path="-L$absdir"
+		  path=-L$absdir
 		fi
 		;;
 	      esac
@@ -7098,23 +8544,23 @@ func_mode_link ()
 	  fi # link_all_deplibs != no
 	fi # linkmode = lib
       done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
 	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
 	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
 	else
 	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	fi
       fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
 	# Link the dlpreopened libraries before other libraries
 	for deplib in $save_deplibs; do
 	  deplibs="$deplib $deplibs"
 	done
       fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
 	  # Make sure lib_search_path contains only unique directories.
 	  lib_search_path=
 	  for dir in $newlib_search_path; do
@@ -7124,12 +8570,12 @@ func_mode_link ()
 	    esac
 	  done
 	  newlib_search_path=
-	fi
+	}
 
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
+	if test prog,link = "$linkmode,$pass"; then
 	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
 	fi
 	for var in $vars dependency_libs; do
 	  # Add libraries to $var in reverse order
@@ -7187,62 +8633,93 @@ func_mode_link ()
 	  eval $var=\"$tmp_libs\"
 	done # for var
       fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
-      for i in $dependency_libs ; do
+      for i in $dependency_libs; do
 	case " $predeps $postdeps $compiler_lib_search_path " in
 	*" $i "*)
-	  i=""
+	  i=
 	  ;;
 	esac
-	if test -n "$i" ; then
+	if test -n "$i"; then
 	  func_append tmp_libs " $i"
 	fi
       done
       dependency_libs=$tmp_libs
     done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
     fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
     fi
 
     case $linkmode in
     oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+	func_warning "'-l' and '-L' are ignored for archives" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
+	func_warning "'-rpath' is ignored for archives"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
+	func_warning "'-R' is ignored for archives"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
+	func_warning "'-version-info/-version-number' is ignored for archives"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
+	func_warning "'-release' is ignored for archives"
 
       test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
+	func_warning "'-export-symbols' is ignored for archives"
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
-      oldlibs="$output"
+      oldlibs=$output
       func_append objs "$old_deplibs"
       ;;
 
     lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
+      # Make sure we only generate libraries of the form 'libNAME.la'.
       case $outputname in
       lib*)
 	func_stripname 'lib' '.la' "$outputname"
@@ -7251,10 +8728,10 @@ func_mode_link ()
 	eval libname=\"$libname_spec\"
 	;;
       *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
 
-	if test "$need_lib_prefix" != no; then
+	if test no != "$need_lib_prefix"; then
 	  # Add the "lib" prefix for modules if required
 	  func_stripname '' '.la' "$outputname"
 	  name=$func_stripname_result
@@ -7268,8 +8745,8 @@ func_mode_link ()
       esac
 
       if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
 	else
 	  echo
 	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
@@ -7278,21 +8755,21 @@ func_mode_link ()
 	fi
       fi
 
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
 
       set dummy $rpath
       shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
 
-      install_libdir="$1"
+      install_libdir=$1
 
       oldlibs=
       if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
+	if test yes = "$build_libtool_libs"; then
 	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
+	  # Some compilers have problems with a '.al' extension so
 	  # convenience libraries should have the same extension an
 	  # archive normally would.
 	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
@@ -7301,20 +8778,20 @@ func_mode_link ()
 	fi
 
 	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
 
 	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
+	  func_warning "'-release' is ignored for convenience libraries"
       else
 
 	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
+	save_ifs=$IFS; IFS=:
 	set dummy $vinfo 0 0 0
 	shift
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
+	  func_fatal_help "too many parameters to '-version-info'"
 
 	# convert absolute version numbers to libtool ages
 	# this retains compatibility with .la files and attempts
@@ -7322,45 +8799,45 @@ func_mode_link ()
 
 	case $vinfo_number in
 	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
 	  #
 	  # There are really only two kinds -- those that
 	  # use the current revision as the major version
 	  # and those that subtract age and use age as
 	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
+	  # that has an extra 1 added just for fun
 	  #
 	  case $version_type in
 	  # correct linux to gnu/linux during the next big refactor
-	  darwin|linux|osf|windows|none)
+	  darwin|freebsd-elf|linux|osf|windows|none)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
+	    age=$number_minor
+	    revision=$number_revision
 	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
 	    ;;
 	  irix|nonstopux)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
+	    age=$number_minor
+	    revision=$number_minor
 	    lt_irix_increment=no
 	    ;;
 	  *)
-	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    func_fatal_configuration "$modename: unknown library version type '$version_type'"
 	    ;;
 	  esac
 	  ;;
 	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
+	  current=$1
+	  revision=$2
+	  age=$3
 	  ;;
 	esac
 
@@ -7368,30 +8845,30 @@ func_mode_link ()
 	case $current in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $revision in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $age in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	fi
 
 	# Calculate the version variables.
@@ -7406,26 +8883,36 @@ func_mode_link ()
 	  # verstring for coding it into the library header
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  # Darwin ld doesn't like 0 for these options...
 	  func_arith $current + 1
 	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
 	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
 	  ;;
 
 	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
+	  if test no = "$lt_irix_increment"; then
 	    func_arith $current - $age
 	  else
 	    func_arith $current - $age + 1
@@ -7436,69 +8923,74 @@ func_mode_link ()
 	    nonstopux) verstring_prefix=nonstopux ;;
 	    *)         verstring_prefix=sgi ;;
 	  esac
-	  verstring="$verstring_prefix$major.$revision"
+	  verstring=$verstring_prefix$major.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$revision
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $revision - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
+	    verstring=$verstring_prefix$major.$iface:$verstring
 	  done
 
-	  # Before this point, $major must not contain `.'.
+	  # Before this point, $major must not contain '.'.
 	  major=.$major
-	  versuffix="$major.$revision"
+	  versuffix=$major.$revision
 	  ;;
 
 	linux) # correct to gnu/linux during the next big refactor
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	osf)
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$age
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $current - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
+	    verstring=$verstring:$iface.0
 	  done
 
 	  # Make executables depend on our current version.
-	  func_append verstring ":${current}.0"
+	  func_append verstring ":$current.0"
 	  ;;
 
 	qnx)
-	  major=".$current"
-	  versuffix=".$current"
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
 	  ;;
 
 	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	windows)
 	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
+	  # extension on DOS 8.3 file systems.
 	  func_arith $current - $age
 	  major=$func_arith_result
-	  versuffix="-$major"
+	  versuffix=-$major
 	  ;;
 
 	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  func_fatal_configuration "unknown library version type '$version_type'"
 	  ;;
 	esac
 
@@ -7512,42 +9004,45 @@ func_mode_link ()
 	    verstring=
 	    ;;
 	  *)
-	    verstring="0.0"
+	    verstring=0.0
 	    ;;
 	  esac
-	  if test "$need_version" = no; then
+	  if test no = "$need_version"; then
 	    versuffix=
 	  else
-	    versuffix=".0.0"
+	    versuffix=.0.0
 	  fi
 	fi
 
 	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
+	if test yes,no = "$avoid_version,$need_version"; then
 	  major=
 	  versuffix=
-	  verstring=""
+	  verstring=
 	fi
 
 	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
 	  fi
 	else
 	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
+	  allow_undefined_flag=$no_undefined_flag
 	fi
 
       fi
 
-      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_generate_dlsyms "$libname" "$libname" :
       func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
+      test " " = "$libobjs" && libobjs=
 
-      if test "$opt_mode" != relink; then
+      if test relink != "$opt_mode"; then
 	# Remove our outputs, but don't remove object files since they
 	# may have been created when compiling PIC objects.
 	removelist=
@@ -7556,8 +9051,8 @@ func_mode_link ()
 	  case $p in
 	    *.$objext | *.gcno)
 	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
 		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
 		 then
 		   continue
@@ -7573,11 +9068,11 @@ func_mode_link ()
       fi
 
       # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
 	func_append oldlibs " $output_objdir/$libname.$libext"
 
 	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
@@ -7598,13 +9093,13 @@ func_mode_link ()
 	  *) func_append finalize_rpath " $libdir" ;;
 	  esac
 	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
 	  dependency_libs="$temp_xrpath $dependency_libs"
 	fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
+      old_dlfiles=$dlfiles
       dlfiles=
       for lib in $old_dlfiles; do
 	case " $dlprefiles $dlfiles " in
@@ -7614,7 +9109,7 @@ func_mode_link ()
       done
 
       # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
+      old_dlprefiles=$dlprefiles
       dlprefiles=
       for lib in $old_dlprefiles; do
 	case "$dlprefiles " in
@@ -7623,7 +9118,7 @@ func_mode_link ()
 	esac
       done
 
-      if test "$build_libtool_libs" = yes; then
+      if test yes = "$build_libtool_libs"; then
 	if test -n "$rpath"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
@@ -7647,7 +9142,7 @@ func_mode_link ()
 	    ;;
 	  *)
 	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
+	    if test yes = "$build_libtool_need_lc"; then
 	      func_append deplibs " -lc"
 	    fi
 	    ;;
@@ -7663,9 +9158,9 @@ func_mode_link ()
 	# I'm not sure if I'm treating the release correctly.  I think
 	# release should show up in the -l (ie -lgmp5) so we don't want to
 	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
+	release=
+	versuffix=
+	major=
 	newdeplibs=
 	droppeddeps=no
 	case $deplibs_check_method in
@@ -7694,20 +9189,20 @@ EOF
 	      -l*)
 		func_stripname -l '' "$i"
 		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		  case " $predeps $postdeps " in
 		  *" $i "*)
 		    func_append newdeplibs " $i"
-		    i=""
+		    i=
 		    ;;
 		  esac
 		fi
-		if test -n "$i" ; then
+		if test -n "$i"; then
 		  libname=`eval "\\$ECHO \"$libname_spec\""`
 		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		  set dummy $deplib_matches; shift
 		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		    func_append newdeplibs " $i"
 		  else
 		    droppeddeps=yes
@@ -7737,20 +9232,20 @@ EOF
 		$opt_dry_run || $RM conftest
 		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
 		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		    case " $predeps $postdeps " in
 		    *" $i "*)
 		      func_append newdeplibs " $i"
-		      i=""
+		      i=
 		      ;;
 		    esac
 		  fi
-		  if test -n "$i" ; then
+		  if test -n "$i"; then
 		    libname=`eval "\\$ECHO \"$libname_spec\""`
 		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		    set dummy $deplib_matches; shift
 		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		      func_append newdeplibs " $i"
 		    else
 		      droppeddeps=yes
@@ -7787,24 +9282,24 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		if test -n "$file_magic_glob"; then
 		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
 		else
 		  libnameglob=$libname
 		fi
-		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  if test "$want_nocaseglob" = yes; then
+		  if test yes = "$want_nocaseglob"; then
 		    shopt -s nocaseglob
 		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
 		    $nocaseglob
@@ -7822,25 +9317,25 @@ EOF
 		      # We might still enter an endless loop, since a link
 		      # loop can be closed while we follow links,
 		      # but so what?
-		      potlib="$potent_lib"
+		      potlib=$potent_lib
 		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
 			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
 			esac
 		      done
 		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
 			 $SED -e 10q |
 			 $EGREP "$file_magic_regex" > /dev/null; then
 			func_append newdeplibs " $a_deplib"
-			a_deplib=""
+			a_deplib=
 			break 2
 		      fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7848,7 +9343,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7871,30 +9366,30 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
 		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    potlib=$potent_lib # see symlink-check above in file_magic test
 		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
 		       $EGREP "$match_pattern_regex" > /dev/null; then
 		      func_append newdeplibs " $a_deplib"
-		      a_deplib=""
+		      a_deplib=
 		      break 2
 		    fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7902,7 +9397,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7918,18 +9413,18 @@ EOF
 	  done # Gone through all deplibs.
 	  ;;
 	none | unknown | *)
-	  newdeplibs=""
+	  newdeplibs=
 	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
 	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
 	    done
 	  fi
 	  case $tmp_deplibs in
 	  *[!\	\ ]*)
 	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
+	    if test none = "$deplibs_check_method"; then
 	      echo "*** Warning: inter-library dependencies are not supported in this platform."
 	    else
 	      echo "*** Warning: inter-library dependencies are not known to be supported."
@@ -7953,8 +9448,8 @@ EOF
 	  ;;
 	esac
 
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
 	    echo
 	    echo "*** Warning: libtool could not satisfy all declared inter-library"
 	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
@@ -7963,12 +9458,12 @@ EOF
 	    if test -z "$global_symbol_pipe"; then
 	      echo
 	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
 	      build_libtool_libs=module
 	      build_old_libs=yes
 	    else
@@ -7979,14 +9474,14 @@ EOF
 	    echo "*** automatically added whenever a program is linked with this library"
 	    echo "*** or is declared to -dlopen it."
 
-	    if test "$allow_undefined" = no; then
+	    if test no = "$allow_undefined"; then
 	      echo
 	      echo "*** Since this library must not contain undefined symbols,"
 	      echo "*** because either the platform does not support them or"
 	      echo "*** it was explicitly requested with -no-undefined,"
 	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -8032,7 +9527,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      deplibs="$new_libs"
+      deplibs=$new_libs
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
@@ -8040,25 +9535,25 @@ EOF
       dlname=
 
       # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	# Remove ${wl} instances when linking with ld.
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
 	# FIXME: should test the right _cmds variable.
 	case $archive_cmds in
 	  *\$LD\ *) wl= ;;
         esac
-	if test "$hardcode_into_libs" = yes; then
+	if test yes = "$hardcode_into_libs"; then
 	  # Hardcode the library paths
 	  hardcode_libdirs=
 	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
 	  for libdir in $rpath; do
 	    if test -n "$hardcode_libdir_flag_spec"; then
 	      if test -n "$hardcode_libdir_separator"; then
 		func_replace_sysroot "$libdir"
 		libdir=$func_replace_sysroot_result
 		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
+		  hardcode_libdirs=$libdir
 		else
 		  # Just accumulate the unique libdirs.
 		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8083,7 +9578,7 @@ EOF
 	  # Substitute the hardcoded libdirs into the rpath.
 	  if test -n "$hardcode_libdir_separator" &&
 	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
+	    libdir=$hardcode_libdirs
 	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
 	  fi
 	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
@@ -8097,8 +9592,8 @@ EOF
 	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
 	fi
 
-	shlibpath="$finalize_shlibpath"
-	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
 	if test -n "$shlibpath"; then
 	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
 	fi
@@ -8108,19 +9603,19 @@ EOF
 	eval library_names=\"$library_names_spec\"
 	set dummy $library_names
 	shift
-	realname="$1"
+	realname=$1
 	shift
 
 	if test -n "$soname_spec"; then
 	  eval soname=\"$soname_spec\"
 	else
-	  soname="$realname"
+	  soname=$realname
 	fi
 	if test -z "$dlname"; then
 	  dlname=$soname
 	fi
 
-	lib="$output_objdir/$realname"
+	lib=$output_objdir/$realname
 	linknames=
 	for link
 	do
@@ -8134,7 +9629,7 @@ EOF
 	delfiles=
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
 	  func_append delfiles " $export_symbols"
 	fi
 
@@ -8143,31 +9638,31 @@ EOF
 	cygwin* | mingw* | cegcc*)
 	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
 	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	    func_dll_def_p "$export_symbols" || {
 	      # and it's NOT already a .def file. Must figure out
 	      # which of the given symbols are data symbols and tag
 	      # them as such. So, trigger use of export_symbols_cmds.
 	      # export_symbols gets reassigned inside the "prepare
 	      # the list of exported symbols" if statement, so the
 	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
+	      orig_export_symbols=$export_symbols
 	      export_symbols=
 	      always_export_symbols=yes
-	    fi
+	    }
 	  fi
 	  ;;
 	esac
 
 	# Prepare the list of exported symbols
 	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
 	    $opt_dry_run || $RM $export_symbols
 	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd1 in $cmds; do
-	      IFS="$save_ifs"
+	      IFS=$save_ifs
 	      # Take the normal branch if the nm_file_list_spec branch
 	      # doesn't work or if tool conversion is not needed.
 	      case $nm_file_list_spec~$to_tool_file_cmd in
@@ -8181,7 +9676,7 @@ EOF
 		  try_normal_branch=no
 		  ;;
 	      esac
-	      if test "$try_normal_branch" = yes \
+	      if test yes = "$try_normal_branch" \
 		 && { test "$len" -lt "$max_cmd_len" \
 		      || test "$max_cmd_len" -le -1; }
 	      then
@@ -8192,7 +9687,7 @@ EOF
 		output_la=$func_basename_result
 		save_libobjs=$libobjs
 		save_output=$output
-		output=${output_objdir}/${output_la}.nm
+		output=$output_objdir/$output_la.nm
 		func_to_tool_file "$output"
 		libobjs=$nm_file_list_spec$func_to_tool_file_result
 		func_append delfiles " $output"
@@ -8215,8 +9710,8 @@ EOF
 		break
 	      fi
 	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
@@ -8224,16 +9719,16 @@ EOF
 	fi
 
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	fi
 
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
 	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
 	  # though. Also, the filter scales superlinearly with the number of
 	  # global variables. join(1) would be nice here, but unfortunately
 	  # isn't a blessed tool.
@@ -8252,11 +9747,11 @@ EOF
 	    ;;
 	  esac
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
 
 	if test -n "$convenience"; then
 	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
+	    test yes = "$compiler_needs_object" &&
 	    test -z "$libobjs"; then
 	    # extract the archives, so we have objects to list.
 	    # TODO: could optimize this to just extract one archive.
@@ -8267,7 +9762,7 @@ EOF
 	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
 	    test "X$libobjs" = "X " && libobjs=
 	  else
-	    gentop="$output_objdir/${outputname}x"
+	    gentop=$output_objdir/${outputname}x
 	    func_append generated " $gentop"
 
 	    func_extract_archives $gentop $convenience
@@ -8276,18 +9771,18 @@ EOF
 	  fi
 	fi
 
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
 	  eval flag=\"$thread_safe_flag_spec\"
 	  func_append linker_flags " $flag"
 	fi
 
 	# Make a backup of the uninstalled library when relinking
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
 	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
+	if test yes = "$module" && test -n "$module_cmds"; then
 	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	    eval test_cmds=\"$module_expsym_cmds\"
 	    cmds=$module_expsym_cmds
@@ -8305,7 +9800,7 @@ EOF
 	  fi
 	fi
 
-	if test "X$skipped_export" != "X:" &&
+	if test : != "$skipped_export" &&
 	   func_len " $test_cmds" &&
 	   len=$func_len_result &&
 	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
@@ -8338,8 +9833,8 @@ EOF
 	  last_robj=
 	  k=1
 
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
 	    func_verbose "creating GNU ld script: $output"
 	    echo 'INPUT (' > $output
 	    for obj in $save_libobjs
@@ -8351,14 +9846,14 @@ EOF
 	    func_append delfiles " $output"
 	    func_to_tool_file "$output"
 	    output=$func_to_tool_file_result
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
 	    func_verbose "creating linker input file list: $output"
 	    : > $output
 	    set x $save_libobjs
 	    shift
 	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
+	    if test yes = "$compiler_needs_object"; then
 	      firstobj="$1 "
 	      shift
 	    fi
@@ -8373,7 +9868,7 @@ EOF
 	  else
 	    if test -n "$save_libobjs"; then
 	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
+	      output=$output_objdir/$output_la-$k.$objext
 	      eval test_cmds=\"$reload_cmds\"
 	      func_len " $test_cmds"
 	      len0=$func_len_result
@@ -8385,13 +9880,13 @@ EOF
 		func_len " $obj"
 		func_arith $len + $func_len_result
 		len=$func_arith_result
-		if test "X$objlist" = X ||
+		if test -z "$objlist" ||
 		   test "$len" -lt "$max_cmd_len"; then
 		  func_append objlist " $obj"
 		else
 		  # The command $test_cmds is almost too long, add a
 		  # command to the queue.
-		  if test "$k" -eq 1 ; then
+		  if test 1 -eq "$k"; then
 		    # The first file doesn't have a previous command to add.
 		    reload_objs=$objlist
 		    eval concat_cmds=\"$reload_cmds\"
@@ -8401,10 +9896,10 @@ EOF
 		    reload_objs="$objlist $last_robj"
 		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
 		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  last_robj=$output_objdir/$output_la-$k.$objext
 		  func_arith $k + 1
 		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
+		  output=$output_objdir/$output_la-$k.$objext
 		  objlist=" $obj"
 		  func_len " $last_robj"
 		  func_arith $len0 + $func_len_result
@@ -8416,9 +9911,9 @@ EOF
 	      # files will link in the last one created.
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
 	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
 	      func_append delfiles " $output"
 
@@ -8426,9 +9921,9 @@ EOF
 	      output=
 	    fi
 
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
 	      $opt_dry_run || $RM $export_symbols
 	      libobjs=$output
 	      # Append the command to create the export file.
@@ -8437,16 +9932,16 @@ EOF
 	      if test -n "$last_robj"; then
 		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
-	    fi
+	    }
 
 	    test -n "$save_libobjs" &&
 	      func_verbose "creating a temporary reloadable object file: $output"
 
 	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
+	      IFS=$save_ifs
+	      $opt_quiet || {
 		  func_quote_for_expand "$cmd"
 		  eval "func_echo $func_quote_for_expand_result"
 	      }
@@ -8454,7 +9949,7 @@ EOF
 		lt_exit=$?
 
 		# Restore the uninstalled library and exit
-		if test "$opt_mode" = relink; then
+		if test relink = "$opt_mode"; then
 		  ( cd "$output_objdir" && \
 		    $RM "${realname}T" && \
 		    $MV "${realname}U" "$realname" )
@@ -8463,7 +9958,7 @@ EOF
 		exit $lt_exit
 	      }
 	    done
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 
 	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
@@ -8471,18 +9966,18 @@ EOF
 	    fi
 	  fi
 
-          if ${skipped_export-false}; then
+          ${skipped_export-false} && {
 	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	    fi
 
 	    if test -n "$orig_export_symbols"; then
 	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
 	      # though. Also, the filter scales superlinearly with the number of
 	      # global variables. join(1) would be nice here, but unfortunately
 	      # isn't a blessed tool.
@@ -8491,7 +9986,7 @@ EOF
 	      export_symbols=$output_objdir/$libname.def
 	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	    fi
-	  fi
+	  }
 
 	  libobjs=$output
 	  # Restore the value of output.
@@ -8505,7 +10000,7 @@ EOF
 	  # value of $libobjs for piecewise linking.
 
 	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test yes = "$module" && test -n "$module_cmds"; then
 	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	      cmds=$module_expsym_cmds
 	    else
@@ -8527,7 +10022,7 @@ EOF
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -8535,11 +10030,12 @@ EOF
 	  test "X$libobjs" = "X " && libobjs=
 	fi
 
-	save_ifs="$IFS"; IFS='~'
+	save_ifs=$IFS; IFS='~'
 	for cmd in $cmds; do
-	  IFS="$save_ifs"
+	  IFS=$sp$nl
 	  eval cmd=\"$cmd\"
-	  $opt_silent || {
+	  IFS=$save_ifs
+	  $opt_quiet || {
 	    func_quote_for_expand "$cmd"
 	    eval "func_echo $func_quote_for_expand_result"
 	  }
@@ -8547,7 +10043,7 @@ EOF
 	    lt_exit=$?
 
 	    # Restore the uninstalled library and exit
-	    if test "$opt_mode" = relink; then
+	    if test relink = "$opt_mode"; then
 	      ( cd "$output_objdir" && \
 	        $RM "${realname}T" && \
 		$MV "${realname}U" "$realname" )
@@ -8556,10 +10052,10 @@ EOF
 	    exit $lt_exit
 	  }
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	# Restore the uninstalled library and exit
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
 	  if test -n "$convenience"; then
@@ -8579,39 +10075,39 @@ EOF
 	done
 
 	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
+	if test yes = "$module" || test yes = "$export_dynamic"; then
 	  # On all known operating systems, these are identical.
-	  dlname="$soname"
+	  dlname=$soname
 	fi
       fi
       ;;
 
     obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+	func_warning "'-l' and '-L' are ignored for objects" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
+	func_warning "'-rpath' is ignored for objects"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
+	func_warning "'-R' is ignored for objects"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
+	func_warning "'-version-info' is ignored for objects"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
+	func_warning "'-release' is ignored for objects"
 
       case $output in
       *.lo)
 	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
 
 	libobj=$output
 	func_lo2o "$libobj"
@@ -8619,7 +10115,7 @@ EOF
 	;;
       *)
 	libobj=
-	obj="$output"
+	obj=$output
 	;;
       esac
 
@@ -8632,17 +10128,19 @@ EOF
       # the extraction.
       reload_conv_objs=
       gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
       if test -n "$convenience"; then
 	if test -n "$whole_archive_flag_spec"; then
 	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
 	else
-	  gentop="$output_objdir/${obj}x"
+	  gentop=$output_objdir/${obj}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $convenience
@@ -8651,12 +10149,12 @@ EOF
       fi
 
       # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
 
       # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
 
-      output="$obj"
+      output=$obj
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
@@ -8668,7 +10166,7 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$build_libtool_libs" != yes; then
+      test yes = "$build_libtool_libs" || {
 	if test -n "$gentop"; then
 	  func_show_eval '${RM}r "$gentop"'
 	fi
@@ -8678,12 +10176,12 @@ EOF
 	# $show "echo timestamp > $libobj"
 	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
 	exit $EXIT_SUCCESS
-      fi
+      }
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
 	# Only do commands if we really have different PIC objects.
 	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
+	output=$libobj
 	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
@@ -8700,16 +10198,14 @@ EOF
 	          output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
+	func_warning "'-version-info' is ignored for programs"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
+	func_warning "'-release' is ignored for programs"
 
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
@@ -8723,11 +10219,11 @@ EOF
       *-*-darwin*)
 	# Don't allow lazy linking, it breaks C++ global constructors
 	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
+	if test CXX = "$tagname"; then
 	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
 	    10.[0123])
-	      func_append compile_command " ${wl}-bind_at_load"
-	      func_append finalize_command " ${wl}-bind_at_load"
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
 	    ;;
 	  esac
 	fi
@@ -8763,7 +10259,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      compile_deplibs="$new_libs"
+      compile_deplibs=$new_libs
 
 
       func_append compile_command " $compile_deplibs"
@@ -8787,7 +10283,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8810,7 +10306,7 @@ EOF
 	fi
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$libdir:"*) ;;
 	  ::) dllsearchpath=$libdir;;
@@ -8827,10 +10323,10 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      compile_rpath="$rpath"
+      compile_rpath=$rpath
 
       rpath=
       hardcode_libdirs=
@@ -8838,7 +10334,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8863,45 +10359,43 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      finalize_rpath="$rpath"
+      finalize_rpath=$rpath
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
 	# Transform all the library objects into standard objects.
 	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
 	func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
-      wrappers_required=yes
+      wrappers_required=:
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
+        wrappers_required=false
         ;;
       *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
+        test yes = "$build_libtool_libs" || wrappers_required=false
         ;;
       *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
         fi
         ;;
       esac
-      if test "$wrappers_required" = no; then
+      $wrappers_required || {
 	# Replace the output file specification.
 	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
+	link_command=$compile_command$compile_rpath
 
 	# We have no uninstalled library dependencies, so finalize right now.
 	exit_status=0
@@ -8914,12 +10408,12 @@ EOF
 	fi
 
 	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
 	fi
 
 	exit $exit_status
-      fi
+      }
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
 	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
@@ -8949,9 +10443,9 @@ EOF
 	fi
       fi
 
-      if test "$no_install" = yes; then
+      if test yes = "$no_install"; then
 	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
+	link_command=$compile_var$compile_command$compile_rpath
 	# Replace the output file specification.
 	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
 	# Delete the old output file.
@@ -8968,27 +10462,28 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
 
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
@@ -9045,8 +10540,8 @@ EOF
 	    func_dirname_and_basename "$output" "" "."
 	    output_name=$func_basename_result
 	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
 	    $RM $cwrappersource $cwrapper
 	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
@@ -9067,7 +10562,7 @@ EOF
 	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
 	    $opt_dry_run || {
 	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
+	      if test "x$build" = "x$host"; then
 		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
 		func_emit_wrapper no > $func_ltwrapper_scriptname_result
@@ -9090,25 +10585,27 @@ EOF
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
 	  build_libtool_libs=no
-	else
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
 	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    func_append oldobjs " $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
 
       if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
+	gentop=$output_objdir/${outputname}x
 	func_append generated " $gentop"
 
 	func_extract_archives $gentop $addlibs
@@ -9116,13 +10613,13 @@ EOF
       fi
 
       # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
 	cmds=$old_archive_from_new_cmds
       else
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -9143,7 +10640,7 @@ EOF
 	  :
 	else
 	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 	  func_mkdir_p "$gentop"
 	  save_oldobjs=$oldobjs
@@ -9152,7 +10649,7 @@ EOF
 	  for obj in $save_oldobjs
 	  do
 	    func_basename "$obj"
-	    objbase="$func_basename_result"
+	    objbase=$func_basename_result
 	    case " $oldobjs " in
 	    " ") oldobjs=$obj ;;
 	    *[\ /]"$objbase "*)
@@ -9221,18 +10718,18 @@ EOF
 	    else
 	      # the above command should be used before it gets too long
 	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
+	      if test "$obj" = "$last_oldobj"; then
 		RANLIB=$save_RANLIB
 	      fi
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
 	      objlist=
 	      len=$len0
 	    fi
 	  done
 	  RANLIB=$save_RANLIB
 	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
+	  if test -z "$oldobjs"; then
 	    eval cmds=\"\$concat_cmds\"
 	  else
 	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
@@ -9249,7 +10746,7 @@ EOF
     case $output in
     *.la)
       old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      test yes = "$build_old_libs" && old_library=$libname.$libext
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
@@ -9264,31 +10761,31 @@ EOF
 	fi
       done
       # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
+      if test yes = "$hardcode_automatic"; then
 	relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
 	for installed in no yes; do
-	  if test "$installed" = yes; then
+	  if test yes = "$installed"; then
 	    if test -z "$install_libdir"; then
 	      break
 	    fi
-	    output="$output_objdir/$outputname"i
+	    output=$output_objdir/${outputname}i
 	    # Replace all uninstalled libtool libraries with the installed ones
 	    newdependency_libs=
 	    for deplib in $dependency_libs; do
 	      case $deplib in
 	      *.la)
 		func_basename "$deplib"
-		name="$func_basename_result"
+		name=$func_basename_result
 		func_resolve_sysroot "$deplib"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
 		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      -L*)
@@ -9304,23 +10801,23 @@ EOF
 	      *) func_append newdependency_libs " $deplib" ;;
 	      esac
 	    done
-	    dependency_libs="$newdependency_libs"
+	    dependency_libs=$newdependency_libs
 	    newdlfiles=
 
 	    for lib in $dlfiles; do
 	      case $lib in
 	      *.la)
 	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      *) func_append newdlfiles " $lib" ;;
 	      esac
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
@@ -9330,34 +10827,34 @@ EOF
 		# didn't already link the preopened objects directly into
 		# the library:
 		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      esac
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  else
 	    newdlfiles=
 	    for lib in $dlfiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlfiles " $abs"
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlprefiles " $abs"
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  fi
 	  $RM $output
 	  # place dlname in correct position for cygwin
@@ -9373,10 +10870,9 @@ EOF
 	  case $host,$output,$installed,$module,$dlname in
 	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
 	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
+	      if test -n "$bindir"; then
 		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
+		tdlname=$func_relative_path_result/$dlname
 	      else
 		# Otherwise fall back on heuristic.
 		tdlname=../bin/$dlname
@@ -9385,7 +10881,7 @@ EOF
 	  esac
 	  $ECHO > $output "\
 # $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -9399,7 +10895,7 @@ library_names='$library_names'
 # The name of the static archive.
 old_library='$old_library'
 
-# Linker flags that can not go in dependency_libs.
+# Linker flags that cannot go in dependency_libs.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
@@ -9425,7 +10921,7 @@ dlpreopen='$dlprefiles'
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
+	  if test no,yes = "$installed,$need_relink"; then
 	    $ECHO >> $output "\
 relink_command=\"$relink_command\""
 	  fi
@@ -9440,27 +10936,29 @@ relink_command=\"$relink_command\""
     exit $EXIT_SUCCESS
 }
 
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
-    $opt_debug
-    RM="$nonopt"
+    $debug_cmd
+
+    RM=$nonopt
     files=
-    rmforce=
+    rmforce=false
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     for arg
     do
       case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
+      -f) func_append RM " $arg"; rmforce=: ;;
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
@@ -9473,18 +10971,18 @@ func_mode_uninstall ()
 
     for file in $files; do
       func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	odir="$objdir"
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
       else
-	odir="$dir/$objdir"
+	odir=$dir/$objdir
       fi
       func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
 
       # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
+      if test clean = "$opt_mode"; then
 	case " $rmdirs " in
 	  *" $odir "*) ;;
 	  *) func_append rmdirs " $odir" ;;
@@ -9499,11 +10997,11 @@ func_mode_uninstall ()
       elif test -d "$file"; then
 	exit_status=1
 	continue
-      elif test "$rmforce" = yes; then
+      elif $rmforce; then
 	continue
       fi
 
-      rmfiles="$file"
+      rmfiles=$file
 
       case $name in
       *.la)
@@ -9517,7 +11015,7 @@ func_mode_uninstall ()
 	  done
 	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
-	  case "$opt_mode" in
+	  case $opt_mode in
 	  clean)
 	    case " $library_names " in
 	    *" $dlname "*) ;;
@@ -9528,12 +11026,12 @@ func_mode_uninstall ()
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
@@ -9549,21 +11047,19 @@ func_mode_uninstall ()
 	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
+	  if test -n "$pic_object" && test none != "$pic_object"; then
 	    func_append rmfiles " $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
 	    func_append rmfiles " $dir/$non_pic_object"
 	  fi
 	fi
 	;;
 
       *)
-	if test "$opt_mode" = clean ; then
+	if test clean = "$opt_mode"; then
 	  noexename=$name
 	  case $file in
 	  *.exe)
@@ -9590,12 +11086,12 @@ func_mode_uninstall ()
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
-	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
 	      func_append rmfiles " $odir/lt-$name"
 	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
 	    fi
 	  fi
 	fi
@@ -9604,7 +11100,7 @@ func_mode_uninstall ()
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
-    # Try to remove the ${objdir}s in the directories where we deleted files
+    # Try to remove the $objdir's in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
 	func_show_eval "rmdir $dir >/dev/null 2>&1"
@@ -9614,16 +11110,17 @@ func_mode_uninstall ()
     exit $exit_status
 }
 
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
 
 test -z "$opt_mode" && {
-  help="$generic_help"
+  help=$generic_help
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
+  func_fatal_help "invalid operation mode '$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
@@ -9634,7 +11131,7 @@ exit $exit_status
 
 
 # The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
+# where we disable both kinds of libraries.  Given conflicting
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
@@ -9657,5 +11154,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # mode:shell-script
 # sh-indentation:2
 # End:
-# vi:sw=2
-
diff --git a/src/gmock/gtest/build-aux/missing b/src/gmock/gtest/build-aux/missing
index db98974..f62bbae 100755
--- a/src/gmock/gtest/build-aux/missing
+++ b/src/gmock/gtest/build-aux/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/src/gmock/gtest/build-aux/test-driver b/src/gmock/gtest/build-aux/test-driver
index d306056..8e575b0 100755
--- a/src/gmock/gtest/build-aux/test-driver
+++ b/src/gmock/gtest/build-aux/test-driver
@@ -3,7 +3,7 @@
 
 scriptversion=2013-07-13.22; # UTC
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -106,11 +106,14 @@ trap "st=143; $do_exit" 15
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
+
 if test $enable_hard_errors = no && test $estatus -eq 99; then
-  estatus=1
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
 fi
 
-case $estatus:$expect_failure in
+case $tweaked_estatus:$expect_failure in
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
@@ -119,6 +122,12 @@ case $estatus:$expect_failure in
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 
diff --git a/src/gmock/gtest/configure b/src/gmock/gtest/configure
index efd9c87..40b2ed0 100755
--- a/src/gmock/gtest/configure
+++ b/src/gmock/gtest/configure
@@ -647,6 +647,7 @@ HAVE_PYTHON_TRUE
 PYTHON
 CXXCPP
 CPP
+LT_SYS_LIBRARY_PATH
 OTOOL64
 OTOOL
 LIPO
@@ -745,6 +746,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -773,6 +775,7 @@ enable_shared
 enable_static
 with_pic
 enable_fast_install
+with_aix_soname
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
@@ -789,6 +792,7 @@ CPPFLAGS
 CXX
 CXXFLAGS
 CCC
+LT_SYS_LIBRARY_PATH
 CPP
 CXXCPP'
 
@@ -829,6 +833,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1081,6 +1086,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1218,7 +1232,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1371,6 +1385,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1426,9 +1441,12 @@ Optional Packages:
   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
   --with-pthreads         use pthreads (default is yes)
 
 Some influential environment variables:
@@ -1441,6 +1459,8 @@ Some influential environment variables:
               you have headers in a nonstandard directory <include dir>
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
   CPP         C preprocessor
   CXXCPP      C++ preprocessor
 
@@ -2301,7 +2321,7 @@ ac_config_files="$ac_config_files scripts/gtest-config"
 # Initialize Automake with various options. We require at least v1.9, prevent
 # pedantic complaints about package files, and enable various distribution
 # targets.
-am__api_version='1.14'
+am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -2473,8 +2493,8 @@ test "$program_suffix" != NONE &&
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
@@ -2493,7 +2513,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -2821,8 +2841,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -2880,6 +2900,7 @@ END
   fi
 fi
 
+
 # Check for programs used in building Google Test.
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -4319,8 +4340,8 @@ esac
 
 
 
-macro_version='2.4.2'
-macro_revision='1.3337'
+macro_version='2.4.6'
+macro_revision='2.4.6'
 
 
 
@@ -4334,7 +4355,7 @@ macro_revision='1.3337'
 
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
@@ -4454,7 +4475,7 @@ func_echo_all ()
     $ECHO ""
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
 $as_echo "printf" >&6; } ;;
   print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
@@ -4777,19 +4798,19 @@ test -z "$GREP" && GREP=grep
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -4803,7 +4824,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -4814,7 +4835,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -4825,32 +4846,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -4893,33 +4914,38 @@ if ${lt_cv_path_NM+:} false; then :
 else
   if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -4930,15 +4956,15 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
 $as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
@@ -5044,9 +5070,9 @@ esac
   fi
 fi
 
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -5054,8 +5080,8 @@ fi
     esac
   fi
 
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -5106,7 +5132,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then :
   $as_echo_n "(cached) " >&6
 else
     i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -5146,7 +5172,7 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -5197,22 +5223,22 @@ else
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-	test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -5230,7 +5256,7 @@ else
 
 fi
 
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
 $as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
@@ -5248,30 +5274,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
@@ -5394,13 +5396,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -5528,13 +5530,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[4-9]*)
@@ -5561,8 +5563,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -5658,8 +5659,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
@@ -5712,6 +5713,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 
 fi
@@ -5869,8 +5873,8 @@ else
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -5882,7 +5886,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 
@@ -6037,7 +6041,7 @@ if ac_fn_cxx_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
@@ -6045,7 +6049,7 @@ if ac_fn_cxx_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -6058,7 +6062,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
 $as_echo "$lt_cv_ar_at_file" >&6; }
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -6275,7 +6279,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -6365,7 +6369,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[ABCDEGRST]'
   fi
   ;;
@@ -6398,14 +6402,44 @@ case `$NM -V 2>&1` in
   symcode='[ABCDGIRSTW]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -6423,21 +6457,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -6485,11 +6522,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
@@ -6515,7 +6552,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -6535,13 +6572,13 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
 	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -6562,7 +6599,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -6615,6 +6652,16 @@ fi
 
 
 
+
+
+
+
+
+
+
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
 $as_echo_n "checking for sysroot... " >&6; }
 
@@ -6627,9 +6674,9 @@ fi
 
 
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -6639,8 +6686,8 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
    as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
    ;;
 esac
@@ -6652,19 +6699,100 @@ $as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
 
 # Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then :
   enableval=$enable_libtool_lock;
 fi
 
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -6673,24 +6801,25 @@ ia64-*-hpux*)
   test $ac_status = 0; }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -6719,9 +6848,50 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -6744,10 +6914,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 		;;
 	    esac
 	    ;;
-	  powerpc64le-*)
+	  powerpc64le-*linux*)
 	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  powerpc64-*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -6766,10 +6936,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  powerpcle-*)
+	  powerpcle-*linux*)
 	    LD="${LD-ld} -m elf64lppc"
 	    ;;
-	  powerpc-*)
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -6787,7 +6957,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
 $as_echo_n "checking whether the C compiler needs -belf... " >&6; }
@@ -6827,13 +6997,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
 $as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -6845,7 +7016,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -6854,7 +7025,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -6870,7 +7041,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
@@ -6981,7 +7152,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
 $as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 
@@ -7484,7 +7655,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -7502,7 +7673,7 @@ else
 	  cat conftest.err >&5
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&5
@@ -7541,7 +7712,7 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
@@ -7570,7 +7741,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&5
@@ -7583,32 +7754,32 @@ fi
 $as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -7616,6 +7787,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
     ;;
   esac
 
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -7900,9 +8106,9 @@ done
 
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case $2 in
+  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
   esac
 } # func_stripname_cnf
 
@@ -7929,14 +8135,14 @@ if test "${enable_shared+set}" = set; then :
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -7960,14 +8166,14 @@ if test "${enable_static+set}" = set; then :
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -7991,14 +8197,14 @@ if test "${with_pic+set}" = set; then :
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8006,8 +8212,6 @@ else
 fi
 
 
-test -z "$pic_mode" && pic_mode=default
-
 
 
 
@@ -8023,14 +8227,14 @@ if test "${enable_fast_install+set}" = set; then :
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8044,11 +8248,63 @@ fi
 
 
 
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
 
 
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -8097,7 +8353,7 @@ test -z "$LN_S" && LN_S="ln -s"
 
 
 
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -8136,7 +8392,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -8147,14 +8403,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -8163,15 +8419,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
 test -z "$LD" && LD=ld
 test -z "$ac_objext" && ac_objext=o
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
 # Only perform the check for file, if the check method requires it
@@ -8186,22 +8435,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8224,13 +8473,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8252,22 +8501,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8290,13 +8539,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8317,7 +8566,7 @@ esac
 
 # Use C for the default configuration in the libtool script
 
-lt_save_CC="$CC"
+lt_save_CC=$CC
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -8379,7 +8628,7 @@ if test -n "$compiler"; then
 
 lt_prog_compiler_no_builtin_flag=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
@@ -8395,7 +8644,7 @@ else
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -8425,7 +8674,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
     :
@@ -8443,17 +8692,18 @@ lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
 
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     lt_prog_compiler_wl='-Wl,'
     lt_prog_compiler_static='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       fi
+      lt_prog_compiler_pic='-fPIC'
       ;;
 
     amigaos*)
@@ -8464,8 +8714,8 @@ lt_prog_compiler_static=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -8481,6 +8731,11 @@ lt_prog_compiler_static=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -8551,7 +8806,7 @@ lt_prog_compiler_static=
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       else
@@ -8559,10 +8814,29 @@ lt_prog_compiler_static=
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -8578,7 +8852,7 @@ lt_prog_compiler_static=
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      lt_prog_compiler_static='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -8589,7 +8863,7 @@ lt_prog_compiler_static=
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	lt_prog_compiler_wl='-Wl,'
 	lt_prog_compiler_pic='-KPIC'
@@ -8614,6 +8888,12 @@ lt_prog_compiler_static=
 	lt_prog_compiler_pic='-PIC'
 	lt_prog_compiler_static='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -8711,7 +8991,7 @@ lt_prog_compiler_static=
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	lt_prog_compiler_pic='-Kconform_pic'
 	lt_prog_compiler_static='-Bstatic'
       fi
@@ -8740,7 +9020,7 @@ lt_prog_compiler_static=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic=
     ;;
@@ -8772,7 +9052,7 @@ else
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -8802,7 +9082,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
     case $lt_prog_compiler_pic in
      "" | " "*) ;;
      *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
@@ -8834,7 +9114,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -8853,13 +9133,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
 $as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works"; then
     :
 else
     lt_prog_compiler_static=
@@ -8979,8 +9259,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -8992,9 +9272,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -9037,9 +9317,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # included in the symbol list
   include_expsyms=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -9054,7 +9334,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -9062,7 +9342,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -9075,7 +9355,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -9097,24 +9377,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       whole_archive_flag_spec=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -9127,7 +9407,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
@@ -9146,7 +9426,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9162,7 +9442,7 @@ _LT_EOF
 	allow_undefined_flag=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9172,7 +9452,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
@@ -9180,61 +9460,89 @@ _LT_EOF
       exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	ld_shlibs=no
       fi
       ;;
 
     haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       link_all_deplibs=yes
       ;;
 
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -9245,42 +9553,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  whole_archive_flag_spec=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
 	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -9294,8 +9607,8 @@ _LT_EOF
 	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -9313,8 +9626,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9326,7 +9639,7 @@ _LT_EOF
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -9341,9 +9654,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    ld_shlibs=no
 	  fi
@@ -9360,15 +9673,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
       ;;
     esac
 
-    if test "$ld_shlibs" = no; then
+    if test no = "$ld_shlibs"; then
       runpath_var=
       hardcode_libdir_flag_spec=
       export_dynamic_flag_spec=
@@ -9384,7 +9697,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	hardcode_direct=unsupported
@@ -9392,34 +9705,57 @@ _LT_EOF
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -9438,13 +9774,21 @@ _LT_EOF
       hardcode_direct_absolute=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[012]|aix4.[012].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -9463,36 +9807,42 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
-	link_all_deplibs=no
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      export_dynamic_flag_spec='${wl}-bexpall'
+      export_dynamic_flag_spec='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
+        if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -9527,7 +9877,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -9535,17 +9885,17 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
 	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
+	 if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -9580,7 +9930,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -9588,21 +9938,33 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    whole_archive_flag_spec='$convenience'
 	  fi
 	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) >  [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -9611,7 +9973,7 @@ fi
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9641,16 +10003,17 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
 	enable_shared_with_static_runtimes=yes
@@ -9659,18 +10022,18 @@ fi
 	# Don't use ranlib
 	old_postinstall_cmds='chmod 644 $oldlib'
 	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -9679,7 +10042,7 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -9698,24 +10061,24 @@ fi
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec=''
   fi
   link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
+  allow_undefined_flag=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
 
   else
   ld_shlibs=no
@@ -9757,33 +10120,33 @@ fi
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_direct=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
+      export_dynamic_flag_spec='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 	hardcode_direct=yes
 	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
+	export_dynamic_flag_spec='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	hardcode_minus_L=yes
@@ -9791,25 +10154,25 @@ fi
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 
@@ -9821,7 +10184,7 @@ if ${lt_cv_prog_compiler__b+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -b"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -9840,14 +10203,14 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
 $as_echo "$lt_cv_prog_compiler__b" >&6; }
 
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 else
     archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
 fi
@@ -9855,8 +10218,8 @@ fi
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 
 	case $host_cpu in
@@ -9867,7 +10230,7 @@ fi
 	*)
 	  hardcode_direct=yes
 	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
+	  export_dynamic_flag_spec='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -9878,8 +10241,8 @@ fi
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
@@ -9889,8 +10252,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >
 if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo (void) { return 0; }
@@ -9902,24 +10265,35 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
+           LDFLAGS=$save_LDFLAGS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
 $as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	link_all_deplibs=no
       else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       inherit_rpath=yes
       link_all_deplibs=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -9934,7 +10308,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     newsos6)
       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_shlibpath_var=no
       ;;
@@ -9942,27 +10316,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	hardcode_direct=yes
 	hardcode_shlibpath_var=no
 	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
 	fi
       else
 	ld_shlibs=no
@@ -9973,33 +10339,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	hardcode_libdir_flag_spec='-rpath $libdir'
@@ -10010,24 +10396,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
     solaris*)
       no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -10037,11 +10423,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
 	fi
@@ -10051,10 +10437,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -10103,43 +10489,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
+      no_undefined_flag='$wl-z,text'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
+      export_dynamic_flag_spec='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -10154,10 +10540,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	export_dynamic_flag_spec='$wl-Blargedynsym'
 	;;
       esac
     fi
@@ -10165,7 +10551,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
 $as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+test no = "$ld_shlibs" && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
 
@@ -10191,7 +10577,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -10406,14 +10792,14 @@ esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -10429,28 +10815,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -10464,7 +10857,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -10473,7 +10866,7 @@ fi
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -10490,14 +10883,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -10505,41 +10900,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -10549,18 +10994,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -10568,8 +11013,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -10581,7 +11026,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -10590,8 +11035,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -10607,17 +11052,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -10626,8 +11071,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -10654,7 +11099,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -10667,8 +11112,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -10681,7 +11126,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -10694,8 +11139,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -10708,8 +11153,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -10727,12 +11172,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -10762,10 +11208,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -10783,14 +11229,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -10798,8 +11245,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -10808,8 +11255,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -10822,8 +11269,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -10834,7 +11281,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -10842,8 +11289,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -10862,8 +11309,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -10872,13 +11319,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -10922,7 +11389,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -10954,12 +11426,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -10969,7 +11441,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -10978,58 +11450,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -11040,8 +11522,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -11051,11 +11533,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -11063,8 +11545,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -11085,24 +11567,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -11120,7 +11602,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -11128,8 +11610,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11139,20 +11621,35 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
 
 
 
@@ -11249,15 +11746,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
+   test yes = "$hardcode_automatic"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
+  if test no != "$hardcode_direct" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action=relink
   else
@@ -11272,12 +11769,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
 $as_echo "$hardcode_action" >&6; }
 
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -11287,7 +11784,7 @@ fi
 
 
 
-  if test "x$enable_dlopen" != xyes; then
+  if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -11297,23 +11794,23 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 if ${ac_cv_lib_dl_dlopen+:} false; then :
@@ -11351,10 +11848,10 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
 
-    lt_cv_dlopen="dyld"
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
 
@@ -11362,10 +11859,18 @@ fi
 
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
 if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
+  lt_cv_dlopen=shl_load
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
 $as_echo_n "checking for shl_load in -ldld... " >&6; }
@@ -11404,11 +11909,11 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
 $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
 if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
 else
   ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
 if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
+  lt_cv_dlopen=dlopen
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -11447,7 +11952,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
 $as_echo_n "checking for dlopen in -lsvld... " >&6; }
@@ -11486,7 +11991,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
 $as_echo "$ac_cv_lib_svld_dlopen" >&6; }
 if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
 $as_echo_n "checking for dld_link in -ldld... " >&6; }
@@ -11525,7 +12030,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
 $as_echo "$ac_cv_lib_dld_dld_link" >&6; }
 if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
 fi
 
 
@@ -11546,21 +12051,21 @@ fi
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
@@ -11568,7 +12073,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -11615,9 +12120,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -11647,7 +12152,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -11667,14 +12172,14 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
 $as_echo "$lt_cv_dlopen_self" >&6; }
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self_static+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self_static=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -11721,9 +12226,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -11753,7 +12258,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -11774,9 +12279,9 @@ fi
 $as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -11820,7 +12325,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -11848,7 +12353,7 @@ fi
 
 
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
 $as_echo_n "checking if libtool supports shared libraries... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
@@ -11856,13 +12361,13 @@ $as_echo "$can_build_shared" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
 $as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -11870,8 +12375,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -11881,7 +12390,7 @@ $as_echo "$enable_shared" >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
 $as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
 $as_echo "$enable_static" >&6; }
 
@@ -11895,11 +12404,11 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
 
-CC="$lt_save_CC"
+CC=$lt_save_CC
 
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+      if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
 ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -12078,7 +12587,7 @@ objext_CXX=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -12139,46 +12648,39 @@ $RM -r conftest*
   CFLAGS=$CXXFLAGS
   compiler=$CC
   compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+  func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
     else
       lt_prog_compiler_no_builtin_flag_CXX=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
 
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -12192,7 +12694,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -12203,7 +12705,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -12214,32 +12716,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -12275,22 +12777,22 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+        export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           whole_archive_flag_spec_CXX=
         fi
@@ -12327,18 +12829,30 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         ld_shlibs_CXX=no
         ;;
       aix[4-9]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -12348,6 +12862,13 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -12366,13 +12887,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
         hardcode_direct_absolute_CXX=yes
         hardcode_libdir_separator_CXX=':'
         link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
+        file_list_spec_CXX='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          hardcode_direct_CXX=no
+          hardcode_direct_absolute_CXX=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[012]|aix4.[012].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -12390,36 +12919,44 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        export_dynamic_flag_spec_CXX='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          no_undefined_flag_CXX='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
+          if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -12454,7 +12991,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
@@ -12462,18 +12999,18 @@ fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
 	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
-	    if test "${lt_cv_aix_libpath+set}" = set; then
+	    if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath__CXX+:} false; then :
@@ -12508,7 +13045,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+    lt_cv_aix_libpath__CXX=/usr/lib:/lib
   fi
 
 fi
@@ -12516,22 +13053,34 @@ fi
   aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    no_undefined_flag_CXX=' $wl-bernotok'
+	    allow_undefined_flag_CXX=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      whole_archive_flag_spec_CXX='$convenience'
 	    fi
 	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_sy [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -12541,7 +13090,7 @@ fi
 	  allow_undefined_flag_CXX=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  ld_shlibs_CXX=no
 	fi
@@ -12569,57 +13118,58 @@ fi
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
 	  enable_shared_with_static_runtimes_CXX=yes
 	  # Don't use ranlib
 	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
 	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
 	  allow_undefined_flag_CXX=unsupported
 	  always_export_symbols_CXX=no
 	  enable_shared_with_static_runtimes_CXX=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    ld_shlibs_CXX=no
 	  fi
@@ -12633,27 +13183,27 @@ fi
   hardcode_direct_CXX=no
   hardcode_automatic_CXX=yes
   hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec_CXX=''
   fi
   link_all_deplibs_CXX=yes
-  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+       if test yes != "$lt_cv_apple_cc_single_mod"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 
   else
@@ -12662,6 +13212,34 @@ fi
 
 	;;
 
+      os2*)
+	hardcode_libdir_flag_spec_CXX='-L$libdir'
+	hardcode_minus_L_CXX=yes
+	allow_undefined_flag_CXX=unsupported
+	shrext_cmds=.dll
+	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	enable_shared_with_static_runtimes_CXX=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -12697,14 +13275,14 @@ fi
         ;;
 
       haiku*)
-        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
         ;;
 
       hpux9*)
-        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
         hardcode_libdir_separator_CXX=:
-        export_dynamic_flag_spec_CXX='${wl}-E'
+        export_dynamic_flag_spec_CXX='$wl-E'
         hardcode_direct_CXX=yes
         hardcode_minus_L_CXX=yes # Not in the search PATH,
 				             # but as the default
@@ -12716,7 +13294,7 @@ fi
             ld_shlibs_CXX=no
             ;;
           aCC*)
-            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -12725,11 +13303,11 @@ fi
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               ld_shlibs_CXX=no
@@ -12739,15 +13317,15 @@ fi
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
 	  hardcode_libdir_separator_CXX=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      export_dynamic_flag_spec_CXX='${wl}-E'
+	      export_dynamic_flag_spec_CXX='$wl-E'
               ;;
           esac
         fi
@@ -12773,13 +13351,13 @@ fi
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -12790,20 +13368,20 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -12818,22 +13396,22 @@ fi
       interix[3-9]*)
 	hardcode_direct_CXX=no
 	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	export_dynamic_flag_spec_CXX='${wl}-E'
+	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -12842,17 +13420,17 @@ fi
 	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    link_all_deplibs_CXX=yes
 	    ;;
         esac
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
         hardcode_libdir_separator_CXX=:
         inherit_rpath_CXX=yes
         ;;
@@ -12865,8 +13443,8 @@ fi
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -12875,10 +13453,10 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -12892,59 +13470,59 @@ fi
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    archive_cmds_need_lc_CXX=no
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
 	      prelink_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      old_archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      archive_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      archive_expsym_cmds_CXX='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
@@ -12958,18 +13536,18 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
-	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
+	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -12977,10 +13555,10 @@ fi
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      no_undefined_flag_CXX=' -zdefs'
-	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      hardcode_libdir_flag_spec_CXX='-R$libdir'
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      compiler_needs_object_CXX=yes
 
 	      # Not sure whether something based on
@@ -13038,22 +13616,17 @@ fi
         ld_shlibs_CXX=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	ld_shlibs_CXX=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  hardcode_direct_CXX=yes
 	  hardcode_shlibpath_var_CXX=no
 	  hardcode_direct_absolute_CXX=yes
 	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    export_dynamic_flag_spec_CXX='${wl}-E'
-	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='$wl-E'
+	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -13069,9 +13642,9 @@ fi
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
 	    hardcode_libdir_separator_CXX=:
 
 	    # Archives containing C++ object files must be created using
@@ -13089,17 +13662,17 @@ fi
           cxx*)
 	    case $host in
 	      osf3*)
-	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        allow_undefined_flag_CXX=' -expect_unresolved \*'
-	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
 		;;
 	    esac
@@ -13114,21 +13687,21 @@ fi
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
 	      hardcode_libdir_separator_CXX=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -13174,9 +13747,9 @@ fi
 	    # Sun C++ 4.2, 5.x and Centerline C++
             archive_cmds_need_lc_CXX=yes
 	    no_undefined_flag_CXX=' -zdefs'
-	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    hardcode_libdir_flag_spec_CXX='-R$libdir'
 	    hardcode_shlibpath_var_CXX=no
@@ -13184,7 +13757,7 @@ fi
 	      solaris2.[0-5] | solaris2.[0-5].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -13201,30 +13774,30 @@ fi
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -13232,11 +13805,11 @@ fi
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[0-5] | solaris2.[0-5].*) ;;
 		*)
-		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -13245,52 +13818,52 @@ fi
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_CXX='${wl}-z,text'
+      no_undefined_flag_CXX='$wl-z,text'
       archive_cmds_need_lc_CXX=no
       hardcode_shlibpath_var_CXX=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	no_undefined_flag_CXX='${wl}-z,text'
-	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	no_undefined_flag_CXX='$wl-z,text'
+	allow_undefined_flag_CXX='$wl-z,nodefs'
 	archive_cmds_need_lc_CXX=no
 	hardcode_shlibpath_var_CXX=no
-	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
 	hardcode_libdir_separator_CXX=':'
 	link_all_deplibs_CXX=yes
-	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	export_dynamic_flag_spec_CXX='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
-	      '"$old_archive_cmds_CXX"
+              '"$old_archive_cmds_CXX"
 	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
-	      '"$reload_cmds_CXX"
+              '"$reload_cmds_CXX"
 	    ;;
 	  *)
-	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -13322,10 +13895,10 @@ fi
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-    test "$ld_shlibs_CXX" = no && can_build_shared=no
+    test no = "$ld_shlibs_CXX" && can_build_shared=no
 
-    GCC_CXX="$GXX"
-    LD_CXX="$LD"
+    GCC_CXX=$GXX
+    LD_CXX=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -13369,13 +13942,13 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -13391,16 +13964,16 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$compiler_lib_search_path_CXX"; then
-	     compiler_lib_search_path_CXX="${prev}${p}"
+	     compiler_lib_search_path_CXX=$prev$p
 	   else
-	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -13408,9 +13981,9 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 	 esac
        else
 	 if test -z "$postdeps_CXX"; then
-	   postdeps_CXX="${prev}${p}"
+	   postdeps_CXX=$prev$p
 	 else
-	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	   postdeps_CXX="${postdeps_CXX} $prev$p"
 	 fi
        fi
        prev=
@@ -13425,15 +13998,15 @@ if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$predep_objects_CXX"; then
-	   predep_objects_CXX="$p"
+	   predep_objects_CXX=$p
 	 else
 	   predep_objects_CXX="$predep_objects_CXX $p"
 	 fi
        else
 	 if test -z "$postdep_objects_CXX"; then
-	   postdep_objects_CXX="$p"
+	   postdep_objects_CXX=$p
 	 else
 	   postdep_objects_CXX="$postdep_objects_CXX $p"
 	 fi
@@ -13463,51 +14036,6 @@ interix[3-9]*)
   postdep_objects_CXX=
   postdeps_CXX=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      postdeps_CXX='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 
 
@@ -13516,7 +14044,7 @@ case " $postdeps_CXX " in
 esac
  compiler_lib_search_dirs_CXX=
 if test -n "${compiler_lib_search_path_CXX}"; then
- compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 
 
@@ -13555,17 +14083,18 @@ lt_prog_compiler_static_CXX=
 
 
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     lt_prog_compiler_wl_CXX='-Wl,'
     lt_prog_compiler_static_CXX='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static_CXX='-Bstatic'
       fi
+      lt_prog_compiler_pic_CXX='-fPIC'
       ;;
 
     amigaos*)
@@ -13576,8 +14105,8 @@ lt_prog_compiler_static_CXX=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -13592,6 +14121,11 @@ lt_prog_compiler_static_CXX=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static_CXX='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -13641,7 +14175,7 @@ lt_prog_compiler_static_CXX=
     case $host_os in
       aix[4-9]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  lt_prog_compiler_static_CXX='-Bstatic'
 	else
@@ -13681,14 +14215,14 @@ lt_prog_compiler_static_CXX=
 	case $cc_basename in
 	  CC*)
 	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      lt_prog_compiler_pic_CXX='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    lt_prog_compiler_wl_CXX='-Wl,'
-	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -13725,7 +14259,7 @@ lt_prog_compiler_static_CXX=
 	    lt_prog_compiler_pic_CXX='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    lt_prog_compiler_wl_CXX='-Wl,'
 	    lt_prog_compiler_pic_CXX='-KPIC'
 	    lt_prog_compiler_static_CXX='-static'
@@ -13870,7 +14404,7 @@ lt_prog_compiler_static_CXX=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic_CXX=
     ;;
@@ -13902,7 +14436,7 @@ else
   lt_cv_prog_compiler_pic_works_CXX=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -13932,7 +14466,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
     case $lt_prog_compiler_pic_CXX in
      "" | " "*) ;;
      *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
@@ -13958,7 +14492,7 @@ if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works_CXX=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -13977,13 +14511,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
     :
 else
     lt_prog_compiler_static_CXX=
@@ -14097,8 +14631,8 @@ $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -14110,9 +14644,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -14129,17 +14663,21 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   case $host_os in
   aix[4-9]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    export_symbols_cmds_CXX="$ltdll_cmds"
+    export_symbols_cmds_CXX=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -14162,7 +14700,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
 $as_echo "$ld_shlibs_CXX" >&6; }
-test "$ld_shlibs_CXX" = no && can_build_shared=no
+test no = "$ld_shlibs_CXX" && can_build_shared=no
 
 with_gnu_ld_CXX=$with_gnu_ld
 
@@ -14179,7 +14717,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc_CXX=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds_CXX in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -14307,7 +14845,7 @@ $as_echo_n "checking dynamic linker characteristics... " >&6; }
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -14324,14 +14862,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -14339,41 +14879,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -14383,18 +14973,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -14402,8 +14992,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -14415,7 +15005,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -14424,8 +15014,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -14441,16 +15031,16 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -14459,8 +15049,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -14487,7 +15077,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -14500,8 +15090,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -14514,7 +15104,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -14527,8 +15117,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -14540,8 +15130,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -14559,12 +15149,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -14594,10 +15185,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -14615,14 +15206,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -14630,8 +15222,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -14640,8 +15232,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -14654,8 +15246,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -14666,7 +15258,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -14674,8 +15266,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -14694,8 +15286,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -14704,13 +15296,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec_CXX='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -14754,7 +15366,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -14786,12 +15403,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -14801,7 +15418,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -14810,58 +15427,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -14872,8 +15499,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -14883,11 +15510,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -14895,8 +15522,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -14917,24 +15544,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -14952,7 +15579,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -14960,8 +15587,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -14971,20 +15598,32 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
 
 
 
@@ -15027,15 +15666,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action_CXX=
 if test -n "$hardcode_libdir_flag_spec_CXX" ||
    test -n "$runpath_var_CXX" ||
-   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+   test yes = "$hardcode_automatic_CXX"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct_CXX" != no &&
+  if test no != "$hardcode_direct_CXX" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
-     test "$hardcode_minus_L_CXX" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
+     test no != "$hardcode_minus_L_CXX"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action_CXX=relink
   else
@@ -15050,12 +15689,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
 $as_echo "$hardcode_action_CXX" >&6; }
 
-if test "$hardcode_action_CXX" = relink ||
-   test "$inherit_rpath_CXX" = yes; then
+if test relink = "$hardcode_action_CXX" ||
+   test yes = "$inherit_rpath_CXX"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -15078,7 +15717,7 @@ fi
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 ac_ext=cpp
 ac_cpp='$CXXCPP $CPPFLAGS'
@@ -16486,6 +17125,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
@@ -16535,10 +17175,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -16603,7 +17246,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -16708,9 +17352,12 @@ CFLAGS \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
 nm_file_list_spec \
+lt_cv_truncate_bin \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
@@ -16776,7 +17423,7 @@ postdeps_CXX \
 compiler_lib_search_path_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -16803,7 +17450,8 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec \
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path \
 reload_cmds_CXX \
 old_archive_cmds_CXX \
 old_archive_from_new_cmds_CXX \
@@ -16817,7 +17465,7 @@ prelink_cmds_CXX \
 postlink_cmds_CXX; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -16826,19 +17474,16 @@ postlink_cmds_CXX; do
 done
 
 ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
 
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'
 
@@ -17551,55 +18196,53 @@ $as_echo X"$file" |
  ;;
     "libtool":C)
 
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # The names of the tagged configurations supported by this script.
-available_tags="CXX "
+available_tags='CXX '
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
 
 # ### BEGIN LIBTOOL CONFIG
 
@@ -17619,6 +18262,9 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
@@ -17736,18 +18382,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
 lt_sysroot=$lt_sysroot
 
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
@@ -17838,8 +18493,11 @@ hardcode_into_libs=$hardcode_into_libs
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
@@ -17932,13 +18590,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
@@ -18004,13 +18662,72 @@ compiler_lib_search_path=$lt_compiler_lib_search_path
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -18019,7 +18736,7 @@ _LT_EOF
   esac
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
@@ -18029,165 +18746,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -18274,13 +18832,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct_CXX
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute_CXX
 
diff --git a/src/gmock/gtest/m4/libtool.m4 b/src/gmock/gtest/m4/libtool.m4
index d7c043f..10ab284 100644
--- a/src/gmock/gtest/m4/libtool.m4
+++ b/src/gmock/gtest/m4/libtool.m4
@@ -1,8 +1,6 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -10,36 +8,30 @@
 # modifications, as long as this notice is preserved.
 
 m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ])
 
-# serial 57 LT_INIT
+# serial 58 LT_INIT
 
 
 # LT_PREREQ(VERSION)
@@ -67,7 +59,7 @@ esac
 # LT_INIT([OPTIONS])
 # ------------------
 AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -91,7 +83,7 @@ dnl Parse OPTIONS
 _LT_SET_OPTIONS([$0], [$1])
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -111,26 +103,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
 dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
 
 
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
 # _LT_CC_BASENAME(CC)
 # -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
 m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
 ])
 
 
 # _LT_FILEUTILS_DEFAULTS
 # ----------------------
 # It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
 m4_defun([_LT_FILEUTILS_DEFAULTS],
 [: ${CP="cp -f"}
 : ${MV="mv -f"}
@@ -177,15 +186,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
 m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
 
 _LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 ])
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -198,7 +208,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -209,14 +219,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -269,14 +279,14 @@ no_glob_subst='s/\*/\\\*/g'
 
 # _LT_PROG_LTMAIN
 # ---------------
-# Note that this code is called both from `configure', and `config.status'
+# Note that this code is called both from 'configure', and 'config.status'
 # now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
 # so we pass a copy along to make sure it has a sensible value anyway.
 m4_defun([_LT_PROG_LTMAIN],
 [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
 _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 ])# _LT_PROG_LTMAIN
 
 
@@ -286,7 +296,7 @@ ltmain="$ac_aux_dir/ltmain.sh"
 
 # So that we can recreate a full libtool script including additional
 # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
+# in macros and then make a single call at the end using the 'libtool'
 # label.
 
 
@@ -421,8 +431,8 @@ m4_define([_lt_decl_all_varnames],
 
 # _LT_CONFIG_STATUS_DECLARE([VARNAME])
 # ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
 [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
@@ -446,7 +456,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
 # Output comment and list of tags supported by the script
 m4_defun([_LT_LIBTOOL_TAGS],
 [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
+available_tags='_LT_TAGS'dnl
 ])
 
 
@@ -474,7 +484,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
 # _LT_LIBTOOL_CONFIG_VARS
 # -----------------------
 # Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
 # script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
 # section) are produced by _LT_LIBTOOL_TAG_VARS.
 m4_defun([_LT_LIBTOOL_CONFIG_VARS],
@@ -500,8 +510,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
 # Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
 # variables for single and double quote escaping we saved from calls
 # to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
 # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
 m4_defun([_LT_CONFIG_COMMANDS],
 [AC_PROVIDE_IFELSE([LT_OUTPUT],
@@ -547,7 +557,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_quote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -560,7 +570,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_dquote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -576,7 +586,7 @@ _LT_OUTPUT_LIBTOOL_INIT
 # Generate a child script FILE with all initialization necessary to
 # reuse the environment learned by the parent script, and make the
 # file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
+# '#!' sequence but before initialization text begins.  After this
 # macro, additional text can be appended to FILE to form the body of
 # the child script.  The macro ends with non-zero status if the
 # file could not be fully written (such as if the disk is full).
@@ -598,7 +608,7 @@ AS_SHELL_SANITIZE
 _AS_PREPARE
 exec AS_MESSAGE_FD>&1
 _ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
 m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
@@ -621,7 +631,7 @@ exec AS_MESSAGE_LOG_FD>>config.log
 } >&AS_MESSAGE_LOG_FD
 
 lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
 for use in further configure time tests before the real libtool is
 generated.
 
@@ -643,7 +653,7 @@ Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
-while test $[#] != 0
+while test 0 != $[#]
 do
   case $[1] in
     --version | --v* | -V )
@@ -656,10 +666,10 @@ do
       lt_cl_silent=: ;;
 
     -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
 
     *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
   esac
   shift
 done
@@ -685,7 +695,7 @@ chmod +x "$CONFIG_LT"
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec AS_MESSAGE_LOG_FD>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -705,27 +715,31 @@ m4_defun([_LT_CONFIG],
 _LT_CONFIG_SAVE_COMMANDS([
   m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
   m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
 _LT_COPYING
 _LT_LIBTOOL_TAGS
 
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
 # ### BEGIN LIBTOOL CONFIG
 _LT_LIBTOOL_CONFIG_VARS
 _LT_LIBTOOL_TAG_VARS
@@ -733,13 +747,24 @@ _LT_LIBTOOL_TAG_VARS
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -756,8 +781,6 @@ _LT_EOF
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  _LT_PROG_REPLACE_SHELLFNS
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -775,7 +798,6 @@ _LT_EOF
 [m4_if([$1], [], [
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'], [])
 ])dnl /_LT_CONFIG_SAVE_COMMANDS
@@ -974,7 +996,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 
     AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -992,7 +1014,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1010,7 +1032,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
       AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
 	[lt_cv_ld_exported_symbols_list=yes],
 	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
     ])
 
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
@@ -1032,7 +1054,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1042,32 +1064,32 @@ _LT_EOF
     ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -1087,29 +1109,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
     m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                   [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
     m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 ],[])
   else
@@ -1129,7 +1151,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
 # Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
+if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
@@ -1147,7 +1169,7 @@ else
     _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
   fi],[])
   if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
   fi
   ])
   aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
@@ -1167,8 +1189,8 @@ m4_define([_LT_SHELL_INIT],
 # -----------------------
 # Find how we can fake an echo command that does not interpret backslash.
 # In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
 [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
@@ -1196,10 +1218,10 @@ fi
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
-    $ECHO "$*" 
+    $ECHO "$*"
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) AC_MSG_RESULT([printf]) ;;
   print*) AC_MSG_RESULT([print -r]) ;;
   *) AC_MSG_RESULT([cat]) ;;
@@ -1225,16 +1247,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
 AC_DEFUN([_LT_WITH_SYSROOT],
 [AC_MSG_CHECKING([for sysroot])
 AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
 [], [with_sysroot=no])
 
 dnl lt_sysroot will always be passed unquoted.  We quote it here
 dnl in case the user passed a directory name.
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -1244,14 +1267,14 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_RESULT([$with_sysroot])
    AC_MSG_ERROR([The sysroot must be an absolute path.])
    ;;
 esac
 
  AC_MSG_RESULT([${lt_sysroot:-no}])
 _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
+[dependent libraries, and where our libraries should be installed.])])
 
 # _LT_ENABLE_LOCK
 # ---------------
@@ -1259,31 +1282,33 @@ m4_defun([_LT_ENABLE_LOCK],
 [AC_ARG_ENABLE([libtool-lock],
   [AS_HELP_STRING([--disable-libtool-lock],
     [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -1312,9 +1337,46 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
 x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1333,10 +1395,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 		;;
 	    esac
 	    ;;
-	  powerpc64le-*)
+	  powerpc64le-*linux*)
 	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  powerpc64-*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -1355,10 +1417,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  powerpcle-*)
+	  powerpcle-*linux*)
 	    LD="${LD-ld} -m elf64lppc"
 	    ;;
-	  powerpc-*)
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -1376,19 +1438,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
     [AC_LANG_PUSH(C)
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
      AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1396,7 +1459,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -1405,7 +1468,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -1421,7 +1484,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 ])# _LT_ENABLE_LOCK
 
 
@@ -1440,11 +1503,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      [echo conftest.$ac_objext > conftest.lst
       lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -1452,7 +1515,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      ])
   ])
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -1483,7 +1546,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -1519,7 +1582,7 @@ AC_CACHE_CHECK([$1], [$2],
   [$2=no
    m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -1546,7 +1609,7 @@ AC_CACHE_CHECK([$1], [$2],
    $RM conftest*
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$5], , :, [$5])
 else
     m4_if([$6], , :, [$6])
@@ -1568,7 +1631,7 @@ AC_DEFUN([_LT_LINKER_OPTION],
 m4_require([_LT_DECL_SED])dnl
 AC_CACHE_CHECK([$1], [$2],
   [$2=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $3"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -1587,10 +1650,10 @@ AC_CACHE_CHECK([$1], [$2],
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$4], , :, [$4])
 else
     m4_if([$5], , :, [$5])
@@ -1611,7 +1674,7 @@ AC_DEFUN([LT_CMD_MAX_LEN],
 AC_MSG_CHECKING([the maximum length of command line arguments])
 AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -1651,7 +1714,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1702,22 +1765,22 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
     if test -n "$lt_cv_sys_max_cmd_len" && \
-	test undefined != "$lt_cv_sys_max_cmd_len"; then
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -1733,7 +1796,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   esac
 ])
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
 else
   AC_MSG_RESULT(none)
@@ -1761,7 +1824,7 @@ m4_defun([_LT_HEADER_DLFCN],
 # ----------------------------------------------------------------
 m4_defun([_LT_TRY_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
+if test yes = "$cross_compiling"; then :
   [$4]
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -1808,9 +1871,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -1836,7 +1899,7 @@ int main ()
   return status;
 }]
 _LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -1857,7 +1920,7 @@ rm -fr conftest*
 # ------------------
 AC_DEFUN([LT_SYS_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
+if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -1867,44 +1930,52 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ])
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
+	  [lt_cv_dlopen=shl_load],
       [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
 	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
+	      [lt_cv_dlopen=dlopen],
 	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
 	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
 	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
 	      ])
 	    ])
 	  ])
@@ -1913,21 +1984,21 @@ else
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     AC_CACHE_CHECK([whether a program can dlopen itself],
@@ -1937,7 +2008,7 @@ else
 	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
     ])
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
 	  lt_cv_dlopen_self_static, [dnl
@@ -1947,9 +2018,9 @@ else
       ])
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -2041,8 +2112,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS],
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 _LT_COMPILER_C_O([$1])
 
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   AC_MSG_CHECKING([if we can lock with hard links])
   hard_links=yes
@@ -2052,8 +2123,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" !=
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
     need_locks=warn
   fi
 else
@@ -2080,8 +2151,8 @@ objdir=$lt_cv_objdir
 _LT_DECL([], [objdir], [0],
          [The name of the directory that contains temporary libtool files])dnl
 m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
 ])# _LT_CHECK_OBJDIR
 
 
@@ -2093,15 +2164,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
 _LT_TAGVAR(hardcode_action, $1)=
 if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
    test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
 
   # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
     # Linking always hardcodes the temporary library directory.
     _LT_TAGVAR(hardcode_action, $1)=relink
   else
@@ -2115,12 +2186,12 @@ else
 fi
 AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
 
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -2144,7 +2215,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
@@ -2162,6 +2233,47 @@ _LT_DECL([], [striplib], [1])
 ])# _LT_CMD_STRIPLIB
 
 
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x at S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
 # _LT_SYS_DYNAMIC_LINKER([TAG])
 # -----------------------------
 # PORTME Fill in your ld.so characteristics
@@ -2172,17 +2284,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
 	[], [
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -2198,28 +2311,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -2233,7 +2353,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -2242,7 +2362,7 @@ fi])
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -2259,14 +2379,17 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[[4-9]]*)
@@ -2274,41 +2397,91 @@ aix[[4-9]]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[[01]] | aix4.[[01]].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -2318,18 +2491,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -2337,8 +2510,8 @@ beos*)
 bsdi[[45]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -2350,7 +2523,7 @@ bsdi[[45]]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -2359,8 +2532,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -2376,17 +2549,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
 m4_if([$1], [],[
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -2395,8 +2568,8 @@ m4_if([$1], [],[
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -2423,7 +2596,7 @@ m4_if([$1], [],[
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -2436,8 +2609,8 @@ m4_if([$1], [],[
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -2450,7 +2623,7 @@ m4_if([$1], [],[
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -2463,8 +2636,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -2477,8 +2650,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2496,12 +2669,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -2531,10 +2705,10 @@ haiku*)
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -2552,14 +2726,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -2567,8 +2742,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -2577,8 +2752,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -2591,8 +2766,8 @@ interix[[3-9]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2603,7 +2778,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -2611,8 +2786,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -2631,8 +2806,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -2641,13 +2816,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
 linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2672,7 +2867,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -2704,12 +2904,12 @@ netbsd*)
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -2719,7 +2919,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -2728,58 +2928,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -2790,8 +3000,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -2801,11 +3011,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -2813,8 +3023,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -2835,24 +3045,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -2870,7 +3080,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -2878,8 +3088,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2888,20 +3098,30 @@ uts4*)
   ;;
 esac
 AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
 _LT_DECL([], [variables_saved_for_relink], [1],
     [Variables whose values should be saved in libtool wrapper scripts and
     restored at link time])
@@ -2934,39 +3154,41 @@ _LT_DECL([], [hardcode_into_libs], [0],
     [Whether we should hardcode library paths into libraries])
 _LT_DECL([], [sys_lib_search_path_spec], [2],
     [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
 ])# _LT_SYS_DYNAMIC_LINKER
 
 
 # _LT_PATH_TOOL_PREFIX(TOOL)
 # --------------------------
-# find a file program which can recognize shared library
+# find a file program that can recognize shared library
 AC_DEFUN([_LT_PATH_TOOL_PREFIX],
 [m4_require([_LT_DECL_EGREP])dnl
 AC_MSG_CHECKING([for $1])
 AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
 [case $MAGIC_CMD in
 [[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
 dnl $ac_dummy forces splitting on constant user-supplied paths.
 dnl POSIX.2 word splitting is done only on the output of word expansions,
 dnl not every word.  This closes a longstanding sh security hole.
   ac_dummy="m4_if([$2], , $PATH, [$2])"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -2989,11 +3211,11 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   AC_MSG_RESULT($MAGIC_CMD)
 else
@@ -3011,7 +3233,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
 
 # _LT_PATH_MAGIC
 # --------------
-# find a file program which can recognize a shared library
+# find a file program that can recognize a shared library
 m4_defun([_LT_PATH_MAGIC],
 [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
 if test -z "$lt_cv_path_MAGIC_CMD"; then
@@ -3038,16 +3260,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
 	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
+    [test no = "$withval" || with_gnu_ld=yes],
     [with_gnu_ld=no])dnl
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by $CC])
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -3061,7 +3283,7 @@ if test "$GCC" = yes; then
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -3072,37 +3294,37 @@ if test "$GCC" = yes; then
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   AC_MSG_CHECKING([for GNU ld])
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
 AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi])
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
@@ -3156,13 +3378,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -3173,6 +3395,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
 ])# _LT_CMD_RELOAD
 
 
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
 # _LT_CHECK_MAGIC_METHOD
 # ----------------------
 # how to check for library dependencies
@@ -3188,13 +3447,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[[4-9]]*)
@@ -3221,8 +3480,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -3318,8 +3576,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
@@ -3372,6 +3630,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 ])
 
@@ -3412,33 +3673,38 @@ AC_DEFUN([LT_PATH_NM],
 AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -3449,21 +3715,21 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
     # Let the user override the test.
   else
     AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -3471,8 +3737,8 @@ else
     esac
   fi
   AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -3518,8 +3784,8 @@ lt_cv_sharedlib_from_linklib_cmd,
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -3531,7 +3797,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 ])
@@ -3558,13 +3824,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool
     lt_cv_path_mainfest_tool=yes
   fi
   rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
 ])# _LT_PATH_MANIFEST_TOOL
 
 
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
 # LT_LIB_M
 # --------
 # check for math library
@@ -3576,11 +3857,11 @@ case $host in
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
   AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
   ;;
 *)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
   ;;
 esac
 AC_SUBST([LIBM])
@@ -3599,7 +3880,7 @@ m4_defun([_LT_COMPILER_NO_RTTI],
 
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
@@ -3651,7 +3932,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[[ABCDGISTW]]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[[ABCDEGRST]]'
   fi
   ;;
@@ -3684,14 +3965,44 @@ case `$NM -V 2>&1` in
   symcode='[[ABCDGIRSTW]]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -3709,21 +4020,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx]"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -3763,11 +4077,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT@&t at _DLSYM_CONST
 #else
@@ -3793,7 +4107,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -3813,9 +4127,9 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -3836,7 +4150,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -3863,12 +4177,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
     [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
 _LT_DECL([global_symbol_to_c_name_address],
     [lt_cv_sys_global_symbol_to_c_name_address], [1],
     [Transform the output of nm in a C name address pair])
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
 _LT_DECL([], [nm_file_list_spec], [1],
     [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3884,17 +4202,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)=
 
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -3905,8 +4224,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -3922,6 +4241,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -3971,7 +4295,7 @@ m4_if([$1], [CXX], [
     case $host_os in
       aix[[4-9]]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	else
@@ -4012,14 +4336,14 @@ m4_if([$1], [CXX], [
 	case $cc_basename in
 	  CC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -4056,7 +4380,7 @@ m4_if([$1], [CXX], [
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
 	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
@@ -4201,17 +4525,18 @@ m4_if([$1], [CXX], [
   fi
 ],
 [
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -4222,8 +4547,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -4240,6 +4565,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -4310,7 +4640,7 @@ m4_if([$1], [CXX], [
     case $host_os in
     aix*)
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       else
@@ -4318,11 +4648,30 @@ m4_if([$1], [CXX], [
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -4338,7 +4687,7 @@ m4_if([$1], [CXX], [
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -4349,7 +4698,7 @@ m4_if([$1], [CXX], [
 
     linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4374,6 +4723,12 @@ m4_if([$1], [CXX], [
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -4471,7 +4826,7 @@ m4_if([$1], [CXX], [
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
@@ -4500,7 +4855,7 @@ m4_if([$1], [CXX], [
   fi
 ])
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     _LT_TAGVAR(lt_prog_compiler_pic, $1)=
     ;;
@@ -4566,17 +4921,21 @@ m4_if([$1], [CXX], [
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -4625,9 +4984,9 @@ m4_if([$1], [CXX], [
   # included in the symbol list
   _LT_TAGVAR(include_expsyms, $1)=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -4643,7 +5002,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -4651,7 +5010,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
   linux* | k*bsd*-gnu | gnu*)
@@ -4664,7 +5023,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -4686,24 +5045,24 @@ dnl Note also adjust exclude_expsyms for C++ above.
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       _LT_TAGVAR(whole_archive_flag_spec, $1)=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -4716,7 +5075,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     case $host_os in
     aix[[3-9]]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
@@ -4735,7 +5094,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -4751,7 +5110,7 @@ _LT_EOF
 	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4761,7 +5120,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -4769,61 +5128,89 @@ _LT_EOF
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
 
     haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -4834,42 +5221,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -4883,8 +5275,8 @@ _LT_EOF
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -4902,8 +5294,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4915,7 +5307,7 @@ _LT_EOF
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -4930,9 +5322,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -4949,15 +5341,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
     esac
 
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
       runpath_var=
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
       _LT_TAGVAR(export_dynamic_flag_spec, $1)=
@@ -4973,7 +5365,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	_LT_TAGVAR(hardcode_direct, $1)=unsupported
@@ -4981,34 +5373,57 @@ _LT_EOF
       ;;
 
     aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -5027,13 +5442,21 @@ _LT_EOF
       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[[012]]|aix4.[[012]].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -5052,62 +5475,80 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
-	_LT_TAGVAR(link_all_deplibs, $1)=no
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
 	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	  fi
 	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 3 [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -5116,7 +5557,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -5146,16 +5587,17 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -5164,18 +5606,18 @@ _LT_EOF
 	# Don't use ranlib
 	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -5184,7 +5626,7 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -5234,33 +5676,33 @@ _LT_EOF
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_direct, $1)=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5268,25 +5710,25 @@ _LT_EOF
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 	m4_if($1, [], [
@@ -5294,14 +5736,14 @@ _LT_EOF
 	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
 	  _LT_LINKER_OPTION([if $CC understands -b],
 	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
 	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	case $host_cpu in
@@ -5312,7 +5754,7 @@ _LT_EOF
 	*)
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -5323,16 +5765,16 @@ _LT_EOF
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
 	# This should be the same for all languages, so no per-tag cache variable.
 	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
 	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   AC_LINK_IFELSE(
 	     [AC_LANG_SOURCE(
 	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
@@ -5345,21 +5787,32 @@ _LT_EOF
       end]])])],
 	      [lt_cv_irix_exported_symbol=yes],
 	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(inherit_rpath, $1)=yes
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
     netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
@@ -5374,7 +5827,7 @@ _LT_EOF
     newsos6)
       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
@@ -5382,27 +5835,19 @@ _LT_EOF
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	fi
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5413,33 +5858,53 @@ _LT_EOF
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -5450,24 +5915,24 @@ _LT_EOF
 
     solaris*)
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -5477,11 +5942,11 @@ _LT_EOF
       solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	fi
@@ -5491,10 +5956,10 @@ _LT_EOF
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -5543,43 +6008,43 @@ _LT_EOF
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -5594,17 +6059,17 @@ _LT_EOF
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
 	;;
       esac
     fi
   fi
 ])
 AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
 _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
 
@@ -5621,7 +6086,7 @@ x|xyes)
   # Assume -lc should be added
   _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $_LT_TAGVAR(archive_cmds, $1) in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -5701,12 +6166,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary])
 _LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
     library is relocated])
 _LT_TAGDECL([], [hardcode_minus_L], [0],
     [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -5747,10 +6212,10 @@ dnl    [Compiler flag to generate thread safe objects])
 # ------------------------
 # Ensure that the configuration variables for a C compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_C_CONFIG],
 [m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
+lt_save_CC=$CC
 AC_LANG_PUSH(C)
 
 # Source file extension for C test sources.
@@ -5790,18 +6255,18 @@ if test -n "$compiler"; then
   LT_SYS_DLOPEN_SELF
   _LT_CMD_STRIPLIB
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   AC_MSG_CHECKING([if libtool supports shared libraries])
   AC_MSG_RESULT([$can_build_shared])
 
   AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -5809,8 +6274,12 @@ if test -n "$compiler"; then
     ;;
 
   aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -5818,13 +6287,13 @@ if test -n "$compiler"; then
 
   AC_MSG_CHECKING([whether to build static libraries])
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   AC_MSG_RESULT([$enable_static])
 
   _LT_CONFIG($1)
 fi
 AC_LANG_POP
-CC="$lt_save_CC"
+CC=$lt_save_CC
 ])# _LT_LANG_C_CONFIG
 
 
@@ -5832,14 +6301,14 @@ CC="$lt_save_CC"
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_CXX_CONFIG],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   AC_PROG_CXXCPP
 else
   _lt_caught_CXX_error=yes
@@ -5881,7 +6350,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -5923,35 +6392,35 @@ if test "$_lt_caught_CXX_error" != yes; then
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
     else
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
       LT_PATH_LD
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           _LT_TAGVAR(whole_archive_flag_spec, $1)=
         fi
@@ -5987,18 +6456,30 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=no
         ;;
       aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -6008,6 +6489,13 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -6026,13 +6514,21 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
         _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[[012]]|aix4.[[012]].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -6050,64 +6546,84 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
           _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
 	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	    fi
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -6117,7 +6633,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  _LT_TAGVAR(ld_shlibs, $1)=no
 	fi
@@ -6145,57 +6661,58 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 	  # Don't use ranlib
 	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  _LT_TAGVAR(always_export_symbols, $1)=no
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -6206,6 +6723,34 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_DARWIN_LINKER_FEATURES($1)
 	;;
 
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -6241,14 +6786,14 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         ;;
 
       hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
         _LT_TAGVAR(hardcode_direct, $1)=yes
         _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
 				             # but as the default
@@ -6260,7 +6805,7 @@ if test "$_lt_caught_CXX_error" != yes; then
             _LT_TAGVAR(ld_shlibs, $1)=no
             ;;
           aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -6269,11 +6814,11 @@ if test "$_lt_caught_CXX_error" != yes; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
@@ -6283,15 +6828,15 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
               ;;
           esac
         fi
@@ -6317,13 +6862,13 @@ if test "$_lt_caught_CXX_error" != yes; then
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -6334,20 +6879,20 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -6362,22 +6907,22 @@ if test "$_lt_caught_CXX_error" != yes; then
       interix[[3-9]]*)
 	_LT_TAGVAR(hardcode_direct, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -6386,17 +6931,17 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    _LT_TAGVAR(link_all_deplibs, $1)=yes
 	    ;;
         esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
@@ -6409,8 +6954,8 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -6419,10 +6964,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -6436,59 +6981,59 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
 	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -6502,18 +7047,18 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -6521,10 +7066,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      _LT_TAGVAR(compiler_needs_object, $1)=yes
 
 	      # Not sure whether something based on
@@ -6582,22 +7127,17 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -6613,9 +7153,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	    # Archives containing C++ object files must be created using
@@ -6633,17 +7173,17 @@ if test "$_lt_caught_CXX_error" != yes; then
           cxx*)
 	    case $host in
 	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
 		;;
 	    esac
@@ -6658,21 +7198,21 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -6718,9 +7258,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
 	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
 	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -6728,7 +7268,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -6745,30 +7285,30 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -6776,11 +7316,11 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -6789,52 +7329,52 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
 	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
 	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
 	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
+              '"$_LT_TAGVAR(reload_cmds, $1)"
 	    ;;
 	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -6865,10 +7405,10 @@ if test "$_lt_caught_CXX_error" != yes; then
     esac
 
     AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -6895,7 +7435,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
@@ -6917,13 +7457,14 @@ AC_REQUIRE([_LT_DECL_SED])
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
   esac
 } # func_stripname_cnf
 ])# _LT_FUNC_STRIPNAME_CNF
 
+
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
@@ -7007,13 +7548,13 @@ if AC_TRY_EVAL(ac_compile); then
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -7029,16 +7570,16 @@ if AC_TRY_EVAL(ac_compile); then
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
 	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -7046,9 +7587,9 @@ if AC_TRY_EVAL(ac_compile); then
 	 esac
        else
 	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
 	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
 	 fi
        fi
        prev=
@@ -7063,15 +7604,15 @@ if AC_TRY_EVAL(ac_compile); then
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
+	   _LT_TAGVAR(predep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
 	 fi
        else
 	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	   _LT_TAGVAR(postdep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
 	 fi
@@ -7102,51 +7643,6 @@ interix[[3-9]]*)
   _LT_TAGVAR(postdep_objects,$1)=
   _LT_TAGVAR(postdeps,$1)=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 ])
 
@@ -7155,7 +7651,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in
 esac
  _LT_TAGVAR(compiler_lib_search_dirs, $1)=
 if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 _LT_TAGDECL([], [compiler_lib_search_dirs], [1],
     [The directories searched by this compiler when creating a shared library])
@@ -7175,10 +7671,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_F77_CONFIG],
 [AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
+if test -z "$F77" || test no = "$F77"; then
   _lt_disable_F77=yes
 fi
 
@@ -7215,7 +7711,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the F77 compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
+if test yes != "$_lt_disable_F77"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7237,7 +7733,7 @@ if test "$_lt_disable_F77" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
@@ -7251,21 +7747,25 @@ if test "$_lt_disable_F77" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7273,11 +7773,11 @@ if test "$_lt_disable_F77" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7294,9 +7794,9 @@ if test "$_lt_disable_F77" != yes; then
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
@@ -7306,11 +7806,11 @@ AC_LANG_POP
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_FC_CONFIG],
 [AC_LANG_PUSH(Fortran)
 
-if test -z "$FC" || test "X$FC" = "Xno"; then
+if test -z "$FC" || test no = "$FC"; then
   _lt_disable_FC=yes
 fi
 
@@ -7347,7 +7847,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the FC compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
+if test yes != "$_lt_disable_FC"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7369,7 +7869,7 @@ if test "$_lt_disable_FC" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
@@ -7385,21 +7885,25 @@ if test "$_lt_disable_FC" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7407,11 +7911,11 @@ if test "$_lt_disable_FC" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7431,7 +7935,7 @@ if test "$_lt_disable_FC" != yes; then
   GCC=$lt_save_GCC
   CC=$lt_save_CC
   CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
+fi # test yes != "$_lt_disable_FC"
 
 AC_LANG_POP
 ])# _LT_LANG_FC_CONFIG
@@ -7441,7 +7945,7 @@ AC_LANG_POP
 # --------------------------
 # Ensure that the configuration variables for the GNU Java Compiler compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GCJ_CONFIG],
 [AC_REQUIRE([LT_PROG_GCJ])dnl
 AC_LANG_SAVE
@@ -7475,7 +7979,7 @@ CC=${GCJ-"gcj"}
 CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # GCJ did not exist at the time GCC didn't implicitly link libc in.
@@ -7512,7 +8016,7 @@ CFLAGS=$lt_save_CFLAGS
 # --------------------------
 # Ensure that the configuration variables for the GNU Go compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GO_CONFIG],
 [AC_REQUIRE([LT_PROG_GO])dnl
 AC_LANG_SAVE
@@ -7546,7 +8050,7 @@ CC=${GOC-"gccgo"}
 CFLAGS=$GOFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # Go did not exist at the time GCC didn't implicitly link libc in.
@@ -7583,7 +8087,7 @@ CFLAGS=$lt_save_CFLAGS
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_RC_CONFIG],
 [AC_REQUIRE([LT_PROG_RC])dnl
 AC_LANG_SAVE
@@ -7599,7 +8103,7 @@ _LT_TAGVAR(objext, $1)=$objext
 lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
 
 # Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+lt_simple_link_test_code=$lt_simple_compile_test_code
 
 # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 _LT_TAG_COMPILER
@@ -7609,7 +8113,7 @@ _LT_COMPILER_BOILERPLATE
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
 lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
@@ -7638,7 +8142,7 @@ AC_DEFUN([LT_PROG_GCJ],
 [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
   [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
     [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
       AC_SUBST(GCJFLAGS)])])[]dnl
 ])
 
@@ -7749,7 +8253,7 @@ lt_ac_count=0
 # Add /usr/xpg4/bin/sed as it is typically found on Solaris
 # along with /bin/sed that truncates output.
 for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
+  test ! -f "$lt_ac_sed" && continue
   cat /dev/null > conftest.in
   lt_ac_count=0
   echo $ECHO_N "0123456789$ECHO_C" >conftest.in
@@ -7766,9 +8270,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
     $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
     cmp -s conftest.out conftest.nl || break
     # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
+    test 10 -lt "$lt_ac_count" && break
     lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
       lt_ac_max=$lt_ac_count
       lt_cv_path_SED=$lt_ac_sed
     fi
@@ -7792,27 +8296,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], [])
 # Find out whether the shell is Bourne or XSI compatible,
 # or has some other useful features.
 m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
   lt_unset=false
@@ -7836,102 +8320,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
 ])# _LT_CHECK_SHELL_FEATURES
 
 
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
 # _LT_PATH_CONVERSION_FUNCTIONS
 # -----------------------------
-# Determine which file name conversion functions should be used by
+# Determine what file name conversion functions should be used by
 # func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
 # for certain cross-compile configurations and native mingw.
 m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
diff --git a/src/gmock/gtest/m4/ltoptions.m4 b/src/gmock/gtest/m4/ltoptions.m4
index 5d9acd8..94b0829 100644
--- a/src/gmock/gtest/m4/ltoptions.m4
+++ b/src/gmock/gtest/m4/ltoptions.m4
@@ -1,14 +1,14 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 7 ltoptions.m4
+# serial 8 ltoptions.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -29,7 +29,7 @@ m4_define([_LT_SET_OPTION],
 [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
 m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
         _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
 ])
 
 
@@ -75,13 +75,15 @@ m4_if([$1],[LT_INIT],[
   dnl
   dnl If no reference was made to various pairs of opposing options, then
   dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
   dnl archives by default:
   _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
   _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
   ])
 ])# _LT_SET_OPTIONS
 
@@ -112,7 +114,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
 [_LT_SET_OPTION([LT_INIT], [dlopen])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
+put the 'dlopen' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -148,7 +150,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
 _LT_SET_OPTION([LT_INIT], [win32-dll])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
+put the 'win32-dll' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -157,9 +159,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
 
 # _LT_ENABLE_SHARED([DEFAULT])
 # ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_SHARED],
 [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([shared],
@@ -172,14 +174,14 @@ AC_ARG_ENABLE([shared],
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
@@ -211,9 +213,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
 
 # _LT_ENABLE_STATIC([DEFAULT])
 # ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_STATIC],
 [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([static],
@@ -226,14 +228,14 @@ AC_ARG_ENABLE([static],
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
@@ -265,9 +267,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
 
 # _LT_ENABLE_FAST_INSTALL([DEFAULT])
 # ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_FAST_INSTALL],
 [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([fast-install],
@@ -280,14 +282,14 @@ AC_ARG_ENABLE([fast-install],
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
@@ -304,14 +306,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
+the 'fast-install' option into LT_INIT's first parameter.])
 ])
 
 AU_DEFUN([AC_DISABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
+the 'disable-fast-install' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -319,11 +321,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
 dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 
 
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
 # _LT_WITH_PIC([MODE])
 # --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
 # LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
     [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
@@ -334,19 +389,17 @@ m4_define([_LT_WITH_PIC],
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+    [pic_mode=m4_default([$1], [default])])
 
 _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
 ])# _LT_WITH_PIC
@@ -359,7 +412,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
 [_LT_SET_OPTION([LT_INIT], [pic-only])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
+put the 'pic-only' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
diff --git a/src/gmock/gtest/m4/ltsugar.m4 b/src/gmock/gtest/m4/ltsugar.m4
index 9000a05..48bc934 100644
--- a/src/gmock/gtest/m4/ltsugar.m4
+++ b/src/gmock/gtest/m4/ltsugar.m4
@@ -1,6 +1,7 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -33,7 +34,7 @@ m4_define([_lt_join],
 # ------------
 # Manipulate m4 lists.
 # These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
+# Autoconf-2.59, which quotes differently.
 m4_define([lt_car], [[$1]])
 m4_define([lt_cdr],
 [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
@@ -44,7 +45,7 @@ m4_define([lt_unquote], $1)
 
 # lt_append(MACRO-NAME, STRING, [SEPARATOR])
 # ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
 # Note that neither SEPARATOR nor STRING are expanded; they are appended
 # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
 # No SEPARATOR is output if MACRO-NAME was previously undefined (different
diff --git a/src/gmock/gtest/m4/ltversion.m4 b/src/gmock/gtest/m4/ltversion.m4
index 07a8602..fa04b52 100644
--- a/src/gmock/gtest/m4/ltversion.m4
+++ b/src/gmock/gtest/m4/ltversion.m4
@@ -1,6 +1,6 @@
 # ltversion.m4 -- version numbers			-*- Autoconf -*-
 #
-#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -9,15 +9,15 @@
 
 # @configure_input@
 
-# serial 3337 ltversion.m4
+# serial 4179 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
diff --git a/src/gmock/gtest/m4/lt~obsolete.m4 b/src/gmock/gtest/m4/lt~obsolete.m4
index c573da9..c6b26f8 100644
--- a/src/gmock/gtest/m4/lt~obsolete.m4
+++ b/src/gmock/gtest/m4/lt~obsolete.m4
@@ -1,6 +1,7 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
@@ -11,7 +12,7 @@
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
 # which have later been changed to m4_define as they aren't part of the
 # exported API, or moved to Autoconf or Automake where they belong.
 #
@@ -25,7 +26,7 @@
 # included after everything else.  This provides aclocal with the
 # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
 # because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
 #
 # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
 # Yes, that means every name once taken will need to remain here until
diff --git a/src/include/krbd.h b/src/include/krbd.h
index 75206cd..c6f3c9d 100644
--- a/src/include/krbd.h
+++ b/src/include/krbd.h
@@ -27,9 +27,11 @@ void krbd_destroy(struct krbd_ctx *ctx);
 int krbd_map(struct krbd_ctx *ctx, const char *pool, const char *image,
              const char *snap, const char *options, char **pdevnode);
 
-int krbd_unmap(struct krbd_ctx *ctx, const char *devnode);
+int krbd_unmap(struct krbd_ctx *ctx, const char *devnode,
+               const char *options);
 int krbd_unmap_by_spec(struct krbd_ctx *ctx, const char *pool,
-                       const char *image, const char *snap);
+                       const char *image, const char *snap,
+                       const char *options);
 
 #ifdef __cplusplus
 }
diff --git a/src/include/rados/librgw.h b/src/include/rados/librgw.h
index 9ba8f3a..c20e96b 100644
--- a/src/include/rados/librgw.h
+++ b/src/include/rados/librgw.h
@@ -18,6 +18,13 @@
 extern "C" {
 #endif
 
+#define LIBRGW_VER_MAJOR 1
+#define LIBRGW_VER_MINOR 1
+#define LIBRGW_VER_EXTRA 0
+
+#define LIBRGW_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra)
+#define LIBRGW_VERSION_CODE LIBRGW_VERSION(LIBRGW_VER_MAJOR, LIBRGW_VER_MINOR, LIBRGW_VER_EXTRA)
+
 typedef void* librgw_t;
 int librgw_create(librgw_t *rgw, int argc, char **argv);
 void librgw_shutdown(librgw_t rgw);
diff --git a/src/include/rados/rgw_file.h b/src/include/rados/rgw_file.h
index 4bb8a93..02d7634 100644
--- a/src/include/rados/rgw_file.h
+++ b/src/include/rados/rgw_file.h
@@ -24,6 +24,12 @@
 extern "C" {
 #endif
 
+#define LIBRGW_FILE_VER_MAJOR 1
+#define LIBRGW_FILE_VER_MINOR 1
+#define LIBRGW_FILE_VER_EXTRA 0
+
+#define LIBRGW_FILE_VERSION(maj, min, extra) ((maj << 16) + (min << 8) + extra)
+#define LIBRGW_FILE_VERSION_CODE LIBRGW_FILE_VERSION(LIBRGW_FILE_VER_MAJOR, LIBRGW_FILE_VER_MINOR, LIBRGW_FILE_VER_EXTRA)
 
 /*
  * object types
@@ -143,8 +149,9 @@ int rgw_statfs(struct rgw_fs *rgw_fs,
 #define RGW_CREATE_FLAG_NONE     0x0000
 
 int rgw_create(struct rgw_fs *rgw_fs, struct rgw_file_handle *parent_fh,
-	      const char *name, struct stat *st, uint32_t mask,
-	      struct rgw_file_handle **fh, uint32_t flags);
+	       const char *name, struct stat *st, uint32_t mask,
+	       struct rgw_file_handle **fh, uint32_t posix_flags,
+	       uint32_t flags);
 
 /*
   create a new directory
@@ -220,9 +227,11 @@ int rgw_truncate(struct rgw_fs *rgw_fs,
 */
 #define RGW_OPEN_FLAG_NONE         0x0000
 #define RGW_OPEN_FLAG_CREATE       0x0001
+#define RGW_OPEN_FLAG_V3           0x0002 /* ops have v3 semantics */
+#define RGW_OPEN_FLAG_STATELESS    0x0002 /* alias it */
 
 int rgw_open(struct rgw_fs *rgw_fs, struct rgw_file_handle *parent_fh,
-	    uint32_t flags);
+	     uint32_t posix_flags, uint32_t flags);
 
 /*
    close file
@@ -297,6 +306,15 @@ int rgw_writev(struct rgw_fs *rgw_fs,
 int rgw_fsync(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
 	      uint32_t flags);
 
+/*
+   NFS commit operation
+*/
+
+#define RGW_COMMIT_FLAG_NONE        0x0000
+
+int rgw_commit(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
+	       uint64_t offset, uint64_t length, uint32_t flags);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/init-radosgw b/src/init-radosgw
index 0c37824..fbb9908 100644
--- a/src/init-radosgw
+++ b/src/init-radosgw
@@ -17,10 +17,6 @@ if [ -x /sbin/start-stop-daemon ]; then
 else
     . /etc/rc.d/init.d/functions
     DEBIAN=0
-
-    # detect systemd, also check whether the systemd-run binary exists
-    SYSTEMD_RUN=$(which systemd-run 2>/dev/null)
-    grep -qs systemd /proc/1/comm || SYSTEMD_RUN=""
 fi
 
 daemon_is_running() {
@@ -99,10 +95,8 @@ case "$1" in
             fi
 
             echo "Starting $name..."
-	    if [ $DEBIAN -eq 1 ]; then
-		start-stop-daemon --start -u $user -x $RADOSGW -p /var/run/ceph/client-$name.pid -- -n $name
-	    elif [ -n "$SYSTEMD_RUN" ]; then
-                $SYSTEMD_RUN -r su "$user" -c "ulimit -n 32768; $RADOSGW -n $name"
+            if [ $DEBIAN -eq 1 ]; then
+                start-stop-daemon --start -u $user -x $RADOSGW -p /var/run/ceph/client-$name.pid -- -n $name
             else
                 ulimit -n 32768
                 core_limit=`ceph-conf -n $name 'core file limit'`
diff --git a/src/java/Makefile.in b/src/java/Makefile.in
index a031874..950f0f3 100644
--- a/src/java/Makefile.in
+++ b/src/java/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -17,7 +17,17 @@
 # automake technique adapted from OpenMPI Java
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -84,7 +94,6 @@ target_triplet = @target@
 @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@HAVE_JUNIT4_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_1 = libcephfs-test.jar
 @ENABLE_CEPHFS_JAVA_TRUE@@ENABLE_CLIENT_TRUE@@HAVE_JUNIT4_TRUE@@WITH_CEPHFS_TRUE@@WITH_RADOS_TRUE at am__append_2 = test/com/ceph/fs/*.class libcephfs-test.jar
 subdir = src/java
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am README
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/ac_prog_jar.m4 \
@@ -103,6 +112,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/acconfig.h
 CONFIG_CLEAN_FILES =
@@ -156,13 +166,13 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(javadir)"
 DATA = $(java_DATA)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -248,6 +258,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -346,6 +357,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -419,7 +431,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/java/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign src/java/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -622,6 +633,8 @@ uninstall-am: uninstall-javaDATA
 	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
 	ps ps-am tags-am uninstall uninstall-am uninstall-javaDATA
 
+.PRECIOUS: Makefile
+
 
 # note: for the -source 1.5 builds, we add
 #   -Xlint:-options
diff --git a/src/journal/AsyncOpTracker.cc b/src/journal/AsyncOpTracker.cc
deleted file mode 100644
index 13a55fa..0000000
--- a/src/journal/AsyncOpTracker.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-
-#include "journal/AsyncOpTracker.h"
-#include "journal/Utils.h"
-#include "include/assert.h"
-
-namespace journal {
-
-AsyncOpTracker::AsyncOpTracker()
-  : m_lock(utils::unique_lock_name("AsyncOpTracker::m_lock", this)),
-    m_pending_ops(0) {
-}
-
-AsyncOpTracker::~AsyncOpTracker() {
-  wait_for_ops();
-}
-
-void AsyncOpTracker::start_op() {
-  Mutex::Locker locker(m_lock);
-  ++m_pending_ops;
-}
-
-void AsyncOpTracker::finish_op() {
-  Context *on_finish = nullptr;
-  {
-    Mutex::Locker locker(m_lock);
-    assert(m_pending_ops > 0);
-    if (--m_pending_ops == 0) {
-      m_cond.Signal();
-      std::swap(on_finish, m_on_finish);
-    }
-  }
-
-  if (on_finish != nullptr) {
-    on_finish->complete(0);
-  }
-}
-
-void AsyncOpTracker::wait_for_ops() {
-  Mutex::Locker locker(m_lock);
-  while (m_pending_ops > 0) {
-    m_cond.Wait(m_lock);
-  }
-}
-
-void AsyncOpTracker::wait_for_ops(Context *on_finish) {
-  {
-    Mutex::Locker locker(m_lock);
-    assert(m_on_finish == nullptr);
-    if (m_pending_ops > 0) {
-      m_on_finish = on_finish;
-      return;
-    }
-  }
-  on_finish->complete(0);
-}
-
-bool AsyncOpTracker::empty() {
-  Mutex::Locker locker(m_lock);
-  return (m_pending_ops == 0);
-}
-
-} // namespace journal
diff --git a/src/journal/AsyncOpTracker.h b/src/journal/AsyncOpTracker.h
deleted file mode 100644
index a88cd45..0000000
--- a/src/journal/AsyncOpTracker.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
-// vim: ts=8 sw=2 smarttab
-
-#ifndef CEPH_JOURNAL_ASYNC_OP_TRACKER_H
-#define CEPH_JOURNAL_ASYNC_OP_TRACKER_H
-
-#include "include/int_types.h"
-#include "common/Cond.h"
-#include "common/Mutex.h"
-
-struct Context;
-
-namespace journal {
-
-class AsyncOpTracker {
-public:
-  AsyncOpTracker();
-  ~AsyncOpTracker();
-
-  void start_op();
-  void finish_op();
-
-  void wait_for_ops();
-  void wait_for_ops(Context *on_finish);
-
-  bool empty();
-
-private:
-  Mutex m_lock;
-  Cond m_cond;
-  uint32_t m_pending_ops;
-  Context *m_on_finish = nullptr;
-
-};
-
-} // namespace journal
-
-#endif // CEPH_JOURNAL_ASYNC_OP_TRACKER_H
diff --git a/src/journal/JournalMetadata.cc b/src/journal/JournalMetadata.cc
index de46bd7..7b09586 100644
--- a/src/journal/JournalMetadata.cc
+++ b/src/journal/JournalMetadata.cc
@@ -256,21 +256,23 @@ struct C_GetTags : public Context {
   const std::string &oid;
   const std::string &client_id;
   AsyncOpTracker &async_op_tracker;
+  uint64_t start_after_tag_tid;
   boost::optional<uint64_t> tag_class;
   JournalMetadata::Tags *tags;
   Context *on_finish;
 
   const uint64_t MAX_RETURN = 64;
-  uint64_t start_after_tag_tid = 0;
   bufferlist out_bl;
 
   C_GetTags(CephContext *cct, librados::IoCtx &ioctx, const std::string &oid,
             const std::string &client_id, AsyncOpTracker &async_op_tracker,
+            uint64_t start_after_tag_tid,
             const boost::optional<uint64_t> &tag_class,
             JournalMetadata::Tags *tags, Context *on_finish)
     : cct(cct), ioctx(ioctx), oid(oid), client_id(client_id),
-      async_op_tracker(async_op_tracker), tag_class(tag_class), tags(tags),
-      on_finish(on_finish) {
+      async_op_tracker(async_op_tracker),
+      start_after_tag_tid(start_after_tag_tid), tag_class(tag_class),
+      tags(tags), on_finish(on_finish) {
     async_op_tracker.start_op();
   }
   virtual ~C_GetTags() {
@@ -559,6 +561,7 @@ void JournalMetadata::unregister_client(Context *on_finish) {
 
 void JournalMetadata::allocate_tag(uint64_t tag_class, const bufferlist &data,
                                    Tag *tag, Context *on_finish) {
+  on_finish = new C_NotifyUpdate(this, on_finish);
   C_AllocateTag *ctx = new C_AllocateTag(m_cct, m_ioctx, m_oid,
                                          m_async_op_tracker, tag_class,
                                          data, tag, on_finish);
@@ -579,11 +582,12 @@ void JournalMetadata::get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish) {
   ctx->send();
 }
 
-void JournalMetadata::get_tags(const boost::optional<uint64_t> &tag_class,
+void JournalMetadata::get_tags(uint64_t start_after_tag_tid,
+                               const boost::optional<uint64_t> &tag_class,
                                Tags *tags, Context *on_finish) {
   C_GetTags *ctx = new C_GetTags(m_cct, m_ioctx, m_oid, m_client_id,
-                                 m_async_op_tracker, tag_class,
-                                 tags, on_finish);
+                                 m_async_op_tracker, start_after_tag_tid,
+                                 tag_class, tags, on_finish);
   ctx->send();
 }
 
@@ -749,6 +753,10 @@ void JournalMetadata::handle_refresh_complete(C_Refresh *refresh, int r) {
     Client client(m_client_id, bufferlist());
     RegisteredClients::iterator it = refresh->registered_clients.find(client);
     if (it != refresh->registered_clients.end()) {
+      if (it->state == cls::journal::CLIENT_STATE_DISCONNECTED) {
+	ldout(m_cct, 0) << "client flagged disconnected: " << m_client_id
+			<< dendl;
+      }
       m_minimum_set = MAX(m_minimum_set, refresh->minimum_set);
       m_active_set = MAX(m_active_set, refresh->active_set);
       m_registered_clients = refresh->registered_clients;
@@ -810,9 +818,11 @@ void JournalMetadata::handle_commit_position_task() {
   librados::ObjectWriteOperation op;
   client::client_commit(&op, m_client_id, m_commit_position);
 
-  C_NotifyUpdate *ctx = new C_NotifyUpdate(this, m_commit_position_ctx);
+  Context *ctx = new C_NotifyUpdate(this, m_commit_position_ctx);
   m_commit_position_ctx = NULL;
 
+  ctx = schedule_laggy_clients_disconnect(ctx);
+
   librados::AioCompletion *comp =
     librados::Rados::aio_create_completion(ctx, NULL,
                                            utils::rados_ctx_callback);
@@ -839,7 +849,7 @@ void JournalMetadata::handle_watch_reset() {
     if (r == -ENOENT) {
       ldout(m_cct, 5) << __func__ << ": journal header not found" << dendl;
     } else {
-      lderr(m_cct) << __func__ << ": failed to watch journal"
+      lderr(m_cct) << __func__ << ": failed to watch journal: "
                    << cpp_strerror(r) << dendl;
     }
     schedule_watch_reset();
@@ -1004,10 +1014,10 @@ void JournalMetadata::notify_update() {
   m_ioctx.notify2(m_oid, bl, 5000, NULL);
 }
 
-void JournalMetadata::async_notify_update() {
+void JournalMetadata::async_notify_update(Context *on_safe) {
   ldout(m_cct, 10) << "async notifying journal header update" << dendl;
 
-  C_AioNotify *ctx = new C_AioNotify(this);
+  C_AioNotify *ctx = new C_AioNotify(this, on_safe);
   librados::AioCompletion *comp =
     librados::Rados::aio_create_completion(ctx, NULL,
                                            utils::rados_ctx_callback);
@@ -1019,10 +1029,69 @@ void JournalMetadata::async_notify_update() {
   comp->release();
 }
 
+void JournalMetadata::wait_for_ops() {
+  C_SaferCond ctx;
+  m_async_op_tracker.wait_for_ops(&ctx);
+  ctx.wait();
+}
+
 void JournalMetadata::handle_notified(int r) {
   ldout(m_cct, 10) << "notified journal header update: r=" << r << dendl;
 }
 
+Context *JournalMetadata::schedule_laggy_clients_disconnect(Context *on_finish) {
+  assert(m_lock.is_locked());
+
+  ldout(m_cct, 20) << __func__ << dendl;
+
+  if (m_settings.max_concurrent_object_sets <= 0) {
+    return on_finish;
+  }
+
+  Context *ctx = on_finish;
+
+  for (auto &c : m_registered_clients) {
+    if (c.state == cls::journal::CLIENT_STATE_DISCONNECTED ||
+	c.id == m_client_id ||
+	m_settings.whitelisted_laggy_clients.count(c.id) > 0) {
+      continue;
+    }
+    const std::string &client_id = c.id;
+    uint64_t object_set = 0;
+    if (!c.commit_position.object_positions.empty()) {
+      auto &position = *(c.commit_position.object_positions.begin());
+      object_set = position.object_number / m_splay_width;
+    }
+
+    if (m_active_set > object_set + m_settings.max_concurrent_object_sets) {
+      ldout(m_cct, 1) << __func__ << ": " << client_id
+		      << ": scheduling disconnect" << dendl;
+
+      ctx = new FunctionContext([this, client_id, ctx](int r1) {
+          ldout(m_cct, 10) << __func__ << ": " << client_id
+                           << ": flagging disconnected" << dendl;
+
+          librados::ObjectWriteOperation op;
+          client::client_update_state(&op, client_id,
+                                      cls::journal::CLIENT_STATE_DISCONNECTED);
+
+          librados::AioCompletion *comp =
+              librados::Rados::aio_create_completion(ctx, nullptr,
+                                                     utils::rados_ctx_callback);
+          int r = m_ioctx.aio_operate(m_oid, comp, &op);
+          assert(r == 0);
+          comp->release();
+	});
+    }
+  }
+
+  if (ctx == on_finish) {
+    ldout(m_cct, 20) << __func__ << ": no laggy clients to disconnect" << dendl;
+  }
+
+  return ctx;
+}
+
 std::ostream &operator<<(std::ostream &os,
 			 const JournalMetadata::RegisteredClients &clients) {
   os << "[";
diff --git a/src/journal/JournalMetadata.h b/src/journal/JournalMetadata.h
index 01116d7..24c3a69 100644
--- a/src/journal/JournalMetadata.h
+++ b/src/journal/JournalMetadata.h
@@ -7,12 +7,12 @@
 #include "include/int_types.h"
 #include "include/Context.h"
 #include "include/rados/librados.hpp"
+#include "common/AsyncOpTracker.h"
 #include "common/Cond.h"
 #include "common/Mutex.h"
 #include "common/RefCountedObj.h"
 #include "common/WorkQueue.h"
 #include "cls/journal/cls_journal_types.h"
-#include "journal/AsyncOpTracker.h"
 #include "journal/JournalMetadataListener.h"
 #include "journal/Settings.h"
 #include <boost/intrusive_ptr.hpp>
@@ -71,7 +71,8 @@ public:
   void allocate_tag(uint64_t tag_class, const bufferlist &data,
                     Tag *tag, Context *on_finish);
   void get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish);
-  void get_tags(const boost::optional<uint64_t> &tag_class, Tags *tags,
+  void get_tags(uint64_t start_after_tag_tid,
+                const boost::optional<uint64_t> &tag_class, Tags *tags,
                 Context *on_finish);
 
   inline const Settings &get_settings() const {
@@ -97,6 +98,10 @@ public:
     m_work_queue->queue(on_finish, r);
   }
 
+  inline ContextWQ *get_work_queue() {
+    return m_work_queue;
+  }
+
   inline SafeTimer &get_timer() {
     return *m_timer;
   }
@@ -146,7 +151,9 @@ public:
   void committed(uint64_t commit_tid, const CreateContext &create_context);
 
   void notify_update();
-  void async_notify_update();
+  void async_notify_update(Context *on_safe);
+
+  void wait_for_ops();
 
 private:
   typedef std::map<uint64_t, uint64_t> AllocatedEntryTids;
@@ -215,9 +222,10 @@ private:
 
   struct C_AioNotify : public Context {
     JournalMetadata* journal_metadata;
+    Context *on_safe;
 
-    C_AioNotify(JournalMetadata *_journal_metadata)
-      : journal_metadata(_journal_metadata) {
+    C_AioNotify(JournalMetadata *_journal_metadata, Context *_on_safe)
+      : journal_metadata(_journal_metadata), on_safe(_on_safe) {
       journal_metadata->m_async_op_tracker.start_op();
     }
     virtual ~C_AioNotify() {
@@ -225,6 +233,9 @@ private:
     }
     virtual void finish(int r) {
       journal_metadata->handle_notified(r);
+      if (on_safe != nullptr) {
+        on_safe->complete(0);
+      }
     }
   };
 
@@ -241,7 +252,8 @@ private:
     }
     virtual void finish(int r) {
       if (r == 0) {
-        journal_metadata->async_notify_update();
+        journal_metadata->async_notify_update(on_safe);
+        return;
       }
       if (on_safe != NULL) {
         on_safe->complete(r);
@@ -344,6 +356,8 @@ private:
   void handle_watch_error(int err);
   void handle_notified(int r);
 
+  Context *schedule_laggy_clients_disconnect(Context *on_finish);
+
   friend std::ostream &operator<<(std::ostream &os,
 				  const JournalMetadata &journal_metadata);
 };
diff --git a/src/journal/JournalPlayer.h b/src/journal/JournalPlayer.h
index 690eccd..ff5732b 100644
--- a/src/journal/JournalPlayer.h
+++ b/src/journal/JournalPlayer.h
@@ -7,8 +7,8 @@
 #include "include/int_types.h"
 #include "include/Context.h"
 #include "include/rados/librados.hpp"
+#include "common/AsyncOpTracker.h"
 #include "common/Mutex.h"
-#include "journal/AsyncOpTracker.h"
 #include "journal/JournalMetadata.h"
 #include "journal/ObjectPlayer.h"
 #include "cls/journal/cls_journal_types.h"
diff --git a/src/journal/JournalRecorder.cc b/src/journal/JournalRecorder.cc
index 4cbe739..1917165 100644
--- a/src/journal/JournalRecorder.cc
+++ b/src/journal/JournalRecorder.cc
@@ -10,6 +10,8 @@
 #undef dout_prefix
 #define dout_prefix *_dout << "JournalRecorder: " << this << " "
 
+using std::shared_ptr;
+
 namespace journal {
 
 namespace {
@@ -59,8 +61,13 @@ JournalRecorder::JournalRecorder(librados::IoCtx &ioctx,
 
   uint8_t splay_width = m_journal_metadata->get_splay_width();
   for (uint8_t splay_offset = 0; splay_offset < splay_width; ++splay_offset) {
+    m_object_locks.push_back(shared_ptr<Mutex>(
+                                          new Mutex("ObjectRecorder::m_lock::"+
+                                          std::to_string(splay_offset))));
     uint64_t object_number = splay_offset + (m_current_set * splay_width);
-    m_object_ptrs[splay_offset] = create_object_recorder(object_number);
+    m_object_ptrs[splay_offset] = create_object_recorder(
+                                                object_number,
+                                                m_object_locks[splay_offset]);
   }
 
   m_journal_metadata->add_listener(&m_listener);
@@ -77,7 +84,7 @@ JournalRecorder::~JournalRecorder() {
 Future JournalRecorder::append(uint64_t tag_tid,
                                const bufferlist &payload_bl) {
 
-  Mutex::Locker locker(m_lock);
+  m_lock.Lock();
 
   uint64_t entry_tid = m_journal_metadata->allocate_entry_tid(tag_tid);
   uint8_t splay_width = m_journal_metadata->get_splay_width();
@@ -90,18 +97,19 @@ Future JournalRecorder::append(uint64_t tag_tid,
   future->init(m_prev_future);
   m_prev_future = future;
 
+  m_object_locks[splay_offset]->Lock();
+  m_lock.Unlock();
+
   bufferlist entry_bl;
   ::encode(Entry(future->get_tag_tid(), future->get_entry_tid(), payload_bl),
            entry_bl);
   assert(entry_bl.length() <= m_journal_metadata->get_object_size());
 
-  AppendBuffers append_buffers;
-  append_buffers.push_back(std::make_pair(future, entry_bl));
-  bool object_full = object_ptr->append(append_buffers);
-
+  bool object_full = object_ptr->append_unlock({{future, entry_bl}});
   if (object_full) {
     ldout(m_cct, 10) << "object " << object_ptr->get_oid() << " now full"
                      << dendl;
+    Mutex::Locker l(m_lock);
     close_and_advance_object_set(object_ptr->get_object_number() / splay_width);
   }
   return Future(future);
@@ -117,6 +125,7 @@ void JournalRecorder::flush(Context *on_safe) {
          it != m_object_ptrs.end(); ++it) {
       it->second->flush(ctx);
     }
+
   }
 
   // avoid holding the lock in case there is nothing to flush
@@ -191,14 +200,20 @@ void JournalRecorder::open_object_set() {
                    << dendl;
 
   uint8_t splay_width = m_journal_metadata->get_splay_width();
+
+  lock_object_recorders();
   for (ObjectRecorderPtrs::iterator it = m_object_ptrs.begin();
        it != m_object_ptrs.end(); ++it) {
     ObjectRecorderPtr object_recorder = it->second;
-    if (object_recorder->get_object_number() / splay_width != m_current_set) {
+    uint64_t object_number = object_recorder->get_object_number();
+    if (object_number / splay_width != m_current_set) {
       assert(object_recorder->is_closed());
 
       // ready to close object and open object in active set
-      create_next_object_recorder(object_recorder);
+      create_next_object_recorder_unlock(object_recorder);
+    } else {
+      uint8_t splay_offset = object_number % splay_width;
+      m_object_locks[splay_offset]->Unlock();
     }
   }
 }
@@ -209,6 +224,7 @@ bool JournalRecorder::close_object_set(uint64_t active_set) {
   // object recorders will invoke overflow handler as they complete
   // closing the object to ensure correct order of future appends
   uint8_t splay_width = m_journal_metadata->get_splay_width();
+  lock_object_recorders();
   for (ObjectRecorderPtrs::iterator it = m_object_ptrs.begin();
        it != m_object_ptrs.end(); ++it) {
     ObjectRecorderPtr object_recorder = it->second;
@@ -224,21 +240,22 @@ bool JournalRecorder::close_object_set(uint64_t active_set) {
       }
     }
   }
+  unlock_object_recorders();
   return (m_in_flight_object_closes == 0);
 }
 
 ObjectRecorderPtr JournalRecorder::create_object_recorder(
-    uint64_t object_number) {
+    uint64_t object_number, shared_ptr<Mutex> lock) {
   ObjectRecorderPtr object_recorder(new ObjectRecorder(
     m_ioctx, utils::get_object_name(m_object_oid_prefix, object_number),
-    object_number, m_journal_metadata->get_timer(),
-    m_journal_metadata->get_timer_lock(), &m_object_handler,
-    m_journal_metadata->get_order(), m_flush_interval, m_flush_bytes,
-    m_flush_age));
+    object_number, lock, m_journal_metadata->get_work_queue(),
+    m_journal_metadata->get_timer(), m_journal_metadata->get_timer_lock(),
+    &m_object_handler, m_journal_metadata->get_order(), m_flush_interval,
+    m_flush_bytes, m_flush_age));
   return object_recorder;
 }
 
-void JournalRecorder::create_next_object_recorder(
+void JournalRecorder::create_next_object_recorder_unlock(
     ObjectRecorderPtr object_recorder) {
   assert(m_lock.is_locked());
 
@@ -246,8 +263,10 @@ void JournalRecorder::create_next_object_recorder(
   uint8_t splay_width = m_journal_metadata->get_splay_width();
   uint8_t splay_offset = object_number % splay_width;
 
+  assert(m_object_locks[splay_offset]->is_locked());
+
   ObjectRecorderPtr new_object_recorder = create_object_recorder(
-     (m_current_set * splay_width) + splay_offset);
+     (m_current_set * splay_width) + splay_offset, m_object_locks[splay_offset]);
 
   ldout(m_cct, 10) << __func__ << ": "
                    << "old oid=" << object_recorder->get_oid() << ", "
@@ -262,8 +281,7 @@ void JournalRecorder::create_next_object_recorder(
       new_object_recorder->get_object_number());
   }
 
-  new_object_recorder->append(append_buffers);
-
+  new_object_recorder->append_unlock(std::move(append_buffers));
   m_object_ptrs[splay_offset] = new_object_recorder;
 }
 
diff --git a/src/journal/JournalRecorder.h b/src/journal/JournalRecorder.h
index 6ed2e63..7a4af52 100644
--- a/src/journal/JournalRecorder.h
+++ b/src/journal/JournalRecorder.h
@@ -92,6 +92,7 @@ private:
   uint32_t m_in_flight_object_closes = 0;
   uint64_t m_current_set;
   ObjectRecorderPtrs m_object_ptrs;
+  std::vector<std::shared_ptr<Mutex>> m_object_locks;
 
   FutureImplPtr m_prev_future;
 
@@ -103,13 +104,26 @@ private:
 
   void close_and_advance_object_set(uint64_t object_set);
 
-  ObjectRecorderPtr create_object_recorder(uint64_t object_number);
-  void create_next_object_recorder(ObjectRecorderPtr object_recorder);
+  ObjectRecorderPtr create_object_recorder(uint64_t object_number,
+                                           std::shared_ptr<Mutex> lock);
+  void create_next_object_recorder_unlock(ObjectRecorderPtr object_recorder);
 
   void handle_update();
 
   void handle_closed(ObjectRecorder *object_recorder);
   void handle_overflow(ObjectRecorder *object_recorder);
+
+  void lock_object_recorders() {
+    for (auto& lock : m_object_locks) {
+      lock->Lock();
+    }
+  }
+
+  void unlock_object_recorders() {
+    for (auto& lock : m_object_locks) {
+      lock->Unlock();
+    }
+  }
 };
 
 } // namespace journal
diff --git a/src/journal/JournalTrimmer.cc b/src/journal/JournalTrimmer.cc
index aef16c2..6612d9f 100644
--- a/src/journal/JournalTrimmer.cc
+++ b/src/journal/JournalTrimmer.cc
@@ -49,7 +49,9 @@ void JournalTrimmer::shut_down(Context *on_finish) {
 
 int JournalTrimmer::remove_objects(bool force) {
   ldout(m_cct, 20) << __func__ << dendl;
-  m_async_op_tracker.wait_for_ops();
+  C_SaferCond ops_ctx;
+  m_async_op_tracker.wait_for_ops(&ops_ctx);
+  ops_ctx.wait();
 
   C_SaferCond ctx;
   {
@@ -142,8 +144,11 @@ void JournalTrimmer::handle_metadata_updated() {
   uint64_t minimum_commit_set = active_set;
   std::string minimum_client_id;
 
-  // TODO: add support for trimming past "laggy" clients
   for (auto &client : registered_clients) {
+    if (client.state == cls::journal::CLIENT_STATE_DISCONNECTED) {
+      continue;
+    }
+
     if (client.commit_position.object_positions.empty()) {
       // client hasn't recorded any commits
       minimum_commit_set = minimum_set;
diff --git a/src/journal/JournalTrimmer.h b/src/journal/JournalTrimmer.h
index ec76d72..9aefb87 100644
--- a/src/journal/JournalTrimmer.h
+++ b/src/journal/JournalTrimmer.h
@@ -7,8 +7,8 @@
 #include "include/int_types.h"
 #include "include/rados/librados.hpp"
 #include "include/Context.h"
+#include "common/AsyncOpTracker.h"
 #include "common/Mutex.h"
-#include "journal/AsyncOpTracker.h"
 #include "journal/JournalMetadata.h"
 #include "cls/journal/cls_journal_types.h"
 #include <functional>
diff --git a/src/journal/Journaler.cc b/src/journal/Journaler.cc
index c08a11b..0b21ebf 100644
--- a/src/journal/Journaler.cc
+++ b/src/journal/Journaler.cc
@@ -103,6 +103,11 @@ void Journaler::set_up(ContextWQ *work_queue, SafeTimer *timer,
 Journaler::~Journaler() {
   if (m_metadata != nullptr) {
     assert(!m_metadata->is_initialized());
+    if (!m_initialized) {
+      // never initialized -- ensure any in-flight ops are complete
+      // since we wouldn't expect shut_down to be invoked
+      m_metadata->wait_for_ops();
+    }
     m_metadata->put();
     m_metadata = nullptr;
   }
@@ -124,6 +129,7 @@ int Journaler::exists(bool *header_exists) const {
 }
 
 void Journaler::init(Context *on_init) {
+  m_initialized = true;
   m_metadata->init(new C_InitJournaler(this, on_init));
 }
 
@@ -313,7 +319,12 @@ void Journaler::get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish) {
 }
 
 void Journaler::get_tags(uint64_t tag_class, Tags *tags, Context *on_finish) {
-  m_metadata->get_tags(tag_class, tags, on_finish);
+  m_metadata->get_tags(0, tag_class, tags, on_finish);
+}
+
+void Journaler::get_tags(uint64_t start_after_tag_tid, uint64_t tag_class,
+                         Tags *tags, Context *on_finish) {
+  m_metadata->get_tags(start_after_tag_tid, tag_class, tags, on_finish);
 }
 
 void Journaler::start_replay(ReplayHandler *replay_handler) {
diff --git a/src/journal/Journaler.h b/src/journal/Journaler.h
index 93a89bb..9a1e75b 100644
--- a/src/journal/Journaler.h
+++ b/src/journal/Journaler.h
@@ -96,6 +96,8 @@ public:
                     cls::journal::Tag *tag, Context *on_finish);
   void get_tag(uint64_t tag_tid, Tag *tag, Context *on_finish);
   void get_tags(uint64_t tag_class, Tags *tags, Context *on_finish);
+  void get_tags(uint64_t start_after_tag_tid, uint64_t tag_class, Tags *tags,
+                Context *on_finish);
 
   void start_replay(ReplayHandler *replay_handler);
   void start_live_replay(ReplayHandler *replay_handler, double interval);
@@ -139,6 +141,7 @@ private:
   std::string m_header_oid;
   std::string m_object_oid_prefix;
 
+  bool m_initialized = false;
   JournalMetadata *m_metadata = nullptr;
   JournalPlayer *m_player = nullptr;
   JournalRecorder *m_recorder = nullptr;
diff --git a/src/journal/Makefile.am b/src/journal/Makefile.am
index ad4d54d..676997a 100644
--- a/src/journal/Makefile.am
+++ b/src/journal/Makefile.am
@@ -2,7 +2,6 @@ if ENABLE_CLIENT
 if WITH_RADOS
 
 libjournal_la_SOURCES = \
-	journal/AsyncOpTracker.cc \
 	journal/Entry.cc \
 	journal/Future.cc \
 	journal/FutureImpl.cc \
@@ -17,7 +16,6 @@ libjournal_la_SOURCES = \
 
 noinst_LTLIBRARIES += libjournal.la
 noinst_HEADERS += \
-	journal/AsyncOpTracker.h \
 	journal/Entry.h \
 	journal/Future.h \
 	journal/FutureImpl.h \
diff --git a/src/journal/ObjectRecorder.cc b/src/journal/ObjectRecorder.cc
index 0cf2fd1..a2faeae 100644
--- a/src/journal/ObjectRecorder.cc
+++ b/src/journal/ObjectRecorder.cc
@@ -13,23 +13,24 @@
 #define dout_prefix *_dout << "ObjectRecorder: " << this << " "
 
 using namespace cls::journal;
+using std::shared_ptr;
 
 namespace journal {
 
 ObjectRecorder::ObjectRecorder(librados::IoCtx &ioctx, const std::string &oid,
-                               uint64_t object_number,
-                               SafeTimer &timer, Mutex &timer_lock,
-                               Handler *handler, uint8_t order,
-                               uint32_t flush_interval, uint64_t flush_bytes,
-                               double flush_age)
+                               uint64_t object_number, shared_ptr<Mutex> lock,
+                               ContextWQ *work_queue, SafeTimer &timer,
+                               Mutex &timer_lock, Handler *handler,
+                               uint8_t order, uint32_t flush_interval,
+                               uint64_t flush_bytes, double flush_age)
   : RefCountedObject(NULL, 0), m_oid(oid), m_object_number(object_number),
-    m_cct(NULL), m_timer(timer), m_timer_lock(timer_lock),
-    m_handler(handler), m_order(order), m_soft_max_size(1 << m_order),
-    m_flush_interval(flush_interval), m_flush_bytes(flush_bytes),
-    m_flush_age(flush_age), m_flush_handler(this), m_append_task(NULL),
-    m_lock(utils::unique_lock_name("ObjectRecorder::m_lock", this)),
-    m_append_tid(0), m_pending_bytes(0), m_size(0), m_overflowed(false),
-    m_object_closed(false), m_in_flight_flushes(false) {
+    m_cct(NULL), m_op_work_queue(work_queue), m_timer(timer),
+    m_timer_lock(timer_lock), m_handler(handler), m_order(order),
+    m_soft_max_size(1 << m_order), m_flush_interval(flush_interval),
+    m_flush_bytes(flush_bytes), m_flush_age(flush_age), m_flush_handler(this),
+    m_append_task(NULL), m_lock(lock), m_append_tid(0), m_pending_bytes(0),
+    m_size(0), m_overflowed(false), m_object_closed(false),
+    m_in_flight_flushes(false), m_aio_scheduled(false) {
   m_ioctx.dup(ioctx);
   m_cct = reinterpret_cast<CephContext*>(m_ioctx.cct());
   assert(m_handler != NULL);
@@ -40,33 +41,39 @@ ObjectRecorder::~ObjectRecorder() {
   assert(m_append_buffers.empty());
   assert(m_in_flight_tids.empty());
   assert(m_in_flight_appends.empty());
+  assert(!m_aio_scheduled);
 }
 
-bool ObjectRecorder::append(const AppendBuffers &append_buffers) {
+bool ObjectRecorder::append_unlock(AppendBuffers &&append_buffers) {
+  assert(m_lock->is_locked());
+
   FutureImplPtr last_flushed_future;
   bool schedule_append = false;
-  {
-    Mutex::Locker locker(m_lock);
-    if (m_overflowed) {
-      m_append_buffers.insert(m_append_buffers.end(),
-                              append_buffers.begin(), append_buffers.end());
-      return false;
-    }
 
-    for (AppendBuffers::const_iterator iter = append_buffers.begin();
-         iter != append_buffers.end(); ++iter) {
-      if (append(*iter, &schedule_append)) {
-        last_flushed_future = iter->first;
-      }
+  if (m_overflowed) {
+    m_append_buffers.insert(m_append_buffers.end(),
+                            append_buffers.begin(), append_buffers.end());
+    m_lock->Unlock();
+    return false;
+  }
+
+  for (AppendBuffers::const_iterator iter = append_buffers.begin();
+       iter != append_buffers.end(); ++iter) {
+    if (append(*iter, &schedule_append)) {
+      last_flushed_future = iter->first;
     }
   }
 
   if (last_flushed_future) {
     flush(last_flushed_future);
-  } else if (schedule_append) {
-    schedule_append_task();
+    m_lock->Unlock();
   } else {
-    cancel_append_task();
+    m_lock->Unlock();
+    if (schedule_append) {
+      schedule_append_task();
+    } else {
+      cancel_append_task();
+    }
   }
   return (!m_object_closed && !m_overflowed &&
           m_size + m_pending_bytes >= m_soft_max_size);
@@ -78,13 +85,13 @@ void ObjectRecorder::flush(Context *on_safe) {
   cancel_append_task();
   Future future;
   {
-    Mutex::Locker locker(m_lock);
+    Mutex::Locker locker(*m_lock);
 
     // if currently handling flush notifications, wait so that
     // we notify in the correct order (since lock is dropped on
     // callback)
     if (m_in_flight_flushes) {
-      m_in_flight_flushes_cond.Wait(m_lock);
+      m_in_flight_flushes_cond.Wait(*(m_lock.get()));
     }
 
     // attach the flush to the most recent append
@@ -110,7 +117,8 @@ void ObjectRecorder::flush(const FutureImplPtr &future) {
   ldout(m_cct, 20) << __func__ << ": " << m_oid << " flushing " << *future
                    << dendl;
 
-  Mutex::Locker locker(m_lock);
+  assert(m_lock->is_locked());
+
   if (future->get_flush_handler().get() != &m_flush_handler) {
     // if we don't own this future, re-issue the flush so that it hits the
     // correct journal object owner
@@ -124,12 +132,16 @@ void ObjectRecorder::flush(const FutureImplPtr &future) {
     return;
   }
 
-  AppendBuffers::iterator it;
-  for (it = m_append_buffers.begin(); it != m_append_buffers.end(); ++it) {
-    if (it->first == future) {
+  AppendBuffers::reverse_iterator r_it;
+  for (r_it = m_append_buffers.rbegin(); r_it != m_append_buffers.rend();
+       ++r_it) {
+    if (r_it->first == future) {
       break;
     }
   }
+  assert(r_it != m_append_buffers.rend());
+
+  auto it = (++r_it).base();
   assert(it != m_append_buffers.end());
   ++it;
 
@@ -142,7 +154,7 @@ void ObjectRecorder::flush(const FutureImplPtr &future) {
 void ObjectRecorder::claim_append_buffers(AppendBuffers *append_buffers) {
   ldout(m_cct, 20) << __func__ << ": " << m_oid << dendl;
 
-  Mutex::Locker locker(m_lock);
+  assert(m_lock->is_locked());
   assert(m_in_flight_tids.empty());
   assert(m_in_flight_appends.empty());
   assert(m_object_closed || m_overflowed);
@@ -151,23 +163,24 @@ void ObjectRecorder::claim_append_buffers(AppendBuffers *append_buffers) {
 }
 
 bool ObjectRecorder::close() {
+  assert (m_lock->is_locked());
+
   ldout(m_cct, 20) << __func__ << ": " << m_oid << dendl;
 
   cancel_append_task();
 
-  Mutex::Locker locker(m_lock);
   flush_appends(true);
 
   assert(!m_object_closed);
   m_object_closed = true;
-  return m_in_flight_tids.empty();
+  return (m_in_flight_tids.empty() && !m_in_flight_flushes && !m_aio_scheduled);
 }
 
 void ObjectRecorder::handle_append_task() {
   assert(m_timer_lock.is_locked());
   m_append_task = NULL;
 
-  Mutex::Locker locker(m_lock);
+  Mutex::Locker locker(*m_lock);
   flush_appends(true);
 }
 
@@ -189,7 +202,7 @@ void ObjectRecorder::schedule_append_task() {
 
 bool ObjectRecorder::append(const AppendBuffer &append_buffer,
                             bool *schedule_append) {
-  assert(m_lock.is_locked());
+  assert(m_lock->is_locked());
 
   bool flush_requested = false;
   if (!m_object_closed && !m_overflowed) {
@@ -206,7 +219,7 @@ bool ObjectRecorder::append(const AppendBuffer &append_buffer,
 }
 
 bool ObjectRecorder::flush_appends(bool force) {
-  assert(m_lock.is_locked());
+  assert(m_lock->is_locked());
   if (m_object_closed || m_overflowed) {
     return true;
   }
@@ -232,7 +245,7 @@ void ObjectRecorder::handle_append_flushed(uint64_t tid, int r) {
 
   AppendBuffers append_buffers;
   {
-    Mutex::Locker locker(m_lock);
+    m_lock->Lock();
     auto tid_iter = m_in_flight_tids.find(tid);
     assert(tid_iter != m_in_flight_tids.end());
     m_in_flight_tids.erase(tid_iter);
@@ -241,15 +254,17 @@ void ObjectRecorder::handle_append_flushed(uint64_t tid, int r) {
     if (r == -EOVERFLOW || m_overflowed) {
       if (iter != m_in_flight_appends.end()) {
         m_overflowed = true;
-        append_overflowed(tid);
       } else {
         // must have seen an overflow on a previous append op
         assert(r == -EOVERFLOW && m_overflowed);
       }
 
       // notify of overflow once all in-flight ops are complete
-      if (m_in_flight_tids.empty()) {
-        notify_handler();
+      if (m_in_flight_tids.empty() && !m_aio_scheduled) {
+        append_overflowed();
+        notify_handler_unlock();
+      } else {
+        m_lock->Unlock();
       }
       return;
     }
@@ -259,11 +274,8 @@ void ObjectRecorder::handle_append_flushed(uint64_t tid, int r) {
     assert(!append_buffers.empty());
 
     m_in_flight_appends.erase(iter);
-    if (m_in_flight_appends.empty() && m_object_closed) {
-      // all remaining unsent appends should be redirected to new object
-      notify_handler();
-    }
     m_in_flight_flushes = true;
+    m_lock->Unlock();
   }
 
   // Flag the associated futures as complete.
@@ -275,18 +287,24 @@ void ObjectRecorder::handle_append_flushed(uint64_t tid, int r) {
   }
 
   // wake up any flush requests that raced with a RADOS callback
-  Mutex::Locker locker(m_lock);
+  m_lock->Lock();
   m_in_flight_flushes = false;
   m_in_flight_flushes_cond.Signal();
+
+  if (m_in_flight_appends.empty() && !m_aio_scheduled && m_object_closed) {
+    // all remaining unsent appends should be redirected to new object
+    notify_handler_unlock();
+  } else {
+    m_lock->Unlock();
+  }
 }
 
-void ObjectRecorder::append_overflowed(uint64_t tid) {
+void ObjectRecorder::append_overflowed() {
   ldout(m_cct, 10) << __func__ << ": " << m_oid << " append overflowed"
                    << dendl;
 
-  assert(m_lock.is_locked());
+  assert(m_lock->is_locked());
   assert(!m_in_flight_appends.empty());
-  assert(m_in_flight_appends.begin()->first == tid);
 
   cancel_append_task();
 
@@ -305,59 +323,104 @@ void ObjectRecorder::append_overflowed(uint64_t tid) {
                                 m_append_buffers.begin(),
                                 m_append_buffers.end());
   restart_append_buffers.swap(m_append_buffers);
+
+  for (AppendBuffers::const_iterator it = m_append_buffers.begin();
+       it != m_append_buffers.end(); ++it) {
+    ldout(m_cct, 20) << __func__ << ": overflowed " << *it->first
+                     << dendl;
+    it->first->detach();
+  }
 }
 
 void ObjectRecorder::send_appends(AppendBuffers *append_buffers) {
-  assert(m_lock.is_locked());
+  assert(m_lock->is_locked());
   assert(!append_buffers->empty());
 
-  uint64_t append_tid = m_append_tid++;
+  for (AppendBuffers::iterator it = append_buffers->begin();
+       it != append_buffers->end(); ++it) {
+    ldout(m_cct, 20) << __func__ << ": flushing " << *it->first
+                     << dendl;
+    it->first->set_flush_in_progress();
+    m_size += it->second.length();
+  }
+
+  m_pending_buffers.splice(m_pending_buffers.end(), *append_buffers,
+                           append_buffers->begin(), append_buffers->end());
+  if (!m_aio_scheduled) {
+    m_op_work_queue->queue(new FunctionContext([this] (int r) {
+        send_appends_aio();
+    }));
+    m_aio_scheduled = true;
+  }
+}
+
+void ObjectRecorder::send_appends_aio() {
+  AppendBuffers *append_buffers;
+  uint64_t append_tid;
+  {
+    Mutex::Locker locker(*m_lock);
+    append_tid = m_append_tid++;
+    m_in_flight_tids.insert(append_tid);
+
+    // safe to hold pointer outside lock until op is submitted
+    append_buffers = &m_in_flight_appends[append_tid];
+    append_buffers->swap(m_pending_buffers);
+  }
+
   ldout(m_cct, 10) << __func__ << ": " << m_oid << " flushing journal tid="
                    << append_tid << dendl;
   C_AppendFlush *append_flush = new C_AppendFlush(this, append_tid);
+  C_Gather *gather_ctx = new C_Gather(m_cct, append_flush);
 
   librados::ObjectWriteOperation op;
   client::guard_append(&op, m_soft_max_size);
-
   for (AppendBuffers::iterator it = append_buffers->begin();
        it != append_buffers->end(); ++it) {
     ldout(m_cct, 20) << __func__ << ": flushing " << *it->first
                      << dendl;
-    it->first->set_flush_in_progress();
     op.append(it->second);
     op.set_op_flags2(CEPH_OSD_OP_FLAG_FADVISE_DONTNEED);
-    m_size += it->second.length();
   }
-  m_in_flight_tids.insert(append_tid);
-  m_in_flight_appends[append_tid].swap(*append_buffers);
 
   librados::AioCompletion *rados_completion =
-    librados::Rados::aio_create_completion(append_flush, NULL,
+    librados::Rados::aio_create_completion(gather_ctx->new_sub(), nullptr,
                                            utils::rados_ctx_callback);
   int r = m_ioctx.aio_operate(m_oid, rados_completion, &op);
   assert(r == 0);
   rados_completion->release();
-}
-
-void ObjectRecorder::notify_handler() {
-  assert(m_lock.is_locked());
 
-  for (AppendBuffers::const_iterator it = m_append_buffers.begin();
-       it != m_append_buffers.end(); ++it) {
-    ldout(m_cct, 20) << __func__ << ": overflowed " << *it->first
-                     << dendl;
-    it->first->detach();
+  {
+    m_lock->Lock();
+    if (m_pending_buffers.empty()) {
+      m_aio_scheduled = false;
+      if (m_in_flight_appends.empty() && m_object_closed) {
+        // all remaining unsent appends should be redirected to new object
+        notify_handler_unlock();
+      } else {
+        m_lock->Unlock();
+      }
+    } else {
+      // additional pending items -- reschedule
+      m_op_work_queue->queue(new FunctionContext([this] (int r) {
+          send_appends_aio();
+        }));
+      m_lock->Unlock();
+    }
   }
 
+  // allow append op to complete
+  gather_ctx->activate();
+}
+
+void ObjectRecorder::notify_handler_unlock() {
+  assert(m_lock->is_locked());
   if (m_object_closed) {
-    m_lock.Unlock();
+    m_lock->Unlock();
     m_handler->closed(this);
-    m_lock.Lock();
   } else {
     // TODO need to delay completion until after aio_notify completes
-    m_lock.Unlock();
+    m_lock->Unlock();
     m_handler->overflow(this);
-    m_lock.Lock();
   }
 }
 
diff --git a/src/journal/ObjectRecorder.h b/src/journal/ObjectRecorder.h
index 53f8cc9..67380e4 100644
--- a/src/journal/ObjectRecorder.h
+++ b/src/journal/ObjectRecorder.h
@@ -9,6 +9,7 @@
 #include "common/Cond.h"
 #include "common/Mutex.h"
 #include "common/RefCountedObj.h"
+#include "common/WorkQueue.h"
 #include "journal/FutureImpl.h"
 #include <list>
 #include <map>
@@ -37,7 +38,8 @@ public:
   };
 
   ObjectRecorder(librados::IoCtx &ioctx, const std::string &oid,
-                 uint64_t object_number, SafeTimer &timer, Mutex &timer_lock,
+                 uint64_t object_number, std::shared_ptr<Mutex> lock,
+                 ContextWQ *work_queue, SafeTimer &timer, Mutex &timer_lock,
                  Handler *handler, uint8_t order, uint32_t flush_interval,
                  uint64_t flush_bytes, double flush_age);
   ~ObjectRecorder();
@@ -49,14 +51,14 @@ public:
     return m_oid;
   }
 
-  bool append(const AppendBuffers &append_buffers);
+  bool append_unlock(AppendBuffers &&append_buffers);
   void flush(Context *on_safe);
   void flush(const FutureImplPtr &future);
 
   void claim_append_buffers(AppendBuffers *append_buffers);
 
   bool is_closed() const {
-    Mutex::Locker locker(m_lock);
+    assert(m_lock->is_locked());
     return (m_object_closed && m_in_flight_appends.empty());
   }
   bool close();
@@ -66,7 +68,7 @@ public:
   }
 
   inline size_t get_pending_appends() const {
-    Mutex::Locker locker(m_lock);
+    Mutex::Locker locker(*m_lock);
     return m_append_buffers.size();
   }
 
@@ -84,6 +86,7 @@ private:
       object_recorder->put();
     }
     virtual void flush(const FutureImplPtr &future) {
+      Mutex::Locker locker(*(object_recorder->m_lock));
       object_recorder->flush(future);
     }
   };
@@ -113,6 +116,8 @@ private:
   uint64_t m_object_number;
   CephContext *m_cct;
 
+  ContextWQ *m_op_work_queue;
+
   SafeTimer &m_timer;
   Mutex &m_timer_lock;
 
@@ -129,7 +134,7 @@ private:
 
   C_AppendTask *m_append_task;
 
-  mutable Mutex m_lock;
+  mutable std::shared_ptr<Mutex> m_lock;
   AppendBuffers m_append_buffers;
   uint64_t m_append_tid;
   uint32_t m_pending_bytes;
@@ -145,6 +150,9 @@ private:
   bool m_in_flight_flushes;
   Cond m_in_flight_flushes_cond;
 
+  AppendBuffers m_pending_buffers;
+  bool m_aio_scheduled;
+
   void handle_append_task();
   void cancel_append_task();
   void schedule_append_task();
@@ -152,10 +160,11 @@ private:
   bool append(const AppendBuffer &append_buffer, bool *schedule_append);
   bool flush_appends(bool force);
   void handle_append_flushed(uint64_t tid, int r);
-  void append_overflowed(uint64_t tid);
+  void append_overflowed();
   void send_appends(AppendBuffers *append_buffers);
+  void send_appends_aio();
 
-  void notify_handler();
+  void notify_handler_unlock();
 };
 
 } // namespace journal
diff --git a/src/journal/Settings.h b/src/journal/Settings.h
index 603770c..ca57125 100644
--- a/src/journal/Settings.h
+++ b/src/journal/Settings.h
@@ -12,6 +12,9 @@ struct Settings {
   double commit_interval = 5;         ///< commit position throttle (in secs)
   uint64_t max_fetch_bytes = 0;       ///< 0 implies no limit
   uint64_t max_payload_bytes = 0;     ///< 0 implies object size limit
+  int max_concurrent_object_sets = 0; ///< 0 implies no limit
+  std::set<std::string> whitelisted_laggy_clients;
+                                      ///< clients that mustn't be disconnected
 };
 
 } // namespace journal
diff --git a/src/json_spirit/CMakeLists.txt b/src/json_spirit/CMakeLists.txt
new file mode 100644
index 0000000..104bc43
--- /dev/null
+++ b/src/json_spirit/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_library(json_spirit
+  json_spirit_reader.cpp
+  json_spirit_writer.cpp)
+target_link_libraries(json_spirit ${Boost_LIBRARIES})
diff --git a/src/json_spirit/Makefile.am b/src/json_spirit/Makefile.am
index f14228c..21c0dea 100644
--- a/src/json_spirit/Makefile.am
+++ b/src/json_spirit/Makefile.am
@@ -16,3 +16,5 @@ noinst_HEADERS += \
 	json_spirit/json_spirit_writer_options.h \
 	json_spirit/json_spirit_writer_template.h
 
+
+EXTRA_DIST += json_spirit/CMakeLists.txt
diff --git a/src/krbd.cc b/src/krbd.cc
index 53f64bb..a0e546f 100644
--- a/src/krbd.cc
+++ b/src/krbd.cc
@@ -204,9 +204,9 @@ static int wait_for_udev_add(struct udev_monitor *mon, const char *pool,
         const char *this_snap = udev_device_get_sysattr_value(dev,
                                                               "current_snap");
 
-        if (strcmp(this_pool, pool) == 0 &&
-            strcmp(this_image, image) == 0 &&
-            strcmp(this_snap, snap) == 0) {
+        if (this_pool && strcmp(this_pool, pool) == 0 &&
+            this_image && strcmp(this_image, image) == 0 &&
+            this_snap && strcmp(this_snap, snap) == 0) {
           bus_dev = dev;
           continue;
         }
@@ -453,6 +453,16 @@ out_enm:
   return r;
 }
 
+static string build_unmap_buf(const string& id, const char *options)
+{
+  string buf(id);
+  if (strcmp(options, "") != 0) {
+    buf += " ";
+    buf += options;
+  }
+  return buf;
+}
+
 static int wait_for_udev_remove(struct udev_monitor *mon, dev_t devno)
 {
   for (;;) {
@@ -480,7 +490,7 @@ static int wait_for_udev_remove(struct udev_monitor *mon, dev_t devno)
   return 0;
 }
 
-static int do_unmap(struct udev *udev, dev_t devno, const string& id)
+static int do_unmap(struct udev *udev, dev_t devno, const string& buf)
 {
   struct udev_monitor *mon;
   int r;
@@ -504,7 +514,7 @@ static int do_unmap(struct udev *udev, dev_t devno, const string& id)
    * Try to circumvent this with a retry before turning to udev.
    */
   for (int tries = 0; ; tries++) {
-    r = sysfs_write_rbd_remove(id);
+    r = sysfs_write_rbd_remove(buf);
     if (r >= 0) {
       break;
     } else if (r == -EBUSY && tries < 2) {
@@ -536,7 +546,8 @@ out_mon:
   return r;
 }
 
-static int unmap_image(struct krbd_ctx *ctx, const char *devnode)
+static int unmap_image(struct krbd_ctx *ctx, const char *devnode,
+                       const char *options)
 {
   struct stat sb;
   dev_t wholedevno;
@@ -568,12 +579,12 @@ static int unmap_image(struct krbd_ctx *ctx, const char *devnode)
     return r;
   }
 
-  return do_unmap(ctx->udev, wholedevno, id);
+  return do_unmap(ctx->udev, wholedevno, build_unmap_buf(id, options));
 }
 
 static int unmap_image(struct krbd_ctx *ctx, const char *pool,
-                       const char *image, const char *snap)
-
+                       const char *image, const char *snap,
+                       const char *options)
 {
   dev_t devno;
   string id;
@@ -592,17 +603,21 @@ static int unmap_image(struct krbd_ctx *ctx, const char *pool,
     return r;
   }
 
-  return do_unmap(ctx->udev, devno, id);
+  return do_unmap(ctx->udev, devno, build_unmap_buf(id, options));
 }
 
-static void dump_one_image(Formatter *f, TextTable *tbl,
-                           const char *id, const char *pool,
-                           const char *image, const char *snap)
+static bool dump_one_image(Formatter *f, TextTable *tbl,
+                           struct udev_device *dev)
 {
-  assert(id && pool && image && snap);
-
+  const char *id = udev_device_get_sysname(dev);
+  const char *pool = udev_device_get_sysattr_value(dev, "pool");
+  const char *image = udev_device_get_sysattr_value(dev, "name");
+  const char *snap = udev_device_get_sysattr_value(dev, "current_snap");
   string kname = get_kernel_rbd_name(id);
 
+  if (!pool || !image || !snap)
+    return false;
+
   if (f) {
     f->open_object_section(id);
     f->dump_string("pool", pool);
@@ -613,6 +628,8 @@ static void dump_one_image(Formatter *f, TextTable *tbl,
   } else {
     *tbl << id << pool << image << snap << kname << TextTable::endrow;
   }
+
+  return true;
 }
 
 static int do_dump(struct udev *udev, Formatter *f, TextTable *tbl)
@@ -638,18 +655,10 @@ static int do_dump(struct udev *udev, Formatter *f, TextTable *tbl)
     struct udev_device *dev;
 
     dev = udev_device_new_from_syspath(udev, udev_list_entry_get_name(l));
-    if (!dev) {
-      r = -ENOMEM;
-      goto out_enm;
+    if (dev) {
+      have_output |= dump_one_image(f, tbl, dev);
+      udev_device_unref(dev);
     }
-
-    dump_one_image(f, tbl, udev_device_get_sysname(dev),
-                   udev_device_get_sysattr_value(dev, "pool"),
-                   udev_device_get_sysattr_value(dev, "name"),
-                   udev_device_get_sysattr_value(dev, "current_snap"));
-
-    have_output = true;
-    udev_device_unref(dev);
   }
 
   r = have_output;
@@ -732,15 +741,17 @@ extern "C" int krbd_map(struct krbd_ctx *ctx, const char *pool,
   return r;
 }
 
-extern "C" int krbd_unmap(struct krbd_ctx *ctx, const char *devnode)
+extern "C" int krbd_unmap(struct krbd_ctx *ctx, const char *devnode,
+                          const char *options)
 {
-  return unmap_image(ctx, devnode);
+  return unmap_image(ctx, devnode, options);
 }
 
 extern "C" int krbd_unmap_by_spec(struct krbd_ctx *ctx, const char *pool,
-                                  const char *image, const char *snap)
+                                  const char *image, const char *snap,
+                                  const char *options)
 {
-  return unmap_image(ctx, pool, image, snap);
+  return unmap_image(ctx, pool, image, snap, options);
 }
 
 int krbd_showmapped(struct krbd_ctx *ctx, Formatter *f)
diff --git a/src/kv/CMakeLists.txt b/src/kv/CMakeLists.txt
new file mode 100644
index 0000000..e24c60f
--- /dev/null
+++ b/src/kv/CMakeLists.txt
@@ -0,0 +1,19 @@
+set(kv_srcs
+  KeyValueDB.cc
+  LevelDBStore.cc
+  RocksDBStore.cc)
+add_library(kv_objs OBJECT ${kv_srcs})
+add_library(kv STATIC $<TARGET_OBJECTS:kv_objs>)
+target_include_directories(kv_objs PUBLIC ${ROCKSDB_INCLUDE_DIR})
+target_include_directories(kv PUBLIC ${ROCKSDB_INCLUDE_DIR})
+target_link_libraries(kv leveldb rocksdb snappy z)
+
+# rocksdb detects bzlib and lz4 in its Makefile, which forces us to do the same.
+find_package(BZip2 QUIET)
+if (BZIP2_FOUND)
+  target_link_libraries(kv ${BZIP2_LIBRARIES})
+endif (BZIP2_FOUND)
+find_package(LZ4 QUIET)
+if (LZ4_FOUND)
+  target_link_libraries(kv ${LZ4_LIBRARY})
+endif (LZ4_FOUND)
diff --git a/src/kv/Makefile.am b/src/kv/Makefile.am
index b876171..9dd8b0d 100644
--- a/src/kv/Makefile.am
+++ b/src/kv/Makefile.am
@@ -42,3 +42,5 @@ noinst_HEADERS += kv/KineticStore.h
 endif
 
 endif # ENABLE_SERVER
+
+EXTRA_DIST += kv/CMakeLists.txt
diff --git a/src/libradosstriper/CMakeLists.txt b/src/libradosstriper/CMakeLists.txt
new file mode 100644
index 0000000..029618a
--- /dev/null
+++ b/src/libradosstriper/CMakeLists.txt
@@ -0,0 +1,7 @@
+set(libradosstriper_srcs
+  libradosstriper.cc
+  RadosStriperImpl.cc
+  MultiAioCompletionImpl.cc)
+add_library(libradosstriper STATIC ${libradosstriper_srcs})
+target_link_libraries(libradosstriper librados cls_lock_client osdc common pthread ${CRYPTO_LIBS} ${EXTRALIBS}) 
+set_target_properties(libradosstriper PROPERTIES OUPUT_NAME libradosstriper VERSION "1.0.0" SOVERSION "1")
diff --git a/src/libradosstriper/Makefile.am b/src/libradosstriper/Makefile.am
index 13b8b28..293c8a5 100644
--- a/src/libradosstriper/Makefile.am
+++ b/src/libradosstriper/Makefile.am
@@ -25,3 +25,5 @@ noinst_HEADERS += \
 endif # WITH_RADOSSTRIPER
 endif # WITH_RADOS
 endif # ENABLE_CLIENT
+
+EXTRA_DIST += libradosstriper/CMakeLists.txt
diff --git a/src/librbd/AioImageRequest.cc b/src/librbd/AioImageRequest.cc
index 010283f..d2aee48 100644
--- a/src/librbd/AioImageRequest.cc
+++ b/src/librbd/AioImageRequest.cc
@@ -48,6 +48,7 @@ struct C_DiscardJournalCommit : public Context {
     ldout(cct, 20) << this << " C_DiscardJournalCommit: "
                    << "journal committed: discarding from cache" << dendl;
 
+    RWLock::RLocker owner_locker(image_ctx.owner_lock);
     Mutex::Locker cache_locker(image_ctx.cache_lock);
     image_ctx.object_cacher->discard_set(image_ctx.object_set, object_extents);
     aio_comp->complete_request(r);
@@ -579,25 +580,31 @@ void AioImageFlush<I>::send_request() {
       journal::EventEntry(journal::AioFlushEvent()),
       AioObjectRequests(), 0, 0, false);
 
-    aio_comp->set_request_count(2);
-
-    C_FlushJournalCommit<I> *ctx = new C_FlushJournalCommit<I>(image_ctx,
-                                                               aio_comp,
-                                                               journal_tid);
-    C_AioRequest *req_comp = new C_AioRequest(aio_comp);
-    image_ctx.journal->flush_event(journal_tid, ctx);
+    aio_comp->set_request_count(1);
     aio_comp->associate_journal_event(journal_tid);
-    image_ctx.flush_async_operations(req_comp);
+
+    FunctionContext *flush_ctx = new FunctionContext(
+      [aio_comp, &image_ctx, journal_tid] (int r) {
+        C_FlushJournalCommit<I> *ctx = new C_FlushJournalCommit<I>(image_ctx,
+                                                                 aio_comp,
+                                                                 journal_tid);
+        image_ctx.journal->flush_event(journal_tid, ctx);
+
+        // track flush op for block writes
+        aio_comp->start_op(true);
+        aio_comp->put();
+    });
+
+    image_ctx.flush_async_operations(flush_ctx);
   } else {
     // flush rbd cache only when journaling is not enabled
     aio_comp->set_request_count(1);
     C_AioRequest *req_comp = new C_AioRequest(aio_comp);
     image_ctx.flush(req_comp);
-  }
 
-  // track flush op for block writes
-  aio_comp->start_op(true);
-  aio_comp->put();
+    aio_comp->start_op(true);
+    aio_comp->put();
+  }
 
   image_ctx.perfcounter->inc(l_librbd_aio_flush);
 }
diff --git a/src/librbd/CMakeLists.txt b/src/librbd/CMakeLists.txt
new file mode 100644
index 0000000..8254a2e
--- /dev/null
+++ b/src/librbd/CMakeLists.txt
@@ -0,0 +1,91 @@
+add_library(rbd_types STATIC
+  journal/Types.cc
+  mirroring_watcher/Types.cc 
+  WatchNotifyTypes.cc)
+
+set(librbd_internal_srcs
+  AioCompletion.cc
+  AioImageRequest.cc
+  AioImageRequestWQ.cc
+  AioObjectRequest.cc
+  AsyncObjectThrottle.cc
+  AsyncOperation.cc
+  AsyncRequest.cc
+  CopyupRequest.cc
+  DiffIterate.cc
+  ExclusiveLock.cc
+  ImageCtx.cc
+  ImageState.cc
+  ImageWatcher.cc
+  internal.cc
+  Journal.cc
+  LibrbdAdminSocketHook.cc
+  LibrbdWriteback.cc
+  MirroringWatcher.cc 
+  ObjectMap.cc
+  ObjectWatcher.cc 
+  Operations.cc
+  Utils.cc
+  exclusive_lock/AcquireRequest.cc
+  exclusive_lock/ReleaseRequest.cc
+  exclusive_lock/StandardPolicy.cc
+  image/CloseRequest.cc
+  image/OpenRequest.cc
+  image/RefreshParentRequest.cc
+  image/RefreshRequest.cc
+  image/SetSnapRequest.cc
+  image_watcher/Notifier.cc
+  image_watcher/NotifyLockOwner.cc
+  journal/Replay.cc
+  journal/StandardPolicy.cc
+  object_map/InvalidateRequest.cc
+  object_map/LockRequest.cc
+  object_map/Request.cc
+  object_map/RefreshRequest.cc
+  object_map/ResizeRequest.cc
+  object_map/SnapshotCreateRequest.cc
+  object_map/SnapshotRemoveRequest.cc
+  object_map/SnapshotRollbackRequest.cc
+  object_map/UnlockRequest.cc
+  object_map/UpdateRequest.cc
+  operation/FlattenRequest.cc
+  operation/RebuildObjectMapRequest.cc
+  operation/RenameRequest.cc
+  operation/Request.cc
+  operation/ResizeRequest.cc
+  operation/SnapshotCreateRequest.cc
+  operation/SnapshotProtectRequest.cc
+  operation/SnapshotRemoveRequest.cc
+  operation/SnapshotRenameRequest.cc
+  operation/SnapshotRollbackRequest.cc
+  operation/SnapshotUnprotectRequest.cc
+  operation/TrimRequest.cc)
+
+add_library(rbd_api STATIC librbd.cc)
+add_library(rbd_internal STATIC ${librbd_internal_srcs})
+
+add_library(librbd ${CEPH_SHARED}
+  $<TARGET_OBJECTS:osdc_rbd_objs>
+  $<TARGET_OBJECTS:common_util_obj>
+  $<TARGET_OBJECTS:krbd_objs>
+  ${CMAKE_SOURCE_DIR}/src/common/ContextCompletion.cc
+  librbd.cc)
+target_link_libraries(librbd PRIVATE 
+  rbd_internal
+  rbd_types
+  journal
+  librados 
+  common 
+  osdc
+  cls_rbd_client 
+  cls_lock_client 
+  cls_journal_client 
+  pthread
+  udev
+  ${CMAKE_DL_LIBS}
+  ${EXTRALIBS})
+if(${ENABLE_SHARED})
+  set_target_properties(librbd PROPERTIES VERSION "1.0.0" SOVERSION "1"
+    OUTPUT_NAME rbd)
+endif(${ENABLE_SHARED})
+install(TARGETS librbd DESTINATION lib)
diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc
index df1d837..4226d42 100644
--- a/src/librbd/ImageCtx.cc
+++ b/src/librbd/ImageCtx.cc
@@ -929,7 +929,9 @@ struct C_InvalidateCache : public Context {
         "rbd_journal_object_flush_bytes", false)(
         "rbd_journal_object_flush_age", false)(
         "rbd_journal_pool", false)(
-        "rbd_journal_max_payload_bytes", false);
+        "rbd_journal_max_payload_bytes", false)(
+        "rbd_journal_max_concurrent_object_sets", false)(
+        "rbd_mirroring_resync_after_disconnect", false);
 
     md_config_t local_config_t;
     std::map<std::string, bufferlist> res;
@@ -985,6 +987,8 @@ struct C_InvalidateCache : public Context {
     ASSIGN_OPTION(journal_object_flush_age);
     ASSIGN_OPTION(journal_pool);
     ASSIGN_OPTION(journal_max_payload_bytes);
+    ASSIGN_OPTION(journal_max_concurrent_object_sets);
+    ASSIGN_OPTION(mirroring_resync_after_disconnect);
   }
 
   ExclusiveLock<ImageCtx> *ImageCtx::create_exclusive_lock() {
diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h
index 7660f6e..b8a3bf6 100644
--- a/src/librbd/ImageCtx.h
+++ b/src/librbd/ImageCtx.h
@@ -183,6 +183,8 @@ namespace librbd {
     double journal_object_flush_age;
     std::string journal_pool;
     uint32_t journal_max_payload_bytes;
+    int journal_max_concurrent_object_sets;
+    bool mirroring_resync_after_disconnect;
 
     LibrbdAdminSocketHook *asok_hook;
 
diff --git a/src/librbd/ImageWatcher.cc b/src/librbd/ImageWatcher.cc
index 7aeb1c9..38a42a9 100644
--- a/src/librbd/ImageWatcher.cc
+++ b/src/librbd/ImageWatcher.cc
@@ -54,13 +54,20 @@ struct C_UnwatchAndFlush : public Context {
       r = rados.aio_watch_flush(aio_comp);
       assert(r == 0);
       aio_comp->release();
-    } else {
-      Context::complete(ret_val);
+      return;
     }
+
+    // ensure our reference to the RadosClient is released prior
+    // to completing the callback to avoid racing an explicit
+    // librados shutdown
+    Context *ctx = on_finish;
+    r = ret_val;
+    delete this;
+
+    ctx->complete(r);
   }
 
   virtual void finish(int r) override {
-    on_finish->complete(r);
   }
 };
 
@@ -443,11 +450,12 @@ void ImageWatcher<I>::notify_request_lock() {
   RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
   RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
 
-  // ExclusiveLock state machine can be dynamically disabled
-  if (m_image_ctx.exclusive_lock == nullptr) {
+  // ExclusiveLock state machine can be dynamically disabled or
+  // race with task cancel
+  if (m_image_ctx.exclusive_lock == nullptr ||
+      m_image_ctx.exclusive_lock->is_lock_owner()) {
     return;
   }
-  assert(!m_image_ctx.exclusive_lock->is_lock_owner());
 
   ldout(m_image_ctx.cct, 10) << this << " notify request lock" << dendl;
 
diff --git a/src/librbd/Journal.cc b/src/librbd/Journal.cc
index f98977b..f2b37c1 100644
--- a/src/librbd/Journal.cc
+++ b/src/librbd/Journal.cc
@@ -7,7 +7,6 @@
 #include "librbd/ExclusiveLock.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/journal/Replay.h"
-#include "librbd/Utils.h"
 #include "cls/journal/cls_journal_types.h"
 #include "journal/Journaler.h"
 #include "journal/Policy.h"
@@ -19,6 +18,7 @@
 #include "include/rados/librados.hpp"
 
 #include <boost/scope_exit.hpp>
+#include <utility>
 
 #define dout_subsys ceph_subsys_rbd
 #undef dout_prefix
@@ -174,7 +174,7 @@ template <typename J>
 int open_journaler(CephContext *cct, J *journaler,
                    cls::journal::Client *client,
                    journal::ImageClientMeta *client_meta,
-                   journal::TagData *tag_data) {
+                   uint64_t *tag_tid, journal::TagData *tag_data) {
   C_SaferCond init_ctx;
   journaler->init(&init_ctx);
   int r = init_ctx.wait();
@@ -204,9 +204,8 @@ int open_journaler(CephContext *cct, J *journaler,
 
   C_SaferCond get_tags_ctx;
   Mutex lock("lock");
-  uint64_t tag_tid;
   C_DecodeTags *tags_ctx = new C_DecodeTags(
-      cct, &lock, &tag_tid, tag_data, &get_tags_ctx);
+      cct, &lock, tag_tid, tag_data, &get_tags_ctx);
   journaler->get_tags(client_meta->tag_class, &tags_ctx->tags, tags_ctx);
 
   r = get_tags_ctx.wait();
@@ -220,18 +219,12 @@ template <typename J>
 int allocate_journaler_tag(CephContext *cct, J *journaler,
                            const cls::journal::Client &client,
                            uint64_t tag_class,
-                           const journal::TagData &prev_tag_data,
+                           const journal::TagPredecessor &predecessor,
                            const std::string &mirror_uuid,
                            cls::journal::Tag *new_tag) {
   journal::TagData tag_data;
-  if (!client.commit_position.object_positions.empty()) {
-    auto position = client.commit_position.object_positions.front();
-    tag_data.predecessor_commit_valid = true;
-    tag_data.predecessor_tag_tid = position.tag_tid;
-    tag_data.predecessor_entry_tid = position.entry_tid;
-  }
-  tag_data.predecessor_mirror_uuid = prev_tag_data.mirror_uuid;
   tag_data.mirror_uuid = mirror_uuid;
+  tag_data.predecessor = predecessor;
 
   bufferlist tag_bl;
   ::encode(tag_data, tag_bl);
@@ -342,7 +335,6 @@ Journal<I>::~Journal() {
   assert(m_state == STATE_UNINITIALIZED || m_state == STATE_CLOSED);
   assert(m_journaler == NULL);
   assert(m_journal_replay == NULL);
-  assert(m_on_replay_close_request == nullptr);
   assert(m_wait_for_state_contexts.empty());
 }
 
@@ -387,14 +379,14 @@ int Journal<I>::create(librados::IoCtx &io_ctx, const std::string &image_id,
 
   cls::journal::Client client;
   cls::journal::Tag tag;
-  journal::TagData tag_data;
 
   assert(non_primary ^ primary_mirror_uuid.empty());
   std::string mirror_uuid = (non_primary ? primary_mirror_uuid :
                                            LOCAL_MIRROR_UUID);
+  journal::TagPredecessor predecessor;
   r = allocate_journaler_tag(cct, &journaler, client,
-                             cls::journal::Tag::TAG_CLASS_NEW,
-                             tag_data, mirror_uuid, &tag);
+			     cls::journal::Tag::TAG_CLASS_NEW,
+                             predecessor, mirror_uuid, &tag);
 
   bufferlist client_data;
   ::encode(journal::ClientData{journal::ImageClientMeta{tag.tag_class}},
@@ -536,8 +528,10 @@ int Journal<I>::get_tag_owner(IoCtx& io_ctx, std::string& image_id,
 
   cls::journal::Client client;
   journal::ImageClientMeta client_meta;
+  uint64_t tag_tid;
   journal::TagData tag_data;
-  int r = open_journaler(cct, &journaler, &client, &client_meta, &tag_data);
+  int r = open_journaler(cct, &journaler, &client, &client_meta, &tag_tid,
+                         &tag_data);
   if (r >= 0) {
     *mirror_uuid = tag_data.mirror_uuid;
   }
@@ -555,9 +549,10 @@ int Journal<I>::request_resync(I *image_ctx) {
 
   cls::journal::Client client;
   journal::ImageClientMeta client_meta;
+  uint64_t tag_tid;
   journal::TagData tag_data;
   int r = open_journaler(image_ctx->cct, &journaler, &client, &client_meta,
-                         &tag_data);
+                         &tag_tid, &tag_data);
   BOOST_SCOPE_EXIT_ALL(&journaler) {
     journaler.shut_down();
   };
@@ -593,9 +588,10 @@ int Journal<I>::promote(I *image_ctx) {
 
   cls::journal::Client client;
   journal::ImageClientMeta client_meta;
+  uint64_t tag_tid;
   journal::TagData tag_data;
   int r = open_journaler(image_ctx->cct, &journaler, &client, &client_meta,
-                         &tag_data);
+                         &tag_tid, &tag_data);
   BOOST_SCOPE_EXIT_ALL(&journaler) {
     journaler.shut_down();
   };
@@ -604,9 +600,21 @@ int Journal<I>::promote(I *image_ctx) {
     return r;
   }
 
+  journal::TagPredecessor predecessor;
+  if (tag_data.mirror_uuid == ORPHAN_MIRROR_UUID) {
+    // orderly promotion -- demotion epoch will have a single entry
+    // so link to our predecessor (demotion) epoch
+    predecessor = journal::TagPredecessor{
+      ORPHAN_MIRROR_UUID, true, tag_tid, 1};
+  } else {
+    // forced promotion -- create an epoch no peers can link against
+    predecessor = journal::TagPredecessor{
+      LOCAL_MIRROR_UUID, true, tag_tid, 0};
+  }
+
   cls::journal::Tag new_tag;
   r = allocate_journaler_tag(cct, &journaler, client, client_meta.tag_class,
-                             tag_data, LOCAL_MIRROR_UUID, &new_tag);
+                             predecessor, LOCAL_MIRROR_UUID, &new_tag);
   if (r < 0) {
     return r;
   }
@@ -623,6 +631,12 @@ bool Journal<I>::is_journal_ready() const {
 template <typename I>
 bool Journal<I>::is_journal_replaying() const {
   Mutex::Locker locker(m_lock);
+  return is_journal_replaying(m_lock);
+}
+
+template <typename I>
+bool Journal<I>::is_journal_replaying(const Mutex &) const {
+  assert(m_lock.is_locked());
   return (m_state == STATE_REPLAYING ||
           m_state == STATE_FLUSHING_REPLAY ||
           m_state == STATE_FLUSHING_RESTART ||
@@ -670,6 +684,21 @@ void Journal<I>::close(Context *on_finish) {
   on_finish = create_async_context_callback(m_image_ctx, on_finish);
 
   Mutex::Locker locker(m_lock);
+  while (m_listener_notify) {
+    m_listener_cond.Wait(m_lock);
+  }
+
+  Listeners listeners(m_listeners);
+  m_listener_notify = true;
+  m_lock.Unlock();
+  for (auto listener : listeners) {
+    listener->handle_close();
+  }
+
+  m_lock.Lock();
+  m_listener_notify = false;
+  m_listener_cond.Signal();
+
   assert(m_state != STATE_UNINITIALIZED);
   if (m_state == STATE_CLOSED) {
     on_finish->complete(m_error_result);
@@ -680,23 +709,31 @@ void Journal<I>::close(Context *on_finish) {
     stop_recording();
   }
 
-  // interrupt external replay if active
-  if (m_on_replay_close_request != nullptr) {
-    m_on_replay_close_request->complete(0);
-    m_on_replay_close_request = nullptr;
-  }
-
   m_close_pending = true;
   wait_for_steady_state(on_finish);
 }
 
 template <typename I>
 bool Journal<I>::is_tag_owner() const {
+  Mutex::Locker locker(m_lock);
+  return is_tag_owner(m_lock);
+}
+
+template <typename I>
+bool Journal<I>::is_tag_owner(const Mutex &) const {
+  assert(m_lock.is_locked());
   return (m_tag_data.mirror_uuid == LOCAL_MIRROR_UUID);
 }
 
 template <typename I>
+uint64_t Journal<I>::get_tag_tid() const {
+  Mutex::Locker locker(m_lock);
+  return m_tag_tid;
+}
+
+template <typename I>
 journal::TagData Journal<I>::get_tag_data() const {
+  Mutex::Locker locker(m_lock);
   return m_tag_data;
 }
 
@@ -705,40 +742,56 @@ int Journal<I>::demote() {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << __func__ << dendl;
 
-  Mutex::Locker locker(m_lock);
-  assert(m_journaler != nullptr && is_tag_owner());
+  int r;
+  C_SaferCond ctx;
+  Future future;
+  C_SaferCond flush_ctx;
 
-  cls::journal::Client client;
-  int r = m_journaler->get_cached_client(IMAGE_CLIENT_ID, &client);
-  if (r < 0) {
-    lderr(cct) << this << " " << __func__ << ": "
-               << "failed to retrieve client: " << cpp_strerror(r) << dendl;
-    return r;
-  }
+  {
+    Mutex::Locker locker(m_lock);
+    assert(m_journaler != nullptr && is_tag_owner(m_lock));
 
-  cls::journal::Tag new_tag;
-  r = allocate_journaler_tag(cct, m_journaler, client, m_tag_class,
-                             m_tag_data, ORPHAN_MIRROR_UUID, &new_tag);
-  if (r < 0) {
-    return r;
-  }
+    cls::journal::Client client;
+    r = m_journaler->get_cached_client(IMAGE_CLIENT_ID, &client);
+    if (r < 0) {
+      lderr(cct) << this << " " << __func__ << ": "
+                 << "failed to retrieve client: " << cpp_strerror(r) << dendl;
+      return r;
+    }
 
-  bufferlist::iterator tag_data_bl_it = new_tag.data.begin();
-  r = C_DecodeTag::decode(&tag_data_bl_it, &m_tag_data);
-  if (r < 0) {
-    lderr(cct) << this << " " << __func__ << ": "
-               << "failed to decode newly allocated tag" << dendl;
-    return r;
-  }
+    assert(m_tag_data.mirror_uuid == LOCAL_MIRROR_UUID);
+    journal::TagPredecessor predecessor;
+    predecessor.mirror_uuid = LOCAL_MIRROR_UUID;
+    if (!client.commit_position.object_positions.empty()) {
+      auto position = client.commit_position.object_positions.front();
+      predecessor.commit_valid = true;
+      predecessor.tag_tid = position.tag_tid;
+      predecessor.entry_tid = position.entry_tid;
+    }
 
-  journal::EventEntry event_entry{journal::DemoteEvent{}};
-  bufferlist event_entry_bl;
-  ::encode(event_entry, event_entry_bl);
+    cls::journal::Tag new_tag;
+    r = allocate_journaler_tag(cct, m_journaler, client, m_tag_class,
+                               predecessor, ORPHAN_MIRROR_UUID, &new_tag);
+    if (r < 0) {
+      return r;
+    }
 
-  m_tag_tid = new_tag.tid;
-  Future future = m_journaler->append(m_tag_tid, event_entry_bl);
-  C_SaferCond ctx;
-  future.flush(&ctx);
+    bufferlist::iterator tag_data_bl_it = new_tag.data.begin();
+    r = C_DecodeTag::decode(&tag_data_bl_it, &m_tag_data);
+    if (r < 0) {
+      lderr(cct) << this << " " << __func__ << ": "
+                 << "failed to decode newly allocated tag" << dendl;
+      return r;
+    }
+
+    journal::EventEntry event_entry{journal::DemoteEvent{}};
+    bufferlist event_entry_bl;
+    ::encode(event_entry, event_entry_bl);
+
+    m_tag_tid = new_tag.tid;
+    future = m_journaler->append(m_tag_tid, event_entry_bl);
+    future.flush(&ctx);
+  }
 
   r = ctx.wait();
   if (r < 0) {
@@ -748,9 +801,11 @@ int Journal<I>::demote() {
     return r;
   }
 
-  m_journaler->committed(future);
-  C_SaferCond flush_ctx;
-  m_journaler->flush_commit_position(&flush_ctx);
+  {
+    Mutex::Locker l(m_lock);
+    m_journaler->committed(future);
+    m_journaler->flush_commit_position(&flush_ctx);
+  }
 
   r = flush_ctx.wait();
   if (r < 0) {
@@ -768,12 +823,11 @@ void Journal<I>::allocate_local_tag(Context *on_finish) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << this << " " << __func__ << dendl;
 
-  bool predecessor_commit_valid = false;
-  uint64_t predecessor_tag_tid = 0;
-  uint64_t predecessor_entry_tid = 0;
+  journal::TagPredecessor predecessor;
+  predecessor.mirror_uuid = LOCAL_MIRROR_UUID;
   {
     Mutex::Locker locker(m_lock);
-    assert(m_journaler != nullptr && is_tag_owner());
+    assert(m_journaler != nullptr && is_tag_owner(m_lock));
 
     cls::journal::Client client;
     int r = m_journaler->get_cached_client(IMAGE_CLIENT_ID, &client);
@@ -789,22 +843,18 @@ void Journal<I>::allocate_local_tag(Context *on_finish) {
     assert(m_tag_data.mirror_uuid == LOCAL_MIRROR_UUID);
     if (!client.commit_position.object_positions.empty()) {
       auto position = client.commit_position.object_positions.front();
-      predecessor_commit_valid = true;
-      predecessor_tag_tid = position.tag_tid;
-      predecessor_entry_tid = position.entry_tid;
+      predecessor.commit_valid = true;
+      predecessor.tag_tid = position.tag_tid;
+      predecessor.entry_tid = position.entry_tid;
     }
   }
 
-  allocate_tag(LOCAL_MIRROR_UUID, LOCAL_MIRROR_UUID, predecessor_commit_valid,
-               predecessor_tag_tid, predecessor_entry_tid, on_finish);
+  allocate_tag(LOCAL_MIRROR_UUID, predecessor, on_finish);
 }
 
 template <typename I>
 void Journal<I>::allocate_tag(const std::string &mirror_uuid,
-                              const std::string &predecessor_mirror_uuid,
-                              bool predecessor_commit_valid,
-                              uint64_t predecessor_tag_tid,
-                              uint64_t predecessor_entry_tid,
+                              const journal::TagPredecessor &predecessor,
                               Context *on_finish) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << this << " " << __func__ << ":  mirror_uuid=" << mirror_uuid
@@ -815,10 +865,7 @@ void Journal<I>::allocate_tag(const std::string &mirror_uuid,
 
   journal::TagData tag_data;
   tag_data.mirror_uuid = mirror_uuid;
-  tag_data.predecessor_mirror_uuid = predecessor_mirror_uuid;
-  tag_data.predecessor_commit_valid = predecessor_commit_valid;
-  tag_data.predecessor_tag_tid = predecessor_tag_tid;
-  tag_data.predecessor_entry_tid = predecessor_entry_tid;
+  tag_data.predecessor = predecessor;
 
   bufferlist tag_bl;
   ::encode(tag_data, tag_bl);
@@ -896,20 +943,23 @@ uint64_t Journal<I>::append_io_events(journal::EventType event_type,
   assert(m_image_ctx.owner_lock.is_locked());
   assert(!bufferlists.empty());
 
-  Futures futures;
   uint64_t tid;
   {
     Mutex::Locker locker(m_lock);
     assert(m_state == STATE_READY);
 
-    Mutex::Locker event_locker(m_event_lock);
     tid = ++m_event_tid;
     assert(tid != 0);
+  }
 
-    for (auto &bl : bufferlists) {
-      assert(bl.length() <= m_max_append_size);
-      futures.push_back(m_journaler->append(m_tag_tid, bl));
-    }
+  Futures futures;
+  for (auto &bl : bufferlists) {
+    assert(bl.length() <= m_max_append_size);
+    futures.push_back(m_journaler->append(m_tag_tid, bl));
+  }
+
+  {
+    Mutex::Locker event_locker(m_event_lock);
     m_events[tid] = Event(futures, requests, offset, length);
   }
 
@@ -928,6 +978,7 @@ uint64_t Journal<I>::append_io_events(journal::EventType event_type,
   } else {
     futures.back().wait(on_safe);
   }
+
   return tid;
 }
 
@@ -1111,16 +1162,13 @@ typename Journal<I>::Future Journal<I>::wait_event(Mutex &lock, uint64_t tid,
 
 template <typename I>
 void Journal<I>::start_external_replay(journal::Replay<I> **journal_replay,
-                                       Context *on_start,
-                                       Context *on_close_request) {
+                                       Context *on_start) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << this << " " << __func__ << dendl;
 
   Mutex::Locker locker(m_lock);
   assert(m_state == STATE_READY);
   assert(m_journal_replay == nullptr);
-  assert(m_on_replay_close_request == nullptr);
-  m_on_replay_close_request = on_close_request;
 
   on_start = util::create_async_context_callback(m_image_ctx, on_start);
   on_start = new FunctionContext(
@@ -1149,11 +1197,6 @@ void Journal<I>::handle_start_external_replay(int r,
                << "failed to stop recording: " << cpp_strerror(r) << dendl;
     *journal_replay = nullptr;
 
-    if (m_on_replay_close_request != nullptr) {
-      m_on_replay_close_request->complete(r);
-      m_on_replay_close_request = nullptr;
-    }
-
     // get back to a sane-state
     start_append();
     on_finish->complete(r);
@@ -1168,15 +1211,13 @@ void Journal<I>::handle_start_external_replay(int r,
 
 template <typename I>
 void Journal<I>::stop_external_replay() {
+  CephContext *cct = m_image_ctx.cct;
+  ldout(cct, 20) << this << " " << __func__ << dendl;
+
   Mutex::Locker locker(m_lock);
   assert(m_journal_replay != nullptr);
   assert(m_state == STATE_REPLAYING);
 
-  if (m_on_replay_close_request != nullptr) {
-    m_on_replay_close_request->complete(-ECANCELED);
-    m_on_replay_close_request = nullptr;
-  }
-
   delete m_journal_replay;
   m_journal_replay = nullptr;
 
@@ -1201,6 +1242,11 @@ void Journal<I>::create_journaler() {
   ::journal::Settings settings;
   settings.commit_interval = m_image_ctx.journal_commit_age;
   settings.max_payload_bytes = m_image_ctx.journal_max_payload_bytes;
+  settings.max_concurrent_object_sets =
+    m_image_ctx.journal_max_concurrent_object_sets;
+  // TODO: a configurable filter to exclude certain peers from being
+  // disconnected.
+  settings.whitelisted_laggy_clients = {IMAGE_CLIENT_ID};
 
   m_journaler = new Journaler(m_work_queue, m_timer, m_timer_lock,
 			      m_image_ctx.md_ctx, m_image_ctx.id,
@@ -1223,9 +1269,16 @@ void Journal<I>::destroy_journaler(int r) {
   m_journaler->remove_listener(&m_metadata_listener);
 
   transition_state(STATE_CLOSING, r);
-  m_journaler->shut_down(create_async_context_callback(
+
+  Context *ctx = create_async_context_callback(
     m_image_ctx, create_context_callback<
-      Journal<I>, &Journal<I>::handle_journal_destroyed>(this)));
+      Journal<I>, &Journal<I>::handle_journal_destroyed>(this));
+  ctx = new FunctionContext(
+    [this, ctx](int r) {
+      Mutex::Locker locker(m_lock);
+      m_journaler->shut_down(ctx);
+    });
+  m_async_journal_op_tracker.wait(m_image_ctx, ctx);
 }
 
 template <typename I>
@@ -1741,13 +1794,13 @@ void Journal<I>::wait_for_steady_state(Context *on_state) {
 }
 
 template <typename I>
-int Journal<I>::check_resync_requested(bool *do_resync) {
+int Journal<I>::is_resync_requested(bool *do_resync) {
   Mutex::Locker l(m_lock);
-  return check_resync_requested_internal(do_resync);
+  return check_resync_requested(do_resync);
 }
 
 template <typename I>
-int Journal<I>::check_resync_requested_internal(bool *do_resync) {
+int Journal<I>::check_resync_requested(bool *do_resync) {
   CephContext *cct = m_image_ctx.cct;
   ldout(cct, 20) << this << " " << __func__ << dendl;
 
@@ -1785,56 +1838,135 @@ int Journal<I>::check_resync_requested_internal(bool *do_resync) {
   return 0;
 }
 
+struct C_RefreshTags : public Context {
+  util::AsyncOpTracker &async_op_tracker;
+  Context *on_finish = nullptr;
+
+  Mutex lock;
+  uint64_t tag_tid;
+  journal::TagData tag_data;
+
+  C_RefreshTags(util::AsyncOpTracker &async_op_tracker)
+    : async_op_tracker(async_op_tracker),
+      lock("librbd::Journal::C_RefreshTags::lock") {
+    async_op_tracker.start_op();
+  }
+  virtual ~C_RefreshTags() {
+     async_op_tracker.finish_op();
+  }
+
+  virtual void finish(int r) {
+    on_finish->complete(r);
+  }
+};
+
 template <typename I>
 void Journal<I>::handle_metadata_updated() {
   CephContext *cct = m_image_ctx.cct;
-  ldout(cct, 20) << this << " " << __func__ << dendl;
+  Mutex::Locker locker(m_lock);
 
-  std::list<journal::ResyncListener *> resync_private_list;
+  if (m_state != STATE_READY && !is_journal_replaying(m_lock)) {
+    return;
+  } else if (is_tag_owner(m_lock)) {
+    ldout(cct, 20) << this << " " << __func__ << ": primary image" << dendl;
+    return;
+  } else if (m_listeners.empty()) {
+    ldout(cct, 20) << this << " " << __func__ << ": no listeners" << dendl;
+    return;
+  }
 
-  {
-    Mutex::Locker l(m_lock);
+  uint64_t refresh_sequence = ++m_refresh_sequence;
+  ldout(cct, 20) << this << " " << __func__ << ": "
+                 << "refresh_sequence=" << refresh_sequence << dendl;
+
+  // pull the most recent tags from the journal, decode, and
+  // update the internal tag state
+  C_RefreshTags *refresh_ctx = new C_RefreshTags(m_async_journal_op_tracker);
+  refresh_ctx->on_finish = new FunctionContext(
+    [this, refresh_sequence, refresh_ctx](int r) {
+      handle_refresh_metadata(refresh_sequence, refresh_ctx->tag_tid,
+                              refresh_ctx->tag_data, r);
+    });
+  C_DecodeTags *decode_tags_ctx = new C_DecodeTags(
+      cct, &refresh_ctx->lock, &refresh_ctx->tag_tid,
+      &refresh_ctx->tag_data, refresh_ctx);
+  m_journaler->get_tags(m_tag_tid == 0 ? 0 : m_tag_tid - 1, m_tag_class,
+                        &decode_tags_ctx->tags, decode_tags_ctx);
+}
 
-    if (m_state == STATE_CLOSING || m_state == STATE_CLOSED ||
-        m_state == STATE_UNINITIALIZED || m_state == STATE_STOPPING) {
-      return;
-    }
+template <typename I>
+void Journal<I>::handle_refresh_metadata(uint64_t refresh_sequence,
+                                         uint64_t tag_tid,
+                                         journal::TagData tag_data, int r) {
+  CephContext *cct = m_image_ctx.cct;
+  Mutex::Locker locker(m_lock);
 
-    bool do_resync = false;
-    int r = check_resync_requested_internal(&do_resync);
-    if (r < 0) {
-      lderr(cct) << this << " " << __func__ << ": "
-                 << "failed to check if a resync was requested" << dendl;
-      return;
-    }
+  if (r < 0) {
+    lderr(cct) << this << " " << __func__ << ": failed to refresh metadata: "
+               << cpp_strerror(r) << dendl;
+    return;
+  } else if (m_state != STATE_READY && !is_journal_replaying(m_lock)) {
+    return;
+  } else if (refresh_sequence != m_refresh_sequence) {
+    // another, more up-to-date refresh is in-flight
+    return;
+  }
 
-    if (do_resync) {
-      for (const auto& listener :
-                              m_listener_map[journal::ListenerType::RESYNC]) {
-        journal::ResyncListener *rsync_listener =
-                        boost::get<journal::ResyncListener *>(listener);
-        resync_private_list.push_back(rsync_listener);
-      }
-    }
+  ldout(cct, 20) << this << " " << __func__ << ": "
+                 << "refresh_sequence=" << refresh_sequence << ", "
+                 << "tag_tid=" << tag_tid << ", "
+                 << "tag_data=" << tag_data << dendl;
+  while (m_listener_notify) {
+    m_listener_cond.Wait(m_lock);
+  }
+
+  bool was_tag_owner = is_tag_owner(m_lock);
+  if (m_tag_tid < tag_tid) {
+    m_tag_tid = tag_tid;
+    m_tag_data = tag_data;
+  }
+  bool promoted_to_primary = (!was_tag_owner && is_tag_owner(m_lock));
+
+  bool resync_requested = false;
+  r = check_resync_requested(&resync_requested);
+  if (r < 0) {
+    lderr(cct) << this << " " << __func__ << ": "
+               << "failed to check if a resync was requested" << dendl;
+    return;
   }
 
-  for (const auto& listener : resync_private_list) {
-    listener->handle_resync();
+  Listeners listeners(m_listeners);
+  m_listener_notify = true;
+  m_lock.Unlock();
+
+  if (promoted_to_primary) {
+    for (auto listener : listeners) {
+      listener->handle_promoted();
+    }
+  } else if (resync_requested) {
+    for (auto listener : listeners) {
+      listener->handle_resync();
+    }
   }
+
+  m_lock.Lock();
+  m_listener_notify = false;
+  m_listener_cond.Signal();
 }
 
 template <typename I>
-void Journal<I>::add_listener(journal::ListenerType type,
-                              journal::JournalListenerPtr listener) {
-  Mutex::Locker l(m_lock);
-  m_listener_map[type].push_back(listener);
+void Journal<I>::add_listener(journal::Listener *listener) {
+  Mutex::Locker locker(m_lock);
+  m_listeners.insert(listener);
 }
 
 template <typename I>
-void Journal<I>::remove_listener(journal::ListenerType type,
-                                 journal::JournalListenerPtr listener) {
-  Mutex::Locker l(m_lock);
-  m_listener_map[type].remove(listener);
+void Journal<I>::remove_listener(journal::Listener *listener) {
+  Mutex::Locker locker(m_lock);
+  while (m_listener_notify) {
+    m_listener_cond.Wait(m_lock);
+  }
+  m_listeners.erase(listener);
 }
 
 } // namespace librbd
diff --git a/src/librbd/Journal.h b/src/librbd/Journal.h
index ec3b328..61107d5 100644
--- a/src/librbd/Journal.h
+++ b/src/librbd/Journal.h
@@ -8,11 +8,14 @@
 #include "include/atomic.h"
 #include "include/Context.h"
 #include "include/interval_set.h"
+#include "common/Cond.h"
 #include "common/Mutex.h"
+#include "common/Cond.h"
 #include "journal/Future.h"
 #include "journal/JournalMetadataListener.h"
 #include "journal/ReplayEntry.h"
 #include "journal/ReplayHandler.h"
+#include "librbd/Utils.h"
 #include "librbd/journal/Types.h"
 #include "librbd/journal/TypeTraits.h"
 #include <algorithm>
@@ -119,14 +122,14 @@ public:
   void close(Context *on_finish);
 
   bool is_tag_owner() const;
+  uint64_t get_tag_tid() const;
   journal::TagData get_tag_data() const;
   int demote();
 
   void allocate_local_tag(Context *on_finish);
   void allocate_tag(const std::string &mirror_uuid,
-                    const std::string &predecessor_mirror_uuid,
-                    bool predecessor_commit_valid, uint64_t predecessor_tag_tid,
-                    uint64_t predecessor_entry_tid, Context *on_finish);
+                    const journal::TagPredecessor &predecessor,
+                    Context *on_finish);
 
   void flush_commit_position(Context *on_finish);
 
@@ -157,15 +160,17 @@ public:
   }
 
   void start_external_replay(journal::Replay<ImageCtxT> **journal_replay,
-                             Context *on_start, Context *on_close_request);
+                             Context *on_start);
   void stop_external_replay();
 
-  void add_listener(journal::ListenerType type,
-                    journal::JournalListenerPtr listener);
-  void remove_listener(journal::ListenerType type,
-                       journal::JournalListenerPtr listener);
+  void add_listener(journal::Listener *listener);
+  void remove_listener(journal::Listener *listener);
 
-  int check_resync_requested(bool *do_resync);
+  int is_resync_requested(bool *do_resync);
+
+  inline ContextWQ *get_work_queue() {
+    return m_work_queue;
+  }
 
 private:
   ImageCtxT &m_image_ctx;
@@ -297,7 +302,8 @@ private:
   bool m_blocking_writes;
 
   journal::Replay<ImageCtxT> *m_journal_replay;
-  Context *m_on_replay_close_request = nullptr;
+
+  util::AsyncOpTracker m_async_journal_op_tracker;
 
   struct MetadataListener : public ::journal::JournalMetadataListener {
     Journal<ImageCtxT> *journal;
@@ -312,9 +318,15 @@ private:
     }
   } m_metadata_listener;
 
-  typedef std::map<journal::ListenerType,
-                   std::list<journal::JournalListenerPtr> > ListenerMap;
-  ListenerMap m_listener_map;
+  typedef std::set<journal::Listener *> Listeners;
+  Listeners m_listeners;
+  Cond m_listener_cond;
+  bool m_listener_notify = false;
+
+  uint64_t m_refresh_sequence = 0;
+
+  bool is_journal_replaying(const Mutex &) const;
+  bool is_tag_owner(const Mutex &) const;
 
   uint64_t append_io_events(journal::EventType event_type,
                             const Bufferlists &bufferlists,
@@ -360,9 +372,12 @@ private:
   bool is_steady_state() const;
   void wait_for_steady_state(Context *on_state);
 
-  int check_resync_requested_internal(bool *do_resync);
+  int check_resync_requested(bool *do_resync);
 
   void handle_metadata_updated();
+  void handle_refresh_metadata(uint64_t refresh_sequence, uint64_t tag_tid,
+                               journal::TagData tag_data, int r);
+
 };
 
 } // namespace librbd
diff --git a/src/librbd/Makefile.am b/src/librbd/Makefile.am
index 08c9738..d6bc358 100644
--- a/src/librbd/Makefile.am
+++ b/src/librbd/Makefile.am
@@ -127,6 +127,7 @@ noinst_HEADERS += \
 	librbd/image/SetSnapRequest.h \
 	librbd/image_watcher/Notifier.h \
 	librbd/image_watcher/NotifyLockOwner.h \
+	librbd/journal/DisabledPolicy.h \
 	librbd/journal/Policy.h \
 	librbd/journal/Replay.h \
 	librbd/journal/StandardPolicy.h \
@@ -159,3 +160,5 @@ noinst_HEADERS += \
 endif # WITH_RBD
 endif # WITH_RADOS
 endif # ENABLE_CLIENT
+
+EXTRA_DIST += librbd/CMakeLists.txt
diff --git a/src/librbd/Operations.cc b/src/librbd/Operations.cc
index 0c6d8cd..f3e92a7 100644
--- a/src/librbd/Operations.cc
+++ b/src/librbd/Operations.cc
@@ -50,6 +50,10 @@ struct C_NotifyUpdate : public Context {
         // don't fail the op if a peer fails to get the update notification
         lderr(cct) << "update notification timed-out" << dendl;
         r = 0;
+      } else if (r == -ENOENT) {
+        // don't fail if header is missing (e.g. v1 image rename)
+        ldout(cct, 5) << "update notification on missing header" << dendl;
+        r = 0;
       } else if (r < 0) {
         lderr(cct) << "update notification failed: " << cpp_strerror(r)
                    << dendl;
@@ -109,6 +113,7 @@ struct C_InvokeAsyncRequest : public Context {
   boost::function<void(Context*)> remote;
   std::set<int> filter_error_codes;
   Context *on_finish;
+  bool request_lock = false;
 
   C_InvokeAsyncRequest(I &image_ctx, const std::string& request_type,
                        bool permit_snapshot,
@@ -192,7 +197,15 @@ struct C_InvokeAsyncRequest : public Context {
       C_InvokeAsyncRequest<I>,
       &C_InvokeAsyncRequest<I>::handle_acquire_exclusive_lock>(
         this);
-    image_ctx.exclusive_lock->try_lock(ctx);
+
+    if (request_lock) {
+      // current lock owner doesn't support op -- try to perform
+      // the action locally
+      request_lock = false;
+      image_ctx.exclusive_lock->request_lock(ctx);
+    } else {
+      image_ctx.exclusive_lock->try_lock(ctx);
+    }
     owner_lock.put_read();
   }
 
@@ -234,7 +247,13 @@ struct C_InvokeAsyncRequest : public Context {
     CephContext *cct = image_ctx.cct;
     ldout(cct, 20) << __func__ << ": r=" << r << dendl;
 
-    if (r != -ETIMEDOUT && r != -ERESTART) {
+    if (r == -EOPNOTSUPP) {
+      ldout(cct, 5) << request_type << " not supported by current lock owner"
+                    << dendl;
+      request_lock = true;
+      send_refresh_image();
+      return;
+    } else if (r != -ETIMEDOUT && r != -ERESTART) {
       image_ctx.state->handle_update_notification();
 
       complete(r);
diff --git a/src/librbd/Utils.h b/src/librbd/Utils.h
index 5904081..43f097a 100644
--- a/src/librbd/Utils.h
+++ b/src/librbd/Utils.h
@@ -157,6 +157,42 @@ inline ImageCtx *get_image_ctx(ImageCtx *image_ctx) {
   return image_ctx;
 }
 
+/// helper for tracking in-flight async ops when coordinating
+/// a shut down of the invoking class instance
+class AsyncOpTracker {
+public:
+  AsyncOpTracker() : m_refs(0) {
+  }
+
+  void start_op() {
+    m_refs.inc();
+  }
+
+  void finish_op() {
+    if (m_refs.dec() == 0 && m_on_finish != nullptr) {
+      Context *on_finish = nullptr;
+      std::swap(on_finish, m_on_finish);
+      on_finish->complete(0);
+    }
+  }
+
+  template <typename I>
+  void wait(I &image_ctx, Context *on_finish) {
+    assert(m_on_finish == nullptr);
+
+    on_finish = create_async_context_callback(image_ctx, on_finish);
+    if (m_refs.read() == 0) {
+      on_finish->complete(0);
+      return;
+    }
+    m_on_finish = on_finish;
+  }
+
+private:
+  atomic_t m_refs;
+  Context *m_on_finish = nullptr;
+};
+
 } // namespace util
 } // namespace librbd
 
diff --git a/src/librbd/exclusive_lock/AcquireRequest.cc b/src/librbd/exclusive_lock/AcquireRequest.cc
index f030b0e..94fee20 100644
--- a/src/librbd/exclusive_lock/AcquireRequest.cc
+++ b/src/librbd/exclusive_lock/AcquireRequest.cc
@@ -171,7 +171,14 @@ Context *AcquireRequest<I>::send_open_journal() {
   m_on_acquire->complete(0);
   m_on_acquire = nullptr;
 
-  if (!m_image_ctx.test_features(RBD_FEATURE_JOURNALING)) {
+  bool journal_enabled;
+  {
+    RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+    journal_enabled = (m_image_ctx.test_features(RBD_FEATURE_JOURNALING,
+                                                 m_image_ctx.snap_lock) &&
+                       !m_image_ctx.get_journal_policy()->journal_disabled());
+  }
+  if (!journal_enabled) {
     apply();
     return m_on_finish;
   }
diff --git a/src/librbd/image/CloseRequest.cc b/src/librbd/image/CloseRequest.cc
index 4ee52a5..fe87f9a 100644
--- a/src/librbd/image/CloseRequest.cc
+++ b/src/librbd/image/CloseRequest.cc
@@ -186,8 +186,9 @@ void CloseRequest<I>::send_flush_readahead() {
   CephContext *cct = m_image_ctx->cct;
   ldout(cct, 10) << this << " " << __func__ << dendl;
 
-  m_image_ctx->readahead.wait_for_pending(create_context_callback<
-    CloseRequest<I>, &CloseRequest<I>::handle_flush_readahead>(this));
+  m_image_ctx->readahead.wait_for_pending(create_async_context_callback(
+    *m_image_ctx, create_context_callback<
+      CloseRequest<I>, &CloseRequest<I>::handle_flush_readahead>(this)));
 }
 
 template <typename I>
diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc
index fdab92b..04b05fa 100644
--- a/src/librbd/image/RefreshRequest.cc
+++ b/src/librbd/image/RefreshRequest.cc
@@ -13,6 +13,7 @@
 #include "librbd/ObjectMap.h"
 #include "librbd/Utils.h"
 #include "librbd/image/RefreshParentRequest.h"
+#include "librbd/journal/Policy.h"
 
 #define dout_subsys ceph_subsys_rbd
 #undef dout_prefix
@@ -476,15 +477,25 @@ Context *RefreshRequest<I>::handle_v2_init_exclusive_lock(int *result) {
 
 template <typename I>
 void RefreshRequest<I>::send_v2_open_journal() {
-  if ((m_features & RBD_FEATURE_JOURNALING) == 0 ||
-      m_image_ctx.read_only ||
-      !m_image_ctx.snap_name.empty() ||
-      m_image_ctx.journal != nullptr ||
-      m_image_ctx.exclusive_lock == nullptr ||
-      !m_image_ctx.exclusive_lock->is_lock_owner()) {
+  bool journal_disabled = (
+    (m_features & RBD_FEATURE_JOURNALING) == 0 ||
+     m_image_ctx.read_only ||
+     !m_image_ctx.snap_name.empty() ||
+     m_image_ctx.journal != nullptr ||
+     m_image_ctx.exclusive_lock == nullptr ||
+     !m_image_ctx.exclusive_lock->is_lock_owner());
+  bool journal_disabled_by_policy;
+  {
+    RWLock::RLocker snap_locker(m_image_ctx.snap_lock);
+    journal_disabled_by_policy = (
+      !journal_disabled &&
+      m_image_ctx.get_journal_policy()->journal_disabled());
+  }
 
+  if (journal_disabled || journal_disabled_by_policy) {
     // journal dynamically enabled -- doesn't own exclusive lock
     if ((m_features & RBD_FEATURE_JOURNALING) != 0 &&
+        !journal_disabled_by_policy &&
         m_image_ctx.exclusive_lock != nullptr &&
         m_image_ctx.journal == nullptr) {
       m_image_ctx.aio_work_queue->set_require_lock_on_read();
diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc
index a999f6f..073be35 100644
--- a/src/librbd/internal.cc
+++ b/src/librbd/internal.cc
@@ -30,6 +30,8 @@
 #include "librbd/ImageState.h"
 #include "librbd/internal.h"
 #include "librbd/Journal.h"
+#include "librbd/journal/DisabledPolicy.h"
+#include "librbd/journal/StandardPolicy.h"
 #include "librbd/journal/Types.h"
 #include "librbd/MirroringWatcher.h"
 #include "librbd/ObjectMap.h"
@@ -469,9 +471,10 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     info.obj_size = 1ULL << obj_order;
     info.num_objs = Striper::get_num_objects(ictx->layout, info.size);
     info.order = obj_order;
-    memcpy(&info.block_name_prefix, ictx->object_prefix.c_str(),
-	   min((size_t)RBD_MAX_BLOCK_NAME_SIZE,
-	       ictx->object_prefix.length() + 1));
+    strncpy(info.block_name_prefix, ictx->object_prefix.c_str(),
+            RBD_MAX_BLOCK_NAME_SIZE);
+    info.block_name_prefix[RBD_MAX_BLOCK_NAME_SIZE - 1] = '\0';
+
     // clear deprecated fields
     info.parent_pool = -1L;
     info.parent_name[0] = '\0';
@@ -870,17 +873,53 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     CephContext *cct = ictx->cct;
     ldout(cct, 20) << "children list " << ictx->name << dendl;
 
+    RWLock::RLocker l(ictx->snap_lock);
+    parent_spec parent_spec(ictx->md_ctx.get_id(), ictx->id, ictx->snap_id);
+    map< pair<int64_t, string>, set<string> > image_info;
+
+    int r = list_children_info(ictx, parent_spec,image_info);
+    if (r < 0) {
+      return r;
+    }
+
+    Rados rados(ictx->md_ctx);
+    for ( auto &info : image_info){
+      IoCtx ioctx;
+      r = rados.ioctx_create2(info.first.first, ioctx);
+      if (r < 0) {
+        lderr(cct) << "Error accessing child image pool " << info.first.second
+                   << dendl;
+        return r;
+      }
+
+      for (auto &id_it : info.second) {
+	    string name;
+	    r = cls_client::dir_get_name(&ioctx, RBD_DIRECTORY, id_it, &name);
+	    if (r < 0) {
+	      lderr(cct) << "Error looking up name for image id " << id_it
+                         << " in pool " << info.first.second << dendl;
+	      return r;
+	    }
+	    names.insert(make_pair(info.first.second, name));
+      }
+    }
+    
+    return 0;
+  }
+
+  int list_children_info(ImageCtx *ictx, librbd::parent_spec parent_spec,
+                   map< pair<int64_t, string >, set<string> >& image_info)
+  {
+    CephContext *cct = ictx->cct;
     int r = ictx->state->refresh_if_required();
     if (r < 0)
       return r;
 
     // no children for non-layered or old format image
-    if (!ictx->test_features(RBD_FEATURE_LAYERING))
+    if (!ictx->test_features(RBD_FEATURE_LAYERING, ictx->snap_lock))
       return 0;
 
-    parent_spec parent_spec(ictx->md_ctx.get_id(), ictx->id, ictx->snap_id);
-    names.clear();
-
+    image_info.clear();
     // search all pools for children depending on this snapshot
     Rados rados(ictx->md_ctx);
     std::list<std::pair<int64_t, string> > pools;
@@ -926,19 +965,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
 		   << dendl;
 	return r;
       }
-
-      for (set<string>::const_iterator id_it = image_ids.begin();
-	   id_it != image_ids.end(); ++id_it) {
-	string name;
-	r = cls_client::dir_get_name(&ioctx, RBD_DIRECTORY,
-				     *id_it, &name);
-	if (r < 0) {
-	  lderr(cct) << "Error looking up name for image id " << *id_it
-		     << " in pool " << it->second << dendl;
-	  return r;
-	}
-	names.insert(make_pair(it->second, name));
-      }
+      image_info.insert(make_pair(make_pair(it->first, it->second), image_ids));
     }
 
     return 0;
@@ -1043,6 +1070,14 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     extra = rand() % 0xFFFFFFFF;
     bid_ss << std::hex << bid << std::hex << extra;
     id = bid_ss.str();
+
+    // ensure the image id won't overflow the fixed block name size
+    const size_t max_id_length = RBD_MAX_BLOCK_NAME_SIZE -
+                                 strlen(RBD_DATA_PREFIX) - 1;
+    if (id.length() > max_id_length) {
+      id = id.substr(id.length() - max_id_length);
+    }
+
     r = cls_client::set_id(&io_ctx, id_obj, id);
     if (r < 0) {
       lderr(cct) << "error setting image id: " << cpp_strerror(r) << dendl;
@@ -1479,6 +1514,21 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return -EINVAL;
     }
 
+    if ((p_features & RBD_FEATURE_JOURNALING) != 0) {
+      bool force_non_primary = !non_primary_global_image_id.empty();
+      bool is_primary;
+      int r = Journal<>::is_tag_owner(p_imctx, &is_primary);
+      if (r < 0) {
+	lderr(cct) << "failed to determine tag ownership: " << cpp_strerror(r)
+		   << dendl;
+	return r;
+      }
+      if (!is_primary && !force_non_primary) {
+	lderr(cct) << "parent is non-primary mirrored image" << dendl;
+	return -EINVAL;
+      }
+    }
+
     if (use_p_features) {
       c_opts.set(RBD_IMAGE_OPTION_FEATURES, p_features);
     }
@@ -1554,7 +1604,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
   err_close_child:
     c_imctx->state->close();
   err_remove:
-    partial_r = remove(c_ioctx, c_name, no_op);
+    partial_r = remove(c_ioctx, c_name, "", no_op);
     if (partial_r < 0) {
       lderr(cct) << "Error removing failed clone: "
 		 << cpp_strerror(partial_r) << dendl;
@@ -1690,6 +1740,21 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       }
     };
 
+    // if disabling journaling, avoid attempting to open the journal
+    // when acquiring the exclusive lock in case the journal is corrupt
+    bool disabling_journal = false;
+    if (!enabled && ((features & RBD_FEATURE_JOURNALING) != 0)) {
+      RWLock::WLocker snap_locker(ictx->snap_lock);
+      ictx->set_journal_policy(new journal::DisabledPolicy());
+      disabling_journal = true;
+    }
+    BOOST_SCOPE_EXIT_ALL( (ictx)(disabling_journal) ) {
+      if (disabling_journal) {
+        RWLock::WLocker snap_locker(ictx->snap_lock);
+        ictx->set_journal_policy(new journal::StandardPolicy(ictx));
+      }
+    };
+
     // if disabling features w/ exclusive lock supported, we need to
     // acquire the lock to temporarily block IO against the image
     bool acquired_lock = false;
@@ -1719,17 +1784,21 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       RWLock::WLocker snap_locker(ictx->snap_lock);
       uint64_t new_features;
       if (enabled) {
+      	if ((features & ictx->features) != 0) {
+	  lderr(cct) << "one or more requested features are already enabled" << dendl;
+	  return -EINVAL;
+      	}
         features &= ~ictx->features;
         new_features = ictx->features | features;
       } else {
+        if ((features & ~ictx->features) != 0) {
+	  lderr(cct) << "one or more requested features are already disabled" << dendl;
+	  return -EINVAL;
+        }
         features &= ictx->features;
         new_features = ictx->features & ~features;
       }
 
-      if (features == 0) {
-        return 0;
-      }
-
       bool enable_mirroring = false;
       uint64_t features_mask = features;
       uint64_t disable_flags = 0;
@@ -1810,13 +1879,14 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
                                              &mirror_image);
             if (r < 0 && r != -ENOENT) {
               lderr(cct) << "error retrieving mirroring state: "
-                << cpp_strerror(r) << dendl;
+                         << cpp_strerror(r) << dendl;
               return r;
             }
 
             if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
               lderr(cct) << "cannot disable journaling: image mirroring "
-                " enabled and mirror pool mode set to image" << dendl;
+                         << "enabled and mirror pool mode set to image"
+                         << dendl;
               return -EINVAL;
             }
           } else if (mirror_mode == RBD_MIRROR_MODE_POOL) {
@@ -1828,13 +1898,15 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
             }
           }
 
-          C_SaferCond cond;
-          ictx->journal->close(&cond);
-          r = cond.wait();
-          if (r < 0) {
-            lderr(cct) << "error closing image journal: " << cpp_strerror(r)
-                       << dendl;
-            return r;
+          if (ictx->journal != nullptr) {
+            C_SaferCond cond;
+            ictx->journal->close(&cond);
+            r = cond.wait();
+            if (r < 0) {
+              lderr(cct) << "error closing image journal: " << cpp_strerror(r)
+                         << dendl;
+              return r;
+            }
           }
 
           r = Journal<>::remove(ictx->md_ctx, ictx->id);
@@ -1850,6 +1922,13 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
                      << "mask=" << features_mask << dendl;
       r = librbd::cls_client::set_features(&ictx->md_ctx, ictx->header_oid,
                                            new_features, features_mask);
+      if (!enabled && r == -EINVAL) {
+        // NOTE: infernalis OSDs will not accept a mask with new features, so
+        // re-attempt with a reduced mask.
+        features_mask &= ~RBD_FEATURE_JOURNALING;
+        r = librbd::cls_client::set_features(&ictx->md_ctx, ictx->header_oid,
+                                             new_features, features_mask);
+      }
       if (r < 0) {
         lderr(cct) << "failed to update features: " << cpp_strerror(r)
                    << dendl;
@@ -1882,7 +1961,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
           r = mirror_image_enable_internal(img_ctx);
           if (r < 0) {
             lderr(cct) << "error enabling mirroring: " << cpp_strerror(r)
-              << dendl;
+                       << dendl;
           }
           img_ctx->state->close();
         }
@@ -2008,16 +2087,20 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     return 0;
   }
 
-  int remove(IoCtx& io_ctx, const char *imgname, ProgressContext& prog_ctx,
+  int remove(IoCtx& io_ctx, const std::string &image_name,
+             const std::string &image_id, ProgressContext& prog_ctx,
              bool force)
   {
     CephContext *cct((CephContext *)io_ctx.cct());
-    ldout(cct, 20) << "remove " << &io_ctx << " " << imgname << dendl;
+    ldout(cct, 20) << "remove " << &io_ctx << " "
+                   << (image_id.empty() ? image_name : image_id) << dendl;
 
-    string id;
+    std::string name(image_name);
+    std::string id(image_id);
     bool old_format = false;
     bool unknown_format = true;
-    ImageCtx *ictx = new ImageCtx(imgname, "", NULL, io_ctx, false);
+    ImageCtx *ictx = new ImageCtx(
+      (id.empty() ? name : std::string()), id, nullptr, io_ctx, false);
     int r = ictx->state->open();
     if (r < 0) {
       ldout(cct, 2) << "error opening image: " << cpp_strerror(-r) << dendl;
@@ -2026,6 +2109,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       string header_oid = ictx->header_oid;
       old_format = ictx->old_format;
       unknown_format = false;
+      name = ictx->name;
       id = ictx->id;
 
       ictx->owner_lock.get_read();
@@ -2120,7 +2204,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
 
     if (old_format || unknown_format) {
       ldout(cct, 2) << "removing rbd image from v1 directory..." << dendl;
-      r = tmap_rm(io_ctx, imgname);
+      r = tmap_rm(io_ctx, name);
       old_format = (r == 0);
       if (r < 0 && !unknown_format) {
         if (r != -ENOENT) {
@@ -2133,12 +2217,20 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     if (!old_format) {
       if (id.empty()) {
         ldout(cct, 5) << "attempting to determine image id" << dendl;
-        r = cls_client::dir_get_id(&io_ctx, RBD_DIRECTORY, imgname, &id);
+        r = cls_client::dir_get_id(&io_ctx, RBD_DIRECTORY, name, &id);
         if (r < 0 && r != -ENOENT) {
           lderr(cct) << "error getting id of image" << dendl;
           return r;
         }
+      } else if (name.empty()) {
+        ldout(cct, 5) << "attempting to determine image name" << dendl;
+        r = cls_client::dir_get_name(&io_ctx, RBD_DIRECTORY, id, &name);
+        if (r < 0 && r != -ENOENT) {
+          lderr(cct) << "error getting name of image" << dendl;
+          return r;
+        }
       }
+
       if (!id.empty()) {
         ldout(cct, 10) << "removing journal..." << dendl;
         r = Journal<>::remove(io_ctx, id);
@@ -2165,7 +2257,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       }
 
       ldout(cct, 2) << "removing id object..." << dendl;
-      r = io_ctx.remove(util::id_obj_name(imgname));
+      r = io_ctx.remove(util::id_obj_name(name));
       if (r < 0 && r != -ENOENT) {
 	lderr(cct) << "error removing id object: " << cpp_strerror(r)
                    << dendl;
@@ -2173,7 +2265,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       }
 
       ldout(cct, 2) << "removing rbd image from v2 directory..." << dendl;
-      r = cls_client::dir_remove_image(&io_ctx, RBD_DIRECTORY, imgname, id);
+      r = cls_client::dir_remove_image(&io_ctx, RBD_DIRECTORY, name, id);
       if (r < 0) {
         if (r != -ENOENT) {
           lderr(cct) << "error removing image from v2 directory: "
@@ -2833,6 +2925,20 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return -EINVAL;
     }
 
+    // is mirroring not enabled for the parent? 
+    {
+      RWLock::RLocker l(ictx->parent_lock);
+      ImageCtx *parent = ictx->parent;
+      if(parent) {
+        cls::rbd::MirrorImage mirror_image_internal;
+        r = cls_client::mirror_image_get(&(parent->md_ctx), parent->id, &mirror_image_internal);
+        if (r == -ENOENT) {
+          lderr(cct) << "mirroring is not enabled for the parent" << dendl;
+          return -EINVAL;
+        }
+      }
+    }
+
     r = mirror_image_enable_internal(ictx);
     if (r < 0) {
       return r;
@@ -2863,6 +2969,77 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return -EINVAL;
     }
 
+    // is mirroring  enabled for the child?
+    cls::rbd::MirrorImage mirror_image_internal;
+    r = cls_client::mirror_image_get(&ictx->md_ctx, ictx->id, &mirror_image_internal);
+    if (r == -ENOENT) {
+      // mirroring is not enabled for this image
+      ldout(cct, 20) << "ignoring disable command: mirroring is not enabled for this image" 
+                     << dendl;
+      return 0;
+    } else if (r == -EOPNOTSUPP) {
+      ldout(cct, 5) << "mirroring not supported by OSD" << dendl;
+      return r;
+    } else if (r < 0) {
+      lderr(cct) << "failed to retrieve mirror image metadata: " << cpp_strerror(r) << dendl;
+      return r;
+    }
+    mirror_image_internal.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING;
+    r = cls_client::mirror_image_set(&ictx->md_ctx, ictx->id, mirror_image_internal);
+    if (r < 0) {
+      lderr(cct) << "cannot disable mirroring: " << cpp_strerror(r) << dendl;
+      return r;
+    } else {
+      bool rollback = false;
+      BOOST_SCOPE_EXIT_ALL(ictx, rollback) {
+        if (rollback) {
+          CephContext *cct = ictx->cct;
+          cls::rbd::MirrorImage mirror_image_internal;
+          mirror_image_internal.state = cls::rbd::MIRROR_IMAGE_STATE_ENABLED;
+          int r = cls_client::mirror_image_set(&ictx->md_ctx, ictx->id, mirror_image_internal);
+          if (r < 0) {
+            lderr(cct) << "failed to re-enable image mirroring: " << cpp_strerror(r) 
+                       << dendl;          
+          }
+        }
+      };
+
+      RWLock::RLocker l(ictx->snap_lock);
+      map<librados::snap_t, SnapInfo> snap_info = ictx->snap_info;
+      for (auto &info : snap_info) {
+        librbd::parent_spec parent_spec(ictx->md_ctx.get_id(), ictx->id, info.first);
+        map< pair<int64_t, string>, set<string> > image_info;
+
+        r = list_children_info(ictx, parent_spec, image_info);
+        if (r < 0) {
+          rollback = true;
+          return r;
+        }
+        if (image_info.empty())
+          continue;
+
+        Rados rados(ictx->md_ctx);
+        for (auto &info: image_info) {
+          IoCtx ioctx;
+          r = rados.ioctx_create2(info.first.first, ioctx);
+          if (r < 0) {
+            rollback = true;
+            lderr(cct) << "Error accessing child image pool " << info.first.second  << dendl; 
+            return r;
+          }
+          for (auto &id_it : info.second) {
+            cls::rbd::MirrorImage mirror_image_internal;
+            r = cls_client::mirror_image_get(&ioctx, id_it, &mirror_image_internal);
+            if (r != -ENOENT) {
+              rollback = true;
+              lderr(cct) << "mirroring is enabled on one or more children " << dendl;
+              return -EBUSY;
+            }
+          }
+        }
+      }
+    }
+
     r = mirror_image_disable_internal(ictx, force);
     if (r < 0) {
       return r;
@@ -2944,6 +3121,15 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return -EINVAL;
     }
 
+    // avoid accepting new requests from peers while we demote
+    // the image
+    ictx->exclusive_lock->block_requests(0);
+    BOOST_SCOPE_EXIT_ALL( (ictx) ) {
+      if (ictx->exclusive_lock != nullptr) {
+        ictx->exclusive_lock->unblock_requests();
+      }
+    };
+
     C_SaferCond lock_ctx;
     ictx->exclusive_lock->request_lock(&lock_ctx);
 
@@ -3169,8 +3355,22 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return -EINVAL;
     }
 
+    int r;
+    if (next_mirror_mode == cls::rbd::MIRROR_MODE_DISABLED) {
+      // fail early if pool still has peers registered and attempting to disable
+      std::vector<cls::rbd::MirrorPeer> mirror_peers;
+      r = cls_client::mirror_peer_list(&io_ctx, &mirror_peers);
+      if (r < 0 && r != -ENOENT) {
+        lderr(cct) << "Failed to list peers: " << cpp_strerror(r) << dendl;
+        return r;
+      } else if (!mirror_peers.empty()) {
+        lderr(cct) << "mirror peers still registered" << dendl;
+        return -EBUSY;
+      }
+    }
+
     cls::rbd::MirrorMode current_mirror_mode;
-    int r = cls_client::mirror_mode_get(&io_ctx, &current_mirror_mode);
+    r = cls_client::mirror_mode_get(&io_ctx, &current_mirror_mode);
     if (r < 0) {
       lderr(cct) << "Failed to retrieve mirror mode: " << cpp_strerror(r)
                  << dendl;
@@ -3193,8 +3393,8 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     if (current_mirror_mode != cls::rbd::MIRROR_MODE_IMAGE) {
       r = cls_client::mirror_mode_set(&io_ctx, cls::rbd::MIRROR_MODE_IMAGE);
       if (r < 0) {
-        lderr(cct) << "Failed to set mirror mode to image: "
-          << cpp_strerror(r) << dendl;
+        lderr(cct) << "failed to set mirror mode to image: "
+                   << cpp_strerror(r) << dendl;
         return r;
       }
 
@@ -3210,57 +3410,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return 0;
     }
 
-    struct rollback_state_t {
-      IoCtx *io_ctx;
-      bool do_rollback;
-      cls::rbd::MirrorMode mirror_mode;
-      bool enable;
-      std::vector<std::pair<ImageCtx *, bool> > img_ctxs;
-
-      rollback_state_t(IoCtx *io_ctx, cls::rbd::MirrorMode mirror_mode, bool enable) :
-        io_ctx(io_ctx),
-        do_rollback(true),
-        mirror_mode(mirror_mode),
-        enable(enable) {
-      }
-      ~rollback_state_t() {
-        CephContext *cct = reinterpret_cast<CephContext *>(io_ctx->cct());
-        if (do_rollback && mirror_mode != cls::rbd::MIRROR_MODE_IMAGE) {
-          int r = cls_client::mirror_mode_set(io_ctx, mirror_mode);
-          if (r < 0) {
-            lderr(cct) << "Failed to rollback mirror mode: " << cpp_strerror(r)
-              << dendl;
-          }
-
-          r = MirroringWatcher<>::notify_mode_updated(*io_ctx, mirror_mode);
-          if (r < 0) {
-            lderr(cct) << "failed to send update notification: "
-                       << cpp_strerror(r) << dendl;
-          }
-        }
-        for (const auto& pair : img_ctxs) {
-          if (do_rollback && pair.second) {
-            int r = enable ? mirror_image_disable(pair.first, false) :
-              mirror_image_enable(pair.first);
-            if (r < 0) {
-              lderr(cct) << "Failed to rollback mirroring state for image id "
-                << pair.first->id << ": " << cpp_strerror(r) << dendl;
-            }
-          }
-
-          int r = pair.first->state->close();
-          if (r < 0) {
-            lderr(cct) << "error closing image " << pair.first->id << ": "
-              << cpp_strerror(r) << dendl;
-          }
-        }
-      }
-    } rb_state(&io_ctx, current_mirror_mode,
-                     next_mirror_mode == cls::rbd::MIRROR_MODE_POOL);
-
-
     if (next_mirror_mode == cls::rbd::MIRROR_MODE_POOL) {
-
       map<string, string> images;
       r = list_images_v2(io_ctx, images);
       if (r < 0) {
@@ -3270,11 +3420,12 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
 
       for (const auto& img_pair : images) {
         uint64_t features;
-        r = cls_client::get_features(&io_ctx, util::header_name(img_pair.second),
+        r = cls_client::get_features(&io_ctx,
+                                     util::header_name(img_pair.second),
                                      CEPH_NOSNAP, &features);
         if (r < 0) {
           lderr(cct) << "error getting features for image " << img_pair.first
-            << ": " << cpp_strerror(r) << dendl;
+                     << ": " << cpp_strerror(r) << dendl;
           return r;
         }
 
@@ -3284,7 +3435,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
           r = img_ctx->state->open();
           if (r < 0) {
             lderr(cct) << "error opening image "<< img_pair.first << ": "
-              << cpp_strerror(r) << dendl;
+                       << cpp_strerror(r) << dendl;
             delete img_ctx;
             return r;
           }
@@ -3292,16 +3443,19 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
           r = mirror_image_enable(img_ctx);
           if (r < 0) {
             lderr(cct) << "error enabling mirroring for image "
-              << img_pair.first << ": " << cpp_strerror(r) << dendl;
-            rb_state.img_ctxs.push_back(std::make_pair(img_ctx, false));
+                       << img_pair.first << ": " << cpp_strerror(r) << dendl;
             return r;
           }
 
-          rb_state.img_ctxs.push_back(std::make_pair(img_ctx, true));
+          r = img_ctx->state->close();
+          if (r < 0) {
+            lderr(cct) << "failed to close image " << img_pair.first << ": "
+                       << cpp_strerror(r) << dendl;
+            return r;
+          }
         }
       }
     } else if (next_mirror_mode == cls::rbd::MIRROR_MODE_DISABLED) {
-
       std::set<std::string> image_ids;
       r = list_mirror_images(io_ctx, image_ids);
       if (r < 0) {
@@ -3315,12 +3469,12 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
           r = cls_client::mirror_image_get(&io_ctx, img_id, &mirror_image);
           if (r < 0 && r != -ENOENT) {
             lderr(cct) << "failed to retrieve mirroring state for image id "
-              << img_id << ": " << cpp_strerror(r) << dendl;
+                       << img_id << ": " << cpp_strerror(r) << dendl;
             return r;
           }
           if (mirror_image.state == cls::rbd::MIRROR_IMAGE_STATE_ENABLED) {
             lderr(cct) << "Failed to disable mirror mode: there are still "
-              "images with mirroring enabled" << dendl;
+                       << "images with mirroring enabled" << dendl;
             return -EINVAL;
           }
         } else {
@@ -3328,7 +3482,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
           r = img_ctx->state->open();
           if (r < 0) {
             lderr(cct) << "error opening image id "<< img_id << ": "
-              << cpp_strerror(r) << dendl;
+                       << cpp_strerror(r) << dendl;
             delete img_ctx;
             return r;
           }
@@ -3336,18 +3490,20 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
           r = mirror_image_disable(img_ctx, false);
           if (r < 0) {
             lderr(cct) << "error disabling mirroring for image id " << img_id
-              << cpp_strerror(r) << dendl;
-            rb_state.img_ctxs.push_back(std::make_pair(img_ctx, false));
+                       << cpp_strerror(r) << dendl;
             return r;
           }
 
-          rb_state.img_ctxs.push_back(std::make_pair(img_ctx, true));
+          r = img_ctx->state->close();
+          if (r < 0) {
+            lderr(cct) << "failed to close image id " << img_id << ": "
+                       << cpp_strerror(r) << dendl;
+            return r;
+          }
         }
       }
     }
 
-    rb_state.do_rollback = false;
-
     r = cls_client::mirror_mode_set(&io_ctx, next_mirror_mode);
     if (r < 0) {
       lderr(cct) << "Failed to set mirror mode: " << cpp_strerror(r) << dendl;
diff --git a/src/librbd/internal.h b/src/librbd/internal.h
index 3fd0686..8522ea0 100644
--- a/src/librbd/internal.h
+++ b/src/librbd/internal.h
@@ -95,6 +95,8 @@ namespace librbd {
   int list(librados::IoCtx& io_ctx, std::vector<std::string>& names);
   int list_children(ImageCtx *ictx,
 		    std::set<std::pair<std::string, std::string> > & names);
+  int list_children_info(ImageCtx *ictx, librbd::parent_spec parent_spec,
+             std::map<std::pair<int64_t, std::string >, std::set<std::string> >& image_info);
   int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,
 	     int *order);
   int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,
@@ -134,8 +136,9 @@ namespace librbd {
   int set_image_notification(ImageCtx *ictx, int fd, int type);
   int is_exclusive_lock_owner(ImageCtx *ictx, bool *is_owner);
 
-  int remove(librados::IoCtx& io_ctx, const char *imgname,
-	     ProgressContext& prog_ctx, bool force=false);
+  int remove(librados::IoCtx& io_ctx, const std::string &image_name,
+             const std::string &image_id, ProgressContext& prog_ctx,
+             bool force=false);
   int snap_list(ImageCtx *ictx, std::vector<snap_info_t>& snaps);
   int snap_exists(ImageCtx *ictx, const char *snap_name, bool *exists);
   int snap_is_protected(ImageCtx *ictx, const char *snap_name,
diff --git a/src/librbd/journal/DisabledPolicy.h b/src/librbd/journal/DisabledPolicy.h
new file mode 100644
index 0000000..119738f
--- /dev/null
+++ b/src/librbd/journal/DisabledPolicy.h
@@ -0,0 +1,32 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_LIBRBD_JOURNAL_DISABLED_POLICY_H
+#define CEPH_LIBRBD_JOURNAL_DISABLED_POLICY_H
+
+#include "librbd/journal/Policy.h"
+
+namespace librbd {
+
+struct ImageCtx;
+
+namespace journal {
+
+class DisabledPolicy : public Policy {
+public:
+  virtual bool append_disabled() const {
+    assert(false);
+    return false;
+  }
+  virtual bool journal_disabled() const {
+    return true;
+  }
+  virtual void allocate_tag_on_lock(Context *on_finish) {
+    assert(false);
+  }
+};
+
+} // namespace journal
+} // namespace librbd
+
+#endif // CEPH_LIBRBD_JOURNAL_DISABLED_POLICY_H
diff --git a/src/librbd/journal/Policy.h b/src/librbd/journal/Policy.h
index 2ef21e6..1ced3c5 100644
--- a/src/librbd/journal/Policy.h
+++ b/src/librbd/journal/Policy.h
@@ -15,6 +15,7 @@ struct Policy {
   }
 
   virtual bool append_disabled() const = 0;
+  virtual bool journal_disabled() const = 0;
   virtual void allocate_tag_on_lock(Context *on_finish) = 0;
 };
 
diff --git a/src/librbd/journal/Replay.cc b/src/librbd/journal/Replay.cc
index de33e03..e8592f5 100644
--- a/src/librbd/journal/Replay.cc
+++ b/src/librbd/journal/Replay.cc
@@ -795,12 +795,18 @@ void Replay<I>::handle_op_complete(uint64_t op_tid, int r) {
 
   // shut down request might have occurred while lock was
   // dropped -- handle if pending
-  Mutex::Locker locker(m_lock);
-  assert(m_in_flight_op_events > 0);
-  --m_in_flight_op_events;
-  if (m_flush_ctx != nullptr && m_in_flight_op_events == 0 &&
-      (m_in_flight_aio_flush + m_in_flight_aio_modify) == 0) {
-    m_image_ctx.op_work_queue->queue(m_flush_ctx, 0);
+  Context *on_flush = nullptr;
+  {
+    Mutex::Locker locker(m_lock);
+    assert(m_in_flight_op_events > 0);
+    --m_in_flight_op_events;
+    if (m_in_flight_op_events == 0 &&
+        (m_in_flight_aio_flush + m_in_flight_aio_modify) == 0) {
+      on_flush = m_flush_ctx;
+    }
+  }
+  if (on_flush != nullptr) {
+    m_image_ctx.op_work_queue->queue(on_flush, 0);
   }
 }
 
diff --git a/src/librbd/journal/StandardPolicy.h b/src/librbd/journal/StandardPolicy.h
index c2c997c..b1c99cb 100644
--- a/src/librbd/journal/StandardPolicy.h
+++ b/src/librbd/journal/StandardPolicy.h
@@ -20,6 +20,9 @@ public:
   virtual bool append_disabled() const {
     return false;
   }
+  virtual bool journal_disabled() const {
+    return false;
+  }
   virtual void allocate_tag_on_lock(Context *on_finish);
 
 private:
diff --git a/src/librbd/journal/Types.cc b/src/librbd/journal/Types.cc
index 0b2a54d..f402edf 100644
--- a/src/librbd/journal/Types.cc
+++ b/src/librbd/journal/Types.cc
@@ -498,29 +498,42 @@ void ClientData::generate_test_instances(std::list<ClientData *> &o) {
 
 // Journal Tag
 
+void TagPredecessor::encode(bufferlist& bl) const {
+  ::encode(mirror_uuid, bl);
+  ::encode(commit_valid, bl);
+  ::encode(tag_tid, bl);
+  ::encode(entry_tid, bl);
+}
+
+void TagPredecessor::decode(bufferlist::iterator& it) {
+  ::decode(mirror_uuid, it);
+  ::decode(commit_valid, it);
+  ::decode(tag_tid, it);
+  ::decode(entry_tid, it);
+}
+
+void TagPredecessor::dump(Formatter *f) const {
+  f->dump_string("mirror_uuid", mirror_uuid);
+  f->dump_string("commit_valid", commit_valid ? "true" : "false");
+  f->dump_unsigned("tag_tid", tag_tid);
+  f->dump_unsigned("entry_tid", entry_tid);
+}
+
 void TagData::encode(bufferlist& bl) const {
   ::encode(mirror_uuid, bl);
-  ::encode(predecessor_mirror_uuid, bl);
-  ::encode(predecessor_commit_valid, bl);
-  ::encode(predecessor_tag_tid, bl);
-  ::encode(predecessor_entry_tid, bl);
+  predecessor.encode(bl);
 }
 
 void TagData::decode(bufferlist::iterator& it) {
   ::decode(mirror_uuid, it);
-  ::decode(predecessor_mirror_uuid, it);
-  ::decode(predecessor_commit_valid, it);
-  ::decode(predecessor_tag_tid, it);
-  ::decode(predecessor_entry_tid, it);
+  predecessor.decode(it);
 }
 
 void TagData::dump(Formatter *f) const {
   f->dump_string("mirror_uuid", mirror_uuid);
-  f->dump_string("predecessor_mirror_uuid", predecessor_mirror_uuid);
-  f->dump_string("predecessor_commit_valid",
-                 predecessor_commit_valid ? "true" : "false");
-  f->dump_unsigned("predecessor_tag_tid", predecessor_tag_tid);
-  f->dump_unsigned("predecessor_entry_tid", predecessor_entry_tid);
+  f->open_object_section("predecessor");
+  predecessor.dump(f);
+  f->close_section();
 }
 
 void TagData::generate_test_instances(std::list<TagData *> &o) {
@@ -654,19 +667,26 @@ std::ostream &operator<<(std::ostream &out, const MirrorPeerClientMeta &meta) {
   return out;
 }
 
-std::ostream &operator<<(std::ostream &out, const TagData &tag_data) {
+std::ostream &operator<<(std::ostream &out, const TagPredecessor &predecessor) {
   out << "["
-      << "mirror_uuid=" << tag_data.mirror_uuid << ", "
-      << "predecessor_mirror_uuid=" << tag_data.predecessor_mirror_uuid;
-  if (tag_data.predecessor_commit_valid) {
+      << "mirror_uuid=" << predecessor.mirror_uuid;
+  if (predecessor.commit_valid) {
     out << ", "
-        << "predecessor_tag_tid=" << tag_data.predecessor_tag_tid << ", "
-        << "predecessor_entry_tid=" << tag_data.predecessor_entry_tid;
+        << "tag_tid=" << predecessor.tag_tid << ", "
+        << "entry_tid=" << predecessor.entry_tid;
   }
   out << "]";
   return out;
 }
 
+std::ostream &operator<<(std::ostream &out, const TagData &tag_data) {
+  out << "["
+      << "mirror_uuid=" << tag_data.mirror_uuid << ", "
+      << "predecessor=" << tag_data.predecessor
+      << "]";
+  return out;
+}
+
 } // namespace journal
 } // namespace librbd
 
diff --git a/src/librbd/journal/Types.h b/src/librbd/journal/Types.h
index 8584532..c8c13a9 100644
--- a/src/librbd/journal/Types.h
+++ b/src/librbd/journal/Types.h
@@ -446,15 +446,38 @@ struct ClientData {
 
 // Journal Tag data structures
 
+struct TagPredecessor {
+  std::string mirror_uuid; // empty if local
+  bool commit_valid = false;
+  uint64_t tag_tid = 0;
+  uint64_t entry_tid = 0;
+
+  TagPredecessor() {
+  }
+  TagPredecessor(const std::string &mirror_uuid, bool commit_valid,
+                 uint64_t tag_tid, uint64_t entry_tid)
+    : mirror_uuid(mirror_uuid), commit_valid(commit_valid), tag_tid(tag_tid),
+      entry_tid(entry_tid) {
+  }
+
+  inline bool operator==(const TagPredecessor &rhs) const {
+    return (mirror_uuid == rhs.mirror_uuid &&
+            commit_valid == rhs.commit_valid &&
+            tag_tid == rhs.tag_tid &&
+            entry_tid == rhs.entry_tid);
+  }
+
+  void encode(bufferlist& bl) const;
+  void decode(bufferlist::iterator& it);
+  void dump(Formatter *f) const;
+};
+
 struct TagData {
   // owner of the tag (exclusive lock epoch)
   std::string mirror_uuid; // empty if local
 
   // mapping to last committed record of previous tag
-  std::string predecessor_mirror_uuid; // empty if local
-  bool predecessor_commit_valid = false;
-  uint64_t predecessor_tag_tid = 0;
-  uint64_t predecessor_entry_tid = 0;
+  TagPredecessor predecessor;
 
   TagData() {
   }
@@ -465,10 +488,8 @@ struct TagData {
           bool predecessor_commit_valid,
           uint64_t predecessor_tag_tid, uint64_t predecessor_entry_tid)
     : mirror_uuid(mirror_uuid),
-      predecessor_mirror_uuid(predecessor_mirror_uuid),
-      predecessor_commit_valid(predecessor_commit_valid),
-      predecessor_tag_tid(predecessor_tag_tid),
-      predecessor_entry_tid(predecessor_entry_tid) {
+      predecessor(predecessor_mirror_uuid, predecessor_commit_valid,
+                  predecessor_tag_tid, predecessor_entry_tid) {
   }
 
   void encode(bufferlist& bl) const;
@@ -484,19 +505,22 @@ std::ostream &operator<<(std::ostream &out, const ImageClientMeta &meta);
 std::ostream &operator<<(std::ostream &out, const MirrorPeerSyncPoint &sync);
 std::ostream &operator<<(std::ostream &out, const MirrorPeerState &meta);
 std::ostream &operator<<(std::ostream &out, const MirrorPeerClientMeta &meta);
+std::ostream &operator<<(std::ostream &out, const TagPredecessor &predecessor);
 std::ostream &operator<<(std::ostream &out, const TagData &tag_data);
 
-enum class ListenerType : int8_t {
-  RESYNC
-};
+struct Listener {
+  virtual ~Listener() {
+  }
 
-struct ResyncListener {
-  virtual ~ResyncListener() {}
-  virtual void handle_resync() = 0;
-};
+  /// invoked when journal close is requested
+  virtual void handle_close() = 0;
 
-typedef boost::variant<ResyncListener *> JournalListenerPtr;
+  /// invoked when journal is promoted to primary
+  virtual void handle_promoted() = 0;
 
+  /// invoked when journal resync is requested
+  virtual void handle_resync() = 0;
+};
 
 } // namespace journal
 } // namespace librbd
diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc
index b71d5e8..2d6d80c 100644
--- a/src/librbd/librbd.cc
+++ b/src/librbd/librbd.cc
@@ -367,7 +367,7 @@ namespace librbd {
     TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
     tracepoint(librbd, remove_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), name);
     librbd::NoOpProgressContext prog_ctx;
-    int r = librbd::remove(io_ctx, name, prog_ctx);
+    int r = librbd::remove(io_ctx, name, "", prog_ctx);
     tracepoint(librbd, remove_exit, r);
     return r;
   }
@@ -377,7 +377,7 @@ namespace librbd {
   {
     TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
     tracepoint(librbd, remove_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), name);
-    int r = librbd::remove(io_ctx, name, pctx);
+    int r = librbd::remove(io_ctx, name, "", pctx);
     tracepoint(librbd, remove_exit, r);
     return r;
   }
@@ -1702,7 +1702,7 @@ extern "C" int rbd_remove(rados_ioctx_t p, const char *name)
   TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
   tracepoint(librbd, remove_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), name);
   librbd::NoOpProgressContext prog_ctx;
-  int r = librbd::remove(io_ctx, name, prog_ctx);
+  int r = librbd::remove(io_ctx, name, "", prog_ctx);
   tracepoint(librbd, remove_exit, r);
   return r;
 }
@@ -1715,7 +1715,7 @@ extern "C" int rbd_remove_with_progress(rados_ioctx_t p, const char *name,
   TracepointProvider::initialize<tracepoint_traits>(get_cct(io_ctx));
   tracepoint(librbd, remove_enter, io_ctx.get_pool_name().c_str(), io_ctx.get_id(), name);
   librbd::CProgressContext prog_ctx(cb, cbdata);
-  int r = librbd::remove(io_ctx, name, prog_ctx);
+  int r = librbd::remove(io_ctx, name, "", prog_ctx);
   tracepoint(librbd, remove_exit, r);
   return r;
 }
diff --git a/src/librbd/operation/RenameRequest.cc b/src/librbd/operation/RenameRequest.cc
index 3d23579..cfd54d1 100644
--- a/src/librbd/operation/RenameRequest.cc
+++ b/src/librbd/operation/RenameRequest.cc
@@ -66,7 +66,11 @@ bool RenameRequest<I>::should_complete(int r) {
                 << "r=" << r << dendl;
   r = filter_state_return_code(r);
   if (r < 0) {
-    lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    if (r == -EEXIST) {
+      ldout(cct, 1) << "image already exists" << dendl;
+    } else {
+      lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    }
     return true;
   }
 
diff --git a/src/librbd/operation/ResizeRequest.cc b/src/librbd/operation/ResizeRequest.cc
index 1c3dee7..c046e79 100644
--- a/src/librbd/operation/ResizeRequest.cc
+++ b/src/librbd/operation/ResizeRequest.cc
@@ -168,6 +168,38 @@ Context *ResizeRequest<I>::handle_trim_image(int *result) {
     return this->create_context_finisher(*result);
   }
 
+  send_post_block_writes();
+  return nullptr;
+}
+
+template <typename I>
+void ResizeRequest<I>::send_flush_cache() {
+  I &image_ctx = this->m_image_ctx;
+  if (image_ctx.object_cacher == nullptr) {
+    send_trim_image();
+    return;
+  }
+
+  CephContext *cct = image_ctx.cct;
+  ldout(cct, 5) << this << " " << __func__ << dendl;
+
+  RWLock::RLocker owner_locker(image_ctx.owner_lock);
+  image_ctx.flush_cache(create_async_context_callback(
+    image_ctx, create_context_callback<
+      ResizeRequest<I>, &ResizeRequest<I>::handle_flush_cache>(this)));
+}
+
+template <typename I>
+Context *ResizeRequest<I>::handle_flush_cache(int *result) {
+  I &image_ctx = this->m_image_ctx;
+  CephContext *cct = image_ctx.cct;
+  ldout(cct, 5) << this << " " << __func__ << ": r=" << *result << dendl;
+
+  if (*result < 0) {
+    lderr(cct) << "failed to flush cache: " << cpp_strerror(*result) << dendl;
+    return this->create_context_finisher(*result);
+  }
+
   send_invalidate_cache();
   return nullptr;
 }
@@ -192,13 +224,16 @@ Context *ResizeRequest<I>::handle_invalidate_cache(int *result) {
   CephContext *cct = image_ctx.cct;
   ldout(cct, 5) << this << " " << __func__ << ": r=" << *result << dendl;
 
-  if (*result < 0) {
+  // ignore busy error -- writeback was successfully flushed so we might be
+  // wasting some cache space for trimmed objects, but they will get purged
+  // eventually. Most likely cause of the issue was a in-flight cache read
+  if (*result < 0 && *result != -EBUSY) {
     lderr(cct) << "failed to invalidate cache: " << cpp_strerror(*result)
                << dendl;
     return this->create_context_finisher(*result);
   }
 
-  send_post_block_writes();
+  send_trim_image();
   return nullptr;
 }
 
@@ -215,7 +250,7 @@ Context *ResizeRequest<I>::send_grow_object_map() {
   if (m_original_size == m_new_size) {
     return this->create_context_finisher(0);
   } else if (m_new_size < m_original_size) {
-    send_trim_image();
+    send_flush_cache();
     return nullptr;
   }
 
diff --git a/src/librbd/operation/ResizeRequest.h b/src/librbd/operation/ResizeRequest.h
index bd5019f..d1c778b 100644
--- a/src/librbd/operation/ResizeRequest.h
+++ b/src/librbd/operation/ResizeRequest.h
@@ -79,12 +79,15 @@ private:
    *    |           STATE_UPDATE_HEADER ----------------------------\
    *    |                                                           |
    *    | (shrink)                                                  |
-   *    |\--------> STATE_TRIM_IMAGE                                |
+   *    |\--------> STATE_FLUSH_CACHE                               |
    *    |                 |                                         |
    *    |                 v                                         |
    *    |           STATE_INVALIDATE_CACHE                          |
    *    |                 |                                         |
    *    |                 v                                         |
+   *    |           STATE_TRIM_IMAGE                                |
+   *    |                 |                                         |
+   *    |                 v                                         |
    *    |           STATE_POST_BLOCK_WRITES                         |
    *    |                 |                                         |
    *    |                 v                                         |
@@ -119,6 +122,9 @@ private:
   Context *send_append_op_event();
   Context *handle_append_op_event(int *result);
 
+  void send_flush_cache();
+  Context *handle_flush_cache(int *result);
+
   void send_invalidate_cache();
   Context *handle_invalidate_cache(int *result);
 
diff --git a/src/librbd/operation/SnapshotProtectRequest.cc b/src/librbd/operation/SnapshotProtectRequest.cc
index 9ba415e..409d998 100644
--- a/src/librbd/operation/SnapshotProtectRequest.cc
+++ b/src/librbd/operation/SnapshotProtectRequest.cc
@@ -47,7 +47,11 @@ bool SnapshotProtectRequest<I>::should_complete(int r) {
   ldout(cct, 5) << this << " " << __func__ << ": state=" << m_state << ", "
                 << "r=" << r << dendl;
   if (r < 0) {
-    lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    if (r == -EBUSY) {
+      ldout(cct, 1) << "snapshot is already protected" << dendl;
+    } else {
+      lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    }
   }
   return true;
 }
diff --git a/src/librbd/operation/SnapshotRemoveRequest.cc b/src/librbd/operation/SnapshotRemoveRequest.cc
index 9bc4567..eadbfc2 100644
--- a/src/librbd/operation/SnapshotRemoveRequest.cc
+++ b/src/librbd/operation/SnapshotRemoveRequest.cc
@@ -135,7 +135,11 @@ void SnapshotRemoveRequest<I>::send_remove_child() {
     parent_spec our_pspec;
     int r = image_ctx.get_parent_spec(m_snap_id, &our_pspec);
     if (r < 0) {
-      lderr(cct) << "failed to retrieve parent spec" << dendl;
+      if (r == -ENOENT) {
+        ldout(cct, 1) << "No such snapshot" << dendl;
+      } else {
+        lderr(cct) << "failed to retrieve parent spec" << dendl;
+      }
       m_state = STATE_ERROR;
 
       this->async_complete(r);
diff --git a/src/librbd/operation/SnapshotRenameRequest.cc b/src/librbd/operation/SnapshotRenameRequest.cc
index c7148c8..5b836cd 100644
--- a/src/librbd/operation/SnapshotRenameRequest.cc
+++ b/src/librbd/operation/SnapshotRenameRequest.cc
@@ -64,7 +64,11 @@ bool SnapshotRenameRequest<I>::should_complete(int r) {
   ldout(cct, 5) << this << " " << __func__ << ": state=" << m_state << ", "
                 << "r=" << r << dendl;
   if (r < 0) {
-    lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    if (r == -EEXIST) {
+      ldout(cct, 1) << "snapshot already exists" << dendl;
+    } else {
+      lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    }
   }
   return true;
 }
diff --git a/src/librbd/operation/SnapshotUnprotectRequest.cc b/src/librbd/operation/SnapshotUnprotectRequest.cc
index 5ca98f9..0b7b7c4 100644
--- a/src/librbd/operation/SnapshotUnprotectRequest.cc
+++ b/src/librbd/operation/SnapshotUnprotectRequest.cc
@@ -169,7 +169,11 @@ bool SnapshotUnprotectRequest<I>::should_complete(int r) {
   ldout(cct, 5) << this << " " << __func__ << ": state=" << m_state << ", "
                 << "r=" << r << dendl;
   if (r < 0) {
-    lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    if (r == -EINVAL) {
+      ldout(cct, 1) << "snapshot is already unprotected" << dendl;
+    } else {
+      lderr(cct) << "encountered error: " << cpp_strerror(r) << dendl;
+    }
     if (m_ret_val == 0) {
       m_ret_val = r;
     }
diff --git a/src/log/Log.cc b/src/log/Log.cc
index 29e0529..1d74b00 100644
--- a/src/log/Log.cc
+++ b/src/log/Log.cc
@@ -329,7 +329,7 @@ void Log::_flush(EntryQueue *t, EntryQueue *requeue, bool crash)
       }
 
       if (do_syslog) {
-        syslog(LOG_USER|LOG_DEBUG, "%s", buf);
+        syslog(LOG_USER|LOG_INFO, "%s", buf);
       }
 
       if (do_stderr) {
@@ -367,7 +367,7 @@ void Log::_log_message(const char *s, bool crash)
       cerr << "problem writing to " << m_log_file << ": " << cpp_strerror(r) << std::endl;
   }
   if ((crash ? m_syslog_crash : m_syslog_log) >= 0) {
-    syslog(LOG_USER|LOG_DEBUG, "%s", s);
+    syslog(LOG_USER|LOG_INFO, "%s", s);
   }
 
   if ((crash ? m_stderr_crash : m_stderr_log) >= 0) {
diff --git a/src/logrotate.conf b/src/logrotate.conf
index 061965b..6bd1a98 100644
--- a/src/logrotate.conf
+++ b/src/logrotate.conf
@@ -8,5 +8,5 @@
     endscript
     missingok
     notifempty
-    su ceph ceph
+    su root ceph
 }
diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc
index fcae684..8b241e3 100644
--- a/src/mds/CDir.cc
+++ b/src/mds/CDir.cc
@@ -78,9 +78,7 @@ boost::pool<> CDir::pool(sizeof(CDir));
 
 ostream& operator<<(ostream& out, const CDir& dir)
 {
-  string path;
-  dir.get_inode()->make_path_string_projected(path);
-  out << "[dir " << dir.dirfrag() << " " << path << "/"
+  out << "[dir " << dir.dirfrag() << " " << dir.get_path() << "/"
       << " [" << dir.first << ",head]";
   if (dir.is_auth()) {
     out << " auth";
@@ -1753,7 +1751,9 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
     }
 
     dout(0) << "_fetched missing object for " << *this << dendl;
-    clog->error() << "dir " << dirfrag() << " object missing on disk; some files may be lost\n";
+
+    clog->error() << "dir " << dirfrag() << " object missing on disk; some "
+                     "files may be lost (" << get_path() << ")";
 
     go_bad();
     return;
@@ -1768,13 +1768,14 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
       derr << "Corrupt fnode in dirfrag " << dirfrag()
         << ": " << err << dendl;
       clog->warn() << "Corrupt fnode header in " << dirfrag() << ": "
-		  << err;
+		  << err << " (" << get_path() << ")";
       go_bad();
       return;
     }
     if (!p.end()) {
       clog->warn() << "header buffer of dir " << dirfrag() << " has "
-		  << hdrbl.length() - p.get_off() << " extra bytes\n";
+		  << hdrbl.length() - p.get_off() << " extra bytes ("
+                  << get_path() << ")";
       go_bad();
       return;
     }
@@ -1833,7 +1834,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
     } catch (const buffer::error &err) {
       cache->mds->clog->warn() << "Corrupt dentry '" << dname << "' in "
                                   "dir frag " << dirfrag() << ": "
-                               << err;
+                               << err << "(" << get_path() << ")";
 
       // Remember that this dentry is damaged.  Subsequent operations
       // that try to act directly on it will get their EIOs, but this
@@ -2887,9 +2888,7 @@ void CDir::dump(Formatter *f) const
 {
   assert(f != NULL);
 
-  string path;
-  get_inode()->make_path_string_projected(path);
-  f->dump_stream("path") << path;
+  f->dump_stream("path") << get_path();
 
   f->dump_stream("dirfrag") << dirfrag();
   f->dump_int("snapid_first", first);
@@ -3152,3 +3151,11 @@ bool CDir::scrub_local()
   }
   return rval;
 }
+
+std::string CDir::get_path() const
+{
+  std::string path;
+  get_inode()->make_path_string_projected(path);
+  return path;
+}
+
diff --git a/src/mds/CDir.h b/src/mds/CDir.h
index 7b6d488..8533ba8 100644
--- a/src/mds/CDir.h
+++ b/src/mds/CDir.h
@@ -42,6 +42,8 @@ struct ObjectOperation;
 
 ostream& operator<<(ostream& out, const class CDir& dir);
 class CDir : public MDSCacheObject {
+  friend ostream& operator<<(ostream& out, const class CDir& dir);
+
   /*
    * This class uses a boost::pool to handle allocation. This is *not*
    * thread-safe, so don't do allocations from multiple threads!
@@ -510,6 +512,8 @@ private:
    */
   mds_authority_t dir_auth;
 
+  std::string get_path() const;
+
  public:
   mds_authority_t authority() const;
   mds_authority_t get_dir_auth() const { return dir_auth; }
diff --git a/src/mds/DamageTable.cc b/src/mds/DamageTable.cc
index 1c7b191..b8bcdda 100644
--- a/src/mds/DamageTable.cc
+++ b/src/mds/DamageTable.cc
@@ -46,10 +46,13 @@ bool DamageTable::notify_dentry(
     return true;
   }
 
-  DamageEntryRef entry = std::make_shared<DentryDamage>(
-      ino, frag, dname, snap_id);
-  dentries[DirFragIdent(ino, frag)][DentryIdent(dname, snap_id)] = entry;
-  by_id[entry->id] = entry;
+  auto key = DirFragIdent(ino, frag);
+  if (dentries.count(key) == 0) {
+    DamageEntryRef entry = std::make_shared<DentryDamage>(
+        ino, frag, dname, snap_id);
+    dentries[key][DentryIdent(dname, snap_id)] = entry;
+    by_id[entry->id] = entry;
+  }
 
   return false;
 }
@@ -72,9 +75,12 @@ bool DamageTable::notify_dirfrag(inodeno_t ino, frag_t frag)
     return true;
   }
 
-  DamageEntryRef entry = std::make_shared<DirFragDamage>(ino, frag);
-  dirfrags[DirFragIdent(ino, frag)] = entry;
-  by_id[entry->id] = entry;
+  auto key = DirFragIdent(ino, frag);
+  if (dirfrags.count(key) == 0) {
+    DamageEntryRef entry = std::make_shared<DirFragDamage>(ino, frag);
+    dirfrags[key] = entry;
+    by_id[entry->id] = entry;
+  }
 
   return false;
 }
@@ -85,9 +91,11 @@ bool DamageTable::notify_remote_damaged(inodeno_t ino)
     return true;
   }
 
-  auto entry = std::make_shared<BacktraceDamage>(ino);
-  remotes[ino] = entry;
-  by_id[entry->id] = entry;
+  if (remotes.count(ino) == 0) {
+    auto entry = std::make_shared<BacktraceDamage>(ino);
+    remotes[ino] = entry;
+    by_id[entry->id] = entry;
+  }
 
   return false;
 }
diff --git a/src/mds/LogEvent.h b/src/mds/LogEvent.h
index 8c1cd1b..ecea57c 100644
--- a/src/mds/LogEvent.h
+++ b/src/mds/LogEvent.h
@@ -118,7 +118,7 @@ public:
   virtual EMetaBlob *get_metablob() { return NULL; }
 };
 
-inline ostream& operator<<(ostream& out, LogEvent& le) {
+inline ostream& operator<<(ostream& out, const LogEvent &le) {
   le.print(out);
   return out;
 }
diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc
index df126d6..3226969 100644
--- a/src/mds/MDCache.cc
+++ b/src/mds/MDCache.cc
@@ -9075,12 +9075,6 @@ void MDCache::request_cleanup(MDRequestRef& mdr)
   // remove from map
   active_requests.erase(mdr->reqid);
 
-  // fail-safe!
-  if (was_replay && active_requests.empty()) {
-    dout(10) << " fail-safe queueing next replay op" << dendl;
-    mds->queue_one_replay();
-  }
-
   if (mds->logger)
     log_stat();
 
diff --git a/src/mds/MDSMap.h b/src/mds/MDSMap.h
index 60aaf00..9dc9b58 100644
--- a/src/mds/MDSMap.h
+++ b/src/mds/MDSMap.h
@@ -632,7 +632,7 @@ public:
 WRITE_CLASS_ENCODER_FEATURES(MDSMap::mds_info_t)
 WRITE_CLASS_ENCODER_FEATURES(MDSMap)
 
-inline ostream& operator<<(ostream& out, MDSMap& m) {
+inline ostream& operator<<(ostream &out, const MDSMap &m) {
   m.print_summary(NULL, &out);
   return out;
 }
diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc
index 5c2bfe3..19a584a 100644
--- a/src/mds/MDSRank.cc
+++ b/src/mds/MDSRank.cc
@@ -1240,9 +1240,7 @@ void MDSRank::clientreplay_start()
 bool MDSRank::queue_one_replay()
 {
   if (replay_queue.empty()) {
-    if (mdcache->get_num_client_requests() == 0) {
-      clientreplay_done();
-    }
+    clientreplay_done();
     return false;
   }
   queue_waiter(replay_queue.front());
diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h
index f43d660..91e68db 100644
--- a/src/mds/Mutation.h
+++ b/src/mds/Mutation.h
@@ -158,14 +158,14 @@ public:
   void apply();
   void cleanup();
 
-  virtual void print(ostream &out) {
+  virtual void print(ostream &out) const {
     out << "mutation(" << this << ")";
   }
 
   virtual void dump(Formatter *f) const {}
 };
 
-inline ostream& operator<<(ostream& out, MutationImpl &mut)
+inline ostream& operator<<(ostream &out, const MutationImpl &mut)
 {
   mut.print(out);
   return out;
diff --git a/src/mds/Server.cc b/src/mds/Server.cc
index 7edb4b3..61320c3 100644
--- a/src/mds/Server.cc
+++ b/src/mds/Server.cc
@@ -955,6 +955,7 @@ void Server::force_clients_readonly()
 void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEvent *le, MDSInternalContextBase *fin)
 {
   dout(10) << "journal_and_reply tracei " << in << " tracedn " << dn << dendl;
+  assert(!mdr->has_completed);
 
   // note trace items for eventual reply.
   mdr->tracei = in;
diff --git a/src/mds/SessionMap.cc b/src/mds/SessionMap.cc
index 43053fe..d91713f 100644
--- a/src/mds/SessionMap.cc
+++ b/src/mds/SessionMap.cc
@@ -52,7 +52,7 @@ void SessionMap::dump()
 	     << " state " << p->second->get_state_name()
 	     << " completed " << p->second->info.completed_requests
 	     << " prealloc_inos " << p->second->info.prealloc_inos
-	     << " used_ions " << p->second->info.used_inos
+	     << " used_inos " << p->second->info.used_inos
 	     << dendl;
 }
 
diff --git a/src/mds/flock.h b/src/mds/flock.h
index fade1a8..2cf9f0a 100644
--- a/src/mds/flock.h
+++ b/src/mds/flock.h
@@ -277,18 +277,18 @@ public:
 WRITE_CLASS_ENCODER(ceph_lock_state_t)
 
 
-inline ostream& operator<<(ostream& out, ceph_lock_state_t& l) {
+inline ostream& operator<<(ostream &out, const ceph_lock_state_t &l) {
   out << "ceph_lock_state_t. held_locks.size()=" << l.held_locks.size()
       << ", waiting_locks.size()=" << l.waiting_locks.size()
       << ", client_held_lock_counts -- " << l.client_held_lock_counts
       << "\n client_waiting_lock_counts -- " << l.client_waiting_lock_counts
       << "\n held_locks -- ";
-    for (multimap<uint64_t, ceph_filelock>::iterator iter = l.held_locks.begin();
+    for (auto iter = l.held_locks.begin();
          iter != l.held_locks.end();
          ++iter)
       out << iter->second;
     out << "\n waiting_locks -- ";
-    for (multimap<uint64_t, ceph_filelock>::iterator iter =l.waiting_locks.begin();
+    for (auto iter =l.waiting_locks.begin();
          iter != l.waiting_locks.end();
          ++iter)
       out << iter->second << "\n";
diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h
index b4195eb..98a732e 100644
--- a/src/mds/mdstypes.h
+++ b/src/mds/mdstypes.h
@@ -90,13 +90,14 @@ extern const mds_rank_t MDS_RANK_NONE;
 class mds_role_t
 {
   public:
-  mds_rank_t rank;
   fs_cluster_id_t fscid;
+  mds_rank_t rank;
+
   mds_role_t(fs_cluster_id_t fscid_, mds_rank_t rank_)
-    : rank(rank_), fscid(fscid_)
+    : fscid(fscid_), rank(rank_)
   {}
   mds_role_t()
-    : rank(MDS_RANK_NONE), fscid(FS_CLUSTER_ID_NONE)
+    : fscid(FS_CLUSTER_ID_NONE), rank(MDS_RANK_NONE)
   {}
   bool operator<(mds_role_t const &rhs) const
   {
diff --git a/src/messages/MForward.h b/src/messages/MForward.h
index efe6085..2c00825 100644
--- a/src/messages/MForward.h
+++ b/src/messages/MForward.h
@@ -22,6 +22,7 @@
 #include "msg/Message.h"
 #include "mon/MonCap.h"
 #include "include/encoding.h"
+#include "include/stringify.h"
 
 struct MForward : public Message {
   uint64_t tid;
@@ -29,9 +30,10 @@ struct MForward : public Message {
   MonCap client_caps;
   uint64_t con_features;
   EntityName entity_name;
-  PaxosServiceMessage *msg;   // incoming message
-  bufferlist msg_bl;          // outgoing message
+  PaxosServiceMessage *msg;   // incoming or outgoing message
 
+  string msg_desc;  // for operator<< only
+  
   static const int HEAD_VERSION = 3;
   static const int COMPAT_VERSION = 1;
 
@@ -44,7 +46,9 @@ struct MForward : public Message {
     client = m->get_source_inst();
     client_caps = m->get_session()->caps;
     con_features = feat;
-    set_message(m, feat);
+    // we may need to reencode for the target mon
+    msg->clear_payload();
+    msg = (PaxosServiceMessage*)m->get();
   }
   MForward(uint64_t t, PaxosServiceMessage *m, uint64_t feat,
            const MonCap& caps) :
@@ -52,7 +56,7 @@ struct MForward : public Message {
     tid(t), client_caps(caps), msg(NULL) {
     client = m->get_source_inst();
     con_features = feat;
-    set_message(m, feat);
+    msg = (PaxosServiceMessage*)m->get();
   }
 private:
   ~MForward() {
@@ -63,18 +67,20 @@ private:
     }
   }
 
-  PaxosServiceMessage *get_msg_from_bl() {
-    bufferlist::iterator p = msg_bl.begin();
-    return (msg_bl.length() ?
-        (PaxosServiceMessage*)decode_message(NULL, 0, p) : NULL);
-  }
-
 public:
   void encode_payload(uint64_t features) {
     ::encode(tid, payload);
     ::encode(client, payload);
     ::encode(client_caps, payload, features);
-    payload.append(msg_bl);
+    // Encode client message with intersection of target and source
+    // features.  This could matter if the semantics of the encoded
+    // message are changed when reencoding with more features than the
+    // client had originally.  That should never happen, but we may as
+    // well be defensive here.
+    if (con_features != features) {
+      msg->clear_payload();
+    }
+    encode_message(msg, features & con_features, payload);
     ::encode(con_features, payload);
     ::encode(entity_name, payload);
   }
@@ -101,21 +107,10 @@ public:
 
   }
 
-  void set_message(PaxosServiceMessage *m, uint64_t features) {
-    // get a reference to the message.  We will not use it except for print(),
-    // and we will put it in the dtor if it is not claimed.
-    // we could avoid doing this if only we had a const bufferlist iterator :)
-    msg = (PaxosServiceMessage*)m->get();
-
-    encode_message(m, features, msg_bl);
-  }
-
   PaxosServiceMessage *claim_message() {
-    if (!msg) {
-      return get_msg_from_bl();
-    }
-
     // let whoever is claiming the message deal with putting it.
+    assert(msg);
+    msg_desc = stringify(*msg);
     PaxosServiceMessage *m = msg;
     msg = NULL;
     return m;
@@ -123,13 +118,15 @@ public:
 
   const char *get_type_name() const { return "forward"; }
   void print(ostream& o) const {
+    o << "forward(";
     if (msg) {
-      o << "forward(" << *msg << " caps " << client_caps
-	<< " tid " << tid
-        << " con_features " << con_features << ") to leader";
+      o << *msg;
     } else {
-      o << "forward(??? ) to leader";
+      o << msg_desc;
     }
+    o << " caps " << client_caps
+      << " tid " << tid
+      << " con_features " << con_features << ")";
   }
 };
   
diff --git a/src/messages/MMDSBeacon.h b/src/messages/MMDSBeacon.h
index a4d9d9b..cde0125 100644
--- a/src/messages/MMDSBeacon.h
+++ b/src/messages/MMDSBeacon.h
@@ -146,7 +146,12 @@ class MMDSBeacon : public PaxosServiceMessage {
   uint64_t mds_features;
 
  public:
-  MMDSBeacon() : PaxosServiceMessage(MSG_MDS_BEACON, 0, HEAD_VERSION, COMPAT_VERSION) { }
+  MMDSBeacon()
+    : PaxosServiceMessage(MSG_MDS_BEACON, 0, HEAD_VERSION, COMPAT_VERSION),
+    global_id(0), state(MDSMap::STATE_NULL), standby_for_rank(MDS_RANK_NONE),
+    standby_for_fscid(FS_CLUSTER_ID_NONE), standby_replay(false),
+    mds_features(0)
+  { }
   MMDSBeacon(const uuid_d &f, mds_gid_t g, string& n, epoch_t les, MDSMap::DaemonState st, version_t se, uint64_t feat) :
     PaxosServiceMessage(MSG_MDS_BEACON, les, HEAD_VERSION, COMPAT_VERSION),
     fsid(f), global_id(g), name(n), state(st), seq(se),
diff --git a/src/mon/AuthMonitor.cc b/src/mon/AuthMonitor.cc
index 10003a1..fff9f0d 100644
--- a/src/mon/AuthMonitor.cc
+++ b/src/mon/AuthMonitor.cc
@@ -44,7 +44,7 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, version_t v) {
 		<< ").auth v" << v << " ";
 }
 
-ostream& operator<<(ostream& out, AuthMonitor& pm)
+ostream& operator<<(ostream &out, const AuthMonitor &pm)
 {
   return out << "auth";
 }
diff --git a/src/mon/AuthMonitor.h b/src/mon/AuthMonitor.h
index 4420290..e4a6bb6 100644
--- a/src/mon/AuthMonitor.h
+++ b/src/mon/AuthMonitor.h
@@ -35,11 +35,11 @@ class KeyRing;
 #define MIN_GLOBAL_ID 0x1000
 
 class AuthMonitor : public PaxosService {
+public:
   enum IncType {
     GLOBAL_ID,
     AUTH_DATA,
   };
-public:
   struct Incremental {
     IncType inc_type;
     uint64_t max_global_id;
diff --git a/src/mon/LogMonitor.cc b/src/mon/LogMonitor.cc
index 391a338..aee3e59 100644
--- a/src/mon/LogMonitor.cc
+++ b/src/mon/LogMonitor.cc
@@ -46,7 +46,7 @@ static ostream& _prefix(std::ostream *_dout, Monitor *mon, version_t v) {
 		<< ").log v" << v << " ";
 }
 
-ostream& operator<<(ostream& out, LogMonitor& pm)
+ostream& operator<<(ostream &out, const LogMonitor &pm)
 {
   /*
   std::stringstream ss;
diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc
index 6d6fb9d..b91e360 100644
--- a/src/mon/MDSMonitor.cc
+++ b/src/mon/MDSMonitor.cc
@@ -92,7 +92,7 @@ void MDSMonitor::create_new_fs(FSMap &fsm, const std::string &name,
 {
   auto fs = std::make_shared<Filesystem>();
   fs->mds_map.fs_name = name;
-  fs->mds_map.max_mds = g_conf->max_mds;
+  fs->mds_map.max_mds = 1;
   fs->mds_map.data_pools.insert(data_pool);
   fs->mds_map.metadata_pool = metadata_pool;
   fs->mds_map.cas_pool = -1;
@@ -1682,7 +1682,7 @@ int MDSMonitor::management_command(
     // Carry forward what makes sense
     new_fs->fscid = fs->fscid;
     new_fs->mds_map.inline_data_enabled = fs->mds_map.inline_data_enabled;
-    new_fs->mds_map.max_mds = g_conf->max_mds;
+    new_fs->mds_map.max_mds = 1;
     new_fs->mds_map.data_pools = fs->mds_map.data_pools;
     new_fs->mds_map.metadata_pool = fs->mds_map.metadata_pool;
     new_fs->mds_map.cas_pool = fs->mds_map.cas_pool;
@@ -2815,6 +2815,17 @@ bool MDSMonitor::maybe_promote_standby(std::shared_ptr<Filesystem> fs)
             pending_fsmap.legacy_client_fscid : info.standby_for_fscid,
           info.standby_for_rank};
 
+        // It is possible that the map contains a standby_for_fscid
+        // that doesn't correspond to an existing filesystem, especially
+        // if we loaded from a version with a bug (#17466)
+        if (info.standby_for_fscid != FS_CLUSTER_ID_NONE
+            && pending_fsmap.get_filesystems().count(
+              info.standby_for_fscid) == 0) {
+          derr << "gid " << gid << " has invalid standby_for_fscid "
+               << info.standby_for_fscid << dendl;
+          continue;
+        }
+
         // If we managed to resolve a full target role
         if (target_role.fscid != FS_CLUSTER_ID_NONE) {
           auto fs = pending_fsmap.get_filesystem(target_role.fscid);
diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h
index b3d8e14..5d2604a 100644
--- a/src/mon/MonCommands.h
+++ b/src/mon/MonCommands.h
@@ -628,7 +628,7 @@ COMMAND("osd erasure-code-profile ls", \
 	"list all erasure code profiles", \
 	"osd", "r", "cli,rest")
 COMMAND("osd set " \
-	"name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise", \
+	"name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|require_jewel_osds", \
 	"set <key>", "osd", "rw", "cli,rest")
 COMMAND("osd unset " \
 	"name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise", \
diff --git a/src/mon/MonMap.h b/src/mon/MonMap.h
index 390d88a..5704ee5 100644
--- a/src/mon/MonMap.h
+++ b/src/mon/MonMap.h
@@ -240,7 +240,7 @@ class MonMap {
 };
 WRITE_CLASS_ENCODER_FEATURES(MonMap)
 
-inline ostream& operator<<(ostream& out, MonMap& m) {
+inline ostream& operator<<(ostream &out, const MonMap &m) {
   m.print_summary(out);
   return out;
 }
diff --git a/src/mon/MonmapMonitor.cc b/src/mon/MonmapMonitor.cc
index 1ff6e06..81964ba 100644
--- a/src/mon/MonmapMonitor.cc
+++ b/src/mon/MonmapMonitor.cc
@@ -412,7 +412,6 @@ bool MonmapMonitor::prepare_command(MonOpRequestRef op)
     ss << "adding mon." << name << " at " << addr;
     propose = true;
     dout(0) << __func__ << " proposing new mon." << name << dendl;
-    goto reply;
 
   } else if (prefix == "mon remove" ||
              prefix == "mon rm") {
@@ -465,7 +464,7 @@ bool MonmapMonitor::prepare_command(MonOpRequestRef op)
     ss << "removing mon." << name << " at " << addr
        << ", there will be " << pending_map.size() << " monitors" ;
     propose = true;
-    goto reply;
+    err = 0;
 
   } else {
     ss << "unknown command " << prefix;
diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc
index da9cd67..b9cdc4d 100644
--- a/src/mon/OSDMonitor.cc
+++ b/src/mon/OSDMonitor.cc
@@ -97,7 +97,7 @@ void OSDMonitor::_get_pending_crush(CrushWrapper& newcrush)
   if (pending_inc.crush.length())
     bl = pending_inc.crush;
   else
-    osdmap.crush->encode(bl);
+    osdmap.crush->encode(bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
 
   bufferlist::iterator p = bl.begin();
   newcrush.decode(p);
@@ -790,8 +790,15 @@ protected:
 
   bool get_bucket_utilization(int id, int64_t* kb, int64_t* kb_used,
 			      int64_t* kb_avail) const {
-    if (id >= 0)
+    if (id >= 0) {
+      if (osdmap->is_out(id)) {
+        *kb = 0;
+        *kb_used = 0;
+        *kb_avail = 0;
+        return true;
+      }
       return get_osd_utilization(id, kb, kb_used, kb_avail);
+    }
 
     *kb = 0;
     *kb_used = 0;
@@ -799,7 +806,7 @@ protected:
 
     for (int k = osdmap->crush->get_bucket_size(id) - 1; k >= 0; k--) {
       int item = osdmap->crush->get_bucket_item(id, k);
-      int64_t kb_i = 0, kb_used_i = 0, kb_avail_i;
+      int64_t kb_i = 0, kb_used_i = 0, kb_avail_i = 0;
       if (!get_bucket_utilization(item, &kb_i, &kb_used_i, &kb_avail_i))
 	return false;
       *kb += kb_i;
@@ -1196,13 +1203,24 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t)
     }
   }
 
+  // features for osdmap and its incremental
+  uint64_t features = mon->quorum_features;
+
   // encode full map and determine its crc
   OSDMap tmp;
   {
     tmp.deepish_copy_from(osdmap);
     tmp.apply_incremental(pending_inc);
+
+    // determine appropriate features
+    if (!tmp.test_flag(CEPH_OSDMAP_REQUIRE_JEWEL)) {
+      dout(10) << __func__ << " encoding without feature SERVER_JEWEL" << dendl;
+      features &= ~CEPH_FEATURE_SERVER_JEWEL;
+    }
+    dout(10) << __func__ << " encoding full map with " << features << dendl;
+
     bufferlist fullbl;
-    ::encode(tmp, fullbl, mon->quorum_features | CEPH_FEATURE_RESERVED);
+    ::encode(tmp, fullbl, features | CEPH_FEATURE_RESERVED);
     pending_inc.full_crc = tmp.get_crc();
 
     // include full map in the txn.  note that old monitors will
@@ -1213,7 +1231,7 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t)
 
   // encode
   assert(get_last_committed() + 1 == pending_inc.epoch);
-  ::encode(pending_inc, bl, mon->quorum_features | CEPH_FEATURE_RESERVED);
+  ::encode(pending_inc, bl, features | CEPH_FEATURE_RESERVED);
 
   dout(20) << " full_crc " << tmp.get_crc()
 	   << " inc_crc " << pending_inc.inc_crc << dendl;
@@ -1726,9 +1744,10 @@ bool OSDMonitor::check_failure(utime_t now, int target_osd, failure_info_t& fi)
 
   utime_t grace = orig_grace;
   double my_grace = 0, peer_grace = 0;
+  double decay_k = 0;
   if (g_conf->mon_osd_adjust_heartbeat_grace) {
     double halflife = (double)g_conf->mon_osd_laggy_halflife;
-    double decay_k = ::log(.5) / halflife;
+    decay_k = ::log(.5) / halflife;
 
     // scale grace period based on historical probability of 'lagginess'
     // (false positive failures due to slowness).
@@ -1738,31 +1757,35 @@ bool OSDMonitor::check_failure(utime_t now, int target_osd, failure_info_t& fi)
 	     << " failed_for " << failed_for << " decay " << decay << dendl;
     my_grace = decay * (double)xi.laggy_interval * xi.laggy_probability;
     grace += my_grace;
+  }
 
-    // consider the peers reporting a failure a proxy for a potential
-    // 'subcluster' over the overall cluster that is similarly
-    // laggy.  this is clearly not true in all cases, but will sometimes
-    // help us localize the grace correction to a subset of the system
-    // (say, a rack with a bad switch) that is unhappy.
-    assert(fi.reporters.size());
-    for (map<int,failure_reporter_t>::iterator p = fi.reporters.begin();
-	 p != fi.reporters.end();
-	 ++p) {
-      // get the parent bucket whose type matches with "reporter_subtree_level".
-      // fall back to OSD if the level doesn't exist.
-      map<string, string> reporter_loc = osdmap.crush->get_full_location(p->first);
-      map<string, string>::iterator iter = reporter_loc.find(reporter_subtree_level);
-      if (iter == reporter_loc.end()) {
-	reporters_by_subtree.insert("osd." + to_string(p->first));
-      } else {
-	reporters_by_subtree.insert(iter->second);
-      }
-
+  // consider the peers reporting a failure a proxy for a potential
+  // 'subcluster' over the overall cluster that is similarly
+  // laggy.  this is clearly not true in all cases, but will sometimes
+  // help us localize the grace correction to a subset of the system
+  // (say, a rack with a bad switch) that is unhappy.
+  assert(fi.reporters.size());
+  for (map<int,failure_reporter_t>::iterator p = fi.reporters.begin();
+	p != fi.reporters.end();
+	++p) {
+    // get the parent bucket whose type matches with "reporter_subtree_level".
+    // fall back to OSD if the level doesn't exist.
+    map<string, string> reporter_loc = osdmap.crush->get_full_location(p->first);
+    map<string, string>::iterator iter = reporter_loc.find(reporter_subtree_level);
+    if (iter == reporter_loc.end()) {
+      reporters_by_subtree.insert("osd." + to_string(p->first));
+    } else {
+      reporters_by_subtree.insert(iter->second);
+    }
+    if (g_conf->mon_osd_adjust_heartbeat_grace) {
       const osd_xinfo_t& xi = osdmap.get_xinfo(p->first);
       utime_t elapsed = now - xi.down_stamp;
       double decay = exp((double)elapsed * decay_k);
       peer_grace += decay * (double)xi.laggy_interval * xi.laggy_probability;
     }
+  }
+  
+  if (g_conf->mon_osd_adjust_heartbeat_grace) {
     peer_grace /= (double)fi.reporters.size();
     grace += peer_grace;
   }
@@ -2019,7 +2042,8 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op)
   }
 
   if (osdmap.exists(from) &&
-      osdmap.get_info(from).up_from > m->version) {
+      osdmap.get_info(from).up_from > m->version &&
+      osdmap.get_most_recent_inst(from) == m->get_orig_source_inst()) {
     dout(7) << "prepare_boot msg from before last up_from, ignoring" << dendl;
     send_latest(op, m->sb.current_epoch+1);
     return true;
@@ -2797,9 +2821,20 @@ void OSDMonitor::tick()
       dout(10) << "No full osds, removing full flag" << dendl;
       remove_flag(CEPH_OSDMAP_FULL);
     }
+
+    if (!mon->pgmon()->pg_map.nearfull_osds.empty()) {
+      dout(5) << "There are near full osds, setting nearfull flag" << dendl;
+      add_flag(CEPH_OSDMAP_NEARFULL);
+    } else if (osdmap.test_flag(CEPH_OSDMAP_NEARFULL)){
+      dout(10) << "No near full osds, removing nearfull flag" << dendl;
+      remove_flag(CEPH_OSDMAP_NEARFULL);
+    }
     if (pending_inc.new_flags != -1 &&
-	(pending_inc.new_flags ^ osdmap.flags) & CEPH_OSDMAP_FULL) {
-      dout(1) << "New setting for CEPH_OSDMAP_FULL -- doing propose" << dendl;
+       (pending_inc.new_flags ^ osdmap.flags) & (CEPH_OSDMAP_FULL | CEPH_OSDMAP_NEARFULL)) {
+      dout(1) << "New setting for" <<
+              (pending_inc.new_flags & CEPH_OSDMAP_FULL ? " CEPH_OSDMAP_FULL" : "") <<
+              (pending_inc.new_flags & CEPH_OSDMAP_NEARFULL ? " CEPH_OSDMAP_NEARFULL" : "")
+              << " -- doing propose" << dendl;
       do_propose = true;
     }
   }
@@ -2920,7 +2955,8 @@ void OSDMonitor::get_health(list<pair<health_status_t,string> >& summary,
     }
 
     // warn about flags
-    if (osdmap.test_flag(CEPH_OSDMAP_PAUSERD |
+    if (osdmap.test_flag(CEPH_OSDMAP_FULL |
+			 CEPH_OSDMAP_PAUSERD |
 			 CEPH_OSDMAP_PAUSEWR |
 			 CEPH_OSDMAP_NOUP |
 			 CEPH_OSDMAP_NODOWN |
@@ -3024,6 +3060,17 @@ void OSDMonitor::get_health(list<pair<health_status_t,string> >& summary,
       }
     }
 
+    // warn about upgrade flags that can be set but are not.
+    if ((osdmap.get_up_osd_features() & CEPH_FEATURE_SERVER_JEWEL) &&
+	       !osdmap.test_flag(CEPH_OSDMAP_REQUIRE_JEWEL)) {
+      string msg = "all OSDs are running jewel or later but the"
+	" 'require_jewel_osds' osdmap flag is not set";
+      summary.push_back(make_pair(HEALTH_WARN, msg));
+      if (detail) {
+	detail->push_back(make_pair(HEALTH_WARN, msg));
+      }
+    }
+
     get_pools_health(summary, detail);
   }
 }
@@ -3223,7 +3270,7 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op)
       rdata.append(osdmap_bl);
       ss << "got osdmap epoch " << p->get_epoch();
     } else if (prefix == "osd getcrushmap") {
-      p->crush->encode(rdata);
+      p->crush->encode(rdata, mon->quorum_features);
       ss << "got crush map from osdmap epoch " << p->get_epoch();
     }
     if (p != &osdmap)
@@ -3315,7 +3362,6 @@ bool OSDMonitor::preprocess_command(MonOpRequestRef op)
             // Drop error, continue to get other daemons' metadata
             dout(4) << "No metadata for osd." << i << dendl;
             r = 0;
-            continue;
           } else if (r < 0) {
             // Unexpected error
             goto reply;
@@ -4376,7 +4422,7 @@ int OSDMonitor::crush_rename_bucket(const string& srcname,
     return ret;
 
   pending_inc.crush.clear();
-  newcrush.encode(pending_inc.crush);
+  newcrush.encode(pending_inc.crush, mon->quorum_features);
   *ss << "renamed bucket " << srcname << " into " << dstname;
   return 0;
 }
@@ -4426,7 +4472,7 @@ int OSDMonitor::crush_ruleset_create_erasure(const string &name,
       return err;
     *ruleset = err;
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     return 0;
   }
 }
@@ -4501,7 +4547,7 @@ bool OSDMonitor::validate_crush_against_features(const CrushWrapper *newcrush,
                                                  stringstream& ss)
 {
   OSDMap::Incremental new_pending = pending_inc;
-  ::encode(*newcrush, new_pending.crush);
+  ::encode(*newcrush, new_pending.crush, mon->quorum_features);
   OSDMap newmap;
   newmap.deepish_copy_from(osdmap);
   newmap.apply_incremental(new_pending);
@@ -4793,18 +4839,11 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid,
     dout(10) << " prepare_pool_size returns " << r << dendl;
     return r;
   }
-  const int64_t minsize = osdmap.crush->get_rule_mask_min_size(crush_ruleset);
-  if ((int64_t)size < minsize) {
-    *ss << "pool size " << size << " is smaller than crush ruleset name "
-        << crush_ruleset_name << " min size " << minsize;
-    return -EINVAL;
-  }
-  const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(crush_ruleset);
-  if ((int64_t)size > maxsize) {
-    *ss << "pool size " << size << " is bigger than crush ruleset name "
-        << crush_ruleset_name << " max size " << maxsize;
+
+  if (!osdmap.crush->check_crush_rule(crush_ruleset, pool_type, size, *ss)) {
     return -EINVAL;
   }
+
   uint32_t stripe_width = 0;
   r = prepare_pool_stripe_width(pool_type, erasure_code_profile, &stripe_width, ss);
   if (r) {
@@ -5148,17 +5187,8 @@ int OSDMonitor::prepare_command_pool_set(map<string,cmd_vartype> &cmdmap,
       ss << "crush ruleset " << n << " does not exist";
       return -ENOENT;
     }
-    const int64_t poolsize = p.get_size();
-    const int64_t minsize = osdmap.crush->get_rule_mask_min_size(n);
-    if (poolsize < minsize) {
-      ss << "pool size " << poolsize << " is smaller than crush ruleset " 
-         << n << " min size " << minsize;
-      return -EINVAL;
-    }
-    const int64_t maxsize = osdmap.crush->get_rule_mask_max_size(n);
-    if (poolsize > maxsize) {
-      ss << "pool size " << poolsize << " is bigger than crush ruleset " 
-         << n << " max size " << maxsize;
+
+    if (!osdmap.crush->check_crush_rule(n, p.get_type(), p.get_size(), ss)) {
       return -EINVAL;
     }
     p.crush_ruleset = n;
@@ -5540,7 +5570,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     }
 
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << "added bucket " << name << " type " << typestr
        << " to crush map";
     goto update;
@@ -5619,7 +5649,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     }
 
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << action << " item id " << osdid << " name '" << name << "' weight "
       << weight << " at location " << loc << " to crush map";
     getline(ss, rs);
@@ -5664,7 +5694,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
       }
       if (err > 0) {
 	pending_inc.crush.clear();
-	newcrush.encode(pending_inc.crush);
+	newcrush.encode(pending_inc.crush, mon->quorum_features);
 	ss << "create-or-move updating item name '" << name << "' weight " << weight
 	   << " at location " << loc << " to crush map";
 	getline(ss, rs);
@@ -5701,7 +5731,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
 	if (err >= 0) {
 	  ss << "moved item id " << id << " name '" << name << "' to location " << loc << " in crush map";
 	  pending_inc.crush.clear();
-	  newcrush.encode(pending_inc.crush);
+	  newcrush.encode(pending_inc.crush, mon->quorum_features);
 	  getline(ss, rs);
 	  wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
 						   get_last_committed() + 1));
@@ -5754,7 +5784,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
 	  ss << "linked item id " << id << " name '" << name
              << "' to location " << loc << " in crush map";
 	  pending_inc.crush.clear();
-	  newcrush.encode(pending_inc.crush);
+	  newcrush.encode(pending_inc.crush, mon->quorum_features);
 	} else {
 	  ss << "cannot link item id " << id << " name '" << name
              << "' to location " << loc;
@@ -5815,7 +5845,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
       }
       if (err == 0) {
 	pending_inc.crush.clear();
-	newcrush.encode(pending_inc.crush);
+	newcrush.encode(pending_inc.crush, mon->quorum_features);
 	ss << "removed item id " << id << " name '" << name << "' from crush map";
 	getline(ss, rs);
 	wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
@@ -5831,7 +5861,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
 
     newcrush.reweight(g_ceph_context);
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << "reweighted crush hierarchy";
     getline(ss, rs);
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
@@ -5868,7 +5898,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     if (err < 0)
       goto reply;
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << "reweighted item id " << id << " name '" << name << "' to " << w
        << " in crush map";
     getline(ss, rs);
@@ -5906,7 +5936,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     if (err < 0)
       goto reply;
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << "reweighted subtree id " << id << " name '" << name << "' to " << w
        << " in crush map";
     getline(ss, rs);
@@ -5946,7 +5976,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     }
 
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << "adjusted tunables profile to " << profile;
     getline(ss, rs);
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
@@ -5986,7 +6016,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     }
 
     pending_inc.crush.clear();
-    newcrush.encode(pending_inc.crush);
+    newcrush.encode(pending_inc.crush, mon->quorum_features);
     ss << "adjusted tunable " << tunable << " to " << value;
     getline(ss, rs);
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
@@ -6027,7 +6057,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
       }
 
       pending_inc.crush.clear();
-      newcrush.encode(pending_inc.crush);
+      newcrush.encode(pending_inc.crush, mon->quorum_features);
     }
     getline(ss, rs);
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
@@ -6239,7 +6269,7 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
       }
 
       pending_inc.crush.clear();
-      newcrush.encode(pending_inc.crush);
+      newcrush.encode(pending_inc.crush, mon->quorum_features);
     }
     getline(ss, rs);
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, 0, rs,
diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc
index 8b4c44b..341d324 100644
--- a/src/mon/PGMonitor.cc
+++ b/src/mon/PGMonitor.cc
@@ -1369,7 +1369,7 @@ inline string percentify(const float& a) {
 //void PGMonitor::dump_object_stat_sum(stringstream& ss, Formatter *f,
 void PGMonitor::dump_object_stat_sum(TextTable &tbl, Formatter *f,
                                      object_stat_sum_t &sum, uint64_t avail,
-                                     float raw_used_rate, bool verbose, const pg_pool_t *pool) const
+                                     float raw_used_rate, bool verbose, const pg_pool_t *pool)
 {
   float curr_object_copies_rate = 0.0;
   if (sum.num_object_copies > 0)
@@ -1392,10 +1392,13 @@ void PGMonitor::dump_object_stat_sum(TextTable &tbl, Formatter *f,
     }
   } else {
     tbl << stringify(si_t(sum.num_bytes));
-    int64_t kb_used = SHIFT_ROUND_UP(sum.num_bytes, 10);
     float used = 0.0;
-    if (pg_map.osd_sum.kb > 0)
-      used = (float)kb_used * raw_used_rate * curr_object_copies_rate / pg_map.osd_sum.kb;
+    if (avail) {
+      used = sum.num_bytes * curr_object_copies_rate;
+      used /= used + avail;
+    } else if (sum.num_bytes) {
+      used = 1.0;
+    }
     tbl << percentify(used*100);
     tbl << si_t(avail);
     tbl << sum.num_objects;
diff --git a/src/mon/PGMonitor.h b/src/mon/PGMonitor.h
index e4081f1..8930993 100644
--- a/src/mon/PGMonitor.h
+++ b/src/mon/PGMonitor.h
@@ -154,11 +154,11 @@ private:
 			  int threshold,
 			  vector<string>& args) const;
 
-  void dump_object_stat_sum(TextTable &tbl, Formatter *f,
-			    object_stat_sum_t &sum,
-			    uint64_t avail,
-			    float raw_used_rate,
-			    bool verbose, const pg_pool_t *pool) const;
+  static void dump_object_stat_sum(TextTable &tbl, Formatter *f,
+				   object_stat_sum_t &sum,
+				   uint64_t avail,
+				   float raw_used_rate,
+				   bool verbose, const pg_pool_t *pool);
 
   int64_t get_rule_avail(OSDMap& osdmap, int ruleno) const;
 
@@ -221,6 +221,11 @@ private:
   // no copying allowed
   PGMonitor(const PGMonitor &rhs);
   PGMonitor &operator=(const PGMonitor &rhs);
+
+  // we don't want to include gtest.h just for FRIEND_TEST
+  friend class pgmonitor_dump_object_stat_sum_0_Test;
+  friend class pgmonitor_dump_object_stat_sum_1_Test;
+  friend class pgmonitor_dump_object_stat_sum_2_Test;
 };
 
 #endif
diff --git a/src/msg/Message.cc b/src/msg/Message.cc
index f84004b..f65f16e 100644
--- a/src/msg/Message.cc
+++ b/src/msg/Message.cc
@@ -182,8 +182,13 @@ void Message::encode(uint64_t features, int crcflags)
 {
   // encode and copy out of *m
   if (empty_payload()) {
+    assert(middle.length() == 0);
     encode_payload(features);
 
+    if (byte_throttler) {
+      byte_throttler->take(payload.length() + middle.length());
+    }
+
     // if the encoder didn't specify past compatibility, we assume it
     // is incompatible.
     if (header.compat_version == 0)
diff --git a/src/msg/Message.h b/src/msg/Message.h
index 25b0372..9ea4536 100644
--- a/src/msg/Message.h
+++ b/src/msg/Message.h
@@ -335,8 +335,9 @@ public:
    */
 
   void clear_payload() {
-    if (byte_throttler)
+    if (byte_throttler) {
       byte_throttler->put(payload.length() + middle.length());
+    }
     payload.clear();
     middle.clear();
   }
@@ -366,10 +367,10 @@ public:
 
   void set_middle(bufferlist& bl) {
     if (byte_throttler)
-      byte_throttler->put(payload.length());
+      byte_throttler->put(middle.length());
     middle.claim(bl, buffer::list::CLAIM_ALLOW_NONSHAREABLE);
     if (byte_throttler)
-      byte_throttler->take(payload.length());
+      byte_throttler->take(middle.length());
   }
   bufferlist& get_middle() { return middle; }
 
@@ -470,7 +471,7 @@ extern Message *decode_message(CephContext *cct, int crcflags,
 			       ceph_msg_header &header,
 			       ceph_msg_footer& footer, bufferlist& front,
 			       bufferlist& middle, bufferlist& data);
-inline ostream& operator<<(ostream& out, Message& m) {
+inline ostream& operator<<(ostream &out, const Message &m) {
   m.print(out);
   if (m.get_header().version)
     out << " v" << m.get_header().version;
diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h
index 3acad77..0e176b9 100644
--- a/src/msg/msg_types.h
+++ b/src/msg/msg_types.h
@@ -251,7 +251,21 @@ struct entity_addr_t {
     return addr6;
   }
 
-  bool set_sockaddr(struct sockaddr *sa)
+  const sockaddr *get_sockaddr() const {
+    return (const sockaddr *)&addr4;
+  }
+  size_t get_sockaddr_len() const {
+    switch (addr.ss_family) {
+    case AF_INET:
+      return sizeof(addr4);
+      break;
+    case AF_INET6:
+      return sizeof(addr6);
+      break;
+    }
+    return sizeof(addr);
+  }
+  bool set_sockaddr(const struct sockaddr *sa)
   {
     switch (sa->sa_family) {
     case AF_INET:
@@ -266,6 +280,10 @@ struct entity_addr_t {
     return true;
   }
 
+  sockaddr_storage get_sockaddr_storage() const {
+    return addr;
+  }
+
   void set_in4_quad(int pos, int val) {
     addr4.sin_family = AF_INET;
     unsigned char *ipq = (unsigned char*)&addr4.sin_addr.s_addr;
diff --git a/src/msg/simple/Pipe.cc b/src/msg/simple/Pipe.cc
index 6d72754..cfb1986 100644
--- a/src/msg/simple/Pipe.cc
+++ b/src/msg/simple/Pipe.cc
@@ -891,7 +891,7 @@ int Pipe::connect()
   pipe_lock.Unlock();
   
   char tag = -1;
-  int rc;
+  int rc = -1;
   struct msghdr msg;
   struct iovec msgvec[2];
   int msglen;
@@ -909,7 +909,8 @@ int Pipe::connect()
   // create socket?
   sd = ::socket(peer_addr.get_family(), SOCK_STREAM, 0);
   if (sd < 0) {
-    lderr(msgr->cct) << "connect couldn't created socket " << cpp_strerror(errno) << dendl;
+    rc = -errno;
+    lderr(msgr->cct) << "connect couldn't created socket " << cpp_strerror(rc) << dendl;
     goto fail;
   }
 
@@ -921,15 +922,17 @@ int Pipe::connect()
   ldout(msgr->cct,10) << "connecting to " << peer_addr << dendl;
   rc = ::connect(sd, (sockaddr*)&peer_addr.addr, peer_addr.addr_size());
   if (rc < 0) {
+    rc = -errno;
     ldout(msgr->cct,2) << "connect error " << peer_addr
-	     << ", " << cpp_strerror(errno) << dendl;
+	     << ", " << cpp_strerror(rc) << dendl;
     goto fail;
   }
 
   // verify banner
   // FIXME: this should be non-blocking, or in some other way verify the banner as we get it.
-  if (tcp_read((char*)&banner, strlen(CEPH_BANNER)) < 0) {
-    ldout(msgr->cct,2) << "connect couldn't read banner, " << cpp_strerror(errno) << dendl;
+  rc = tcp_read((char*)&banner, strlen(CEPH_BANNER));
+  if (rc < 0) {
+    ldout(msgr->cct,2) << "connect couldn't read banner, " << cpp_strerror(rc) << dendl;
     goto fail;
   }
   if (memcmp(banner, CEPH_BANNER, strlen(CEPH_BANNER))) {
@@ -943,8 +946,9 @@ int Pipe::connect()
   msg.msg_iov = msgvec;
   msg.msg_iovlen = 1;
   msglen = msgvec[0].iov_len;
-  if (do_sendmsg(&msg, msglen)) {
-    ldout(msgr->cct,2) << "connect couldn't write my banner, " << cpp_strerror(errno) << dendl;
+  rc = do_sendmsg(&msg, msglen);
+  if (rc < 0) {
+    ldout(msgr->cct,2) << "connect couldn't write my banner, " << cpp_strerror(rc) << dendl;
     goto fail;
   }
 
@@ -958,8 +962,9 @@ int Pipe::connect()
 #endif
     addrbl.push_back(std::move(p));
   }
-  if (tcp_read(addrbl.c_str(), addrbl.length()) < 0) {
-    ldout(msgr->cct,2) << "connect couldn't read peer addrs, " << cpp_strerror(errno) << dendl;
+  rc = tcp_read(addrbl.c_str(), addrbl.length());
+  if (rc < 0) {
+    ldout(msgr->cct,2) << "connect couldn't read peer addrs, " << cpp_strerror(rc) << dendl;
     goto fail;
   }
   {
@@ -995,8 +1000,9 @@ int Pipe::connect()
   msg.msg_iov = msgvec;
   msg.msg_iovlen = 1;
   msglen = msgvec[0].iov_len;
-  if (do_sendmsg(&msg, msglen)) {
-    ldout(msgr->cct,2) << "connect couldn't write my addr, " << cpp_strerror(errno) << dendl;
+  rc = do_sendmsg(&msg, msglen);
+  if (rc < 0) {
+    ldout(msgr->cct,2) << "connect couldn't write my addr, " << cpp_strerror(rc) << dendl;
     goto fail;
   }
   ldout(msgr->cct,10) << "connect sent my addr " << msgr->my_inst.addr << dendl;
@@ -1036,15 +1042,17 @@ int Pipe::connect()
 
     ldout(msgr->cct,10) << "connect sending gseq=" << gseq << " cseq=" << cseq
 	     << " proto=" << connect.protocol_version << dendl;
-    if (do_sendmsg(&msg, msglen)) {
-      ldout(msgr->cct,2) << "connect couldn't write gseq, cseq, " << cpp_strerror(errno) << dendl;
+    rc = do_sendmsg(&msg, msglen);
+    if (rc < 0) {
+      ldout(msgr->cct,2) << "connect couldn't write gseq, cseq, " << cpp_strerror(rc) << dendl;
       goto fail;
     }
 
     ldout(msgr->cct,20) << "connect wrote (self +) cseq, waiting for reply" << dendl;
     ceph_msg_connect_reply reply;
-    if (tcp_read((char*)&reply, sizeof(reply)) < 0) {
-      ldout(msgr->cct,2) << "connect read reply " << cpp_strerror(errno) << dendl;
+    rc = tcp_read((char*)&reply, sizeof(reply));
+    if (rc < 0) {
+      ldout(msgr->cct,2) << "connect read reply " << cpp_strerror(rc) << dendl;
       goto fail;
     }
 
@@ -1064,8 +1072,9 @@ int Pipe::connect()
     if (reply.authorizer_len) {
       ldout(msgr->cct,10) << "reply.authorizer_len=" << reply.authorizer_len << dendl;
       bufferptr bp = buffer::create(reply.authorizer_len);
-      if (tcp_read(bp.c_str(), reply.authorizer_len) < 0) {
-        ldout(msgr->cct,10) << "connect couldn't read connect authorizer_reply" << dendl;
+      rc = tcp_read(bp.c_str(), reply.authorizer_len);
+      if (rc < 0) {
+        ldout(msgr->cct,10) << "connect couldn't read connect authorizer_reply" << cpp_strerror(rc) << dendl;
 	goto fail;
       }
       authorizer_reply.push_back(bp);
@@ -1156,8 +1165,9 @@ int Pipe::connect()
       if (reply.tag == CEPH_MSGR_TAG_SEQ) {
         ldout(msgr->cct,10) << "got CEPH_MSGR_TAG_SEQ, reading acked_seq and writing in_seq" << dendl;
         uint64_t newly_acked_seq = 0;
-        if (tcp_read((char*)&newly_acked_seq, sizeof(newly_acked_seq)) < 0) {
-          ldout(msgr->cct,2) << "connect read error on newly_acked_seq" << dendl;
+        rc = tcp_read((char*)&newly_acked_seq, sizeof(newly_acked_seq));
+        if (rc < 0) {
+          ldout(msgr->cct,2) << "connect read error on newly_acked_seq" << cpp_strerror(rc) << dendl;
           goto fail_locked;
         }
 	ldout(msgr->cct,2) << " got newly_acked_seq " << newly_acked_seq
@@ -1238,7 +1248,7 @@ int Pipe::connect()
 
  stop_locked:
   delete authorizer;
-  return -1;
+  return rc;
 }
 
 void Pipe::register_pipe()
@@ -2218,16 +2228,16 @@ int Pipe::do_sendmsg(struct msghdr *msg, unsigned len, bool more)
 #endif
     if (r == 0) 
       ldout(msgr->cct,10) << "do_sendmsg hmm do_sendmsg got r==0!" << dendl;
-    if (r < 0) { 
-      ldout(msgr->cct,1) << "do_sendmsg error " << cpp_strerror(errno) << dendl;
+    if (r < 0) {
+      r = -errno; 
+      ldout(msgr->cct,1) << "do_sendmsg error " << cpp_strerror(r) << dendl;
       restore_sigpipe();
-      return -1;
+      return r;
     }
     if (state == STATE_CLOSED) {
       ldout(msgr->cct,10) << "do_sendmsg oh look, state == CLOSED, giving up" << dendl;
-      errno = EINTR;
       restore_sigpipe();
-      return -1; // close enough
+      return -EINTR; // close enough
     }
 
     len -= r;
@@ -2449,7 +2459,7 @@ int Pipe::write_message(const ceph_msg_header& header, const ceph_msg_footer& fo
 int Pipe::tcp_read(char *buf, unsigned len)
 {
   if (sd < 0)
-    return -1;
+    return -EINVAL;
 
   while (len > 0) {
 
@@ -2478,7 +2488,7 @@ int Pipe::tcp_read(char *buf, unsigned len)
 int Pipe::tcp_read_wait()
 {
   if (sd < 0)
-    return -1;
+    return -EINVAL;
   struct pollfd pfd;
   short evmask;
   pfd.fd = sd;
@@ -2490,8 +2500,11 @@ int Pipe::tcp_read_wait()
   if (has_pending_data())
     return 0;
 
-  if (poll(&pfd, 1, msgr->timeout) <= 0)
-    return -1;
+  int r = poll(&pfd, 1, msgr->timeout);
+  if (r < 0)
+    return -errno;
+  if (r == 0)
+    return -EAGAIN;
 
   evmask = POLLERR | POLLHUP | POLLNVAL;
 #if defined(__linux__)
diff --git a/src/ocf/Makefile.in b/src/ocf/Makefile.in
index f3f34ff..f901ad5 100644
--- a/src/ocf/Makefile.in
+++ b/src/ocf/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -15,7 +15,17 @@
 @SET_MAKE@
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -80,8 +90,6 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = src/ocf
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
-	$(srcdir)/rbd.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/ac_prog_jar.m4 \
@@ -100,6 +108,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/acconfig.h
 CONFIG_CLEAN_FILES = rbd
@@ -153,13 +162,13 @@ am__can_run_installinfo = \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/rbd.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -245,6 +254,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -343,6 +353,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -382,7 +393,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/ocf/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign src/ocf/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -597,6 +607,8 @@ uninstall-am: uninstall-raSCRIPTS
 	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
 	ps ps-am tags-am uninstall uninstall-am uninstall-raSCRIPTS
 
+.PRECIOUS: Makefile
+
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/src/os/filestore/CollectionIndex.h b/src/os/filestore/CollectionIndex.h
index 942dc23..cbdc5d6 100644
--- a/src/os/filestore/CollectionIndex.h
+++ b/src/os/filestore/CollectionIndex.h
@@ -190,6 +190,8 @@ protected:
       uint64_t expected_num_objs  ///< [in] expected number of objects this collection has
       ) { assert(0); return 0; }
 
+  virtual int apply_layout_settings() { assert(0); return 0; }
+
   /// Virtual destructor
   virtual ~CollectionIndex() {}
 };
diff --git a/src/os/filestore/FileJournal.cc b/src/os/filestore/FileJournal.cc
index 9e40310..4391a2e 100644
--- a/src/os/filestore/FileJournal.cc
+++ b/src/os/filestore/FileJournal.cc
@@ -89,13 +89,17 @@ int FileJournal::_open(bool forwrite, bool create)
 
   if (S_ISBLK(st.st_mode)) {
     ret = _open_block_device();
-  } else {
+  } else if (S_ISREG(st.st_mode)) {
     if (aio && !force_aio) {
       derr << "FileJournal::_open: disabling aio for non-block journal.  Use "
 	   << "journal_force_aio to force use of aio anyway" << dendl;
       aio = false;
     }
     ret = _open_file(st.st_size, st.st_blksize, create);
+  } else {
+    derr << "FileJournal::_open: wrong journal file type: " << st.st_mode
+	 << dendl;
+    ret = -EINVAL;
   }
 
   if (ret)
@@ -127,6 +131,7 @@ int FileJournal::_open(bool forwrite, bool create)
 
  out_fd:
   VOID_TEMP_FAILURE_RETRY(::close(fd));
+  fd = -1;
   return ret;
 }
 
diff --git a/src/os/filestore/FileStore.cc b/src/os/filestore/FileStore.cc
index 9e183a6..ce1cfe2 100644
--- a/src/os/filestore/FileStore.cc
+++ b/src/os/filestore/FileStore.cc
@@ -5731,6 +5731,20 @@ void FileStore::set_xattr_limits_via_conf()
   }
 }
 
+int FileStore::apply_layout_settings(const coll_t &cid)
+{
+  dout(20) << __func__ << " " << cid << dendl;
+  Index index;
+  int r = get_index(cid, &index);
+  if (r < 0) {
+    dout(10) << "Error getting index for " << cid << ": " << cpp_strerror(r)
+	     << dendl;
+    return r;
+  }
+
+  return index->apply_layout_settings();
+}
+
 // -- FSSuperblock --
 
 void FSSuperblock::encode(bufferlist &bl) const
diff --git a/src/os/filestore/FileStore.h b/src/os/filestore/FileStore.h
index a5cd75d..d1fd595 100644
--- a/src/os/filestore/FileStore.h
+++ b/src/os/filestore/FileStore.h
@@ -686,6 +686,8 @@ public:
   void dump_stop();
   void dump_transactions(vector<Transaction>& ls, uint64_t seq, OpSequencer *osr);
 
+  virtual int apply_layout_settings(const coll_t &cid);
+
 private:
   void _inject_failure();
 
diff --git a/src/os/filestore/HashIndex.cc b/src/os/filestore/HashIndex.cc
index b1bf702..1839a04 100644
--- a/src/os/filestore/HashIndex.cc
+++ b/src/os/filestore/HashIndex.cc
@@ -19,6 +19,7 @@
 
 #include "HashIndex.h"
 
+#include "common/errno.h"
 #include "common/debug.h"
 #define dout_subsys ceph_subsys_filestore
 
@@ -303,6 +304,59 @@ int HashIndex::_split(
     &mkdirred);
 }
 
+int HashIndex::split_dirs(const vector<string> &path) {
+  dout(20) << __func__ << " " << path << dendl;
+  subdir_info_s info;
+  int r = get_info(path, &info);
+  if (r < 0) {
+    dout(10) << "error looking up info for " << path << ": "
+	     << cpp_strerror(r) << dendl;
+    return r;
+  }
+
+  if (must_split(info)) {
+    r = initiate_split(path, info);
+    if (r < 0) {
+      dout(10) << "error initiating split on " << path << ": "
+	       << cpp_strerror(r) << dendl;
+      return r;
+    }
+
+    r = complete_split(path, info);
+    if (r < 0) {
+      dout(10) << "error completing split on " << path << ": "
+	       << cpp_strerror(r) << dendl;
+      return r;
+    }
+  }
+
+  vector<string> subdirs;
+  r = list_subdirs(path, &subdirs);
+  if (r < 0) {
+    dout(10) << "error listing subdirs of " << path << ": "
+	     << cpp_strerror(r) << dendl;
+    return r;
+  }
+  for (vector<string>::const_iterator it = subdirs.begin();
+       it != subdirs.end(); ++it) {
+    vector<string> subdir_path(path);
+    subdir_path.push_back(*it);
+    r = split_dirs(subdir_path);
+    if (r < 0) {
+      return r;
+    }
+  }
+
+  return r;
+}
+
+int HashIndex::apply_layout_settings() {
+  vector<string> path;
+  dout(10) << __func__ << " split multiple = " << split_multiplier
+	   << " merge threshold = " << merge_threshold << dendl;
+  return split_dirs(path);
+}
+
 int HashIndex::_init() {
   subdir_info_s info;
   vector<string> path;
@@ -1011,7 +1065,7 @@ int HashIndex::list_by_hash_bitwise(
 	}
 	if (cmp_bitwise(j->second, end) >= 0) {
 	  if (next)
-	    *next = ghobject_t::get_max();
+	    *next = j->second;
 	  return 0;
 	}
 	if (!next || cmp_bitwise(j->second, *next) >= 0) {
@@ -1077,7 +1131,7 @@ int HashIndex::list_by_hash_nibblewise(
 	}
 	if (cmp_nibblewise(j->second, end) >= 0) {
 	  if (next)
-	    *next = ghobject_t::get_max();
+	    *next = j->second;
 	  return 0;
 	}
 	if (!next || cmp_nibblewise(j->second, *next) >= 0) {
diff --git a/src/os/filestore/HashIndex.h b/src/os/filestore/HashIndex.h
index 461eddc..73150c7 100644
--- a/src/os/filestore/HashIndex.h
+++ b/src/os/filestore/HashIndex.h
@@ -160,6 +160,9 @@ public:
     CollectionIndex* dest
     );
 
+  /// @see CollectionIndex
+  virtual int apply_layout_settings();
+
 protected:
   int _init();
 
@@ -432,6 +435,9 @@ private:
   /// Create the given levels of sub directories from the given root.
   /// The contents of *path* is not changed after calling this function.
   int recursive_create_path(vector<string>& path, int level);
+
+  /// split each dir below the given path
+  int split_dirs(const vector<string> &path);
 };
 
 #endif
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 8eb2397..6b503a5 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -4057,14 +4057,14 @@ void OSD::heartbeat_check()
     if (p->second.is_unhealthy(cutoff)) {
       if (p->second.last_rx_back == utime_t() ||
 	  p->second.last_rx_front == utime_t()) {
-	derr << "heartbeat_check: no reply from osd." << p->first
-	     << " ever on either front or back, first ping sent " << p->second.first_tx
-	     << " (cutoff " << cutoff << ")" << dendl;
+	derr << "heartbeat_check: no reply from " << p->second.con_front->get_peer_addr().get_sockaddr()
+	     << " osd." << p->first << " ever on either front or back, first ping sent "
+	     << p->second.first_tx << " (cutoff " << cutoff << ")" << dendl;
 	// fail
 	failure_queue[p->first] = p->second.last_tx;
       } else {
-	derr << "heartbeat_check: no reply from osd." << p->first
-	     << " since back " << p->second.last_rx_back
+	derr << "heartbeat_check: no reply from " << p->second.con_front->get_peer_addr().get_sockaddr()
+	     << " osd." << p->first << " since back " << p->second.last_rx_back
 	     << " front " << p->second.last_rx_front
 	     << " (cutoff " << cutoff << ")" << dendl;
 	// fail
diff --git a/src/osd/OSD.h b/src/osd/OSD.h
index 79a0d17..1d918ff 100644
--- a/src/osd/OSD.h
+++ b/src/osd/OSD.h
@@ -1598,6 +1598,20 @@ public:
   struct HeartbeatDispatcher : public Dispatcher {
     OSD *osd;
     explicit HeartbeatDispatcher(OSD *o) : Dispatcher(o->cct), osd(o) {}
+
+    bool ms_can_fast_dispatch_any() const { return true; }
+    bool ms_can_fast_dispatch(Message *m) const {
+      switch (m->get_type()) {
+	case CEPH_MSG_PING:
+	case MSG_OSD_PING:
+          return true;
+	default:
+          return false;
+	}
+    }
+    void ms_fast_dispatch(Message *m) {
+      osd->heartbeat_dispatch(m);
+    }
     bool ms_dispatch(Message *m) {
       return osd->heartbeat_dispatch(m);
     }
diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc
index 7961d2f..d2fb34f 100644
--- a/src/osd/OSDMap.cc
+++ b/src/osd/OSDMap.cc
@@ -1154,8 +1154,8 @@ void OSDMap::dedup(const OSDMap *o, OSDMap *n)
 
   // does crush match?
   bufferlist oc, nc;
-  ::encode(*o->crush, oc);
-  ::encode(*n->crush, nc);
+  ::encode(*o->crush, oc, CEPH_FEATURES_SUPPORTED_DEFAULT);
+  ::encode(*n->crush, nc, CEPH_FEATURES_SUPPORTED_DEFAULT);
   if (oc.contents_equal(nc)) {
     n->crush = o->crush;
   }
@@ -1826,7 +1826,7 @@ void OSDMap::encode_client_old(bufferlist& bl) const
 
   // crush
   bufferlist cbl;
-  crush->encode(cbl);
+  crush->encode(cbl, 0 /* legacy (no) features */);
   ::encode(cbl, bl);
 }
 
@@ -1861,7 +1861,7 @@ void OSDMap::encode_classic(bufferlist& bl, uint64_t features) const
 
   // crush
   bufferlist cbl;
-  crush->encode(cbl);
+  crush->encode(cbl, 0 /* legacy (no) features */);
   ::encode(cbl, bl);
 
   // extended
@@ -1929,7 +1929,7 @@ void OSDMap::encode(bufferlist& bl, uint64_t features) const
 
     // crush
     bufferlist cbl;
-    crush->encode(cbl);
+    crush->encode(cbl, features);
     ::encode(cbl, bl);
     ::encode(erasure_code_profiles, bl);
     ENCODE_FINISH(bl); // client-usable data
@@ -2385,6 +2385,8 @@ string OSDMap::get_flag_string(unsigned f)
     s += ",notieragent";
   if (f & CEPH_OSDMAP_SORTBITWISE)
     s += ",sortbitwise";
+  if (f & CEPH_OSDMAP_REQUIRE_JEWEL)
+    s += ",require_jewel_osds";
   if (s.length())
     s.erase(0, 1);
   return s;
diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h
index affd4c3..602b991 100644
--- a/src/osd/OSDMap.h
+++ b/src/osd/OSDMap.h
@@ -488,9 +488,13 @@ public:
     assert(exists(osd));
     return osd_addrs->hb_front_addr[osd] ? *osd_addrs->hb_front_addr[osd] : osd_addrs->blank;
   }
+  entity_inst_t get_most_recent_inst(int osd) const {
+    assert(exists(osd));
+    return entity_inst_t(entity_name_t::OSD(osd), get_addr(osd));
+  }
   entity_inst_t get_inst(int osd) const {
     assert(is_up(osd));
-    return entity_inst_t(entity_name_t::OSD(osd), get_addr(osd));
+    return get_most_recent_inst(osd);
   }
   entity_inst_t get_cluster_inst(int osd) const {
     assert(is_up(osd));
diff --git a/src/osd/PG.cc b/src/osd/PG.cc
index 69331a5..39b5bf8 100644
--- a/src/osd/PG.cc
+++ b/src/osd/PG.cc
@@ -1328,26 +1328,7 @@ bool PG::choose_acting(pg_shard_t &auth_log_shard_id, bool *history_les_bound)
     return false;
   }
 
-  if ((up.size() &&
-      !all_info.find(up_primary)->second.is_incomplete() &&
-      all_info.find(up_primary)->second.last_update >=
-       auth_log_shard->second.log_tail) &&
-      auth_log_shard->second.is_incomplete()) {
-    map<pg_shard_t, pg_info_t> complete_infos;
-    for (map<pg_shard_t, pg_info_t>::const_iterator i = all_info.begin();
-	 i != all_info.end();
-	 ++i) {
-      if (!i->second.is_incomplete())
-	complete_infos.insert(*i);
-    }
-    map<pg_shard_t, pg_info_t>::const_iterator i = find_best_info(
-      complete_infos,
-      history_les_bound);
-    if (i != complete_infos.end()) {
-      auth_log_shard = all_info.find(i->first);
-    }
-  }
-
+  assert(!auth_log_shard->second.is_incomplete());
   auth_log_shard_id = auth_log_shard->first;
 
   // Determine if compatibility needed
@@ -2553,11 +2534,11 @@ void PG::_update_calc_stats()
 
     // a misplaced object is not stored on the correct OSD
     uint64_t misplaced = 0;
-    unsigned i = 0;
     unsigned in_place = 0;
-    for (vector<int>::iterator p = up.begin(); p != up.end(); ++p, ++i) {
-      pg_shard_t s(*p,
-		   pool.info.ec_pool() ? shard_id_t(i) : shard_id_t::NO_SHARD);
+    for (set<pg_shard_t>::const_iterator p = upset.begin();
+	 p != upset.end();
+	 ++p) {
+      const pg_shard_t &s = *p;
       if (actingset.count(s)) {
 	++in_place;
       } else {
@@ -3482,10 +3463,16 @@ void PG::sub_op_scrub_map(OpRequestRef op)
   dout(10) << " got " << m->from << " scrub map" << dendl;
   bufferlist::iterator p = m->get_data().begin();
 
-  scrubber.received_maps[m->from].decode(p, info.pgid.pool());
+  ScrubMap &map = scrubber.received_maps[m->from];
+  map.reset_bitwise(get_sort_bitwise());
+  map.decode(p, info.pgid.pool());
   dout(10) << "map version is "
-	     << scrubber.received_maps[m->from].valid_through
-	     << dendl;
+	   << map.valid_through
+	   << dendl;
+
+  // Account for http://tracker.ceph.com/issues/17491
+  if (!map.objects.empty() && map.objects.rbegin()->first == scrubber.end)
+    map.objects.erase(scrubber.end);
 
   --scrubber.waiting_on;
   scrubber.waiting_on_whom.erase(m->from);
@@ -4078,6 +4065,8 @@ void PG::chunky_scrub(ThreadPool::TPHandle &handle)
       case PG::Scrubber::INACTIVE:
         dout(10) << "scrub start" << dendl;
 
+	scrubber.cleaned_meta_map.reset_bitwise(get_sort_bitwise());
+
         publish_stats_to_osd();
         scrubber.epoch_start = info.history.same_interval_since;
         scrubber.active = true;
@@ -4118,59 +4107,59 @@ void PG::chunky_scrub(ThreadPool::TPHandle &handle)
         scrubber.received_maps.clear();
 
         {
-	  hobject_t candidate_end;
-
-          // get the start and end of our scrub chunk
-          //
-          // start and end need to lie on a hash boundary. We test for this by
-          // requesting a list and searching backward from the end looking for a
-          // boundary. If there's no boundary, we request a list after the first
-          // list, and so forth.
-
-          bool boundary_found = false;
+          /* get the start and end of our scrub chunk
+	   *
+	   * Our scrub chunk has an important restriction we're going to need to
+	   * respect. We can't let head or snapdir be start or end.
+	   * Using a half-open interval means that if end == head|snapdir,
+	   * we'd scrub/lock head and the clone right next to head in different
+	   * chunks which would allow us to miss clones created between
+	   * scrubbing that chunk and scrubbing the chunk including head.
+	   * This isn't true for any of the other clones since clones can
+	   * only be created "just to the left of" head.  There is one exception
+	   * to this: promotion of clones which always happens to the left of the
+	   * left-most clone, but promote_object checks the scrubber in that
+	   * case, so it should be ok.  Also, it's ok to "miss" clones at the
+	   * left end of the range if we are a tier because they may legitimately
+	   * not exist (see _scrub).
+	   */
+	  unsigned min = MAX(3, cct->_conf->osd_scrub_chunk_min);
           hobject_t start = scrubber.start;
-          unsigned loop = 0;
-          while (!boundary_found) {
-            vector<hobject_t> objects;
-            ret = get_pgbackend()->objects_list_partial(
-	      start,
-	      cct->_conf->osd_scrub_chunk_min,
-	      cct->_conf->osd_scrub_chunk_max,
-	      &objects,
-	      &candidate_end);
-            assert(ret >= 0);
-
-            // in case we don't find a boundary: start again at the end
-            start = candidate_end;
-
-            // special case: reached end of file store, implicitly a boundary
-            if (objects.empty()) {
-              break;
-            }
-
-            // search backward from the end looking for a boundary
-            objects.push_back(candidate_end);
-            while (!boundary_found && objects.size() > 1) {
-              hobject_t end = objects.back().get_boundary();
-              objects.pop_back();
-
-              if (objects.back().get_hash() != end.get_hash()) {
-                candidate_end = end;
-                boundary_found = true;
-              }
-            }
-
-            // reset handle once in a while, the search maybe takes long.
-            if (++loop >= g_conf->osd_loop_before_reset_tphandle) {
-              handle.reset_tp_timeout();
-              loop = 0;
-            }
-          }
+	  hobject_t candidate_end;
+	  vector<hobject_t> objects;
+	  ret = get_pgbackend()->objects_list_partial(
+	    start,
+	    min,
+	    MAX(min, cct->_conf->osd_scrub_chunk_max),
+	    &objects,
+	    &candidate_end);
+	  assert(ret >= 0);
+
+	  if (!objects.empty()) {
+	    hobject_t back = objects.back();
+	    while (candidate_end.has_snapset() &&
+		      candidate_end.get_head() == back.get_head()) {
+	      candidate_end = back;
+	      objects.pop_back();
+	      if (objects.empty()) {
+		assert(0 ==
+		       "Somehow we got more than 2 objects which"
+		       "have the same head but are not clones");
+	      }
+	      back = objects.back();
+	    }
+	    if (candidate_end.has_snapset()) {
+	      assert(candidate_end.get_head() != back.get_head());
+	      candidate_end = candidate_end.get_object_boundary();
+	    }
+	  } else {
+	    assert(candidate_end.is_max());
+	  }
 
 	  if (!_range_available_for_scrub(scrubber.start, candidate_end)) {
 	    // we'll be requeued by whatever made us unavailable for scrub
 	    dout(10) << __func__ << ": scrub blocked somewhere in range "
-		     << "[" << scrubber.start << ", " << candidate_end << ")"
+		     << "[" << scrubber.start << ", " << candidate_end << "]"
 		     << dendl;
 	    done = true;
 	    break;
@@ -4184,13 +4173,15 @@ void PG::chunky_scrub(ThreadPool::TPHandle &handle)
              p != pg_log.get_log().log.rend();
              ++p) {
           if (cmp(p->soid, scrubber.start, get_sort_bitwise()) >= 0 &&
-	      cmp(p->soid, scrubber.end, get_sort_bitwise()) < 0) {
+	      cmp(p->soid, scrubber.end, get_sort_bitwise()) <= 0) {
+	    // inclusive upper bound, @see write_blocked_by_scrub
             scrubber.subset_last_update = p->version;
             break;
           }
         }
 
-        // ask replicas to wait until last_update_applied >= scrubber.subset_last_update and then scan
+        // ask replicas to wait until
+        // last_update_applied >= scrubber.subset_last_update and then scan
         scrubber.waiting_on_whom.insert(pg_whoami);
         ++scrubber.waiting_on;
 
@@ -4337,7 +4328,7 @@ void PG::scrub_compare_maps()
   dout(10) << __func__ << " has maps, analyzing" << dendl;
 
   // construct authoritative scrub map for type specific scrubbing
-  ScrubMap authmap(scrubber.primary_scrubmap);
+  scrubber.cleaned_meta_map.insert(scrubber.primary_scrubmap);
   map<hobject_t, pair<uint32_t, uint32_t>, hobject_t::BitwiseComparator> missing_digest;
 
   if (acting.size() > 1) {
@@ -4399,13 +4390,34 @@ void PG::scrub_compare_maps()
     for (map<hobject_t, list<pg_shard_t>, hobject_t::BitwiseComparator>::iterator i = authoritative.begin();
 	 i != authoritative.end();
 	 ++i) {
-      authmap.objects.erase(i->first);
-      authmap.objects.insert(*(maps[i->second.back()]->objects.find(i->first)));
+      scrubber.cleaned_meta_map.objects.erase(i->first);
+      scrubber.cleaned_meta_map.objects.insert(
+	*(maps[i->second.back()]->objects.find(i->first))
+	);
+    }
+  }
+
+  ScrubMap for_meta_scrub(get_sort_bitwise());
+  if (scrubber.end.is_max() ||
+      scrubber.cleaned_meta_map.objects.empty()) {
+    scrubber.cleaned_meta_map.swap(for_meta_scrub);
+  } else {
+    auto iter = scrubber.cleaned_meta_map.objects.end();
+    --iter; // not empty, see if clause
+    auto begin = scrubber.cleaned_meta_map.objects.begin();
+    while (iter != begin) {
+      auto next = iter--;
+      if (next->first.get_head() != iter->first.get_head()) {
+	++iter;
+	break;
+      }
     }
+    for_meta_scrub.objects.insert(begin, iter);
+    scrubber.cleaned_meta_map.objects.erase(begin, iter);
   }
 
   // ok, do the pg-type specific scrubbing
-  _scrub(authmap, missing_digest);
+  _scrub(for_meta_scrub, missing_digest);
   if (!scrubber.store->empty()) {
     if (state_test(PG_STATE_REPAIR)) {
       dout(10) << __func__ << ": discarding scrub results" << dendl;
diff --git a/src/osd/PG.h b/src/osd/PG.h
index 10a81f8..f24554a 100644
--- a/src/osd/PG.h
+++ b/src/osd/PG.h
@@ -547,7 +547,7 @@ public:
   pg_shard_t pg_whoami;
   pg_shard_t up_primary;
   vector<int> up, acting, want_acting;
-  set<pg_shard_t> actingbackfill, actingset;
+  set<pg_shard_t> actingbackfill, actingset, upset;
   map<pg_shard_t,eversion_t> peer_last_complete_ondisk;
   eversion_t  min_last_complete_ondisk;  // up: min over last_complete_ondisk, peer_last_complete_ondisk
   eversion_t  pg_trim_to;
@@ -1169,6 +1169,9 @@ public:
     // Map from object with errors to good peers
     map<hobject_t, list<pair<ScrubMap::object, pg_shard_t> >, hobject_t::BitwiseComparator> authoritative;
 
+    // Cleaned map pending snap metadata scrub
+    ScrubMap cleaned_meta_map;
+
     // digest updates which we are waiting on
     int num_digest_updates_pending;
 
@@ -1227,11 +1230,28 @@ public:
 
     bool is_chunky_scrub_active() const { return state != INACTIVE; }
 
-    // classic (non chunk) scrubs block all writes
-    // chunky scrubs only block writes to a range
+    /* We use an inclusive upper bound here because the replicas scan .end
+     * as well in hammer (see http://tracker.ceph.com/issues/17491).
+     *
+     * The boundary can only be
+     * 1) Not an object (object boundary) or
+     * 2) A clone
+     * In case 1), it doesn't matter.  In case 2), we might fail to
+     * wait for an un-applied snap trim to complete, or fail to block an
+     * eviction on a tail object.  In such a case the replica might
+     * erroneously detect a snap_mapper/attr mismatch and "fix" the
+     * snap_mapper to the old value.
+     *
+     * @see _range_available_for_scrub
+     * @see chunk_scrub (the part where it determines the last relelvant log
+     *      entry)
+     *
+     * TODO: switch this logic back to an exclusive upper bound once the
+     * replicas don't scan the upper boundary
+     */
     bool write_blocked_by_scrub(const hobject_t &soid, bool sort_bitwise) {
       if (cmp(soid, start, sort_bitwise) >= 0 &&
-	  cmp(soid, end, sort_bitwise) < 0)
+	  cmp(soid, end, sort_bitwise) <= 0)
 	return true;
 
       return false;
@@ -1267,6 +1287,7 @@ public:
       missing.clear();
       authoritative.clear();
       num_digest_updates_pending = 0;
+      cleaned_meta_map = ScrubMap();
     }
 
     void create_results(const hobject_t& obj);
@@ -2145,7 +2166,15 @@ public:
 	    acting[i],
 	    pool.info.ec_pool() ? shard_id_t(i) : shard_id_t::NO_SHARD));
     }
+    upset.clear();
     up = newup;
+    for (uint8_t i = 0; i < up.size(); ++i) {
+      if (up[i] != CRUSH_ITEM_NONE)
+	upset.insert(
+	  pg_shard_t(
+	    up[i],
+	    pool.info.ec_pool() ? shard_id_t(i) : shard_id_t::NO_SHARD));
+    }
     if (!pool.info.ec_pool()) {
       up_primary = pg_shard_t(new_up_primary, shard_id_t::NO_SHARD);
       primary = pg_shard_t(new_acting_primary, shard_id_t::NO_SHARD);
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index 6dfa97b..4b879d9 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -8700,6 +8700,8 @@ void ReplicatedPG::submit_log_entries(
 	  });
     }
   }
+  t.register_on_applied(
+    new C_OSD_OnApplied{this, get_osdmap()->get_epoch(), info.last_update});
   int r = osd->store->queue_transaction(osr.get(), std::move(t), NULL);
   assert(r == 0);
 }
@@ -9685,7 +9687,7 @@ void ReplicatedPG::do_update_log_missing(OpRequestRef &op)
   append_log_entries_update_missing(m->entries, t);
   // TODO FIX
 
-  Context *c = new FunctionContext(
+  Context *complete = new FunctionContext(
       [=](int) {
 	MOSDPGUpdateLogMissing *msg =
 	  static_cast<MOSDPGUpdateLogMissing*>(
@@ -9703,10 +9705,12 @@ void ReplicatedPG::do_update_log_missing(OpRequestRef &op)
   /* Hack to work around the fact that ReplicatedBackend sends
    * ack+commit if commit happens first */
   if (pool.info.ec_pool()) {
-    t.register_on_complete(c);
+    t.register_on_complete(complete);
   } else {
-    t.register_on_commit(c);
+    t.register_on_commit(complete);
   }
+  t.register_on_applied(
+    new C_OSD_OnApplied{this, get_osdmap()->get_epoch(), info.last_update});
   int tr = osd->store->queue_transaction(
     osr.get(),
     std::move(t),
@@ -12487,7 +12491,8 @@ bool ReplicatedPG::_range_available_for_scrub(
   next.second = object_contexts.lookup(begin);
   next.first = begin;
   bool more = true;
-  while (more && cmp(next.first, end, get_sort_bitwise()) < 0) {
+  // inclusive upper bound, @see write_blocked_by_scrub
+  while (more && cmp(next.first, end, get_sort_bitwise()) <= 0) {
     if (next.second && next.second->is_blocked()) {
       next.second->requeue_scrub_on_unblock = true;
       dout(10) << __func__ << ": scrub delayed, "
diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h
index cfbfbe5..149d709 100644
--- a/src/osd/ReplicatedPG.h
+++ b/src/osd/ReplicatedPG.h
@@ -398,6 +398,22 @@ public:
     append_log(logv, trim_to, trim_rollback_to, t, transaction_applied);
   }
 
+  struct C_OSD_OnApplied : Context {
+    ReplicatedPGRef pg;
+    epoch_t epoch;
+    eversion_t v;
+    C_OSD_OnApplied(
+      ReplicatedPGRef pg,
+      epoch_t epoch,
+      eversion_t v)
+      : pg(pg), epoch(epoch), v(v) {}
+    void finish(int) override {
+      pg->lock();
+      if (!pg->pg_has_reset_since(epoch))
+	pg->op_applied(v);
+      pg->unlock();
+    }
+  };
   void op_applied(
     const eversion_t &applied_version);
 
diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc
index 7ff99cb..171b3f1 100644
--- a/src/osd/osd_types.cc
+++ b/src/osd/osd_types.cc
@@ -1493,7 +1493,14 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const
     return;
   }
 
-  ENCODE_START(24, 5, bl);
+  uint8_t v = 24;
+  if (!(features & CEPH_FEATURE_NEW_OSDOP_ENCODING)) {
+    // this was the first post-hammer thing we added; if it's missing, encode
+    // like hammer.
+    v = 21;
+  }
+
+  ENCODE_START(v, 5, bl);
   ::encode(type, bl);
   ::encode(size, bl);
   ::encode(crush_ruleset, bl);
@@ -1535,13 +1542,25 @@ void pg_pool_t::encode(bufferlist& bl, uint64_t features) const
   ::encode(last_force_op_resend, bl);
   ::encode(min_read_recency_for_promote, bl);
   ::encode(expected_num_objects, bl);
-  ::encode(cache_target_dirty_high_ratio_micro, bl);
-  ::encode(min_write_recency_for_promote, bl);
-  ::encode(use_gmt_hitset, bl);
-  ::encode(fast_read, bl);
-  ::encode(hit_set_grade_decay_rate, bl);
-  ::encode(hit_set_search_last_n, bl);
-  ::encode(opts, bl);
+  if (v >= 19) {
+    ::encode(cache_target_dirty_high_ratio_micro, bl);
+  }
+  if (v >= 20) {
+    ::encode(min_write_recency_for_promote, bl);
+  }
+  if (v >= 21) {
+    ::encode(use_gmt_hitset, bl);
+  }
+  if (v >= 22) {
+    ::encode(fast_read, bl);
+  }
+  if (v >= 23) {
+    ::encode(hit_set_grade_decay_rate, bl);
+    ::encode(hit_set_search_last_n, bl);
+  }
+  if (v >= 24) {
+    ::encode(opts, bl);
+  }
   ENCODE_FINISH(bl);
 }
 
@@ -5292,9 +5311,9 @@ void ScrubMap::decode(bufferlist::iterator& bl, int64_t pool)
 
   // handle hobject_t upgrade
   if (struct_v < 3) {
-    map<hobject_t, object, hobject_t::BitwiseComparator> tmp;
+    map<hobject_t, object, hobject_t::ComparatorWithDefault> tmp(objects.key_comp());
     tmp.swap(objects);
-    for (map<hobject_t, object, hobject_t::BitwiseComparator>::iterator i = tmp.begin();
+    for (map<hobject_t, object, hobject_t::ComparatorWithDefault>::iterator i = tmp.begin();
 	 i != tmp.end();
 	 ++i) {
       hobject_t first(i->first);
@@ -5310,7 +5329,7 @@ void ScrubMap::dump(Formatter *f) const
   f->dump_stream("valid_through") << valid_through;
   f->dump_stream("incremental_since") << incr_since;
   f->open_array_section("objects");
-  for (map<hobject_t,object, hobject_t::BitwiseComparator>::const_iterator p = objects.begin(); p != objects.end(); ++p) {
+  for (map<hobject_t,object, hobject_t::ComparatorWithDefault>::const_iterator p = objects.begin(); p != objects.end(); ++p) {
     f->open_object_section("object");
     f->dump_string("name", p->first.oid.name);
     f->dump_unsigned("hash", p->first.get_hash());
diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h
index 6887fa6..1c5d71d 100644
--- a/src/osd/osd_types.h
+++ b/src/osd/osd_types.h
@@ -4056,15 +4056,38 @@ struct ScrubMap {
   };
   WRITE_CLASS_ENCODER(object)
 
-  map<hobject_t,object, hobject_t::BitwiseComparator> objects;
+  bool bitwise; // ephemeral, not encoded
+  map<hobject_t,object, hobject_t::ComparatorWithDefault> objects;
   eversion_t valid_through;
   eversion_t incr_since;
 
+  ScrubMap() : bitwise(true) {}
+  ScrubMap(bool bitwise)
+    : bitwise(bitwise), objects(hobject_t::ComparatorWithDefault(bitwise)) {}
+
   void merge_incr(const ScrubMap &l);
+  void insert(const ScrubMap &r) {
+    objects.insert(r.objects.begin(), r.objects.end());
+  }
+  void swap(ScrubMap &r) {
+    ::swap(objects, r.objects);
+    ::swap(valid_through, r.valid_through);
+    ::swap(incr_since, r.incr_since);
+  }
 
   void encode(bufferlist& bl) const;
   void decode(bufferlist::iterator& bl, int64_t pool=-1);
   void dump(Formatter *f) const;
+  void reset_bitwise(bool new_bitwise) {
+    if (bitwise == new_bitwise)
+      return;
+    map<hobject_t, object, hobject_t::ComparatorWithDefault> new_objects(
+      objects.begin(),
+      objects.end(),
+      hobject_t::ComparatorWithDefault(new_bitwise));
+    ::swap(new_objects, objects);
+    bitwise = new_bitwise;
+  }
   static void generate_test_instances(list<ScrubMap*>& o);
 };
 WRITE_CLASS_ENCODER(ScrubMap::object)
diff --git a/src/osdc/Journaler.cc b/src/osdc/Journaler.cc
index 3e20aa9..2d6f85e 100644
--- a/src/osdc/Journaler.cc
+++ b/src/osdc/Journaler.cc
@@ -89,7 +89,7 @@ void Journaler::_set_layout(file_layout_t const *l)
 
 /***************** HEADER *******************/
 
-ostream& operator<<(ostream& out, Journaler::Header &h)
+ostream& operator<<(ostream &out, const Journaler::Header &h)
 {
   return out << "loghead(trim " << h.trimmed_pos
 	     << ", expire " << h.expire_pos
diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc
index 8732325..2a1e76e 100644
--- a/src/osdc/ObjectCacher.cc
+++ b/src/osdc/ObjectCacher.cc
@@ -888,7 +888,7 @@ void ObjectCacher::bh_write_adjacencies(BufferHead *bh, ceph::real_time cutoff,
     BufferHead *obh = *p;
     if (obh->ob != bh->ob)
       break;
-    if (obh->is_dirty() && obh->last_write < cutoff) {
+    if (obh->is_dirty() && obh->last_write <= cutoff) {
       blist.push_back(obh);
       ++count;
       total_len += obh->length();
@@ -903,7 +903,7 @@ void ObjectCacher::bh_write_adjacencies(BufferHead *bh, ceph::real_time cutoff,
     BufferHead *obh = *it;
     if (obh->ob != bh->ob)
       break;
-    if (obh->is_dirty() && obh->last_write < cutoff) {
+    if (obh->is_dirty() && obh->last_write <= cutoff) {
       blist.push_front(obh);
       ++count;
       total_len += obh->length();
@@ -1746,7 +1746,7 @@ void ObjectCacher::flusher_entry()
       int max = MAX_FLUSH_UNDER_LOCK;
       while ((bh = static_cast<BufferHead*>(bh_lru_dirty.
 					    lru_get_next_expire())) != 0 &&
-	     bh->last_write < cutoff &&
+	     bh->last_write <= cutoff &&
 	     max > 0) {
 	ldout(cct, 10) << "flusher flushing aged dirty bh " << *bh << dendl;
 	if (scattered_write) {
diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h
index d136c39..b34a5de 100644
--- a/src/osdc/ObjectCacher.h
+++ b/src/osdc/ObjectCacher.h
@@ -165,13 +165,13 @@ class ObjectCacher {
       journal_tid = _journal_tid;
     }
 
-    bool is_missing() { return state == STATE_MISSING; }
-    bool is_dirty() { return state == STATE_DIRTY; }
-    bool is_clean() { return state == STATE_CLEAN; }
-    bool is_zero() { return state == STATE_ZERO; }
-    bool is_tx() { return state == STATE_TX; }
-    bool is_rx() { return state == STATE_RX; }
-    bool is_error() { return state == STATE_ERROR; }
+    bool is_missing() const { return state == STATE_MISSING; }
+    bool is_dirty() const { return state == STATE_DIRTY; }
+    bool is_clean() const { return state == STATE_CLEAN; }
+    bool is_zero() const { return state == STATE_ZERO; }
+    bool is_tx() const { return state == STATE_TX; }
+    bool is_rx() const { return state == STATE_RX; }
+    bool is_error() const { return state == STATE_ERROR; }
 
     // reference counting
     int get() {
@@ -275,14 +275,14 @@ class ObjectCacher {
       set_item.remove_myself();
     }
 
-    sobject_t get_soid() { return oid; }
+    sobject_t get_soid() const { return oid; }
     object_t get_oid() { return oid.oid; }
     snapid_t get_snap() { return oid.snap; }
-    ObjectSet *get_object_set() { return oset; }
+    ObjectSet *get_object_set() const { return oset; }
     string get_namespace() { return oloc.nspace; }
     uint64_t get_object_number() const { return object_no; }
 
-    object_locator_t& get_oloc() { return oloc; }
+    const object_locator_t& get_oloc() const { return oloc; }
     void set_object_locator(object_locator_t& l) { oloc = l; }
 
     bool can_close() {
@@ -777,7 +777,7 @@ public:
 };
 
 
-inline ostream& operator<<(ostream& out, ObjectCacher::BufferHead &bh)
+inline ostream& operator<<(ostream &out, const ObjectCacher::BufferHead &bh)
 {
   out << "bh[ " << &bh << " "
       << bh.start() << "~" << bh.length()
@@ -811,7 +811,7 @@ inline ostream& operator<<(ostream& out, ObjectCacher::BufferHead &bh)
   return out;
 }
 
-inline ostream& operator<<(ostream& out, ObjectCacher::ObjectSet &os)
+inline ostream& operator<<(ostream &out, const ObjectCacher::ObjectSet &os)
 {
   return out << "objectset[" << os.ino
 	     << " ts " << os.truncate_seq << "/" << os.truncate_size
@@ -820,7 +820,7 @@ inline ostream& operator<<(ostream& out, ObjectCacher::ObjectSet &os)
 	     << "]";
 }
 
-inline ostream& operator<<(ostream& out, ObjectCacher::Object &ob)
+inline ostream& operator<<(ostream &out, const ObjectCacher::Object &ob)
 {
   out << "object["
       << ob.get_soid() << " oset " << ob.oset << dec
diff --git a/src/pybind/CMakeLists.txt b/src/pybind/CMakeLists.txt
new file mode 100644
index 0000000..6a4ba94
--- /dev/null
+++ b/src/pybind/CMakeLists.txt
@@ -0,0 +1,13 @@
+set(CYTHON_MODULE_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/cython_modules)
+get_property(compiler_launcher GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
+get_property(link_launcher GLOBAL PROPERTY RULE_LAUNCH_LINK)
+set(PY_CC \"${compiler_launcher} ${CMAKE_C_COMPILER}\")
+set(PY_CXX \"${compiler_launcher} ${CMAKE_CXX_COMPILER}\")
+set(PY_LDSHARED \"${link_launcher} ${CMAKE_C_COMPILER} -shared\")
+
+add_subdirectory(rados)
+add_subdirectory(rbd)
+add_subdirectory(cephfs)
+
+add_custom_target(cython_modules ALL
+    DEPENDS cython_rados cython_cephfs cython_rbd)
diff --git a/src/pybind/Makefile.am b/src/pybind/Makefile.am
index 9f779dd..9a8181d 100644
--- a/src/pybind/Makefile.am
+++ b/src/pybind/Makefile.am
@@ -27,3 +27,5 @@ endif # WITH_RADOS
 
 endif # WITH_CYTHON
 endif # ENABLE_CLIENT
+
+EXTRA_DIST += pybind/CMakeLists.txt
diff --git a/src/pybind/cephfs/CMakeLists.txt b/src/pybind/cephfs/CMakeLists.txt
new file mode 100644
index 0000000..21fcdb5
--- /dev/null
+++ b/src/pybind/cephfs/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_custom_target(cython_cephfs
+  COMMAND
+  env
+  CC=${PY_CC}
+  CXX=${PY_CXX}
+  LDSHARED=${PY_LDSHARED}
+  LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+  CYTHON_BUILD_DIR=${CMAKE_BINARY_DIR}/src/pybind/cephfs
+  CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
+  python ${CMAKE_SOURCE_DIR}/src/pybind/cephfs/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose 
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/cephfs
+  DEPENDS rados cephfs)
+
diff --git a/src/pybind/cephfs/Makefile.am b/src/pybind/cephfs/Makefile.am
index 577431f..698522d 100644
--- a/src/pybind/cephfs/Makefile.am
+++ b/src/pybind/cephfs/Makefile.am
@@ -1,4 +1,7 @@
-EXTRA_DIST += $(srcdir)/pybind/cephfs/setup.py $(srcdir)/pybind/cephfs/cephfs.pyx
+EXTRA_DIST += \
+	$(srcdir)/pybind/cephfs/CMakeLists.txt \
+	$(srcdir)/pybind/cephfs/setup.py \
+	$(srcdir)/pybind/cephfs/cephfs.pyx
 
 cephfs-pybind-all: libcephfs.la ${srcdir}/ceph_ver.h
 	cd $(srcdir)/pybind/cephfs; $(PY_DISTUTILS) build \
diff --git a/src/pybind/rados/CMakeLists.txt b/src/pybind/rados/CMakeLists.txt
new file mode 100644
index 0000000..efec92b
--- /dev/null
+++ b/src/pybind/rados/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_custom_target(cython_rados
+  COMMAND
+  env
+  CC=${PY_CC}
+  CXX=${PY_CXX}
+  LDSHARED=${PY_LDSHARED}
+  LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+  CYTHON_BUILD_DIR=${CMAKE_BINARY_DIR}/src/pybind/rados
+  CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
+  python ${CMAKE_SOURCE_DIR}/src/pybind/rados/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose 
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/rados
+  DEPENDS rados)
+
diff --git a/src/pybind/rados/Makefile.am b/src/pybind/rados/Makefile.am
index ad555c3..a4145bf 100644
--- a/src/pybind/rados/Makefile.am
+++ b/src/pybind/rados/Makefile.am
@@ -1,4 +1,7 @@
-EXTRA_DIST += $(srcdir)/pybind/rados/setup.py $(srcdir)/pybind/rados/rados.pyx $(srcdir)/pybind/rados/rados.pxd
+EXTRA_DIST += \
+	$(srcdir)/pybind/rados/CMakeLists.txt \
+	$(srcdir)/pybind/rados/setup.py \
+	$(srcdir)/pybind/rados/rados.pyx $(srcdir)/pybind/rados/rados.pxd
 
 rados-pybind-all: librados.la ${srcdir}/ceph_ver.h
 	cd $(srcdir)/pybind/rados; $(PY_DISTUTILS) build \
diff --git a/src/pybind/rbd/CMakeLists.txt b/src/pybind/rbd/CMakeLists.txt
new file mode 100644
index 0000000..3757911
--- /dev/null
+++ b/src/pybind/rbd/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_custom_target(cython_rbd
+  COMMAND
+  env
+  CC=${PY_CC}
+  CXX=${PY_CXX}
+  LDSHARED=${PY_LDSHARED}
+  LDFLAGS=-L${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+  CYTHON_BUILD_DIR=${CMAKE_BINARY_DIR}/src/pybind/rbd
+  CFLAGS=\"-iquote ${CMAKE_SOURCE_DIR}/src/include\"
+  python ${CMAKE_SOURCE_DIR}/src/pybind/rbd/setup.py build --build-base ${CYTHON_MODULE_DIR} --verbose
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/pybind/rbd
+  DEPENDS rbd)
+
diff --git a/src/pybind/rbd/Makefile.am b/src/pybind/rbd/Makefile.am
index affd2de..7dd4933 100644
--- a/src/pybind/rbd/Makefile.am
+++ b/src/pybind/rbd/Makefile.am
@@ -1,4 +1,7 @@
-EXTRA_DIST += $(srcdir)/pybind/rbd/setup.py $(srcdir)/pybind/rbd/rbd.pyx
+EXTRA_DIST += \
+	$(srcdir)/pybind/rbd/CMakeLists.txt \
+	$(srcdir)/pybind/rbd/setup.py \
+	$(srcdir)/pybind/rbd/rbd.pyx
 
 rbd-pybind-all: librbd.la ${srcdir}/ceph_ver.h
 	cd $(srcdir)/pybind/rbd; $(PY_DISTUTILS) build \
diff --git a/src/rbd_replay/CMakeLists.txt b/src/rbd_replay/CMakeLists.txt
new file mode 100644
index 0000000..6d3d0a4
--- /dev/null
+++ b/src/rbd_replay/CMakeLists.txt
@@ -0,0 +1,52 @@
+set(librbd_replay_types_srcs
+    ActionTypes.cc)
+add_library(rbd_replay_types STATIC ${librbd_replay_types_srcs})
+
+set(librbd_replay_srcs
+    actions.cc
+    BufferReader.cc
+    ImageNameMap.cc
+    PendingIO.cc
+    rbd_loc.cc
+    Replayer.cc)
+add_library(rbd_replay STATIC ${librbd_replay_srcs})
+target_link_libraries(rbd_replay LINK_PRIVATE librbd librados global)
+
+add_executable(rbd-replay
+  rbd-replay.cc
+  $<TARGET_OBJECTS:parse_secret_objs>
+  )
+target_link_libraries(rbd-replay librbd librados global rbd_replay rbd_replay_types common keyutils)
+install(TARGETS rbd-replay DESTINATION bin)
+
+set(librbd_replay_ios_srcs
+    ios.cc)
+add_library(rbd_replay_ios STATIC ${librbd_replay_ios_srcs})
+target_link_libraries(rbd_replay_ios librbd librados global)
+
+if(${WITH_BABELTRACE})
+  set(rbd_replay_prep_srcs
+      rbd-replay-prep.cc)
+  add_executable(rbd-replay-prep
+    ${rbd_replay_prep_srcs}
+    $<TARGET_OBJECTS:parse_secret_objs>
+    )
+  target_link_libraries(rbd-replay-prep
+    rbd_replay
+    rbd_replay_ios
+    rbd_replay_types
+    librbd
+    librados
+    common
+    keyutils
+    global
+    babeltrace
+    babeltrace-ctf
+    udev
+    ${Boost_DATE_TIME_LIBRARY}
+    )
+  install(TARGETS rbd-replay-prep DESTINATION bin)
+endif(${WITH_BABELTRACE})
+
+install(TARGETS rbd_replay rbd_replay_ios DESTINATION lib)
+
diff --git a/src/rbd_replay/Makefile.am b/src/rbd_replay/Makefile.am
index 23a8e91..775ca0a 100644
--- a/src/rbd_replay/Makefile.am
+++ b/src/rbd_replay/Makefile.am
@@ -74,3 +74,5 @@ endif
 endif # WITH_RBD
 endif # WITH_RADOS
 endif # ENABLE_CLIENT
+
+EXTRA_DIST += rbd_replay/CMakeLists.txt
diff --git a/src/rbd_replay/ios.cc b/src/rbd_replay/ios.cc
index 7bbc9ab..db8470e 100644
--- a/src/rbd_replay/ios.cc
+++ b/src/rbd_replay/ios.cc
@@ -62,7 +62,7 @@ void IO::write_debug_base(ostream& out, string type) const {
 }
 
 
-ostream& operator<<(ostream& out, IO::ptr io) {
+ostream& operator<<(ostream &out, const IO::ptr &io) {
   io->write_debug(out);
   return out;
 }
diff --git a/src/rbd_replay/ios.hpp b/src/rbd_replay/ios.hpp
index b4ab76d..5f19648 100644
--- a/src/rbd_replay/ios.hpp
+++ b/src/rbd_replay/ios.hpp
@@ -106,7 +106,7 @@ private:
 
 /// Used for dumping debug info.
 /// @related IO
-std::ostream& operator<<(std::ostream& out, IO::ptr io);
+std::ostream& operator<<(std::ostream &out, const IO::ptr &io);
 
 
 class StartThreadIO : public IO {
diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc
index c476129..1b4decc 100644
--- a/src/rgw/librgw.cc
+++ b/src/rgw/librgw.cc
@@ -81,6 +81,14 @@ namespace rgw {
 
   void RGWLibProcess::run()
   {
+    /* write completion interval */
+    RGWLibFS::write_completion_interval_s =
+      cct->_conf->rgw_nfs_write_completion_interval_s;
+
+    /* start write timer */
+    RGWLibFS::write_timer.resume();
+
+    /* gc loop */
     while (! shutdown) {
       lsubdout(cct, rgw, 5) << "RGWLibProcess GC" << dendl;
       unique_lock uniq(mtx);
@@ -468,12 +476,13 @@ namespace rgw {
     const string& ldap_uri = store->ctx()->_conf->rgw_ldap_uri;
     const string& ldap_binddn = store->ctx()->_conf->rgw_ldap_binddn;
     const string& ldap_searchdn = store->ctx()->_conf->rgw_ldap_searchdn;
+    const string& ldap_searchfilter = store->ctx()->_conf->rgw_ldap_searchfilter;
     const string& ldap_dnattr =
       store->ctx()->_conf->rgw_ldap_dnattr;
     std::string ldap_bindpw = parse_rgw_ldap_bindpw(store->ctx());
 
     ldh = new rgw::LDAPHelper(ldap_uri, ldap_binddn, ldap_bindpw.c_str(),
-			      ldap_searchdn, ldap_dnattr);
+			      ldap_searchdn, ldap_searchfilter, ldap_dnattr);
     ldh->init();
     ldh->bind();
 
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc
index c36b913..281e7be 100644
--- a/src/rgw/rgw_admin.cc
+++ b/src/rgw/rgw_admin.cc
@@ -238,6 +238,7 @@ void _usage()
   cout << "\nOrphans search options:\n";
   cout << "   --pool                    data pool to scan for leaked rados objects in\n";
   cout << "   --num-shards              num of shards to use for keeping the temporary scan info\n";
+  cout << "   --orphan-stale-secs       num of seconds to wait before declaring an object to be an orphan (default: 86400)\n";
   cout << "   --job-id                  set the job id (for orphans find)\n";
   cout << "   --max-concurrent-ios      maximum concurrent ios for orphans find (default: 32)\n";
   cout << "\n";
@@ -2076,6 +2077,7 @@ int main(int argc, char **argv)
       secret_key = val;
     } else if (ceph_argparse_witharg(args, i, &val, "-e", "--email", (char*)NULL)) {
       user_email = val;
+      user_op.user_email_specified=true;
     } else if (ceph_argparse_witharg(args, i, &val, "-n", "--display-name", (char*)NULL)) {
       display_name = val;
     } else if (ceph_argparse_witharg(args, i, &val, "-b", "--bucket", (char*)NULL)) {
diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc
index d309015..f430b2e 100644
--- a/src/rgw/rgw_common.cc
+++ b/src/rgw/rgw_common.cc
@@ -168,6 +168,7 @@ void req_info::rebuild_from(req_info& src)
 {
   method = src.method;
   script_uri = src.script_uri;
+  args = src.args;
   if (src.effective_uri.empty()) {
     request_uri = src.request_uri;
   } else {
diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h
index ab6c267..c392bc8 100644
--- a/src/rgw/rgw_common.h
+++ b/src/rgw/rgw_common.h
@@ -421,6 +421,7 @@ enum RGWOpType {
   RGW_OP_LIST_BUCKET_MULTIPARTS,
   RGW_OP_DELETE_MULTI_OBJ,
   RGW_OP_BULK_DELETE,
+  RGW_OP_SET_ATTRS,
 
   /* rgw specific */
   RGW_OP_ADMIN_SET_METADATA
diff --git a/src/rgw/rgw_coroutine.cc b/src/rgw/rgw_coroutine.cc
index 2e478f2..455c178 100644
--- a/src/rgw/rgw_coroutine.cc
+++ b/src/rgw/rgw_coroutine.cc
@@ -294,6 +294,7 @@ int RGWCoroutinesStack::unwind(int retcode)
 
 bool RGWCoroutinesStack::collect(RGWCoroutine *op, int *ret, RGWCoroutinesStack *skip_stack) /* returns true if needs to be called again */
 {
+  bool done = true;
   rgw_spawned_stacks *s = (op ? &op->spawned : &spawned);
   *ret = 0;
   vector<RGWCoroutinesStack *> new_list;
@@ -302,20 +303,28 @@ bool RGWCoroutinesStack::collect(RGWCoroutine *op, int *ret, RGWCoroutinesStack
     RGWCoroutinesStack *stack = *iter;
     if (stack == skip_stack || !stack->is_done()) {
       new_list.push_back(stack);
-      ldout(cct, 20) << "collect(): s=" << (void *)this << " stack=" << (void *)stack << " is still running" << dendl;
+      if (!stack->is_done()) {
+        ldout(cct, 20) << "collect(): s=" << (void *)this << " stack=" << (void *)stack << " is still running" << dendl;
+      } else if (stack == skip_stack) {
+        ldout(cct, 20) << "collect(): s=" << (void *)this << " stack=" << (void *)stack << " explicitily skipping stack" << dendl;
+      }
       continue;
     }
     int r = stack->get_ret_status();
+    stack->put();
     if (r < 0) {
       *ret = r;
+      ldout(cct, 20) << "collect(): s=" << (void *)this << " stack=" << (void *)stack << " encountered error (r=" << r << "), skipping next stacks" << dendl;
+      new_list.insert(new_list.end(), ++iter, s->entries.end());
+      done &= (iter != s->entries.end());
+      break;
     }
 
     ldout(cct, 20) << "collect(): s=" << (void *)this << " stack=" << (void *)stack << " is complete" << dendl;
-    stack->put();
   }
 
   s->entries.swap(new_list);
-  return false;
+  return (!done);
 }
 
 bool RGWCoroutinesStack::collect_next(RGWCoroutine *op, int *ret, RGWCoroutinesStack **collected_stack) /* returns true if found a stack to collect */
diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc
index 95d5b8d..101ddb0 100644
--- a/src/rgw/rgw_data_sync.cc
+++ b/src/rgw/rgw_data_sync.cc
@@ -1386,6 +1386,10 @@ public:
         /* state: building full sync maps */
         ldout(sync_env->cct, 20) << __func__ << "(): building full sync maps" << dendl;
         yield call(new RGWListBucketIndexesCR(sync_env, &sync_status));
+        if (retcode < 0) {
+          ldout(sync_env->cct, 0) << "ERROR: failed to build full sync maps, retcode=" << retcode << dendl;
+          return set_cr_error(retcode);
+        }
         sync_status.sync_info.state = rgw_data_sync_info::StateSync;
 
         /* update new state */
@@ -2067,6 +2071,7 @@ class RGWBucketSyncSingleEntryCR : public RGWCoroutine {
 
   RGWDataSyncDebugLogger logger;
 
+
 public:
   RGWBucketSyncSingleEntryCR(RGWDataSyncEnv *_sync_env,
                              RGWBucketInfo *_bucket_info,
@@ -2159,10 +2164,10 @@ public:
         yield call(sync_env->error_logger->log_error_cr(sync_env->conn->get_remote_id(), "data", error_ss.str(), retcode, "failed to sync object"));
       }
 done:
-      /* update marker */
-      set_status() << "calling marker_tracker->finish(" << entry_marker << ")";
-      yield call(marker_tracker->finish(entry_marker));
       if (sync_status == 0) {
+        /* update marker */
+        set_status() << "calling marker_tracker->finish(" << entry_marker << ")";
+        yield call(marker_tracker->finish(entry_marker));
         sync_status = retcode;
       }
       if (sync_status < 0) {
@@ -2191,6 +2196,8 @@ class RGWBucketShardFullSyncCR : public RGWCoroutine {
 
   int total_entries;
 
+  int sync_status{0};
+
   RGWContinuousLeaseCR *lease_cr;
   RGWCoroutinesStack *lease_stack;
 
@@ -2282,36 +2289,57 @@ int RGWBucketShardFullSyncCR::operate()
         }
         while ((int)num_spawned() > spawn_window) {
           yield wait_for_child();
-          while (collect(&ret, lease_stack)) {
+          bool again = true;
+          while (again) {
+            again = collect(&ret, lease_stack);
             if (ret < 0) {
               ldout(sync_env->cct, 0) << "ERROR: a sync operation returned error" << dendl;
+              sync_status = ret;
               /* we have reported this error */
             }
           }
         }
       }
-    } while (list_result.is_truncated);
+    } while (list_result.is_truncated && sync_status == 0);
     set_status("done iterating over all objects");
     /* wait for all operations to complete */
-    drain_all_but_stack(lease_stack); /* still need to hold lease cr */
+    while ((int)num_spawned() > 1) {
+      yield wait_for_child();
+      bool again = true;
+      while (again) {
+        again = collect(&ret, lease_stack);
+        if (ret < 0) {
+          ldout(sync_env->cct, 0) << "ERROR: a sync operation returned error" << dendl;
+          sync_status = ret;
+          /* we have reported this error */
+        }
+      }
+    }
     /* update sync state to incremental */
-    yield {
-      rgw_bucket_shard_sync_info sync_status;
-      sync_status.state = rgw_bucket_shard_sync_info::StateIncrementalSync;
-      map<string, bufferlist> attrs;
-      sync_status.encode_state_attr(attrs);
-      string oid = RGWBucketSyncStatusManager::status_oid(sync_env->source_zone, bs);
-      RGWRados *store = sync_env->store;
-      call(new RGWSimpleRadosWriteAttrsCR(sync_env->async_rados, store, store->get_zone_params().log_pool,
-                                          oid, attrs));
+    if (sync_status == 0) {
+      yield {
+        rgw_bucket_shard_sync_info sync_status;
+        sync_status.state = rgw_bucket_shard_sync_info::StateIncrementalSync;
+        map<string, bufferlist> attrs;
+        sync_status.encode_state_attr(attrs);
+        string oid = RGWBucketSyncStatusManager::status_oid(sync_env->source_zone, bs);
+        RGWRados *store = sync_env->store;
+        call(new RGWSimpleRadosWriteAttrsCR(sync_env->async_rados, store, store->get_zone_params().log_pool,
+                                            oid, attrs));
+      }
+    } else {
+      ldout(sync_env->cct, 0) << "ERROR: failure in sync, backing out (sync_status=" << sync_status<< ")" << dendl;
     }
     yield lease_cr->go_down();
     drain_all();
-    if (retcode < 0) {
+    if (retcode < 0 && sync_status == 0) { /* actually tried to set incremental state and failed */
       ldout(sync_env->cct, 0) << "ERROR: failed to set sync state on bucket "
           << bucket_shard_str{bs} << " retcode=" << retcode << dendl;
       return set_cr_error(retcode);
     }
+    if (sync_status < 0) {
+      return set_cr_error(sync_status);
+    }
     return set_cr_done();
   }
   return 0;
@@ -2342,6 +2370,8 @@ class RGWBucketShardIncrementalSyncCR : public RGWCoroutine {
 
   RGWDataSyncDebugLogger logger;
 
+  int sync_status{0};
+
 public:
   RGWBucketShardIncrementalSyncCR(RGWDataSyncEnv *_sync_env,
                                   const rgw_bucket_shard& bs,
@@ -2479,9 +2509,12 @@ int RGWBucketShardIncrementalSyncCR::operate()
           }
           ldout(sync_env->cct, 5) << *this << ": [inc sync] can't do op on key=" << key << " need to wait for conflicting operation to complete" << dendl;
           yield wait_for_child();
-          while (collect(&ret, lease_stack)) {
+          bool again = true;
+          while (again) {
+            again = collect(&ret, lease_stack);
             if (ret < 0) {
               ldout(sync_env->cct, 0) << "ERROR: a child operation returned error (ret=" << ret << ")" << dendl;
+              sync_status = ret;
               /* we have reported this error */
             }
           }
@@ -2511,33 +2544,55 @@ int RGWBucketShardIncrementalSyncCR::operate()
         while ((int)num_spawned() > spawn_window) {
           set_status() << "num_spawned() > spawn_window";
           yield wait_for_child();
-          while (collect(&ret, lease_stack)) {
+          bool again = true;
+          while (again) {
+            again = collect(&ret, lease_stack);
             if (ret < 0) {
               ldout(sync_env->cct, 0) << "ERROR: a sync operation returned error" << dendl;
+              sync_status = ret;
               /* we have reported this error */
             }
             /* not waiting for child here */
           }
         }
       }
-    } while (!list_result.empty());
+    } while (!list_result.empty() && sync_status == 0);
+
+    while ((int)num_spawned() > 1) {
+      yield wait_for_child();
+      bool again = true;
+      while (again) {
+        again = collect(&ret, lease_stack);
+        if (ret < 0) {
+          ldout(sync_env->cct, 0) << "ERROR: a sync operation returned error" << dendl;
+          sync_status = ret;
+          /* we have reported this error */
+        }
+        /* not waiting for child here */
+      }
+    }
 
     yield {
       call(marker_tracker->flush());
     }
     if (retcode < 0) {
       ldout(sync_env->cct, 0) << "ERROR: marker_tracker->flush() returned retcode=" << retcode << dendl;
-      drain_all_but_stack(lease_stack);
       lease_cr->go_down();
       drain_all();
       return set_cr_error(retcode);
     }
+    if (sync_status < 0) {
+      ldout(sync_env->cct, 0) << "ERROR: failure in sync, backing out (sync_status=" << sync_status<< ")" << dendl;
+    }
 
-    drain_all_but_stack(lease_stack);
     lease_cr->go_down();
     /* wait for all operations to complete */
     drain_all();
 
+    if (sync_status < 0) {
+      return set_cr_error(sync_status);
+    }
+
     return set_cr_done();
   }
   return 0;
diff --git a/src/rgw/rgw_dencoder.cc b/src/rgw/rgw_dencoder.cc
index 0b4fdf5..7456396 100644
--- a/src/rgw/rgw_dencoder.cc
+++ b/src/rgw/rgw_dencoder.cc
@@ -188,6 +188,10 @@ void RGWObjManifest::get_implicit_location(uint64_t cur_part_id, uint64_t cur_st
   }
 
   location->init_ns(*bucket, oid, ns);
+  
+  // Always overwrite instance with tail_instance
+  // to get the right shadow object location
+  location->set_instance(tail_instance);
 }
 
 
diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc
index 1bc6b1f..69f6b70 100644
--- a/src/rgw/rgw_file.cc
+++ b/src/rgw/rgw_file.cc
@@ -38,6 +38,11 @@ namespace rgw {
 
   atomic<uint32_t> RGWLibFS::fs_inst;
 
+  uint32_t RGWLibFS::write_completion_interval_s = 10;
+
+  ceph::timer<ceph::mono_clock> RGWLibFS::write_timer{
+    ceph::construct_suspended};
+
   LookupFHResult RGWLibFS::stat_bucket(RGWFileHandle* parent,
 				       const char *path, uint32_t flags)
   {
@@ -54,6 +59,7 @@ namespace rgw {
 		      RGWFileHandle::FLAG_BUCKET);
       if (get<0>(fhr)) {
 	RGWFileHandle* rgw_fh = get<0>(fhr);
+	rgw_fh->set_times(req.get_ctime());
 	/* restore attributes */
 	auto ux_key = req.get_attr(RGW_ATTR_UNIX_KEY1);
 	auto ux_attrs = req.get_attr(RGW_ATTR_UNIX1);
@@ -117,7 +123,7 @@ namespace rgw {
 	  if (get<0>(fhr)) {
 	    RGWFileHandle* rgw_fh = get<0>(fhr);
 	    rgw_fh->set_size(req.get_size());
-	    rgw_fh->set_mtime(real_clock::to_timespec(req.get_mtime()));
+	    rgw_fh->set_times(req.get_mtime());
 	    /* restore attributes */
 	    auto ux_key = req.get_attr(RGW_ATTR_UNIX_KEY1);
 	    auto ux_attrs = req.get_attr(RGW_ATTR_UNIX1);
@@ -143,7 +149,7 @@ namespace rgw {
 	  if (get<0>(fhr)) {
 	    RGWFileHandle* rgw_fh = get<0>(fhr);
 	    rgw_fh->set_size(req.get_size());
-	    rgw_fh->set_mtime(real_clock::to_timespec(req.get_mtime()));
+	    rgw_fh->set_times(req.get_mtime());
 	    /* restore attributes */
 	    auto ux_key = req.get_attr(RGW_ATTR_UNIX_KEY1);
 	    auto ux_attrs = req.get_attr(RGW_ATTR_UNIX1);
@@ -163,6 +169,15 @@ namespace rgw {
 	if ((rc == 0) &&
 	    (req.get_ret() == 0)) {
 	  if (req.matched) {
+	    // we need rgw object's key name equal to file name, if not return NULL
+	    if ((flags & RGWFileHandle::FLAG_EXACT_MATCH) &&
+		!req.exact_matched) {
+	      lsubdout(get_context(), rgw, 15)
+	        << __func__
+		<< ": stat leaf not exact match file name = "
+		<< path << dendl;
+	      goto done;
+	    }
 	    fhr = lookup_fh(parent, path,
 			    RGWFileHandle::FLAG_CREATE|
 			    ((req.is_dir) ?
@@ -196,6 +211,9 @@ namespace rgw {
     if (! rgw_fh->is_file())
       return -EINVAL;
 
+    if (rgw_fh->deleted())
+      return -ESTALE;
+
     RGWReadRequest req(get_context(), get_user(), rgw_fh, offset, length,
 		       buffer);
 
@@ -208,13 +226,21 @@ namespace rgw {
     return rc;
   }
 
-  int RGWLibFS::unlink(RGWFileHandle* parent, const char *name)
+  int RGWLibFS::unlink(RGWFileHandle* rgw_fh, const char* name, uint32_t flags)
   {
     int rc = 0;
+    RGWFileHandle* parent = nullptr;
 
-    /* atomicity */
-    LookupFHResult fhr = lookup_fh(parent, name, RGWFileHandle::FLAG_LOCK);
-    RGWFileHandle* rgw_fh = get<0>(fhr);
+    if (unlikely(flags & RGWFileHandle::FLAG_UNLINK_THIS)) {
+      /* LOCKED */
+      parent = rgw_fh->get_parent();
+    } else {
+      /* atomicity */
+      parent = rgw_fh;
+      LookupFHResult fhr = lookup_fh(parent, name, RGWFileHandle::FLAG_LOCK);
+      rgw_fh = get<0>(fhr);
+      /* LOCKED */
+    }
 
     if (parent->is_root()) {
       /* XXXX remove uri and deal with bucket and object names */
@@ -241,7 +267,7 @@ namespace rgw {
 
 	/* rgw_fh ref+ */
 	rgw_fh = get_rgwfh(fh);
-	rgw_fh->mtx.lock();
+	rgw_fh->mtx.lock(); /* LOCKED */
       }
 
       std::string oname = rgw_fh->relative_object_name();
@@ -257,6 +283,14 @@ namespace rgw {
 
     rgw_fh->flags |= RGWFileHandle::FLAG_DELETED;
     fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, cohort::lru::FLAG_NONE);
+
+#if 1 /* XXX verify clear cache */
+    fh_key fhk(rgw_fh->fh.fh_hk);
+    LookupFHResult tfhr = lookup_fh(fhk, RGWFileHandle::FLAG_LOCKED);
+    RGWFileHandle* nfh = get<0>(tfhr);
+    assert(!nfh);
+#endif
+
     rgw_fh->mtx.unlock();
     unref(rgw_fh);
 
@@ -271,6 +305,8 @@ namespace rgw {
      * succeeds */
     int rc = -EINVAL;
 
+    real_time t;
+
     std::string src_name{_src_name};
     std::string dst_name{_dst_name};
 
@@ -278,6 +314,37 @@ namespace rgw {
     LookupFHResult fhr = lookup_fh(src_fh, _src_name, RGWFileHandle::FLAG_LOCK);
     RGWFileHandle* rgw_fh = get<0>(fhr);
 
+    /* should not happen */
+    if (! rgw_fh) {
+      ldout(get_context(), 0) << __func__
+		       << " BUG no such src renaming path="
+		       << rgw_fh->full_object_name()
+		       << dendl;
+      goto out;
+    }
+
+    /* forbid renaming of directories (unreasonable at scale) */
+    if (rgw_fh->is_dir()) {
+      ldout(get_context(), 12) << __func__
+			<< " rejecting attempt to rename directory path="
+			<< rgw_fh->full_object_name()
+			<< dendl;
+      rc = -EPERM;
+      goto unlock;
+    }
+
+    /* forbid renaming open files (violates intent, for now) */
+    if (rgw_fh->is_open()) {
+      ldout(get_context(), 12) << __func__
+			<< " rejecting attempt to rename open file path="
+			<< rgw_fh->full_object_name()
+			<< dendl;
+      rc = -EPERM;
+      goto unlock;
+    }
+
+    t = real_clock::now();
+
     for (int ix : {0, 1}) {
       switch (ix) {
       case 0:
@@ -287,18 +354,53 @@ namespace rgw {
 	int rc = rgwlib.get_fe()->execute_req(&req);
 	if ((rc != 0) ||
 	    ((rc = req.get_ret()) != 0)) {
-	  goto out;
+	  ldout(get_context(), 1)
+	    << __func__
+	    << " rename step 0 failed src="
+	    << src_fh->full_object_name() << " " << src_name
+	    << " dst=" << dst_fh->full_object_name()
+	    << " " << dst_name
+	    << "rc " << rc
+	    << dendl;
+	  goto unlock;
 	}
+	ldout(get_context(), 12)
+	  << __func__
+	  << " rename step 0 success src="
+	  << src_fh->full_object_name() << " " << src_name
+	  << " dst=" << dst_fh->full_object_name()
+	  << " " << dst_name
+	  << " rc " << rc
+	  << dendl;
+	/* update dst change id */
+	dst_fh->set_times(t);
       }
       break;
       case 1:
       {
-	RGWDeleteObjRequest req(cct, get_user(), src_fh->bucket_name(),
-				src_name);
-	rc = rgwlib.get_fe()->execute_req(&req);
+	rc = this->unlink(rgw_fh /* LOCKED */, _src_name,
+			  RGWFileHandle::FLAG_UNLINK_THIS);
+	/* !LOCKED, -ref */
 	if (! rc) {
-	  rc = req.get_ret();
-	  goto out;
+	  ldout(get_context(), 12)
+	    << __func__
+	    << " rename step 1 success src="
+	    << src_fh->full_object_name() << " " << src_name
+	    << " dst=" << dst_fh->full_object_name()
+	    << " " << dst_name
+	    << " rc " << rc
+	    << dendl;
+	  /* update src change id */
+	  src_fh->set_times(t);
+	} else {
+	  ldout(get_context(), 1)
+	    << __func__
+	    << " rename step 1 failed src="
+	    << src_fh->full_object_name() << " " << src_name
+	    << " dst=" << dst_fh->full_object_name()
+	    << " " << dst_name
+	    << " rc " << rc
+	    << dendl;
 	}
       }
       break;
@@ -306,13 +408,11 @@ namespace rgw {
 	abort();
       } /* switch */
     } /* ix */
+  unlock:
+    rgw_fh->mtx.unlock(); /* !LOCKED */
+    unref(rgw_fh); /* -ref */
+
   out:
-    if (rgw_fh) {
-      rgw_fh->flags |= RGWFileHandle::FLAG_DELETED;
-      fh_cache.remove(rgw_fh->fh.fh_hk.object, rgw_fh, cohort::lru::FLAG_NONE);
-      rgw_fh->mtx.unlock();
-      unref(rgw_fh);
-    }
     return rc;
   } /* RGWLibFS::rename */
 
@@ -468,8 +568,11 @@ namespace rgw {
   {
     switch(rgw_fh->fh.fh_type) {
     case RGW_FS_TYPE_FILE:
-      break;
-    case RGW_FS_TYPE_DIRECTORY:
+    {
+      if (rgw_fh->deleted())
+	return -ESTALE;
+    }
+    break;
     default:
       break;
     };
@@ -477,6 +580,28 @@ namespace rgw {
     return rgw_fh->stat(st);
   } /* RGWLibFS::getattr */
 
+  int RGWLibFS::setattr(RGWFileHandle* rgw_fh, struct stat* st, uint32_t mask,
+			uint32_t flags)
+  {
+    int rc, rc2;
+    buffer::list ux_key, ux_attrs;
+    string obj_name{rgw_fh->relative_object_name()};
+
+    RGWSetAttrsRequest req(cct, get_user(), rgw_fh->bucket_name(), obj_name);
+
+    rgw_fh->create_stat(st, mask);
+    rgw_fh->encode_attrs(ux_key, ux_attrs);
+
+    /* save attrs */
+    req.emplace_attr(RGW_ATTR_UNIX_KEY1, std::move(ux_key));
+    req.emplace_attr(RGW_ATTR_UNIX1, std::move(ux_attrs));
+
+    rc = rgwlib.get_fe()->execute_req(&req);
+    rc2 = req.get_ret();
+
+    return (((rc == 0) && (rc2 == 0)) ? 0 : -EIO);
+  } /* RGWLibFS::setattr */
+
   void RGWLibFS::close()
   {
     state.flags |= FLAG_CLOSED;
@@ -558,6 +683,7 @@ namespace rgw {
 	  } /* rgw_fh */
 	} /* event::type::READDIR */
       } /* ev */
+      std::this_thread::sleep_for(std::chrono::seconds(120));
     } while (! stop);
   } /* RGWLibFS::gc */
 
@@ -633,6 +759,8 @@ namespace rgw {
 			   void *buffer)
   {
     using std::get;
+    using WriteCompletion = RGWLibFS::WriteCompletion;
+
     lock_guard guard(mtx);
 
     int rc = 0;
@@ -641,15 +769,57 @@ namespace rgw {
     if (! f)
       return -EISDIR;
 
+    if (deleted()) {
+      lsubdout(fs->get_context(), rgw, 5)
+	<< __func__
+	<< " write attempted on deleted object "
+	<< this->object_name()
+	<< dendl;
+      /* zap write transaction, if any */
+      if (f->write_req) {
+	delete f->write_req;
+	f->write_req = nullptr;
+      }
+      return -ESTALE;
+    }
+
     if (! f->write_req) {
+      /* guard--we do not support (e.g., COW-backed) partial writes */
+      if (off != 0) {
+	lsubdout(fs->get_context(), rgw, 5)
+	  << __func__
+	  << " " << object_name()
+	  << " non-0 initial write position " << off
+	  << dendl;
+	return -EIO;
+      }
+
       /* start */
       std::string object_name = relative_object_name();
       f->write_req =
 	new RGWWriteRequest(fs->get_context(), fs->get_user(), this,
 			    bucket_name(), object_name);
       rc = rgwlib.get_fe()->start_req(f->write_req);
-      if (rc < 0)
+      if (rc < 0) {
+	lsubdout(fs->get_context(), rgw, 5)
+	  << __func__
+	  << this->object_name()
+	  << " write start failed " << off
+	  << " (" << rc << ")"
+	  << dendl;
+	/* zap failed write transaction */
+	delete f->write_req;
+	f->write_req = nullptr;
         return -EIO;
+      } else {
+	if (stateless_open())  {
+	  /* start write timer */
+	  f->write_req->timer_id =
+	    RGWLibFS::write_timer.add_event(
+	      std::chrono::seconds(RGWLibFS::write_completion_interval_s),
+	      WriteCompletion(*this));
+	}
+      }
     }
 
     buffer::list bl;
@@ -665,21 +835,48 @@ namespace rgw {
     f->write_req->put_data(off, bl);
     rc = f->write_req->exec_continue();
 
-    size_t min_size = off + len;
-    if (min_size > get_size())
-      set_size(min_size);
+    if (rc == 0) {
+      size_t min_size = off + len;
+      if (min_size > get_size())
+	set_size(min_size);
+      if (stateless_open()) {
+	/* bump write timer */
+	RGWLibFS::write_timer.adjust_event(
+	  f->write_req->timer_id, std::chrono::seconds(10));
+      }
+    } else {
+      /* continuation failed (e.g., non-contiguous write position) */
+      lsubdout(fs->get_context(), rgw, 5)
+	<< __func__
+	<< object_name()
+	<< " failed write at position " << off
+	<< " (fails write transaction) "
+	<< dendl;
+      /* zap failed write transaction */
+      delete f->write_req;
+      f->write_req = nullptr;
+      rc = -EIO;
+    }
 
     *bytes_written = (rc == 0) ? len : 0;
     return rc;
   } /* RGWFileHandle::write */
 
-  int RGWFileHandle::close()
+  int RGWFileHandle::write_finish(uint32_t flags)
   {
-    lock_guard guard(mtx);
-
+    unique_lock guard{mtx, std::defer_lock};
     int rc = 0;
+
+    if (! (flags & FLAG_LOCKED)) {
+      guard.lock();
+    }
+
     file* f = get<file>(&variant_type);
     if (f && (f->write_req)) {
+      lsubdout(fs->get_context(), rgw, 10)
+	<< __func__
+	<< " finishing write trans on " << object_name()
+	<< dendl;
       rc = rgwlib.get_fe()->finish_req(f->write_req);
       if (! rc) {
 	rc = f->write_req->get_ret();
@@ -688,6 +885,15 @@ namespace rgw {
       f->write_req = nullptr;
     }
 
+    return rc;
+  } /* RGWFileHandle::write_finish */
+
+  int RGWFileHandle::close()
+  {
+    lock_guard guard(mtx);
+
+    int rc = write_finish(FLAG_LOCKED);
+
     flags &= ~FLAG_OPEN;
     return rc;
   } /* RGWFileHandle::close */
@@ -738,10 +944,10 @@ namespace rgw {
     struct req_state* s = get_state();
     op_ret = 0;
 
-#if 0 // TODO: check offsets
-    if (next_off != last_off)
+    /* check guards (e.g., contig write) */
+    if (eio)
       return -EIO;
-#endif
+
     size_t len = data.length();
     if (! len)
       return 0;
@@ -943,10 +1149,10 @@ int rgw_statfs(struct rgw_fs *rgw_fs,
 /*
   generic create -- create an empty regular file
 */
-int rgw_create(struct rgw_fs *rgw_fs,
-	      struct rgw_file_handle *parent_fh,
-	      const char *name, struct stat *st, uint32_t mask,
-	      struct rgw_file_handle **fh, uint32_t flags)
+int rgw_create(struct rgw_fs *rgw_fs, struct rgw_file_handle *parent_fh,
+	       const char *name, struct stat *st, uint32_t mask,
+	       struct rgw_file_handle **fh, uint32_t posix_flags,
+	       uint32_t flags)
 {
   using std::get;
 
@@ -1055,7 +1261,7 @@ int rgw_lookup(struct rgw_fs *rgw_fs,
 	return -ENOENT;
     }
   } else {
-    fhr = fs->stat_leaf(parent, path, RGWFileHandle::FLAG_NONE);
+    fhr = fs->stat_leaf(parent, path, RGWFileHandle::FLAG_EXACT_MATCH);
     if (! get<0>(fhr)) {
       if (! (flags & RGW_LOOKUP_FLAG_CREATE))
 	return -ENOENT;
@@ -1123,8 +1329,10 @@ int rgw_setattr(struct rgw_fs *rgw_fs,
 		struct rgw_file_handle *fh, struct stat *st,
 		uint32_t mask, uint32_t flags)
 {
-  /* XXX no-op */
-  return 0;
+  RGWLibFS *fs = static_cast<RGWLibFS*>(rgw_fs->fs_private);
+  RGWFileHandle* rgw_fh = get_rgwfh(fh);
+
+  return fs->setattr(rgw_fh, st, mask, flags);
 }
 
 /*
@@ -1140,7 +1348,7 @@ int rgw_truncate(struct rgw_fs *rgw_fs,
    open file
 */
 int rgw_open(struct rgw_fs *rgw_fs,
-	     struct rgw_file_handle *fh, uint32_t flags)
+	     struct rgw_file_handle *fh, uint32_t posix_flags, uint32_t flags)
 {
   RGWFileHandle* rgw_fh = get_rgwfh(fh);
 
@@ -1155,9 +1363,7 @@ int rgw_open(struct rgw_fs *rgw_fs,
   if (! rgw_fh->is_file())
     return -EISDIR;
 
-  // convert flags
-  uint32_t oflags = 0;
-  return rgw_fh->open(oflags);
+  return rgw_fh->open(flags);
 }
 
 /*
@@ -1187,7 +1393,7 @@ int rgw_readdir(struct rgw_fs *rgw_fs,
     return -EINVAL;
   }
   int rc = parent->readdir(rcb, cb_arg, offset, eof, flags);
-  return -rc;
+  return rc;
 }
 
 /*
@@ -1312,9 +1518,12 @@ int rgw_readv(struct rgw_fs *rgw_fs,
 /*
    write data to file (vector)
 */
-  int rgw_writev(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
-		 rgw_uio *uio, uint32_t flags)
+int rgw_writev(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
+	      rgw_uio *uio, uint32_t flags)
 {
+
+  return -ENOTSUP;
+
   CephContext* cct = static_cast<CephContext*>(rgw_fs->rgw);
   RGWLibFS *fs = static_cast<RGWLibFS*>(rgw_fs->fs_private);
   RGWFileHandle* rgw_fh = get_rgwfh(fh);
@@ -1350,4 +1559,12 @@ int rgw_fsync(struct rgw_fs *rgw_fs, struct rgw_file_handle *handle,
   return 0;
 }
 
+int rgw_commit(struct rgw_fs *rgw_fs, struct rgw_file_handle *fh,
+	       uint64_t offset, uint64_t length, uint32_t flags)
+{
+  RGWFileHandle* rgw_fh = get_rgwfh(fh);
+
+  return rgw_fh->commit(offset, length, RGWFileHandle::FLAG_NONE);
+}
+
 } /* extern "C" */
diff --git a/src/rgw/rgw_file.h b/src/rgw/rgw_file.h
index 42b6649..69ec707 100644
--- a/src/rgw/rgw_file.h
+++ b/src/rgw/rgw_file.h
@@ -28,6 +28,7 @@
 #include "include/buffer.h"
 #include "common/sstring.hh"
 #include "common/cohort_lru.h"
+#include "common/ceph_timer.h"
 #include "rgw_common.h"
 #include "rgw_user.h"
 #include "rgw_lib.h"
@@ -153,6 +154,7 @@ namespace rgw {
   {
     struct rgw_file_handle fh;
     std::mutex mtx;
+
     RGWLibFS* fs;
     RGWFileHandle* bucket;
     RGWFileHandle* parent;
@@ -231,6 +233,10 @@ namespace rgw {
     static constexpr uint32_t FLAG_BUCKET = 0x0020;
     static constexpr uint32_t FLAG_LOCK =   0x0040;
     static constexpr uint32_t FLAG_DELETED = 0x0080;
+    static constexpr uint32_t FLAG_UNLINK_THIS = 0x0100;
+    static constexpr uint32_t FLAG_LOCKED = 0x0200;
+    static constexpr uint32_t FLAG_STATELESS_OPEN = 0x0400;
+    static constexpr uint32_t FLAG_EXACT_MATCH = 0x0800;
 
 #define CREATE_FLAGS(x) \
     ((x) & ~(RGWFileHandle::FLAG_CREATE|RGWFileHandle::FLAG_LOCK))
@@ -369,11 +375,9 @@ namespace rgw {
 
       switch (fh.fh_type) {
       case RGW_FS_TYPE_DIRECTORY:
-	st->st_mode = RGW_RWXMODE|S_IFDIR /* state.unix_mode|S_IFDIR */;
 	st->st_nlink = 3;
 	break;
       case RGW_FS_TYPE_FILE:
-	st->st_mode = RGW_RWMODE|S_IFREG /* state.unix_mode|S_IFREG */;
 	st->st_nlink = 1;
 	st->st_blksize = 4096;
 	st->st_size = state.size;
@@ -489,10 +493,15 @@ namespace rgw {
     bool is_file() const { return (fh.fh_type == RGW_FS_TYPE_FILE); }
     bool is_dir() const { return (fh.fh_type == RGW_FS_TYPE_DIRECTORY); }
     bool creating() const { return flags & FLAG_CREATING; }
+    bool deleted() const { return flags & FLAG_DELETED; }
+    bool stateless_open() const { return flags & FLAG_STATELESS_OPEN; }
 
     uint32_t open(uint32_t gsh_flags) {
       lock_guard guard(mtx);
       if (! (flags & FLAG_OPEN)) {
+	if (gsh_flags & RGW_OPEN_FLAG_V3) {
+	  flags |= FLAG_STATELESS_OPEN;
+	}
 	flags |= FLAG_OPEN;
 	return 0;
       }
@@ -502,7 +511,18 @@ namespace rgw {
     int readdir(rgw_readdir_cb rcb, void *cb_arg, uint64_t *offset, bool *eof,
 		uint32_t flags);
     int write(uint64_t off, size_t len, size_t *nbytes, void *buffer);
-    int write_finish();
+
+    int commit(uint64_t offset, uint64_t length, uint32_t flags) {
+      /* NFS3 and NFSv4 COMMIT implementation
+       * the current atomic update strategy doesn't actually permit
+       * clients to read-stable until either CLOSE (NFSv4+) or the
+       * expiration of the active write timer (NFS3).  In the
+       * interim, the client may send an arbitrary number of COMMIT
+       * operations which must return a success result */
+      return 0;
+    }
+
+    int write_finish(uint32_t flags = FLAG_NONE);
     int close();
 
     void open_for_create() {
@@ -690,6 +710,7 @@ namespace rgw {
     RGWAccessKey key; // XXXX acc_key
 
     static atomic<uint32_t> fs_inst;
+    static uint32_t write_completion_interval_s;
     std::string fsid;
 
     using lock_guard = std::lock_guard<std::mutex>;
@@ -708,11 +729,29 @@ namespace rgw {
     using event_vector = /* boost::small_vector<event, 16> */
       std::vector<event>;
 
-    struct state {
+    struct WriteCompletion
+    {
+      RGWFileHandle& rgw_fh;
+
+      WriteCompletion(RGWFileHandle& _fh) : rgw_fh(_fh) {
+	rgw_fh.get_fs()->ref(&rgw_fh);
+      }
+
+      void operator()() {
+	rgw_fh.write_finish();
+	rgw_fh.get_fs()->unref(&rgw_fh);
+      }
+    };
+
+    static ceph::timer<ceph::mono_clock> write_timer;
+
+    struct State {
       std::mutex mtx;
       std::atomic<uint32_t> flags;
       std::deque<event> events;
-      state() : flags(0) {}
+
+      State() : flags(0) {}
+
       void push_event(const event& ev) {
 	lock_guard guard(mtx);
 	events.push_back(ev);
@@ -720,6 +759,7 @@ namespace rgw {
     } state;
 
     friend class RGWFileHandle;
+    friend class RGWLibProcess;
 
   public:
 
@@ -768,6 +808,14 @@ namespace rgw {
       intrusive_ptr_release(this);
     }
 
+    void release_evict(RGWFileHandle* fh) {
+      /* remove from cache, releases sentinel ref */
+      fh_cache.remove(fh->fh.fh_hk.object, fh,
+		      RGWFileHandle::FHCache::FLAG_NONE);
+      /* release call-path ref */
+      (void) fh_lru.unref(fh, cohort::lru::FLAG_NONE);
+    }
+
     int authorize(RGWRados* store) {
       int ret = rgw_get_user_info_by_access_key(store, key.id, user);
       if (ret == 0) {
@@ -780,7 +828,13 @@ namespace rgw {
       } else {
 	/* try external authenticators (ldap for now) */
 	rgw::LDAPHelper* ldh = rgwlib.get_ldh(); /* !nullptr */
-	RGWToken token{from_base64(key.id)};
+	RGWToken token;
+	/* boost filters and/or string_ref may throw on invalid input */
+	try {
+	  token = rgw::from_base64(key.id);
+	} catch(...) {
+	  token = std::string("");
+	}
 	if (token.valid() && (ldh->auth(token.id, token.key) == 0)) {
 	  /* try to store user if it doesn't already exist */
 	  if (rgw_get_user_info_by_uid(store, token.id, user) < 0) {
@@ -797,6 +851,41 @@ namespace rgw {
       return ret;
     } /* authorize */
 
+    /* find RGWFileHandle by id  */
+    LookupFHResult lookup_fh(const fh_key& fhk,
+			     const uint32_t flags = RGWFileHandle::FLAG_NONE) {
+      using std::get;
+
+      // cast int32_t(RGWFileHandle::FLAG_NONE) due to strictness of Clang 
+      // the cast transfers a lvalue into a rvalue  in the ctor
+      // check the commit message for the full details
+      LookupFHResult fhr { nullptr, uint32_t(RGWFileHandle::FLAG_NONE) };
+
+      RGWFileHandle::FHCache::Latch lat;
+
+    retry:
+      RGWFileHandle* fh =
+	fh_cache.find_latch(fhk.fh_hk.object /* partition selector*/,
+			    fhk /* key */, lat /* serializer */,
+			    RGWFileHandle::FHCache::FLAG_LOCK);
+      /* LATCHED */
+      if (fh) {
+	fh->mtx.lock(); // XXX !RAII because may-return-LOCKED
+	/* need initial ref from LRU (fast path) */
+	if (! fh_lru.ref(fh, cohort::lru::FLAG_INITIAL)) {
+	  lat.lock->unlock();
+	  fh->mtx.unlock();
+	  goto retry; /* !LATCHED */
+	}
+	/* LATCHED, LOCKED */
+	if (! (flags & RGWFileHandle::FLAG_LOCK))
+	  fh->mtx.unlock(); /* ! LOCKED */
+      }
+      lat.lock->unlock(); /* !LATCHED */
+      get<0>(fhr) = fh;
+      return fhr;
+    } /* lookup_fh(const fh_key&) */
+
     /* find or create an RGWFileHandle */
     LookupFHResult lookup_fh(RGWFileHandle* parent, const char *name,
 			     const uint32_t flags = RGWFileHandle::FLAG_NONE) {
@@ -870,7 +959,7 @@ namespace rgw {
     out:
       get<0>(fhr) = fh;
       return fhr;
-    }
+    } /*  lookup_fh(RGWFileHandle*, const char *, const uint32_t) */
 
     inline void unref(RGWFileHandle* fh) {
       (void) fh_lru.unref(fh, cohort::lru::FLAG_NONE);
@@ -883,6 +972,9 @@ namespace rgw {
 
     int getattr(RGWFileHandle* rgw_fh, struct stat* st);
 
+    int setattr(RGWFileHandle* rgw_fh, struct stat* st, uint32_t mask,
+		uint32_t flags);
+
     LookupFHResult stat_bucket(RGWFileHandle* parent,
 			       const char *path, uint32_t flags);
 
@@ -903,7 +995,8 @@ namespace rgw {
     MkObjResult mkdir2(RGWFileHandle* parent, const char *name, struct stat *st,
 		      uint32_t mask, uint32_t flags);
 
-    int unlink(RGWFileHandle* parent, const char *name);
+    int unlink(RGWFileHandle* rgw_fh, const char *name,
+	       uint32_t flags = FLAG_NONE);
 
     /* find existing RGWFileHandle */
     RGWFileHandle* lookup_handle(struct rgw_fh_hk fh_hk) {
@@ -932,7 +1025,7 @@ namespace rgw {
       if (fh->flags & RGWFileHandle::FLAG_DELETED) {
 	/* for now, delay briefly and retry */
 	lat.lock->unlock();
-	fh->mtx.unlock();
+	fh->mtx.unlock(); /* !LOCKED */
 	std::this_thread::sleep_for(std::chrono::milliseconds(20));
 	goto retry; /* !LATCHED */
       }
@@ -942,6 +1035,7 @@ namespace rgw {
 	goto retry; /* !LATCHED */
       }
       /* LATCHED */
+      fh->mtx.unlock(); /* !LOCKED */
     out:
       lat.lock->unlock(); /* !LATCHED */
       return fh;
@@ -1715,6 +1809,10 @@ public:
     return (iter != attrs.end()) ? &(iter->second) : nullptr;
   }
 
+  real_time get_ctime() const {
+    return bucket.creation_time;
+  }
+
   virtual bool only_bucket() { return false; }
 
   virtual int op_init() {
@@ -1747,10 +1845,6 @@ public:
     return 0;
   }
 
-  real_time get_ctime() const {
-    return bucket.creation_time;
-  }
-
   virtual int get_params() {
     return 0;
   }
@@ -1774,11 +1868,12 @@ public:
   std::string path;
   bool matched;
   bool is_dir;
+  bool exact_matched;
 
   RGWStatLeafRequest(CephContext* _cct, RGWUserInfo *_user,
 		     RGWFileHandle* _rgw_fh, const std::string& _path)
     : RGWLibRequest(_cct, _user), rgw_fh(_rgw_fh), path(_path),
-      matched(false), is_dir(false) {
+      matched(false), is_dir(false), exact_matched(false) {
     default_max = 1000; // logical max {"foo", "foo/"}
     op = this;
   }
@@ -1837,9 +1932,12 @@ public:
 			     << "list uri=" << s->relative_uri << " "
 			     << " prefix=" << prefix << " "
 			     << " obj path=" << name << ""
+			     << " target = " << path << ""
 			     << dendl;
       /* XXX is there a missing match-dir case (trailing '/')? */
       matched = true;
+      if (name == path)
+	exact_matched = true;
       return;
     }
     // try prefixes
@@ -1850,6 +1948,7 @@ public:
 			     << "list uri=" << s->relative_uri << " "
 			     << " prefix=" << prefix << " "
 			     << " pref path=" << name << " (not chomped)"
+			     << " target = " << path << ""
 			     << dendl;
       matched = true;
       is_dir = true;
@@ -1875,17 +1974,18 @@ public:
   RGWFileHandle* rgw_fh;
   RGWPutObjProcessor *processor;
   buffer::list data;
+  uint64_t timer_id;
   MD5 hash;
-  off_t last_off;
-  off_t next_off;
+  off_t real_ofs;
   size_t bytes_written;
   bool multipart;
+  bool eio;
 
   RGWWriteRequest(CephContext* _cct, RGWUserInfo *_user, RGWFileHandle* _fh,
 		  const std::string& _bname, const std::string& _oname)
     : RGWLibContinuedReq(_cct, _user), bucket_name(_bname), obj_name(_oname),
-      rgw_fh(_fh), processor(nullptr), last_off(0), next_off(0),
-      bytes_written(0), multipart(false) {
+      rgw_fh(_fh), processor(nullptr), real_ofs(0), bytes_written(0),
+      multipart(false), eio(false) {
 
     int ret = header_init();
     if (ret == 0) {
@@ -1958,8 +2058,12 @@ public:
   }
 
   void put_data(off_t off, buffer::list& _bl) {
-    ofs = off;
+    if (off != real_ofs) {
+      eio = true;
+    }
     data.claim(_bl);
+    real_ofs += data.length();
+    ofs = off; /* consumed in exec_continue() */
   }
 
   virtual int exec_start();
@@ -2066,6 +2170,59 @@ public:
 
 }; /* RGWCopyObjRequest */
 
+class RGWSetAttrsRequest : public RGWLibRequest,
+			   public RGWSetAttrs /* RGWOp */
+{
+public:
+  const std::string& bucket_name;
+  const std::string& obj_name;
+
+  RGWSetAttrsRequest(CephContext* _cct, RGWUserInfo *_user,
+		     const std::string& _bname, const std::string& _oname)
+    : RGWLibRequest(_cct, _user), bucket_name(_bname), obj_name(_oname) {
+    op = this;
+  }
+
+  virtual bool only_bucket() { return false; }
+
+  virtual int op_init() {
+    // assign store, s, and dialect_handler
+    RGWObjectCtx* rados_ctx
+      = static_cast<RGWObjectCtx*>(get_state()->obj_ctx);
+    // framework promises to call op_init after parent init
+    assert(rados_ctx);
+    RGWOp::init(rados_ctx->store, get_state(), this);
+    op = this; // assign self as op: REQUIRED
+    return 0;
+  }
+
+  virtual int header_init() {
+
+    struct req_state* s = get_state();
+    s->info.method = "PUT";
+    s->op = OP_PUT;
+
+    /* XXX derp derp derp */
+    std::string uri = make_uri(bucket_name, obj_name);
+    s->relative_uri = uri;
+    s->info.request_uri = uri; // XXX
+    s->info.effective_uri = uri;
+    s->info.request_params = "";
+    s->info.domain = ""; /* XXX ? */
+
+    // woo
+    s->user = user;
+
+    return 0;
+  }
+
+  virtual int get_params() {
+    return 0;
+  }
+
+  virtual void send_response() {}
+
+}; /* RGWSetAttrsRequest */
 
 } /* namespace rgw */
 
diff --git a/src/rgw/rgw_json_enc.cc b/src/rgw/rgw_json_enc.cc
index 4a4e84b..0062dc5 100644
--- a/src/rgw/rgw_json_enc.cc
+++ b/src/rgw/rgw_json_enc.cc
@@ -86,6 +86,7 @@ void RGWObjManifest::dump(Formatter *f) const
   ::encode_json("prefix", prefix, f);
   ::encode_json("tail_bucket", tail_bucket, f);
   ::encode_json("rules", rules, f);
+  ::encode_json("tail_instance", tail_instance, f);
 }
 
 void rgw_log_entry::dump(Formatter *f) const
diff --git a/src/rgw/rgw_ldap.cc b/src/rgw/rgw_ldap.cc
index 6cca3b8..e8915e3 100644
--- a/src/rgw/rgw_ldap.cc
+++ b/src/rgw/rgw_ldap.cc
@@ -37,3 +37,87 @@ std::string parse_rgw_ldap_bindpw(CephContext* ctx)
 
   return std::move(ldap_bindpw);
 }
+
+#if defined(HAVE_OPENLDAP)
+namespace rgw {
+
+  int LDAPHelper::auth(const std::string uid, const std::string pwd) {
+    int ret;
+    std::string filter;
+    if (msad) {
+      filter = "(&(objectClass=user)(sAMAccountName=";
+      filter += uid;
+      filter += "))";
+    } else {
+      /* openldap */
+      if (searchfilter.empty()) {
+        /* no search filter provided in config, we construct our own */
+        filter = "(";
+        filter += dnattr;
+        filter += "=";
+        filter += uid;
+        filter += ")";
+      } else {
+        if (searchfilter.find("@USERNAME@") != std::string::npos) {
+        /* we need to substitute the @USERNAME@ placeholder */
+	  filter = searchfilter;
+          filter.replace(searchfilter.find("@USERNAME@"), std::string("@USERNAME@").length(), uid);
+        } else {
+        /* no placeholder for username, so we need to append our own username filter to the custom searchfilter */
+          filter = "(&(";
+          filter += searchfilter;
+          filter += ")(";
+          filter += dnattr;
+          filter += "=";
+          filter += uid;
+          filter += "))";
+        }
+      }
+    }
+    ldout(g_ceph_context, 12)
+      << __func__ << " search filter: " << filter
+      << dendl;
+    char *attrs[] = { const_cast<char*>(dnattr.c_str()), nullptr };
+    LDAPMessage *answer = nullptr, *entry = nullptr;
+    bool once = true;
+
+    lock_guard guard(mtx);
+
+  retry_bind:
+    ret = ldap_search_s(ldap, searchdn.c_str(), LDAP_SCOPE_SUBTREE,
+			filter.c_str(), attrs, 0, &answer);
+    if (ret == LDAP_SUCCESS) {
+      entry = ldap_first_entry(ldap, answer);
+      if (entry) {
+	char *dn = ldap_get_dn(ldap, entry);
+	ret = simple_bind(dn, pwd);
+	if (ret != LDAP_SUCCESS) {
+	  ldout(g_ceph_context, 10)
+	    << __func__ << " simple_bind failed uid=" << uid
+	    << dendl;
+	}
+	ldap_memfree(dn);
+      } else {
+	ldout(g_ceph_context, 12)
+	  << __func__ << " ldap_search_s no user matching uid=" << uid
+	  << dendl;
+	ret = LDAP_NO_SUCH_ATTRIBUTE; // fixup result
+      }
+      ldap_msgfree(answer);
+    } else {
+      ldout(g_ceph_context, 5)
+	<< __func__ << " ldap_search_s error uid=" << uid
+	<< " ldap err=" << ret
+	<< dendl;
+      /* search should never fail--try to rebind */
+      if (once) {
+	rebind();
+	once = false;
+	goto retry_bind;
+      }
+    }
+    return (ret == LDAP_SUCCESS) ? ret : -EACCES;
+  } /* LDAPHelper::auth */
+}
+
+#endif /* defined(HAVE_OPENLDAP) */
diff --git a/src/rgw/rgw_ldap.h b/src/rgw/rgw_ldap.h
index b29e33a..5d33406 100644
--- a/src/rgw/rgw_ldap.h
+++ b/src/rgw/rgw_ldap.h
@@ -4,6 +4,8 @@
 #ifndef RGW_LDAP_H
 #define RGW_LDAP_H
 
+#include "acconfig.h"
+
 #if defined(HAVE_OPENLDAP)
 #define LDAP_DEPRECATED 1
 #include "ldap.h"
@@ -14,6 +16,7 @@
 #include <vector>
 #include <string>
 #include <iostream>
+#include <mutex>
 
 namespace rgw {
 
@@ -25,15 +28,19 @@ namespace rgw {
     std::string binddn;
     std::string bindpw;
     std::string searchdn;
+    std::string searchfilter;
     std::string dnattr;
     LDAP *ldap;
     bool msad = false; /* TODO: possible future specialization */
+    std::mutex mtx;
 
   public:
+    using lock_guard = std::lock_guard<std::mutex>;
+
     LDAPHelper(std::string _uri, std::string _binddn, std::string _bindpw,
-	       std::string _searchdn, std::string _dnattr)
+	       std::string _searchdn, std::string _searchfilter, std::string _dnattr)
       : uri(std::move(_uri)), binddn(std::move(_binddn)),
-	bindpw(std::move(_bindpw)), searchdn(_searchdn), dnattr(_dnattr),
+	bindpw(std::move(_bindpw)), searchdn(_searchdn), searchfilter(_searchfilter), dnattr(_dnattr),
 	ldap(nullptr) {
       // nothing
     }
@@ -58,52 +65,37 @@ namespace rgw {
       return (ret == LDAP_SUCCESS) ? ret : -EINVAL;
     }
 
+    int rebind() {
+      if (ldap) {
+	(void) ldap_unbind(ldap);
+	(void) init();
+	return bind();
+      }
+      return -EINVAL;
+    }
+
     int simple_bind(const char *dn, const std::string& pwd) {
       LDAP* tldap;
       int ret = ldap_initialize(&tldap, uri.c_str());
-      ret = ldap_simple_bind_s(tldap, dn, pwd.c_str());
       if (ret == LDAP_SUCCESS) {
-	ldap_unbind(tldap);
+	unsigned long ldap_ver = LDAP_VERSION3;
+	ret = ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION,
+			      (void*) &ldap_ver);
+	if (ret == LDAP_SUCCESS) {
+	  ret = ldap_simple_bind_s(tldap, dn, pwd.c_str());
+	  if (ret == LDAP_SUCCESS) {
+	    (void) ldap_unbind(tldap);
+	  }
+	}
       }
       return ret; // OpenLDAP client error space
     }
 
-    int auth(const std::string uid, const std::string pwd) {
-      int ret;
-      std::string filter;
-      if (msad) {
-	filter = "(&(objectClass=user)(sAMAccountName=";
-	filter += uid;
-	filter += "))";
-      } else {
-	/* openldap */
-	filter = "(";
-	filter += dnattr;
-	filter += "=";
-	filter += uid;
-	filter += ")";
-      }
-      char *attrs[] = { const_cast<char*>(dnattr.c_str()), nullptr };
-      LDAPMessage *answer = nullptr, *entry = nullptr;
-      ret = ldap_search_s(ldap, searchdn.c_str(), LDAP_SCOPE_SUBTREE,
-			  filter.c_str(), attrs, 0, &answer);
-      if (ret == LDAP_SUCCESS) {
-	entry = ldap_first_entry(ldap, answer);
-	if (entry) {
-	  char *dn = ldap_get_dn(ldap, entry);
-	  ret = simple_bind(dn, pwd);
-	  ldap_memfree(dn);
-	} else {
-	  ret = LDAP_NO_SUCH_ATTRIBUTE; // fixup result
-	}
-	ldap_msgfree(answer);
-      }
-      return (ret == LDAP_SUCCESS) ? ret : -EACCES;
-    }
+    int auth(const std::string uid, const std::string pwd);
 
     ~LDAPHelper() {
       if (ldap)
-	ldap_unbind(ldap);
+	(void) ldap_unbind(ldap);
     }
 
   }; /* LDAPHelper */
@@ -114,7 +106,7 @@ namespace rgw {
   {
   public:
     LDAPHelper(std::string _uri, std::string _binddn, std::string _bindpw,
-	       std::string _searchdn, std::string _dnattr)
+	       std::string _searchdn, std::string _searchfilter, std::string _dnattr)
       {}
 
     int init() {
diff --git a/src/rgw/rgw_metadata.cc b/src/rgw/rgw_metadata.cc
index 3160ce0..ea6e793 100644
--- a/src/rgw/rgw_metadata.cc
+++ b/src/rgw/rgw_metadata.cc
@@ -830,6 +830,10 @@ int RGWMetadataManager::store_in_heap(RGWMetadataHandler *handler, const string&
 
   rgw_bucket heap_pool(store->get_zone_params().metadata_heap);
 
+  if (heap_pool.name.empty()) {
+    return 0;
+  }
+
   RGWObjVersionTracker otracker;
   otracker.write_version = objv_tracker->write_version;
   string oid = heap_oid(handler, key, objv_tracker->write_version);
@@ -852,6 +856,10 @@ int RGWMetadataManager::remove_from_heap(RGWMetadataHandler *handler, const stri
 
   rgw_bucket heap_pool(store->get_zone_params().metadata_heap);
 
+  if (heap_pool.name.empty()) {
+    return 0;
+  }
+
   string oid = heap_oid(handler, key, objv_tracker->write_version);
   rgw_obj obj(heap_pool, oid);
   int ret = store->delete_system_obj(obj);
@@ -886,6 +894,7 @@ int RGWMetadataManager::put_entry(RGWMetadataHandler *handler, const string& key
   ret = rgw_put_system_obj(store, bucket, oid,
                            bl.c_str(), bl.length(), exclusive,
                            objv_tracker, mtime, pattrs);
+
   if (ret < 0) {
     int r = remove_from_heap(handler, key, objv_tracker);
     if (r < 0) {
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index 1e2e052..2da2129 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -263,7 +263,8 @@ static int read_policy(RGWRados *store, struct req_state *s,
     obj.init_ns(bucket, oid, mp_ns);
     obj.set_in_extra_data(true);
   } else {
-    obj = rgw_obj(bucket, object);
+    obj = rgw_obj(bucket, object.name);
+    obj.set_instance(object.instance);
   }
   int ret = get_policy_from_attr(s->cct, store, s->obj_ctx, bucket_info, bucket_attrs, policy, obj);
   if (ret == -ENOENT && !object.empty()) {
@@ -410,6 +411,7 @@ int rgw_build_object_policies(RGWRados *store, struct req_state *s,
     s->object_acl = new RGWAccessControlPolicy(s->cct);
 
     rgw_obj obj(s->bucket, s->object);
+      
     store->set_atomic(s->obj_ctx, obj);
     if (prefetch_data) {
       store->set_prefetch_data(s->obj_ctx, obj);
@@ -430,7 +432,8 @@ static void rgw_bucket_object_pre_exec(struct req_state *s)
 
 int RGWGetObj::verify_permission()
 {
-  obj = rgw_obj(s->bucket, s->object);
+  obj = rgw_obj(s->bucket, s->object.name);
+  obj.set_instance(s->object.instance);
   store->set_atomic(s->obj_ctx, obj);
   if (get_data)
     store->set_prefetch_data(s->obj_ctx, obj);
@@ -723,6 +726,10 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket,
     return -EPERM;
   }
 
+  if (ent.size == 0) {
+    return 0;
+  }
+
   perfcounter->inc(l_rgw_get_b, cur_end - cur_ofs);
   while (cur_ofs <= cur_end) {
     bufferlist bl;
@@ -732,6 +739,12 @@ int RGWGetObj::read_user_manifest_part(rgw_bucket& bucket,
 
     off_t len = bl.length();
     cur_ofs += len;
+    if (!len) {
+        ldout(s->cct, 0) << "ERROR: read 0 bytes; ofs=" << cur_ofs
+	    << " end=" << cur_end << " from obj=" << ent.key.name
+	    << "[" << ent.key.instance << "]" << dendl;
+        return -EIO;
+    }
     op_ret = 0; /* XXX redundant? */
     perfcounter->tinc(l_rgw_get_lat,
                       (ceph_clock_now(s->cct) - start_time));
@@ -1001,6 +1014,11 @@ int RGWGetObj::handle_user_manifest(const char *prefix)
     return r;
   }
 
+  if (!total_len) {
+    bufferlist bl;
+    send_response_data(bl, 0, 0);
+  }
+
   return 0;
 }
 
@@ -1552,20 +1570,17 @@ void RGWSetBucketVersioning::pre_exec()
 
 void RGWSetBucketVersioning::execute()
 {
+  op_ret = get_params();
+  if (op_ret < 0)
+    return;
+
   if (!store->is_meta_master()) {
-    bufferlist in_data;
-    JSONParser jp;
-    op_ret = forward_request_to_master(s, NULL, store, in_data, &jp);
+    op_ret = forward_request_to_master(s, NULL, store, in_data, nullptr);
     if (op_ret < 0) {
       ldout(s->cct, 20) << __func__ << "forward_request_to_master returned ret=" << op_ret << dendl;
     }
     return;
   }
-  
-  op_ret = get_params();
-
-  if (op_ret < 0)
-    return;
 
   if (enable_versioning) {
     s->bucket_info.flags |= BUCKET_VERSIONED;
@@ -3450,8 +3465,6 @@ void RGWGetACLs::execute()
   acls = ss.str();
 }
 
-
-
 int RGWPutACLs::verify_permission()
 {
   bool perm;
@@ -3543,7 +3556,8 @@ void RGWPutACLs::execute()
   }
 
   new_policy.encode(bl);
-  obj = rgw_obj(s->bucket, s->object);
+  obj = rgw_obj(s->bucket, s->object.name);
+  obj.set_instance(s->object.instance);
   map<string, bufferlist> attrs;
 
   store->set_atomic(s->obj_ctx, obj);
@@ -3560,6 +3574,9 @@ void RGWPutACLs::execute()
     attrs[RGW_ATTR_ACL] = bl;
     op_ret = rgw_bucket_set_attrs(store, s->bucket_info, attrs, &s->bucket_info.objv_tracker);
   }
+  if (op_ret == -ECANCELED) {
+    op_ret = 0; /* lost a race, but it's ok because acls are immutable */
+  }
 }
 
 int RGWGetCORS::verify_permission()
@@ -4660,6 +4677,46 @@ void RGWBulkDelete::execute()
   return;
 }
 
+int RGWSetAttrs::verify_permission()
+{
+  bool perm;
+  if (!s->object.empty()) {
+    perm = verify_object_permission(s, RGW_PERM_WRITE);
+  } else {
+    perm = verify_bucket_permission(s, RGW_PERM_WRITE);
+  }
+  if (!perm)
+    return -EACCES;
+
+  return 0;
+}
+
+void RGWSetAttrs::pre_exec()
+{
+  rgw_bucket_object_pre_exec(s);
+}
+
+void RGWSetAttrs::execute()
+{
+  op_ret = get_params();
+  if (op_ret < 0)
+    return;
+
+  rgw_obj obj(s->bucket, s->object);
+
+  store->set_atomic(s->obj_ctx, obj);
+
+  if (!s->object.empty()) {
+    op_ret = store->set_attrs(s->obj_ctx, obj, attrs, nullptr);
+  } else {
+    for (auto& iter : attrs) {
+      s->bucket_attrs[iter.first] = std::move(iter.second);
+    }
+    op_ret = rgw_bucket_set_attrs(store, s->bucket_info, s->bucket_attrs,
+				  &s->bucket_info.objv_tracker);
+  }
+}
+
 RGWHandler::~RGWHandler()
 {
 }
diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h
index f66d877..624139b 100644
--- a/src/rgw/rgw_op.h
+++ b/src/rgw/rgw_op.h
@@ -449,6 +449,7 @@ public:
 class RGWSetBucketVersioning : public RGWOp {
 protected:
   bool enable_versioning;
+  bufferlist in_data;
 public:
   RGWSetBucketVersioning() : enable_versioning(false) {}
 
@@ -1511,4 +1512,27 @@ static inline void complete_etag(MD5& hash, string *etag)
   *etag = etag_buf_str;
 } /* complete_etag */
 
+class RGWSetAttrs : public RGWOp {
+protected:
+  map<string, buffer::list> attrs;
+
+public:
+  RGWSetAttrs() {}
+  virtual ~RGWSetAttrs() {}
+
+  void emplace_attr(std::string&& key, buffer::list&& bl) {
+    attrs.emplace(std::move(key), std::move(bl));
+  }
+
+  int verify_permission();
+  void pre_exec();
+  void execute();
+
+  virtual int get_params() = 0;
+  virtual void send_response() = 0;
+  virtual const string name() { return "set_attrs"; }
+  virtual RGWOpType get_type() { return RGW_OP_SET_ATTRS; }
+  virtual uint32_t op_mask() { return RGW_OP_TYPE_WRITE; }
+};
+
 #endif /* CEPH_RGW_OP_H */
diff --git a/src/rgw/rgw_policy_s3.cc b/src/rgw/rgw_policy_s3.cc
index 3843511..8af70a8 100644
--- a/src/rgw/rgw_policy_s3.cc
+++ b/src/rgw/rgw_policy_s3.cc
@@ -286,11 +286,13 @@ int RGWPolicy::from_json(bufferlist& bl, string& err_msg)
       int r = add_condition(v[0], v[1], v[2], err_msg);
       if (r < 0)
         return r;
-    } else {
+    } else if (!citer.end()) {
       JSONObj *c = *citer;
       dout(0) << "adding simple_check: " << c->get_name() << " : " << c->get_data() << dendl;
 
       add_simple_check(c->get_name(), c->get_data());
+    } else {
+      return -EINVAL;
     }
   }
   return 0;
diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc
index 0ea17d5..4abeb0c 100644
--- a/src/rgw/rgw_quota.cc
+++ b/src/rgw/rgw_quota.cc
@@ -694,73 +694,45 @@ class RGWQuotaHandlerImpl : public RGWQuotaHandler {
     return 0;
   }
 public:
-  RGWQuotaHandlerImpl(RGWRados *_store, bool quota_threads) : store(_store), bucket_stats_cache(_store), user_stats_cache(_store, quota_threads) {
-    if (store->ctx()->_conf->rgw_bucket_default_quota_max_objects >= 0) {
-      def_bucket_quota.max_objects = store->ctx()->_conf->rgw_bucket_default_quota_max_objects;
-      def_bucket_quota.enabled = true;
-    }
-    if (store->ctx()->_conf->rgw_bucket_default_quota_max_size >= 0) {
-      def_bucket_quota.max_size_kb = store->ctx()->_conf->rgw_bucket_default_quota_max_size;
-      def_bucket_quota.enabled = true;
-    }
-    if (store->ctx()->_conf->rgw_user_default_quota_max_objects >= 0) {
-      def_user_quota.max_objects = store->ctx()->_conf->rgw_user_default_quota_max_objects;
-      def_user_quota.enabled = true;
-    }
-    if (store->ctx()->_conf->rgw_user_default_quota_max_size >= 0) {
-      def_user_quota.max_size_kb = store->ctx()->_conf->rgw_user_default_quota_max_size;
-      def_user_quota.enabled = true;
-    }
-  }
+  RGWQuotaHandlerImpl(RGWRados *_store, bool quota_threads) : store(_store),
+                                    bucket_stats_cache(_store),
+                                    user_stats_cache(_store, quota_threads) {}
+
   virtual int check_quota(const rgw_user& user, rgw_bucket& bucket,
                           RGWQuotaInfo& user_quota, RGWQuotaInfo& bucket_quota,
 			  uint64_t num_objs, uint64_t size) {
 
-    if (!bucket_quota.enabled && !user_quota.enabled && !def_bucket_quota.enabled && !def_user_quota.enabled)
+    if (!bucket_quota.enabled && !user_quota.enabled)
       return 0;
 
     uint64_t size_kb = rgw_rounded_objsize_kb(size);
 
-    RGWStorageStats bucket_stats;
-
     /*
      * we need to fetch bucket stats if the user quota is enabled, because the whole system relies
      * on us periodically updating the user's bucket stats in the user's header, this happens in
      * get_stats() if we actually fetch that info and not rely on cached data
      */
 
-    int ret = bucket_stats_cache.get_stats(user, bucket, bucket_stats, bucket_quota);
-    if (ret < 0)
-      return ret;
-
     if (bucket_quota.enabled) {
-      ret = check_quota("bucket", bucket_quota, bucket_stats, num_objs, size_kb);
+      RGWStorageStats bucket_stats;
+      int ret = bucket_stats_cache.get_stats(user, bucket, bucket_stats, bucket_quota);
       if (ret < 0)
         return ret;
-    }
 
-    if (def_bucket_quota.enabled) {
-      ret = check_quota("def_bucket", def_bucket_quota, bucket_stats, num_objs, size_kb);
+      ret = check_quota("bucket", bucket_quota, bucket_stats, num_objs, size_kb);
       if (ret < 0)
-        return ret;
+	return ret;
     }
 
-    if (user_quota.enabled || def_user_quota.enabled) {
+    if (user_quota.enabled) {
       RGWStorageStats user_stats;
-
-      ret = user_stats_cache.get_stats(user, bucket, user_stats, user_quota);
+      int ret = user_stats_cache.get_stats(user, bucket, user_stats, user_quota);
       if (ret < 0)
         return ret;
 
-      if (user_quota.enabled) {
-	ret = check_quota("user", user_quota, user_stats, num_objs, size_kb);
-	if (ret < 0)
-	  return ret;
-      } else if (def_user_quota.enabled) {
-        ret = check_quota("def_user", def_user_quota, user_stats, num_objs, size_kb);
-        if (ret < 0)
-          return ret;
-      }
+      ret = check_quota("user", user_quota, user_stats, num_objs, size_kb);
+      if (ret < 0)
+	return ret;
     }
 
     return 0;
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 15544c8..3f34850 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -1186,6 +1186,11 @@ int RGWPeriod::update()
       ldout(cct, 20) << "skipping zonegroup " << zg.get_name() << " zone realm id " << zg.realm_id << ", not on our realm " << realm_id << dendl;
       continue;
     }
+
+    if (zg.master_zone.empty()) {
+      ldout(cct, 0) << "ERROR: zonegroup " << zg.get_name() << " should have a master zone " << dendl;
+      return -EINVAL;
+    }  
     
     if (zg.is_master_zonegroup()) {
       master_zonegroup = zg.get_id();
@@ -1466,7 +1471,9 @@ int RGWZoneParams::fix_pool_names()
   }
 
   domain_root = fix_zone_pool_name(pool_names, name, ".rgw.data.root", domain_root.name);
-  metadata_heap = fix_zone_pool_name(pool_names, name, ".rgw.meta", metadata_heap.name);
+  if (!metadata_heap.name.empty()) {
+    metadata_heap = fix_zone_pool_name(pool_names, name, ".rgw.meta", metadata_heap.name);
+  }
   control_pool = fix_zone_pool_name(pool_names, name, ".rgw.control", control_pool.name);
   gc_pool = fix_zone_pool_name(pool_names, name ,".rgw.gc", gc_pool.name);
   log_pool = fix_zone_pool_name(pool_names, name, ".rgw.log", log_pool.name);
@@ -1881,7 +1888,7 @@ int RGWObjManifest::generator::create_begin(CephContext *cct, RGWObjManifest *_m
 
   bucket = _b;
   manifest->set_tail_bucket(_b);
-  manifest->set_head(_h);
+  manifest->set_head(_h, 0);
   last_ofs = 0;
 
   if (manifest->get_prefix().empty()) {
@@ -1913,6 +1920,9 @@ int RGWObjManifest::generator::create_begin(CephContext *cct, RGWObjManifest *_m
 
   manifest->get_implicit_location(cur_part_id, cur_stripe, 0, NULL, &cur_obj);
 
+  // Normal object which not generated through copy operation 
+  manifest->set_tail_instance(_h.get_instance());
+
   manifest->update_iterators();
 
   return 0;
@@ -3133,7 +3143,6 @@ void RGWRados::finalize()
     data_notifier->stop();
     delete data_notifier;
   }
-  delete meta_mgr;
   delete data_log;
   if (async_rados) {
     delete async_rados;
@@ -3164,6 +3173,7 @@ void RGWRados::finalize()
   if (cr_registry) {
     cr_registry->put();
   }
+  delete meta_mgr;
   delete binfo_cache;
   delete obj_tombstone_cache;
 }
@@ -3273,6 +3283,15 @@ int RGWRados::convert_regionmap()
   current_period.set_user_quota(zonegroupmap.user_quota);
   current_period.set_bucket_quota(zonegroupmap.bucket_quota);
 
+  // remove the region_map so we don't try to convert again
+  rgw_obj obj(pool, oid);
+  ret = delete_system_obj(obj);
+  if (ret < 0) {
+    ldout(cct, 0) << "Error could not remove " << obj
+        << " after upgrading to zonegroup map: " << cpp_strerror(ret) << dendl;
+    return ret;
+  }
+
   return 0;
 }
 
@@ -3298,9 +3317,26 @@ int RGWRados::replace_region_with_zonegroup()
     default_oid = default_region_info_oid;
   }
 
-  string default_region;
+
   RGWZoneGroup default_zonegroup;
-  int ret = default_zonegroup.init(cct, this, false, true);
+  string pool_name = default_zonegroup.get_pool_name(cct);
+  rgw_bucket pool(pool_name.c_str());
+  string oid  = "converted";
+  bufferlist bl;
+  RGWObjectCtx obj_ctx(this);
+
+  int ret = rgw_get_system_obj(this, obj_ctx, pool ,oid, bl, NULL,  NULL);
+  if (ret < 0 && ret !=  -ENOENT) {
+    ldout(cct, 0) << "failed to read converted: ret "<< ret << " " << cpp_strerror(-ret)
+		  << dendl;
+    return ret;
+  } else if (ret != -ENOENT) {
+    ldout(cct, 0) << "System already converted " << dendl;
+    return 0;
+  }
+
+  string default_region;
+  ret = default_zonegroup.init(cct, this, false, true);
   if (ret < 0) {
     ldout(cct, 0) << "failed init default region: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
     return ret;
@@ -3324,11 +3360,6 @@ int RGWRados::replace_region_with_zonegroup()
       ldout(cct, 0) << __func__ << ": error initializing default zone params: " << cpp_strerror(-ret) << dendl;
       return ret;
     }
-    /* default zone is missing meta_heap */
-    if (ret != -ENOENT && zoneparams.metadata_heap.name.empty()) {
-      zoneparams.metadata_heap = ".rgw.meta";
-      return zoneparams.update();
-    }
     /* update master zone */
     RGWZoneGroup default_zg(default_zonegroup_name);
     ret = default_zg.init(cct, this);
@@ -3403,6 +3434,15 @@ int RGWRados::replace_region_with_zonegroup()
   /* create zonegroups */
   for (iter = regions.begin(); iter != regions.end(); ++iter)
   {
+    ldout(cct, 0) << "Converting  " << *iter << dendl;
+    /* check to see if we don't have already a zonegroup with this name */
+    RGWZoneGroup new_zonegroup(*iter);
+    ret = new_zonegroup.init(cct , this);
+    if (ret == 0 && new_zonegroup.get_id() != *iter) {
+      ldout(cct, 0) << "zonegroup  "<< *iter << " already exists id " << new_zonegroup.get_id () <<
+	" skipping conversion " << dendl;
+      continue;
+    }
     RGWZoneGroup zonegroup(*iter);
     zonegroup.set_id(*iter);
     int ret = zonegroup.init(cct, this, true, true);
@@ -3411,6 +3451,11 @@ int RGWRados::replace_region_with_zonegroup()
       return ret;
     }
     zonegroup.realm_id = realm.get_id();
+    /* fix default region master zone */
+    if (*iter == default_zonegroup_name && zonegroup.master_zone.empty()) {
+      ldout(cct, 0) << "Setting default zone as master for default region" << dendl;
+      zonegroup.master_zone = default_zone_name;
+    }
     ret = zonegroup.update();
     if (ret < 0 && ret != -EEXIST) {
       ldout(cct, 0) << "failed to update zonegroup " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
@@ -3433,16 +3478,15 @@ int RGWRados::replace_region_with_zonegroup()
     }
     for (map<string, RGWZone>::const_iterator iter = zonegroup.zones.begin(); iter != zonegroup.zones.end();
          iter ++) {
+      ldout(cct, 0) << "Converting zone" << iter->first << dendl;
       RGWZoneParams zoneparams(iter->first, iter->first);
       zoneparams.set_id(iter->first);
+      zoneparams.realm_id = realm.get_id();
       ret = zoneparams.init(cct, this);
       if (ret < 0) {
         ldout(cct, 0) << "failed to init zoneparams  " << iter->first <<  ": " << cpp_strerror(-ret) << dendl;
         return ret;
       }
-      if (zoneparams.metadata_heap.name.empty()) {
-	zoneparams.metadata_heap = ".rgw.meta";
-      }
       zonegroup.realm_id = realm.get_id();
       ret = zoneparams.update();
       if (ret < 0 && ret != -EEXIST) {
@@ -3462,21 +3506,51 @@ int RGWRados::replace_region_with_zonegroup()
         ldout(cct, 0) << "failed to add zonegroup to current_period: " << cpp_strerror(-ret) << dendl;
         return ret;
       }
-      ret = current_period.update();
-      if (ret < 0) {
-        ldout(cct, 0) << "failed to update current_period: " << cpp_strerror(-ret) << dendl;
-        return ret;
-      }
     }
+  }
+
+  if (!current_period.get_id().empty()) {
+    ret = current_period.update();
+    if (ret < 0) {
+      ldout(cct, 0) << "failed to update new period: " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+    ret = current_period.store_info(false);
+    if (ret < 0) {
+      ldout(cct, 0) << "failed to store new period: " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+    ret = current_period.reflect();
+    if (ret < 0) {
+      ldout(cct, 0) << "failed to update local objects: " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+  }
 
+  for (auto const& iter : regions) {
+    RGWZoneGroup zonegroup(iter);
+    int ret = zonegroup.init(cct, this, true, true);
+    if (ret < 0) {
+      ldout(cct, 0) << "failed init zonegroup" << iter << ": ret "<< ret << " " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
     ret = zonegroup.delete_obj(true);
     if (ret < 0 && ret != -ENOENT) {
-      ldout(cct, 0) << "failed to delete region " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
+      ldout(cct, 0) << "failed to delete region " << iter << ": ret "<< ret << " " << cpp_strerror(-ret)
         << dendl;
       return ret;
     }
   }
 
+  /* mark as converted */
+  ret = rgw_put_system_obj(this, pool, oid, bl.c_str(), bl.length(),
+			   true, NULL, real_time(), NULL);
+  if (ret < 0 ) {
+    ldout(cct, 0) << "failed to mark cluster as converted: ret "<< ret << " " << cpp_strerror(-ret)
+		  << dendl;
+    return ret;
+  }
+
   return 0;
 }
 
@@ -6939,7 +7013,8 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx,
 
   RGWObjManifest manifest;
   RGWObjState *astate = NULL;
-  ret = get_obj_state(&obj_ctx, src_obj, &astate, NULL);
+
+  ret = get_obj_state(&obj_ctx, src_obj, &astate);
   if (ret < 0) {
     return ret;
   }
@@ -7066,8 +7141,9 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx,
       goto done_ret;
     }
 
-    pmanifest->set_head(dest_obj);
-    pmanifest->set_head_size(first_chunk.length());
+    pmanifest->set_head(dest_obj, first_chunk.length());
+  } else {
+    pmanifest->set_head(dest_obj, 0);
   }
 
   write_op.meta.data = &first_chunk;
@@ -8014,6 +8090,8 @@ int RGWRados::get_obj_state_impl(RGWObjectCtx *rctx, rgw_obj& obj, RGWObjState *
     try {
       ::decode(s->manifest, miter);
       s->has_manifest = true;
+      s->manifest.set_head(obj, s->size); /* patch manifest to reflect the head we just read, some manifests might be
+                                             broken due to old bugs */
       s->size = s->manifest.get_obj_size();
     } catch (buffer::error& err) {
       ldout(cct, 0) << "ERROR: couldn't decode manifest" << dendl;
diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h
index c1450e8..0d3db37 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -253,6 +253,8 @@ protected:
                              as object might have been copied across buckets */
   map<uint64_t, RGWObjManifestRule> rules;
 
+  string tail_instance; /* tail object's instance */
+
   void convert_to_explicit();
   int append_explicit(RGWObjManifest& m);
   void append_rules(RGWObjManifest& m, map<uint64_t, RGWObjManifestRule>::iterator& iter, string *override_prefix);
@@ -278,6 +280,7 @@ public:
     prefix = rhs.prefix;
     tail_bucket = rhs.tail_bucket;
     rules = rhs.rules;
+    tail_instance = rhs.tail_instance;
 
     begin_iter.set_manifest(this);
     end_iter.set_manifest(this);
@@ -315,7 +318,7 @@ public:
   }
 
   void encode(bufferlist& bl) const {
-    ENCODE_START(4, 3, bl);
+    ENCODE_START(5, 3, bl);
     ::encode(obj_size, bl);
     ::encode(objs, bl);
     ::encode(explicit_objs, bl);
@@ -325,11 +328,12 @@ public:
     ::encode(prefix, bl);
     ::encode(rules, bl);
     ::encode(tail_bucket, bl);
+    ::encode(tail_instance, bl);
     ENCODE_FINISH(bl);
   }
 
   void decode(bufferlist::iterator& bl) {
-    DECODE_START_LEGACY_COMPAT_LEN_32(4, 2, 2, bl);
+    DECODE_START_LEGACY_COMPAT_LEN_32(5, 2, 2, bl);
     ::decode(obj_size, bl);
     ::decode(objs, bl);
     if (struct_v >= 3) {
@@ -349,10 +353,30 @@ public:
       }
     }
 
+    if (explicit_objs && head_size > 0 && !objs.empty()) {
+      /* patch up manifest due to issue 16435:
+       * the first object in the explicit objs list might not be the one we need to access, use the
+       * head object instead if set. This would happen if we had an old object that was created
+       * when the explicit objs manifest was around, and it got copied.
+       */
+      rgw_obj& obj_0 = objs[0].loc;
+
+      if (!obj_0.get_object().empty() && obj_0.ns.empty()) {
+        objs[0].loc = head_obj;
+        objs[0].size = head_size;
+      }
+    }
+
     if (struct_v >= 4) {
       ::decode(tail_bucket, bl);
     }
 
+    if (struct_v >= 5) {
+      ::decode(tail_instance, bl);
+    } else { // old object created before 'tail_instance' field added to manifest
+      tail_instance = head_obj.get_instance();
+    }
+
     update_iterators();
     DECODE_FINISH(bl);
   }
@@ -386,8 +410,14 @@ public:
     return (obj_size > head_size);
   }
 
-  void set_head(const rgw_obj& _o) {
+  void set_head(const rgw_obj& _o, uint64_t _s) {
     head_obj = _o;
+    head_size = _s;
+
+    if (explicit_objs && head_size > 0) {
+      objs[0].loc = head_obj;
+      objs[0].size = head_size;
+    }
   }
 
   const rgw_obj& get_head() {
@@ -410,6 +440,14 @@ public:
     return prefix;
   }
 
+  void set_tail_instance(const string& _ti) {
+    tail_instance = _ti;
+  }
+
+  const string& get_tail_instance() {
+    return tail_instance;
+  }
+
   void set_head_size(uint64_t _s) {
     head_size = _s;
   }
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index e9f24f3..da93a95 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -746,6 +746,11 @@ int RGWSetBucketVersioning_ObjStore_S3::get_params()
     goto done;
   }
 
+  if (!store->is_meta_master()) {
+    /* only need to keep this data around if we're not meta master */
+    in_data.append(data, len);
+  }
+
   r = parser.get_versioning_status(&enable_versioning);
 
 done:
@@ -1754,7 +1759,13 @@ int RGWPostObj_ObjStore_S3::get_policy()
 	  << store->ctx()->_conf->rgw_ldap_uri
 	  << dendl;
 
-	RGWToken token{from_base64(s3_access_key)};
+	RGWToken token;
+	/* boost filters and/or string_ref may throw on invalid input */
+	try {
+	  token = rgw::from_base64(s3_access_key);
+	} catch(...) {
+	  token = std::string("");
+	}
 	if (! token.valid())
 	  return -EACCES;
 
@@ -2308,7 +2319,8 @@ int RGWPutCORS_ObjStore_S3::get_params()
   if (s->aws4_auth_needs_complete) {
     int ret_auth = do_aws4_auth_completion();
     if (ret_auth < 0) {
-      return ret_auth;
+      r = ret_auth;
+      goto done_err;
     }
   }
 
@@ -3089,12 +3101,13 @@ void RGW_Auth_S3::init_impl(RGWRados* store)
   const string& ldap_uri = store->ctx()->_conf->rgw_ldap_uri;
   const string& ldap_binddn = store->ctx()->_conf->rgw_ldap_binddn;
   const string& ldap_searchdn = store->ctx()->_conf->rgw_ldap_searchdn;
+  const string& ldap_searchfilter = store->ctx()->_conf->rgw_ldap_searchfilter;
   const string& ldap_dnattr =
     store->ctx()->_conf->rgw_ldap_dnattr;
   std::string ldap_bindpw = parse_rgw_ldap_bindpw(store->ctx());
 
   ldh = new rgw::LDAPHelper(ldap_uri, ldap_binddn, ldap_bindpw,
-			    ldap_searchdn, ldap_dnattr);
+			    ldap_searchdn, ldap_searchfilter, ldap_dnattr);
 
   ldh->init();
   ldh->bind();
diff --git a/src/rgw/rgw_rest_user.cc b/src/rgw/rgw_rest_user.cc
index 915c4ea..2387f59 100644
--- a/src/rgw/rgw_rest_user.cc
+++ b/src/rgw/rgw_rest_user.cc
@@ -143,6 +143,37 @@ void RGWOp_User_Create::execute()
   if (gen_key)
     op_state.set_generate_key();
 
+  RGWQuotaInfo bucket_quota;
+  RGWQuotaInfo user_quota;
+
+  if (s->cct->_conf->rgw_bucket_default_quota_max_objects >= 0) {
+    bucket_quota.max_objects = s->cct->_conf->rgw_bucket_default_quota_max_objects;
+    bucket_quota.enabled = true;
+  }
+
+  if (s->cct->_conf->rgw_bucket_default_quota_max_size >= 0) {
+    bucket_quota.max_size_kb = s->cct->_conf->rgw_bucket_default_quota_max_size;
+    bucket_quota.enabled = true;
+  }
+
+  if (s->cct->_conf->rgw_user_default_quota_max_objects >= 0) {
+    user_quota.max_objects = s->cct->_conf->rgw_user_default_quota_max_objects;
+    user_quota.enabled = true;
+  }
+
+  if (s->cct->_conf->rgw_user_default_quota_max_size >= 0) {
+    user_quota.max_size_kb = s->cct->_conf->rgw_user_default_quota_max_size;
+    user_quota.enabled = true;
+  }
+
+  if (bucket_quota.enabled) {
+    op_state.set_bucket_quota(bucket_quota);
+  }
+
+  if (user_quota.enabled) {
+    op_state.set_user_quota(user_quota);
+  }
+
   http_ret = RGWUserAdminOp_User::create(store, op_state, flusher);
 }
 
diff --git a/src/rgw/rgw_swift_auth.cc b/src/rgw/rgw_swift_auth.cc
index 8c7f032..d4e07d0 100644
--- a/src/rgw/rgw_swift_auth.cc
+++ b/src/rgw/rgw_swift_auth.cc
@@ -145,6 +145,8 @@ void RGW_SWIFT_Auth_Get::execute()
   const char *key = s->info.env->get("HTTP_X_AUTH_KEY");
   const char *user = s->info.env->get("HTTP_X_AUTH_USER");
 
+  s->prot_flags |= RGW_REST_SWIFT;
+
   string user_str;
   RGWUserInfo info;
   bufferlist bl;
diff --git a/src/rgw/rgw_sync.h b/src/rgw/rgw_sync.h
index 228728b..59f6b42 100644
--- a/src/rgw/rgw_sync.h
+++ b/src/rgw/rgw_sync.h
@@ -294,9 +294,7 @@ class RGWSyncShardMarkerTrack {
   };
   typename std::map<T, marker_entry> pending;
 
-  T high_marker;
-  T last_stored_marker;
-  marker_entry high_entry;
+  map<T, marker_entry> finish_markers;
 
   int window_size;
   int updates_since_flush;
@@ -321,10 +319,7 @@ public:
   }
 
   void try_update_high_marker(const T& pos, int index_pos, const real_time& timestamp) {
-    if (!(pos <= high_marker)) {
-      high_marker = pos;
-      high_entry = marker_entry(index_pos, timestamp);
-    }
+    finish_markers[pos] = marker_entry(index_pos, timestamp);
   }
 
   RGWCoroutine *finish(const T& pos) {
@@ -345,10 +340,7 @@ public:
       return NULL;
     }
 
-    if (!(pos <= high_marker)) {
-      high_marker = pos;
-      high_entry = pos_iter->second;
-    }
+    finish_markers[pos] = pos_iter->second;
 
     pending.erase(pos);
 
@@ -363,13 +355,29 @@ public:
   }
 
   RGWCoroutine *flush() {
-    if (last_stored_marker == high_marker) {
+    if (finish_markers.empty()) {
       return NULL;
     }
 
+    typename std::map<T, marker_entry>::iterator i;
+
+    if (pending.empty()) {
+      i = finish_markers.end();
+    } else {
+      i = finish_markers.lower_bound(pending.begin()->first);
+    }
+    if (i == finish_markers.begin()) {
+      return NULL;
+    }
     updates_since_flush = 0;
-    last_stored_marker = high_marker;
-    return store_marker(high_marker, high_entry.pos, high_entry.timestamp);
+
+    auto last = i;
+    --i;
+    const T& high_marker = i->first;
+    marker_entry& high_entry = i->second;
+    RGWCoroutine *cr = store_marker(high_marker, high_entry.pos, high_entry.timestamp);
+    finish_markers.erase(finish_markers.begin(), last);
+    return cr;
   }
 
   /*
diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc
index 6002aec..6e85d07 100644
--- a/src/rgw/rgw_user.cc
+++ b/src/rgw/rgw_user.cc
@@ -1932,8 +1932,18 @@ int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg)
   if (op_state.op_mask_specified)
     user_info.op_mask = op_state.get_op_mask();
 
-  if (op_state.has_bucket_quota())
+  if (op_state.has_bucket_quota()) {
     user_info.bucket_quota = op_state.get_bucket_quota();
+  } else {
+    if (cct->_conf->rgw_bucket_default_quota_max_objects >= 0) {
+      user_info.bucket_quota.max_objects = cct->_conf->rgw_bucket_default_quota_max_objects;
+      user_info.bucket_quota.enabled = true;
+    }
+    if (cct->_conf->rgw_bucket_default_quota_max_size >= 0) {
+      user_info.bucket_quota.max_size_kb = cct->_conf->rgw_bucket_default_quota_max_size;
+      user_info.bucket_quota.enabled = true;
+    }
+  }
 
   if (op_state.temp_url_key_specified) {
     map<int, string>::iterator iter;
@@ -1943,8 +1953,18 @@ int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg)
     }
   }
 
-  if (op_state.has_user_quota())
+  if (op_state.has_user_quota()) {
     user_info.user_quota = op_state.get_user_quota();
+  } else {
+    if (cct->_conf->rgw_user_default_quota_max_objects >= 0) {
+      user_info.user_quota.max_objects = cct->_conf->rgw_user_default_quota_max_objects;
+      user_info.user_quota.enabled = true;
+    }
+    if (cct->_conf->rgw_user_default_quota_max_size >= 0) {
+      user_info.user_quota.max_size_kb = cct->_conf->rgw_user_default_quota_max_size;
+      user_info.user_quota.enabled = true;
+    }
+  }
 
   // update the request
   op_state.set_user_info(user_info);
@@ -2126,8 +2146,16 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg)
       }
     }
     user_info.user_email = op_email;
-  }
+  } else if (op_email.empty() && op_state.user_email_specified) {
 
+    ldout(store->ctx(), 10) << "removing email index: " << user_info.user_email << dendl;
+    ret = rgw_remove_email_index(store, user_info.user_email);
+    if (ret < 0 && ret != -ENOENT) {
+      ldout(store->ctx(), 0) << "ERROR: could not remove " << user_info.user_id << " index (err=" << ret << ")" << dendl;
+      return ret;
+    }
+    user_info.user_email = "";
+  }
 
   // update the remaining user info
   if (!display_name.empty())
diff --git a/src/rgw/rgw_xml.cc b/src/rgw/rgw_xml.cc
index df555f8..ff067a4 100644
--- a/src/rgw/rgw_xml.cc
+++ b/src/rgw/rgw_xml.cc
@@ -45,7 +45,7 @@ get_next()
   return obj;
 }
 
-ostream& operator<<(ostream& out, XMLObj& obj) {
+ostream& operator<<(ostream &out, const XMLObj &obj) {
    out << obj.obj_type << ": " << obj.data;
    return out;
 }
diff --git a/src/rgw/rgw_xml.h b/src/rgw/rgw_xml.h
index 257a156..49b1fb8 100644
--- a/src/rgw/rgw_xml.h
+++ b/src/rgw/rgw_xml.h
@@ -56,7 +56,7 @@ public:
   XMLObjIter find(string name);
   XMLObj *find_first(string name);
 
-  friend ostream& operator<<(ostream& out, XMLObj& obj);
+  friend ostream& operator<<(ostream &out, const XMLObj &obj);
 };
 
 struct XML_ParserStruct;
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
new file mode 100644
index 0000000..c2d0176
--- /dev/null
+++ b/src/test/CMakeLists.txt
@@ -0,0 +1,789 @@
+include(AddCephTest)
+
+set(UNITTEST_LIBS gmock_main gmock gtest ${PTHREAD_LIBS} ${CMAKE_DL_LIBS})
+set(UNITTEST_CXX_FLAGS "-I${CMAKE_SOURCE_DIR}/src/gmock/include -I${CMAKE_BINARY_DIR}/src/gmock/include -I${CMAKE_SOURCE_DIR}/src/gmock/gtest/include -I${CMAKE_BINARY_DIR}/src/gmock/gtest/include -fno-strict-aliasing")
+
+add_subdirectory(bench)
+add_subdirectory(cls_hello)
+add_subdirectory(cls_lock)
+add_subdirectory(cls_log)
+add_subdirectory(cls_numops)
+add_subdirectory(cls_rbd)
+add_subdirectory(cls_refcount)
+add_subdirectory(cls_replica_log)
+add_subdirectory(cls_rgw)
+add_subdirectory(cls_statelog)
+add_subdirectory(cls_version)
+add_subdirectory(common)
+add_subdirectory(compressor)
+add_subdirectory(crush)
+add_subdirectory(encoding)
+add_subdirectory(erasure-code)
+add_subdirectory(filestore)
+add_subdirectory(fs)
+add_subdirectory(journal)
+add_subdirectory(libcephfs)
+add_subdirectory(librados)
+add_subdirectory(librados_test_stub)
+add_subdirectory(libradosstriper)
+add_subdirectory(librbd)
+add_subdirectory(messenger)
+add_subdirectory(mds)
+add_subdirectory(mon)
+add_subdirectory(msgr)
+add_subdirectory(ObjectMap)
+add_subdirectory(objectstore)
+add_subdirectory(os)
+add_subdirectory(osd)
+add_subdirectory(osdc)
+add_subdirectory(pybind)
+add_subdirectory(rgw)
+add_subdirectory(rbd_mirror)
+add_subdirectory(system)
+
+# test_timers
+add_executable(ceph_test_timers
+  TestTimers.cc
+  )
+target_link_libraries(ceph_test_timers global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+# test_signal_handlers
+add_executable(ceph_test_signal_handlers
+  TestSignalHandlers.cc
+  )
+target_link_libraries(ceph_test_signal_handlers global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+# test_rewrite_latency
+add_executable(ceph_test_rewrite_latency
+  test_rewrite_latency.cc
+  )
+target_link_libraries(ceph_test_rewrite_latency common
+  ${CMAKE_DL_LIBS}
+  ${CMAKE_THREAD_LIBS_INIT} ${CRYPTO_LIBS} m ${EXTRALIBS})
+
+# test_crypt
+add_executable(test_crypto
+  testcrypto.cc
+  )
+target_link_libraries(test_crypto
+  global
+  ${CRYPTO_LIBS}
+  m
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+add_executable(test_build_libcommon buildtest_skeleton.cc)
+target_link_libraries(test_build_libcommon common pthread ${CRYPTO_LIBS} ${EXTRALIBS})
+
+add_executable(test_build_librgw buildtest_skeleton.cc)
+target_link_libraries(test_build_librgw rgw_a global pthread ${CRYPTO_LIBS} ${EXTRALIBS})
+
+# From src/test/Makefile-client.am: I dont get this one... testing the osdc build but link in libcephfs?
+add_executable(test_build_libcephfs buildtest_skeleton.cc)
+target_link_libraries(test_build_libcephfs cephfs expat pthread ${CRYPTO_LIBS} ${EXTRALIBS})
+
+add_executable(test_build_librados buildtest_skeleton.cc)
+target_link_libraries(test_build_librados librados pthread ${CRYPTO_LIBS} ${EXTRALIBS} osdc osd os common cls_lock_client ${BLKID_LIBRARIES})
+
+# bench_log
+set(bench_log_srcs
+  bench_log.cc
+  )
+add_executable(ceph_bench_log
+  ${bench_log_srcs}
+  )
+target_link_libraries(ceph_bench_log global pthread rt ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+# ceph_test_mutate
+add_executable(ceph_test_mutate
+  test_mutate.cc
+  )
+target_link_libraries(ceph_test_mutate global librados ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS})
+
+# test_trans
+add_executable(test_trans
+  test_trans.cc
+  )
+target_link_libraries(test_trans os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+## Benchmarks
+
+
+# ceph_omapbench
+set(omapbench_srcs
+  omap_bench.cc
+  )
+add_executable(ceph_omapbench
+  ${omapbench_srcs}
+  )
+target_link_libraries(ceph_omapbench
+  librados
+  ${Boost_PROGRAM_OPTIONS_LIBRARY}
+  global
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_kvstorebench
+set(kvstorebench_srcs
+  kv_store_bench.cc
+  ${CMAKE_SOURCE_DIR}/src/key_value_store/kv_flat_btree_async.cc
+  )
+add_executable(ceph_kvstorebench
+  ${kvstorebench_srcs}
+  )
+target_link_libraries(ceph_kvstorebench librados global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+# ceph_objectstore_bench
+add_executable(ceph_objectstore_bench objectstore_bench.cc)
+target_link_libraries(ceph_objectstore_bench global ${BLKID_LIBRARIES} os)
+
+if(${WITH_RADOSGW})
+  # test_cors
+  set(test_cors_srcs test_cors.cc)
+  add_executable(test_cors
+    ${test_cors_srcs}
+    )
+  target_link_libraries(test_cors
+    librados
+    rgw_a
+    global
+    curl
+    expat
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS} ${UNITTEST_LIBS})
+  set_target_properties(test_cors PROPERTIES COMPILE_FLAGS
+    ${UNITTEST_CXX_FLAGS})
+
+  # test_cls_rgw_meta
+  set(test_cls_rgw_meta_srcs test_rgw_admin_meta.cc)
+  add_executable(test_cls_rgw_meta
+    ${test_cls_rgw_meta_srcs}
+    )
+  target_link_libraries(test_cls_rgw_meta
+    librados
+    rgw_a
+    global
+    curl
+    expat
+    cls_version_client
+    cls_log_client
+    cls_statelog_client
+    cls_refcount_client
+    cls_rgw_client
+    cls_user_client
+    cls_lock_client
+    ${Boost_REGEX_LIBRARY}
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS} ${UNITTEST_LIBS} ${CRYPTO_LIBS})
+  set_target_properties(test_cls_rgw_meta PROPERTIES COMPILE_FLAGS
+    ${UNITTEST_CXX_FLAGS})
+
+  # test_cls_rgw_log
+  set(test_cls_rgw_log_srcs
+    test_rgw_admin_log.cc
+    )
+  add_executable(test_cls_rgw_log
+    ${test_cls_rgw_log_srcs}
+    )
+  target_link_libraries(test_cls_rgw_log
+    librados
+    rgw_a
+    global
+    curl
+    expat
+    cls_version_client
+    cls_log_client
+    cls_statelog_client
+    cls_refcount_client
+    cls_rgw_client
+    cls_user_client
+    cls_lock_client
+    ${Boost_REGEX_LIBRARY}
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS}
+    ${UNITTEST_LIBS}
+    ${EXTRALIBS}
+    ${CRYPTO_LIBS}
+    )
+  set_target_properties(test_cls_rgw_log PROPERTIES COMPILE_FLAGS
+    ${UNITTEST_CXX_FLAGS})
+
+  # test_cls_rgw_opstate
+  set(test_cls_rgw_opstate_srcs test_rgw_admin_opstate.cc)
+  add_executable(test_cls_rgw_opstate
+    ${test_cls_rgw_opstate_srcs}
+    )
+  target_link_libraries(test_cls_rgw_opstate
+    rgw_a
+    librados
+    cls_version_client
+    cls_log_client
+    cls_statelog_client
+    cls_timeindex_client
+    cls_refcount_client
+    cls_rgw_client
+    cls_user_client
+    cls_lock_client
+    global
+    curl
+    expat
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS}
+    ${UNITTEST_LIBS}
+    ${CRYPTO_LIBS}
+    ${EXTRALIBS}
+    )
+  set_target_properties(test_cls_rgw_opstate PROPERTIES COMPILE_FLAGS
+    ${UNITTEST_CXX_FLAGS})
+endif(${WITH_RADOSGW})
+
+# ceph_multi_stress_watch
+add_executable(ceph_multi_stress_watch
+  multi_stress_watch.cc
+  )
+target_link_libraries(ceph_multi_stress_watch librados global radostest
+  ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
+#ceph_perf_local
+add_executable(ceph_perf_local 
+  perf_local.cc
+  perf_helper.cc)
+#INTEL_SSE & INTEL_SSE2 flags
+set(PERF_LOCAL_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2") 
+set_target_properties(ceph_perf_local PROPERTIES COMPILE_FLAGS
+  ${PERF_LOCAL_FLAGS})
+target_link_libraries(ceph_perf_local os global ${UNITTEST_LIBS})
+
+# ceph_test_xattr_bench
+add_executable(ceph_test_xattr_bench
+  xattr_bench.cc
+  )
+set_target_properties(ceph_test_xattr_bench PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_xattr_bench
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_filejournal
+add_executable(ceph_test_filejournal
+  test_filejournal.cc
+  )
+set_target_properties(ceph_test_filejournal PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_filejournal
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${EXTRALIBS}
+  )
+
+# ceph_test_keys
+add_executable(ceph_test_keys
+  testkeys.cc
+  )
+target_link_libraries(ceph_test_keys mon global ${CMAKE_DL_LIBS})
+
+# ceph_test_snap_mapper
+add_executable(ceph_test_snap_mapper EXCLUDE_FROM_ALL
+  test_snap_mapper.cc
+  )
+target_link_libraries(ceph_test_snap_mapper osd global ${BLKID_LIBRARIES})
+
+add_executable(ceph_test_stress_watch
+  test_stress_watch.cc
+  )
+set_target_properties(ceph_test_stress_watch PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_stress_watch
+  librados
+  global
+  ${UNITTEST_LIBS}
+  radostest
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_librgw_file (nfs-like RGW interface)
+add_executable(ceph_test_librgw_file
+  librgw_file.cc
+  )
+set_target_properties(ceph_test_librgw_file PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_librgw_file
+  rgw
+  librados
+  ${UNITTEST_LIBS}
+  ${EXTRALIBS}
+  )
+
+# ceph_test_librgw_file_cd (just the rgw_file create-delete bucket ops)
+add_executable(ceph_test_librgw_file_cd
+  librgw_file_cd.cc
+  )
+set_target_properties(ceph_test_librgw_file_cd PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_librgw_file_cd
+  rgw
+  librados
+  ${UNITTEST_LIBS}
+  ${EXTRALIBS}
+  )
+
+# ceph_test_librgw_file_gp (just the rgw_file get-put bucket ops)
+add_executable(ceph_test_librgw_file_gp
+  librgw_file_gp.cc
+  )
+set_target_properties(ceph_test_librgw_file_gp PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_librgw_file_gp
+  rgw
+  librados
+  ${UNITTEST_LIBS}
+  ${EXTRALIBS}
+  )
+
+# ceph_test_librgw_file_nfsns (nfs namespace tests)
+add_executable(ceph_test_librgw_file_nfsns
+  librgw_file_nfsns.cc
+  )
+set_target_properties(ceph_test_librgw_file_nfsns PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_librgw_file_nfsns
+  rgw
+  librados
+  ${UNITTEST_LIBS}
+  ${EXTRALIBS}
+  )
+
+# ceph_test_librgw_file_aw (nfs write transaction [atomic write] tests)
+add_executable(ceph_test_librgw_file_aw
+  librgw_file_aw.cc
+  )
+set_target_properties(ceph_test_librgw_file_aw PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_librgw_file_aw
+  rgw
+  librados
+  ${UNITTEST_LIBS}
+  ${EXTRALIBS}
+  )
+
+# ceph_test_rgw_token
+add_executable(ceph_test_rgw_token
+  test_rgw_token.cc
+  )
+set_target_properties(ceph_test_rgw_token PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rgw_token
+  rgw
+  os
+  global
+  ${UNITTEST_LIBS}
+  ${EXTRALIBS}
+  )
+
+# librgw_file_gp (just the rgw_file get-put bucket ops)
+add_executable(test_rgw_ldap
+  ${CMAKE_SOURCE_DIR}/src/rgw/rgw_ldap.cc
+  test_rgw_ldap.cc
+  )
+set_target_properties(test_rgw_ldap PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(test_rgw_ldap
+  librados
+  ${OPENLDAP_LIBS}
+  ${Boost_LIBRARIES}
+  ${UNITTEST_LIBS}
+  )
+
+if(${HAVE_FUSE})
+  add_executable(ceph_test_cfuse_cache_invalidate
+    test_cfuse_cache_invalidate.cc
+    )
+  target_link_libraries(ceph_test_cfuse_cache_invalidate
+    global
+    os
+    ${EXTRALIBS}
+    ${CMAKE_DL_LIBS}
+    )
+endif(${HAVE_FUSE})
+
+if(${WITH_CEPHFS})
+  add_executable(test_c_headers
+    test_c_headers.c
+    )
+  target_link_libraries(test_c_headers
+    librados
+    cephfs
+    ${EXTRALIBS}
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS}
+    )
+endif(${WITH_CEPHFS})
+
+add_executable(ceph_test_get_blkdev_size
+  test_get_blkdev_size.cc
+  )
+target_link_libraries(ceph_test_get_blkdev_size
+  common
+  pthread
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+#make check starts here
+
+#following dependencies are run inside make check unit tests
+add_dependencies(check 
+  ceph-mon
+  ceph
+  ceph-authtool
+  get_command_descriptions
+  crushtool
+  ceph-conf
+  rados
+  ceph-mds
+  monmaptool
+  ceph-osd
+  ceph-dencoder
+  unittest_librbd
+  ceph-objectstore-tool
+  ceph-monstore-tool
+  osdmaptool
+  rbd
+  radosgw-admin
+  ceph_example
+  ceph_snappy
+  cls_lock
+  ceph_test_objectstore
+  ceph_erasure_code_non_regression
+  ceph_erasure_code
+  ceph-disk
+  ceph-detect-init
+  cython_modules)
+
+add_ceph_test(test-ceph-helpers.sh ${CMAKE_CURRENT_SOURCE_DIR}/test-ceph-helpers.sh)
+add_ceph_test(erasure-decode-non-regression.sh ${CMAKE_SOURCE_DIR}/qa/workunits/erasure-code/encode-decode-non-regression.sh)
+
+add_ceph_test(ceph_objectstore_tool.py ${CMAKE_CURRENT_SOURCE_DIR}/ceph_objectstore_tool.py)
+add_ceph_test(cephtool-test-mds.sh ${CMAKE_CURRENT_SOURCE_DIR}/cephtool-test-mds.sh)
+add_ceph_test(cephtool-test-mon.sh ${CMAKE_CURRENT_SOURCE_DIR}/cephtool-test-mon.sh)
+add_ceph_test(cephtool-test-osd.sh ${CMAKE_CURRENT_SOURCE_DIR}/cephtool-test-osd.sh)
+add_ceph_test(cephtool-test-rados.sh ${CMAKE_CURRENT_SOURCE_DIR}/cephtool-test-rados.sh)
+add_ceph_test(run-rbd-unit-tests.sh ${CMAKE_CURRENT_SOURCE_DIR}/run-rbd-unit-tests.sh)
+add_ceph_test(run-cli-tests ${CMAKE_CURRENT_SOURCE_DIR}/run-cli-tests)
+add_ceph_test(test_objectstore_memstore.sh ${CMAKE_CURRENT_SOURCE_DIR}/test_objectstore_memstore.sh)
+add_ceph_test(test_pidfile.sh ${CMAKE_CURRENT_SOURCE_DIR}/test_pidfile.sh)
+add_ceph_test(test_subman.sh ${CMAKE_CURRENT_SOURCE_DIR}/test_subman.sh)
+add_ceph_test(unittest_bufferlist.sh ${CMAKE_SOURCE_DIR}/src/unittest_bufferlist.sh)
+
+add_test(NAME run-tox-ceph-disk COMMAND bash ${CMAKE_SOURCE_DIR}/src/ceph-disk/run-tox.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src)
+add_dependencies(check run-tox-ceph-disk)
+
+add_test(NAME run-tox-ceph-detect-init COMMAND bash ${CMAKE_SOURCE_DIR}/src/ceph-detect-init/run-tox.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src)
+add_dependencies(check run-tox-ceph-detect-init)
+
+set_property(TEST 
+  run-tox-ceph-disk
+  run-tox-ceph-detect-init
+  PROPERTY ENVIRONMENT 
+  CEPH_ROOT=${CMAKE_SOURCE_DIR}
+  CEPH_BIN=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+  CEPH_LIB=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+  LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib
+  PATH=$ENV{PATH}:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}:${CMAKE_SOURCE_DIR}/src
+  PYTHONPATH=${CMAKE_SOURCE_DIR}/src/pybind
+  )
+
+# unittest_admin_socket
+add_executable(unittest_admin_socket EXCLUDE_FROM_ALL
+  admin_socket.cc
+  )
+add_ceph_unittest(unittest_admin_socket ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_admin_socket)
+target_link_libraries(unittest_admin_socket global) 
+
+# unittest_encoding
+add_executable(unittest_encoding EXCLUDE_FROM_ALL
+  encoding.cc
+  )
+add_ceph_unittest(unittest_encoding ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_encoding)
+target_link_libraries(unittest_encoding librados pthread rt m ${BLKID_LIBRARIES})
+
+# unittest_addrs
+add_executable(unittest_addrs EXCLUDE_FROM_ALL
+  test_addrs.cc
+  )
+add_ceph_unittest(unittest_addrs ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_addrs)
+target_link_libraries(unittest_addrs librados pthread rt m ${BLKID_LIBRARIES}) 
+
+# unittest_workqueue
+add_executable(unittest_workqueue EXCLUDE_FROM_ALL
+  test_workqueue.cc
+  )
+add_ceph_unittest(unittest_workqueue ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_workqueue)
+target_link_libraries(unittest_workqueue global ${BLKID_LIBRARIES})
+
+# unittest_striper
+add_executable(unittest_striper EXCLUDE_FROM_ALL
+  test_striper.cc
+  )
+add_ceph_unittest(unittest_striper ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_striper)
+target_link_libraries(unittest_striper global ${BLKID_LIBRARIES})
+
+# unittest_prebufferedstreambuf
+add_executable(unittest_prebufferedstreambuf EXCLUDE_FROM_ALL
+  test_prebufferedstreambuf.cc
+  )
+add_ceph_unittest(unittest_prebufferedstreambuf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_prebufferedstreambuf)
+target_link_libraries(unittest_prebufferedstreambuf global ${BLKID_LIBRARIES})
+
+# unittest_str_list
+add_executable(unittest_str_list EXCLUDE_FROM_ALL
+  test_str_list.cc
+  )
+add_ceph_unittest(unittest_str_list ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_str_list)
+target_link_libraries(unittest_str_list global ${BLKID_LIBRARIES})
+
+# unittest_log
+add_executable(unittest_log EXCLUDE_FROM_ALL
+  ${CMAKE_SOURCE_DIR}/src/log/test.cc
+  )
+add_ceph_unittest(unittest_log ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_log)
+target_link_libraries(unittest_log global)
+
+# unittest_base64
+add_executable(unittest_base64 EXCLUDE_FROM_ALL
+  base64.cc
+  )
+add_ceph_unittest(unittest_base64 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_base64)
+target_link_libraries(unittest_base64 global) 
+
+# unittest_ceph_argparse
+add_executable(unittest_ceph_argparse EXCLUDE_FROM_ALL
+  ceph_argparse.cc
+  )
+add_ceph_unittest(unittest_ceph_argparse ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_ceph_argparse)
+target_link_libraries(unittest_ceph_argparse global)
+
+# unittest_ceph_compatset
+add_executable(unittest_ceph_compatset EXCLUDE_FROM_ALL
+  ceph_compatset.cc
+  )
+add_ceph_unittest(unittest_ceph_compatset ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_ceph_compatset)
+target_link_libraries(unittest_ceph_compatset global)
+
+# unittest_gather
+add_executable(unittest_gather EXCLUDE_FROM_ALL
+  gather.cc
+  )
+add_ceph_unittest(unittest_gather ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_gather)
+target_link_libraries(unittest_gather global)
+
+# unittest_run_cmd
+add_executable(unittest_run_cmd EXCLUDE_FROM_ALL
+  run_cmd.cc
+  )
+add_ceph_unittest(unittest_run_cmd ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_run_cmd)
+target_link_libraries(unittest_run_cmd global)
+
+# signals
+add_executable(unittest_signals EXCLUDE_FROM_ALL
+  signals.cc
+  )
+add_ceph_unittest(unittest_signals ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_signals)
+target_link_libraries(unittest_signals global)
+
+# unittest_simple_spin
+add_executable(unittest_simple_spin EXCLUDE_FROM_ALL
+  simple_spin.cc
+  )
+add_ceph_unittest(unittest_simple_spin ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_simple_spin)
+target_link_libraries(unittest_simple_spin global)
+
+# unittest_bufferlist
+add_executable(unittest_bufferlist EXCLUDE_FROM_ALL
+  bufferlist.cc
+  )
+add_ceph_unittest(unittest_bufferlist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_bufferlist)
+target_link_libraries(unittest_bufferlist global)
+
+# unittest_xlist
+add_executable(unittest_xlist EXCLUDE_FROM_ALL
+  test_xlist.cc
+  )
+add_ceph_unittest(unittest_xlist ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_xlist)
+target_link_libraries(unittest_xlist common)
+
+# unittest_arch
+add_executable(unittest_arch EXCLUDE_FROM_ALL
+  test_arch.cc
+  )
+add_ceph_unittest(unittest_arch ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_arch)
+target_link_libraries(unittest_arch global)
+
+# unittest_crypto
+add_executable(unittest_crypto EXCLUDE_FROM_ALL
+  crypto.cc
+  )
+add_ceph_unittest(unittest_crypto ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_crypto)
+target_link_libraries(unittest_crypto global)
+
+# unittest_crypto_init
+add_executable(unittest_crypto_init EXCLUDE_FROM_ALL
+  crypto_init.cc
+  )
+add_ceph_unittest(unittest_crypto_init ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_crypto_init)
+target_link_libraries(unittest_crypto_init global)
+
+# unittest_perf_counters
+add_executable(unittest_perf_counters EXCLUDE_FROM_ALL
+  perf_counters.cc
+  )
+add_ceph_unittest(unittest_perf_counters ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_perf_counters)
+target_link_libraries(unittest_perf_counters global)
+
+# unittest_ceph_crypto
+add_executable(unittest_ceph_crypto EXCLUDE_FROM_ALL
+  ceph_crypto.cc
+  )
+add_ceph_unittest(unittest_ceph_crypto ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_ceph_crypto)
+target_link_libraries(unittest_ceph_crypto global)
+
+# unittest_utf8
+add_executable(unittest_utf8 EXCLUDE_FROM_ALL
+  utf8.cc
+  )
+add_ceph_unittest(unittest_utf8 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_utf8)
+target_link_libraries(unittest_utf8 global)
+
+# unittest_mime
+add_executable(unittest_mime EXCLUDE_FROM_ALL
+  mime.cc
+  )
+add_ceph_unittest(unittest_mime ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mime)
+target_link_libraries(unittest_mime global)
+
+# unittest_escape
+add_executable(unittest_escape EXCLUDE_FROM_ALL
+  escape.cc
+  )
+add_ceph_unittest(unittest_escape ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_escape)
+target_link_libraries(unittest_escape global)
+
+# unittest_strtol
+add_executable(unittest_strtol EXCLUDE_FROM_ALL
+  strtol.cc
+  )
+add_ceph_unittest(unittest_strtol ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_strtol)
+target_link_libraries(unittest_strtol global)
+
+# unittest_confutils
+add_executable(unittest_confutils EXCLUDE_FROM_ALL
+  confutils.cc
+  )
+add_ceph_unittest(unittest_confutils ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_confutils)
+target_link_libraries(unittest_confutils global)
+
+# unittest_heartbeatmap
+add_executable(unittest_heartbeatmap EXCLUDE_FROM_ALL
+  heartbeat_map.cc
+  )
+add_ceph_unittest(unittest_heartbeatmap ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_heartbeatmap)
+target_link_libraries(unittest_heartbeatmap global)
+
+if(${WITH_RADOSGW})
+  # unittest_formatter
+  # why does this include rgw/rgw_formats.cc...?
+  add_executable(unittest_formatter EXCLUDE_FROM_ALL
+    formatter.cc
+    ${CMAKE_SOURCE_DIR}/src/rgw/rgw_formats.cc
+  )
+  add_ceph_unittest(unittest_formatter ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_formatter)
+  target_link_libraries(unittest_formatter global)
+endif(${WITH_RADOSGW})
+
+# unittest_daemon_config
+add_executable(unittest_daemon_config EXCLUDE_FROM_ALL
+  daemon_config.cc
+  )
+add_ceph_unittest(unittest_daemon_config ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_daemon_config)
+target_link_libraries(unittest_daemon_config
+  common
+  global
+  ${BLKID_LIBRARIES}
+  ${EXTRALIBS}
+  )
+
+# unittest_libcephfs_config
+add_executable(unittest_libcephfs_config EXCLUDE_FROM_ALL
+  libcephfs_config.cc
+  )
+add_ceph_unittest(unittest_libcephfs_config ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_libcephfs_config)
+target_link_libraries(unittest_libcephfs_config cephfs)
+
+# unittest_rbd_replay
+add_executable(unittest_rbd_replay EXCLUDE_FROM_ALL
+  test_rbd_replay.cc
+  $<TARGET_OBJECTS:parse_secret_objs>
+)
+add_ceph_unittest(unittest_rbd_replay ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_rbd_replay)
+target_link_libraries(unittest_rbd_replay
+  librbd
+  librados
+  global
+  rbd_replay
+  rbd_replay_ios
+  keyutils
+  ${BLKID_LIBRARIES}
+  )
+
+# unittest_ipaddr
+add_executable(unittest_ipaddr EXCLUDE_FROM_ALL
+  test_ipaddr.cc)  
+add_ceph_unittest(unittest_ipaddr ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_ipaddr)
+target_link_libraries(unittest_ipaddr mon global)
+
+# unittest_texttable
+add_executable(unittest_texttable EXCLUDE_FROM_ALL
+  test_texttable.cc
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  )
+add_ceph_unittest(unittest_texttable ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_texttable)
+target_link_libraries(unittest_texttable mon global)
+
+# unittest_on_exit
+add_executable(unittest_on_exit EXCLUDE_FROM_ALL
+  on_exit.cc
+  )
+add_ceph_unittest(unittest_on_exit ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_on_exit)
+target_link_libraries(unittest_on_exit global)
+
+# unittest_subprocess
+add_executable(unittest_subprocess EXCLUDE_FROM_ALL
+  test_subprocess.cc
+  )
+add_ceph_unittest(unittest_subprocess ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_subprocess)
+target_link_libraries(unittest_subprocess global)
+
+# unittest_pageset
+add_executable(unittest_pageset EXCLUDE_FROM_ALL test_pageset.cc)
+add_ceph_unittest(unittest_pageset ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_pageset)
+
+#make check ends here
+
diff --git a/src/test/Makefile.am b/src/test/Makefile.am
index c865b68..ce6fc20 100644
--- a/src/test/Makefile.am
+++ b/src/test/Makefile.am
@@ -1,3 +1,40 @@
+EXTRA_DIST += \
+	test/CMakeLists.txt \
+	test/ObjectMap/CMakeLists.txt \
+	test/bench/CMakeLists.txt \
+	test/cls_hello/CMakeLists.txt \
+	test/cls_lock/CMakeLists.txt \
+	test/cls_log/CMakeLists.txt \
+	test/cls_numops/CMakeLists.txt \
+	test/cls_rbd/CMakeLists.txt \
+	test/cls_refcount/CMakeLists.txt \
+	test/cls_replica_log/CMakeLists.txt \
+	test/cls_rgw/CMakeLists.txt \
+	test/cls_statelog/CMakeLists.txt \
+	test/cls_version/CMakeLists.txt \
+	test/common/CMakeLists.txt \
+	test/crush/CMakeLists.txt \
+	test/encoding/CMakeLists.txt \
+	test/filestore/CMakeLists.txt \
+	test/fs/CMakeLists.txt \
+	test/journal/CMakeLists.txt \
+	test/libcephfs/CMakeLists.txt \
+	test/librados/CMakeLists.txt \
+	test/librados_test_stub/CMakeLists.txt \
+	test/libradosstriper/CMakeLists.txt \
+	test/librbd/CMakeLists.txt \
+	test/mds/CMakeLists.txt \
+	test/mon/CMakeLists.txt \
+	test/msgr/CMakeLists.txt \
+	test/objectstore/CMakeLists.txt \
+	test/os/CMakeLists.txt \
+	test/osd/CMakeLists.txt \
+	test/osdc/CMakeLists.txt \
+	test/pybind/CMakeLists.txt \
+	test/rbd_mirror/CMakeLists.txt \
+	test/rgw/CMakeLists.txt \
+	test/system/CMakeLists.txt
+
 include test/erasure-code/Makefile.am
 include test/messenger/Makefile.am
 include test/compressor/Makefile.am
diff --git a/src/test/ObjectMap/CMakeLists.txt b/src/test/ObjectMap/CMakeLists.txt
new file mode 100644
index 0000000..2a37b5a
--- /dev/null
+++ b/src/test/ObjectMap/CMakeLists.txt
@@ -0,0 +1,47 @@
+# ceph_test_object_map
+add_executable(ceph_test_object_map
+  test_object_map.cc
+  KeyValueDBMemory.cc
+  )
+set_target_properties(ceph_test_object_map PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_object_map
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_keyvaluedb_atomicity
+add_executable(ceph_test_keyvaluedb_atomicity
+  test_keyvaluedb_atomicity.cc
+  )
+set_target_properties(ceph_test_keyvaluedb_atomicity PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_keyvaluedb_atomicity
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_keyvaluedb_iterators
+add_executable(ceph_test_keyvaluedb_iterators
+  test_keyvaluedb_iterators.cc
+  KeyValueDBMemory.cc
+  )
+set_target_properties(ceph_test_keyvaluedb_iterators PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_keyvaluedb_iterators
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
diff --git a/src/test/bench/CMakeLists.txt b/src/test/bench/CMakeLists.txt
new file mode 100644
index 0000000..6af7662
--- /dev/null
+++ b/src/test/bench/CMakeLists.txt
@@ -0,0 +1,75 @@
+# smalliobench
+set(smalliobench_srcs
+  small_io_bench.cc
+  rados_backend.cc
+  detailed_stat_collector.cc
+  bencher.cc
+  )
+add_executable(ceph_smalliobench
+  ${smalliobench_srcs}
+  )
+target_link_libraries(ceph_smalliobench librados ${Boost_PROGRAM_OPTIONS_LIBRARY} global
+  ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
+# ceph_smalliobenchrbd
+if (${WITH_RBD})
+  set(smalliobenchrbd_srcs
+    small_io_bench_rbd.cc
+    rbd_backend.cc
+    detailed_stat_collector.cc
+    bencher.cc
+    ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+    ${CMAKE_SOURCE_DIR}/src/common/secret.c
+  )
+  add_executable(ceph_smalliobenchrbd
+    ${smalliobenchrbd_srcs}
+    )
+  target_link_libraries(ceph_smalliobenchrbd
+    librbd
+    librados
+    os
+    global
+    ${Boost_PROGRAM_OPTIONS_LIBRARY}
+    udev
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS}
+    keyutils
+    )
+endif (${WITH_RBD})
+
+# ceph_smalliobenchfs
+set(ceph_smalliobenchfs_srcs
+  small_io_bench_fs.cc
+  testfilestore_backend.cc
+  detailed_stat_collector.cc
+  bencher.cc
+  )
+add_executable(ceph_smalliobenchfs
+  ${ceph_smalliobenchfs_srcs}
+  )
+target_link_libraries(ceph_smalliobenchfs librados ${Boost_PROGRAM_OPTIONS_LIBRARY} os global
+  ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
+# ceph_smalliobenchdumb
+set(smalliobenchdumb_srcs
+  small_io_bench_dumb.cc
+  dumb_backend.cc
+  detailed_stat_collector.cc
+  bencher.cc
+  )
+add_executable(ceph_smalliobenchdumb
+  ${smalliobenchdumb_srcs}
+  )
+target_link_libraries(ceph_smalliobenchdumb librados ${Boost_PROGRAM_OPTIONS_LIBRARY} os global
+  ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
+# ceph_tpbench
+set(tpbench_srcs
+  tp_bench.cc
+  detailed_stat_collector.cc)
+add_executable(ceph_tpbench
+  ${tpbench_srcs}
+  )
+target_link_libraries(ceph_tpbench librados ${Boost_PROGRAM_OPTIONS_LIBRARY} global
+  ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+
diff --git a/src/test/centos-6/ceph.spec.in b/src/test/centos-6/ceph.spec.in
index b2e4b12..9ddd75f 100644
--- a/src/test/centos-6/ceph.spec.in
+++ b/src/test/centos-6/ceph.spec.in
@@ -33,10 +33,12 @@
 %bcond_with selinux
 %endif
 
-# LTTng-UST enabled on Fedora, RHEL 6+, and SLES 12
-%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version} == 1315
+# LTTng-UST enabled on Fedora, RHEL 6+, and SLE (not openSUSE)
+%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version}
+%if ! 0%{?is_opensuse}
 %bcond_without lttng
 %endif
+%endif
 
 %if %{with selinux}
 # get selinux policy version
@@ -116,6 +118,7 @@ BuildRequires:	python-requests
 BuildRequires:	python-sphinx
 BuildRequires:	python-virtualenv
 BuildRequires:	snappy-devel
+BuildRequires:	udev
 BuildRequires:	util-linux
 BuildRequires:	valgrind-devel
 BuildRequires:	xfsprogs
@@ -878,8 +881,8 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_mandir}/man8/rbd-replay-prep.8*
 %dir %{_datadir}/ceph/
 %{_datadir}/ceph/known_hosts_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com.pub
+%{_datadir}/ceph/id_rsa_drop.ceph.com
+%{_datadir}/ceph/id_rsa_drop.ceph.com.pub
 %dir %{_sysconfdir}/ceph/
 %config %{_sysconfdir}/bash_completion.d/rados
 %config %{_sysconfdir}/bash_completion.d/rbd
@@ -887,6 +890,7 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_unitdir}/rbdmap.service
 %{python_sitelib}/ceph_argparse.py*
 %{python_sitelib}/ceph_daemon.py*
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/50-rbd.rules
 %attr(3770,ceph,ceph) %dir %{_localstatedir}/log/ceph/
 %attr(750,ceph,ceph) %dir %{_localstatedir}/lib/ceph/
@@ -1156,6 +1160,7 @@ fi
 %{_sbindir}/ceph-disk
 %{_sbindir}/ceph-disk-udev
 %{_libexecdir}/ceph/ceph-osd-prestart.sh
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/60-ceph-by-parttypeuuid.rules
 %{_udevrulesdir}/95-ceph-osd.rules
 %{_mandir}/man8/ceph-clsinfo.8*
diff --git a/src/test/centos-7/ceph.spec.in b/src/test/centos-7/ceph.spec.in
index b2e4b12..9ddd75f 100644
--- a/src/test/centos-7/ceph.spec.in
+++ b/src/test/centos-7/ceph.spec.in
@@ -33,10 +33,12 @@
 %bcond_with selinux
 %endif
 
-# LTTng-UST enabled on Fedora, RHEL 6+, and SLES 12
-%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version} == 1315
+# LTTng-UST enabled on Fedora, RHEL 6+, and SLE (not openSUSE)
+%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version}
+%if ! 0%{?is_opensuse}
 %bcond_without lttng
 %endif
+%endif
 
 %if %{with selinux}
 # get selinux policy version
@@ -116,6 +118,7 @@ BuildRequires:	python-requests
 BuildRequires:	python-sphinx
 BuildRequires:	python-virtualenv
 BuildRequires:	snappy-devel
+BuildRequires:	udev
 BuildRequires:	util-linux
 BuildRequires:	valgrind-devel
 BuildRequires:	xfsprogs
@@ -878,8 +881,8 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_mandir}/man8/rbd-replay-prep.8*
 %dir %{_datadir}/ceph/
 %{_datadir}/ceph/known_hosts_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com.pub
+%{_datadir}/ceph/id_rsa_drop.ceph.com
+%{_datadir}/ceph/id_rsa_drop.ceph.com.pub
 %dir %{_sysconfdir}/ceph/
 %config %{_sysconfdir}/bash_completion.d/rados
 %config %{_sysconfdir}/bash_completion.d/rbd
@@ -887,6 +890,7 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_unitdir}/rbdmap.service
 %{python_sitelib}/ceph_argparse.py*
 %{python_sitelib}/ceph_daemon.py*
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/50-rbd.rules
 %attr(3770,ceph,ceph) %dir %{_localstatedir}/log/ceph/
 %attr(750,ceph,ceph) %dir %{_localstatedir}/lib/ceph/
@@ -1156,6 +1160,7 @@ fi
 %{_sbindir}/ceph-disk
 %{_sbindir}/ceph-disk-udev
 %{_libexecdir}/ceph/ceph-osd-prestart.sh
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/60-ceph-by-parttypeuuid.rules
 %{_udevrulesdir}/95-ceph-osd.rules
 %{_mandir}/man8/ceph-clsinfo.8*
diff --git a/src/test/cli/radosgw-admin/help.t b/src/test/cli/radosgw-admin/help.t
index 606a5f3..5fb1321 100644
--- a/src/test/cli/radosgw-admin/help.t
+++ b/src/test/cli/radosgw-admin/help.t
@@ -192,6 +192,7 @@
   Orphans search options:
      --pool                    data pool to scan for leaked rados objects in
      --num-shards              num of shards to use for keeping the temporary scan info
+     --orphan-stale-secs       num of seconds to wait before declaring an object to be an orphan (default: 86400)
      --job-id                  set the job id (for orphans find)
      --max-concurrent-ios      maximum concurrent ios for orphans find (default: 32)
   
diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t
index 4848370..6c86a41 100644
--- a/src/test/cli/rbd/help.t
+++ b/src/test/cli/rbd/help.t
@@ -30,6 +30,7 @@
       import-diff                 Import an incremental diff.
       info                        Show information about image size, striping,
                                   etc.
+      journal client disconnect   Flag image journal client as disconnected.
       journal export              Export image journal.
       journal import              Import image journal.
       journal info                Show information about image journal.
@@ -546,6 +547,24 @@
     --format arg          output format [plain, json, or xml]
     --pretty-format       pretty formatting (json and xml)
   
+  rbd help journal client disconnect
+  usage: rbd journal client disconnect [--pool <pool>] [--image <image>] 
+                                       [--journal <journal>] 
+                                       [--client-id <client-id>] 
+                                       <journal-spec> 
+  
+  Flag image journal client as disconnected.
+  
+  Positional arguments
+    <journal-spec>       journal specification
+                         (example: [<pool-name>/]<journal-name>)
+  
+  Optional arguments
+    -p [ --pool ] arg    pool name
+    --image arg          image name
+    --journal arg        journal name
+    --client-id arg      client ID (or leave unspecified to disconnect all)
+  
   rbd help journal export
   usage: rbd journal export [--pool <pool>] [--image <image>] 
                             [--journal <journal>] [--path <path>] [--verbose] 
@@ -738,8 +757,8 @@
     -p [ --pool ] arg     pool name
     --image arg           image name
     --snap arg            snapshot name
-    -o [ --options ] arg  mapping options
-    --read-only           mount read-only
+    -o [ --options ] arg  map options
+    --read-only           map read-only
   
   rbd help merge-diff
   usage: rbd merge-diff [--path <path>] [--no-progress] 
@@ -1207,6 +1226,7 @@
   
   rbd help unmap
   usage: rbd unmap [--pool <pool>] [--image <image>] [--snap <snap>] 
+                   [--options <options>] 
                    <image-or-snap-or-device-spec> 
   
   Unmap a rbd device that was used by the kernel.
@@ -1220,6 +1240,7 @@
     -p [ --pool ] arg               pool name
     --image arg                     image name
     --snap arg                      snapshot name
+    -o [ --options ] arg            unmap options
   
   rbd help watch
   usage: rbd watch [--pool <pool>] [--image <image>] 
diff --git a/src/test/cls_hello/CMakeLists.txt b/src/test/cls_hello/CMakeLists.txt
new file mode 100644
index 0000000..01b4ac3
--- /dev/null
+++ b/src/test/cls_hello/CMakeLists.txt
@@ -0,0 +1,15 @@
+add_executable(ceph_test_cls_hello
+  test_cls_hello.cc
+  )
+set_target_properties(ceph_test_cls_hello PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_hello
+  librados
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  radostest
+  ${UNITTEST_LIBS}
+  )
+
diff --git a/src/test/cls_lock/CMakeLists.txt b/src/test/cls_lock/CMakeLists.txt
new file mode 100644
index 0000000..c254491
--- /dev/null
+++ b/src/test/cls_lock/CMakeLists.txt
@@ -0,0 +1,17 @@
+add_executable(ceph_test_cls_lock
+  test_cls_lock.cc
+  )
+set_target_properties(ceph_test_cls_lock PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_lock
+  cls_lock
+  librados
+  global
+  ${UNITTEST_LIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  radostest
+  )
+
diff --git a/src/test/cls_log/CMakeLists.txt b/src/test/cls_log/CMakeLists.txt
new file mode 100644
index 0000000..ba9d6ab
--- /dev/null
+++ b/src/test/cls_log/CMakeLists.txt
@@ -0,0 +1,17 @@
+add_executable(ceph_test_cls_log
+  test_cls_log.cc
+  )
+set_target_properties(ceph_test_cls_log PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_log
+  librados
+  cls_log_client
+  global
+  radostest
+  ${UNITTEST_LIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  )
+
diff --git a/src/test/cls_numops/CMakeLists.txt b/src/test/cls_numops/CMakeLists.txt
new file mode 100644
index 0000000..e4d8a9f
--- /dev/null
+++ b/src/test/cls_numops/CMakeLists.txt
@@ -0,0 +1,16 @@
+# ceph_test_cls_numops
+add_executable(ceph_test_cls_numops 
+  test_cls_numops.cc)
+set_target_properties(ceph_test_cls_numops PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_numops 
+  librados 
+  global
+  cls_numops_client 
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  radostest
+  ${UNITTEST_LIBS} 
+  )
+
diff --git a/src/test/cls_rbd/CMakeLists.txt b/src/test/cls_rbd/CMakeLists.txt
new file mode 100644
index 0000000..ac6029b
--- /dev/null
+++ b/src/test/cls_rbd/CMakeLists.txt
@@ -0,0 +1,24 @@
+# cls_test_cls_rbd
+add_executable(ceph_test_cls_rbd
+  test_cls_rbd.cc
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  ${CMAKE_SOURCE_DIR}/src/common/secret.c
+  )
+set_target_properties(ceph_test_cls_rbd PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_rbd
+  librbd
+  cls_rbd
+  cls_lock
+  librados
+  global
+  ${UNITTEST_LIBS}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  radostest
+  blkid
+  udev
+  keyutils
+  )
+
diff --git a/src/test/cls_refcount/CMakeLists.txt b/src/test/cls_refcount/CMakeLists.txt
new file mode 100644
index 0000000..ebbdfb7
--- /dev/null
+++ b/src/test/cls_refcount/CMakeLists.txt
@@ -0,0 +1,18 @@
+# ceph_test_cls_refcount
+add_executable(ceph_test_cls_refcount
+  test_cls_refcount.cc
+  )
+set_target_properties(ceph_test_cls_refcount PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_refcount
+  librados
+  cls_refcount_client
+  global
+  ${UNITTEST_LIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  radostest
+  )
+
diff --git a/src/test/cls_replica_log/CMakeLists.txt b/src/test/cls_replica_log/CMakeLists.txt
new file mode 100644
index 0000000..bf7ce99
--- /dev/null
+++ b/src/test/cls_replica_log/CMakeLists.txt
@@ -0,0 +1,18 @@
+# ceph_test_cls_replica_log
+add_executable(ceph_test_cls_replica_log
+  test_cls_replica_log.cc
+  )
+set_target_properties(ceph_test_cls_replica_log PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_replica_log
+  librados
+  cls_replica_log_client
+  global
+  ${UNITTEST_LIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  radostest
+  )
+
diff --git a/src/test/cls_rgw/CMakeLists.txt b/src/test/cls_rgw/CMakeLists.txt
new file mode 100644
index 0000000..c67e415
--- /dev/null
+++ b/src/test/cls_rgw/CMakeLists.txt
@@ -0,0 +1,17 @@
+if(${WITH_RADOSGW})
+  add_executable(ceph_test_cls_rgw
+    test_cls_rgw.cc
+    )
+  set_target_properties(ceph_test_cls_rgw PROPERTIES COMPILE_FLAGS
+    ${UNITTEST_CXX_FLAGS})
+  target_link_libraries(ceph_test_cls_rgw
+    cls_rgw_client
+    librados
+    global
+    ${UNITTEST_LIBS}
+    ${EXTRALIBS}
+    ${BLKID_LIBRARIES}
+    ${CMAKE_DL_LIBS}
+    radostest)
+endif(${WITH_RADOSGW})
+
diff --git a/src/test/cls_statelog/CMakeLists.txt b/src/test/cls_statelog/CMakeLists.txt
new file mode 100644
index 0000000..5f77979
--- /dev/null
+++ b/src/test/cls_statelog/CMakeLists.txt
@@ -0,0 +1,18 @@
+# ceph_test_cls_statelog
+add_executable(ceph_test_cls_statelog
+  test_cls_statelog.cc
+  )
+set_target_properties(ceph_test_cls_statelog PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_statelog
+  librados
+  cls_statelog_client
+  global
+  ${UNITTEST_LIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  radostest
+  )
+
diff --git a/src/test/cls_version/CMakeLists.txt b/src/test/cls_version/CMakeLists.txt
new file mode 100644
index 0000000..24fabc9
--- /dev/null
+++ b/src/test/cls_version/CMakeLists.txt
@@ -0,0 +1,18 @@
+# ceph_test_cls_version
+add_executable(ceph_test_cls_version
+  test_cls_version.cc
+  )
+set_target_properties(ceph_test_cls_version PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_cls_version
+  librados
+  cls_version_client
+  global
+  ${UNITTEST_LIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  radostest
+  )
+
diff --git a/src/test/common/CMakeLists.txt b/src/test/common/CMakeLists.txt
new file mode 100644
index 0000000..4fd71ab
--- /dev/null
+++ b/src/test/common/CMakeLists.txt
@@ -0,0 +1,190 @@
+# get_command_descriptions
+add_executable(get_command_descriptions
+  get_command_descriptions.cc
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  )
+target_link_libraries(get_command_descriptions
+  mon
+  global
+  leveldb
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# unittest_blkdev
+add_executable(unittest_blkdev EXCLUDE_FROM_ALL
+  test_blkdev.cc
+  )
+add_ceph_unittest(unittest_blkdev ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_blkdev)
+target_link_libraries(unittest_blkdev global ${BLKID_LIBRARIES})
+
+# unittest_bloom_filter
+add_executable(unittest_bloom_filter EXCLUDE_FROM_ALL
+  test_bloom_filter.cc
+  )
+add_ceph_unittest(unittest_bloom_filter ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_bloom_filter)
+target_link_libraries(unittest_bloom_filter global ${BLKID_LIBRARIES}) 
+
+# unittest_histogram
+add_executable(unittest_histogram EXCLUDE_FROM_ALL
+  histogram.cc
+  )
+add_ceph_unittest(unittest_histogram ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_histogram)
+target_link_libraries(unittest_histogram global ${BLKID_LIBRARIES})
+
+# unittest_prioritized_queue
+add_executable(unittest_prioritized_queue EXCLUDE_FROM_ALL
+  test_prioritized_queue.cc
+  )
+add_ceph_unittest(unittest_prioritized_queue ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_prioritized_queue)
+target_link_libraries(unittest_prioritized_queue global ${BLKID_LIBRARIES})
+
+# unittest_str_map
+add_executable(unittest_str_map EXCLUDE_FROM_ALL
+  test_str_map.cc
+  )
+add_ceph_unittest(unittest_str_map ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_str_map)
+target_link_libraries(unittest_str_map common global ${BLKID_LIBRARIES})
+
+# unittest_sharedptr_registry
+add_executable(unittest_sharedptr_registry EXCLUDE_FROM_ALL
+  test_sharedptr_registry.cc
+  )
+add_ceph_unittest(unittest_sharedptr_registry ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_sharedptr_registry)
+target_link_libraries(unittest_sharedptr_registry global ${BLKID_LIBRARIES})
+
+# unittest_shared_cache
+add_executable(unittest_shared_cache EXCLUDE_FROM_ALL
+  test_shared_cache.cc
+  )
+add_ceph_unittest(unittest_shared_cache ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_shared_cache)
+target_link_libraries(unittest_shared_cache global ${BLKID_LIBRARIES})
+
+# unittest_sloppy_crc_map
+add_executable(unittest_sloppy_crc_map EXCLUDE_FROM_ALL
+  test_sloppy_crc_map.cc
+  )
+add_ceph_unittest(unittest_sloppy_crc_map ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_sloppy_crc_map)
+target_link_libraries(unittest_sloppy_crc_map global ${BLKID_LIBRARIES})
+
+# unittest_time
+add_executable(unittest_time EXCLUDE_FROM_ALL
+  test_time.cc
+  ${CMAKE_SOURCE_DIR}/src/common/ceph_time.cc
+  )
+add_ceph_unittest(unittest_time ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_time)
+target_link_libraries(unittest_time global ${BLKID_LIBRARIES})
+
+# unittest_util
+add_executable(unittest_util EXCLUDE_FROM_ALL
+  test_util.cc
+  ${CMAKE_SOURCE_DIR}/src/common/util.cc
+  )
+add_ceph_unittest(unittest_util ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_util)
+target_link_libraries(unittest_util global ${BLKID_LIBRARIES})
+
+# unittest_throttle
+add_executable(unittest_throttle EXCLUDE_FROM_ALL
+  Throttle.cc
+  )
+add_ceph_unittest(unittest_throttle ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_throttle)
+target_link_libraries(unittest_throttle global) 
+
+# unittest_lru
+add_executable(unittest_lru EXCLUDE_FROM_ALL
+  test_lru.cc
+  )
+add_ceph_unittest(unittest_lru ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_lru)
+target_link_libraries(unittest_lru global)
+
+# unittest_io_priority
+add_executable(unittest_io_priority EXCLUDE_FROM_ALL
+  test_io_priority.cc
+  )
+add_ceph_unittest(unittest_io_priority ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_io_priority)
+target_link_libraries(unittest_io_priority global)
+
+# unittest_crc32c
+add_executable(unittest_crc32c EXCLUDE_FROM_ALL
+  test_crc32c.cc
+  )
+add_ceph_unittest(unittest_crc32c ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_crc32c)
+target_link_libraries(unittest_crc32c global)
+
+# unittest_config
+add_executable(unittest_config EXCLUDE_FROM_ALL
+  test_config.cc
+  )
+add_ceph_unittest(unittest_config ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_config)
+target_link_libraries(unittest_config global)
+
+# unittest_context
+add_executable(unittest_context EXCLUDE_FROM_ALL
+  test_context.cc
+  )
+add_ceph_unittest(unittest_context ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_context)
+target_link_libraries(unittest_context global)
+
+# unittest_safe_io
+add_executable(unittest_safe_io EXCLUDE_FROM_ALL
+  test_safe_io.cc
+  )
+add_ceph_unittest(unittest_safe_io ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_safe_io)
+target_link_libraries(unittest_safe_io global)
+
+# unittest_readahead
+add_executable(unittest_readahead EXCLUDE_FROM_ALL
+  Readahead.cc
+  )
+add_ceph_unittest(unittest_readahead ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_readahead)
+target_link_libraries(unittest_readahead global)
+
+# unittest_tableformatter
+add_executable(unittest_tableformatter EXCLUDE_FROM_ALL
+  test_tableformatter.cc
+  )
+add_ceph_unittest(unittest_tableformatter ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_tableformatter)
+target_link_libraries(unittest_tableformatter global)
+
+# unittest_bit_vector
+add_executable(unittest_bit_vector EXCLUDE_FROM_ALL
+  test_bit_vector.cc
+  )
+add_ceph_unittest(unittest_bit_vector ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_bit_vector)
+target_link_libraries(unittest_bit_vector global)
+
+# unittest_async_compressor
+add_executable(unittest_async_compressor EXCLUDE_FROM_ALL
+  test_async_compressor.cc
+)
+add_ceph_unittest(unittest_async_compressor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_async_compressor)
+target_link_libraries(unittest_async_compressor global compressor)
+
+# unittest_interval_set
+add_executable(unittest_interval_set EXCLUDE_FROM_ALL
+  test_interval_set.cc
+)
+add_ceph_unittest(unittest_interval_set ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_interval_set)
+target_link_libraries(unittest_interval_set global)
+
+# unittest_weighted_priority_queue
+add_executable(unittest_weighted_priority_queue EXCLUDE_FROM_ALL
+  test_weighted_priority_queue.cc
+  )
+add_ceph_unittest(unittest_weighted_priority_queue ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_weighted_priority_queue)
+target_link_libraries(unittest_weighted_priority_queue global ${BLKID_LIBRARIES}) 
+
+# unittest_mutex_debug
+add_executable(unittest_mutex_debug EXCLUDE_FROM_ALL
+  test_mutex_debug.cc
+  )
+add_ceph_unittest(unittest_mutex_debug ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mutex_debug)
+target_link_libraries(unittest_mutex_debug global ${BLKID_LIBRARIES} ${EXTRALIBS})
+
+# unittest_shunique_lock
+add_executable(unittest_shunique_lock EXCLUDE_FROM_ALL
+  test_shunique_lock.cc
+  )
+add_ceph_unittest(unittest_shunique_lock ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_shunique_lock)
+target_link_libraries(unittest_shunique_lock global ${BLKID_LIBRARIES} ${EXTRALIBS})
diff --git a/src/test/compressor/CMakeLists.txt b/src/test/compressor/CMakeLists.txt
new file mode 100644
index 0000000..0b35f54
--- /dev/null
+++ b/src/test/compressor/CMakeLists.txt
@@ -0,0 +1,76 @@
+add_library(ceph_example SHARED
+  compressor_plugin_example.cc
+  ${CMAKE_SOURCE_DIR}/src/compressor/Compressor.cc
+  )
+target_link_libraries(ceph_example crush pthread ${EXTRA_LIBS})
+
+# unittest_compression_plugin
+add_executable(unittest_compression_plugin EXCLUDE_FROM_ALL
+  test_compression_plugin.cc
+  ${CMAKE_SOURCE_DIR}/src/compressor/Compressor.cc
+  )
+add_ceph_unittest(unittest_compression_plugin ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_compression_plugin)
+target_link_libraries(unittest_compression_plugin 
+  osd
+  common 
+  global 
+  dl 
+  )
+
+# unittest_compression_snappy
+add_executable(unittest_compression_snappy EXCLUDE_FROM_ALL
+  test_compression_snappy.cc
+  ${snappy_sources}
+  )
+add_ceph_unittest(unittest_compression_snappy ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_compression_snappy)
+target_link_libraries(unittest_compression_snappy 
+  osd
+  common 
+  global 
+  dl 
+  snappy
+  )
+
+# unittest_compression_plugin_snappy
+add_executable(unittest_compression_plugin_snappy EXCLUDE_FROM_ALL
+  test_compression_plugin_snappy.cc
+  ${snappy_sources}
+  )
+add_ceph_unittest(unittest_compression_plugin_snappy ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_compression_plugin_snappy)
+target_link_libraries(unittest_compression_plugin_snappy 
+  osd
+  common 
+  global 
+  compressor
+  dl 
+  snappy
+  )
+
+# unittest_compression_zlib
+add_executable(unittest_compression_zlib EXCLUDE_FROM_ALL
+  test_compression_zlib.cc
+  ${CMAKE_SOURCE_DIR}/src/compressor/zlib/CompressionZlib.cc
+  )
+add_ceph_unittest(unittest_compression_zlib ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_compression_zlib)
+target_link_libraries(unittest_compression_zlib 
+  z
+  osd
+  common 
+  global 
+  )
+
+# unittest_compression_plugin_zlib
+add_executable(unittest_compression_plugin_zlib EXCLUDE_FROM_ALL
+  test_compression_plugin_zlib.cc
+  ${zlib_sources}
+  )
+add_ceph_unittest(unittest_compression_plugin_zlib ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_compression_plugin_zlib)
+target_link_libraries(unittest_compression_plugin_zlib 
+  osd
+  common 
+  global 
+  compressor
+  dl 
+  z
+  )
+
diff --git a/src/test/compressor/Makefile.am b/src/test/compressor/Makefile.am
index 4a41354..4f0d881 100644
--- a/src/test/compressor/Makefile.am
+++ b/src/test/compressor/Makefile.am
@@ -69,3 +69,5 @@ check_TESTPROGRAMS += unittest_compression_plugin_zlib
 
 endif # WITH_OSD
 endif # ENABLE_SERVER
+
+EXTRA_DIST += test/compressor/CMakeLists.txt
diff --git a/src/test/crush/CMakeLists.txt b/src/test/crush/CMakeLists.txt
new file mode 100644
index 0000000..23ecba0
--- /dev/null
+++ b/src/test/crush/CMakeLists.txt
@@ -0,0 +1,13 @@
+# unittest_crush_wrapper
+add_executable(unittest_crush_wrapper EXCLUDE_FROM_ALL
+  CrushWrapper.cc
+  )
+add_ceph_unittest(unittest_crush_wrapper ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_crush_wrapper)
+target_link_libraries(unittest_crush_wrapper global crush ${BLKID_LIBRARIES})
+
+# unittest_crush
+add_executable(unittest_crush EXCLUDE_FROM_ALL
+  crush.cc
+  )
+add_ceph_unittest(unittest_crush ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_crush)
+target_link_libraries(unittest_crush global m ${BLKID_LIBRARIES})
diff --git a/src/test/crush/CrushWrapper.cc b/src/test/crush/CrushWrapper.cc
index 1d85274..035be92 100644
--- a/src/test/crush/CrushWrapper.cc
+++ b/src/test/crush/CrushWrapper.cc
@@ -708,6 +708,48 @@ TEST(CrushWrapper, insert_item) {
   delete c;
 }
 
+TEST(CrushWrapper, remove_item) {
+  auto *c = new CrushWrapper;
+
+  const int ROOT_TYPE = 2;
+  c->set_type_name(ROOT_TYPE, "root");
+  const int HOST_TYPE = 1;
+  c->set_type_name(HOST_TYPE, "host");
+  const int OSD_TYPE = 0;
+  c->set_type_name(OSD_TYPE, "osd");
+
+  {
+    int root;
+    ASSERT_EQ(0, c->add_bucket(0, CRUSH_BUCKET_STRAW, CRUSH_HASH_RJENKINS1,
+			       ROOT_TYPE, 0, NULL, NULL, &root));
+    c->set_item_name(root, "root0");
+  }
+
+  {
+    int host;
+    c->add_bucket(0, CRUSH_BUCKET_TREE, CRUSH_HASH_RJENKINS1,
+		  HOST_TYPE, 0, NULL, NULL, &host);
+    c->set_item_name(host, "host0");
+  }
+
+  const int num_osd = 12;
+  {
+    map<string, string> loc = {{"root", "root0"},
+			       {"host", "host0"}};
+    string name{"osd."};
+    for (int item = 0; item < num_osd; item++) {
+      ASSERT_EQ(0, c->insert_item(g_ceph_context, item, 1.0,
+				  name + to_string(item), loc));
+    }
+  }
+  const int item_to_remove = num_osd / 2;
+  map<string, string> loc;
+  loc.insert(c->get_immediate_parent(item_to_remove));
+  ASSERT_EQ(0, c->remove_item(g_ceph_context, item_to_remove, true));
+  float weight;
+  EXPECT_FALSE(c->check_item_loc(g_ceph_context, item_to_remove, loc, &weight));
+}
+
 TEST(CrushWrapper, item_bucket_names) {
   CrushWrapper *c = new CrushWrapper;
   int index = 123;
diff --git a/src/test/encoding/CMakeLists.txt b/src/test/encoding/CMakeLists.txt
new file mode 100644
index 0000000..0ee20fe
--- /dev/null
+++ b/src/test/encoding/CMakeLists.txt
@@ -0,0 +1,4 @@
+# scripts
+add_ceph_test(check-generated.sh ${CMAKE_CURRENT_SOURCE_DIR}/check-generated.sh)
+add_ceph_test(readable.sh ${CMAKE_CURRENT_SOURCE_DIR}/readable.sh)
+
diff --git a/src/test/encoding/types.h b/src/test/encoding/types.h
index 22919bd..7bed2f3 100644
--- a/src/test/encoding/types.h
+++ b/src/test/encoding/types.h
@@ -43,7 +43,7 @@ TYPE_FEATUREFUL_STRAYDATA(OSDMap)
 TYPE_FEATUREFUL_STRAYDATA(OSDMap::Incremental)
 
 #include "crush/CrushWrapper.h"
-TYPE_NOCOPY(CrushWrapper)
+TYPE_FEATUREFUL_NOCOPY(CrushWrapper)
 
 #include "common/histogram.h"
 TYPE(pow2_hist_t)
diff --git a/src/test/erasure-code/CMakeLists.txt b/src/test/erasure-code/CMakeLists.txt
new file mode 100644
index 0000000..77ec651
--- /dev/null
+++ b/src/test/erasure-code/CMakeLists.txt
@@ -0,0 +1,298 @@
+
+add_ceph_test(test-erasure-code.sh ${CMAKE_CURRENT_SOURCE_DIR}/test-erasure-code.sh)
+add_ceph_test(test-erasure-eio.sh ${CMAKE_CURRENT_SOURCE_DIR}/test-erasure-eio.sh)
+
+add_executable(ceph_erasure_code_benchmark 
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc
+  ceph_erasure_code_benchmark.cc)
+target_link_libraries(ceph_erasure_code_benchmark osd common ${Boost_PROGRAM_OPTIONS_LIBRARY} global dl)
+
+add_executable(ceph_erasure_code_non_regression ceph_erasure_code_non_regression.cc)
+target_link_libraries(ceph_erasure_code_non_regression osd common ${Boost_PROGRAM_OPTIONS_LIBRARY} global dl)
+
+add_executable(ceph_erasure_code ceph_erasure_code.cc)
+target_link_libraries(ceph_erasure_code osd common ${Boost_PROGRAM_OPTIONS_LIBRARY} global dl)
+
+add_library(ec_example SHARED 
+  ErasureCodePluginExample.cc
+  $<TARGET_OBJECTS:erasure_code_objs>)
+add_dependencies(ec_example ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_example pthread ${EXTRA_LIBS})
+
+add_library(ec_missing_entry_point SHARED ErasureCodePluginMissingEntryPoint.cc)
+add_dependencies(ec_missing_entry_point ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_missing_entry_point pthread ${EXTRA_LIBS})
+
+add_library(ec_missing_version SHARED ErasureCodePluginMissingVersion.cc)
+add_dependencies(ec_missing_version ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_missing_version pthread ${EXTRA_LIBS})
+
+add_library(ec_hangs SHARED ErasureCodePluginHangs.cc)
+add_dependencies(ec_hangs ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_hangs pthread ${EXTRA_LIBS})
+
+add_library(ec_fail_to_initialize SHARED ErasureCodePluginFailToInitialize.cc)
+add_dependencies(ec_fail_to_initialize ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_fail_to_initialize pthread ${EXTRA_LIBS})
+
+add_library(ec_fail_to_register SHARED ErasureCodePluginFailToRegister.cc)
+add_dependencies(ec_fail_to_register ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_fail_to_register pthread ${EXTRA_LIBS})
+
+# unittest_erasure_code_plugin
+add_executable(unittest_erasure_code_plugin EXCLUDE_FROM_ALL
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc
+  TestErasureCodePlugin.cc
+  )
+add_ceph_unittest(unittest_erasure_code_plugin ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_plugin)
+target_link_libraries(unittest_erasure_code_plugin
+  global
+  osd
+  dl
+  ec_example
+  common
+  )
+add_dependencies(unittest_erasure_code_plugin
+  ec_example
+  ec_missing_entry_point
+  ec_missing_version
+  ec_hangs
+  ec_fail_to_initialize
+  ec_fail_to_register)
+
+# unittest_erasure_code
+add_executable(unittest_erasure_code EXCLUDE_FROM_ALL
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc
+  TestErasureCode.cc
+  )
+add_ceph_unittest(unittest_erasure_code ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code)
+target_link_libraries(unittest_erasure_code
+  global
+  osd
+  common
+  )
+
+add_library(ec_test_jerasure_neon SHARED TestJerasurePluginNEON.cc)
+add_dependencies(ec_test_jerasure_neon ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_jerasure_neon pthread ${EXTRA_LIBS})
+
+add_library(ec_test_jerasure_sse4 SHARED TestJerasurePluginSSE4.cc)
+add_dependencies(ec_test_jerasure_sse4 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_jerasure_sse4 pthread ${EXTRA_LIBS})
+
+add_library(ec_test_jerasure_sse3 SHARED TestJerasurePluginSSE3.cc)
+add_dependencies(ec_test_jerasure_sse3 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_jerasure_sse3 pthread ${EXTRA_LIBS})
+
+add_library(ec_test_jerasure_generic SHARED TestJerasurePluginGeneric.cc)
+add_dependencies(ec_test_jerasure_generic ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_jerasure_generic pthread ${EXTRA_LIBS})
+
+# unittest_erasure_code_plugin_jerasure
+add_executable(unittest_erasure_code_plugin_jerasure EXCLUDE_FROM_ALL
+  TestErasureCodePluginJerasure.cc
+  )
+add_ceph_unittest(unittest_erasure_code_plugin_jerasure ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_plugin_jerasure)
+target_link_libraries(unittest_erasure_code_plugin_jerasure
+  global
+  osd
+  ec_jerasure_generic
+  common)
+add_dependencies(unittest_erasure_code_plugin_jerasure
+  ec_jerasure
+  ec_jerasure_sse3
+  ec_jerasure_sse4
+  ec_test_jerasure_neon 
+  ec_test_jerasure_sse4
+  ec_test_jerasure_sse3
+  ec_test_jerasure_generic)
+
+if(HAVE_BETTER_YASM_ELF64)
+
+#unittest_erasure_code_isa
+add_executable(unittest_erasure_code_isa EXCLUDE_FROM_ALL
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc
+  TestErasureCodeIsa.cc
+  )
+add_ceph_unittest(unittest_erasure_code_isa ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_isa)
+target_link_libraries(unittest_erasure_code_isa
+  global
+  osd
+  common
+  ec_isa
+  erasure_code
+  )
+
+#unittest_erasure_code_plugin_isa
+add_executable(unittest_erasure_code_plugin_isa EXCLUDE_FROM_ALL
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc
+  TestErasureCodePluginIsa.cc
+  )
+add_ceph_unittest(unittest_erasure_code_plugin_isa ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_plugin_isa)
+target_link_libraries(unittest_erasure_code_plugin_isa
+  global
+  osd
+  common
+  ec_isa
+  crush
+  dl
+  erasure_code
+  )
+endif(HAVE_BETTER_YASM_ELF64)
+
+# unittest_erasure_code_lrc
+add_executable(unittest_erasure_code_lrc EXCLUDE_FROM_ALL
+  TestErasureCodeLrc.cc
+  ${lrc_srcs}
+  )
+add_ceph_unittest(unittest_erasure_code_lrc ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_lrc)
+target_link_libraries(unittest_erasure_code_lrc
+  global
+  osd
+  dl
+  ec_lrc
+  common
+  )
+
+# unittest_erasure_code_plugin_lrc
+add_executable(unittest_erasure_code_plugin_lrc EXCLUDE_FROM_ALL
+  TestErasureCodePluginLrc.cc
+  )
+add_ceph_unittest(unittest_erasure_code_plugin_lrc ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_plugin_lrc)
+add_dependencies(unittest_erasure_code_plugin_lrc 
+  ec_lrc
+  ec_jerasure
+  ec_jerasure_sse3
+  ec_jerasure_sse4
+  ec_jerasure_generic)
+target_link_libraries(unittest_erasure_code_plugin_lrc
+  global
+  osd
+  dl
+  ec_lrc
+  ec_jerasure_generic
+  common)
+
+add_library(ec_test_shec_neon SHARED TestShecPluginNEON.cc)
+add_dependencies(ec_test_shec_neon ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_shec_neon pthread ${EXTRA_LIBS})
+
+add_library(ec_test_shec_sse4 SHARED TestShecPluginSSE4.cc)
+add_dependencies(ec_test_shec_sse4 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_shec_sse4 pthread ${EXTRA_LIBS})
+
+add_library(ec_test_shec_sse3 SHARED TestShecPluginSSE3.cc)
+add_dependencies(ec_test_shec_sse3 ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_shec_sse3 pthread ${EXTRA_LIBS})
+
+add_library(ec_test_shec_generic SHARED TestShecPluginGeneric.cc)
+add_dependencies(ec_test_shec_generic ${CMAKE_SOURCE_DIR}/src/ceph_ver.h)
+target_link_libraries(ec_test_shec_generic pthread ${EXTRA_LIBS})
+
+# unittest_erasure_code_plugin_shec
+add_executable(unittest_erasure_code_plugin_shec EXCLUDE_FROM_ALL
+  TestErasureCodePluginShec.cc
+  )
+add_ceph_unittest(unittest_erasure_code_plugin_shec ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_plugin_shec)
+target_link_libraries(unittest_erasure_code_plugin_shec
+  global
+  osd
+  dl
+  common
+  ec_shec_generic)
+add_dependencies(unittest_erasure_code_plugin_shec 
+  ec_shec
+  ec_shec_sse3
+  ec_shec_sse4
+  #ec_shec_neon
+  ec_test_shec_neon
+  ec_test_shec_sse3
+  ec_test_shec_sse4
+  ec_test_shec_generic)
+
+# unittest_erasure_code_example
+add_executable(unittest_erasure_code_example EXCLUDE_FROM_ALL
+  ${CMAKE_SOURCE_DIR}/src/erasure-code/ErasureCode.cc
+  TestErasureCodeExample.cc
+)
+add_ceph_unittest(unittest_erasure_code_example ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_example)
+target_link_libraries(unittest_erasure_code_example
+  global
+  osd
+  dl
+  common
+  erasure_code
+  ${UNITTEST_LIBS}
+  )
+set_target_properties(unittest_erasure_code_example PROPERTIES COMPILE_FLAGS ${UNITTEST_CXX_FLAGS})
+
+include_directories(${CMAKE_SOURCE_DIR}/src/erasure-code/jerasure/jerasure/include)
+include_directories(${CMAKE_SOURCE_DIR}/src/erasure-code//jerasure/gf-complete/include)
+
+# unittest_erasure_code_jerasure
+add_executable(unittest_erasure_code_jerasure EXCLUDE_FROM_ALL
+  TestErasureCodeJerasure.cc
+  )
+add_ceph_unittest(unittest_erasure_code_jerasure ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_jerasure)
+target_link_libraries(unittest_erasure_code_jerasure
+  global
+  osd
+  common
+  ec_jerasure_generic
+  )
+
+include_directories(${CMAKE_SOURCE_DIR}/src/erasure-code/jerasure)
+include_directories(${CMAKE_SOURCE_DIR}/src/erasure-code/shec)
+
+# unittest_erasure_code_shec
+add_executable(unittest_erasure_code_shec EXCLUDE_FROM_ALL
+  TestErasureCodeShec.cc
+  )
+add_ceph_unittest(unittest_erasure_code_shec ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_shec)
+target_link_libraries(unittest_erasure_code_shec
+  global
+  osd
+  dl
+  common
+  ec_shec_generic
+  )
+
+# unittest_erasure_code_shec_all
+add_executable(unittest_erasure_code_shec_all EXCLUDE_FROM_ALL
+  TestErasureCodeShec_all.cc
+  )
+add_ceph_unittest(unittest_erasure_code_shec_all ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_shec_all)
+target_link_libraries(unittest_erasure_code_shec_all
+  global
+  osd
+  dl
+  common
+  ec_shec_generic
+  )
+
+# unittest_erasure_code_shec_thread
+add_executable(unittest_erasure_code_shec_thread EXCLUDE_FROM_ALL
+  TestErasureCodeShec_thread.cc
+  )
+add_ceph_unittest(unittest_erasure_code_shec_thread ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_shec_thread)
+target_link_libraries(unittest_erasure_code_shec_thread
+  global
+  osd
+  dl
+  common
+  ec_shec_generic
+  )
+
+
+# unittest_erasure_code_shec_arguments
+add_executable(unittest_erasure_code_shec_arguments EXCLUDE_FROM_ALL
+  TestErasureCodeShec_arguments.cc
+  )
+add_ceph_unittest(unittest_erasure_code_shec_arguments ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_erasure_code_shec_arguments)
+target_link_libraries(unittest_erasure_code_shec_arguments
+  global
+  osd
+  dl
+  common
+  ec_shec_generic
+  )
diff --git a/src/test/erasure-code/Makefile.am b/src/test/erasure-code/Makefile.am
index 3c45c67..f2d2b28 100644
--- a/src/test/erasure-code/Makefile.am
+++ b/src/test/erasure-code/Makefile.am
@@ -367,3 +367,5 @@ check_TESTPROGRAMS += unittest_erasure_code_example
 
 endif # WITH_OSD
 endif # ENABLE_SERVER
+
+EXTRA_DIST += test/erasure-code/CMakeLists.txt
diff --git a/src/test/fedora-21/ceph.spec.in b/src/test/fedora-21/ceph.spec.in
index b2e4b12..9ddd75f 100644
--- a/src/test/fedora-21/ceph.spec.in
+++ b/src/test/fedora-21/ceph.spec.in
@@ -33,10 +33,12 @@
 %bcond_with selinux
 %endif
 
-# LTTng-UST enabled on Fedora, RHEL 6+, and SLES 12
-%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version} == 1315
+# LTTng-UST enabled on Fedora, RHEL 6+, and SLE (not openSUSE)
+%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version}
+%if ! 0%{?is_opensuse}
 %bcond_without lttng
 %endif
+%endif
 
 %if %{with selinux}
 # get selinux policy version
@@ -116,6 +118,7 @@ BuildRequires:	python-requests
 BuildRequires:	python-sphinx
 BuildRequires:	python-virtualenv
 BuildRequires:	snappy-devel
+BuildRequires:	udev
 BuildRequires:	util-linux
 BuildRequires:	valgrind-devel
 BuildRequires:	xfsprogs
@@ -878,8 +881,8 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_mandir}/man8/rbd-replay-prep.8*
 %dir %{_datadir}/ceph/
 %{_datadir}/ceph/known_hosts_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com.pub
+%{_datadir}/ceph/id_rsa_drop.ceph.com
+%{_datadir}/ceph/id_rsa_drop.ceph.com.pub
 %dir %{_sysconfdir}/ceph/
 %config %{_sysconfdir}/bash_completion.d/rados
 %config %{_sysconfdir}/bash_completion.d/rbd
@@ -887,6 +890,7 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_unitdir}/rbdmap.service
 %{python_sitelib}/ceph_argparse.py*
 %{python_sitelib}/ceph_daemon.py*
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/50-rbd.rules
 %attr(3770,ceph,ceph) %dir %{_localstatedir}/log/ceph/
 %attr(750,ceph,ceph) %dir %{_localstatedir}/lib/ceph/
@@ -1156,6 +1160,7 @@ fi
 %{_sbindir}/ceph-disk
 %{_sbindir}/ceph-disk-udev
 %{_libexecdir}/ceph/ceph-osd-prestart.sh
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/60-ceph-by-parttypeuuid.rules
 %{_udevrulesdir}/95-ceph-osd.rules
 %{_mandir}/man8/ceph-clsinfo.8*
diff --git a/src/test/filestore/CMakeLists.txt b/src/test/filestore/CMakeLists.txt
new file mode 100644
index 0000000..82a47f8
--- /dev/null
+++ b/src/test/filestore/CMakeLists.txt
@@ -0,0 +1,8 @@
+#ceph_test_filestore
+add_executable(ceph_test_filestore 
+  TestFileStore.cc)
+set_target_properties(ceph_test_filestore PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_filestore os global ${UNITTEST_LIBS})
+
+
diff --git a/src/test/fs/CMakeLists.txt b/src/test/fs/CMakeLists.txt
new file mode 100644
index 0000000..4570760
--- /dev/null
+++ b/src/test/fs/CMakeLists.txt
@@ -0,0 +1,6 @@
+# unittest_mds_types
+add_executable(unittest_mds_types EXCLUDE_FROM_ALL
+  mds_types.cc
+  )
+add_ceph_unittest(unittest_mds_types ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mds_types)
+target_link_libraries(unittest_mds_types global)
diff --git a/src/test/journal/CMakeLists.txt b/src/test/journal/CMakeLists.txt
new file mode 100644
index 0000000..ca2d851
--- /dev/null
+++ b/src/test/journal/CMakeLists.txt
@@ -0,0 +1,35 @@
+set(journal_test
+  mock/MockJournaler.cc
+  )
+add_library(journal_test STATIC ${journal_test})
+set_target_properties(journal_test PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+# unittest_journal
+set(unittest_journal_srcs
+  test_main.cc
+  test_Entry.cc
+  test_FutureImpl.cc
+  test_Journaler.cc
+  test_JournalMetadata.cc
+  test_JournalPlayer.cc
+  test_JournalRecorder.cc
+  test_JournalTrimmer.cc
+  test_ObjectPlayer.cc
+  test_ObjectRecorder.cc
+  RadosTestFixture.cc
+  )
+
+add_executable(unittest_journal EXCLUDE_FROM_ALL
+  ${unittest_journal_srcs} 
+  )
+add_ceph_unittest(unittest_journal ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_journal)
+target_link_libraries(unittest_journal 
+  journal
+  cls_journal
+  cls_journal_client
+  rados_test_stub
+  librados
+  radostest
+  global 
+  )
diff --git a/src/test/journal/RadosTestFixture.cc b/src/test/journal/RadosTestFixture.cc
index dba3ec6..a066559 100644
--- a/src/test/journal/RadosTestFixture.cc
+++ b/src/test/journal/RadosTestFixture.cc
@@ -68,10 +68,12 @@ int RadosTestFixture::create(const std::string &oid, uint8_t order,
 
 journal::JournalMetadataPtr RadosTestFixture::create_metadata(
     const std::string &oid, const std::string &client_id,
-    double commit_interval, uint64_t max_fetch_bytes) {
+    double commit_interval, uint64_t max_fetch_bytes,
+    int max_concurrent_object_sets) {
   journal::Settings settings;
   settings.commit_interval = commit_interval;
   settings.max_fetch_bytes = max_fetch_bytes;
+  settings.max_concurrent_object_sets = max_concurrent_object_sets;
 
   journal::JournalMetadataPtr metadata(new journal::JournalMetadata(
     m_work_queue, m_timer, &m_timer_lock, m_ioctx, oid, client_id, settings));
diff --git a/src/test/journal/RadosTestFixture.h b/src/test/journal/RadosTestFixture.h
index 4ea22e7..64d3011 100644
--- a/src/test/journal/RadosTestFixture.h
+++ b/src/test/journal/RadosTestFixture.h
@@ -26,7 +26,8 @@ public:
   journal::JournalMetadataPtr create_metadata(const std::string &oid,
                                               const std::string &client_id = "client",
                                               double commit_internal = 0.1,
-                                              uint64_t max_fetch_bytes = 0);
+                                              uint64_t max_fetch_bytes = 0,
+                                              int max_concurrent_object_sets = 0);
   int append(const std::string &oid, const bufferlist &bl);
 
   int client_register(const std::string &oid, const std::string &id = "client",
diff --git a/src/test/journal/mock/MockJournaler.h b/src/test/journal/mock/MockJournaler.h
index e1998ff..ab18406 100644
--- a/src/test/journal/mock/MockJournaler.h
+++ b/src/test/journal/mock/MockJournaler.h
@@ -102,6 +102,7 @@ struct MockJournaler {
                                           Context*));
 
   MOCK_METHOD2(register_client, void(const bufferlist &, Context *));
+  MOCK_METHOD1(unregister_client, void(Context *));
   MOCK_METHOD3(get_client, void(const std::string &, cls::journal::Client *,
                                 Context *));
   MOCK_METHOD2(get_cached_client, int(const std::string&, cls::journal::Client*));
@@ -109,6 +110,8 @@ struct MockJournaler {
 
   MOCK_METHOD3(get_tag, void(uint64_t, cls::journal::Tag *, Context *));
   MOCK_METHOD3(get_tags, void(uint64_t, journal::Journaler::Tags*, Context*));
+  MOCK_METHOD4(get_tags, void(uint64_t, uint64_t, journal::Journaler::Tags*,
+                              Context*));
 
   MOCK_METHOD1(start_replay, void(::journal::ReplayHandler *replay_handler));
   MOCK_METHOD2(start_live_replay, void(ReplayHandler *, double));
@@ -159,9 +162,6 @@ struct MockJournalerProxy {
   int register_client(const bufferlist &data) {
     return -EINVAL;
   }
-  void unregister_client(Context *ctx) {
-    ctx->complete(-EINVAL);
-  }
 
   void allocate_tag(uint64_t, const bufferlist &,
                     cls::journal::Tag*, Context *on_finish) {
@@ -196,6 +196,10 @@ struct MockJournalerProxy {
     MockJournaler::get_instance().register_client(data, on_finish);
   }
 
+  void unregister_client(Context *on_finish) {
+    MockJournaler::get_instance().unregister_client(on_finish);
+  }
+
   void get_client(const std::string &client_id, cls::journal::Client *client,
                   Context *on_finish) {
     MockJournaler::get_instance().get_client(client_id, client, on_finish);
@@ -218,6 +222,11 @@ struct MockJournalerProxy {
                 Context *on_finish) {
     MockJournaler::get_instance().get_tags(tag_class, tags, on_finish);
   }
+  void get_tags(uint64_t start_after_tag_tid, uint64_t tag_class,
+                journal::Journaler::Tags *tags, Context *on_finish) {
+    MockJournaler::get_instance().get_tags(start_after_tag_tid, tag_class, tags,
+                                           on_finish);
+  }
 
   void start_replay(::journal::ReplayHandler *replay_handler) {
     MockJournaler::get_instance().start_replay(replay_handler);
diff --git a/src/test/journal/test_JournalMetadata.cc b/src/test/journal/test_JournalMetadata.cc
index b8f5593..560ee4e 100644
--- a/src/test/journal/test_JournalMetadata.cc
+++ b/src/test/journal/test_JournalMetadata.cc
@@ -21,9 +21,12 @@ public:
 
   journal::JournalMetadataPtr create_metadata(const std::string &oid,
                                               const std::string &client_id,
-                                              double commit_internal = 0.1) {
+                                              double commit_interval = 0.1,
+					      uint64_t max_fetch_bytes = 0,
+                                              int max_concurrent_object_sets = 0) {
     journal::JournalMetadataPtr metadata = RadosTestFixture::create_metadata(
-      oid, client_id, commit_internal);
+      oid, client_id, commit_interval, max_fetch_bytes,
+      max_concurrent_object_sets);
     m_metadata_list.push_back(metadata);
     metadata->add_listener(&m_listener);
     return metadata;
@@ -116,6 +119,70 @@ TEST_F(TestJournalMetadata, UpdateActiveObject) {
   ASSERT_EQ(123U, metadata1->get_active_set());
 }
 
+TEST_F(TestJournalMetadata, DisconnectLaggyClient) {
+  std::string oid = get_temp_oid();
+
+  ASSERT_EQ(0, create(oid));
+  ASSERT_EQ(0, client_register(oid, "client1", ""));
+  ASSERT_EQ(0, client_register(oid, "client2", "laggy"));
+
+  int max_concurrent_object_sets = 100;
+  journal::JournalMetadataPtr metadata =
+    create_metadata(oid, "client1", 0.1, 0, max_concurrent_object_sets);
+  ASSERT_EQ(0, init_metadata(metadata));
+  ASSERT_TRUE(wait_for_update(metadata));
+
+  ASSERT_EQ(0U, metadata->get_active_set());
+
+  journal::JournalMetadata::RegisteredClients clients;
+
+#define ASSERT_CLIENT_STATES(s1, s2)	\
+  ASSERT_EQ(2U, clients.size());	\
+  for (auto &c : clients) {		\
+    if (c.id == "client1") {		\
+      ASSERT_EQ(c.state, s1);		\
+    } else if (c.id == "client2") {	\
+      ASSERT_EQ(c.state, s2);		\
+    } else {				\
+      ASSERT_TRUE(false);		\
+    }					\
+  }
+
+  metadata->get_registered_clients(&clients);
+  ASSERT_CLIENT_STATES(cls::journal::CLIENT_STATE_CONNECTED,
+		       cls::journal::CLIENT_STATE_CONNECTED);
+
+  // client2 is connected when active set <= max_concurrent_object_sets
+  ASSERT_EQ(0, metadata->set_active_set(max_concurrent_object_sets));
+  ASSERT_TRUE(wait_for_update(metadata));
+  uint64_t commit_tid = metadata->allocate_commit_tid(0, 0, 0);
+  C_SaferCond cond1;
+  metadata->committed(commit_tid, [&cond1]() { return &cond1; });
+  ASSERT_EQ(0, cond1.wait());
+  metadata->flush_commit_position();
+  ASSERT_TRUE(wait_for_update(metadata));
+  ASSERT_EQ(100U, metadata->get_active_set());
+  clients.clear();
+  metadata->get_registered_clients(&clients);
+  ASSERT_CLIENT_STATES(cls::journal::CLIENT_STATE_CONNECTED,
+		       cls::journal::CLIENT_STATE_CONNECTED);
+
+  // client2 is disconnected when active set > max_concurrent_object_sets
+  ASSERT_EQ(0, metadata->set_active_set(max_concurrent_object_sets + 1));
+  ASSERT_TRUE(wait_for_update(metadata));
+  commit_tid = metadata->allocate_commit_tid(0, 0, 1);
+  C_SaferCond cond2;
+  metadata->committed(commit_tid, [&cond2]() { return &cond2; });
+  ASSERT_EQ(0, cond2.wait());
+  metadata->flush_commit_position();
+  ASSERT_TRUE(wait_for_update(metadata));
+  ASSERT_EQ(101U, metadata->get_active_set());
+  clients.clear();
+  metadata->get_registered_clients(&clients);
+  ASSERT_CLIENT_STATES(cls::journal::CLIENT_STATE_CONNECTED,
+		       cls::journal::CLIENT_STATE_DISCONNECTED);
+}
+
 TEST_F(TestJournalMetadata, AssertActiveTag) {
   std::string oid = get_temp_oid();
 
diff --git a/src/test/journal/test_ObjectRecorder.cc b/src/test/journal/test_ObjectRecorder.cc
index de82d06..e211336 100644
--- a/src/test/journal/test_ObjectRecorder.cc
+++ b/src/test/journal/test_ObjectRecorder.cc
@@ -10,6 +10,8 @@
 #include "test/journal/RadosTestFixture.h"
 #include <limits>
 
+using std::shared_ptr;
+
 class TestObjectRecorder : public RadosTestFixture {
 public:
   TestObjectRecorder()
@@ -21,6 +23,7 @@ public:
 
   struct Handler : public journal::ObjectRecorder::Handler {
     Mutex lock;
+    shared_ptr<Mutex> object_lock;
     Cond cond;
     bool is_closed = false;
     uint32_t overflows = 0;
@@ -36,7 +39,9 @@ public:
     virtual void overflow(journal::ObjectRecorder *object_recorder) {
       Mutex::Locker locker(lock);
       journal::AppendBuffers append_buffers;
+      object_lock->Lock();
       object_recorder->claim_append_buffers(&append_buffers);
+      object_lock->Unlock();
 
       ++overflows;
       cond.Signal();
@@ -44,8 +49,10 @@ public:
   };
 
   typedef std::list<journal::ObjectRecorderPtr> ObjectRecorders;
+  typedef std::map<std::string, shared_ptr<Mutex>> ObjectRecorderLocksMap;
 
   ObjectRecorders m_object_recorders;
+  ObjectRecorderLocksMap m_object_recorder_locks;
 
   uint32_t m_flush_interval;
   uint64_t m_flush_bytes;
@@ -86,11 +93,13 @@ public:
   }
 
   journal::ObjectRecorderPtr create_object(const std::string &oid,
-                                           uint8_t order) {
+                                           uint8_t order, shared_ptr<Mutex> lock) {
     journal::ObjectRecorderPtr object(new journal::ObjectRecorder(
-      m_ioctx, oid, 0, *m_timer, m_timer_lock, &m_handler, order,
-      m_flush_interval, m_flush_bytes, m_flush_age));
+      m_ioctx, oid, 0, lock, m_work_queue, *m_timer, m_timer_lock, &m_handler,
+      order, m_flush_interval, m_flush_bytes, m_flush_age));
     m_object_recorders.push_back(object);
+    m_object_recorder_locks.insert(std::make_pair(oid, lock));
+    m_handler.object_lock = lock;
     return object;
   }
 };
@@ -102,19 +111,22 @@ TEST_F(TestObjectRecorder, Append) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(1U, object->get_pending_appends());
 
   journal::AppendBuffer append_buffer2 = create_append_buffer(234, 124,
                                                               "payload");
   append_buffers = {append_buffer2};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(2U, object->get_pending_appends());
 
   C_SaferCond cond;
@@ -131,19 +143,22 @@ TEST_F(TestObjectRecorder, AppendFlushByCount) {
   ASSERT_EQ(0, init_metadata(metadata));
 
   set_flush_interval(2);
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(1U, object->get_pending_appends());
 
   journal::AppendBuffer append_buffer2 = create_append_buffer(234, 124,
                                                               "payload");
   append_buffers = {append_buffer2};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(0U, object->get_pending_appends());
 
   C_SaferCond cond;
@@ -159,19 +174,22 @@ TEST_F(TestObjectRecorder, AppendFlushByBytes) {
   ASSERT_EQ(0, init_metadata(metadata));
 
   set_flush_bytes(10);
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(1U, object->get_pending_appends());
 
   journal::AppendBuffer append_buffer2 = create_append_buffer(234, 124,
                                                               "payload");
   append_buffers = {append_buffer2};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(0U, object->get_pending_appends());
 
   C_SaferCond cond;
@@ -187,18 +205,21 @@ TEST_F(TestObjectRecorder, AppendFlushByAge) {
   ASSERT_EQ(0, init_metadata(metadata));
 
   set_flush_age(0.1);
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
 
   journal::AppendBuffer append_buffer2 = create_append_buffer(234, 124,
                                                               "payload");
   append_buffers = {append_buffer2};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
 
   C_SaferCond cond;
   append_buffer2.first->wait(&cond);
@@ -213,19 +234,22 @@ TEST_F(TestObjectRecorder, AppendFilledObject) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::ObjectRecorderPtr object = create_object(oid, 12);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 12, lock);
 
   std::string payload(2048, '1');
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               payload);
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
 
   journal::AppendBuffer append_buffer2 = create_append_buffer(234, 124,
                                                               payload);
   append_buffers = {append_buffer2};
-  ASSERT_TRUE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_TRUE(object->append_unlock(std::move(append_buffers)));
 
   C_SaferCond cond;
   append_buffer2.first->wait(&cond);
@@ -240,13 +264,15 @@ TEST_F(TestObjectRecorder, Flush) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(1U, object->get_pending_appends());
 
   C_SaferCond cond1;
@@ -266,18 +292,23 @@ TEST_F(TestObjectRecorder, FlushFuture) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer = create_append_buffer(234, 123,
                                                              "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(1U, object->get_pending_appends());
 
   C_SaferCond cond;
   append_buffer.first->wait(&cond);
+  lock->Lock();
   object->flush(append_buffer.first);
+  ASSERT_TRUE(lock->is_locked());
+  lock->Unlock();
   ASSERT_TRUE(append_buffer.first->is_flush_in_progress() ||
               append_buffer.first->is_complete());
   ASSERT_EQ(0, cond.wait());
@@ -290,7 +321,8 @@ TEST_F(TestObjectRecorder, FlushDetachedFuture) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer = create_append_buffer(234, 123,
                                                              "payload");
@@ -298,9 +330,13 @@ TEST_F(TestObjectRecorder, FlushDetachedFuture) {
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer};
 
+  lock->Lock();
   object->flush(append_buffer.first);
+  ASSERT_TRUE(lock->is_locked());
+  lock->Unlock();
   ASSERT_FALSE(append_buffer.first->is_flush_in_progress());
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
 
   // should automatically flush once its attached to the object
   C_SaferCond cond;
@@ -316,16 +352,21 @@ TEST_F(TestObjectRecorder, Close) {
   ASSERT_EQ(0, init_metadata(metadata));
 
   set_flush_interval(2);
-  journal::ObjectRecorderPtr object = create_object(oid, 24);
+  shared_ptr<Mutex> lock(new Mutex("object_recorder_lock"));
+  journal::ObjectRecorderPtr object = create_object(oid, 24, lock);
 
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
                                                               "payload");
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1};
-  ASSERT_FALSE(object->append(append_buffers));
+  lock->Lock();
+  ASSERT_FALSE(object->append_unlock(std::move(append_buffers)));
   ASSERT_EQ(1U, object->get_pending_appends());
 
+  lock->Lock();
   ASSERT_FALSE(object->close());
+  ASSERT_TRUE(lock->is_locked());
+  lock->Unlock();
 
   {
     Mutex::Locker locker(m_handler.lock);
@@ -349,8 +390,10 @@ TEST_F(TestObjectRecorder, Overflow) {
   journal::JournalMetadataPtr metadata = create_metadata(oid);
   ASSERT_EQ(0, init_metadata(metadata));
 
-  journal::ObjectRecorderPtr object1 = create_object(oid, 12);
-  journal::ObjectRecorderPtr object2 = create_object(oid, 12);
+  shared_ptr<Mutex> lock1(new Mutex("object_recorder_lock_1"));
+  journal::ObjectRecorderPtr object1 = create_object(oid, 12, lock1);
+  shared_ptr<Mutex> lock2(new Mutex("object_recorder_lock_2"));
+  journal::ObjectRecorderPtr object2 = create_object(oid, 12, lock2);
 
   std::string payload(2048, '1');
   journal::AppendBuffer append_buffer1 = create_append_buffer(234, 123,
@@ -359,7 +402,8 @@ TEST_F(TestObjectRecorder, Overflow) {
                                                               payload);
   journal::AppendBuffers append_buffers;
   append_buffers = {append_buffer1, append_buffer2};
-  ASSERT_TRUE(object1->append(append_buffers));
+  lock1->Lock();
+  ASSERT_TRUE(object1->append_unlock(std::move(append_buffers)));
 
   C_SaferCond cond;
   append_buffer2.first->wait(&cond);
@@ -370,7 +414,8 @@ TEST_F(TestObjectRecorder, Overflow) {
                                                               payload);
   append_buffers = {append_buffer3};
 
-  ASSERT_FALSE(object2->append(append_buffers));
+  lock2->Lock();
+  ASSERT_FALSE(object2->append_unlock(std::move(append_buffers)));
   append_buffer3.first->flush(NULL);
 
   bool overflowed = false;
diff --git a/src/test/libcephfs/CMakeLists.txt b/src/test/libcephfs/CMakeLists.txt
new file mode 100644
index 0000000..3f44d85
--- /dev/null
+++ b/src/test/libcephfs/CMakeLists.txt
@@ -0,0 +1,21 @@
+if(${WITH_CEPHFS})
+  add_executable(ceph_test_libcephfs
+    test.cc
+    readdir_r_cb.cc
+    caps.cc
+    multiclient.cc
+    flock.cc
+    acl.cc
+    access.cc
+  )
+  set_target_properties(ceph_test_libcephfs PROPERTIES COMPILE_FLAGS
+    ${UNITTEST_CXX_FLAGS})
+  target_link_libraries(ceph_test_libcephfs
+    cephfs
+    librados
+    ${UNITTEST_LIBS}
+    ${EXTRALIBS}
+    ${CMAKE_DL_LIBS}
+    )
+endif(${WITH_CEPHFS})  
+
diff --git a/src/test/librados/CMakeLists.txt b/src/test/librados/CMakeLists.txt
new file mode 100644
index 0000000..57fd958
--- /dev/null
+++ b/src/test/librados/CMakeLists.txt
@@ -0,0 +1,172 @@
+# radostest 
+set(libradostest_srcs 
+  test.cc 
+  TestCase.cc)
+add_library(radostest STATIC ${libradostest_srcs})
+set_target_properties(radostest PROPERTIES COMPILE_FLAGS ${UNITTEST_CXX_FLAGS})
+
+# ceph_test_rados_api_cmd
+add_executable(ceph_test_rados_api_cmd
+  cmd.cc
+  )
+set_target_properties(ceph_test_rados_api_cmd PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_cmd
+  librados global ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_io
+add_executable(ceph_test_rados_api_io
+  io.cc
+  )
+set_target_properties(ceph_test_rados_api_io PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_io
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_c_write_operations
+add_executable(ceph_test_rados_api_c_write_operations
+  c_write_operations.cc
+  )
+set_target_properties(ceph_test_rados_api_c_write_operations PROPERTIES
+  COMPILE_FLAGS ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_c_write_operations
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_c_read_operations
+add_executable(ceph_test_rados_api_c_read_operations
+  c_read_operations.cc
+  )
+set_target_properties(ceph_test_rados_api_c_read_operations PROPERTIES COMPILE_FLAGS 
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_c_read_operations
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_aio
+add_executable(ceph_test_rados_api_aio
+  aio.cc
+  )
+set_target_properties(ceph_test_rados_api_aio PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_aio
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_list
+add_executable(ceph_test_rados_api_list
+  list.cc
+  )
+set_target_properties(ceph_test_rados_api_list PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_list
+  librados global ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_nlist
+add_executable(ceph_test_rados_api_nlist
+  nlist.cc
+  )
+set_target_properties(ceph_test_rados_api_nlist PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_nlist
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_pool
+add_executable(ceph_test_rados_api_pool
+  pool.cc
+  )
+set_target_properties(ceph_test_rados_api_pool PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS}
+  )
+target_link_libraries(ceph_test_rados_api_pool
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_stat
+add_executable(ceph_test_rados_api_stat
+  stat.cc
+  )
+set_target_properties(ceph_test_rados_api_stat PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_stat
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_watch_notify
+add_executable(ceph_test_rados_api_watch_notify
+  watch_notify.cc
+  )
+set_target_properties(ceph_test_rados_api_watch_notify PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_watch_notify
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_cls
+add_executable(ceph_test_rados_api_cls
+  cls.cc
+  )
+set_target_properties(ceph_test_rados_api_cls PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_cls
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_misc
+add_executable(ceph_test_rados_api_misc
+  misc.cc
+  )
+set_target_properties(ceph_test_rados_api_misc PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_misc
+  librados global ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_lock
+add_executable(ceph_test_rados_api_lock
+  lock.cc
+  )
+set_target_properties(ceph_test_rados_api_lock PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_lock
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_tier
+add_executable(ceph_test_rados_api_tier
+  tier.cc
+  )
+set_target_properties(ceph_test_rados_api_tier PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_tier
+  global librados ${UNITTEST_LIBS} ${Boost_SYSTEM_LIBRARY} radostest)
+
+# ceph_test_rados_api_snapshots
+add_executable(ceph_test_rados_api_snapshots
+  snapshots.cc
+  )
+set_target_properties(ceph_test_rados_api_snapshots PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_snapshots
+  librados ${UNITTEST_LIBS} radostest)
+
+# ceph_test_rados_api_tmap_migrate
+add_executable(ceph_test_rados_api_tmap_migrate
+  ${CMAKE_SOURCE_DIR}/src/tools/cephfs/DataScan.cc
+  ${CMAKE_SOURCE_DIR}/src/tools/cephfs/MDSUtility.cc
+  tmap_migrate.cc
+  )
+set_target_properties(ceph_test_rados_api_tmap_migrate PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rados_api_tmap_migrate
+  librados mds osdc global cls_cephfs_client ${UNITTEST_LIBS} radostest)
+
+# unittest_librados
+add_executable(unittest_librados EXCLUDE_FROM_ALL
+  librados.cc
+  )
+add_ceph_unittest(unittest_librados ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_librados)
+target_link_libraries(unittest_librados librados global ${BLKID_LIBRARIES})
+
+# unittest_librados_config
+add_executable(unittest_librados_config EXCLUDE_FROM_ALL
+  librados_config.cc
+  )
+add_ceph_unittest(unittest_librados_config ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_librados_config)
+target_link_libraries(unittest_librados_config
+  librados
+  global
+  ${BLKID_LIBRARIES}
+  )
+
diff --git a/src/test/librados_test_stub/CMakeLists.txt b/src/test/librados_test_stub/CMakeLists.txt
new file mode 100644
index 0000000..ef333cc
--- /dev/null
+++ b/src/test/librados_test_stub/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(librados_test_stub_srcs
+  LibradosTestStub.cc
+  TestClassHandler.cc
+  TestIoCtxImpl.cc
+  TestMemIoCtxImpl.cc
+  TestMemRadosClient.cc
+  TestRadosClient.cc
+  TestWatchNotify.cc)
+add_library(rados_test_stub STATIC ${librados_test_stub_srcs})
+  
diff --git a/src/test/libradosstriper/CMakeLists.txt b/src/test/libradosstriper/CMakeLists.txt
new file mode 100644
index 0000000..0c16689
--- /dev/null
+++ b/src/test/libradosstriper/CMakeLists.txt
@@ -0,0 +1,14 @@
+add_library(rados_striper_test STATIC TestCase.cc)
+target_link_libraries(rados_striper_test radostest)
+set_target_properties(rados_striper_test PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+add_executable(ceph_test_rados_api_striping
+  striping.cc
+  )
+target_link_libraries(ceph_test_rados_api_striping librados libradosstriper 
+  ${UNITTEST_LIBS} rados_striper_test)
+set_target_properties(ceph_test_rados_api_striping PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+add_ceph_test(rados-striper.sh ${CMAKE_SOURCE_DIR}/src/test/libradosstriper/rados-striper.sh)
diff --git a/src/test/librbd/CMakeLists.txt b/src/test/librbd/CMakeLists.txt
new file mode 100644
index 0000000..aff27a6
--- /dev/null
+++ b/src/test/librbd/CMakeLists.txt
@@ -0,0 +1,141 @@
+set(librbd_test
+  test_fixture.cc
+  test_support.cc
+  test_librbd.cc
+  test_ImageWatcher.cc
+  test_internal.cc
+  test_mirroring.cc
+  test_MirroringWatcher.cc 
+  test_ObjectMap.cc
+  journal/test_Entries.cc
+  journal/test_Replay.cc)
+add_library(rbd_test STATIC ${librbd_test})
+set_target_properties(rbd_test PROPERTIES COMPILE_FLAGS ${UNITTEST_CXX_FLAGS})
+
+# unittest_librbd
+# doesn't use add_ceph_test because it is called by run-rbd-unit-tests.sh
+set(unittest_librbd_srcs
+  test_main.cc
+  test_mock_fixture.cc
+  test_mock_AioImageRequest.cc
+  test_mock_ExclusiveLock.cc
+  test_mock_Journal.cc
+  test_mock_ObjectWatcher.cc
+  exclusive_lock/test_mock_AcquireRequest.cc
+  exclusive_lock/test_mock_ReleaseRequest.cc
+  image/test_mock_RefreshRequest.cc
+  journal/test_mock_Replay.cc
+  object_map/test_mock_InvalidateRequest.cc
+  object_map/test_mock_LockRequest.cc
+  object_map/test_mock_RefreshRequest.cc
+  object_map/test_mock_ResizeRequest.cc
+  object_map/test_mock_SnapshotCreateRequest.cc
+  object_map/test_mock_SnapshotRemoveRequest.cc
+  object_map/test_mock_SnapshotRollbackRequest.cc
+  object_map/test_mock_UnlockRequest.cc
+  object_map/test_mock_UpdateRequest.cc
+  operation/test_mock_Request.cc
+  operation/test_mock_ResizeRequest.cc
+  operation/test_mock_SnapshotCreateRequest.cc
+  operation/test_mock_SnapshotProtectRequest.cc
+  operation/test_mock_SnapshotRemoveRequest.cc
+  operation/test_mock_SnapshotRollbackRequest.cc
+  operation/test_mock_SnapshotUnprotectRequest.cc
+  mock/MockImageCtx.cc
+  mock/MockJournal.cc
+  )
+add_executable(unittest_librbd EXCLUDE_FROM_ALL
+  ${unittest_librbd_srcs}
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  ${CMAKE_SOURCE_DIR}/src/common/ContextCompletion.cc
+  $<TARGET_OBJECTS:parse_secret_objs>
+  )
+target_compile_definitions(unittest_librbd PUBLIC "-DTEST_LIBRBD_INTERNALS")
+set_target_properties(unittest_librbd PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(unittest_librbd
+  cls_rbd
+  cls_rbd_client
+  cls_lock
+  cls_lock_client
+  journal
+  journal_test
+  cls_journal
+  cls_journal_client
+  rados_test_stub
+  librados
+  librados_api
+  rbd_test
+  rbd_api
+  rbd_internal
+  rbd_types
+  osdc
+  global
+  ${UNITTEST_LIBS}
+  radostest
+  keyutils
+  )
+
+add_executable(ceph_test_librbd
+  test_main.cc
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  ${CMAKE_SOURCE_DIR}/src/common/ContextCompletion.cc
+  $<TARGET_OBJECTS:parse_secret_objs>
+  )
+target_link_libraries(ceph_test_librbd
+  rados_test_stub
+  librados
+  rbd_test
+  rbd_api
+  rbd_internal
+  rbd_types
+  journal
+  cls_journal_client
+  cls_rbd_client
+  cls_lock_client
+  osdc
+  global
+  ${UNITTEST_LIBS}
+  radostest
+  keyutils
+  )
+set_target_properties(ceph_test_librbd PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+add_executable(ceph_test_librbd_api
+  test_support.cc
+  test_librbd.cc
+  test_main.cc
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  $<TARGET_OBJECTS:parse_secret_objs>
+  )
+target_link_libraries(ceph_test_librbd_api
+  librbd
+  librados
+  common
+  radostest
+  ${UNITTEST_LIBS}
+  keyutils
+  )
+set_target_properties(ceph_test_librbd_api PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+add_executable(ceph_test_librbd_fsx
+  fsx.cc
+  $<TARGET_OBJECTS:krbd_objs>
+  ${CMAKE_SOURCE_DIR}/src/common/TextTable.cc
+  ${CMAKE_SOURCE_DIR}/src/common/secret.c
+  )
+target_link_libraries(ceph_test_librbd_fsx
+  librbd
+  librados
+  global
+  m
+  ${CMAKE_DL_LIBS}
+  ${CRYPTO_LIBS}
+  ${EXTRALIBS}
+  blkid
+  udev
+  keyutils
+  )
+
diff --git a/src/test/librbd/exclusive_lock/test_mock_AcquireRequest.cc b/src/test/librbd/exclusive_lock/test_mock_AcquireRequest.cc
index c98d694..b7fa20d 100644
--- a/src/test/librbd/exclusive_lock/test_mock_AcquireRequest.cc
+++ b/src/test/librbd/exclusive_lock/test_mock_AcquireRequest.cc
@@ -47,6 +47,12 @@ public:
                   .WillOnce(Return(enabled));
   }
 
+  void expect_test_features(MockImageCtx &mock_image_ctx, uint64_t features,
+                            RWLock &lock, bool enabled) {
+    EXPECT_CALL(mock_image_ctx, test_features(features, _))
+                  .WillOnce(Return(enabled));
+  }
+
   void expect_lock(MockImageCtx &mock_image_ctx, int r) {
     EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
                 exec(mock_image_ctx.header_oid, _, StrEq("lock"), StrEq("lock"), _, _, _))
@@ -111,6 +117,12 @@ public:
                   .WillOnce(Return(&mock_journal_policy));
   }
 
+  void expect_journal_disabled(MockJournalPolicy &mock_journal_policy,
+                               bool disabled) {
+    EXPECT_CALL(mock_journal_policy, journal_disabled())
+      .WillOnce(Return(disabled));
+  }
+
   void expect_allocate_journal_tag(MockImageCtx &mock_image_ctx,
                                    MockJournalPolicy &mock_journal_policy,
                                    int r) {
@@ -208,7 +220,10 @@ TEST_F(TestMockExclusiveLockAcquireRequest, Success) {
 
   MockJournal mock_journal;
   MockJournalPolicy mock_journal_policy;
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, true);
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, true);
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, false);
   expect_create_journal(mock_image_ctx, &mock_journal);
   expect_open_journal(mock_image_ctx, mock_journal, 0);
   expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
@@ -241,7 +256,8 @@ TEST_F(TestMockExclusiveLockAcquireRequest, SuccessRefresh) {
 
   MockObjectMap mock_object_map;
   expect_test_features(mock_image_ctx, RBD_FEATURE_OBJECT_MAP, false);
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, false);
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, false);
 
   C_SaferCond acquire_ctx;
   C_SaferCond ctx;
@@ -272,7 +288,8 @@ TEST_F(TestMockExclusiveLockAcquireRequest, SuccessJournalDisabled) {
   expect_create_object_map(mock_image_ctx, &mock_object_map);
   expect_open_object_map(mock_image_ctx, mock_object_map, 0);
 
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, false);
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, false);
 
   C_SaferCond acquire_ctx;
   C_SaferCond ctx;
@@ -302,7 +319,10 @@ TEST_F(TestMockExclusiveLockAcquireRequest, SuccessObjectMapDisabled) {
 
   MockJournal mock_journal;
   MockJournalPolicy mock_journal_policy;
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, true);
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, true);
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, false);
   expect_create_journal(mock_image_ctx, &mock_journal);
   expect_open_journal(mock_image_ctx, mock_journal, 0);
   expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
@@ -363,7 +383,11 @@ TEST_F(TestMockExclusiveLockAcquireRequest, JournalError) {
   expect_open_object_map(mock_image_ctx, *mock_object_map, 0);
 
   MockJournal *mock_journal = new MockJournal();
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, true);
+  MockJournalPolicy mock_journal_policy;
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, true);
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, false);
   expect_create_journal(mock_image_ctx, mock_journal);
   expect_open_journal(mock_image_ctx, *mock_journal, -EINVAL);
   expect_close_journal(mock_image_ctx, *mock_journal);
@@ -400,7 +424,10 @@ TEST_F(TestMockExclusiveLockAcquireRequest, AllocateJournalTagError) {
 
   MockJournal *mock_journal = new MockJournal();
   MockJournalPolicy mock_journal_policy;
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, true);
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, true);
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, false);
   expect_create_journal(mock_image_ctx, mock_journal);
   expect_open_journal(mock_image_ctx, *mock_journal, 0);
   expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
@@ -744,7 +771,10 @@ TEST_F(TestMockExclusiveLockAcquireRequest, OpenObjectMapError) {
 
   MockJournal mock_journal;
   MockJournalPolicy mock_journal_policy;
-  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING, true);
+  expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
+                       mock_image_ctx.snap_lock, true);
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, false);
   expect_create_journal(mock_image_ctx, &mock_journal);
   expect_open_journal(mock_image_ctx, mock_journal, 0);
   expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
diff --git a/src/test/librbd/fsx.cc b/src/test/librbd/fsx.cc
index 95a2f89..fe2d4ad 100644
--- a/src/test/librbd/fsx.cc
+++ b/src/test/librbd/fsx.cc
@@ -827,7 +827,7 @@ krbd_close(struct rbd_ctx *ctx)
 		return ret;
 	}
 
-	ret = krbd_unmap(krbd, ctx->krbd_name);
+	ret = krbd_unmap(krbd, ctx->krbd_name, "");
 	if (ret < 0) {
 		prt("krbd_unmap(%s) failed\n", ctx->krbd_name);
 		return ret;
diff --git a/src/test/librbd/image/test_mock_RefreshRequest.cc b/src/test/librbd/image/test_mock_RefreshRequest.cc
index 0503491..4076e25 100644
--- a/src/test/librbd/image/test_mock_RefreshRequest.cc
+++ b/src/test/librbd/image/test_mock_RefreshRequest.cc
@@ -5,6 +5,7 @@
 #include "test/librbd/test_support.h"
 #include "test/librbd/mock/MockImageCtx.h"
 #include "test/librbd/mock/MockJournal.h"
+#include "test/librbd/mock/MockJournalPolicy.h"
 #include "test/librbd/mock/MockObjectMap.h"
 #include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
 #include "test/librados_test_stub/MockTestMemRadosClient.h"
@@ -246,6 +247,18 @@ public:
     EXPECT_CALL(mock_exclusive_lock, is_lock_owner()).WillOnce(Return(is_owner));
   }
 
+  void expect_get_journal_policy(MockImageCtx &mock_image_ctx,
+                                 MockJournalPolicy &mock_journal_policy) {
+    EXPECT_CALL(mock_image_ctx, get_journal_policy())
+                  .WillOnce(Return(&mock_journal_policy));
+  }
+
+  void expect_journal_disabled(MockJournalPolicy &mock_journal_policy,
+                               bool disabled) {
+    EXPECT_CALL(mock_journal_policy, journal_disabled())
+      .WillOnce(Return(disabled));
+  }
+
   void expect_open_journal(MockRefreshImageCtx &mock_image_ctx,
                            MockJournal &mock_journal, int r) {
     EXPECT_CALL(mock_image_ctx, create_journal())
@@ -447,7 +460,7 @@ TEST_F(TestMockImageRefreshRequest, SuccessChild) {
     }
 
     librbd::NoOpProgressContext no_op;
-    ASSERT_EQ(0, librbd::remove(m_ioctx, clone_name.c_str(), no_op));
+    ASSERT_EQ(0, librbd::remove(m_ioctx, clone_name, "", no_op));
     ASSERT_EQ(0, ictx->operations->snap_unprotect("snap"));
   };
 
@@ -503,12 +516,22 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLock) {
     mock_image_ctx.journal = &mock_journal;
   }
 
-  ASSERT_EQ(0, update_features(ictx,
-                               RBD_FEATURE_EXCLUSIVE_LOCK |
-                               RBD_FEATURE_OBJECT_MAP |
-                               RBD_FEATURE_FAST_DIFF |
-                               RBD_FEATURE_JOURNALING, false));
+  if (ictx->test_features(RBD_FEATURE_JOURNALING)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING, false));
+  }
 
+  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_FAST_DIFF , false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_OBJECT_MAP , false));
+  }
+  
+  if (ictx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_EXCLUSIVE_LOCK , false));
+  }
+  
   expect_op_work_queue(mock_image_ctx);
   expect_test_features(mock_image_ctx);
 
@@ -539,11 +562,21 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLockWhileAcquiringLock) {
   MockExclusiveLock mock_exclusive_lock;
   mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
 
-  ASSERT_EQ(0, update_features(ictx,
-                               RBD_FEATURE_EXCLUSIVE_LOCK |
-                               RBD_FEATURE_OBJECT_MAP |
-                               RBD_FEATURE_FAST_DIFF |
-                               RBD_FEATURE_JOURNALING, false));
+  if (ictx->test_features(RBD_FEATURE_JOURNALING)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING, false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_FAST_DIFF , false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_OBJECT_MAP , false));
+  }
+  
+  if (ictx->test_features(RBD_FEATURE_EXCLUSIVE_LOCK)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_EXCLUSIVE_LOCK , false));
+  }
 
   expect_op_work_queue(mock_image_ctx);
   expect_test_features(mock_image_ctx);
@@ -561,15 +594,62 @@ TEST_F(TestMockImageRefreshRequest, DisableExclusiveLockWhileAcquiringLock) {
 
   ASSERT_EQ(-ERESTART, ctx.wait());
 }
+
+TEST_F(TestMockImageRefreshRequest, JournalDisabledByPolicy) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_FAST_DIFF , false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_OBJECT_MAP , false));
+  }
+
+  MockRefreshImageCtx mock_image_ctx(*ictx);
+  MockRefreshParentRequest mock_refresh_parent_request;
+
+  MockExclusiveLock mock_exclusive_lock;
+  mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
+
+  MockJournal mock_journal;
+
+  expect_op_work_queue(mock_image_ctx);
+  expect_test_features(mock_image_ctx);
+  expect_is_exclusive_lock_owner(mock_exclusive_lock, true);
+
+  InSequence seq;
+  expect_get_mutable_metadata(mock_image_ctx, 0);
+  expect_get_flags(mock_image_ctx, 0);
+  expect_refresh_parent_is_required(mock_refresh_parent_request, false);
+
+  MockJournalPolicy mock_journal_policy;
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, true);
+
+  C_SaferCond ctx;
+  MockRefreshRequest *req = new MockRefreshRequest(mock_image_ctx, false, &ctx);
+  req->send();
+
+  ASSERT_EQ(0, ctx.wait());
+}
+
 TEST_F(TestMockImageRefreshRequest, EnableJournalWithExclusiveLock) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, update_features(ictx,
-                               RBD_FEATURE_OBJECT_MAP |
-                               RBD_FEATURE_FAST_DIFF, false));
+  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_FAST_DIFF , false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_OBJECT_MAP , false));
+  }
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
   MockRefreshParentRequest mock_refresh_parent_request;
@@ -588,6 +668,10 @@ TEST_F(TestMockImageRefreshRequest, EnableJournalWithExclusiveLock) {
   expect_get_mutable_metadata(mock_image_ctx, 0);
   expect_get_flags(mock_image_ctx, 0);
   expect_refresh_parent_is_required(mock_refresh_parent_request, false);
+
+  MockJournalPolicy mock_journal_policy;
+  expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
+  expect_journal_disabled(mock_journal_policy, false);
   expect_open_journal(mock_image_ctx, mock_journal, 0);
 
   C_SaferCond ctx;
@@ -603,9 +687,13 @@ TEST_F(TestMockImageRefreshRequest, EnableJournalWithoutExclusiveLock) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, update_features(ictx,
-                               RBD_FEATURE_OBJECT_MAP |
-                               RBD_FEATURE_FAST_DIFF, false));
+  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_FAST_DIFF , false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_OBJECT_MAP , false));
+  }
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
   MockRefreshParentRequest mock_refresh_parent_request;
@@ -651,7 +739,9 @@ TEST_F(TestMockImageRefreshRequest, DisableJournal) {
   MockJournal *mock_journal = new MockJournal();
   mock_image_ctx.journal = mock_journal;
 
-  ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING, false));
+  if (ictx->test_features(RBD_FEATURE_JOURNALING)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING , false));
+  }
 
   expect_op_work_queue(mock_image_ctx);
   expect_test_features(mock_image_ctx);
@@ -679,7 +769,9 @@ TEST_F(TestMockImageRefreshRequest, EnableObjectMapWithExclusiveLock) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING, false));
+  if (ictx->test_features(RBD_FEATURE_JOURNALING)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING , false));
+  }
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
   MockRefreshParentRequest mock_refresh_parent_request;
@@ -713,7 +805,9 @@ TEST_F(TestMockImageRefreshRequest, EnableObjectMapWithoutExclusiveLock) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING, false));
+  if (ictx->test_features(RBD_FEATURE_JOURNALING)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING , false));
+  }
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
   MockRefreshParentRequest mock_refresh_parent_request;
@@ -758,9 +852,13 @@ TEST_F(TestMockImageRefreshRequest, DisableObjectMap) {
     mock_image_ctx.journal = &mock_journal;
   }
 
-  ASSERT_EQ(0, update_features(ictx,
-                               RBD_FEATURE_OBJECT_MAP |
-                               RBD_FEATURE_FAST_DIFF, false));
+  if (ictx->test_features(RBD_FEATURE_FAST_DIFF)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_FAST_DIFF , false));
+  }
+
+  if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_OBJECT_MAP , false));
+  }
 
   expect_op_work_queue(mock_image_ctx);
   expect_test_features(mock_image_ctx);
@@ -785,7 +883,9 @@ TEST_F(TestMockImageRefreshRequest, OpenObjectMapError) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING, false));
+  if (ictx->test_features(RBD_FEATURE_JOURNALING)) {	
+    ASSERT_EQ(0, update_features(ictx, RBD_FEATURE_JOURNALING , false));
+  }
 
   MockRefreshImageCtx mock_image_ctx(*ictx);
   MockRefreshParentRequest mock_refresh_parent_request;
diff --git a/src/test/librbd/journal/test_Replay.cc b/src/test/librbd/journal/test_Replay.cc
index e5ff749..4710d01 100644
--- a/src/test/librbd/journal/test_Replay.cc
+++ b/src/test/librbd/journal/test_Replay.cc
@@ -42,14 +42,16 @@ public:
 
   template<typename T>
   void inject_into_journal(librbd::ImageCtx *ictx, T event) {
-
+    C_SaferCond ctx;
     librbd::journal::EventEntry event_entry(event);
     librbd::Journal<>::AioObjectRequests requests;
     {
       RWLock::RLocker owner_locker(ictx->owner_lock);
-      ictx->journal->append_io_event(std::move(event_entry), requests, 0, 0,
-                                     true);
+      uint64_t tid = ictx->journal->append_io_event(std::move(event_entry),
+                                                    requests, 0, 0, true);
+      ictx->journal->wait_event(tid, &ctx);
     }
+    ASSERT_EQ(0, ctx.wait());
   }
 
   void get_journal_commit_position(librbd::ImageCtx *ictx, int64_t *tag,
diff --git a/src/test/librbd/mock/MockImageCtx.h b/src/test/librbd/mock/MockImageCtx.h
index ae0f3d6..2a8b98e 100644
--- a/src/test/librbd/mock/MockImageCtx.h
+++ b/src/test/librbd/mock/MockImageCtx.h
@@ -91,7 +91,11 @@ struct MockImageCtx {
       journal_object_flush_bytes(image_ctx.journal_object_flush_bytes),
       journal_object_flush_age(image_ctx.journal_object_flush_age),
       journal_pool(image_ctx.journal_pool),
-      journal_max_payload_bytes(image_ctx.journal_max_payload_bytes)
+      journal_max_payload_bytes(image_ctx.journal_max_payload_bytes),
+      journal_max_concurrent_object_sets(
+          image_ctx.journal_max_concurrent_object_sets),
+      mirroring_resync_after_disconnect(
+          image_ctx.mirroring_resync_after_disconnect)
   {
     md_ctx.dup(image_ctx.md_ctx);
     data_ctx.dup(image_ctx.data_ctx);
@@ -153,6 +157,7 @@ struct MockImageCtx {
   MOCK_METHOD1(flush_async_operations, void(Context *));
   MOCK_METHOD1(flush_copyup, void(Context *));
 
+  MOCK_METHOD1(flush_cache, void(Context *));
   MOCK_METHOD1(invalidate_cache, void(Context *));
   MOCK_METHOD1(shut_down_cache, void(Context *));
 
@@ -257,6 +262,8 @@ struct MockImageCtx {
   double journal_object_flush_age;
   std::string journal_pool;
   uint32_t journal_max_payload_bytes;
+  int journal_max_concurrent_object_sets;
+  bool mirroring_resync_after_disconnect;
 };
 
 } // namespace librbd
diff --git a/src/test/librbd/mock/MockJournal.h b/src/test/librbd/mock/MockJournal.h
index 48447c3..56b3280 100644
--- a/src/test/librbd/mock/MockJournal.h
+++ b/src/test/librbd/mock/MockJournal.h
@@ -40,16 +40,14 @@ struct MockJournal {
 
   MOCK_CONST_METHOD0(is_tag_owner, bool());
   MOCK_CONST_METHOD1(is_tag_owner, int(bool *));
-  MOCK_METHOD6(allocate_tag, void(const std::string &mirror_uuid,
-                                  const std::string &predecessor_mirror_uuid,
-                                  bool predecessor_commit_valid,
-                                  uint64_t predecessor_tag_tid,
-                                  uint64_t predecessor_entry_tid,
+  MOCK_METHOD3(allocate_tag, void(const std::string &mirror_uuid,
+                                  const journal::TagPredecessor &predecessor,
                                   Context *on_finish));
 
   MOCK_METHOD1(open, void(Context *));
   MOCK_METHOD1(close, void(Context *));
 
+  MOCK_CONST_METHOD0(get_tag_tid, uint64_t());
   MOCK_CONST_METHOD0(get_tag_data, journal::TagData());
 
   MOCK_METHOD0(allocate_op_tid, uint64_t());
@@ -83,12 +81,10 @@ struct MockJournal {
   MOCK_METHOD3(commit_op_event, void(uint64_t, int, Context *));
   MOCK_METHOD2(replay_op_ready, void(uint64_t, Context *));
 
-  MOCK_METHOD2(add_listener, void(journal::ListenerType,
-                                  journal::JournalListenerPtr));
-  MOCK_METHOD2(remove_listener, void(journal::ListenerType,
-                                     journal::JournalListenerPtr));
+  MOCK_METHOD1(add_listener, void(journal::Listener *));
+  MOCK_METHOD1(remove_listener, void(journal::Listener *));
 
-  MOCK_METHOD1(check_resync_requested, int(bool *));
+  MOCK_METHOD1(is_resync_requested, int(bool *));
 };
 
 } // namespace librbd
diff --git a/src/test/librbd/mock/MockJournalPolicy.h b/src/test/librbd/mock/MockJournalPolicy.h
index 8ad6ff6..3c95a8c 100644
--- a/src/test/librbd/mock/MockJournalPolicy.h
+++ b/src/test/librbd/mock/MockJournalPolicy.h
@@ -12,6 +12,7 @@ namespace librbd {
 struct MockJournalPolicy : public journal::Policy {
 
   MOCK_CONST_METHOD0(append_disabled, bool());
+  MOCK_CONST_METHOD0(journal_disabled, bool());
   MOCK_METHOD1(allocate_tag_on_lock, void(Context*));
 
 };
diff --git a/src/test/librbd/operation/test_mock_ResizeRequest.cc b/src/test/librbd/operation/test_mock_ResizeRequest.cc
index e3a34be..e1998ed 100644
--- a/src/test/librbd/operation/test_mock_ResizeRequest.cc
+++ b/src/test/librbd/operation/test_mock_ResizeRequest.cc
@@ -116,6 +116,11 @@ public:
                   .WillOnce(FinishRequest(&mock_trim_request, r, &mock_image_ctx));
   }
 
+  void expect_flush_cache(MockImageCtx &mock_image_ctx, int r) {
+    EXPECT_CALL(mock_image_ctx, flush_cache(_)).WillOnce(CompleteContext(r, NULL));
+    expect_op_work_queue(mock_image_ctx);
+  }
+
   void expect_invalidate_cache(MockImageCtx &mock_image_ctx, int r) {
     EXPECT_CALL(mock_image_ctx, invalidate_cache(_))
                   .WillOnce(CompleteContext(r, NULL));
@@ -202,8 +207,9 @@ TEST_F(TestMockOperationResizeRequest, ShrinkSuccess) {
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
-  expect_trim(mock_image_ctx, mock_trim_request, 0);
+  expect_flush_cache(mock_image_ctx, 0);
   expect_invalidate_cache(mock_image_ctx, 0);
+  expect_trim(mock_image_ctx, mock_trim_request, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_update_header(mock_image_ctx, 0);
   expect_shrink_object_map(mock_image_ctx);
@@ -263,11 +269,35 @@ TEST_F(TestMockOperationResizeRequest, TrimError) {
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
+  expect_flush_cache(mock_image_ctx, 0);
+  expect_invalidate_cache(mock_image_ctx, -EBUSY);
   expect_trim(mock_image_ctx, mock_trim_request, -EINVAL);
   expect_commit_op_event(mock_image_ctx, -EINVAL);
   ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, 0, false));
 }
 
+TEST_F(TestMockOperationResizeRequest, FlushCacheError) {
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  MockImageCtx mock_image_ctx(*ictx);
+  MockExclusiveLock mock_exclusive_lock;
+  MockJournal mock_journal;
+  MockObjectMap mock_object_map;
+  initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
+                      mock_object_map);
+
+  InSequence seq;
+  expect_block_writes(mock_image_ctx, 0);
+  expect_append_op_event(mock_image_ctx, true, 0);
+  expect_unblock_writes(mock_image_ctx);
+
+  MockTrimRequest mock_trim_request;
+  expect_flush_cache(mock_image_ctx, -EINVAL);
+  expect_commit_op_event(mock_image_ctx, -EINVAL);
+  ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, 0, false));
+}
+
 TEST_F(TestMockOperationResizeRequest, InvalidateCacheError) {
   librbd::ImageCtx *ictx;
   ASSERT_EQ(0, open_image(m_image_name, &ictx));
@@ -285,7 +315,7 @@ TEST_F(TestMockOperationResizeRequest, InvalidateCacheError) {
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
-  expect_trim(mock_image_ctx, mock_trim_request, 0);
+  expect_flush_cache(mock_image_ctx, 0);
   expect_invalidate_cache(mock_image_ctx, -EINVAL);
   expect_commit_op_event(mock_image_ctx, -EINVAL);
   ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, 0, false));
diff --git a/src/test/librbd/test_internal.cc b/src/test/librbd/test_internal.cc
index 407e036..c6ac977 100644
--- a/src/test/librbd/test_internal.cc
+++ b/src/test/librbd/test_internal.cc
@@ -252,7 +252,7 @@ TEST_F(TestInternal, FlattenFailsToLockImage) {
       parent->unlock_image();
     }
     librbd::NoOpProgressContext no_op;
-    ASSERT_EQ(0, librbd::remove(m_ioctx, clone_name.c_str(), no_op));
+    ASSERT_EQ(0, librbd::remove(m_ioctx, clone_name, "", no_op));
   } BOOST_SCOPE_EXIT_END;
 
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
@@ -808,7 +808,7 @@ TEST_F(TestInternal, WriteFullCopyup) {
     }
 
     librbd::NoOpProgressContext remove_no_op;
-    ASSERT_EQ(0, librbd::remove(m_ioctx, clone_name.c_str(), remove_no_op));
+    ASSERT_EQ(0, librbd::remove(m_ioctx, clone_name, "", remove_no_op));
   } BOOST_SCOPE_EXIT_END;
 
   ASSERT_EQ(0, open_image(clone_name, &ictx2));
@@ -835,3 +835,16 @@ TEST_F(TestInternal, WriteFullCopyup) {
                                                           read_bl.c_str(), 0));
   ASSERT_TRUE(bl.contents_equal(read_bl));
 }
+
+TEST_F(TestInternal, RemoveById) {
+  REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  std::string image_id = ictx->id;
+  close_image(ictx);
+
+  librbd::NoOpProgressContext remove_no_op;
+  ASSERT_EQ(0, librbd::remove(m_ioctx, "", image_id, remove_no_op));
+}
diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc
index c03ce64..ff91f25 100644
--- a/src/test/librbd/test_librbd.cc
+++ b/src/test/librbd/test_librbd.cc
@@ -3652,10 +3652,14 @@ TEST_F(TestLibRBD, UpdateFeatures)
   // must provide a single feature
   ASSERT_EQ(-EINVAL, image.update_features(0, true));
 
-  ASSERT_EQ(0, image.update_features(RBD_FEATURE_EXCLUSIVE_LOCK |
-                                     RBD_FEATURE_OBJECT_MAP |
-                                     RBD_FEATURE_FAST_DIFF |
-                                     RBD_FEATURE_JOURNALING, false));
+  uint64_t disable_features;
+  disable_features = features & (RBD_FEATURE_EXCLUSIVE_LOCK |
+                                 RBD_FEATURE_OBJECT_MAP |
+                                 RBD_FEATURE_FAST_DIFF |
+                                 RBD_FEATURE_JOURNALING);
+  if (disable_features != 0) {
+    ASSERT_EQ(0, image.update_features(disable_features, false));
+  }
 
   // cannot enable object map nor journaling w/o exclusive lock
   ASSERT_EQ(-EINVAL, image.update_features(RBD_FEATURE_OBJECT_MAP, true));
@@ -4353,3 +4357,45 @@ TEST_F(TestLibRBD, FlushCacheWithCopyupOnExternalSnapshot) {
   ASSERT_EQ(0, read_comp->wait_for_complete());
   read_comp->release();
 }
+
+TEST_F(TestLibRBD, DiscardAfterWrite)
+{
+  librados::IoCtx ioctx;
+  ASSERT_EQ(0, _rados.ioctx_create(m_pool_name.c_str(), ioctx));
+
+  librbd::RBD rbd;
+  std::string name = get_temp_image_name();
+  uint64_t size = 1 << 20;
+  int order = 18;
+  ASSERT_EQ(0, create_image_pp(rbd, ioctx, name.c_str(), size, &order));
+
+  librbd::Image image;
+  ASSERT_EQ(0, rbd.open(ioctx, image, name.c_str(), NULL));
+
+  // enable writeback cache
+  ASSERT_EQ(0, image.flush());
+
+  bufferlist bl;
+  bl.append(std::string(256, '1'));
+
+  librbd::RBD::AioCompletion *write_comp =
+    new librbd::RBD::AioCompletion(NULL, NULL);
+  ASSERT_EQ(0, image.aio_write(0, bl.length(), bl, write_comp));
+  ASSERT_EQ(0, write_comp->wait_for_complete());
+  write_comp->release();
+
+  librbd::RBD::AioCompletion *discard_comp =
+    new librbd::RBD::AioCompletion(NULL, NULL);
+  ASSERT_EQ(0, image.aio_discard(0, 256, discard_comp));
+  ASSERT_EQ(0, discard_comp->wait_for_complete());
+  discard_comp->release();
+
+  librbd::RBD::AioCompletion *read_comp =
+    new librbd::RBD::AioCompletion(NULL, NULL);
+  bufferlist read_bl;
+  image.aio_read(0, bl.length(), read_bl, read_comp);
+  ASSERT_EQ(0, read_comp->wait_for_complete());
+  ASSERT_EQ(bl.length(), read_comp->get_return_value());
+  ASSERT_TRUE(read_bl.is_zero());
+  read_comp->release();
+}
diff --git a/src/test/librbd/test_mirroring.cc b/src/test/librbd/test_mirroring.cc
index cd59dd7..fcd98ec 100644
--- a/src/test/librbd/test_mirroring.cc
+++ b/src/test/librbd/test_mirroring.cc
@@ -464,7 +464,7 @@ TEST_F(TestMirroring, EnableJournaling_In_MirrorModeDisabled) {
   uint64_t init_features = 0;
   init_features |= RBD_FEATURE_OBJECT_MAP;
   init_features |= RBD_FEATURE_EXCLUSIVE_LOCK;
-  uint64_t features = init_features | RBD_FEATURE_JOURNALING;
+  uint64_t features = RBD_FEATURE_JOURNALING;
   check_mirroring_on_update_features(init_features, true, false, features, 0,
                       RBD_MIRROR_MODE_DISABLED, RBD_MIRROR_IMAGE_DISABLED);
 }
@@ -473,7 +473,7 @@ TEST_F(TestMirroring, EnableJournaling_In_MirrorModeImage) {
   uint64_t init_features = 0;
   init_features |= RBD_FEATURE_OBJECT_MAP;
   init_features |= RBD_FEATURE_EXCLUSIVE_LOCK;
-  uint64_t features = init_features | RBD_FEATURE_JOURNALING;
+  uint64_t features = RBD_FEATURE_JOURNALING;
   check_mirroring_on_update_features(init_features, true, false, features, 0,
                       RBD_MIRROR_MODE_IMAGE, RBD_MIRROR_IMAGE_DISABLED);
 }
@@ -482,7 +482,7 @@ TEST_F(TestMirroring, EnableJournaling_In_MirrorModePool) {
   uint64_t init_features = 0;
   init_features |= RBD_FEATURE_OBJECT_MAP;
   init_features |= RBD_FEATURE_EXCLUSIVE_LOCK;
-  uint64_t features = init_features | RBD_FEATURE_JOURNALING;
+  uint64_t features = RBD_FEATURE_JOURNALING;
   check_mirroring_on_update_features(init_features, true, false, features, 0,
                       RBD_MIRROR_MODE_POOL, RBD_MIRROR_IMAGE_ENABLED);
 }
diff --git a/src/test/librbd/test_mock_Journal.cc b/src/test/librbd/test_mock_Journal.cc
index 3785f2c..74d8fb0 100644
--- a/src/test/librbd/test_mock_Journal.cc
+++ b/src/test/librbd/test_mock_Journal.cc
@@ -109,7 +109,6 @@ using ::testing::WithArg;
 using namespace std::placeholders;
 
 ACTION_P2(StartReplay, wq, ctx) {
-  ctx->replay_handler = arg0;
   wq->queue(ctx, 0);
 }
 
@@ -121,7 +120,6 @@ public:
   typedef Journal<MockJournalImageCtx> MockJournal;
 
   typedef std::function<void(::journal::ReplayHandler*)> ReplayAction;
-  typedef std::list<ReplayAction> ReplayActions;
   typedef std::list<Context *> Contexts;
 
   TestMockJournal() : m_lock("lock") {
@@ -135,16 +133,17 @@ public:
   Cond m_cond;
   Contexts m_commit_contexts;
 
-  struct C_StartReplay : public Context {
-    ReplayActions replay_actions;
-    ::journal::ReplayHandler *replay_handler;
+  struct C_ReplayAction : public Context {
+    ::journal::ReplayHandler **replay_handler;
+    ReplayAction replay_action;
 
-    C_StartReplay(const ReplayActions &replay_actions)
-      : replay_actions(replay_actions), replay_handler(nullptr) {
+    C_ReplayAction(::journal::ReplayHandler **replay_handler,
+                   const ReplayAction &replay_action)
+      : replay_handler(replay_handler), replay_action(replay_action) {
     }
     virtual void finish(int r) {
-      for (auto &action : replay_actions) {
-        action(replay_handler);
+      if (replay_action) {
+        replay_action(*replay_handler);
       }
     }
   };
@@ -171,12 +170,16 @@ public:
   }
 
   void expect_get_journaler_cached_client(::journal::MockJournaler &mock_journaler, int r) {
-
     journal::ImageClientMeta image_client_meta;
     image_client_meta.tag_class = 0;
+    expect_get_journaler_cached_client(mock_journaler, image_client_meta, r);
+  }
 
+  void expect_get_journaler_cached_client(::journal::MockJournaler &mock_journaler,
+                                          const journal::ImageClientMeta &client_meta,
+                                          int r) {
     journal::ClientData client_data;
-    client_data.client_meta = image_client_meta;
+    client_data.client_meta = client_meta;
 
     cls::journal::Client client;
     ::encode(client_data, client.data);
@@ -188,8 +191,11 @@ public:
 
   void expect_get_journaler_tags(MockImageCtx &mock_image_ctx,
                                  ::journal::MockJournaler &mock_journaler,
-                                 int r) {
+                                 bool primary, int r) {
     journal::TagData tag_data;
+    if (!primary) {
+      tag_data.mirror_uuid = "remote mirror uuid";
+    }
 
     bufferlist tag_data_bl;
     ::encode(tag_data, tag_data_bl);
@@ -198,15 +204,27 @@ public:
     EXPECT_CALL(mock_journaler, get_tags(0, _, _))
                   .WillOnce(DoAll(SetArgPointee<1>(tags),
                                   WithArg<2>(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue))));
-    EXPECT_CALL(mock_journaler, add_listener(_));
+    EXPECT_CALL(mock_journaler, add_listener(_))
+                  .WillOnce(SaveArg<0>(&m_listener));
+  }
+
+  void expect_get_journaler_tags(MockImageCtx &mock_image_ctx,
+                                 ::journal::MockJournaler &mock_journaler,
+                                 uint64_t start_after_tag_tid,
+                                 ::journal::Journaler::Tags &&tags, int r) {
+    EXPECT_CALL(mock_journaler, get_tags(start_after_tag_tid, 0, _, _))
+                  .WillOnce(DoAll(SetArgPointee<2>(tags),
+                                  WithArg<3>(CompleteContext(r, mock_image_ctx.image_ctx->op_work_queue))));
   }
 
   void expect_start_replay(MockJournalImageCtx &mock_image_ctx,
                            ::journal::MockJournaler &mock_journaler,
-                           const ReplayActions &actions) {
+                           const ReplayAction &action) {
     EXPECT_CALL(mock_journaler, start_replay(_))
-                 .WillOnce(StartReplay(mock_image_ctx.image_ctx->op_work_queue,
-                                       new C_StartReplay(actions)));
+                 .WillOnce(DoAll(SaveArg<0>(&m_replay_handler),
+                           StartReplay(mock_image_ctx.image_ctx->op_work_queue,
+                                       new C_ReplayAction(&m_replay_handler,
+                                                          action))));
   }
 
   void expect_stop_replay(::journal::MockJournaler &mock_journaler) {
@@ -227,11 +245,16 @@ public:
                   .WillOnce(Return(bufferlist()));
   }
 
-  void expect_try_pop_front(::journal::MockJournaler &mock_journaler,
+  void expect_try_pop_front(MockJournalImageCtx &mock_image_ctx,
+                            ::journal::MockJournaler &mock_journaler,
                             bool entries_available,
-                            ::journal::MockReplayEntry &mock_replay_entry) {
+                            ::journal::MockReplayEntry &mock_replay_entry,
+                            const ReplayAction &action = {}) {
     EXPECT_CALL(mock_journaler, try_pop_front(_))
                   .WillOnce(DoAll(SetArgPointee<0>(::journal::MockReplayEntryProxy()),
+                                  StartReplay(mock_image_ctx.image_ctx->op_work_queue,
+                                              new C_ReplayAction(&m_replay_handler,
+                                                                 action)),
                                   Return(entries_available)));
     if (entries_available) {
       expect_get_data(mock_replay_entry);
@@ -351,7 +374,8 @@ public:
 
   void open_journal(MockJournalImageCtx &mock_image_ctx,
                     MockJournal &mock_journal,
-                    ::journal::MockJournaler &mock_journaler) {
+                    ::journal::MockJournaler &mock_journaler,
+                    bool primary = true) {
     expect_op_work_queue(mock_image_ctx);
 
     InSequence seq;
@@ -359,11 +383,10 @@ public:
     expect_init_journaler(mock_journaler, 0);
     expect_get_max_append_size(mock_journaler, 1 << 16);
     expect_get_journaler_cached_client(mock_journaler, 0);
-    expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+    expect_get_journaler_tags(mock_image_ctx, mock_journaler, primary, 0);
     expect_start_replay(
-      mock_image_ctx, mock_journaler, {
-        std::bind(&invoke_replay_complete, _1, 0)
-      });
+      mock_image_ctx, mock_journaler,
+      std::bind(&invoke_replay_complete, _1, 0));
 
     MockJournalReplay mock_journal_replay;
     expect_stop_replay(mock_journaler);
@@ -386,6 +409,9 @@ public:
   static void invoke_replay_complete(::journal::ReplayHandler *handler, int r) {
     handler->handle_complete(r);
   }
+
+  ::journal::ReplayHandler *m_replay_handler = nullptr;
+  ::journal::JournalMetadataListener *m_listener = nullptr;
 };
 
 TEST_F(TestMockJournal, StateTransitions) {
@@ -405,24 +431,23 @@ TEST_F(TestMockJournal, StateTransitions) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_ready, _1),
-      std::bind(&invoke_replay_ready, _1),
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_ready, _1));
 
   ::journal::MockReplayEntry mock_replay_entry;
   MockJournalReplay mock_journal_replay;
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
   expect_replay_process(mock_journal_replay);
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
   expect_replay_process(mock_journal_replay);
-  expect_try_pop_front(mock_journaler, false, mock_replay_entry);
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, false, mock_replay_entry,
+                       std::bind(&invoke_replay_ready, _1));
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
   expect_replay_process(mock_journal_replay);
-  expect_try_pop_front(mock_journaler, false, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, false, mock_replay_entry,
+                       std::bind(&invoke_replay_complete, _1, 0));
 
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
@@ -494,7 +519,7 @@ TEST_F(TestMockJournal, GetTagsError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, -EBADMSG);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, -EBADMSG);
   expect_shut_down_journaler(mock_journaler);
   ASSERT_EQ(-EBADMSG, when_open(mock_journal));
 }
@@ -516,11 +541,10 @@ TEST_F(TestMockJournal, ReplayCompleteError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_complete, _1, -EINVAL)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_complete, _1, -EINVAL));
 
   MockJournalReplay mock_journal_replay;
   expect_stop_replay(mock_journaler);
@@ -532,11 +556,10 @@ TEST_F(TestMockJournal, ReplayCompleteError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_complete, _1, 0));
 
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
@@ -565,18 +588,17 @@ TEST_F(TestMockJournal, FlushReplayError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_ready, _1),
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_ready, _1));
 
   ::journal::MockReplayEntry mock_replay_entry;
   MockJournalReplay mock_journal_replay;
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
   expect_replay_process(mock_journal_replay);
-  expect_try_pop_front(mock_journaler, false, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, false, mock_replay_entry,
+                       std::bind(&invoke_replay_complete, _1, 0));
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, -EINVAL);
   expect_shut_down_journaler(mock_journaler);
@@ -586,11 +608,10 @@ TEST_F(TestMockJournal, FlushReplayError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_complete, _1, 0));
 
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
@@ -619,16 +640,14 @@ TEST_F(TestMockJournal, CorruptEntry) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_ready, _1),
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_ready, _1));
 
   ::journal::MockReplayEntry mock_replay_entry;
   MockJournalReplay mock_journal_replay;
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
   EXPECT_CALL(mock_journal_replay, decode(_, _)).WillOnce(Return(-EBADMSG));
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0, true);
@@ -639,11 +658,10 @@ TEST_F(TestMockJournal, CorruptEntry) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_complete, _1, 0));
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
   expect_start_append(mock_journaler);
@@ -671,11 +689,10 @@ TEST_F(TestMockJournal, StopError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_complete, _1, 0));
 
   MockJournalReplay mock_journal_replay;
   expect_stop_replay(mock_journaler);
@@ -704,18 +721,15 @@ TEST_F(TestMockJournal, ReplayOnDiskPreFlushError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
 
-  ::journal::ReplayHandler *replay_handler = nullptr;
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_ready, _1),
-      [&replay_handler] (::journal::ReplayHandler *handler) {replay_handler = handler;},
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_ready, _1));
 
   ::journal::MockReplayEntry mock_replay_entry;
   MockJournalReplay mock_journal_replay;
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
 
   EXPECT_CALL(mock_journal_replay, decode(_, _))
                 .WillOnce(Return(0));
@@ -724,7 +738,8 @@ TEST_F(TestMockJournal, ReplayOnDiskPreFlushError) {
                 .WillOnce(DoAll(SaveArg<1>(&on_ready),
                                 WithArg<2>(Invoke(this, &TestMockJournal::save_commit_context))));
 
-  expect_try_pop_front(mock_journaler, false, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, false,
+                       mock_replay_entry);
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0, true);
   expect_shut_down_journaler(mock_journaler);
@@ -734,7 +749,7 @@ TEST_F(TestMockJournal, ReplayOnDiskPreFlushError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
     mock_image_ctx, mock_journaler, {
       std::bind(&invoke_replay_complete, _1, 0)
@@ -762,7 +777,7 @@ TEST_F(TestMockJournal, ReplayOnDiskPreFlushError) {
   on_safe->complete(-EINVAL);
 
   // flag the replay as complete
-  replay_handler->handle_complete(0);
+  m_replay_handler->handle_complete(0);
 
   ASSERT_EQ(0, ctx.wait());
 
@@ -788,18 +803,17 @@ TEST_F(TestMockJournal, ReplayOnDiskPostFlushError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_ready, _1),
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_ready, _1));
 
   ::journal::MockReplayEntry mock_replay_entry;
   MockJournalReplay mock_journal_replay;
-  expect_try_pop_front(mock_journaler, true, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, true, mock_replay_entry);
   expect_replay_process(mock_journal_replay);
-  expect_try_pop_front(mock_journaler, false, mock_replay_entry);
+  expect_try_pop_front(mock_image_ctx, mock_journaler, false, mock_replay_entry,
+                       std::bind(&invoke_replay_complete, _1, 0));
   expect_stop_replay(mock_journaler);
 
   Context *on_flush = nullptr;
@@ -813,11 +827,10 @@ TEST_F(TestMockJournal, ReplayOnDiskPostFlushError) {
   expect_init_journaler(mock_journaler, 0);
   expect_get_max_append_size(mock_journaler, 1 << 16);
   expect_get_journaler_cached_client(mock_journaler, 0);
-  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, true, 0);
   expect_start_replay(
-    mock_image_ctx, mock_journaler, {
-      std::bind(&invoke_replay_complete, _1, 0)
-    });
+    mock_image_ctx, mock_journaler,
+    std::bind(&invoke_replay_complete, _1, 0));
 
   expect_stop_replay(mock_journaler);
   expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0);
@@ -826,24 +839,24 @@ TEST_F(TestMockJournal, ReplayOnDiskPostFlushError) {
   C_SaferCond ctx;
   mock_journal.open(&ctx);
 
+  // proceed with the flush
   {
-    // wait for the on_safe process callback
+    // wait for on_flush callback
     Mutex::Locker locker(m_lock);
-    while (m_commit_contexts.empty()) {
+    while (on_flush == nullptr) {
       m_cond.Wait(m_lock);
     }
   }
-  m_commit_contexts.front()->complete(-EINVAL);
-  m_commit_contexts.clear();
 
-  // proceed with the flush
   {
-    // wait for on_flush callback
+    // wait for the on_safe process callback
     Mutex::Locker locker(m_lock);
-    while (on_flush == nullptr) {
+    while (m_commit_contexts.empty()) {
       m_cond.Wait(m_lock);
     }
   }
+  m_commit_contexts.front()->complete(-EINVAL);
+  m_commit_contexts.clear();
   on_flush->complete(0);
 
   ASSERT_EQ(0, ctx.wait());
@@ -872,11 +885,13 @@ TEST_F(TestMockJournal, EventAndIOCommitOrder) {
   expect_append_journaler(mock_journaler);
   expect_wait_future(mock_future, &on_journal_safe1);
   ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal));
+  mock_journal.get_work_queue()->drain();
 
   Context *on_journal_safe2;
   expect_append_journaler(mock_journaler);
   expect_wait_future(mock_future, &on_journal_safe2);
   ASSERT_EQ(2U, when_append_io_event(mock_image_ctx, mock_journal));
+  mock_journal.get_work_queue()->drain();
 
   // commit journal event followed by IO event (standard)
   on_journal_safe1->complete(0);
@@ -920,6 +935,7 @@ TEST_F(TestMockJournal, AppendWriteEvent) {
   expect_append_journaler(mock_journaler);
   expect_wait_future(mock_future, &on_journal_safe);
   ASSERT_EQ(1U, when_append_write_event(mock_image_ctx, mock_journal, 1 << 17));
+  mock_journal.get_work_queue()->drain();
 
   on_journal_safe->complete(0);
   C_SaferCond event_ctx;
@@ -959,6 +975,7 @@ TEST_F(TestMockJournal, EventCommitError) {
   expect_wait_future(mock_future, &on_journal_safe);
   ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal,
                                      object_request));
+  mock_journal.get_work_queue()->drain();
 
   // commit the event in the journal w/o waiting writeback
   expect_future_committed(mock_journaler);
@@ -998,6 +1015,7 @@ TEST_F(TestMockJournal, EventCommitErrorWithPendingWriteback) {
   expect_wait_future(mock_future, &on_journal_safe);
   ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal,
                                      object_request));
+  mock_journal.get_work_queue()->drain();
 
   expect_future_is_valid(mock_future);
   C_SaferCond flush_ctx;
@@ -1033,6 +1051,7 @@ TEST_F(TestMockJournal, IOCommitError) {
   expect_append_journaler(mock_journaler);
   expect_wait_future(mock_future, &on_journal_safe);
   ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal));
+  mock_journal.get_work_queue()->drain();
 
   // failed IO remains uncommitted in journal
   on_journal_safe->complete(0);
@@ -1084,15 +1103,12 @@ TEST_F(TestMockJournal, ExternalReplay) {
   expect_shut_down_journaler(mock_journaler);
 
   C_SaferCond start_ctx;
-  C_SaferCond close_request_ctx;
 
   journal::Replay<MockJournalImageCtx> *journal_replay = nullptr;
-  mock_journal.start_external_replay(&journal_replay, &start_ctx,
-                                     &close_request_ctx);
+  mock_journal.start_external_replay(&journal_replay, &start_ctx);
   ASSERT_EQ(0, start_ctx.wait());
 
   mock_journal.stop_external_replay();
-  ASSERT_EQ(-ECANCELED, close_request_ctx.wait());
 }
 
 TEST_F(TestMockJournal, ExternalReplayFailure) {
@@ -1115,16 +1131,13 @@ TEST_F(TestMockJournal, ExternalReplayFailure) {
   expect_shut_down_journaler(mock_journaler);
 
   C_SaferCond start_ctx;
-  C_SaferCond close_request_ctx;
 
   journal::Replay<MockJournalImageCtx> *journal_replay = nullptr;
-  mock_journal.start_external_replay(&journal_replay, &start_ctx,
-                                     &close_request_ctx);
+  mock_journal.start_external_replay(&journal_replay, &start_ctx);
   ASSERT_EQ(-EINVAL, start_ctx.wait());
-  ASSERT_EQ(-EINVAL, close_request_ctx.wait());
 }
 
-TEST_F(TestMockJournal, ExternalReplayCloseRequest) {
+TEST_F(TestMockJournal, AppendDisabled) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
   librbd::ImageCtx *ictx;
@@ -1132,31 +1145,61 @@ TEST_F(TestMockJournal, ExternalReplayCloseRequest) {
 
   MockJournalImageCtx mock_image_ctx(*ictx);
   MockJournal mock_journal(mock_image_ctx);
+  MockJournalPolicy mock_journal_policy;
+
   ::journal::MockJournaler mock_journaler;
   open_journal(mock_image_ctx, mock_journal, mock_journaler);
+  BOOST_SCOPE_EXIT_ALL(&) {
+    close_journal(mock_journal, mock_journaler);
+  };
 
   InSequence seq;
-  expect_stop_append(mock_journaler, 0);
+  RWLock::RLocker snap_locker(mock_image_ctx.snap_lock);
+  EXPECT_CALL(mock_image_ctx, get_journal_policy()).WillOnce(
+    Return(ictx->get_journal_policy()));
+  ASSERT_TRUE(mock_journal.is_journal_appending());
+
+  EXPECT_CALL(mock_image_ctx, get_journal_policy()).WillOnce(
+    Return(&mock_journal_policy));
+  EXPECT_CALL(mock_journal_policy, append_disabled()).WillOnce(Return(true));
+  ASSERT_FALSE(mock_journal.is_journal_appending());
+
   expect_shut_down_journaler(mock_journaler);
+}
 
-  C_SaferCond start_ctx;
-  C_SaferCond close_request_ctx;
+TEST_F(TestMockJournal, CloseListenerEvent) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
-  journal::Replay<MockJournalImageCtx> *journal_replay = nullptr;
-  mock_journal.start_external_replay(&journal_replay, &start_ctx,
-                                     &close_request_ctx);
-  ASSERT_EQ(0, start_ctx.wait());
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
 
-  C_SaferCond close_ctx;
-  mock_journal.close(&close_ctx);
+  MockJournalImageCtx mock_image_ctx(*ictx);
+  MockJournal mock_journal(mock_image_ctx);
+  ::journal::MockJournaler mock_journaler;
+  open_journal(mock_image_ctx, mock_journal, mock_journaler);
 
-  ASSERT_EQ(0, close_request_ctx.wait());
-  mock_journal.stop_external_replay();
+  struct Listener : public journal::Listener {
+    C_SaferCond ctx;
+    virtual void handle_close() {
+      ctx.complete(0);
+    }
+    virtual void handle_resync() {
+      ADD_FAILURE() << "unexpected resync request";
+    }
+    virtual void handle_promoted() {
+      ADD_FAILURE() << "unexpected promotion event";
+    }
+  } listener;
+  mock_journal.add_listener(&listener);
+
+  expect_shut_down_journaler(mock_journaler);
+  close_journal(mock_journal, mock_journaler);
 
-  ASSERT_EQ(0, close_ctx.wait());
+  ASSERT_EQ(0, listener.ctx.wait());
+  mock_journal.remove_listener(&listener);
 }
 
-TEST_F(TestMockJournal, AppendDisabled) {
+TEST_F(TestMockJournal, ResyncRequested) {
   REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
 
   librbd::ImageCtx *ictx;
@@ -1164,26 +1207,95 @@ TEST_F(TestMockJournal, AppendDisabled) {
 
   MockJournalImageCtx mock_image_ctx(*ictx);
   MockJournal mock_journal(mock_image_ctx);
-  MockJournalPolicy mock_journal_policy;
+  ::journal::MockJournaler mock_journaler;
+  open_journal(mock_image_ctx, mock_journal, mock_journaler, false);
+
+  struct Listener : public journal::Listener {
+    C_SaferCond ctx;
+    virtual void handle_close() {
+      ADD_FAILURE() << "unexpected close action";
+    }
+    virtual void handle_resync() {
+      ctx.complete(0);
+    }
+    virtual void handle_promoted() {
+      ADD_FAILURE() << "unexpected promotion event";
+    }
+  } listener;
+  mock_journal.add_listener(&listener);
+
+  BOOST_SCOPE_EXIT_ALL(&) {
+    mock_journal.remove_listener(&listener);
+    close_journal(mock_journal, mock_journaler);
+  };
+
+  InSequence seq;
+
+  journal::TagData tag_data;
+  tag_data.mirror_uuid == Journal<>::LOCAL_MIRROR_UUID;
+
+  bufferlist tag_data_bl;
+  ::encode(tag_data, tag_data_bl);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0,
+                            {{0, 0, tag_data_bl}}, 0);
+
+  journal::ImageClientMeta image_client_meta;
+  image_client_meta.tag_class = 0;
+  image_client_meta.resync_requested = true;
+  expect_get_journaler_cached_client(mock_journaler, image_client_meta, 0);
+  expect_shut_down_journaler(mock_journaler);
+
+  m_listener->handle_update(nullptr);
+  ASSERT_EQ(0, listener.ctx.wait());
+}
 
+TEST_F(TestMockJournal, ForcePromoted) {
+  REQUIRE_FEATURE(RBD_FEATURE_JOURNALING);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+  MockJournalImageCtx mock_image_ctx(*ictx);
+  MockJournal mock_journal(mock_image_ctx);
   ::journal::MockJournaler mock_journaler;
-  open_journal(mock_image_ctx, mock_journal, mock_journaler);
+  open_journal(mock_image_ctx, mock_journal, mock_journaler, false);
+
+  struct Listener : public journal::Listener {
+    C_SaferCond ctx;
+    virtual void handle_close() {
+      ADD_FAILURE() << "unexpected close action";
+    }
+    virtual void handle_resync() {
+      ADD_FAILURE() << "unexpected resync event";
+    }
+    virtual void handle_promoted() {
+      ctx.complete(0);
+    }
+  } listener;
+  mock_journal.add_listener(&listener);
+
   BOOST_SCOPE_EXIT_ALL(&) {
+    mock_journal.remove_listener(&listener);
     close_journal(mock_journal, mock_journaler);
   };
 
   InSequence seq;
-  RWLock::RLocker snap_locker(mock_image_ctx.snap_lock);
-  EXPECT_CALL(mock_image_ctx, get_journal_policy()).WillOnce(
-    Return(ictx->get_journal_policy()));
-  ASSERT_TRUE(mock_journal.is_journal_appending());
 
-  EXPECT_CALL(mock_image_ctx, get_journal_policy()).WillOnce(
-    Return(&mock_journal_policy));
-  EXPECT_CALL(mock_journal_policy, append_disabled()).WillOnce(Return(true));
-  ASSERT_FALSE(mock_journal.is_journal_appending());
+  journal::TagData tag_data;
+  tag_data.mirror_uuid == Journal<>::LOCAL_MIRROR_UUID;
 
+  bufferlist tag_data_bl;
+  ::encode(tag_data, tag_data_bl);
+  expect_get_journaler_tags(mock_image_ctx, mock_journaler, 0,
+                            {{100, 0, tag_data_bl}}, 0);
+
+  journal::ImageClientMeta image_client_meta;
+  image_client_meta.tag_class = 0;
+  expect_get_journaler_cached_client(mock_journaler, image_client_meta, 0);
   expect_shut_down_journaler(mock_journaler);
+
+  m_listener->handle_update(nullptr);
+  ASSERT_EQ(0, listener.ctx.wait());
 }
 
 } // namespace librbd
diff --git a/src/test/librgw_file_aw.cc b/src/test/librgw_file_aw.cc
index 2c047a3..9e03d40 100644
--- a/src/test/librgw_file_aw.cc
+++ b/src/test/librgw_file_aw.cc
@@ -207,7 +207,7 @@ TEST(LibRGW, LOOKUP_OBJECT) {
 }
 
 TEST(LibRGW, OPEN1) {
-  int ret = rgw_open(fs, object_fh, RGW_OPEN_FLAG_NONE);
+  int ret = rgw_open(fs, object_fh, 0 /* posix flags */, RGW_OPEN_FLAG_NONE);
   ASSERT_EQ(ret, 0);
 }
 
@@ -234,7 +234,7 @@ TEST(LibRGW, CLOSE1) {
 }
 
 TEST(LibRGW, OPEN2) {
-  int ret = rgw_open(fs, object_fh, RGW_OPEN_FLAG_NONE);
+  int ret = rgw_open(fs, object_fh, 0 /* posix flags */, RGW_OPEN_FLAG_NONE);
   ASSERT_EQ(ret, 0);
 }
 
diff --git a/src/test/librgw_file_gp.cc b/src/test/librgw_file_gp.cc
index ec70b5d..eba0e38 100644
--- a/src/test/librgw_file_gp.cc
+++ b/src/test/librgw_file_gp.cc
@@ -227,7 +227,7 @@ TEST(LibRGW, LOOKUP_OBJECT) {
 
 TEST(LibRGW, OBJ_OPEN) {
   if (do_get || do_put || do_readv || do_writev) {
-    int ret = rgw_open(fs, object_fh, 0 /* flags */);
+    int ret = rgw_open(fs, object_fh, 0 /* posix flags */, 0 /* flags */);
     ASSERT_EQ(ret, 0);
     object_open = true;
   }
diff --git a/src/test/librgw_file_nfsns.cc b/src/test/librgw_file_nfsns.cc
index de8aa5f..ebac187 100644
--- a/src/test/librgw_file_nfsns.cc
+++ b/src/test/librgw_file_nfsns.cc
@@ -46,6 +46,10 @@ namespace {
 
   uint32_t owner_uid = 867;
   uint32_t owner_gid = 5309;
+
+  uint32_t magic_uid = 1701;
+  uint32_t magic_gid = 9876;
+
   uint32_t create_mask = RGW_SETATTR_UID | RGW_SETATTR_GID | RGW_SETATTR_MODE;
 
   string bucket_name("nfsroot");
@@ -75,6 +79,11 @@ namespace {
       : name(std::move(_name)), fh(_fh), parent_fh(_parent_fh),
 	rgw_fh(_rgw_fh) {}
 
+    void clear() {
+      fh = nullptr;
+      rgw_fh = nullptr;
+    }
+
     void sync() {
       if (fh)
 	rgw_fh = get_rgwfh(fh);
@@ -146,6 +155,7 @@ namespace {
   bool do_create = false;
   bool do_delete = false;
   bool do_rename = false;
+  bool do_setattr = false;
   bool verbose = false;
 
   string marker_dir("nfs_marker");
@@ -343,7 +353,7 @@ TEST(LibRGW, SETUP_DIRS1) {
 	    sf.rgw_fh->create_stat(&st, create_mask);
 
 	    /* open handle */
-	    rc = rgw_open(fs, sf.fh, 0 /* flags */);
+	    rc = rgw_open(fs, sf.fh, 0 /* posix flags */, 0 /* flags */);
 	    ASSERT_EQ(rc, 0);
 	    ASSERT_TRUE(sf.rgw_fh->is_open());
 	    /* stage seq write */
@@ -370,6 +380,104 @@ TEST(LibRGW, SETUP_DIRS1) {
   } /* dirs1 top-level !exist */
 }
 
+TEST(LibRGW, SETATTR) {
+  if (do_dirs1) {
+    if (do_setattr) {
+
+      int rc;
+      struct stat st;
+
+      st.st_uid = owner_uid;
+      st.st_gid = owner_gid;
+      st.st_mode = 755;
+
+      std::string dname{"dir_0"};
+      obj_rec dir{dname, nullptr, dirs1_b.fh, nullptr};
+
+      /* dir_0 MUST exist and MUST be resident */
+      (void) rgw_lookup(fs, dir.parent_fh, dir.name.c_str(), &dir.fh,
+			RGW_LOOKUP_FLAG_NONE);
+
+      ASSERT_NE(dir.fh, nullptr);
+      dir.sync();
+      ASSERT_NE(dir.rgw_fh, nullptr);
+      ASSERT_TRUE(dir.rgw_fh->is_dir());
+
+      /* child file */
+      std::string sfname{"setattr_file_0"};
+      obj_rec sf{sfname, nullptr, dir.fh, nullptr};
+
+      (void) rgw_lookup(fs, sf.parent_fh, sf.name.c_str(), &sf.fh,
+			RGW_LOOKUP_FLAG_NONE);
+
+      if (! sf.fh) {
+	/* make a new file object (the hard way) */
+	rc = rgw_lookup(fs, sf.parent_fh, sf.name.c_str(), &sf.fh,
+			RGW_LOOKUP_FLAG_CREATE);
+	ASSERT_EQ(rc, 0);
+	sf.sync();
+	ASSERT_TRUE(sf.rgw_fh->is_file());
+
+	/* because we made it the hard way, fixup attributes */
+	st.st_uid = owner_uid;
+	st.st_gid = owner_gid;
+	st.st_mode = 644;
+	sf.rgw_fh->create_stat(&st, create_mask);
+
+	/* open handle */
+	rc = rgw_open(fs, sf.fh, 0 /* posix flags */, 0 /* flags */);
+	ASSERT_EQ(rc, 0);
+	ASSERT_TRUE(sf.rgw_fh->is_open());
+	/* stage seq write */
+	size_t nbytes;
+	string data = "data for " + sf.name;
+	rc = rgw_write(fs, sf.fh, 0, data.length(), &nbytes,
+		      (void*) data.c_str(), RGW_WRITE_FLAG_NONE);
+	ASSERT_EQ(rc, 0);
+	ASSERT_EQ(nbytes, data.length());
+	/* commit write transaction */
+	rc = rgw_close(fs, sf.fh, 0 /* flags */);
+	ASSERT_EQ(rc, 0);
+      } else {
+	sf.sync();
+	ASSERT_TRUE(sf.rgw_fh->is_file());
+      }
+
+      /* sf MUST now be materialized--now change it's attributes */
+      st.st_uid = magic_uid;
+      st.st_gid = magic_gid;
+
+      rc = rgw_setattr(fs, sf.fh, &st, create_mask, RGW_SETATTR_FLAG_NONE);
+      ASSERT_EQ(rc, 0);
+
+      /* force evict--subsequent lookups must reload */
+      static_cast<RGWLibFS*>(fs->fs_private)->release_evict(sf.rgw_fh);
+
+      sf.clear();
+
+      /* revalidate -- expect magic uid and gid */
+      (void) rgw_lookup(fs, sf.parent_fh, sf.name.c_str(), &sf.fh,
+			RGW_LOOKUP_FLAG_NONE);
+      sf.sync();
+      ASSERT_NE(sf.fh, nullptr);
+
+      memset(&st, 0, sizeof(struct stat)); /* nothing up my sleeve... */
+
+      rc =  rgw_getattr(fs, sf.fh, &st, RGW_GETATTR_FLAG_NONE);
+      ASSERT_EQ(rc, 0);
+
+      ASSERT_EQ(st.st_uid, magic_uid);
+      ASSERT_EQ(st.st_gid, magic_gid);
+
+      /* release 1 ref on sf */
+      rgw_fh_rele(fs, sf.fh, RGW_FH_RELE_FLAG_NONE);
+
+      /* release 1 ref on dir */
+      rgw_fh_rele(fs, dir.fh, RGW_FH_RELE_FLAG_NONE);
+    } /* dirs1 */
+  }
+}
+
 TEST(LibRGW, RGW_CREATE_DIRS1) {
   /* verify rgw_create (create [empty] file objects the easy way) */
   if (do_dirs1) {
@@ -390,7 +498,7 @@ TEST(LibRGW, RGW_CREATE_DIRS1) {
 			  RGW_LOOKUP_FLAG_NONE);
 	if (! sf.fh) {
 	  rc = rgw_create(fs, sf.parent_fh, sf.name.c_str(), &st, create_mask,
-			  &sf.fh, RGW_CREATE_FLAG_NONE);
+			  &sf.fh, 0 /* posix flags */, RGW_CREATE_FLAG_NONE);
 	  ASSERT_EQ(rc, 0);
 	}
 	sf.sync();
@@ -437,7 +545,7 @@ TEST(LibRGW, RGW_SETUP_RENAME1) {
 			  RGW_LOOKUP_FLAG_NONE);
 	if (! rf.fh) {
 	  rc = rgw_create(fs, rf.parent_fh, rf.name.c_str(), &st, create_mask,
-			  &rf.fh, RGW_CREATE_FLAG_NONE);
+			  &rf.fh, 0 /* posix flags */, RGW_CREATE_FLAG_NONE);
 	  ASSERT_EQ(rc, 0);
 	}
 	rf.sync();
@@ -674,7 +782,7 @@ TEST(LibRGW, WRITEF_DIRS1) {
       fobj.sync();
 
       /* begin write transaction */
-      rc = rgw_open(fs, fobj.fh, 0 /* flags */);
+      rc = rgw_open(fs, fobj.fh, 0 /* posix flags */, 0 /* flags */);
       ASSERT_EQ(rc, 0);
       ASSERT_TRUE(fobj.rgw_fh->is_open());
 
@@ -879,7 +987,7 @@ TEST(LibRGW, MARKER1_SETUP_OBJECTS)
       ASSERT_EQ(ret, 0);
       obj.rgw_fh = get_rgwfh(obj.fh);
       // open object--open transaction
-      ret = rgw_open(fs, obj.fh, RGW_OPEN_FLAG_NONE);
+      ret = rgw_open(fs, obj.fh, 0 /* posix flags */, RGW_OPEN_FLAG_NONE);
       ASSERT_EQ(ret, 0);
       ASSERT_TRUE(obj.rgw_fh->is_open());
       // unstable write data
@@ -1042,6 +1150,9 @@ int main(int argc, char *argv[])
     } else if (ceph_argparse_flag(args, arg_iter, "--marker1",
 					    (char*) nullptr)) {
       do_marker1 = true;
+    } else if (ceph_argparse_flag(args, arg_iter, "--setattr",
+					    (char*) nullptr)) {
+      do_setattr = true;
     } else if (ceph_argparse_flag(args, arg_iter, "--create",
 					    (char*) nullptr)) {
       do_create = true;
diff --git a/src/test/mds/CMakeLists.txt b/src/test/mds/CMakeLists.txt
new file mode 100644
index 0000000..15650e8
--- /dev/null
+++ b/src/test/mds/CMakeLists.txt
@@ -0,0 +1,15 @@
+# unittest_mds_authcap
+add_executable(unittest_mds_authcap EXCLUDE_FROM_ALL
+  TestMDSAuthCaps.cc
+  )
+add_ceph_unittest(unittest_mds_authcap ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mds_authcap)
+target_link_libraries(unittest_mds_authcap mds global ${BLKID_LIBRARIES})
+
+# unittest_mds_sessionfilter
+add_executable(unittest_mds_sessionfilter EXCLUDE_FROM_ALL
+  TestSessionFilter.cc
+  $<TARGET_OBJECTS:common_util_obj>
+  )
+add_ceph_unittest(unittest_mds_sessionfilter ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mds_sessionfilter)
+target_link_libraries(unittest_mds_sessionfilter mds osdc common global ${BLKID_LIBRARIES})
+
diff --git a/src/test/messenger/CMakeLists.txt b/src/test/messenger/CMakeLists.txt
new file mode 100644
index 0000000..8cab601
--- /dev/null
+++ b/src/test/messenger/CMakeLists.txt
@@ -0,0 +1,44 @@
+add_executable(simple_server
+  simple_server.cc
+  simple_dispatcher.cc
+  )
+target_link_libraries(simple_server
+  os global common ${Boost_REGEX_LIBRARY}
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+add_executable(simple_client
+  simple_client.cc
+  simple_dispatcher.cc
+  )
+target_link_libraries(simple_client
+  os global common ${Boost_REGEX_LIBRARY}
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+if(HAVE_XIO)
+  add_executable(xio_server
+    xio_server.cc
+    xio_dispatcher.cc
+    )
+  target_link_libraries(xio_server
+    os global common ${Boost_REGEX_LIBRARY}
+    ${Xio_LIBRARY} ibverbs rdmacm pthread rt
+    ${EXTRALIBS}
+    ${CMAKE_DL_LIBS}
+    )
+
+  add_executable(xio_client
+    xio_client.cc
+    xio_dispatcher.cc
+    )
+  target_link_libraries(xio_client
+    os global common ${Boost_REGEX_LIBRARY}
+    ${Xio_LIBRARY} ibverbs rdmacm pthread rt
+    ${EXTRALIBS}
+    ${CMAKE_DL_LIBS}
+    )
+endif(HAVE_XIO)
+
diff --git a/src/test/messenger/Makefile.am b/src/test/messenger/Makefile.am
index 9fe2416..71a6604 100644
--- a/src/test/messenger/Makefile.am
+++ b/src/test/messenger/Makefile.am
@@ -74,3 +74,5 @@ noinst_PROGRAMS += \
 
 endif # ENABLE_XIO
 endif # ENABLE_SERVER
+
+EXTRA_DIST += test/messenger/CMakeLists.txt
diff --git a/src/test/mon/CMakeLists.txt b/src/test/mon/CMakeLists.txt
new file mode 100644
index 0000000..86d7278
--- /dev/null
+++ b/src/test/mon/CMakeLists.txt
@@ -0,0 +1,50 @@
+# ceph_test_mon_workloadgen
+add_executable(ceph_test_mon_workloadgen
+  test_mon_workloadgen.cc
+  )
+target_link_libraries(ceph_test_mon_workloadgen
+  os
+  osdc
+  global
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_mon_msg
+add_executable(ceph_test_mon_msg 
+  test-mon-msg.cc
+  )
+target_link_libraries(ceph_test_mon_msg os osdc global ${UNITTEST_LIBS})
+set_target_properties(ceph_test_mon_msg PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+#scripts
+add_ceph_test(misc.sh ${CMAKE_CURRENT_SOURCE_DIR}/misc.sh)
+add_ceph_test(mkfs.sh ${CMAKE_CURRENT_SOURCE_DIR}/mkfs.sh)
+add_ceph_test(mon-created-time.sh ${CMAKE_CURRENT_SOURCE_DIR}/mon-created-time.sh)
+add_ceph_test(mon-handle-forward.sh ${CMAKE_CURRENT_SOURCE_DIR}/mon-handle-forward.sh)
+add_ceph_test(mon-ping.sh ${CMAKE_CURRENT_SOURCE_DIR}/mon-ping.sh)
+add_ceph_test(mon-scrub.sh ${CMAKE_CURRENT_SOURCE_DIR}/mon-scrub.sh)
+add_ceph_test(osd-crush.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-crush.sh)
+add_ceph_test(osd-erasure-code-profile.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-erasure-code-profile.sh)
+add_ceph_test(osd-pool-create.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-pool-create.sh)
+
+# unittest_mon_moncap
+add_executable(unittest_mon_moncap EXCLUDE_FROM_ALL
+  moncap.cc
+  )
+add_ceph_unittest(unittest_mon_moncap ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mon_moncap)
+target_link_libraries(unittest_mon_moncap mon global)
+
+# unittest_mon_pgmap
+add_executable(unittest_mon_pgmap EXCLUDE_FROM_ALL
+  PGMap.cc
+  )
+add_ceph_unittest(unittest_mon_pgmap ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mon_pgmap)
+target_link_libraries(unittest_mon_pgmap mon global)
+
+add_executable(unittest_mon_pgmonitor
+  PGMonitor.cc
+  )
+add_ceph_unittest(unittest_mon_pgmonitor ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mon_pgmonitor)
+target_link_libraries(unittest_mon_pgmonitor mon global)
diff --git a/src/test/msgr/CMakeLists.txt b/src/test/msgr/CMakeLists.txt
new file mode 100644
index 0000000..dd2e48d
--- /dev/null
+++ b/src/test/msgr/CMakeLists.txt
@@ -0,0 +1,28 @@
+# ceph_test_async_driver
+add_executable(ceph_test_async_driver
+  test_async_driver.cc
+  )
+set_target_properties(ceph_test_async_driver PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_async_driver os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS})
+
+# ceph_test_msgr
+add_executable(ceph_test_msgr
+  test_msgr.cc
+  )
+set_target_properties(ceph_test_msgr PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_msgr os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS})
+
+#ceph_perf_msgr_server
+add_executable(ceph_perf_msgr_server perf_msgr_server.cc)
+set_target_properties(ceph_perf_msgr_server PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_perf_msgr_server os global ${UNITTEST_LIBS})
+
+#ceph_perf_msgr_client
+add_executable(ceph_perf_msgr_client perf_msgr_client.cc)
+set_target_properties(ceph_perf_msgr_client PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_perf_msgr_client os global ${UNITTEST_LIBS})
+
diff --git a/src/test/msgr/test_msgr.cc b/src/test/msgr/test_msgr.cc
index 65a6a6f..43f1060 100644
--- a/src/test/msgr/test_msgr.cc
+++ b/src/test/msgr/test_msgr.cc
@@ -14,6 +14,7 @@
  *
  */
 
+#include <atomic>
 #include <iostream>
 #include <unistd.h>
 #include <stdlib.h>
@@ -37,6 +38,14 @@
 
 typedef boost::mt11213b gen_type;
 
+#include "common/dout.h"
+#include "include/assert.h"
+
+#define dout_subsys ceph_subsys_ms
+#undef dout_prefix
+#define dout_prefix *_dout << " ceph_test_msgr "
+
+
 #if GTEST_HAS_PARAM_TEST
 
 #define CHECK_AND_WAIT_TRUE(expr) do {  \
@@ -55,7 +64,7 @@ class MessengerTest : public ::testing::TestWithParam<const char*> {
 
   MessengerTest(): server_msgr(NULL), client_msgr(NULL) {}
   virtual void SetUp() {
-    cerr << __func__ << " start set up " << GetParam() << std::endl;
+    lderr(g_ceph_context) << __func__ << " start set up " << GetParam() << dendl;
     server_msgr = Messenger::create(g_ceph_context, string(GetParam()), entity_name_t::OSD(0), "server", getpid());
     client_msgr = Messenger::create(g_ceph_context, string(GetParam()), entity_name_t::CLIENT(-1), "client", getpid());
     server_msgr->set_default_policy(Messenger::Policy::stateless_server(0, 0));
@@ -72,11 +81,10 @@ class MessengerTest : public ::testing::TestWithParam<const char*> {
 class FakeDispatcher : public Dispatcher {
  public:
   struct Session : public RefCountedObject {
-    Mutex lock;
-    uint64_t count;
+    atomic<uint64_t> count;
     ConnectionRef con;
 
-    explicit Session(ConnectionRef c): RefCountedObject(g_ceph_context), lock("FakeDispatcher::Session::lock"), count(0), con(c) {
+    explicit Session(ConnectionRef c): RefCountedObject(g_ceph_context), count(0), con(c) {
     }
     uint64_t get_count() { return count; }
   };
@@ -104,12 +112,12 @@ class FakeDispatcher : public Dispatcher {
 
   void ms_handle_fast_connect(Connection *con) {
     lock.Lock();
-    cerr << __func__ << con << std::endl;
+    lderr(g_ceph_context) << __func__ << con << dendl;
     Session *s = static_cast<Session*>(con->get_priv());
     if (!s) {
       s = new Session(con);
       con->set_priv(s->get());
-      cerr << __func__ << " con: " << con << " count: " << s->count << std::endl;
+      lderr(g_ceph_context) << __func__ << " con: " << con << " count: " << s->count << dendl;
     }
     s->put();
     got_connect = true;
@@ -117,7 +125,6 @@ class FakeDispatcher : public Dispatcher {
     lock.Unlock();
   }
   void ms_handle_fast_accept(Connection *con) {
-    Mutex::Locker l(lock);
     Session *s = static_cast<Session*>(con->get_priv());
     if (!s) {
       s = new Session(con);
@@ -126,19 +133,18 @@ class FakeDispatcher : public Dispatcher {
     s->put();
   }
   bool ms_dispatch(Message *m) {
-    Mutex::Locker l(lock);
     Session *s = static_cast<Session*>(m->get_connection()->get_priv());
     if (!s) {
       s = new Session(m->get_connection());
       m->get_connection()->set_priv(s->get());
     }
     s->put();
-    Mutex::Locker l1(s->lock);
     s->count++;
-    cerr << __func__ << " conn: " << m->get_connection() << " session " << s << " count: " << s->count << std::endl;
+    lderr(g_ceph_context) << __func__ << " conn: " << m->get_connection() << " session " << s << " count: " << s->count << dendl;
     if (is_server) {
       reply_message(m);
     }
+    Mutex::Locker l(lock);
     got_new = true;
     cond.Signal();
     m->put();
@@ -146,7 +152,7 @@ class FakeDispatcher : public Dispatcher {
   }
   bool ms_handle_reset(Connection *con) {
     Mutex::Locker l(lock);
-    cerr << __func__ << con << std::endl;
+    lderr(g_ceph_context) << __func__ << con << dendl;
     Session *s = static_cast<Session*>(con->get_priv());
     if (s) {
       s->con.reset(NULL);  // break con <-> session ref cycle
@@ -157,7 +163,7 @@ class FakeDispatcher : public Dispatcher {
   }
   void ms_handle_remote_reset(Connection *con) {
     Mutex::Locker l(lock);
-    cerr << __func__ << con << std::endl;
+    lderr(g_ceph_context) << __func__ << con << dendl;
     Session *s = static_cast<Session*>(con->get_priv());
     if (s) {
       s->con.reset(NULL);  // break con <-> session ref cycle
@@ -167,16 +173,14 @@ class FakeDispatcher : public Dispatcher {
     got_remote_reset = true;
   }
   void ms_fast_dispatch(Message *m) {
-    Mutex::Locker l(lock);
     Session *s = static_cast<Session*>(m->get_connection()->get_priv());
     if (!s) {
       s = new Session(m->get_connection());
       m->get_connection()->set_priv(s->get());
     }
     s->put();
-    Mutex::Locker l1(s->lock);
     s->count++;
-    cerr << __func__ << " conn: " << m->get_connection() << " session " << s << " count: " << s->count << std::endl;
+    lderr(g_ceph_context) << __func__ << " conn: " << m->get_connection() << " session " << s << " count: " << s->count << dendl;
     if (is_server) {
       if (loopback)
         assert(m->get_source().is_osd());
@@ -185,9 +189,10 @@ class FakeDispatcher : public Dispatcher {
     } else if (loopback) {
       assert(m->get_source().is_client());
     }
+    m->put();
+    Mutex::Locker l(lock);
     got_new = true;
     cond.Signal();
-    m->put();
   }
 
   bool ms_verify_authorizer(Connection *con, int peer_type, int protocol,
@@ -699,6 +704,36 @@ TEST_P(MessengerTest, MessageTest) {
 
 class SyntheticWorkload;
 
+struct Payload {
+  enum Who : uint8_t {
+    PING = 0,
+    PONG = 1,
+  };
+  uint8_t who;
+  uint64_t seq;
+  bufferlist data;
+
+  Payload(Who who, uint64_t seq, const bufferlist& data)
+    : who(who), seq(seq), data(data)
+  {}
+  Payload() = default;
+  void encode(bufferlist& bl) const {
+    ::encode(who, bl);
+    ::encode(seq, bl);
+    ::encode(data, bl);
+  }
+  void decode(bufferlist::iterator& p) {
+    ::decode(who, p);
+    ::decode(seq, p);
+    ::decode(data, p);
+  }
+};
+
+ostream& operator<<(ostream& out, const Payload &pl)
+{
+  return out << "reply=" << pl.who << " i = " << pl.seq;
+}
+
 class SyntheticDispatcher : public Dispatcher {
  public:
   Mutex lock;
@@ -709,7 +744,7 @@ class SyntheticDispatcher : public Dispatcher {
   bool got_connect;
   map<ConnectionRef, list<uint64_t> > conn_sent;
   map<uint64_t, bufferlist> sent;
-  atomic_t index;
+  atomic<uint64_t> index;
   SyntheticWorkload *workload;
 
   SyntheticDispatcher(bool s, SyntheticWorkload *wl):
@@ -753,26 +788,29 @@ class SyntheticDispatcher : public Dispatcher {
       return ;
     }
 
-    Mutex::Locker l(lock);
-    uint64_t i;
-    bool reply;
-    assert(m->get_middle().length());
-    bufferlist::iterator blp = m->get_middle().begin();
-    ::decode(i, blp);
-    ::decode(reply, blp);
-    if (reply) {
-      //cerr << __func__ << " reply=" << reply << " i=" << i << std::endl;
-      reply_message(m, i);
-    } else if (sent.count(i)) {
-      //cerr << __func__ << " reply=" << reply << " i=" << i << std::endl;
-      ASSERT_EQ(conn_sent[m->get_connection()].front(), i);
-      ASSERT_TRUE(m->get_data().contents_equal(sent[i]));
-      conn_sent[m->get_connection()].pop_front();
-      sent.erase(i);
+    Payload pl;
+    auto p = m->get_data().begin();
+    pl.decode(p);
+    if (pl.who == Payload::PING) {
+      lderr(g_ceph_context) << __func__ << " conn=" << m->get_connection() << " " << pl << dendl;
+      reply_message(m, pl);
+      m->put();
+      Mutex::Locker l(lock);
+      got_new = true;
+      cond.Signal();
+    } else {
+      Mutex::Locker l(lock);
+      if (sent.count(pl.seq)) {
+	lderr(g_ceph_context) << __func__ << " conn=" << m->get_connection() << " " << pl << dendl;
+	ASSERT_EQ(conn_sent[m->get_connection()].front(), pl.seq);
+	ASSERT_TRUE(pl.data.contents_equal(sent[pl.seq]));
+	conn_sent[m->get_connection()].pop_front();
+	sent.erase(pl.seq);
+      }
+      m->put();
+      got_new = true;
+      cond.Signal();
     }
-    got_new = true;
-    cond.Signal();
-    m->put();
   }
 
   bool ms_verify_authorizer(Connection *con, int peer_type, int protocol,
@@ -782,35 +820,29 @@ class SyntheticDispatcher : public Dispatcher {
     return true;
   }
 
-  void reply_message(Message *m, uint64_t i) {
+  void reply_message(const Message *m, Payload& pl) {
+    pl.who = Payload::PONG;
     bufferlist bl;
-    ::encode(i, bl);
-    ::encode(false, bl);
+    pl.encode(bl);
     MPing *rm = new MPing();
-    if (m->get_data_len())
-      rm->set_data(m->get_data());
-    if (m->get_middle().length())
-      rm->set_middle(bl);
+    rm->set_data(bl);
     m->get_connection()->send_message(rm);
-    //cerr << __func__ << " conn=" << m->get_connection() << " reply m=" << m << " i=" << i << std::endl;
+    lderr(g_ceph_context) << __func__ << " conn=" << m->get_connection() << " reply m=" << m << " i=" << pl.seq << dendl;
   }
 
-  void send_message_wrap(ConnectionRef con, Message *m) {
-    {
+  void send_message_wrap(ConnectionRef con, const bufferlist& data) {
+    Message *m = new MPing();
+    Payload pl{Payload::PING, index++, data};
+    bufferlist bl;
+    pl.encode(bl);
+    m->set_data(bl);
+    if (!con->get_messenger()->get_default_policy().lossy) {
       Mutex::Locker l(lock);
-      bufferlist bl;
-      uint64_t i = index.read();
-      index.inc();
-      ::encode(i, bl);
-      ::encode(true, bl);
-      m->set_middle(bl);
-      if (!con->get_messenger()->get_default_policy().lossy) {
-        sent[i] = m->get_data();
-        conn_sent[con].push_back(i);
-      }
-      //cerr << __func__ << " conn=" << con.get() << " send m=" << m << " i=" << i << std::endl;
+      sent[pl.seq] = pl.data;
+      conn_sent[con].push_back(pl.seq);
     }
-    ASSERT_EQ(con->send_message(m), 0);
+    lderr(g_ceph_context) << __func__ << " conn=" << con.get() << " send m=" << m << " i=" << pl.seq << dendl;
+    ASSERT_EQ(0, con->send_message(m));
   }
 
   uint64_t get_pending() {
@@ -830,7 +862,7 @@ class SyntheticDispatcher : public Dispatcher {
   void print() {
     for (auto && p : conn_sent) {
       if (!p.second.empty()) {
-        cerr << __func__ << " " << p.first << " wait " << p.second.size() << std::endl;
+        lderr(g_ceph_context) << __func__ << " " << p.first << " wait " << p.second.size() << dendl;
       }
     }
   }
@@ -976,13 +1008,8 @@ class SyntheticWorkload {
       m->set_priority(200);
       conn->send_message(m);
     } else {
-      Message *m = new MPing();
-      bufferlist bl;
       boost::uniform_int<> u(0, rand_data.size()-1);
-      uint64_t index = u(rng);
-      bl = rand_data[index];
-      m->set_data(bl);
-      dispatcher.send_message_wrap(conn, m);
+      dispatcher.send_message_wrap(conn, rand_data[u(rng)]);
     }
   }
 
@@ -1007,12 +1034,9 @@ class SyntheticWorkload {
 
   void print_internal_state(bool detail=false) {
     Mutex::Locker l(lock);
-    cerr << "available_connections: " << available_connections.size()
-         << " inflight messages: " << dispatcher.get_pending() << std::endl;
+    lderr(g_ceph_context) << "available_connections: " << available_connections.size()
+         << " inflight messages: " << dispatcher.get_pending() << dendl;
     if (detail && !available_connections.empty()) {
-      for (auto &&c : available_connections)
-        cerr << "available connection: " << c.first << " ";
-      cerr << std::endl;
       dispatcher.print();
     }
   }
@@ -1063,13 +1087,13 @@ TEST_P(MessengerTest, SyntheticStressTest) {
                              Messenger::Policy::stateful_server(0, 0),
                              Messenger::Policy::lossless_client(0, 0));
   for (int i = 0; i < 100; ++i) {
-    if (!(i % 10)) cerr << "seeding connection " << i << std::endl;
+    if (!(i % 10)) lderr(g_ceph_context) << "seeding connection " << i << dendl;
     test_msg.generate_connection();
   }
   gen_type rng(time(NULL));
   for (int i = 0; i < 5000; ++i) {
     if (!(i % 10)) {
-      cerr << "Op " << i << ": ";
+      lderr(g_ceph_context) << "Op " << i << ": " << dendl;
       test_msg.print_internal_state();
     }
     boost::uniform_int<> true_false(0, 99);
@@ -1092,13 +1116,13 @@ TEST_P(MessengerTest, SyntheticStressTest1) {
                              Messenger::Policy::lossless_peer_reuse(0, 0),
                              Messenger::Policy::lossless_peer_reuse(0, 0));
   for (int i = 0; i < 10; ++i) {
-    if (!(i % 10)) cerr << "seeding connection " << i << std::endl;
+    if (!(i % 10)) lderr(g_ceph_context) << "seeding connection " << i << dendl;
     test_msg.generate_connection();
   }
   gen_type rng(time(NULL));
   for (int i = 0; i < 10000; ++i) {
     if (!(i % 10)) {
-      cerr << "Op " << i << ": ";
+      lderr(g_ceph_context) << "Op " << i << ": " << dendl;
       test_msg.print_internal_state();
     }
     boost::uniform_int<> true_false(0, 99);
@@ -1124,13 +1148,13 @@ TEST_P(MessengerTest, SyntheticInjectTest) {
                              Messenger::Policy::stateful_server(0, 0),
                              Messenger::Policy::lossless_client(0, 0));
   for (int i = 0; i < 100; ++i) {
-    if (!(i % 10)) cerr << "seeding connection " << i << std::endl;
+    if (!(i % 10)) lderr(g_ceph_context) << "seeding connection " << i << dendl;
     test_msg.generate_connection();
   }
   gen_type rng(time(NULL));
   for (int i = 0; i < 1000; ++i) {
     if (!(i % 10)) {
-      cerr << "Op " << i << ": ";
+      lderr(g_ceph_context) << "Op " << i << ": " << dendl;
       test_msg.print_internal_state();
     }
     boost::uniform_int<> true_false(0, 99);
@@ -1157,13 +1181,13 @@ TEST_P(MessengerTest, SyntheticInjectTest2) {
                              Messenger::Policy::lossless_peer_reuse(0, 0),
                              Messenger::Policy::lossless_peer_reuse(0, 0));
   for (int i = 0; i < 100; ++i) {
-    if (!(i % 10)) cerr << "seeding connection " << i << std::endl;
+    if (!(i % 10)) lderr(g_ceph_context) << "seeding connection " << i << dendl;
     test_msg.generate_connection();
   }
   gen_type rng(time(NULL));
   for (int i = 0; i < 1000; ++i) {
     if (!(i % 10)) {
-      cerr << "Op " << i << ": ";
+      lderr(g_ceph_context) << "Op " << i << ": " << dendl;
       test_msg.print_internal_state();
     }
     boost::uniform_int<> true_false(0, 99);
@@ -1190,13 +1214,13 @@ TEST_P(MessengerTest, SyntheticInjectTest3) {
                              Messenger::Policy::stateless_server(0, 0),
                              Messenger::Policy::lossy_client(0, 0));
   for (int i = 0; i < 100; ++i) {
-    if (!(i % 10)) cerr << "seeding connection " << i << std::endl;
+    if (!(i % 10)) lderr(g_ceph_context) << "seeding connection " << i << dendl;
     test_msg.generate_connection();
   }
   gen_type rng(time(NULL));
   for (int i = 0; i < 1000; ++i) {
     if (!(i % 10)) {
-      cerr << "Op " << i << ": ";
+      lderr(g_ceph_context) << "Op " << i << ": " << dendl;
       test_msg.print_internal_state();
     }
     boost::uniform_int<> true_false(0, 99);
@@ -1227,13 +1251,13 @@ TEST_P(MessengerTest, SyntheticInjectTest4) {
                              Messenger::Policy::lossless_peer(0, 0),
                              Messenger::Policy::lossless_peer(0, 0));
   for (int i = 0; i < 100; ++i) {
-    if (!(i % 10)) cerr << "seeding connection " << i << std::endl;
+    if (!(i % 10)) lderr(g_ceph_context) << "seeding connection " << i << dendl;
     test_msg.generate_connection();
   }
   gen_type rng(time(NULL));
   for (int i = 0; i < 1000; ++i) {
     if (!(i % 10)) {
-      cerr << "Op " << i << ": ";
+      lderr(g_ceph_context) << "Op " << i << ": " << dendl;
       test_msg.print_internal_state();
     }
     boost::uniform_int<> true_false(0, 99);
@@ -1276,7 +1300,7 @@ class MarkdownDispatcher : public Dispatcher {
   }
 
   void ms_handle_fast_connect(Connection *con) {
-    cerr << __func__ << con << std::endl;
+    lderr(g_ceph_context) << __func__ << con << dendl;
     Mutex::Locker l(lock);
     conns.insert(con);
   }
@@ -1285,7 +1309,7 @@ class MarkdownDispatcher : public Dispatcher {
     conns.insert(con);
   }
   bool ms_dispatch(Message *m) {
-    cerr << __func__ << " conn: " << m->get_connection() << std::endl;
+    lderr(g_ceph_context) << __func__ << " conn: " << m->get_connection() << dendl;
     Mutex::Locker l(lock);
     count.inc();
     conns.insert(m->get_connection());
@@ -1307,7 +1331,7 @@ class MarkdownDispatcher : public Dispatcher {
     return true;
   }
   bool ms_handle_reset(Connection *con) {
-    cerr << __func__ << con << std::endl;
+    lderr(g_ceph_context) << __func__ << con << dendl;
     Mutex::Locker l(lock);
     conns.erase(con);
     usleep(rand() % 500);
@@ -1316,7 +1340,7 @@ class MarkdownDispatcher : public Dispatcher {
   void ms_handle_remote_reset(Connection *con) {
     Mutex::Locker l(lock);
     conns.erase(con);
-    cerr << __func__ << con << std::endl;
+    lderr(g_ceph_context) << __func__ << con << dendl;
   }
   void ms_fast_dispatch(Message *m) {
     assert(0);
@@ -1360,7 +1384,7 @@ TEST_P(MessengerTest, MarkdownTest) {
     ASSERT_EQ(conn2->send_message(m), 0);
     CHECK_AND_WAIT_TRUE(srv_dispatcher.count.read() > last + 1);
     if (srv_dispatcher.count.read() == last) {
-      cerr << __func__ << " last is " << last << std::endl;
+      lderr(g_ceph_context) << __func__ << " last is " << last << dendl;
       equal = true;
       equal_count++;
     } else {
diff --git a/src/test/objectstore/CMakeLists.txt b/src/test/objectstore/CMakeLists.txt
new file mode 100644
index 0000000..aae937e
--- /dev/null
+++ b/src/test/objectstore/CMakeLists.txt
@@ -0,0 +1,116 @@
+#ceph_perf_objectstore
+add_executable(ceph_perf_objectstore 
+  ObjectStoreTransactionBenchmark.cc
+  )
+set_target_properties(ceph_perf_objectstore PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_perf_objectstore os osdc global ${UNITTEST_LIBS})
+
+#ceph_test_objectstore
+add_executable(ceph_test_objectstore
+  store_test.cc
+  )
+set_target_properties(ceph_test_objectstore PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_objectstore
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+#ceph_test_keyvaluedb
+add_executable(ceph_test_keyvaluedb
+  test_kv.cc
+  )
+set_target_properties(ceph_test_keyvaluedb PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_keyvaluedb
+  os
+  common
+  ${UNITTEST_LIBS}
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_objectstore_workloadgen
+add_executable(ceph_test_objectstore_workloadgen
+  workload_generator.cc
+  TestObjectStoreState.cc
+  )
+target_link_libraries(ceph_test_objectstore_workloadgen
+  os
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_filestore_idempotent
+add_executable(ceph_test_filestore_idempotent
+  test_idempotent.cc
+  FileStoreTracker.cc
+  ${CMAKE_SOURCE_DIR}/src/test/common/ObjectContents.cc
+  )
+target_link_libraries(ceph_test_filestore_idempotent
+  os
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# ceph_test_filestore_idempotent_sequence
+add_executable(ceph_test_filestore_idempotent_sequence
+  test_idempotent_sequence.cc
+  DeterministicOpSequence.cc
+  TestObjectStoreState.cc
+  FileStoreDiff.cc
+  )
+target_link_libraries(ceph_test_filestore_idempotent_sequence
+  os
+  global
+  ${EXTRALIBS}
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  )
+
+# unittest_chain_xattr
+add_executable(unittest_chain_xattr EXCLUDE_FROM_ALL
+  chain_xattr.cc
+  )
+add_ceph_unittest(unittest_chain_xattr ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_chain_xattr)
+target_link_libraries(unittest_chain_xattr os global)
+
+# unittest_rocksdb_option
+add_executable(unittest_rocksdb_option EXCLUDE_FROM_ALL
+  TestRocksdbOptionParse.cc
+  )
+add_ceph_unittest(unittest_rocksdb_option ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_rocksdb_option)
+target_link_libraries(unittest_rocksdb_option global os ${BLKID_LIBRARIES})
+
+# unittest_bluefs
+add_executable(unittest_bluefs EXCLUDE_FROM_ALL 
+  test_bluefs.cc
+  )
+add_ceph_unittest(unittest_bluefs ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_bluefs)
+target_link_libraries(unittest_bluefs os global)
+
+# unittest_bluestore_types
+add_executable(unittest_bluestore_types EXCLUDE_FROM_ALL 
+  test_bluestore_types.cc
+  )
+add_ceph_unittest(unittest_bluestore_types ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_bluestore_types)
+target_link_libraries(unittest_bluestore_types os global)
+  
+# unittest_transaction
+add_executable(unittest_transaction EXCLUDE_FROM_ALL 
+  test_transaction.cc)
+add_ceph_unittest(unittest_transaction ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_transaction)
+target_link_libraries(unittest_transaction os common)
+
diff --git a/src/test/opensuse-13.2/ceph.spec.in b/src/test/opensuse-13.2/ceph.spec.in
index b2e4b12..9ddd75f 100644
--- a/src/test/opensuse-13.2/ceph.spec.in
+++ b/src/test/opensuse-13.2/ceph.spec.in
@@ -33,10 +33,12 @@
 %bcond_with selinux
 %endif
 
-# LTTng-UST enabled on Fedora, RHEL 6+, and SLES 12
-%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version} == 1315
+# LTTng-UST enabled on Fedora, RHEL 6+, and SLE (not openSUSE)
+%if 0%{?fedora} || 0%{?rhel} >= 6 || 0%{?suse_version}
+%if ! 0%{?is_opensuse}
 %bcond_without lttng
 %endif
+%endif
 
 %if %{with selinux}
 # get selinux policy version
@@ -116,6 +118,7 @@ BuildRequires:	python-requests
 BuildRequires:	python-sphinx
 BuildRequires:	python-virtualenv
 BuildRequires:	snappy-devel
+BuildRequires:	udev
 BuildRequires:	util-linux
 BuildRequires:	valgrind-devel
 BuildRequires:	xfsprogs
@@ -878,8 +881,8 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_mandir}/man8/rbd-replay-prep.8*
 %dir %{_datadir}/ceph/
 %{_datadir}/ceph/known_hosts_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com
-%{_datadir}/ceph/id_dsa_drop.ceph.com.pub
+%{_datadir}/ceph/id_rsa_drop.ceph.com
+%{_datadir}/ceph/id_rsa_drop.ceph.com.pub
 %dir %{_sysconfdir}/ceph/
 %config %{_sysconfdir}/bash_completion.d/rados
 %config %{_sysconfdir}/bash_completion.d/rbd
@@ -887,6 +890,7 @@ DISABLE_RESTART_ON_UPDATE="yes"
 %{_unitdir}/rbdmap.service
 %{python_sitelib}/ceph_argparse.py*
 %{python_sitelib}/ceph_daemon.py*
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/50-rbd.rules
 %attr(3770,ceph,ceph) %dir %{_localstatedir}/log/ceph/
 %attr(750,ceph,ceph) %dir %{_localstatedir}/lib/ceph/
@@ -1156,6 +1160,7 @@ fi
 %{_sbindir}/ceph-disk
 %{_sbindir}/ceph-disk-udev
 %{_libexecdir}/ceph/ceph-osd-prestart.sh
+%dir %{_udevrulesdir}
 %{_udevrulesdir}/60-ceph-by-parttypeuuid.rules
 %{_udevrulesdir}/95-ceph-osd.rules
 %{_mandir}/man8/ceph-clsinfo.8*
diff --git a/src/test/os/CMakeLists.txt b/src/test/os/CMakeLists.txt
new file mode 100644
index 0000000..9c3d32d
--- /dev/null
+++ b/src/test/os/CMakeLists.txt
@@ -0,0 +1,7 @@
+# unittest_lfnindex
+add_executable(unittest_lfnindex EXCLUDE_FROM_ALL
+  TestLFNIndex.cc
+  )
+add_ceph_unittest(unittest_lfnindex ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_lfnindex)
+target_link_libraries(unittest_lfnindex os global)
+
diff --git a/src/test/osd/CMakeLists.txt b/src/test/osd/CMakeLists.txt
new file mode 100644
index 0000000..841bab1
--- /dev/null
+++ b/src/test/osd/CMakeLists.txt
@@ -0,0 +1,90 @@
+# test_rados
+add_executable(ceph_test_rados 
+  TestRados.cc
+  TestOpStat.cc
+  Object.cc 
+  RadosModel.cc
+  )
+target_link_libraries(ceph_test_rados
+  librados
+  global
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
+# scripts
+add_ceph_test(osd-bench.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-bench.sh) 
+add_ceph_test(osd-config.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-config.sh)
+add_ceph_test(osd-markdown.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-markdown.sh) 
+add_ceph_test(osd-reactivate.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-reactivate.sh) 
+add_ceph_test(osd-reuse-id.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-reuse-id.sh)
+add_ceph_test(osd-scrub-repair.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-scrub-repair.sh) 
+add_ceph_test(osd-scrub-snaps.sh ${CMAKE_CURRENT_SOURCE_DIR}/osd-scrub-snaps.sh)
+
+#osd-copy-from.sh needs to be run out of ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+add_test(NAME osd-copy-from.sh COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/osd-copy-from.sh WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
+add_dependencies(check osd-copy-from.sh)
+
+set_property(TEST 
+  osd-copy-from.sh
+  PROPERTY ENVIRONMENT 
+  CEPH_ROOT=${CMAKE_SOURCE_DIR}
+  CEPH_BIN=${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
+  CEPH_LIB=${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
+  LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib
+  PATH=$ENV{PATH}:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}:${CMAKE_SOURCE_DIR}/src
+  PYTHONPATH=${CMAKE_SOURCE_DIR}/src/pybind
+  )
+
+
+# unittest_osdmap
+add_executable(unittest_osdmap EXCLUDE_FROM_ALL
+  TestOSDMap.cc
+  )
+add_ceph_unittest(unittest_osdmap ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_osdmap)
+target_link_libraries(unittest_osdmap global ${BLKID_LIBRARIES})
+
+# unittest_osd_types
+add_executable(unittest_osd_types EXCLUDE_FROM_ALL
+  types.cc
+  )
+add_ceph_unittest(unittest_osd_types ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_osd_types)
+target_link_libraries(unittest_osd_types global)
+
+# unittest_ecbackend
+add_executable(unittest_ecbackend EXCLUDE_FROM_ALL
+  TestECBackend.cc
+  )
+add_ceph_unittest(unittest_ecbackend ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_ecbackend)
+target_link_libraries(unittest_ecbackend osd global)
+
+# unittest_osdscrub
+add_executable(unittest_osdscrub EXCLUDE_FROM_ALL
+  TestOSDScrub.cc
+  )
+add_ceph_unittest(unittest_osdscrub ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_osdscrub)
+target_link_libraries(unittest_osdscrub osd global dl os mon ${BLKID_LIBRARIES})
+
+# unittest_pglog
+add_executable(unittest_pglog EXCLUDE_FROM_ALL
+  TestPGLog.cc
+  )
+add_ceph_unittest(unittest_pglog ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_pglog)
+target_link_libraries(unittest_pglog osd global dl ${BLKID_LIBRARIES})
+
+# unittest_hitset
+add_executable(unittest_hitset EXCLUDE_FROM_ALL
+  hitset.cc
+  )
+add_ceph_unittest(unittest_hitset ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_hitset)
+target_link_libraries(unittest_hitset osd global ${BLKID_LIBRARIES})
+
+# unittest_osd_osdcap
+add_executable(unittest_osd_osdcap EXCLUDE_FROM_ALL
+  osdcap.cc
+)
+add_ceph_unittest(unittest_osd_osdcap ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_osd_osdcap)
+target_link_libraries(unittest_osd_osdcap osd global ${BLKID_LIBRARIES})
+
diff --git a/src/test/osd/TestOpStat.cc b/src/test/osd/TestOpStat.cc
index db6a82e..e8045fa 100644
--- a/src/test/osd/TestOpStat.cc
+++ b/src/test/osd/TestOpStat.cc
@@ -34,10 +34,10 @@ void TestOpStat::TypeStatus::export_latencies(map<double,uint64_t> &in) const
   }
 }
   
-std::ostream & operator<<(std::ostream &out, TestOpStat &rhs)
+std::ostream & operator<<(std::ostream &out, const TestOpStat &rhs)
 {
   rhs.stat_lock.Lock();
-  for (map<string,TestOpStat::TypeStatus>::iterator i = rhs.stats.begin();
+  for (auto i = rhs.stats.begin();
        i != rhs.stats.end();
        ++i) {
     map<double,uint64_t> latency;
diff --git a/src/test/osd/TestOpStat.h b/src/test/osd/TestOpStat.h
index 3d70ece..5bf4fc9 100644
--- a/src/test/osd/TestOpStat.h
+++ b/src/test/osd/TestOpStat.h
@@ -10,7 +10,7 @@ class TestOp;
 
 class TestOpStat {
 public:
-  Mutex stat_lock;
+  mutable Mutex stat_lock;
 
   TestOpStat() : stat_lock("TestOpStat lock") {}
     
@@ -45,9 +45,9 @@ public:
 
   void begin(TestOp *in);
   void end(TestOp *in);
-  friend std::ostream & operator<<(std::ostream &, TestOpStat&);
+  friend std::ostream & operator<<(std::ostream &, const TestOpStat &);
 };
 
-std::ostream & operator<<(std::ostream &out, TestOpStat &rhs);
+std::ostream & operator<<(std::ostream &out, const TestOpStat &rhs);
 
 #endif
diff --git a/src/test/osdc/CMakeLists.txt b/src/test/osdc/CMakeLists.txt
new file mode 100644
index 0000000..080e299
--- /dev/null
+++ b/src/test/osdc/CMakeLists.txt
@@ -0,0 +1,12 @@
+add_executable(ceph_test_objectcacher_stress
+  object_cacher_stress.cc
+  FakeWriteback.cc
+  MemWriteback.cc
+  )
+target_link_libraries(ceph_test_objectcacher_stress
+  osdc
+  global
+  ${EXTRALIBS}
+  ${CMAKE_DL_LIBS}
+  )
+
diff --git a/src/test/pybind/CMakeLists.txt b/src/test/pybind/CMakeLists.txt
new file mode 100644
index 0000000..bc91bce
--- /dev/null
+++ b/src/test/pybind/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_ceph_test(test_ceph_daemon.py ${CMAKE_CURRENT_SOURCE_DIR}/test_ceph_daemon.py)
+add_ceph_test(test_ceph_argparse.py ${CMAKE_CURRENT_SOURCE_DIR}/test_ceph_argparse.py)
diff --git a/src/test/rbd_mirror/CMakeLists.txt b/src/test/rbd_mirror/CMakeLists.txt
new file mode 100644
index 0000000..6e059f8
--- /dev/null
+++ b/src/test/rbd_mirror/CMakeLists.txt
@@ -0,0 +1,81 @@
+set(rbd_mirror_test_srcs
+  test_ClusterWatcher.cc
+  test_PoolWatcher.cc
+  test_ImageReplayer.cc
+  test_ImageDeleter.cc
+  test_ImageSync.cc
+  test_fixture.cc
+  )
+add_library(rbd_mirror STATIC ${rbd_mirror_test_srcs})
+set_target_properties(rbd_mirror PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+add_executable(unittest_rbd_mirror EXCLUDE_FROM_ALL
+  test_main.cc
+  test_mock_fixture.cc
+  test_mock_ImageSync.cc
+  test_mock_ImageSyncThrottler.cc
+  image_replayer/test_mock_BootstrapRequest.cc
+  image_replayer/test_mock_CreateImageRequest.cc
+  image_replayer/test_mock_EventPreprocessor.cc
+  image_sync/test_mock_ImageCopyRequest.cc
+  image_sync/test_mock_ObjectCopyRequest.cc
+  image_sync/test_mock_SnapshotCopyRequest.cc
+  image_sync/test_mock_SyncPointCreateRequest.cc
+  image_sync/test_mock_SyncPointPruneRequest.cc
+  ${CMAKE_SOURCE_DIR}/src/common/ContextCompletion.cc
+  )
+add_ceph_unittest(unittest_rbd_mirror ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_rbd_mirror)
+set_target_properties(unittest_rbd_mirror PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(unittest_rbd_mirror
+  rbd_mirror
+  rados_test_stub
+  rbd_mirror_internal
+  rbd_internal
+  rbd_api
+  journal
+  journal_test
+  cls_rbd_client
+  cls_lock_client
+  cls_journal_client
+  rbd_types
+  librados
+  osdc
+  global
+  radostest
+  )
+
+add_executable(ceph_test_rbd_mirror
+  test_main.cc
+  ${CMAKE_SOURCE_DIR}/src/common/ContextCompletion.cc
+  )
+set_target_properties(ceph_test_rbd_mirror PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rbd_mirror
+  rbd_mirror
+  rados_test_stub
+  rbd_mirror_internal
+  rbd_internal
+  rbd_api
+  journal
+  cls_rbd_client
+  cls_lock_client
+  cls_journal_client
+  rbd_types
+  librados
+  osdc
+  global
+  radostest
+  ${UNITTEST_LIBS}
+  )
+
+add_executable(ceph_test_rbd_mirror_random_write
+  random_write.cc
+  $<TARGET_OBJECTS:parse_secret_objs>)
+set_target_properties(ceph_test_rbd_mirror_random_write PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+target_link_libraries(ceph_test_rbd_mirror_random_write
+  librbd librados global keyutils
+  )
+
diff --git a/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc b/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc
index 7d2e37e..c681cbf 100644
--- a/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc
+++ b/src/test/rbd_mirror/image_replayer/test_mock_BootstrapRequest.cc
@@ -5,19 +5,25 @@
 #include "librbd/journal/TypeTraits.h"
 #include "tools/rbd_mirror/ImageSync.h"
 #include "tools/rbd_mirror/ImageSyncThrottler.h"
+#include "tools/rbd_mirror/Threads.h"
 #include "tools/rbd_mirror/image_replayer/BootstrapRequest.h"
 #include "tools/rbd_mirror/image_replayer/CloseImageRequest.h"
 #include "tools/rbd_mirror/image_replayer/CreateImageRequest.h"
 #include "tools/rbd_mirror/image_replayer/OpenImageRequest.h"
 #include "tools/rbd_mirror/image_replayer/OpenLocalImageRequest.h"
 #include "test/journal/mock/MockJournaler.h"
+#include "test/librados_test_stub/MockTestMemIoCtxImpl.h"
 #include "test/librbd/mock/MockImageCtx.h"
+#include "test/librbd/mock/MockJournal.h"
 
 namespace librbd {
 
 namespace {
 
 struct MockTestImageCtx : public librbd::MockImageCtx {
+  MockTestImageCtx(librbd::ImageCtx &image_ctx)
+    : librbd::MockImageCtx(image_ctx) {
+  }
 };
 
 } // anonymous namespace
@@ -90,13 +96,16 @@ namespace image_replayer {
 template<>
 struct CloseImageRequest<librbd::MockTestImageCtx> {
   static CloseImageRequest* s_instance;
+  librbd::MockTestImageCtx **image_ctx = nullptr;
   Context *on_finish = nullptr;
 
   static CloseImageRequest* create(librbd::MockTestImageCtx **image_ctx,
                                    ContextWQ *work_queue, bool destroy_only,
                                    Context *on_finish) {
     assert(s_instance != nullptr);
+    s_instance->image_ctx = image_ctx;
     s_instance->on_finish = on_finish;
+    s_instance->construct(*image_ctx);
     return s_instance;
   }
 
@@ -104,7 +113,11 @@ struct CloseImageRequest<librbd::MockTestImageCtx> {
     assert(s_instance == nullptr);
     s_instance = this;
   }
+  ~CloseImageRequest() {
+    s_instance = nullptr;
+  }
 
+  MOCK_METHOD1(construct, void(librbd::MockTestImageCtx *image_ctx));
   MOCK_METHOD0(send, void());
 };
 
@@ -129,6 +142,9 @@ struct CreateImageRequest<librbd::MockTestImageCtx> {
     assert(s_instance == nullptr);
     s_instance = this;
   }
+  ~CreateImageRequest() {
+    s_instance = nullptr;
+  }
 
   MOCK_METHOD0(send, void());
 };
@@ -136,15 +152,18 @@ struct CreateImageRequest<librbd::MockTestImageCtx> {
 template<>
 struct OpenImageRequest<librbd::MockTestImageCtx> {
   static OpenImageRequest* s_instance;
+  librbd::MockTestImageCtx **image_ctx = nullptr;
   Context *on_finish = nullptr;
 
   static OpenImageRequest* create(librados::IoCtx &io_ctx,
                                   librbd::MockTestImageCtx **image_ctx,
-                                  const std::string &local_image_id,
+                                  const std::string &image_id,
                                   bool read_only, ContextWQ *work_queue,
                                   Context *on_finish) {
     assert(s_instance != nullptr);
+    s_instance->image_ctx = image_ctx;
     s_instance->on_finish = on_finish;
+    s_instance->construct(io_ctx, image_id);
     return s_instance;
   }
 
@@ -152,13 +171,19 @@ struct OpenImageRequest<librbd::MockTestImageCtx> {
     assert(s_instance == nullptr);
     s_instance = this;
   }
+  ~OpenImageRequest() {
+    s_instance = nullptr;
+  }
 
+  MOCK_METHOD2(construct, void(librados::IoCtx &io_ctx,
+                               const std::string &image_id));
   MOCK_METHOD0(send, void());
 };
 
 template<>
 struct OpenLocalImageRequest<librbd::MockTestImageCtx> {
   static OpenLocalImageRequest* s_instance;
+  librbd::MockTestImageCtx **image_ctx = nullptr;
   Context *on_finish = nullptr;
 
   static OpenLocalImageRequest* create(librados::IoCtx &local_io_ctx,
@@ -168,7 +193,9 @@ struct OpenLocalImageRequest<librbd::MockTestImageCtx> {
                                        ContextWQ *work_queue,
                                        Context *on_finish) {
     assert(s_instance != nullptr);
+    s_instance->image_ctx = local_image_ctx;
     s_instance->on_finish = on_finish;
+    s_instance->construct(local_io_ctx, local_image_id);
     return s_instance;
   }
 
@@ -176,7 +203,12 @@ struct OpenLocalImageRequest<librbd::MockTestImageCtx> {
     assert(s_instance == nullptr);
     s_instance = this;
   }
+  ~OpenLocalImageRequest() {
+    s_instance = nullptr;
+  }
 
+  MOCK_METHOD2(construct, void(librados::IoCtx &io_ctx,
+                               const std::string &image_id));
   MOCK_METHOD0(send, void());
 };
 
@@ -201,12 +233,556 @@ namespace rbd {
 namespace mirror {
 namespace image_replayer {
 
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::InSequence;
+using ::testing::Invoke;
+using ::testing::Return;
+using ::testing::SetArgPointee;
+using ::testing::StrEq;
+using ::testing::WithArg;
+
+MATCHER_P(IsSameIoCtx, io_ctx, "") {
+  return &get_mock_io_ctx(arg) == &get_mock_io_ctx(*io_ctx);
+}
+
 class TestMockImageReplayerBootstrapRequest : public TestMockFixture {
 public:
+  typedef ImageSyncThrottlerRef<librbd::MockTestImageCtx> MockImageSyncThrottler;
   typedef BootstrapRequest<librbd::MockTestImageCtx> MockBootstrapRequest;
+  typedef CloseImageRequest<librbd::MockTestImageCtx> MockCloseImageRequest;
+  typedef OpenImageRequest<librbd::MockTestImageCtx> MockOpenImageRequest;
+  typedef OpenLocalImageRequest<librbd::MockTestImageCtx> MockOpenLocalImageRequest;
+  typedef std::list<cls::journal::Tag> Tags;
+
+  void SetUp() {
+    TestMockFixture::SetUp();
+
+    librbd::RBD rbd;
+    ASSERT_EQ(0, create_image(rbd, m_remote_io_ctx, m_image_name, m_image_size));
+    ASSERT_EQ(0, open_image(m_remote_io_ctx, m_image_name, &m_remote_image_ctx));
+  }
+
+  void create_local_image() {
+    librbd::RBD rbd;
+    ASSERT_EQ(0, create_image(rbd, m_local_io_ctx, m_image_name, m_image_size));
+    ASSERT_EQ(0, open_image(m_local_io_ctx, m_image_name, &m_local_image_ctx));
+  }
+
+  void expect_mirror_image_get_image_id(librados::IoCtx &io_ctx,
+                                        const std::string &global_image_id,
+                                        const std::string &image_id, int r) {
+    bufferlist in_bl;
+    ::encode(global_image_id, in_bl);
+
+    bufferlist bl;
+    ::encode(image_id, bl);
+
+    EXPECT_CALL(get_mock_io_ctx(io_ctx),
+                exec(RBD_MIRRORING, _, StrEq("rbd"),
+                     StrEq("mirror_image_get_image_id"), ContentsEqual(in_bl),
+                     _, _))
+      .WillOnce(DoAll(WithArg<5>(Invoke([bl](bufferlist *out_bl) {
+                                   *out_bl = bl;
+                                 })),
+                Return(r)));
+  }
+
+  void expect_journaler_get_client(::journal::MockJournaler &mock_journaler,
+                                   const std::string &client_id,
+                                   cls::journal::Client &client, int r) {
+    EXPECT_CALL(mock_journaler, get_client(StrEq(client_id), _, _))
+      .WillOnce(DoAll(WithArg<1>(Invoke([client](cls::journal::Client *out_client) {
+                                          *out_client = client;
+                                        })),
+                      WithArg<2>(Invoke([this, r](Context *on_finish) {
+                                          m_threads->work_queue->queue(on_finish, r);
+                                        }))));
+  }
+
+  void expect_journaler_get_tags(::journal::MockJournaler &mock_journaler,
+                                 uint64_t tag_class, const Tags& tags,
+                                 int r) {
+    EXPECT_CALL(mock_journaler, get_tags(tag_class, _, _))
+      .WillOnce(DoAll(WithArg<1>(Invoke([tags](Tags *out_tags) {
+                                          *out_tags = tags;
+                                        })),
+                      WithArg<2>(Invoke([this, r](Context *on_finish) {
+                                          m_threads->work_queue->queue(on_finish, r);
+                                        }))));
+  }
+
+  void expect_journaler_update_client(::journal::MockJournaler &mock_journaler,
+                                      const librbd::journal::ClientData &client_data,
+                                      int r) {
+    bufferlist bl;
+    ::encode(client_data, bl);
+
+    EXPECT_CALL(mock_journaler, update_client(ContentsEqual(bl), _))
+      .WillOnce(WithArg<1>(Invoke([this, r](Context *on_finish) {
+                                    m_threads->work_queue->queue(on_finish, r);
+                                  })));
+  }
+
+  void expect_open_image(MockOpenImageRequest &mock_open_image_request,
+                         librados::IoCtx &io_ctx, const std::string &image_id,
+                         librbd::MockTestImageCtx &mock_image_ctx, int r) {
+    EXPECT_CALL(mock_open_image_request, construct(IsSameIoCtx(&io_ctx), image_id));
+    EXPECT_CALL(mock_open_image_request, send())
+      .WillOnce(Invoke([this, &mock_open_image_request, &mock_image_ctx, r]() {
+          *mock_open_image_request.image_ctx = &mock_image_ctx;
+          m_threads->work_queue->queue(mock_open_image_request.on_finish, r);
+        }));
+  }
+
+  void expect_open_local_image(MockOpenLocalImageRequest &mock_open_local_image_request,
+                               librados::IoCtx &io_ctx, const std::string &image_id,
+                               librbd::MockTestImageCtx &mock_image_ctx, int r) {
+    EXPECT_CALL(mock_open_local_image_request,
+                construct(IsSameIoCtx(&io_ctx), image_id));
+    EXPECT_CALL(mock_open_local_image_request, send())
+      .WillOnce(Invoke([this, &mock_open_local_image_request, &mock_image_ctx, r]() {
+          *mock_open_local_image_request.image_ctx = &mock_image_ctx;
+          m_threads->work_queue->queue(mock_open_local_image_request.on_finish,
+                                       r);
+        }));
+  }
+
+  void expect_close_image(MockCloseImageRequest &mock_close_image_request,
+                          librbd::MockTestImageCtx &mock_image_ctx, int r) {
+    EXPECT_CALL(mock_close_image_request, construct(&mock_image_ctx));
+    EXPECT_CALL(mock_close_image_request, send())
+      .WillOnce(Invoke([this, &mock_close_image_request, r]() {
+          *mock_close_image_request.image_ctx = nullptr;
+          m_threads->work_queue->queue(mock_close_image_request.on_finish, r);
+        }));
+  }
+
+  void expect_journal_is_tag_owner(librbd::MockJournal &mock_journal,
+                                   bool is_owner, int r) {
+    EXPECT_CALL(mock_journal, is_tag_owner(_))
+      .WillOnce(DoAll(SetArgPointee<0>(is_owner),
+                      Return(r)));
+  }
+
+  void expect_journal_get_tag_tid(librbd::MockJournal &mock_journal,
+                                  uint64_t tag_tid) {
+    EXPECT_CALL(mock_journal, get_tag_tid()).WillOnce(Return(tag_tid));
+  }
+
+  void expect_journal_get_tag_data(librbd::MockJournal &mock_journal,
+                                   const librbd::journal::TagData &tag_data) {
+    EXPECT_CALL(mock_journal, get_tag_data()).WillOnce(Return(tag_data));
+  }
+
+  bufferlist encode_tag_data(const librbd::journal::TagData &tag_data) {
+    bufferlist bl;
+    ::encode(tag_data, bl);
+    return bl;
+  }
+
+  MockBootstrapRequest *create_request(MockImageSyncThrottler mock_image_sync_throttler,
+                                       ::journal::MockJournaler &mock_journaler,
+                                       const std::string &remote_image_id,
+                                       const std::string &global_image_id,
+                                       const std::string &local_mirror_uuid,
+                                       const std::string &remote_mirror_uuid,
+                                       Context *on_finish) {
+    return new MockBootstrapRequest(m_local_io_ctx,
+                                    m_remote_io_ctx,
+                                    mock_image_sync_throttler,
+                                    &m_local_test_image_ctx,
+                                    "local image name",
+                                    remote_image_id,
+                                    global_image_id,
+                                    m_threads->work_queue,
+                                    m_threads->timer,
+                                    &m_threads->timer_lock,
+                                    local_mirror_uuid,
+                                    remote_mirror_uuid,
+                                    &mock_journaler,
+                                    &m_mirror_peer_client_meta,
+                                    on_finish);
+  }
+
+  librbd::ImageCtx *m_remote_image_ctx;
+  librbd::ImageCtx *m_local_image_ctx = nullptr;
+  librbd::MockTestImageCtx *m_local_test_image_ctx = nullptr;
+  librbd::journal::MirrorPeerClientMeta m_mirror_peer_client_meta;
 
 };
 
+TEST_F(TestMockImageReplayerBootstrapRequest, NonPrimaryRemoteSyncingState) {
+  create_local_image();
+
+  InSequence seq;
+
+  // look up local image by global image id
+  librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
+  expect_mirror_image_get_image_id(m_local_io_ctx, "global image id",
+                                   mock_local_image_ctx.id, 0);
+
+  // lookup remote image tag class
+  cls::journal::Client client;
+  librbd::journal::ClientData client_data{
+    librbd::journal::ImageClientMeta{123}};
+  ::encode(client_data, client.data);
+  ::journal::MockJournaler mock_journaler;
+  expect_journaler_get_client(mock_journaler,
+                              librbd::Journal<>::IMAGE_CLIENT_ID,
+                              client, 0);
+
+  // lookup local peer in remote journal
+  librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
+    mock_local_image_ctx.id};
+  mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_SYNCING;
+  client_data.client_meta = mirror_peer_client_meta;
+  client.data.clear();
+  ::encode(client_data, client.data);
+  expect_journaler_get_client(mock_journaler, "local mirror uuid",
+                              client, 0);
+
+  // open the remote image
+  librbd::MockJournal mock_journal;
+  librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
+  MockOpenImageRequest mock_open_image_request;
+  expect_open_image(mock_open_image_request, m_remote_io_ctx,
+                    mock_remote_image_ctx.id, mock_remote_image_ctx, 0);
+  expect_journal_is_tag_owner(mock_journal, false, 0);
+
+  // switch the state to replaying
+  mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+  client_data.client_meta = mirror_peer_client_meta;
+  expect_journaler_update_client(mock_journaler, client_data, 0);
+
+  MockCloseImageRequest mock_close_image_request;
+  expect_close_image(mock_close_image_request, mock_remote_image_ctx, 0);
+
+  C_SaferCond ctx;
+  MockImageSyncThrottler mock_image_sync_throttler(
+    new ImageSyncThrottler<librbd::MockTestImageCtx>());
+  MockBootstrapRequest *request = create_request(
+    mock_image_sync_throttler, mock_journaler, mock_remote_image_ctx.id,
+    "global image id", "local mirror uuid", "remote mirror uuid",
+    &ctx);
+  request->send();
+  ASSERT_EQ(-EREMOTEIO, ctx.wait());
+}
+
+TEST_F(TestMockImageReplayerBootstrapRequest, RemoteDemotePromote) {
+  create_local_image();
+
+  InSequence seq;
+
+  // look up local image by global image id
+  librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
+  expect_mirror_image_get_image_id(m_local_io_ctx, "global image id",
+                                   mock_local_image_ctx.id, 0);
+
+  // lookup remote image tag class
+  cls::journal::Client client;
+  librbd::journal::ClientData client_data{
+    librbd::journal::ImageClientMeta{123}};
+  ::encode(client_data, client.data);
+  ::journal::MockJournaler mock_journaler;
+  expect_journaler_get_client(mock_journaler,
+                              librbd::Journal<>::IMAGE_CLIENT_ID,
+                              client, 0);
+
+  // lookup local peer in remote journal
+  librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
+    mock_local_image_ctx.id};
+  mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+  client_data.client_meta = mirror_peer_client_meta;
+  client.data.clear();
+  ::encode(client_data, client.data);
+  expect_journaler_get_client(mock_journaler, "local mirror uuid",
+                              client, 0);
+
+  // open the remote image
+  librbd::MockJournal mock_journal;
+  librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
+  MockOpenImageRequest mock_open_image_request;
+  expect_open_image(mock_open_image_request, m_remote_io_ctx,
+                    mock_remote_image_ctx.id, mock_remote_image_ctx, 0);
+  expect_journal_is_tag_owner(mock_journal, true, 0);
+
+  // open the local image
+  mock_local_image_ctx.journal = &mock_journal;
+  MockOpenLocalImageRequest mock_open_local_image_request;
+  expect_open_local_image(mock_open_local_image_request, m_local_io_ctx,
+                          mock_local_image_ctx.id, mock_local_image_ctx, 0);
+
+  // remote demotion / promotion event
+  Tags tags = {
+    {2, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 1, 99})},
+    {3, 123, encode_tag_data({librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 2, 1})},
+    {4, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              true, 2, 1})},
+    {5, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              true, 4, 369})}
+  };
+  expect_journaler_get_tags(mock_journaler, 123, tags, 0);
+  expect_journal_get_tag_tid(mock_journal, 345);
+  expect_journal_get_tag_data(mock_journal, {"remote mirror uuid"});
+
+  MockCloseImageRequest mock_close_image_request;
+  expect_close_image(mock_close_image_request, mock_remote_image_ctx, 0);
+
+  C_SaferCond ctx;
+  MockImageSyncThrottler mock_image_sync_throttler(
+    new ImageSyncThrottler<librbd::MockTestImageCtx>());
+  MockBootstrapRequest *request = create_request(
+    mock_image_sync_throttler, mock_journaler, mock_remote_image_ctx.id,
+    "global image id", "local mirror uuid", "remote mirror uuid",
+    &ctx);
+  request->send();
+  ASSERT_EQ(0, ctx.wait());
+}
+
+TEST_F(TestMockImageReplayerBootstrapRequest, MultipleRemoteDemotePromotes) {
+  create_local_image();
+
+  InSequence seq;
+
+  // look up local image by global image id
+  librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
+  expect_mirror_image_get_image_id(m_local_io_ctx, "global image id",
+                                   mock_local_image_ctx.id, 0);
+
+  // lookup remote image tag class
+  cls::journal::Client client;
+  librbd::journal::ClientData client_data{
+    librbd::journal::ImageClientMeta{123}};
+  ::encode(client_data, client.data);
+  ::journal::MockJournaler mock_journaler;
+  expect_journaler_get_client(mock_journaler,
+                              librbd::Journal<>::IMAGE_CLIENT_ID,
+                              client, 0);
+
+  // lookup local peer in remote journal
+  librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
+    mock_local_image_ctx.id};
+  mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+  client_data.client_meta = mirror_peer_client_meta;
+  client.data.clear();
+  ::encode(client_data, client.data);
+  expect_journaler_get_client(mock_journaler, "local mirror uuid",
+                              client, 0);
+
+  // open the remote image
+  librbd::MockJournal mock_journal;
+  librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
+  MockOpenImageRequest mock_open_image_request;
+  expect_open_image(mock_open_image_request, m_remote_io_ctx,
+                    mock_remote_image_ctx.id, mock_remote_image_ctx, 0);
+  expect_journal_is_tag_owner(mock_journal, true, 0);
+
+  // open the local image
+  mock_local_image_ctx.journal = &mock_journal;
+  MockOpenLocalImageRequest mock_open_local_image_request;
+  expect_open_local_image(mock_open_local_image_request, m_local_io_ctx,
+                          mock_local_image_ctx.id, mock_local_image_ctx, 0);
+
+  // remote demotion / promotion event
+  Tags tags = {
+    {2, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 1, 99})},
+    {3, 123, encode_tag_data({librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 2, 1})},
+    {4, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              true, 3, 1})},
+    {5, 123, encode_tag_data({librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 4, 1})},
+    {6, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              true, 5, 1})},
+    {7, 123, encode_tag_data({librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 6, 1})},
+    {8, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              true, 7, 1})}
+  };
+  expect_journaler_get_tags(mock_journaler, 123, tags, 0);
+  expect_journal_get_tag_tid(mock_journal, 345);
+  expect_journal_get_tag_data(mock_journal, {librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                                             "remote mirror uuid", true, 4, 1});
+
+  MockCloseImageRequest mock_close_image_request;
+  expect_close_image(mock_close_image_request, mock_remote_image_ctx, 0);
+
+  C_SaferCond ctx;
+  MockImageSyncThrottler mock_image_sync_throttler(
+    new ImageSyncThrottler<librbd::MockTestImageCtx>());
+  MockBootstrapRequest *request = create_request(
+    mock_image_sync_throttler, mock_journaler, mock_remote_image_ctx.id,
+    "global image id", "local mirror uuid", "remote mirror uuid",
+    &ctx);
+  request->send();
+  ASSERT_EQ(0, ctx.wait());
+}
+
+TEST_F(TestMockImageReplayerBootstrapRequest, LocalDemoteRemotePromote) {
+  create_local_image();
+
+  InSequence seq;
+
+  // look up local image by global image id
+  librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
+  expect_mirror_image_get_image_id(m_local_io_ctx, "global image id",
+                                   mock_local_image_ctx.id, 0);
+
+  // lookup remote image tag class
+  cls::journal::Client client;
+  librbd::journal::ClientData client_data{
+    librbd::journal::ImageClientMeta{123}};
+  ::encode(client_data, client.data);
+  ::journal::MockJournaler mock_journaler;
+  expect_journaler_get_client(mock_journaler,
+                              librbd::Journal<>::IMAGE_CLIENT_ID,
+                              client, 0);
+
+  // lookup local peer in remote journal
+  librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
+    mock_local_image_ctx.id};
+  mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+  client_data.client_meta = mirror_peer_client_meta;
+  client.data.clear();
+  ::encode(client_data, client.data);
+  expect_journaler_get_client(mock_journaler, "local mirror uuid",
+                              client, 0);
+
+  // open the remote image
+  librbd::MockJournal mock_journal;
+  librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
+  MockOpenImageRequest mock_open_image_request;
+  expect_open_image(mock_open_image_request, m_remote_io_ctx,
+                    mock_remote_image_ctx.id, mock_remote_image_ctx, 0);
+  expect_journal_is_tag_owner(mock_journal, true, 0);
+
+  // open the local image
+  mock_local_image_ctx.journal = &mock_journal;
+  MockOpenLocalImageRequest mock_open_local_image_request;
+  expect_open_local_image(mock_open_local_image_request, m_local_io_ctx,
+                          mock_local_image_ctx.id, mock_local_image_ctx, 0);
+
+  // remote demotion / promotion event
+  Tags tags = {
+    {2, 123, encode_tag_data({"local mirror uuid", "local mirror uuid",
+                              true, 344, 99})},
+    {3, 123, encode_tag_data({librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              "local mirror uuid", true, 345, 1})},
+    {4, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              true, 3, 1})}
+  };
+  expect_journaler_get_tags(mock_journaler, 123, tags, 0);
+  expect_journal_get_tag_tid(mock_journal, 346);
+  expect_journal_get_tag_data(mock_journal,
+                              {librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                               librbd::Journal<>::LOCAL_MIRROR_UUID,
+                               true, 345, 1});
+
+  MockCloseImageRequest mock_close_image_request;
+  expect_close_image(mock_close_image_request, mock_remote_image_ctx, 0);
+
+  C_SaferCond ctx;
+  MockImageSyncThrottler mock_image_sync_throttler(
+    new ImageSyncThrottler<librbd::MockTestImageCtx>());
+  MockBootstrapRequest *request = create_request(
+    mock_image_sync_throttler, mock_journaler, mock_remote_image_ctx.id,
+    "global image id", "local mirror uuid", "remote mirror uuid",
+    &ctx);
+  request->send();
+  ASSERT_EQ(0, ctx.wait());
+}
+
+TEST_F(TestMockImageReplayerBootstrapRequest, SplitBrainForcePromote) {
+  create_local_image();
+
+  InSequence seq;
+
+  // look up local image by global image id
+  librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
+  expect_mirror_image_get_image_id(m_local_io_ctx, "global image id",
+                                   mock_local_image_ctx.id, 0);
+
+  // lookup remote image tag class
+  cls::journal::Client client;
+  librbd::journal::ClientData client_data{
+    librbd::journal::ImageClientMeta{123}};
+  ::encode(client_data, client.data);
+  ::journal::MockJournaler mock_journaler;
+  expect_journaler_get_client(mock_journaler,
+                              librbd::Journal<>::IMAGE_CLIENT_ID,
+                              client, 0);
+
+  // lookup local peer in remote journal
+  librbd::journal::MirrorPeerClientMeta mirror_peer_client_meta{
+    mock_local_image_ctx.id};
+  mirror_peer_client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+  client_data.client_meta = mirror_peer_client_meta;
+  client.data.clear();
+  ::encode(client_data, client.data);
+  expect_journaler_get_client(mock_journaler, "local mirror uuid",
+                              client, 0);
+
+  // open the remote image
+  librbd::MockJournal mock_journal;
+  librbd::MockTestImageCtx mock_remote_image_ctx(*m_remote_image_ctx);
+  MockOpenImageRequest mock_open_image_request;
+  expect_open_image(mock_open_image_request, m_remote_io_ctx,
+                    mock_remote_image_ctx.id, mock_remote_image_ctx, 0);
+  expect_journal_is_tag_owner(mock_journal, true, 0);
+
+  // open the local image
+  mock_local_image_ctx.journal = &mock_journal;
+  MockOpenLocalImageRequest mock_open_local_image_request;
+  expect_open_local_image(mock_open_local_image_request, m_local_io_ctx,
+                          mock_local_image_ctx.id, mock_local_image_ctx, 0);
+
+  // remote demotion / promotion event
+  Tags tags = {
+    {2, 123, encode_tag_data({librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 1, 99})},
+    {3, 123, encode_tag_data({librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                              librbd::Journal<>::LOCAL_MIRROR_UUID,
+                              true, 2, 1})}
+  };
+  expect_journaler_get_tags(mock_journaler, 123, tags, 0);
+  expect_journal_get_tag_tid(mock_journal, 345);
+  expect_journal_get_tag_data(mock_journal, {librbd::Journal<>::LOCAL_MIRROR_UUID,
+                                             librbd::Journal<>::ORPHAN_MIRROR_UUID,
+                                             true, 344, 0});
+
+  MockCloseImageRequest mock_close_image_request;
+  expect_close_image(mock_close_image_request, mock_local_image_ctx, 0);
+  expect_close_image(mock_close_image_request, mock_remote_image_ctx, 0);
+
+  C_SaferCond ctx;
+  MockImageSyncThrottler mock_image_sync_throttler(
+    new ImageSyncThrottler<librbd::MockTestImageCtx>());
+  MockBootstrapRequest *request = create_request(
+    mock_image_sync_throttler, mock_journaler, mock_remote_image_ctx.id,
+    "global image id", "local mirror uuid", "remote mirror uuid",
+    &ctx);
+  request->send();
+  ASSERT_EQ(-EEXIST, ctx.wait());
+  ASSERT_EQ(NULL, m_local_test_image_ctx);
+}
+
 } // namespace image_replayer
 } // namespace mirror
 } // namespace rbd
diff --git a/src/test/rbd_mirror/test_ImageDeleter.cc b/src/test/rbd_mirror/test_ImageDeleter.cc
index d96b624..5480316 100644
--- a/src/test/rbd_mirror/test_ImageDeleter.cc
+++ b/src/test/rbd_mirror/test_ImageDeleter.cc
@@ -102,7 +102,7 @@ public:
       promote_image();
     }
     NoOpProgressContext ctx;
-    int r = remove(m_local_io_ctx, m_image_name.c_str(), ctx, force);
+    int r = remove(m_local_io_ctx, m_image_name, "", ctx, force);
     EXPECT_EQ(1, r == 0 || r == -ENOENT);
   }
 
@@ -216,7 +216,8 @@ TEST_F(TestImageDeleter, Delete_NonPrimary_Image) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -232,7 +233,8 @@ TEST_F(TestImageDeleter, Fail_Delete_Primary_Image) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(-rbd::mirror::ImageDeleter::EISPRM, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -247,7 +249,8 @@ TEST_F(TestImageDeleter, Fail_Delete_Diff_GlobalId) {
       m_image_name, "diff global id");
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, "diff global id",
+                                         &ctx);
   EXPECT_EQ(-EINVAL, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -261,7 +264,8 @@ TEST_F(TestImageDeleter, Delete_Image_With_Child) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -276,7 +280,8 @@ TEST_F(TestImageDeleter, Delete_Image_With_Children) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -290,7 +295,8 @@ TEST_F(TestImageDeleter, Delete_Image_With_ProtectedChild) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -305,7 +311,8 @@ TEST_F(TestImageDeleter, Delete_Image_With_ProtectedChildren) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -319,7 +326,8 @@ TEST_F(TestImageDeleter, Delete_Image_With_Clone) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(-EBUSY, ctx.wait());
 
   ASSERT_EQ(1u, m_deleter->get_delete_queue_items().size());
@@ -329,11 +337,13 @@ TEST_F(TestImageDeleter, Delete_Image_With_Clone) {
       "clone1", GLOBAL_CLONE_IMAGE_ID);
 
   C_SaferCond ctx2;
-  m_deleter->wait_for_scheduled_deletion("clone1", &ctx2);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_CLONE_IMAGE_ID,
+                                         &ctx2);
   EXPECT_EQ(0, ctx2.wait());
 
   C_SaferCond ctx3;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx3);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx3);
   EXPECT_EQ(0, ctx3.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -352,7 +362,8 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -376,7 +387,8 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image_With_MirroringState) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(0, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -392,7 +404,8 @@ TEST_F(TestImageDeleter, Delete_NonExistent_Image_Without_MirroringState) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(-ENOENT, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -410,7 +423,8 @@ TEST_F(TestImageDeleter, Fail_Delete_NonPrimary_Image) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(-EBUSY, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -430,13 +444,15 @@ TEST_F(TestImageDeleter, Retry_Failed_Deletes) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(-EBUSY, ctx.wait());
 
   EXPECT_EQ(0, ictx->state->close());
 
   C_SaferCond ctx2;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx2);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx2);
   EXPECT_EQ(0, ctx2.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
@@ -454,7 +470,8 @@ TEST_F(TestImageDeleter, Delete_Is_Idempotent) {
       m_image_name, GLOBAL_IMAGE_ID);
 
   C_SaferCond ctx;
-  m_deleter->wait_for_scheduled_deletion(m_image_name, &ctx);
+  m_deleter->wait_for_scheduled_deletion(m_local_pool_id, GLOBAL_IMAGE_ID,
+                                         &ctx);
   EXPECT_EQ(-EBUSY, ctx.wait());
 
   ASSERT_EQ(0u, m_deleter->get_delete_queue_items().size());
diff --git a/src/test/rbd_mirror/test_ImageReplayer.cc b/src/test/rbd_mirror/test_ImageReplayer.cc
index d3002b0..38b0b41 100644
--- a/src/test/rbd_mirror/test_ImageReplayer.cc
+++ b/src/test/rbd_mirror/test_ImageReplayer.cc
@@ -233,6 +233,9 @@ public:
     std::set<cls::journal::Client>::const_iterator c;
     for (c = registered_clients.begin(); c != registered_clients.end(); c++) {
       std::cout << __func__ << ": client: " << *c << std::endl;
+      if (c->state != cls::journal::CLIENT_STATE_CONNECTED) {
+	continue;
+      }
       cls::journal::ObjectPositions object_positions =
 	c->commit_position.object_positions;
       cls::journal::ObjectPositions::const_iterator p =
@@ -578,7 +581,7 @@ TEST_F(TestImageReplayer, Resync)
 
   C_SaferCond delete_ctx;
   m_image_deleter->wait_for_scheduled_deletion(
-    m_replayer->get_local_image_name(), &delete_ctx);
+    m_local_ioctx.get_id(), m_replayer->get_global_image_id(), &delete_ctx);
   EXPECT_EQ(0, delete_ctx.wait());
 
   C_SaferCond cond;
@@ -643,7 +646,7 @@ TEST_F(TestImageReplayer, Resync_While_Stop)
 
   C_SaferCond delete_ctx;
   m_image_deleter->wait_for_scheduled_deletion(
-    m_replayer->get_local_image_name(), &delete_ctx);
+    m_local_ioctx.get_id(), m_replayer->get_global_image_id(), &delete_ctx);
   EXPECT_EQ(0, delete_ctx.wait());
 
   C_SaferCond cond3;
@@ -684,7 +687,7 @@ TEST_F(TestImageReplayer, Resync_StartInterrupted)
 
   C_SaferCond delete_ctx;
   m_image_deleter->wait_for_scheduled_deletion(
-    m_replayer->get_local_image_name(), &delete_ctx);
+    m_local_ioctx.get_id(), m_replayer->get_global_image_id(), &delete_ctx);
   EXPECT_EQ(0, delete_ctx.wait());
 
   C_SaferCond cond2;
@@ -822,3 +825,91 @@ TEST_F(TestImageReplayer, MultipleReplayFailures_MultiEpoch) {
   close_image(ictx);
 }
 
+TEST_F(TestImageReplayer, Disconnect)
+{
+  bootstrap();
+
+  // Make sure rbd_mirroring_resync_after_disconnect is not set
+  EXPECT_EQ(0, m_local_cluster->conf_set("rbd_mirroring_resync_after_disconnect", "false"));
+
+  // Test start fails if disconnected
+
+  librbd::ImageCtx *ictx;
+
+  generate_test_data();
+  open_remote_image(&ictx);
+  for (int i = 0; i < TEST_IO_COUNT; ++i) {
+    write_test_data(ictx, m_test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
+  }
+  flush(ictx);
+  close_image(ictx);
+
+  std::string oid = ::journal::Journaler::header_oid(m_remote_image_id);
+  ASSERT_EQ(0, cls::journal::client::client_update_state(m_remote_ioctx, oid,
+	m_local_mirror_uuid, cls::journal::CLIENT_STATE_DISCONNECTED));
+
+  C_SaferCond cond1;
+  m_replayer->start(&cond1);
+  ASSERT_EQ(-ENOTCONN, cond1.wait());
+
+  // Test start succeeds after resync
+
+  open_local_image(&ictx);
+  librbd::Journal<>::request_resync(ictx);
+  close_image(ictx);
+  C_SaferCond cond2;
+  m_replayer->start(&cond2);
+  ASSERT_EQ(-ENOTCONN, cond2.wait());
+  C_SaferCond delete_cond;
+  m_image_deleter->wait_for_scheduled_deletion(
+    m_local_ioctx.get_id(), m_replayer->get_global_image_id(), &delete_cond);
+  EXPECT_EQ(0, delete_cond.wait());
+
+  start();
+  wait_for_replay_complete();
+
+  // Test replay stopped after disconnect
+
+  open_remote_image(&ictx);
+  for (int i = TEST_IO_COUNT; i < 2 * TEST_IO_COUNT; ++i) {
+    write_test_data(ictx, m_test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
+  }
+  flush(ictx);
+  close_image(ictx);
+
+  ASSERT_EQ(0, cls::journal::client::client_update_state(m_remote_ioctx, oid,
+	m_local_mirror_uuid, cls::journal::CLIENT_STATE_DISCONNECTED));
+  bufferlist bl;
+  ASSERT_EQ(0, m_remote_ioctx.notify2(oid, bl, 5000, NULL));
+
+  wait_for_stopped();
+
+  // Test start fails after disconnect
+
+  C_SaferCond cond3;
+  m_replayer->start(&cond3);
+  ASSERT_EQ(-ENOTCONN, cond3.wait());
+  C_SaferCond cond4;
+  m_replayer->start(&cond4);
+  ASSERT_EQ(-ENOTCONN, cond4.wait());
+
+  // Test automatic resync if rbd_mirroring_resync_after_disconnect is set
+
+  EXPECT_EQ(0, m_local_cluster->conf_set("rbd_mirroring_resync_after_disconnect", "true"));
+
+  // Resync is flagged on first start attempt
+  C_SaferCond cond5;
+  m_replayer->start(&cond5);
+  ASSERT_EQ(-ENOTCONN, cond5.wait());
+  C_SaferCond delete_cond1;
+  m_image_deleter->wait_for_scheduled_deletion(
+    m_local_ioctx.get_id(), m_replayer->get_global_image_id(), &delete_cond1);
+  EXPECT_EQ(0, delete_cond1.wait());
+
+  C_SaferCond cond6;
+  m_replayer->start(&cond6);
+  ASSERT_EQ(0, cond6.wait());
+  wait_for_replay_complete();
+
+  stop();
+}
diff --git a/src/test/rbd_mirror/test_mock_ImageReplayer.cc b/src/test/rbd_mirror/test_mock_ImageReplayer.cc
index 5f651af..2477e03 100644
--- a/src/test/rbd_mirror/test_mock_ImageReplayer.cc
+++ b/src/test/rbd_mirror/test_mock_ImageReplayer.cc
@@ -168,7 +168,6 @@ ReplayStatusFormatter<librbd::MockTestImageCtx>* ReplayStatusFormatter<librbd::M
 
 // template definitions
 #include "tools/rbd_mirror/ImageReplayer.cc"
-template class rbd::mirror::ImageReplayer<librbd::MockTestImageCtx>;
 
 namespace rbd {
 namespace mirror {
diff --git a/src/test/rbd_mirror/test_mock_ImageSyncThrottler.cc b/src/test/rbd_mirror/test_mock_ImageSyncThrottler.cc
index e624ed9..772a49e 100644
--- a/src/test/rbd_mirror/test_mock_ImageSyncThrottler.cc
+++ b/src/test/rbd_mirror/test_mock_ImageSyncThrottler.cc
@@ -101,7 +101,6 @@ std::vector<MockImageSync *> MockImageSync::instances;
 
 // template definitions
 #include "tools/rbd_mirror/ImageSyncThrottler.cc"
-template class rbd::mirror::ImageSyncThrottler<librbd::MockTestImageCtx>;
 
 namespace rbd {
 namespace mirror {
diff --git a/src/test/rbd_mirror/test_mock_fixture.h b/src/test/rbd_mirror/test_mock_fixture.h
index 5ce1a74..0952f9c 100644
--- a/src/test/rbd_mirror/test_mock_fixture.h
+++ b/src/test/rbd_mirror/test_mock_fixture.h
@@ -23,6 +23,12 @@ ACTION_P(CompleteContext, r) {
   arg0->complete(r);
 }
 
+MATCHER_P(ContentsEqual, bl, "") {
+  // TODO fix const-correctness of bufferlist
+  return const_cast<bufferlist &>(arg).contents_equal(
+    const_cast<bufferlist &>(bl));
+}
+
 namespace rbd {
 namespace mirror {
 
diff --git a/src/test/rgw/CMakeLists.txt b/src/test/rgw/CMakeLists.txt
new file mode 100644
index 0000000..d47db62
--- /dev/null
+++ b/src/test/rgw/CMakeLists.txt
@@ -0,0 +1,62 @@
+#unitttest_rgw_period_history
+add_executable(unittest_rgw_period_history EXCLUDE_FROM_ALL test_rgw_period_history.cc)
+add_ceph_unittest(unittest_rgw_period_history ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_rgw_period_history)
+target_link_libraries(unittest_rgw_period_history rgw_a)
+
+# ceph_test_rgw_manifest
+set(test_rgw_manifest_srcs test_rgw_manifest.cc)
+add_executable(ceph_test_rgw_manifest
+  ${test_rgw_manifest_srcs}
+  )
+target_link_libraries(ceph_test_rgw_manifest
+  rgw_a
+  cls_rgw_client
+  cls_lock_client
+  cls_refcount_client
+  cls_log_client
+  cls_statelog_client
+  cls_timeindex_client
+  cls_version_client
+  cls_replica_log_client
+  cls_kvs
+  cls_user_client
+  librados
+  global
+  curl
+  expat
+  ${BLKID_LIBRARIES}
+  ${CMAKE_DL_LIBS}
+  ${UNITTEST_LIBS}
+  ${CRYPTO_LIBS}
+  )
+set_target_properties(ceph_test_rgw_manifest PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
+# ceph_test_rgw_obj
+set(test_rgw_obj_srcs test_rgw_obj.cc)
+add_executable(ceph_test_rgw_obj
+  ${test_rgw_obj_srcs}
+  )
+target_link_libraries(ceph_test_rgw_obj
+  rgw_a
+  cls_rgw_client
+  cls_lock_client
+  cls_refcount_client
+  cls_log_client
+  cls_statelog_client
+  cls_version_client
+  cls_replica_log_client
+  cls_kvs
+  cls_user_client
+  librados
+  global
+  curl
+  uuid
+  expat
+  ${CMAKE_DL_LIBS}
+  ${UNITTEST_LIBS}
+  ${CRYPTO_LIBS}
+  )
+set_target_properties(ceph_test_rgw_obj PROPERTIES COMPILE_FLAGS
+  ${UNITTEST_CXX_FLAGS})
+
diff --git a/src/test/system/CMakeLists.txt b/src/test/system/CMakeLists.txt
new file mode 100644
index 0000000..bd3a45b
--- /dev/null
+++ b/src/test/system/CMakeLists.txt
@@ -0,0 +1,57 @@
+## System tests
+
+set(libsystest_srcs 
+  cross_process_sem.cc
+  systest_runnable.cc
+  systest_settings.cc
+  st_rados_create_pool.cc
+  st_rados_delete_pool.cc
+  st_rados_list_objects.cc
+  st_rados_watch.cc
+  st_rados_notify.cc)
+add_library(systest STATIC ${libsystest_srcs})
+
+# test_rados_list_parallel
+add_executable(test_rados_list_parallel
+  rados_list_parallel.cc
+  )
+target_link_libraries(test_rados_list_parallel librados systest global pthread
+  rt ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
+# test_rados_open_pools_parallel
+set(test_rados_open_pools_parallel_srcs 
+  rados_open_pools_parallel.cc)
+add_executable(test_rados_open_pools_parallel
+  ${test_rados_open_pools_parallel_srcs}
+  )
+target_link_libraries(test_rados_open_pools_parallel librados systest global
+  pthread rt ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
+# test_rados_delete_pools_parallel
+set(test_rados_delete_pools_parallel_srcs
+  rados_delete_pools_parallel.cc
+  st_rados_create_pool.cc
+  st_rados_delete_pool.cc
+  st_rados_list_objects.cc
+  )
+add_executable(test_rados_delete_pools_parallel
+  ${test_rados_delete_pools_parallel_srcs}
+  )
+target_link_libraries(test_rados_delete_pools_parallel librados systest global
+  pthread rt ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
+# test_rados_watch_notify
+set(test_rados_watch_notify_srcs
+  rados_watch_notify.cc
+  st_rados_create_pool.cc
+  st_rados_delete_pool.cc
+  st_rados_delete_objs.cc
+  st_rados_watch.cc
+  st_rados_notify.cc
+  )
+add_executable(test_rados_watch_notify
+  ${test_rados_watch_notify_srcs}
+  )
+target_link_libraries(test_rados_watch_notify librados systest global
+  pthread rt ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS}) 
+
diff --git a/src/tools/Makefile-server.am b/src/tools/Makefile-server.am
index cbdb715..da9513b 100644
--- a/src/tools/Makefile-server.am
+++ b/src/tools/Makefile-server.am
@@ -18,7 +18,11 @@ endif
 
 if WITH_OSD
 
-ceph_objectstore_tool_SOURCES = tools/ceph_objectstore_tool.cc tools/RadosDump.cc
+ceph_objectstore_tool_SOURCES = \
+	tools/ceph_objectstore_tool.cc \
+	tools/rebuild_mondb.cc \
+	tools/rebuild_mondb.h \
+	tools/RadosDump.cc
 ceph_objectstore_tool_LDADD = $(LIBOSD) $(LIBOS) $(CEPH_GLOBAL) $(BOOST_PROGRAM_OPTIONS_LIBS)
 if LINUX
 ceph_objectstore_tool_LDADD += -ldl
diff --git a/src/tools/ceph_monstore_tool.cc b/src/tools/ceph_monstore_tool.cc
index f9b4696..75fb95b 100644
--- a/src/tools/ceph_monstore_tool.cc
+++ b/src/tools/ceph_monstore_tool.cc
@@ -20,8 +20,11 @@
 #include "common/Formatter.h"
 #include "common/errno.h"
 
+#include "auth/KeyRing.h"
+#include "auth/cephx/CephxKeyServer.h"
 #include "global/global_init.h"
 #include "include/stringify.h"
+#include "mon/AuthMonitor.h"
 #include "mon/MonitorDBStore.h"
 #include "mon/Paxos.h"
 #include "mon/MonMap.h"
@@ -217,6 +220,8 @@ void usage(const char *n, po::options_description &d)
   << "                                  (rewrite-crush -- --help for more info)\n"
   << "  inflate-pgmap [-- options]      add given number of pgmaps to store\n"
   << "                                  (inflate-pgmap -- --help for more info)\n"
+  << "  rebuild                         rebuild store\n"
+  << "                                  (rebuild -- --help for more info)\n"
   << std::endl;
   std::cerr << d << std::endl;
   std::cerr
@@ -267,7 +272,7 @@ int update_osdmap(MonitorDBStore& store, version_t ver, bool copy,
     OSDMap::Incremental inc(bl);
     if (inc.crush.length()) {
       inc.crush.clear();
-      crush->encode(inc.crush);
+      crush->encode(inc.crush, CEPH_FEATURES_SUPPORTED_DEFAULT);
     }
     if (inc.fullmap.length()) {
       OSDMap fullmap;
@@ -509,6 +514,193 @@ int inflate_pgmap(MonitorDBStore& st, unsigned n, bool can_be_trimmed) {
   return 0;
 }
 
+static int update_auth(MonitorDBStore& st, const string& keyring_path)
+{
+  // import all keyrings stored in the keyring file
+  KeyRing keyring;
+  int r = keyring.load(g_ceph_context, keyring_path);
+  if (r < 0) {
+    cerr << "unable to load admin keyring: " << keyring_path << std::endl;
+    return r;
+  }
+
+  bufferlist bl;
+  __u8 v = 1;
+  ::encode(v, bl);
+
+  for (const auto& k : keyring.get_keys()) {
+    KeyServerData::Incremental auth_inc;
+    auth_inc.name = k.first;
+    auth_inc.auth = k.second;
+    if (auth_inc.auth.caps.empty()) {
+      cerr << "no caps granted to: " << auth_inc.name << std::endl;
+      return -EINVAL;
+    }
+    auth_inc.op = KeyServerData::AUTH_INC_ADD;
+
+    AuthMonitor::Incremental inc;
+    inc.inc_type = AuthMonitor::AUTH_DATA;
+    ::encode(auth_inc, inc.auth_data);
+    inc.auth_type = CEPH_AUTH_CEPHX;
+
+    inc.encode(bl, CEPH_FEATURES_ALL);
+  }
+
+  const string prefix("auth");
+  auto last_committed = st.get(prefix, "last_committed") + 1;
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  t->put(prefix, last_committed, bl);
+  t->put(prefix, "last_committed", last_committed);
+  auto first_committed = st.get(prefix, "first_committed");
+  if (!first_committed) {
+    t->put(prefix, "first_committed", last_committed);
+  }
+  st.apply_transaction(t);
+  return 0;
+}
+
+static int update_mkfs(MonitorDBStore& st)
+{
+  MonMap monmap;
+  int r = monmap.build_initial(g_ceph_context, cerr);
+  if (r) {
+    cerr << "no initial monitors" << std::endl;
+    return -EINVAL;
+  }
+  bufferlist bl;
+  monmap.encode(bl, CEPH_FEATURES_ALL);
+  monmap.set_epoch(0);
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  t->put("mkfs", "monmap", bl);
+  st.apply_transaction(t);
+  return 0;
+}
+
+static int update_monitor(MonitorDBStore& st)
+{
+  const string prefix("monitor");
+  // a stripped-down Monitor::mkfs()
+  bufferlist bl;
+  bl.append(CEPH_MON_ONDISK_MAGIC "\n");
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  t->put(prefix, "magic", bl);
+  st.apply_transaction(t);
+  return 0;
+}
+
+static int update_paxos(MonitorDBStore& st)
+{
+  // build a pending paxos proposal from all non-permanent k/v pairs. once the
+  // proposal is committed, it will gets applied. on the sync provider side, it
+  // will be a no-op, but on its peers, the paxos commit will help to build up
+  // the necessary epochs.
+  bufferlist pending_proposal;
+  {
+    MonitorDBStore::Transaction t;
+    vector<string> prefixes = {"auth", "osdmap",
+			       "pgmap", "pgmap_pg", "pgmap_meta"};
+    for (const auto& prefix : prefixes) {
+      for (auto i = st.get_iterator(prefix); i->valid(); i->next()) {
+	auto key = i->raw_key();
+	auto val = i->value();
+	t.put(key.first, key.second, val);
+      }
+    }
+    t.encode(pending_proposal);
+  }
+  const string prefix("paxos");
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  t->put(prefix, "first_committed", 0);
+  t->put(prefix, "last_committed", 0);
+  auto pending_v = 1;
+  t->put(prefix, pending_v, pending_proposal);
+  t->put(prefix, "pending_v", pending_v);
+  t->put(prefix, "pending_pn", 400);
+  st.apply_transaction(t);
+  return 0;
+}
+
+// rebuild
+//  - pgmap_meta/version
+//  - pgmap_meta/last_osdmap_epoch
+//  - pgmap_meta/last_pg_scan
+//  - pgmap_meta/full_ratio
+//  - pgmap_meta/nearfull_ratio
+//  - pgmap_meta/stamp
+static int update_pgmap_meta(MonitorDBStore& st)
+{
+  const string prefix("pgmap_meta");
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  // stolen from PGMonitor::create_pending()
+  // the first pgmap_meta
+  t->put(prefix, "version", 1);
+  {
+    auto stamp = ceph_clock_now(g_ceph_context);
+    bufferlist bl;
+    ::encode(stamp, bl);
+    t->put(prefix, "stamp", bl);
+  }
+  {
+    auto last_osdmap_epoch = st.get("osdmap", "last_committed");
+    t->put(prefix, "last_osdmap_epoch", last_osdmap_epoch);
+  }
+  // be conservative, so PGMonitor will scan the all pools for pg changes
+  t->put(prefix, "last_pg_scan", 1);
+  {
+    auto full_ratio = g_ceph_context->_conf->mon_osd_full_ratio;
+    if (full_ratio > 1.0)
+      full_ratio /= 100.0;
+    bufferlist bl;
+    ::encode(full_ratio, bl);
+    t->put(prefix, "full_ratio", bl);
+  }
+  {
+    auto nearfull_ratio = g_ceph_context->_conf->mon_osd_nearfull_ratio;
+    if (nearfull_ratio > 1.0)
+      nearfull_ratio /= 100.0;
+    bufferlist bl;
+    ::encode(nearfull_ratio, bl);
+    t->put(prefix, "nearfull_ratio", bl);
+  }
+  st.apply_transaction(t);
+  return 0;
+}
+
+int rebuild_monstore(const char* progname,
+		     vector<string>& subcmds,
+		     MonitorDBStore& st)
+{
+  po::options_description op_desc("Allowed 'rebuild' options");
+  string keyring_path;
+  op_desc.add_options()
+    ("keyring", po::value<string>(&keyring_path),
+     "path to the client.admin key");
+  po::variables_map op_vm;
+  int r = parse_cmd_args(&op_desc, nullptr, nullptr, subcmds, &op_vm);
+  if (r) {
+    return -r;
+  }
+  if (op_vm.count("help")) {
+    usage(progname, op_desc);
+    return 0;
+  }
+  if (!keyring_path.empty())
+    update_auth(st, keyring_path);
+  if ((r = update_pgmap_meta(st))) {
+    return r;
+  }
+  if ((r = update_paxos(st))) {
+    return r;
+  }
+  if ((r = update_mkfs(st))) {
+    return r;
+  }
+  if ((r = update_monitor(st))) {
+    return r;
+  }
+  return 0;
+}
+
 int main(int argc, char **argv) {
   int err = 0;
   po::options_description desc("Allowed options");
@@ -697,9 +889,11 @@ int main(int argc, char **argv) {
     } else if (map_type == "crushmap") {
       bufferlist tmp;
       r = st.get("osdmap", st.combine_strings("full", v), tmp);
-      OSDMap osdmap;
-      osdmap.decode(tmp);
-      osdmap.crush->encode(bl);
+      if (r >= 0) {
+        OSDMap osdmap;
+        osdmap.decode(tmp);
+        osdmap.crush->encode(bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
+      }
     } else {
       r = st.get(map_type, v, bl);
     }
@@ -1094,6 +1288,8 @@ int main(int argc, char **argv) {
       goto done;
     }
     err = inflate_pgmap(st, n, can_be_trimmed);
+  } else if (cmd == "rebuild") {
+    err = rebuild_monstore(argv[0], subcmds, st);
   } else {
     std::cerr << "Unrecognized command: " << cmd << std::endl;
     usage(argv[0], desc);
diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc
index 74348bc..f3714a6 100644
--- a/src/tools/ceph_objectstore_tool.cc
+++ b/src/tools/ceph_objectstore_tool.cc
@@ -26,6 +26,7 @@
 
 #include "os/ObjectStore.h"
 #include "os/filestore/FileJournal.h"
+#include "os/filestore/FileStore.h"
 #ifdef HAVE_LIBFUSE
 #include "os/FuseStore.h"
 #endif
@@ -37,6 +38,7 @@
 #include "json_spirit/json_spirit_value.h"
 #include "json_spirit/json_spirit_reader.h"
 
+#include "rebuild_mondb.h"
 #include "ceph_objectstore_tool.h"
 #include "include/compat.h"
 
@@ -2202,9 +2204,74 @@ int mydump_journal(Formatter *f, string journalpath, bool m_journal_dio)
   return r;
 }
 
+int apply_layout_settings(ObjectStore *os, const OSDSuperblock &superblock,
+			  const string &pool_name, const spg_t &pgid, bool dry_run)
+{
+  int r = 0;
+
+  FileStore *fs = dynamic_cast<FileStore*>(os);
+  if (!fs) {
+    cerr << "Nothing to do for non-filestore backend" << std::endl;
+    return 0; // making this return success makes testing easier
+  }
+
+  OSDMap curmap;
+  bufferlist bl;
+  r = get_osdmap(os, superblock.current_epoch, curmap, bl);
+  if (r) {
+    cerr << "Can't find local OSDMap: " << cpp_strerror(r) << std::endl;
+    return r;
+  }
+
+  int64_t poolid = -1;
+  if (pool_name.length()) {
+    poolid = curmap.lookup_pg_pool_name(pool_name);
+    if (poolid < 0) {
+      cerr << "Couldn't find pool " << pool_name << ": " << cpp_strerror(poolid)
+	   << std::endl;
+      return poolid;
+    }
+  }
+
+  vector<coll_t> collections, filtered_colls;
+  r = os->list_collections(collections);
+  if (r < 0) {
+    cerr << "Error listing collections: " << cpp_strerror(r) << std::endl;
+    return r;
+  }
+
+  for (auto const &coll : collections) {
+    spg_t coll_pgid;
+    if (coll.is_pg(&coll_pgid) &&
+	((poolid >= 0 && coll_pgid.pool() == (uint64_t)poolid) ||
+	 coll_pgid == pgid)) {
+      filtered_colls.push_back(coll);
+    }
+  }
+
+  size_t done = 0, total = filtered_colls.size();
+  for (auto const &coll : filtered_colls) {
+    if (dry_run) {
+      cerr << "Would apply layout settings to " << coll << std::endl;
+    } else {
+      cerr << "Finished " << done << "/" << total << " collections" << "\r";
+      r = fs->apply_layout_settings(coll);
+      if (r < 0) {
+	cerr << "Error applying layout settings to " << coll << std::endl;
+	return r;
+      }
+    }
+    ++done;
+  }
+
+  cerr << "Finished " << total << "/" << total << " collections" << "\r" << std::endl;
+  return r;
+}
+
 int main(int argc, char **argv)
 {
-  string dpath, jpath, pgidstr, op, file, mountpoint, object, objcmd, arg1, arg2, type, format;
+  string dpath, jpath, pgidstr, op, file, mountpoint, mon_store_path, object;
+  string objcmd, arg1, arg2, type, format, pool;
   spg_t pgid;
   unsigned epoch = 0;
   ghobject_t ghobj;
@@ -2223,14 +2290,18 @@ int main(int argc, char **argv)
     ("journal-path", po::value<string>(&jpath),
      "path to journal, mandatory for filestore type")
     ("pgid", po::value<string>(&pgidstr),
-     "PG id, mandatory for info, log, remove, export, rm-past-intervals, mark-complete")
+     "PG id, mandatory for info, log, remove, export, rm-past-intervals, mark-complete, and mandatory for apply-layout-settings if --pool is not specified")
+    ("pool", po::value<string>(&pool),
+     "Pool name, mandatory for apply-layout-settings if --pgid is not specified")
     ("op", po::value<string>(&op),
      "Arg is one of [info, log, remove, mkfs, fsck, fuse, export, import, list, fix-lost, list-pgs, rm-past-intervals, dump-journal, dump-super, meta-list, "
-	 "get-osdmap, set-osdmap, get-inc-osdmap, set-inc-osdmap, mark-complete]")
+     "get-osdmap, set-osdmap, get-inc-osdmap, set-inc-osdmap, mark-complete, apply-layout-settings, update-mon-db]")
     ("epoch", po::value<unsigned>(&epoch),
      "epoch# for get-osdmap and get-inc-osdmap, the current epoch in use if not specified")
     ("file", po::value<string>(&file),
      "path of file to export, import, get-osdmap, set-osdmap, get-inc-osdmap or set-inc-osdmap")
+    ("mon-store-path", po::value<string>(&mon_store_path),
+     "path of monstore to update-mon-db")
     ("mountpoint", po::value<string>(&mountpoint),
      "fuse mountpoint")
     ("format", po::value<string>(&format)->default_value("json-pretty"),
@@ -2296,7 +2367,8 @@ int main(int argc, char **argv)
     flags |= SKIP_JOURNAL_REPLAY;
   if (vm.count("skip-mount-omap"))
     flags |= SKIP_MOUNT_OMAP;
-
+  if (op == "update-mon-db")
+    flags |= SKIP_JOURNAL_REPLAY;
   head = (vm.count("head") > 0);
 
   vector<const char *> ceph_options;
@@ -2347,6 +2419,12 @@ int main(int argc, char **argv)
     usage(desc);
     myexit(1);
   }
+  if (op == "apply-layout-settings" && !(vm.count("pool") ^ vm.count("pgid"))) {
+    cerr << "apply-layout-settings requires either --pool or --pgid"
+	 << std::endl;
+    usage(desc);
+    myexit(1);
+  }
   if (op != "list" && vm.count("object") && !vm.count("objcmd")) {
     cerr << "Invalid syntax, missing command" << std::endl;
     usage(desc);
@@ -2539,6 +2617,11 @@ int main(int argc, char **argv)
     goto out;
   }
 
+  if (op == "apply-layout-settings") {
+    ret = apply_layout_settings(fs, superblock, pool, pgid, dry_run);
+    goto out;
+  }
+
   if (op != "list" && vm.count("object")) {
     // Special case: Create pgmeta_oid if empty string specified
     // This can't conflict with any actual object names.
@@ -2726,6 +2809,13 @@ int main(int argc, char **argv)
       ret = set_inc_osdmap(fs, epoch, bl, force, *osr);
     }
     goto out;
+  } else if (op == "update-mon-db") {
+    if (!vm.count("mon-store-path")) {
+      cerr << "Please specify the path to monitor db to update" << std::endl;
+    } else {
+      ret = update_mon_db(*fs, superblock, dpath + "/keyring", mon_store_path);
+    }
+    goto out;
   }
 
   log_oid = OSD::make_pg_log_oid(pgid);
diff --git a/src/tools/crushtool.cc b/src/tools/crushtool.cc
index b1f5aaa..03ff4da 100644
--- a/src/tools/crushtool.cc
+++ b/src/tools/crushtool.cc
@@ -879,7 +879,7 @@ int main(int argc, const char **argv)
       cout << me << " successfully built or modified map.  Use '-o <file>' to write it out." << std::endl;
     } else {
       bufferlist bl;
-      crush.encode(bl);
+      crush.encode(bl, CEPH_FEATURES_SUPPORTED_DEFAULT);
       int r = bl.write_file(outfn.c_str());
       if (r < 0) {
 	cerr << me << ": error writing '" << outfn << "': " << cpp_strerror(r) << std::endl;
diff --git a/src/tools/osdmaptool.cc b/src/tools/osdmaptool.cc
index 810f82a..c5dfcc6 100644
--- a/src/tools/osdmaptool.cc
+++ b/src/tools/osdmaptool.cc
@@ -269,7 +269,7 @@ int main(int argc, const char **argv)
 
   if (!export_crush.empty()) {
     bufferlist cbl;
-    osdmap.crush->encode(cbl);
+    osdmap.crush->encode(cbl, CEPH_FEATURES_SUPPORTED_DEFAULT);
     r = cbl.write_file(export_crush.c_str());
     if (r < 0) {
       cerr << me << ": error writing crush map to " << import_crush << std::endl;
diff --git a/src/tools/rbd/action/BenchWrite.cc b/src/tools/rbd/action/BenchWrite.cc
index c124f30..c012708 100644
--- a/src/tools/rbd/action/BenchWrite.cc
+++ b/src/tools/rbd/action/BenchWrite.cc
@@ -118,6 +118,14 @@ int do_bench_write(librbd::Image& image, uint64_t io_size,
                    uint64_t io_threads, uint64_t io_bytes,
                    bool random)
 {
+  uint64_t size = 0;
+  image.size(&size);
+  if (io_size > size) {
+    std::cerr << "rbd: io-size " << prettybyte_t(io_size) << " "
+              << "larger than image size " << prettybyte_t(size) << std::endl;
+    return -EINVAL;
+  }
+
   rbd_bencher b(&image);
 
   std::cout << "bench-write "
@@ -138,9 +146,6 @@ int do_bench_write(librbd::Image& image, uint64_t io_size,
   utime_t last;
   unsigned ios = 0;
 
-  uint64_t size = 0;
-  image.size(&size);
-
   vector<uint64_t> thread_offset;
   uint64_t i;
   uint64_t start_pos;
diff --git a/src/tools/rbd/action/Journal.cc b/src/tools/rbd/action/Journal.cc
index ca2620a..cf8ec55 100644
--- a/src/tools/rbd/action/Journal.cc
+++ b/src/tools/rbd/action/Journal.cc
@@ -168,6 +168,66 @@ static int do_reset_journal(librados::IoCtx& io_ctx,
   return 0;
 }
 
+static int do_disconnect_journal_client(librados::IoCtx& io_ctx,
+					const std::string& journal_id,
+					const std::string& client_id)
+{
+  int r;
+
+  C_SaferCond cond;
+  uint64_t minimum_set;
+  uint64_t active_set;
+  std::set<cls::journal::Client> registered_clients;
+  std::string oid = ::journal::Journaler::header_oid(journal_id);
+
+  cls::journal::client::get_mutable_metadata(io_ctx, oid, &minimum_set,
+                                            &active_set, &registered_clients,
+                                            &cond);
+  r = cond.wait();
+  if (r < 0) {
+    std::cerr << "warning: failed to get journal metadata" << std::endl;
+    return r;
+  }
+
+  static const std::string IMAGE_CLIENT_ID("");
+
+  bool found = false;
+  for (auto &c : registered_clients) {
+    if (c.id == IMAGE_CLIENT_ID || (!client_id.empty() && client_id != c.id)) {
+      continue;
+    }
+    r = cls::journal::client::client_update_state(io_ctx, oid, c.id,
+				  cls::journal::CLIENT_STATE_DISCONNECTED);
+    if (r < 0) {
+      std::cerr << "warning: failed to disconnect client " << c.id << ": "
+		<< cpp_strerror(r) << std::endl;
+      return r;
+    }
+    std::cout << "client " << c.id << " disconnected" << std::endl;
+    found = true;
+  }
+
+  if (!found) {
+    if (!client_id.empty()) {
+      std::cerr << "warning: client " << client_id << " is not registered"
+		<< std::endl;
+    } else {
+      std::cerr << "no registered clients to disconnect" << std::endl;
+    }
+    return -ENOENT;
+  }
+
+  bufferlist bl;
+  r = io_ctx.notify2(oid, bl, 5000, NULL);
+  if (r < 0) {
+    std::cerr << "warning: failed to notify state change:" << ": "
+	      << cpp_strerror(r) << std::endl;
+    return r;
+  }
+
+  return 0;
+}
+
 class Journaler : public ::journal::Journaler {
 public:
   Journaler(librados::IoCtx& io_ctx, const std::string& journal_id,
@@ -843,6 +903,45 @@ int execute_reset(const po::variables_map &vm) {
   return 0;
 }
 
+void get_client_disconnect_arguments(po::options_description *positional,
+				     po::options_description *options) {
+  at::add_journal_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+  options->add_options()
+    ("client-id", po::value<std::string>(),
+     "client ID (or leave unspecified to disconnect all)");
+}
+
+int execute_client_disconnect(const po::variables_map &vm) {
+  size_t arg_index = 0;
+  std::string pool_name;
+  std::string journal_name;
+  int r = utils::get_pool_journal_names(vm, at::ARGUMENT_MODIFIER_NONE,
+					&arg_index, &pool_name, &journal_name);
+  if (r < 0) {
+    return r;
+  }
+
+  std::string client_id;
+  if (vm.count("client-id")) {
+    client_id = vm["client-id"].as<std::string>();
+  }
+
+  librados::Rados rados;
+  librados::IoCtx io_ctx;
+  r = utils::init(pool_name, &rados, &io_ctx);
+  if (r < 0) {
+    return r;
+  }
+
+  r = do_disconnect_journal_client(io_ctx, journal_name, client_id);
+  if (r < 0) {
+    std::cerr << "rbd: journal client disconnect: " << cpp_strerror(r)
+	      << std::endl;
+    return r;
+  }
+  return 0;
+}
+
 void get_inspect_arguments(po::options_description *positional,
 			   po::options_description *options) {
   at::add_journal_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
@@ -981,6 +1080,11 @@ Shell::Action action_import(
   {"journal", "import"}, {}, "Import image journal.", "",
   &get_import_arguments, &execute_import);
 
+Shell::Action action_disconnect(
+  {"journal", "client", "disconnect"}, {},
+  "Flag image journal client as disconnected.", "",
+  &get_client_disconnect_arguments, &execute_client_disconnect);
+
 } // namespace journal
 } // namespace action
 } // namespace rbd
diff --git a/src/tools/rbd/action/Kernel.cc b/src/tools/rbd/action/Kernel.cc
index f8fc413..a829c8b 100644
--- a/src/tools/rbd/action/Kernel.cc
+++ b/src/tools/rbd/action/Kernel.cc
@@ -27,7 +27,7 @@ namespace po = boost::program_options;
 
 namespace {
 
-std::map<std::string, std::string> map_options;
+std::map<std::string, std::string> map_options; // used for both map and unmap
 
 } // anonymous namespace
 
@@ -129,6 +129,8 @@ static int parse_map_options(char *options)
     } else if (!strcmp(this_char, "queue_depth")) {
       if (put_map_option_value("queue_depth", value_char, map_option_int_cb))
         return -EINVAL;
+    } else if (!strcmp(this_char, "lock_on_read")) {
+      put_map_option("lock_on_read", this_char);
     } else {
       std::cerr << "rbd: unknown map option '" << this_char << "'" << std::endl;
       return -EINVAL;
@@ -138,6 +140,27 @@ static int parse_map_options(char *options)
   return 0;
 }
 
+static int parse_unmap_options(char *options)
+{
+  for (char *this_char = strtok(options, ", ");
+       this_char != NULL;
+       this_char = strtok(NULL, ",")) {
+    char *value_char;
+
+    if ((value_char = strchr(this_char, '=')) != NULL)
+      *value_char++ = '\0';
+
+    if (!strcmp(this_char, "force")) {
+      put_map_option("force", this_char);
+    } else {
+      std::cerr << "rbd: unknown unmap option '" << this_char << "'" << std::endl;
+      return -EINVAL;
+    }
+  }
+
+  return 0;
+}
+
 static int do_kernel_showmapped(Formatter *f)
 {
   struct krbd_ctx *krbd;
@@ -237,16 +260,24 @@ static int do_kernel_unmap(const char *dev, const char *poolname,
                            const char *imgname, const char *snapname)
 {
   struct krbd_ctx *krbd;
+  std::ostringstream oss;
   int r;
 
   r = krbd_create_from_context(g_ceph_context, &krbd);
   if (r < 0)
     return r;
 
+  for (auto it = map_options.cbegin(); it != map_options.cend(); ++it) {
+    if (it != map_options.cbegin())
+      oss << ",";
+    oss << it->second;
+  }
+
   if (dev)
-    r = krbd_unmap(krbd, dev);
+    r = krbd_unmap(krbd, dev, oss.str().c_str());
   else
-    r = krbd_unmap_by_spec(krbd, poolname, imgname, snapname);
+    r = krbd_unmap_by_spec(krbd, poolname, imgname, snapname,
+                           oss.str().c_str());
 
   krbd_destroy(krbd);
   return r;
@@ -279,8 +310,8 @@ void get_map_arguments(po::options_description *positional,
   at::add_image_or_snap_spec_options(positional, options,
                                      at::ARGUMENT_MODIFIER_NONE);
   options->add_options()
-    ("options,o", po::value<std::string>(), "mapping options")
-    ("read-only", po::bool_switch(), "mount read-only");
+    ("options,o", po::value<std::string>(), "map options")
+    ("read-only", po::bool_switch(), "map read-only");
 }
 
 int execute_map(const po::variables_map &vm) {
@@ -343,6 +374,8 @@ void get_unmap_arguments(po::options_description *positional,
   at::add_pool_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_image_option(options, at::ARGUMENT_MODIFIER_NONE);
   at::add_snap_option(options, at::ARGUMENT_MODIFIER_NONE);
+  options->add_options()
+    ("options,o", po::value<std::string>(), "unmap options");
 }
 
 int execute_unmap(const po::variables_map &vm) {
@@ -372,6 +405,18 @@ int execute_unmap(const po::variables_map &vm) {
     return -EINVAL;
   }
 
+  if (vm.count("options")) {
+    char *cli_unmap_options = strdup(vm["options"].as<std::string>().c_str());
+    BOOST_SCOPE_EXIT( (cli_unmap_options) ) {
+      free(cli_unmap_options);
+    } BOOST_SCOPE_EXIT_END;
+
+    if (parse_unmap_options(cli_unmap_options)) {
+      std::cerr << "rbd: couldn't parse unmap options" << std::endl;
+      return -EINVAL;
+    }
+  }
+
   utils::init_context();
 
   r = do_kernel_unmap(device_name.empty() ? nullptr : device_name.c_str(),
diff --git a/src/tools/rbd_mirror/ImageDeleter.cc b/src/tools/rbd_mirror/ImageDeleter.cc
index 234c240..0b0c775 100644
--- a/src/tools/rbd_mirror/ImageDeleter.cc
+++ b/src/tools/rbd_mirror/ImageDeleter.cc
@@ -77,6 +77,9 @@ struct DeleteJournalPolicy : public librbd::journal::Policy {
   virtual bool append_disabled() const {
     return true;
   }
+  virtual bool journal_disabled() const {
+    return false;
+  }
 
   virtual void allocate_tag_on_lock(Context *on_finish) {
     on_finish->complete(0);
@@ -192,18 +195,18 @@ void ImageDeleter::run() {
 }
 
 void ImageDeleter::schedule_image_delete(RadosRef local_rados,
-                                         uint64_t local_pool_id,
+                                         int64_t local_pool_id,
                                          const std::string& local_image_id,
                                          const std::string& local_image_name,
                                          const std::string& global_image_id) {
   dout(20) << "enter" << dendl;
 
-  Mutex::Locker l(m_delete_lock);
+  Mutex::Locker locker(m_delete_lock);
 
-  auto del_info = find_delete_info(local_image_name);
+  auto del_info = find_delete_info(local_pool_id, global_image_id);
   if (del_info != nullptr) {
-    dout(20) << "image " << local_image_name << " was already scheduled for "
-             << "deletion" << dendl;
+    dout(20) << "image " << local_image_name << " (" << global_image_id << ") "
+             << "was already scheduled for deletion" << dendl;
     return;
   }
 
@@ -213,7 +216,8 @@ void ImageDeleter::schedule_image_delete(RadosRef local_rados,
   m_delete_queue_cond.Signal();
 }
 
-void ImageDeleter::wait_for_scheduled_deletion(const std::string& image_name,
+void ImageDeleter::wait_for_scheduled_deletion(int64_t local_pool_id,
+                                               const std::string &global_image_id,
                                                Context *ctx,
                                                bool notify_on_failed_retry) {
 
@@ -221,8 +225,8 @@ void ImageDeleter::wait_for_scheduled_deletion(const std::string& image_name,
       m_work_queue->queue(ctx, r);
     });
 
-  Mutex::Locker l(m_delete_lock);
-  auto del_info = find_delete_info(image_name);
+  Mutex::Locker locker(m_delete_lock);
+  auto del_info = find_delete_info(local_pool_id, global_image_id);
   if (!del_info) {
     // image not scheduled for deletion
     ctx->complete(0);
@@ -236,9 +240,10 @@ void ImageDeleter::wait_for_scheduled_deletion(const std::string& image_name,
   (*del_info)->notify_on_failed_retry = notify_on_failed_retry;
 }
 
-void ImageDeleter::cancel_waiter(const std::string& image_name) {
+void ImageDeleter::cancel_waiter(int64_t local_pool_id,
+                                 const std::string &global_image_id) {
   Mutex::Locker locker(m_delete_lock);
-  auto del_info = find_delete_info(image_name);
+  auto del_info = find_delete_info(local_pool_id, global_image_id);
   if (!del_info) {
     return;
   }
@@ -405,8 +410,7 @@ bool ImageDeleter::process_image_delete() {
   }
 
   librbd::NoOpProgressContext ctx;
-  r = librbd::remove(ioctx, m_active_delete->local_image_name.c_str(), ctx,
-                     true);
+  r = librbd::remove(ioctx, "", m_active_delete->local_image_id, ctx, true);
   if (r < 0 && r != -ENOENT) {
     derr << "error removing image " << m_active_delete->local_image_name
          << " from local pool: " << cpp_strerror(r) << dendl;
@@ -506,21 +510,22 @@ void ImageDeleter::retry_failed_deletions() {
 }
 
 unique_ptr<ImageDeleter::DeleteInfo> const* ImageDeleter::find_delete_info(
-    const std::string& image_name) {
+    int64_t local_pool_id, const std::string &global_image_id) {
   assert(m_delete_lock.is_locked());
 
-  if (m_active_delete && m_active_delete->match(image_name)) {
+  if (m_active_delete && m_active_delete->match(local_pool_id,
+                                                global_image_id)) {
     return &m_active_delete;
   }
 
   for (const auto& del_info : m_delete_queue) {
-    if (del_info->match(image_name)) {
+    if (del_info->match(local_pool_id, global_image_id)) {
       return &del_info;
     }
   }
 
   for (const auto& del_info : m_failed_queue) {
-    if (del_info->match(image_name)) {
+    if (del_info->match(local_pool_id, global_image_id)) {
       return &del_info;
     }
   }
diff --git a/src/tools/rbd_mirror/ImageDeleter.h b/src/tools/rbd_mirror/ImageDeleter.h
index 3d994b1..d9b0f2e 100644
--- a/src/tools/rbd_mirror/ImageDeleter.h
+++ b/src/tools/rbd_mirror/ImageDeleter.h
@@ -44,14 +44,16 @@ public:
   ImageDeleter& operator=(const ImageDeleter&) = delete;
 
   void schedule_image_delete(RadosRef local_rados,
-                             uint64_t local_pool_id,
+                             int64_t local_pool_id,
                              const std::string& local_image_id,
                              const std::string& local_image_name,
                              const std::string& global_image_id);
-  void wait_for_scheduled_deletion(const std::string& image_name,
+  void wait_for_scheduled_deletion(int64_t local_pool_id,
+                                   const std::string &global_image_id,
                                    Context *ctx,
                                    bool notify_on_failed_retry=true);
-  void cancel_waiter(const std::string& image_name);
+  void cancel_waiter(int64_t local_pool_id,
+                     const std::string &global_image_id);
 
   void print_status(Formatter *f, std::stringstream *ss);
 
@@ -75,7 +77,7 @@ private:
 
   struct DeleteInfo {
     RadosRef local_rados;
-    uint64_t local_pool_id;
+    int64_t local_pool_id;
     std::string local_image_id;
     std::string local_image_name;
     std::string global_image_id;
@@ -84,7 +86,7 @@ private:
     bool notify_on_failed_retry;
     Context *on_delete;
 
-    DeleteInfo(RadosRef local_rados, uint64_t local_pool_id,
+    DeleteInfo(RadosRef local_rados, int64_t local_pool_id,
                const std::string& local_image_id,
                const std::string& local_image_name,
                const std::string& global_image_id) :
@@ -94,8 +96,9 @@ private:
       notify_on_failed_retry(true), on_delete(nullptr) {
     }
 
-    bool match(const std::string& image_name) {
-      return local_image_name == image_name;
+    bool match(int64_t local_pool_id, const std::string &global_image_id) {
+      return (this->local_pool_id == local_pool_id &&
+              this->global_image_id == global_image_id);
     }
     void notify(int r);
     void to_string(std::stringstream& ss);
@@ -133,7 +136,9 @@ private:
   void enqueue_failed_delete(int error_code);
   void retry_failed_deletions();
 
-  unique_ptr<DeleteInfo> const* find_delete_info(const std::string& image_name);
+  unique_ptr<DeleteInfo> const*
+  find_delete_info(int64_t local_pool_id, const std::string &global_image_id);
+
 };
 
 } // namespace mirror
diff --git a/src/tools/rbd_mirror/ImageReplayer.cc b/src/tools/rbd_mirror/ImageReplayer.cc
index 86da4bc..f83eafb 100644
--- a/src/tools/rbd_mirror/ImageReplayer.cc
+++ b/src/tools/rbd_mirror/ImageReplayer.cc
@@ -224,19 +224,6 @@ private:
   Commands commands;
 };
 
-template <typename I>
-struct ResyncListener : public librbd::journal::ResyncListener {
-  ImageReplayer<I> *img_replayer;
-
-  ResyncListener(ImageReplayer<I> *img_replayer)
-    : img_replayer(img_replayer) {
-  }
-
-  virtual void handle_resync() {
-    img_replayer->resync_image();
-  }
-};
-
 } // anonymous namespace
 
 template <typename I>
@@ -251,6 +238,15 @@ void ImageReplayer<I>::BootstrapProgressContext::update_progress(
 }
 
 template <typename I>
+void ImageReplayer<I>::RemoteJournalerListener::handle_update(
+  ::journal::JournalMetadata *) {
+  FunctionContext *ctx = new FunctionContext([this](int r) {
+      replayer->handle_remote_journal_metadata_updated();
+    });
+  replayer->m_threads->work_queue->queue(ctx, 0);
+}
+
+template <typename I>
 ImageReplayer<I>::ImageReplayer(Threads *threads,
                              shared_ptr<ImageDeleter> image_deleter,
                              ImageSyncThrottlerRef<I> image_sync_throttler,
@@ -276,7 +272,8 @@ ImageReplayer<I>::ImageReplayer(Threads *threads,
   m_lock("rbd::mirror::ImageReplayer " + stringify(remote_pool_id) + " " +
 	 remote_image_id),
   m_progress_cxt(this),
-  m_resync_listener(new ResyncListener<I>(this))
+  m_journal_listener(new JournalListener(this)),
+  m_remote_listener(this)
 {
   // Register asok commands using a temporary "remote_pool_name/global_image_id"
   // name.  When the image name becomes known on start the asok commands will be
@@ -309,7 +306,7 @@ ImageReplayer<I>::~ImageReplayer()
   assert(m_bootstrap_request == nullptr);
   assert(m_in_flight_status_updates == 0);
 
-  delete m_resync_listener;
+  delete m_journal_listener;
   delete m_asok_hook;
 }
 
@@ -417,7 +414,6 @@ void ImageReplayer<I>::bootstrap() {
 template <typename I>
 void ImageReplayer<I>::handle_bootstrap(int r) {
   dout(20) << "r=" << r << dendl;
-
   {
     Mutex::Locker locker(m_lock);
     m_bootstrap_request->put();
@@ -439,29 +435,46 @@ void ImageReplayer<I>::handle_bootstrap(int r) {
     return;
   }
 
+
+  assert(m_local_journal == nullptr);
   {
-    Mutex::Locker locker(m_lock);
+    RWLock::RLocker snap_locker(m_local_image_ctx->snap_lock);
+    if (m_local_image_ctx->journal != nullptr) {
+      m_local_journal = m_local_image_ctx->journal;
+      m_local_journal->add_listener(m_journal_listener);
+    }
+  }
 
-    m_local_image_ctx->journal->add_listener(
-                                    librbd::journal::ListenerType::RESYNC,
-                                    m_resync_listener);
+  if (m_local_journal == nullptr) {
+    on_start_fail(-EINVAL, "error accessing local journal");
+    return;
+  }
 
+  {
+    Mutex::Locker locker(m_lock);
     bool do_resync = false;
-    r = m_local_image_ctx->journal->check_resync_requested(&do_resync);
+    r = m_local_image_ctx->journal->is_resync_requested(&do_resync);
     if (r < 0) {
       derr << "failed to check if a resync was requested" << dendl;
     }
 
     if (do_resync) {
       Context *on_finish = m_on_start_finish;
+      m_stopping_for_resync = true;
       FunctionContext *ctx = new FunctionContext([this, on_finish](int r) {
+	  if (r < 0) {
+	    if (on_finish) {
+	      on_finish->complete(r);
+	    }
+	    return;
+	  }
           resync_image(on_finish);
         });
       m_on_start_finish = ctx;
     }
 
     std::string name = m_local_ioctx.get_pool_name() + "/" +
-      m_local_image_ctx->name;
+                       m_local_image_ctx->name;
     if (m_name != name) {
       m_name = name;
       if (m_asok_hook) {
@@ -501,6 +514,27 @@ void ImageReplayer<I>::handle_init_remote_journaler(int r) {
     return;
   }
 
+  m_remote_journaler->add_listener(&m_remote_listener);
+
+  cls::journal::Client client;
+  r = m_remote_journaler->get_cached_client(m_local_mirror_uuid, &client);
+  if (r < 0) {
+    derr << "error retrieving remote journal client: " << cpp_strerror(r)
+	 << dendl;
+    on_start_fail(r, "error retrieving remote journal client");
+    return;
+  }
+
+  if (client.state != cls::journal::CLIENT_STATE_CONNECTED) {
+    dout(5) << "client flagged disconnected, stopping image replay" << dendl;
+    if (m_local_image_ctx->mirroring_resync_after_disconnect) {
+      Mutex::Locker locker(m_lock);
+      m_stopping_for_resync = true;
+    }
+    on_start_fail(-ENOTCONN, "disconnected");
+    return;
+  }
+
   start_replay();
 }
 
@@ -508,23 +542,9 @@ template <typename I>
 void ImageReplayer<I>::start_replay() {
   dout(20) << dendl;
 
-  assert(m_local_journal == nullptr);
-  {
-    RWLock::RLocker snap_locker(m_local_image_ctx->snap_lock);
-    if (m_local_image_ctx->journal != nullptr) {
-      m_local_journal = m_local_image_ctx->journal;
-
-      Context *start_ctx = create_context_callback<
-        ImageReplayer, &ImageReplayer<I>::handle_start_replay>(this);
-      Context *stop_ctx = create_context_callback<
-        ImageReplayer, &ImageReplayer<I>::handle_stop_replay_request>(this);
-      m_local_journal->start_external_replay(&m_local_replay, start_ctx,
-                                             stop_ctx);
-      return;
-    }
-  }
-
-  on_start_fail(-EINVAL, "error starting journal replay");
+  Context *start_ctx = create_context_callback<
+    ImageReplayer, &ImageReplayer<I>::handle_start_replay>(this);
+  m_local_journal->start_external_replay(&m_local_replay, start_ctx);
 }
 
 template <typename I>
@@ -532,7 +552,7 @@ void ImageReplayer<I>::handle_start_replay(int r) {
   dout(20) << "r=" << r << dendl;
 
   if (r < 0) {
-    m_local_journal = nullptr;
+    assert(m_local_replay == nullptr);
     derr << "error starting external replay on local image "
 	 <<  m_local_image_id << ": " << cpp_strerror(r) << dendl;
     on_start_fail(r, "error starting replay on local image");
@@ -581,19 +601,6 @@ void ImageReplayer<I>::handle_start_replay(int r) {
 }
 
 template <typename I>
-void ImageReplayer<I>::handle_stop_replay_request(int r) {
-  if (r < 0) {
-    // error starting or we requested the stop -- ignore
-    return;
-  }
-
-  // journal close has been requested, stop replay so the journal
-  // can be closed (since it will wait on replay to finish)
-  dout(20) << dendl;
-  on_stop_journal_replay();
-}
-
-template <typename I>
 void ImageReplayer<I>::on_start_fail(int r, const std::string &desc)
 {
   dout(20) << "r=" << r << dendl;
@@ -630,15 +637,18 @@ bool ImageReplayer<I>::on_start_interrupted()
 }
 
 template <typename I>
-void ImageReplayer<I>::stop(Context *on_finish, bool manual)
+void ImageReplayer<I>::stop(Context *on_finish, bool manual, int r,
+			    const std::string& desc)
 {
-  dout(20) << "on_finish=" << on_finish << dendl;
+  dout(20) << "on_finish=" << on_finish << ", manual=" << manual
+	   << ", desc=" << desc << dendl;
 
   image_replayer::BootstrapRequest<I> *bootstrap_request = nullptr;
   bool shut_down_replay = false;
   bool running = true;
   {
     Mutex::Locker locker(m_lock);
+
     if (!is_running_()) {
       running = false;
     } else {
@@ -677,14 +687,14 @@ void ImageReplayer<I>::stop(Context *on_finish, bool manual)
   }
 
   if (shut_down_replay) {
-    on_stop_journal_replay();
+    on_stop_journal_replay(r, desc);
   } else if (on_finish != nullptr) {
     on_finish->complete(0);
   }
 }
 
 template <typename I>
-void ImageReplayer<I>::on_stop_journal_replay()
+void ImageReplayer<I>::on_stop_journal_replay(int r, const std::string &desc)
 {
   dout(20) << "enter" << dendl;
 
@@ -698,19 +708,13 @@ void ImageReplayer<I>::on_stop_journal_replay()
     m_state = STATE_STOPPING;
   }
 
-  set_state_description(0, "");
+  set_state_description(r, desc);
   update_mirror_image_status(false, boost::none);
   reschedule_update_status_task(-1);
   shut_down(0);
 }
 
 template <typename I>
-void ImageReplayer<I>::close_local_image(Context *on_finish)
-{
-  m_local_image_ctx->state->close(on_finish);
-}
-
-template <typename I>
 void ImageReplayer<I>::handle_replay_ready()
 {
   dout(20) << "enter" << dendl;
@@ -722,6 +726,7 @@ void ImageReplayer<I>::handle_replay_ready()
     return;
   }
 
+  m_event_replay_tracker.start_op();
   if (m_replay_tag_valid && m_replay_tag.tid == m_replay_tag_tid) {
     preprocess_entry();
     return;
@@ -874,13 +879,20 @@ template <typename I>
 void ImageReplayer<I>::replay_flush() {
   dout(20) << dendl;
 
+  bool interrupted = false;
   {
     Mutex::Locker locker(m_lock);
     if (m_state != STATE_REPLAYING) {
       dout(20) << "replay interrupted" << dendl;
-      return;
+      interrupted = true;
+    } else {
+      m_state = STATE_REPLAY_FLUSHING;
     }
-    m_state = STATE_REPLAY_FLUSHING;
+  }
+
+  if (interrupted) {
+    m_event_replay_tracker.finish_op();
+    return;
   }
 
   // shut down the replay to flush all IO and ops and create a new
@@ -896,9 +908,7 @@ void ImageReplayer<I>::replay_flush() {
         return;
       }
 
-      Context *stop_ctx = create_context_callback<
-        ImageReplayer, &ImageReplayer<I>::handle_stop_replay_request>(this);
-      m_local_journal->start_external_replay(&m_local_replay, ctx, stop_ctx);
+      m_local_journal->start_external_replay(&m_local_replay, ctx);
     });
   m_local_replay->shut_down(false, ctx);
 }
@@ -915,9 +925,11 @@ void ImageReplayer<I>::handle_replay_flush(int r) {
 
   if (r < 0) {
     derr << "replay flush encountered an error: " << cpp_strerror(r) << dendl;
+    m_event_replay_tracker.finish_op();
     handle_replay_complete(r, "replay flush encountered an error");
     return;
   } else if (on_replay_interrupted()) {
+    m_event_replay_tracker.finish_op();
     return;
   }
 
@@ -949,6 +961,7 @@ void ImageReplayer<I>::handle_get_remote_tag(int r) {
   if (r < 0) {
     derr << "failed to retrieve remote tag " << m_replay_tag_tid << ": "
          << cpp_strerror(r) << dendl;
+    m_event_replay_tracker.finish_op();
     handle_replay_complete(r, "failed to retrieve remote tag");
     return;
   }
@@ -974,22 +987,20 @@ void ImageReplayer<I>::allocate_local_tag() {
     m_stop_requested = true;
   }
 
-  std::string predecessor_mirror_uuid =
-    m_replay_tag_data.predecessor_mirror_uuid;
-  if (predecessor_mirror_uuid == librbd::Journal<>::LOCAL_MIRROR_UUID) {
-    predecessor_mirror_uuid = m_remote_mirror_uuid;
-  } else if (predecessor_mirror_uuid == m_local_mirror_uuid) {
-    predecessor_mirror_uuid = librbd::Journal<>::LOCAL_MIRROR_UUID;
+  librbd::journal::TagPredecessor predecessor(m_replay_tag_data.predecessor);
+  if (predecessor.mirror_uuid == librbd::Journal<>::LOCAL_MIRROR_UUID) {
+    predecessor.mirror_uuid = m_remote_mirror_uuid;
+  } else if (predecessor.mirror_uuid == m_local_mirror_uuid) {
+    predecessor.mirror_uuid = librbd::Journal<>::LOCAL_MIRROR_UUID;
   }
 
+  dout(20) << "mirror_uuid=" << mirror_uuid << ", "
+           << "predecessor_mirror_uuid=" << predecessor.mirror_uuid << ", "
+           << "replay_tag_tid=" << m_replay_tag_tid << ", "
+           << "replay_tag_data=" << m_replay_tag_data << dendl;
   Context *ctx = create_context_callback<
     ImageReplayer, &ImageReplayer<I>::handle_allocate_local_tag>(this);
-  m_local_journal->allocate_tag(
-    mirror_uuid, predecessor_mirror_uuid,
-    m_replay_tag_data.predecessor_commit_valid,
-    m_replay_tag_data.predecessor_tag_tid,
-    m_replay_tag_data.predecessor_entry_tid,
-    ctx);
+  m_local_journal->allocate_tag(mirror_uuid, predecessor, ctx);
 }
 
 template <typename I>
@@ -998,6 +1009,7 @@ void ImageReplayer<I>::handle_allocate_local_tag(int r) {
 
   if (r < 0) {
     derr << "failed to allocate journal tag: " << cpp_strerror(r) << dendl;
+    m_event_replay_tracker.finish_op();
     handle_replay_complete(r, "failed to allocate journal tag");
     return;
   }
@@ -1015,6 +1027,7 @@ void ImageReplayer<I>::preprocess_entry() {
   int r = m_local_replay->decode(&it, &m_event_entry);
   if (r < 0) {
     derr << "failed to decode journal event" << dendl;
+    m_event_replay_tracker.finish_op();
     handle_replay_complete(r, "failed to decode journal event");
     return;
   }
@@ -1035,6 +1048,7 @@ void ImageReplayer<I>::handle_preprocess_entry(int r) {
 
   if (r < 0) {
     derr << "failed to preprocess journal event" << dendl;
+    m_event_replay_tracker.finish_op();
     handle_replay_complete(r, "failed to preprocess journal event");
     return;
   }
@@ -1050,8 +1064,8 @@ void ImageReplayer<I>::process_entry() {
   Context *on_ready = create_context_callback<
     ImageReplayer, &ImageReplayer<I>::handle_process_entry_ready>(this);
   Context *on_commit = new C_ReplayCommitted(this, std::move(m_replay_entry));
+
   m_local_replay->process(m_event_entry, on_ready, on_commit);
-  m_event_entry = {};
 }
 
 template <typename I>
@@ -1071,14 +1085,12 @@ void ImageReplayer<I>::handle_process_entry_safe(const ReplayEntry& replay_entry
 
   if (r < 0) {
     derr << "failed to commit journal event: " << cpp_strerror(r) << dendl;
-
     handle_replay_complete(r, "failed to commit journal event");
-    return;
-  }
-
-  if (m_remote_journaler) {
+  } else {
+    assert(m_remote_journaler != nullptr);
     m_remote_journaler->committed(replay_entry);
   }
+  m_event_replay_tracker.finish_op();
 }
 
 template <typename I>
@@ -1344,6 +1356,7 @@ void ImageReplayer<I>::shut_down(int r) {
         ctx->complete(0);
       });
     ctx = new FunctionContext([this, ctx](int r) {
+	m_remote_journaler->remove_listener(&m_remote_listener);
         m_remote_journaler->shut_down(ctx);
       });
     if (m_stopping_for_resync) {
@@ -1352,25 +1365,37 @@ void ImageReplayer<I>::shut_down(int r) {
         });
     }
   }
-  if (m_local_replay != nullptr) {
+  if (m_local_journal != nullptr) {
+    ctx = new FunctionContext([this, ctx](int r) {
+        m_local_journal = nullptr;
+        ctx->complete(0);
+      });
+    if (m_local_replay != nullptr) {
+      ctx = new FunctionContext([this, ctx](int r) {
+          m_local_journal->stop_external_replay();
+          m_local_replay = nullptr;
+
+          delete m_event_preprocessor;
+          m_event_preprocessor = nullptr;
+          ctx->complete(0);
+        });
+    }
     ctx = new FunctionContext([this, ctx](int r) {
         if (r < 0) {
           derr << "error flushing journal replay: " << cpp_strerror(r) << dendl;
         }
-        m_local_journal->stop_external_replay();
-        m_local_journal = nullptr;
-        m_local_replay = nullptr;
 
-        delete m_event_preprocessor;
-        m_event_preprocessor = nullptr;
+        // blocks if listener notification is in-progress
+        m_local_journal->remove_listener(m_journal_listener);
 
-        ctx->complete(0);
-      });
-    ctx = new FunctionContext([this, ctx](int r) {
-        m_local_journal->remove_listener(
-            librbd::journal::ListenerType::RESYNC, m_resync_listener);
-        m_local_replay->shut_down(true, ctx);
+        // wait for all in-flight replayed events to complete
+        m_event_replay_tracker.wait_for_ops(ctx);
       });
+    if (m_local_replay != nullptr) {
+      ctx = new FunctionContext([this, ctx](int r) {
+          m_local_replay->shut_down(true, ctx);
+        });
+    }
   }
   if (m_replay_handler != nullptr) {
     ctx = new FunctionContext([this, ctx](int r) {
@@ -1445,6 +1470,30 @@ void ImageReplayer<I>::handle_shut_down(int r) {
 }
 
 template <typename I>
+void ImageReplayer<I>::handle_remote_journal_metadata_updated() {
+  dout(20) << dendl;
+
+  cls::journal::Client client;
+  {
+    Mutex::Locker locker(m_lock);
+    if (!is_running_()) {
+      return;
+    }
+
+    int r = m_remote_journaler->get_cached_client(m_local_mirror_uuid, &client);
+    if (r < 0) {
+      derr << "failed to retrieve client: " << cpp_strerror(r) << dendl;
+      return;
+    }
+  }
+
+  if (client.state != cls::journal::CLIENT_STATE_CONNECTED) {
+    dout(0) << "client flagged disconnected, stopping image replay" << dendl;
+    stop(nullptr, false, -ENOTCONN, "disconnected");
+  }
+}
+
+template <typename I>
 std::string ImageReplayer<I>::to_string(const State state) {
   switch (state) {
   case ImageReplayer<I>::STATE_STARTING:
diff --git a/src/tools/rbd_mirror/ImageReplayer.h b/src/tools/rbd_mirror/ImageReplayer.h
index 1b1a742..222ef02 100644
--- a/src/tools/rbd_mirror/ImageReplayer.h
+++ b/src/tools/rbd_mirror/ImageReplayer.h
@@ -9,11 +9,13 @@
 #include <vector>
 
 #include "include/atomic.h"
+#include "common/AsyncOpTracker.h"
 #include "common/Mutex.h"
 #include "common/WorkQueue.h"
 #include "include/rados/librados.hpp"
 #include "cls/journal/cls_journal_types.h"
 #include "cls/rbd/cls_rbd_types.h"
+#include "journal/JournalMetadataListener.h"
 #include "journal/ReplayEntry.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/journal/Types.h"
@@ -111,7 +113,8 @@ public:
   }
 
   void start(Context *on_finish = nullptr, bool manual = false);
-  void stop(Context *on_finish = nullptr, bool manual = false);
+  void stop(Context *on_finish = nullptr, bool manual = false,
+	    int r = 0, const std::string& desc = "");
   void restart(Context *on_finish = nullptr);
   void flush(Context *on_finish = nullptr);
 
@@ -190,7 +193,7 @@ protected:
   virtual void on_start_fail(int r, const std::string &desc = "");
   virtual bool on_start_interrupted();
 
-  virtual void on_stop_journal_replay();
+  virtual void on_stop_journal_replay(int r = 0, const std::string &desc = "");
 
   virtual void on_flush_local_replay_flush_start(Context *on_flush);
   virtual void on_flush_local_replay_flush_finish(Context *on_flush, int r);
@@ -199,12 +202,30 @@ protected:
 
   bool on_replay_interrupted();
 
-  void close_local_image(Context *on_finish); // for tests
-
 private:
   typedef typename librbd::journal::TypeTraits<ImageCtxT>::Journaler Journaler;
   typedef boost::optional<State> OptionalState;
 
+  struct JournalListener : public librbd::journal::Listener {
+    ImageReplayer *img_replayer;
+
+    JournalListener(ImageReplayer *img_replayer)
+      : img_replayer(img_replayer) {
+    }
+
+    virtual void handle_close() {
+      img_replayer->on_stop_journal_replay();
+    }
+
+    virtual void handle_promoted() {
+      img_replayer->on_stop_journal_replay(0, "force promoted");
+    }
+
+    virtual void handle_resync() {
+      img_replayer->resync_image();
+    }
+  };
+
   class BootstrapProgressContext : public ProgressContext {
   public:
     BootstrapProgressContext(ImageReplayer<ImageCtxT> *replayer) :
@@ -242,7 +263,7 @@ private:
   librbd::journal::Replay<ImageCtxT> *m_local_replay = nullptr;
   Journaler* m_remote_journaler = nullptr;
   ::journal::ReplayHandler *m_replay_handler = nullptr;
-  librbd::journal::ResyncListener *m_resync_listener;
+  librbd::journal::Listener *m_journal_listener;
   bool m_stopping_for_resync = false;
 
   Context *m_on_start_finish = nullptr;
@@ -269,6 +290,15 @@ private:
   cls::journal::Tag m_replay_tag;
   librbd::journal::TagData m_replay_tag_data;
   librbd::journal::EventEntry m_event_entry;
+  AsyncOpTracker m_event_replay_tracker;
+
+  struct RemoteJournalerListener : public ::journal::JournalMetadataListener {
+    ImageReplayer *replayer;
+
+    RemoteJournalerListener(ImageReplayer *replayer) : replayer(replayer) { }
+
+    void handle_update(::journal::JournalMetadata *);
+  } m_remote_listener;
 
   struct C_ReplayCommitted : public Context {
     ImageReplayer *replayer;
@@ -309,6 +339,7 @@ private:
 
   void shut_down(int r);
   void handle_shut_down(int r);
+  void handle_remote_journal_metadata_updated();
 
   void bootstrap();
   void handle_bootstrap(int r);
@@ -318,7 +349,6 @@ private:
 
   void start_replay();
   void handle_start_replay(int r);
-  void handle_stop_replay_request(int r);
 
   void replay_flush();
   void handle_replay_flush(int r);
diff --git a/src/tools/rbd_mirror/Replayer.cc b/src/tools/rbd_mirror/Replayer.cc
index fd13a8d..f3ccca9 100644
--- a/src/tools/rbd_mirror/Replayer.cc
+++ b/src/tools/rbd_mirror/Replayer.cc
@@ -740,7 +740,9 @@ void Replayer::start_image_replayer(unique_ptr<ImageReplayer<> > &image_replayer
           }
        }
     );
-    m_image_deleter->wait_for_scheduled_deletion(image_name.get(), ctx, false);
+
+    m_image_deleter->wait_for_scheduled_deletion(
+      m_local_pool_id, image_replayer->get_global_image_id(), ctx, false);
   }
 }
 
@@ -752,7 +754,9 @@ bool Replayer::stop_image_replayer(unique_ptr<ImageReplayer<> > &image_replayer)
 
   // TODO: check how long it is stopping and alert if it is too long.
   if (image_replayer->is_stopped()) {
-    m_image_deleter->cancel_waiter(image_replayer->get_local_image_name());
+    m_image_deleter->cancel_waiter(m_local_pool_id,
+                                   image_replayer->get_global_image_id());
+
     if (!m_stopping.read()) {
       dout(20) << "scheduling delete" << dendl;
       m_image_deleter->schedule_image_delete(
diff --git a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc
index 574023a..2f791f0 100644
--- a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc
+++ b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.cc
@@ -279,7 +279,7 @@ void BootstrapRequest<I>::handle_open_remote_image(int r) {
     dout(5) << ": remote image is not primary -- skipping image replay"
             << dendl;
     m_ret_val = -EREMOTEIO;
-    close_remote_image();
+    update_client_state();
     return;
   }
 
@@ -297,6 +297,42 @@ void BootstrapRequest<I>::handle_open_remote_image(int r) {
 }
 
 template <typename I>
+void BootstrapRequest<I>::update_client_state() {
+  if (m_client_meta->state == librbd::journal::MIRROR_PEER_STATE_REPLAYING) {
+    // state already set for replaying upon failover
+    close_remote_image();
+    return;
+  }
+
+  dout(20) << dendl;
+  update_progress("UPDATE_CLIENT_STATE");
+
+  librbd::journal::MirrorPeerClientMeta client_meta(*m_client_meta);
+  client_meta.state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;
+
+  librbd::journal::ClientData client_data(client_meta);
+  bufferlist data_bl;
+  ::encode(client_data, data_bl);
+
+  Context *ctx = create_context_callback<
+    BootstrapRequest<I>, &BootstrapRequest<I>::handle_update_client_state>(
+      this);
+  m_journaler->update_client(data_bl, ctx);
+}
+
+template <typename I>
+void BootstrapRequest<I>::handle_update_client_state(int r) {
+  dout(20) << ": r=" << r << dendl;
+  if (r < 0) {
+    derr << ": failed to update client: " << cpp_strerror(r) << dendl;
+  } else {
+    m_client_meta->state = librbd::journal::MIRROR_PEER_STATE_REPLAYING;;
+  }
+
+  close_remote_image();
+}
+
+template <typename I>
 void BootstrapRequest<I>::open_local_image() {
   dout(20) << dendl;
 
@@ -333,25 +369,15 @@ void BootstrapRequest<I>::handle_open_local_image(int r) {
     m_ret_val = r;
     close_remote_image();
     return;
+  } if (m_client.state == cls::journal::CLIENT_STATE_DISCONNECTED) {
+    dout(10) << ": client flagged disconnected -- skipping bootstrap" << dendl;
+    // The caller is expected to detect disconnect initializing remote journal.
+    m_ret_val = 0;
+    close_remote_image();
+    return;
   }
 
-  update_client();
-}
-
-template <typename I>
-void BootstrapRequest<I>::remove_local_image() {
-  dout(20) << dendl;
-
-  update_progress("REMOVE_LOCAL_IMAGE");
-
-  // TODO
-}
-
-template <typename I>
-void BootstrapRequest<I>::handle_remove_local_image(int r) {
-  dout(20) << ": r=" << r << dendl;
-
-  // TODO
+  update_client_image();
 }
 
 template <typename I>
@@ -386,10 +412,10 @@ void BootstrapRequest<I>::handle_create_local_image(int r) {
 }
 
 template <typename I>
-void BootstrapRequest<I>::update_client() {
+void BootstrapRequest<I>::update_client_image() {
   dout(20) << dendl;
 
-  update_progress("UPDATE_CLIENT");
+  update_progress("UPDATE_CLIENT_IMAGE");
 
   if (m_client_meta->image_id == (*m_local_image_ctx)->id) {
     // already registered local image with remote journal
@@ -408,13 +434,13 @@ void BootstrapRequest<I>::update_client() {
   ::encode(client_data, data_bl);
 
   Context *ctx = create_context_callback<
-    BootstrapRequest<I>, &BootstrapRequest<I>::handle_update_client>(
+    BootstrapRequest<I>, &BootstrapRequest<I>::handle_update_client_image>(
       this);
   m_journaler->update_client(data_bl, ctx);
 }
 
 template <typename I>
-void BootstrapRequest<I>::handle_update_client(int r) {
+void BootstrapRequest<I>::handle_update_client_image(int r) {
   dout(20) << ": r=" << r << dendl;
 
   if (r < 0) {
@@ -441,9 +467,10 @@ void BootstrapRequest<I>::get_remote_tags() {
 
   update_progress("GET_REMOTE_TAGS");
 
-  if (m_created_local_image) {
+  if (m_created_local_image ||
+      m_client_meta->state == librbd::journal::MIRROR_PEER_STATE_SYNCING) {
     // optimization -- no need to compare remote tags if we just created
-    // the image locally
+    // the image locally or sync was interrupted
     image_sync();
     return;
   }
@@ -473,59 +500,122 @@ void BootstrapRequest<I>::handle_get_remote_tags(int r) {
     return;
   }
 
-  // decode the remote tags
+  // At this point, the local image was existing, non-primary, and replaying;
+  // and the remote image is primary.  Attempt to link the local image's most
+  // recent tag to the remote image's tag chain.
+  uint64_t local_tag_tid;
+  librbd::journal::TagData local_tag_data;
+  I *local_image_ctx = (*m_local_image_ctx);
+  {
+    RWLock::RLocker snap_locker(local_image_ctx->snap_lock);
+    if (local_image_ctx->journal == nullptr) {
+      derr << "local image does not support journaling" << dendl;
+      m_ret_val = -EINVAL;
+      close_local_image();
+      return;
+    }
+
+    local_tag_tid = local_image_ctx->journal->get_tag_tid();
+    local_tag_data = local_image_ctx->journal->get_tag_data();
+    dout(20) << ": local tag " << local_tag_tid << ": "
+             << local_tag_data << dendl;
+  }
+
+  bool remote_tag_data_valid = false;
   librbd::journal::TagData remote_tag_data;
-  for (auto &tag : m_remote_tags) {
+  boost::optional<uint64_t> remote_orphan_tag_tid =
+    boost::make_optional<uint64_t>(false, 0U);
+  bool reconnect_orphan = false;
+
+  // decode the remote tags
+  for (auto &remote_tag : m_remote_tags) {
+    if (local_tag_data.predecessor.commit_valid &&
+        local_tag_data.predecessor.mirror_uuid == m_remote_mirror_uuid &&
+        local_tag_data.predecessor.tag_tid > remote_tag.tid) {
+      dout(20) << ": skipping processed predecessor remote tag "
+               << remote_tag.tid << dendl;
+      continue;
+    }
+
     try {
-      bufferlist::iterator it = tag.data.begin();
+      bufferlist::iterator it = remote_tag.data.begin();
       ::decode(remote_tag_data, it);
+      remote_tag_data_valid = true;
     } catch (const buffer::error &err) {
-      derr << ": failed to decode remote tag: " << err.what() << dendl;
+      derr << ": failed to decode remote tag " << remote_tag.tid << ": "
+           << err.what() << dendl;
       m_ret_val = -EBADMSG;
       close_local_image();
       return;
     }
 
-    dout(10) << ": decoded remote tag: " << remote_tag_data << dendl;
-    if (remote_tag_data.mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID &&
-        remote_tag_data.predecessor_mirror_uuid == m_local_mirror_uuid) {
-      // remote tag is chained off a local tag demotion
+    dout(10) << ": decoded remote tag " << remote_tag.tid << ": "
+             << remote_tag_data << dendl;
+
+    if (!local_tag_data.predecessor.commit_valid) {
+      // newly synced local image (no predecessor) replays from the first tag
+      if (remote_tag_data.mirror_uuid != librbd::Journal<>::LOCAL_MIRROR_UUID) {
+        dout(20) << ": skipping non-primary remote tag" << dendl;
+        continue;
+      }
+
+      dout(20) << ": using initial primary remote tag" << dendl;
       break;
     }
-  }
 
-  // At this point, the local image was existing and non-primary and the remote
-  // image is primary.  Attempt to link the local image's most recent tag
-  // to the remote image's tag chain.
-  I *local_image_ctx = (*m_local_image_ctx);
-  {
-    RWLock::RLocker snap_locker(local_image_ctx->snap_lock);
-    if (local_image_ctx->journal == nullptr) {
-      derr << "local image does not support journaling" << dendl;
-      m_ret_val = -EINVAL;
-      close_local_image();
-      return;
+    if (local_tag_data.mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID) {
+      // demotion last available local epoch
+
+      if (remote_tag_data.mirror_uuid == local_tag_data.mirror_uuid &&
+          remote_tag_data.predecessor.commit_valid &&
+          remote_tag_data.predecessor.tag_tid ==
+            local_tag_data.predecessor.tag_tid) {
+        // demotion matches remote epoch
+
+        if (remote_tag_data.predecessor.mirror_uuid == m_local_mirror_uuid &&
+            local_tag_data.predecessor.mirror_uuid ==
+              librbd::Journal<>::LOCAL_MIRROR_UUID) {
+          // local demoted and remote has matching event
+          dout(20) << ": found matching local demotion tag" << dendl;
+          remote_orphan_tag_tid = remote_tag.tid;
+          continue;
+        }
+
+        if (local_tag_data.predecessor.mirror_uuid == m_remote_mirror_uuid &&
+            remote_tag_data.predecessor.mirror_uuid ==
+              librbd::Journal<>::LOCAL_MIRROR_UUID) {
+          // remote demoted and local has matching event
+          dout(20) << ": found matching remote demotion tag" << dendl;
+          remote_orphan_tag_tid = remote_tag.tid;
+          continue;
+        }
+      }
+
+      if (remote_tag_data.mirror_uuid == librbd::Journal<>::LOCAL_MIRROR_UUID &&
+          remote_tag_data.predecessor.mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID &&
+          remote_tag_data.predecessor.commit_valid && remote_orphan_tag_tid &&
+          remote_tag_data.predecessor.tag_tid == *remote_orphan_tag_tid) {
+        // remote promotion tag chained to remote/local demotion tag
+        dout(20) << ": found chained remote promotion tag" << dendl;
+        reconnect_orphan = true;
+        break;
+      }
+
+      // promotion must follow demotion
+      remote_orphan_tag_tid = boost::none;
     }
+  }
 
-    librbd::journal::TagData tag_data =
-      local_image_ctx->journal->get_tag_data();
-    dout(20) << ": local tag data: " << tag_data << dendl;
-
-    if (tag_data.mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID &&
-	remote_tag_data.mirror_uuid == librbd::Journal<>::ORPHAN_MIRROR_UUID &&
-	remote_tag_data.predecessor_mirror_uuid == m_local_mirror_uuid) {
-      dout(20) << ": local image was demoted" << dendl;
-    } else if (tag_data.mirror_uuid == m_remote_mirror_uuid &&
-	       m_client_meta->state == librbd::journal::MIRROR_PEER_STATE_REPLAYING) {
-      dout(20) << ": local image is in clean replay state" << dendl;
-    } else if (m_client_meta->state == librbd::journal::MIRROR_PEER_STATE_SYNCING) {
-      dout(20) << ": previous sync was canceled" << dendl;
-    } else {
-      derr << ": split-brain detected -- skipping image replay" << dendl;
-      m_ret_val = -EEXIST;
-      close_local_image();
-      return;
-    }
+  if (remote_tag_data_valid &&
+      local_tag_data.mirror_uuid == m_remote_mirror_uuid) {
+    dout(20) << ": local image is in clean replay state" << dendl;
+  } else if (reconnect_orphan) {
+    dout(20) << ": remote image was demoted/promoted" << dendl;
+  } else {
+    derr << ": split-brain detected -- skipping image replay" << dendl;
+    m_ret_val = -EEXIST;
+    close_local_image();
+    return;
   }
 
   image_sync();
@@ -533,10 +623,6 @@ void BootstrapRequest<I>::handle_get_remote_tags(int r) {
 
 template <typename I>
 void BootstrapRequest<I>::image_sync() {
-  dout(20) << dendl;
-
-  update_progress("IMAGE_SYNC");
-
   if (m_client_meta->state == librbd::journal::MIRROR_PEER_STATE_REPLAYING) {
     // clean replay state -- no image sync required
     close_remote_image();
@@ -544,6 +630,7 @@ void BootstrapRequest<I>::image_sync() {
   }
 
   dout(20) << dendl;
+  update_progress("IMAGE_SYNC");
 
   Context *ctx = create_context_callback<
     BootstrapRequest<I>, &BootstrapRequest<I>::handle_image_sync>(
@@ -646,14 +733,14 @@ bool BootstrapRequest<I>::decode_client_meta() {
     ::decode(client_data, it);
   } catch (const buffer::error &err) {
     derr << ": failed to decode client meta data: " << err.what() << dendl;
-    return true;
+    return false;
   }
 
   librbd::journal::MirrorPeerClientMeta *client_meta =
     boost::get<librbd::journal::MirrorPeerClientMeta>(&client_data.client_meta);
   if (client_meta == nullptr) {
     derr << ": unknown peer registration" << dendl;
-    return true;
+    return false;
   } else if (!client_meta->image_id.empty()) {
     // have an image id -- use that to open the image
     m_local_image_id = client_meta->image_id;
diff --git a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h
index e7ef050..8926adf 100644
--- a/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h
+++ b/src/tools/rbd_mirror/image_replayer/BootstrapRequest.h
@@ -86,48 +86,54 @@ private:
    * <start>
    *    |
    *    v
-   * GET_LOCAL_IMAGE_ID * * * * * * * * * * * *
-   *    |                                     *
-   *    v                                     *
-   * GET_REMOTE_TAG_CLASS * * * * * * * * * * *
-   *    |                                     *
-   *    v                                     *
-   * GET_CLIENT * * * * * * * * * * * * * * * *
-   *    |                                     *
-   *    v (skip if not needed)                * (error)
-   * REGISTER_CLIENT  * * * * * * * * * * * * *
-   *    |                                     *
-   *    v                                     *
-   * OPEN_REMOTE_IMAGE  * * * * * * * * * * * *
-   *    |                                     *
-   *    v                                     *
-   * OPEN_LOCAL_IMAGE * * * * * * * * * * * * *
-   *    |   .   ^                             *
-   *    |   .   |                             *
-   *    |   .   \-----------------------\     *
-   *    |   .                           |     *
-   *    |   . (image sync requested)    |     *
-   *    |   . . > REMOVE_LOCAL_IMAGE  * * * * *
-   *    |   .                   |       |     *
-   *    |   . (image doesn't    |       |     *
-   *    |   .  exist)           v       |     *
-   *    |   . . > CREATE_LOCAL_IMAGE  * * * * *
-   *    |             |                 |     *
-   *    |             \-----------------/     *
-   *    |                                     *
-   *    v (skip if not needed)                *
-   * UPDATE_CLIENT  * * * * * * * *           *
-   *    |                         *           *
-   *    v (skip if not needed)    *           *
-   * GET_REMOTE_TAGS  * * * * * * *           *
-   *    |                         *           *
-   *    v (skip if not needed)    v           *
-   * IMAGE_SYNC * * * > CLOSE_LOCAL_IMAGE     *
-   *    |                         |           *
-   *    |     /-------------------/           *
-   *    |     |                               *
-   *    v     v                               *
-   * CLOSE_REMOTE_IMAGE < * * * * * * * * * * *
+   * GET_LOCAL_IMAGE_ID * * * * * * * * * * * * * * * * *
+   *    |                                               *
+   *    v                                               *
+   * GET_REMOTE_TAG_CLASS * * * * * * * * * * * * * * * *
+   *    |                                               *
+   *    v                                               *
+   * GET_CLIENT * * * * * * * * * * * * * * * * * * * * *
+   *    |                                               *
+   *    v (skip if not needed)                          * (error)
+   * REGISTER_CLIENT  * * * * * * * * * * * * * * * * * *
+   *    |                                               *
+   *    v                                               *
+   * OPEN_REMOTE_IMAGE  * * * * * * * * * * * * * * * * *
+   *    |                                               *
+   *    | (remote image primary)                        *
+   *    \----> OPEN_LOCAL_IMAGE * * * * * * * * * * * * *
+   *    |         |   .   ^                             *
+   *    |         |   .   |                             *
+   *    |         |   .   \-----------------------\     *
+   *    |         |   .                           |     *
+   *    |         |   . (image sync requested)    |     *
+   *    |         |   . . > REMOVE_LOCAL_IMAGE  * * * * *
+   *    |         |   .                   |       |     *
+   *    |         |   . (image doesn't    |       |     *
+   *    |         |   .  exist)           v       |     *
+   *    |         |   . . > CREATE_LOCAL_IMAGE  * * * * *
+   *    |         |             |                 |     *
+   *    |         |             \-----------------/     *
+   *    |         |                                     *
+   *    |         v (skip if not needed)                *
+   *    |      UPDATE_CLIENT_IMAGE  * * * * *           *
+   *    |         |                         *           *
+   *    |         v (skip if not needed)    *           *
+   *    |      GET_REMOTE_TAGS  * * * * * * *           *
+   *    |         |                         *           *
+   *    |         v (skip if not needed)    v           *
+   *    |      IMAGE_SYNC * * * > CLOSE_LOCAL_IMAGE     *
+   *    |         |                         |           *
+   *    |         \-----------------\ /-----/           *
+   *    |                            |                  *
+   *    |                            |                  *
+   *    | (skip if not needed)       |                  *
+   *    \----> UPDATE_CLIENT_STATE  *|* * * * * * * * * *
+   *                |                |                  *
+   *    /-----------/----------------/                  *
+   *    |                                               *
+   *    v                                               *
+   * CLOSE_REMOTE_IMAGE < * * * * * * * * * * * * * * * *
    *    |
    *    v
    * <finish>
@@ -179,6 +185,9 @@ private:
   void open_remote_image();
   void handle_open_remote_image(int r);
 
+  void update_client_state();
+  void handle_update_client_state(int r);
+
   void open_local_image();
   void handle_open_local_image(int r);
 
@@ -188,8 +197,8 @@ private:
   void create_local_image();
   void handle_create_local_image(int r);
 
-  void update_client();
-  void handle_update_client(int r);
+  void update_client_image();
+  void handle_update_client_image(int r);
 
   void get_remote_tags();
   void handle_get_remote_tags(int r);
diff --git a/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc b/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc
index f023f39..be0b671 100644
--- a/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc
+++ b/src/tools/rbd_mirror/image_replayer/OpenLocalImageRequest.cc
@@ -47,6 +47,9 @@ struct MirrorJournalPolicy : public librbd::journal::Policy {
     // avoid recording any events to the local journal
     return true;
   }
+  virtual bool journal_disabled() const {
+    return false;
+  }
 
   virtual void allocate_tag_on_lock(Context *on_finish) {
     // rbd-mirror will manually create tags by copying them from the peer
diff --git a/src/tools/rbd_mirror/image_replayer/ReplayStatusFormatter.cc b/src/tools/rbd_mirror/image_replayer/ReplayStatusFormatter.cc
index 286a87b..917a706 100644
--- a/src/tools/rbd_mirror/image_replayer/ReplayStatusFormatter.cc
+++ b/src/tools/rbd_mirror/image_replayer/ReplayStatusFormatter.cc
@@ -119,8 +119,8 @@ bool ReplayStatusFormatter<I>::calculate_behind_master_or_send_update() {
     }
     librbd::journal::TagData &tag_data = tag_it->second;
     m_entries_behind_master += master.entry_tid;
-    master = cls::journal::ObjectPosition(0, tag_data.predecessor_tag_tid,
-					  tag_data.predecessor_entry_tid);
+    master = cls::journal::ObjectPosition(0, tag_data.predecessor.tag_tid,
+					  tag_data.predecessor.entry_tid);
   }
   m_entries_behind_master += master.entry_tid - m_mirror_position.entry_tid;
 
@@ -139,7 +139,7 @@ bool ReplayStatusFormatter<I>::calculate_behind_master_or_send_update() {
     dout(20) << "erasing tag " <<  tag_data << "for tag_tid " << tag_tid
 	     << dendl;
 
-    tag_tid = tag_data.predecessor_tag_tid;
+    tag_tid = tag_data.predecessor.tag_tid;
     m_tag_cache.erase(tag_it);
   }
 
@@ -195,16 +195,16 @@ void ReplayStatusFormatter<I>::handle_update_tag_cache(uint64_t master_tag_tid,
     }
   }
 
-  if (tag_data.predecessor_tag_tid == 0) {
+  if (tag_data.predecessor.tag_tid == 0) {
     // We failed. Don't consider this fatal, just terminate retrieving.
     dout(20) << "making fake tag" << dendl;
-    tag_data.predecessor_tag_tid = mirror_tag_tid;
+    tag_data.predecessor.tag_tid = mirror_tag_tid;
   }
 
   dout(20) << "decoded tag " << master_tag_tid << ": " << tag_data << dendl;
 
   m_tag_cache.insert(std::make_pair(master_tag_tid, tag_data));
-  send_update_tag_cache(tag_data.predecessor_tag_tid, mirror_tag_tid);
+  send_update_tag_cache(tag_data.predecessor.tag_tid, mirror_tag_tid);
 }
 
 template <typename I>
diff --git a/src/tools/rbd_nbd/rbd-nbd.cc b/src/tools/rbd_nbd/rbd-nbd.cc
index 4b014dd..49cbeec 100644
--- a/src/tools/rbd_nbd/rbd-nbd.cc
+++ b/src/tools/rbd_nbd/rbd-nbd.cc
@@ -184,13 +184,21 @@ private:
 
     dout(20) << __func__ << ": " << *ctx << dendl;
 
+    if (ret == -EINVAL) {
+      // if shrinking an image, a pagecache writeback might reference
+      // extents outside of the range of the new image extents
+      dout(5) << __func__ << ": masking IO out-of-bounds error" << dendl;
+      ctx->data.clear();
+      ret = 0;
+    }
+
     if (ret < 0) {
       ctx->reply.error = htonl(-ret);
     } else if ((ctx->command == NBD_CMD_READ) &&
                 ret < static_cast<int>(ctx->request.len)) {
       int pad_byte_count = static_cast<int> (ctx->request.len) - ret;
       ctx->data.append_zero(pad_byte_count);
-      dout(20) << __func__ << ": " << *ctx << ": Pad byte count: " 
+      dout(20) << __func__ << ": " << *ctx << ": Pad byte count: "
                << pad_byte_count << dendl;
       ctx->reply.error = 0;
     } else {
@@ -235,6 +243,7 @@ private:
       switch (ctx->command)
       {
         case NBD_CMD_DISC:
+          // RBD_DO_IT will return when pipe is closed
 	  dout(0) << "disconnect request received" << dendl;
           return;
         case NBD_CMD_WRITE:
@@ -649,9 +658,10 @@ static int do_unmap()
     return nbd;
   }
 
-  if (ioctl(nbd, NBD_DISCONNECT) < 0)
+  // alert the reader thread to shut down
+  if (ioctl(nbd, NBD_DISCONNECT) < 0) {
     cerr << "rbd-nbd: the device is not used" << std::endl;
-  ioctl(nbd, NBD_CLEAR_SOCK);
+  }
   close(nbd);
 
   return 0;
@@ -726,6 +736,7 @@ static int rbd_nbd(int argc, const char *argv[])
   env_to_vec(args);
   global_init(NULL, args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_DAEMON,
               CINIT_FLAG_UNPRIVILEGED_DAEMON_DEFAULTS);
+  g_ceph_context->_conf->set_val_or_die("pid_file", "");
 
   std::vector<const char*>::iterator i;
   std::ostringstream err;
diff --git a/src/tools/rebuild_mondb.cc b/src/tools/rebuild_mondb.cc
new file mode 100644
index 0000000..f9da216
--- /dev/null
+++ b/src/tools/rebuild_mondb.cc
@@ -0,0 +1,388 @@
+#include "auth/cephx/CephxKeyServer.h"
+#include "common/errno.h"
+#include "mon/AuthMonitor.h"
+#include "mon/MonitorDBStore.h"
+#include "os/ObjectStore.h"
+#include "osd/OSD.h"
+
+static int update_auth(const string& keyring_path,
+                       const OSDSuperblock& sb,
+                       MonitorDBStore& ms);
+static int update_monitor(const OSDSuperblock& sb, MonitorDBStore& ms);
+static int update_osdmap(ObjectStore& fs,
+                         OSDSuperblock& sb,
+                         MonitorDBStore& ms);
+static int update_pgmap_pg(ObjectStore& fs, MonitorDBStore& ms);
+
+int update_mon_db(ObjectStore& fs, OSDSuperblock& sb,
+                  const string& keyring,
+                  const string& store_path)
+{
+  MonitorDBStore ms(store_path);
+  int r = ms.create_and_open(cerr);
+  if (r < 0) {
+    cerr << "unable to open mon store: " << store_path << std::endl;
+    return r;
+  }
+  if ((r = update_auth(keyring, sb, ms)) < 0) {
+    goto out;
+  }
+  if ((r = update_osdmap(fs, sb, ms)) < 0) {
+    goto out;
+  }
+  if ((r = update_pgmap_pg(fs, ms)) < 0) {
+    goto out;
+  }
+  if ((r = update_monitor(sb, ms)) < 0) {
+    goto out;
+  }
+ out:
+  ms.close();
+  return r;
+}
+
+static void add_auth(KeyServerData::Incremental& auth_inc,
+                     MonitorDBStore& ms)
+{
+  AuthMonitor::Incremental inc;
+  inc.inc_type = AuthMonitor::AUTH_DATA;
+  ::encode(auth_inc, inc.auth_data);
+  inc.auth_type = CEPH_AUTH_CEPHX;
+
+  bufferlist bl;
+  __u8 v = 1;
+  ::encode(v, bl);
+  inc.encode(bl, CEPH_FEATURES_ALL);
+
+  const string prefix("auth");
+  auto last_committed = ms.get(prefix, "last_committed") + 1;
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  t->put(prefix, last_committed, bl);
+  t->put(prefix, "last_committed", last_committed);
+  auto first_committed = ms.get(prefix, "first_committed");
+  if (!first_committed) {
+    t->put(prefix, "first_committed", last_committed);
+  }
+  ms.apply_transaction(t);
+}
+
+static int get_auth_inc(const string& keyring_path,
+                        const OSDSuperblock& sb,
+                        KeyServerData::Incremental* auth_inc)
+{
+  auth_inc->op = KeyServerData::AUTH_INC_ADD;
+
+  // get the name
+  EntityName entity;
+  // assuming the entity name of OSD is "osd.<osd_id>"
+  entity.set(CEPH_ENTITY_TYPE_OSD, std::to_string(sb.whoami));
+  auth_inc->name = entity;
+
+  // read keyring from disk
+  KeyRing keyring;
+  {
+    bufferlist bl;
+    string error;
+    int r = bl.read_file(keyring_path.c_str(), &error);
+    if (r < 0) {
+      if (r == -ENOENT) {
+        cout << "ignoring keyring (" << keyring_path << ")"
+             << ": " << error << std::endl;
+        return 0;
+      } else {
+        cerr << "unable to read keyring (" << keyring_path << ")"
+             << ": " << error << std::endl;
+        return r;
+      }
+    } else if (bl.length() == 0) {
+      cout << "ignoring empty keyring: " << keyring_path << std::endl;
+      return 0;
+    }
+    auto bp = bl.begin();
+    try {
+      ::decode(keyring, bp);
+    } catch (const buffer::error& e) {
+      cerr << "error decoding keyring: " << keyring_path << std::endl;
+      return -EINVAL;
+    }
+  }
+
+  // get the key
+  EntityAuth new_inc;
+  if (!keyring.get_auth(auth_inc->name, new_inc)) {
+    cerr << "key for " << auth_inc->name << " not found in keyring: "
+         << keyring_path << std::endl;
+    return -EINVAL;
+  }
+  auth_inc->auth.key = new_inc.key;
+
+  // get the caps
+  map<string,bufferlist> caps;
+  if (new_inc.caps.empty()) {
+    // fallback to default caps for an OSD
+    //   osd 'allow *' mon 'allow rwx'
+    // as suggested by document.
+    ::encode(string("allow *"), caps["osd"]);
+    ::encode(string("allow rwx"), caps["mon"]);
+  } else {
+    caps = new_inc.caps;
+  }
+  auth_inc->auth.caps = caps;
+  return 0;
+}
+
+// rebuild
+//  - auth/${epoch}
+//  - auth/first_committed
+//  - auth/last_committed
+static int update_auth(const string& keyring_path,
+                       const OSDSuperblock& sb,
+                       MonitorDBStore& ms)
+{
+  // stolen from AuthMonitor::prepare_command(), where prefix is "auth add"
+  KeyServerData::Incremental auth_inc;
+  int r;
+  if ((r = get_auth_inc(keyring_path, sb, &auth_inc))) {
+    return r;
+  }
+  add_auth(auth_inc, ms);
+  return 0;
+}
+
+// stolen from Monitor::check_fsid()
+static int check_fsid(const uuid_d& fsid, MonitorDBStore& ms)
+{
+  bufferlist bl;
+  int r = ms.get("monitor", "cluster_uuid", bl);
+  if (r == -ENOENT)
+    return r;
+  string uuid(bl.c_str(), bl.length());
+  auto end = uuid.find_first_of('\n');
+  if (end != uuid.npos) {
+    uuid.resize(end);
+  }
+  uuid_d existing;
+  if (!existing.parse(uuid.c_str())) {
+    cerr << "error: unable to parse uuid" << std::endl;
+    return -EINVAL;
+  }
+  if (fsid != existing) {
+    cerr << "error: cluster_uuid " << existing << " != " << fsid << std::endl;
+    return -EEXIST;
+  }
+  return 0;
+}
+
+// rebuild
+//  - monitor/cluster_uuid
+int update_monitor(const OSDSuperblock& sb, MonitorDBStore& ms)
+{
+  switch (check_fsid(sb.cluster_fsid, ms)) {
+  case -ENOENT:
+    break;
+  case -EINVAL:
+    return -EINVAL;
+  case -EEXIST:
+    return -EEXIST;
+  case 0:
+    return 0;
+  default:
+    assert(0);
+  }
+  string uuid = stringify(sb.cluster_fsid) + "\n";
+  bufferlist bl;
+  bl.append(uuid);
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  t->put("monitor", "cluster_uuid", bl);
+  ms.apply_transaction(t);
+  return 0;
+}
+
+// rebuild
+//  - osdmap/${epoch}
+//  - osdmap/full_${epoch}
+//  - osdmap/full_latest
+//  - osdmap/first_committed
+//  - osdmap/last_committed
+int update_osdmap(ObjectStore& fs, OSDSuperblock& sb, MonitorDBStore& ms)
+{
+  const string prefix("osdmap");
+  const string first_committed_name("first_committed");
+  const string last_committed_name("last_committed");
+  epoch_t first_committed = ms.get(prefix, first_committed_name);
+  epoch_t last_committed = ms.get(prefix, last_committed_name);
+  auto t = make_shared<MonitorDBStore::Transaction>();
+
+  // trim stale maps
+  unsigned ntrimmed = 0;
+  // osdmap starts at 1. if we have a "0" first_committed, then there is nothing
+  // to trim. and "1 osdmaps trimmed" in the output message is misleading. so
+  // let's make it an exception.
+  for (auto e = first_committed; first_committed && e < sb.oldest_map; e++) {
+    t->erase(prefix, e);
+    t->erase(prefix, ms.combine_strings("full", e));
+    ntrimmed++;
+  }
+  if (!t->empty()) {
+    t->put(prefix, first_committed_name, sb.oldest_map);
+    ms.apply_transaction(t);
+    t = make_shared<MonitorDBStore::Transaction>();
+  }
+
+  unsigned nadded = 0;
+
+  OSDMap osdmap;
+  for (auto e = max(last_committed+1, sb.oldest_map);
+       e <= sb.newest_map; e++) {
+    bool have_crc = false;
+    uint32_t crc = -1;
+    uint64_t features = 0;
+    // add inc maps
+    {
+      const auto oid = OSD::get_inc_osdmap_pobject_name(e);
+      bufferlist bl;
+      int nread = fs.read(coll_t::meta(), oid, 0, 0, bl);
+      if (nread <= 0) {
+        cerr << "missing " << oid << std::endl;
+        return -EINVAL;
+      }
+      t->put(prefix, e, bl);
+
+      OSDMap::Incremental inc;
+      auto p = bl.begin();
+      inc.decode(p);
+      features = inc.encode_features | CEPH_FEATURE_RESERVED;
+      if (osdmap.get_epoch() && e > 1) {
+        if (osdmap.apply_incremental(inc)) {
+          cerr << "bad fsid: "
+               << osdmap.get_fsid() << " != " << inc.fsid << std::endl;
+          return -EINVAL;
+        }
+        have_crc = inc.have_crc;
+        if (inc.have_crc) {
+          crc = inc.full_crc;
+          bufferlist fbl;
+          osdmap.encode(fbl, features);
+          if (osdmap.get_crc() != inc.full_crc) {
+            cerr << "mismatched inc crc: "
+                 << osdmap.get_crc() << " != " << inc.full_crc << std::endl;
+            return -EINVAL;
+          }
+          // inc.decode() verifies `inc_crc`, so it's been taken care of.
+        }
+      }
+    }
+    // add full maps
+    {
+      const auto oid = OSD::get_osdmap_pobject_name(e);
+      bufferlist bl;
+      int nread = fs.read(coll_t::meta(), oid, 0, 0, bl);
+      if (nread <= 0) {
+        cerr << "missing " << oid << std::endl;
+        return -EINVAL;
+      }
+      t->put(prefix, ms.combine_strings("full", e), bl);
+
+      auto p = bl.begin();
+      osdmap.decode(p);
+      if (osdmap.have_crc()) {
+        if (have_crc && osdmap.get_crc() != crc) {
+          cerr << "mismatched full/inc crc: "
+               << osdmap.get_crc() << " != " << crc << std::endl;
+          return -EINVAL;
+        }
+        uint32_t saved_crc = osdmap.get_crc();
+        bufferlist fbl;
+        osdmap.encode(fbl, features);
+        if (osdmap.get_crc() != saved_crc) {
+          cerr << "mismatched full crc: "
+               << saved_crc << " != " << osdmap.get_crc() << std::endl;
+          return -EINVAL;
+        }
+      }
+    }
+    nadded++;
+
+    // last_committed
+    t->put(prefix, last_committed_name, e);
+    // full last
+    t->put(prefix, ms.combine_strings("full", "latest"), e);
+
+    // this number comes from the default value of osd_target_transaction_size,
+    // so we won't OOM or stuff too many maps in a single transaction if OSD is
+    // keeping a large series of osdmap
+    static constexpr unsigned TRANSACTION_SIZE = 30;
+    if (t->size() >= TRANSACTION_SIZE) {
+      ms.apply_transaction(t);
+      t = make_shared<MonitorDBStore::Transaction>();
+    }
+  }
+  if (!t->empty()) {
+    ms.apply_transaction(t);
+  }
+  t.reset();
+
+  string osd_name("osd.");
+  osd_name += std::to_string(sb.whoami);
+  cout << std::left << setw(8)
+       << osd_name << ": "
+       << ntrimmed << " osdmaps trimmed, "
+       << nadded << " osdmaps added." << std::endl;
+  return 0;
+}
+
+// rebuild
+//  - pgmap_pg/${pgid}
+int update_pgmap_pg(ObjectStore& fs, MonitorDBStore& ms)
+{
+  // pgmap/${epoch} is the incremental of: stamp, pgmap_pg, pgmap_osd
+  // if PGMonitor fails to read it, it will fall back to the pgmap_pg, i.e.
+  // the fullmap.
+  vector<coll_t> collections;
+  int r = fs.list_collections(collections);
+  if (r < 0) {
+    cerr << "failed to list pgs: "  << cpp_strerror(r) << std::endl;
+    return r;
+  }
+  const string prefix("pgmap_pg");
+  // in general, there are less than 100 PGs per OSD, so no need to apply
+  // transaction in batch.
+  auto t = make_shared<MonitorDBStore::Transaction>();
+  unsigned npg = 0;
+  for (const auto& coll : collections) {
+    spg_t pgid;
+    if (!coll.is_pg(&pgid))
+      continue;
+    bufferlist bl;
+    pg_info_t info(pgid);
+    map<epoch_t, pg_interval_t> past_intervals;
+    __u8 struct_v;
+    r = PG::read_info(&fs, pgid, coll, bl, info, past_intervals, struct_v);
+    if (r < 0) {
+      cerr << "failed to read_info: " << cpp_strerror(r) << std::endl;
+      return r;
+    }
+    if (struct_v < PG::cur_struct_v) {
+      cerr << "incompatible pg_info: v" << struct_v << std::endl;
+      return r;
+    }
+    version_t latest_epoch = 0;
+    r = ms.get(prefix, stringify(pgid.pgid), bl);
+    if (r >= 0) {
+      pg_stat_t pg_stat;
+      auto bp = bl.begin();
+      ::decode(pg_stat, bp);
+      latest_epoch = pg_stat.reported_epoch;
+    }
+    if (info.stats.reported_epoch > latest_epoch) {
+      bufferlist bl;
+      ::encode(info.stats, bl);
+      t->put(prefix, stringify(pgid.pgid), bl);
+      npg++;
+    }
+  }
+  ms.apply_transaction(t);
+  cout << std::left << setw(10)
+       << " " << npg << " pgs added." << std::endl;
+  return 0;
+}
diff --git a/src/tools/rebuild_mondb.h b/src/tools/rebuild_mondb.h
new file mode 100644
index 0000000..8a2317d
--- /dev/null
+++ b/src/tools/rebuild_mondb.h
@@ -0,0 +1,9 @@
+#pragma once
+#include <string>
+
+class ObjectStore;
+class OSDSuperblock;
+
+int update_mon_db(ObjectStore& fs, OSDSuperblock& sb,
+                  const std::string& keyring_path,
+                  const std::string& store_path);
diff --git a/src/tracing/CMakeLists.txt b/src/tracing/CMakeLists.txt
new file mode 100644
index 0000000..1305a35
--- /dev/null
+++ b/src/tracing/CMakeLists.txt
@@ -0,0 +1,40 @@
+add_custom_target(lttng_gen_tp
+  ALL
+  COMMAND 
+  lttng-gen-tp tracing/librados.tp -o tracing/librados.h && 
+  lttng-gen-tp tracing/librbd.tp -o tracing/librbd.h && 
+  lttng-gen-tp tracing/objectstore.tp -o tracing/objectstore.h && 
+  lttng-gen-tp tracing/oprequest.tp -o tracing/oprequest.h &&
+  lttng-gen-tp tracing/osd.tp -o tracing/osd.h &&
+  lttng-gen-tp tracing/pg.tp -o tracing/pg.h
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src
+  COMMENT "lttng-gen-tp generated .h files")
+
+add_library(libosd_tp STATIC
+  oprequest.c
+  osd.c
+  pg.c)
+target_link_libraries(libosd_tp lttng-ust dl)
+target_include_directories(libosd_tp PUBLIC ${CMAKE_SOURCE_DIR}/src/tracing)
+add_dependencies(libosd_tp lttng_gen_tp)
+set_target_properties(libosd_tp PROPERTIES OUTPUT_NAME osd_tp VERSION 1.0.0 SOVERSION 1)
+
+add_library(librados_tp STATIC librados.c)
+target_link_libraries(librados_tp lttng-ust dl)
+target_include_directories(librados_tp PUBLIC ${CMAKE_SOURCE_DIR}/src/tracing)
+add_dependencies(librados_tp lttng_gen_tp)
+set_target_properties(librados_tp PROPERTIES OUTPUT_NAME rados_tp VERSION 2.0.0 SOVERSION 2)
+
+add_library(librbd_tp STATIC librbd.c)
+target_link_libraries(librbd_tp lttng-ust dl)
+target_include_directories(librbd_tp PUBLIC ${CMAKE_SOURCE_DIR}/src/tracing)
+add_dependencies(librbd_tp lttng_gen_tp)
+set_target_properties(librbd_tp PROPERTIES OUTPUT_NAME rbd_tp VERSION 1.0.0 SOVERSION 1)
+
+add_library(libos_tp STATIC objectstore.c)
+target_link_libraries(libos_tp lttng-ust dl)
+target_include_directories(libos_tp PUBLIC ${CMAKE_SOURCE_DIR}/src/tracing)
+add_dependencies(libos_tp lttng_gen_tp)
+set_target_properties(libos_tp PROPERTIES OUTPUT_NAME os_tp VERSION 1.0.0 SOVERSION 1)
+
+install(TARGETS librados_tp libosd_tp librbd_tp libos_tp DESTINATION lib)
diff --git a/src/tracing/Makefile.am b/src/tracing/Makefile.am
index 1c2349e..f022acd 100644
--- a/src/tracing/Makefile.am
+++ b/src/tracing/Makefile.am
@@ -1,4 +1,5 @@
 EXTRA_DIST += \
+	tracing/CMakeLists.txt \
 	tracing/tracing-common.h
 
 if WITH_LTTNG
diff --git a/systemd/Makefile.in b/systemd/Makefile.in
index 6055638..8595bdd 100644
--- a/systemd/Makefile.in
+++ b/systemd/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -15,7 +15,17 @@
 @SET_MAKE@
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -80,7 +90,6 @@ build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
 subdir = systemd
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/ac_prog_jar.m4 \
@@ -99,6 +108,7 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ac_check_classpath.m4 \
 	$(top_srcdir)/m4/pkg.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/src/acconfig.h
 CONFIG_CLEAN_FILES =
@@ -152,13 +162,13 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(unitdir)"
 DATA = $(unit_DATA)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__DIST_COMMON = $(srcdir)/Makefile.in
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 AMTAR = @AMTAR@
 AM_CXXFLAGS = @AM_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AR = @AR@
-ARM_CRC_FLAGS = @ARM_CRC_FLAGS@
 ARM_FLAGS = @ARM_FLAGS@
 ARM_NEON_FLAGS = @ARM_NEON_FLAGS@
 AUTOCONF = @AUTOCONF@
@@ -244,6 +254,7 @@ LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LTTNG_GEN_TP_CHECK = @LTTNG_GEN_TP_CHECK@
 LTTNG_GEN_TP_PROG = @LTTNG_GEN_TP_PROG@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -342,6 +353,7 @@ program_transform_name = @program_transform_name@
 psdir = @psdir@
 pyexecdir = @pyexecdir@
 pythondir = @pythondir@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
@@ -395,7 +407,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign systemd/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign systemd/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -594,6 +605,8 @@ uninstall-am: uninstall-unitDATA
 	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
 	ps ps-am tags-am uninstall uninstall-am uninstall-unitDATA
 
+.PRECIOUS: Makefile
+
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/systemd/ceph-disk at .service b/systemd/ceph-disk at .service
index 8b18ba4..f13c30b 100644
--- a/systemd/ceph-disk at .service
+++ b/systemd/ceph-disk at .service
@@ -4,5 +4,5 @@ Description=Ceph disk activation: %f
 [Service]
 Type=oneshot
 KillMode=none
-ExecStart=/bin/sh -c 'flock /var/lock/ceph-disk /usr/sbin/ceph-disk --verbose --log-stdout trigger --sync %f'
+ExecStart=/bin/sh -c 'timeout 120 flock /var/lock/ceph-disk /usr/sbin/ceph-disk --verbose --log-stdout trigger --sync %f'
 TimeoutSec=0
diff --git a/systemd/rbdmap.service b/systemd/rbdmap.service
index 25c324f..70501ea 100644
--- a/systemd/rbdmap.service
+++ b/systemd/rbdmap.service
@@ -12,3 +12,6 @@ RemainAfterExit=yes
 ExecStart=/usr/bin/rbdmap map
 ExecReload=/usr/bin/rbdmap map
 ExecStop=/usr/bin/rbdmap unmap
+
+[Install]
+WantedBy=multi-user.target
diff --git a/test-driver b/test-driver
index d306056..8e575b0 100755
--- a/test-driver
+++ b/test-driver
@@ -3,7 +3,7 @@
 
 scriptversion=2013-07-13.22; # UTC
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -106,11 +106,14 @@ trap "st=143; $do_exit" 15
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
+
 if test $enable_hard_errors = no && test $estatus -eq 99; then
-  estatus=1
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
 fi
 
-case $estatus:$expect_failure in
+case $tweaked_estatus:$expect_failure in
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
@@ -119,6 +122,12 @@ case $estatus:$expect_failure in
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ceph/ceph.git



More information about the Pkg-ceph-commits mailing list